Lines Matching +full:linux +full:- +full:keycodes

1 // SPDX-License-Identifier: GPL-2.0-or-later
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>
51 unsigned short keycodes[]; member
57 struct mcs_touchkey_chip *chip = &data->chip; in mcs_touchkey_interrupt()
58 struct i2c_client *client = data->client; in mcs_touchkey_interrupt()
59 struct input_dev *input = data->input_dev; in mcs_touchkey_interrupt()
64 val = i2c_smbus_read_byte_data(client, chip->status_reg); in mcs_touchkey_interrupt()
66 dev_err(&client->dev, "i2c read error [%d]\n", val); in mcs_touchkey_interrupt()
70 pressed = (val & (1 << chip->pressbit)) >> chip->pressbit; in mcs_touchkey_interrupt()
71 if (chip->press_invert) in mcs_touchkey_interrupt()
72 pressed ^= chip->press_invert; in mcs_touchkey_interrupt()
76 key_val = val & (0xff >> (8 - chip->pressbit)); in mcs_touchkey_interrupt()
79 key_val -= chip->baseval; in mcs_touchkey_interrupt()
80 data->key_code = data->keycodes[key_val]; in mcs_touchkey_interrupt()
81 data->key_val = key_val; in mcs_touchkey_interrupt()
84 input_event(input, EV_MSC, MSC_SCAN, data->key_val); in mcs_touchkey_interrupt()
85 input_report_key(input, data->key_code, pressed); in mcs_touchkey_interrupt()
88 dev_dbg(&client->dev, "key %d %d %s\n", data->key_val, data->key_code, in mcs_touchkey_interrupt()
106 pdata = dev_get_platdata(&client->dev); in mcs_touchkey_probe()
108 dev_err(&client->dev, "no platform data defined\n"); in mcs_touchkey_probe()
109 return -EINVAL; in mcs_touchkey_probe()
112 data = kzalloc(struct_size(data, keycodes, pdata->key_maxval + 1), in mcs_touchkey_probe()
116 dev_err(&client->dev, "Failed to allocate memory\n"); in mcs_touchkey_probe()
117 error = -ENOMEM; in mcs_touchkey_probe()
121 data->client = client; in mcs_touchkey_probe()
122 data->input_dev = input_dev; in mcs_touchkey_probe()
124 if (id->driver_data == MCS5000_TOUCHKEY) { in mcs_touchkey_probe()
125 data->chip.status_reg = MCS5000_TOUCHKEY_STATUS; in mcs_touchkey_probe()
126 data->chip.pressbit = MCS5000_TOUCHKEY_STATUS_PRESS; in mcs_touchkey_probe()
127 data->chip.baseval = MCS5000_TOUCHKEY_BASE_VAL; in mcs_touchkey_probe()
130 data->chip.status_reg = MCS5080_TOUCHKEY_STATUS; in mcs_touchkey_probe()
131 data->chip.pressbit = MCS5080_TOUCHKEY_STATUS_PRESS; in mcs_touchkey_probe()
132 data->chip.press_invert = 1; in mcs_touchkey_probe()
133 data->chip.baseval = MCS5080_TOUCHKEY_BASE_VAL; in mcs_touchkey_probe()
140 dev_err(&client->dev, "i2c read error[%d]\n", error); in mcs_touchkey_probe()
143 dev_info(&client->dev, "Firmware version: %d\n", fw_ver); in mcs_touchkey_probe()
145 input_dev->name = "MELFAS MCS Touchkey"; in mcs_touchkey_probe()
146 input_dev->id.bustype = BUS_I2C; in mcs_touchkey_probe()
147 input_dev->dev.parent = &client->dev; in mcs_touchkey_probe()
148 input_dev->evbit[0] = BIT_MASK(EV_KEY); in mcs_touchkey_probe()
149 if (!pdata->no_autorepeat) in mcs_touchkey_probe()
150 input_dev->evbit[0] |= BIT_MASK(EV_REP); in mcs_touchkey_probe()
151 input_dev->keycode = data->keycodes; in mcs_touchkey_probe()
152 input_dev->keycodesize = sizeof(data->keycodes[0]); in mcs_touchkey_probe()
153 input_dev->keycodemax = pdata->key_maxval + 1; in mcs_touchkey_probe()
155 for (i = 0; i < pdata->keymap_size; i++) { in mcs_touchkey_probe()
156 unsigned int val = MCS_KEY_VAL(pdata->keymap[i]); in mcs_touchkey_probe()
157 unsigned int code = MCS_KEY_CODE(pdata->keymap[i]); in mcs_touchkey_probe()
159 data->keycodes[val] = code; in mcs_touchkey_probe()
160 __set_bit(code, input_dev->keybit); in mcs_touchkey_probe()
166 if (pdata->cfg_pin) in mcs_touchkey_probe()
167 pdata->cfg_pin(); in mcs_touchkey_probe()
169 if (pdata->poweron) { in mcs_touchkey_probe()
170 data->poweron = pdata->poweron; in mcs_touchkey_probe()
171 data->poweron(true); in mcs_touchkey_probe()
174 error = request_threaded_irq(client->irq, NULL, mcs_touchkey_interrupt, in mcs_touchkey_probe()
176 client->dev.driver->name, data); in mcs_touchkey_probe()
178 dev_err(&client->dev, "Failed to register interrupt\n"); in mcs_touchkey_probe()
190 free_irq(client->irq, data); in mcs_touchkey_probe()
201 free_irq(client->irq, data); in mcs_touchkey_remove()
202 if (data->poweron) in mcs_touchkey_remove()
203 data->poweron(false); in mcs_touchkey_remove()
204 input_unregister_device(data->input_dev); in mcs_touchkey_remove()
212 if (data->poweron) in mcs_touchkey_shutdown()
213 data->poweron(false); in mcs_touchkey_shutdown()
220 struct i2c_client *client = data->client; in mcs_touchkey_suspend()
223 disable_irq(client->irq); in mcs_touchkey_suspend()
226 if (data->poweron) in mcs_touchkey_suspend()
227 data->poweron(false); in mcs_touchkey_suspend()
235 struct i2c_client *client = data->client; in mcs_touchkey_resume()
238 if (data->poweron) in mcs_touchkey_resume()
239 data->poweron(true); in mcs_touchkey_resume()
242 enable_irq(client->irq); in mcs_touchkey_resume()