Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Input: msc_touchkey - remove the driver

MCS-5000/5080 chips belong to the 1st generation of Melfas chips,
manufactured in 2000-2007.

The driver relies on custom platform data (no DT support) and there
never were any users of this driver in the mainline kernel. It is likely
that the driver was (like mcs5000_ts driver) was tested on S3C6410 NCP
board (with Samsung S3C6410 SoC), but the touchkey device was never
added to the board file. This board was removed in v6.3 in commit
743c8fbb90ca ("ARM: s3c: remove most s3c64xx board support").

Remove the driver since there are no users.

Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org>
Link: https://lore.kernel.org/r/20240714060029.1528662-2-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

-307
-12
drivers/input/keyboard/Kconfig
··· 421 421 To compile this driver as a module, choose M here: the 422 422 module will be called max7359_keypad. 423 423 424 - config KEYBOARD_MCS 425 - tristate "MELFAS MCS Touchkey" 426 - depends on I2C 427 - help 428 - Say Y here if you have the MELFAS MCS5000/5080 touchkey controller 429 - chip in your system. 430 - 431 - If unsure, say N. 432 - 433 - To compile this driver as a module, choose M here: the 434 - module will be called mcs_touchkey. 435 - 436 424 config KEYBOARD_MPR121 437 425 tristate "Freescale MPR121 Touchkey" 438 426 depends on I2C
-1
drivers/input/keyboard/Makefile
··· 41 41 obj-$(CONFIG_KEYBOARD_MAPLE) += maple_keyb.o 42 42 obj-$(CONFIG_KEYBOARD_MATRIX) += matrix_keypad.o 43 43 obj-$(CONFIG_KEYBOARD_MAX7359) += max7359_keypad.o 44 - obj-$(CONFIG_KEYBOARD_MCS) += mcs_touchkey.o 45 44 obj-$(CONFIG_KEYBOARD_MPR121) += mpr121_touchkey.o 46 45 obj-$(CONFIG_KEYBOARD_MT6779) += mt6779-keypad.o 47 46 obj-$(CONFIG_KEYBOARD_MTK_PMIC) += mtk-pmic-keys.o
-268
drivers/input/keyboard/mcs_touchkey.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-or-later 2 - /* 3 - * Touchkey driver for MELFAS MCS5000/5080 controller 4 - * 5 - * Copyright (C) 2010 Samsung Electronics Co.Ltd 6 - * Author: HeungJun Kim <riverful.kim@samsung.com> 7 - * Author: Joonyoung Shim <jy0922.shim@samsung.com> 8 - */ 9 - 10 - #include <linux/module.h> 11 - #include <linux/i2c.h> 12 - #include <linux/interrupt.h> 13 - #include <linux/input.h> 14 - #include <linux/irq.h> 15 - #include <linux/slab.h> 16 - #include <linux/platform_data/mcs.h> 17 - #include <linux/pm.h> 18 - 19 - /* MCS5000 Touchkey */ 20 - #define MCS5000_TOUCHKEY_STATUS 0x04 21 - #define MCS5000_TOUCHKEY_STATUS_PRESS 7 22 - #define MCS5000_TOUCHKEY_FW 0x0a 23 - #define MCS5000_TOUCHKEY_BASE_VAL 0x61 24 - 25 - /* MCS5080 Touchkey */ 26 - #define MCS5080_TOUCHKEY_STATUS 0x00 27 - #define MCS5080_TOUCHKEY_STATUS_PRESS 3 28 - #define MCS5080_TOUCHKEY_FW 0x01 29 - #define MCS5080_TOUCHKEY_BASE_VAL 0x1 30 - 31 - enum mcs_touchkey_type { 32 - MCS5000_TOUCHKEY, 33 - MCS5080_TOUCHKEY, 34 - }; 35 - 36 - struct mcs_touchkey_chip { 37 - unsigned int status_reg; 38 - unsigned int pressbit; 39 - unsigned int press_invert; 40 - unsigned int baseval; 41 - }; 42 - 43 - struct mcs_touchkey_data { 44 - void (*poweron)(bool); 45 - 46 - struct i2c_client *client; 47 - struct input_dev *input_dev; 48 - struct mcs_touchkey_chip chip; 49 - unsigned int key_code; 50 - unsigned int key_val; 51 - unsigned short keycodes[]; 52 - }; 53 - 54 - static irqreturn_t mcs_touchkey_interrupt(int irq, void *dev_id) 55 - { 56 - struct mcs_touchkey_data *data = dev_id; 57 - struct mcs_touchkey_chip *chip = &data->chip; 58 - struct i2c_client *client = data->client; 59 - struct input_dev *input = data->input_dev; 60 - unsigned int key_val; 61 - unsigned int pressed; 62 - int val; 63 - 64 - val = i2c_smbus_read_byte_data(client, chip->status_reg); 65 - if (val < 0) { 66 - dev_err(&client->dev, "i2c read error [%d]\n", val); 67 - goto out; 68 - } 69 - 70 - pressed = (val & (1 << chip->pressbit)) >> chip->pressbit; 71 - if (chip->press_invert) 72 - pressed ^= chip->press_invert; 73 - 74 - /* key_val is 0 when released, so we should use key_val of press. */ 75 - if (pressed) { 76 - key_val = val & (0xff >> (8 - chip->pressbit)); 77 - if (!key_val) 78 - goto out; 79 - key_val -= chip->baseval; 80 - data->key_code = data->keycodes[key_val]; 81 - data->key_val = key_val; 82 - } 83 - 84 - input_event(input, EV_MSC, MSC_SCAN, data->key_val); 85 - input_report_key(input, data->key_code, pressed); 86 - input_sync(input); 87 - 88 - dev_dbg(&client->dev, "key %d %d %s\n", data->key_val, data->key_code, 89 - pressed ? "pressed" : "released"); 90 - 91 - out: 92 - return IRQ_HANDLED; 93 - } 94 - 95 - static void mcs_touchkey_poweroff(void *data) 96 - { 97 - struct mcs_touchkey_data *touchkey = data; 98 - 99 - touchkey->poweron(false); 100 - } 101 - 102 - static int mcs_touchkey_probe(struct i2c_client *client) 103 - { 104 - const struct i2c_device_id *id = i2c_client_get_device_id(client); 105 - const struct mcs_platform_data *pdata; 106 - struct mcs_touchkey_data *data; 107 - struct input_dev *input_dev; 108 - unsigned int fw_reg; 109 - int fw_ver; 110 - int error; 111 - int i; 112 - 113 - pdata = dev_get_platdata(&client->dev); 114 - if (!pdata) { 115 - dev_err(&client->dev, "no platform data defined\n"); 116 - return -EINVAL; 117 - } 118 - 119 - data = devm_kzalloc(&client->dev, 120 - struct_size(data, keycodes, pdata->key_maxval + 1), 121 - GFP_KERNEL); 122 - if (!data) 123 - return -ENOMEM; 124 - 125 - input_dev = devm_input_allocate_device(&client->dev); 126 - if (!input_dev) { 127 - dev_err(&client->dev, "Failed to allocate input device\n"); 128 - return -ENOMEM; 129 - } 130 - 131 - data->client = client; 132 - data->input_dev = input_dev; 133 - 134 - if (id->driver_data == MCS5000_TOUCHKEY) { 135 - data->chip.status_reg = MCS5000_TOUCHKEY_STATUS; 136 - data->chip.pressbit = MCS5000_TOUCHKEY_STATUS_PRESS; 137 - data->chip.baseval = MCS5000_TOUCHKEY_BASE_VAL; 138 - fw_reg = MCS5000_TOUCHKEY_FW; 139 - } else { 140 - data->chip.status_reg = MCS5080_TOUCHKEY_STATUS; 141 - data->chip.pressbit = MCS5080_TOUCHKEY_STATUS_PRESS; 142 - data->chip.press_invert = 1; 143 - data->chip.baseval = MCS5080_TOUCHKEY_BASE_VAL; 144 - fw_reg = MCS5080_TOUCHKEY_FW; 145 - } 146 - 147 - fw_ver = i2c_smbus_read_byte_data(client, fw_reg); 148 - if (fw_ver < 0) { 149 - dev_err(&client->dev, "i2c read error[%d]\n", fw_ver); 150 - return fw_ver; 151 - } 152 - dev_info(&client->dev, "Firmware version: %d\n", fw_ver); 153 - 154 - input_dev->name = "MELFAS MCS Touchkey"; 155 - input_dev->id.bustype = BUS_I2C; 156 - input_dev->evbit[0] = BIT_MASK(EV_KEY); 157 - if (!pdata->no_autorepeat) 158 - input_dev->evbit[0] |= BIT_MASK(EV_REP); 159 - input_dev->keycode = data->keycodes; 160 - input_dev->keycodesize = sizeof(data->keycodes[0]); 161 - input_dev->keycodemax = pdata->key_maxval + 1; 162 - 163 - for (i = 0; i < pdata->keymap_size; i++) { 164 - unsigned int val = MCS_KEY_VAL(pdata->keymap[i]); 165 - unsigned int code = MCS_KEY_CODE(pdata->keymap[i]); 166 - 167 - data->keycodes[val] = code; 168 - __set_bit(code, input_dev->keybit); 169 - } 170 - 171 - input_set_capability(input_dev, EV_MSC, MSC_SCAN); 172 - input_set_drvdata(input_dev, data); 173 - 174 - if (pdata->cfg_pin) 175 - pdata->cfg_pin(); 176 - 177 - if (pdata->poweron) { 178 - data->poweron = pdata->poweron; 179 - data->poweron(true); 180 - 181 - error = devm_add_action_or_reset(&client->dev, 182 - mcs_touchkey_poweroff, data); 183 - if (error) 184 - return error; 185 - } 186 - 187 - error = devm_request_threaded_irq(&client->dev, client->irq, 188 - NULL, mcs_touchkey_interrupt, 189 - IRQF_TRIGGER_FALLING | IRQF_ONESHOT, 190 - client->dev.driver->name, data); 191 - if (error) { 192 - dev_err(&client->dev, "Failed to register interrupt\n"); 193 - return error; 194 - } 195 - 196 - error = input_register_device(input_dev); 197 - if (error) 198 - return error; 199 - 200 - i2c_set_clientdata(client, data); 201 - return 0; 202 - } 203 - 204 - static void mcs_touchkey_shutdown(struct i2c_client *client) 205 - { 206 - struct mcs_touchkey_data *data = i2c_get_clientdata(client); 207 - 208 - if (data->poweron) 209 - data->poweron(false); 210 - } 211 - 212 - static int mcs_touchkey_suspend(struct device *dev) 213 - { 214 - struct mcs_touchkey_data *data = dev_get_drvdata(dev); 215 - struct i2c_client *client = data->client; 216 - 217 - /* Disable the work */ 218 - disable_irq(client->irq); 219 - 220 - /* Finally turn off the power */ 221 - if (data->poweron) 222 - data->poweron(false); 223 - 224 - return 0; 225 - } 226 - 227 - static int mcs_touchkey_resume(struct device *dev) 228 - { 229 - struct mcs_touchkey_data *data = dev_get_drvdata(dev); 230 - struct i2c_client *client = data->client; 231 - 232 - /* Enable the device first */ 233 - if (data->poweron) 234 - data->poweron(true); 235 - 236 - /* Enable irq again */ 237 - enable_irq(client->irq); 238 - 239 - return 0; 240 - } 241 - 242 - static DEFINE_SIMPLE_DEV_PM_OPS(mcs_touchkey_pm_ops, 243 - mcs_touchkey_suspend, mcs_touchkey_resume); 244 - 245 - static const struct i2c_device_id mcs_touchkey_id[] = { 246 - { "mcs5000_touchkey", MCS5000_TOUCHKEY }, 247 - { "mcs5080_touchkey", MCS5080_TOUCHKEY }, 248 - { } 249 - }; 250 - MODULE_DEVICE_TABLE(i2c, mcs_touchkey_id); 251 - 252 - static struct i2c_driver mcs_touchkey_driver = { 253 - .driver = { 254 - .name = "mcs_touchkey", 255 - .pm = pm_sleep_ptr(&mcs_touchkey_pm_ops), 256 - }, 257 - .probe = mcs_touchkey_probe, 258 - .shutdown = mcs_touchkey_shutdown, 259 - .id_table = mcs_touchkey_id, 260 - }; 261 - 262 - module_i2c_driver(mcs_touchkey_driver); 263 - 264 - /* Module information */ 265 - MODULE_AUTHOR("Joonyoung Shim <jy0922.shim@samsung.com>"); 266 - MODULE_AUTHOR("HeungJun Kim <riverful.kim@samsung.com>"); 267 - MODULE_DESCRIPTION("Touchkey driver for MELFAS MCS5000/5080 controller"); 268 - MODULE_LICENSE("GPL");
-26
include/linux/platform_data/mcs.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 - /* 3 - * Copyright (C) 2009 - 2010 Samsung Electronics Co.Ltd 4 - * Author: Joonyoung Shim <jy0922.shim@samsung.com> 5 - * Author: HeungJun Kim <riverful.kim@samsung.com> 6 - */ 7 - 8 - #ifndef __LINUX_MCS_H 9 - #define __LINUX_MCS_H 10 - 11 - #define MCS_KEY_MAP(v, c) ((((v) & 0xff) << 16) | ((c) & 0xffff)) 12 - #define MCS_KEY_VAL(v) (((v) >> 16) & 0xff) 13 - #define MCS_KEY_CODE(v) ((v) & 0xffff) 14 - 15 - struct mcs_platform_data { 16 - void (*poweron)(bool); 17 - void (*cfg_pin)(void); 18 - 19 - /* touchkey */ 20 - const u32 *keymap; 21 - unsigned int keymap_size; 22 - unsigned int key_maxval; 23 - bool no_autorepeat; 24 - }; 25 - 26 - #endif /* __LINUX_MCS_H */