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()
99 touchkey->poweron(false); in mcs_touchkey_poweroff()
113 pdata = dev_get_platdata(&client->dev); in mcs_touchkey_probe()
115 dev_err(&client->dev, "no platform data defined\n"); in mcs_touchkey_probe()
116 return -EINVAL; in mcs_touchkey_probe()
119 data = devm_kzalloc(&client->dev, in mcs_touchkey_probe()
120 struct_size(data, keycodes, pdata->key_maxval + 1), in mcs_touchkey_probe()
123 return -ENOMEM; in mcs_touchkey_probe()
125 input_dev = devm_input_allocate_device(&client->dev); in mcs_touchkey_probe()
127 dev_err(&client->dev, "Failed to allocate input device\n"); in mcs_touchkey_probe()
128 return -ENOMEM; in mcs_touchkey_probe()
131 data->client = client; in mcs_touchkey_probe()
132 data->input_dev = input_dev; in mcs_touchkey_probe()
134 if (id->driver_data == MCS5000_TOUCHKEY) { in mcs_touchkey_probe()
135 data->chip.status_reg = MCS5000_TOUCHKEY_STATUS; in mcs_touchkey_probe()
136 data->chip.pressbit = MCS5000_TOUCHKEY_STATUS_PRESS; in mcs_touchkey_probe()
137 data->chip.baseval = MCS5000_TOUCHKEY_BASE_VAL; in mcs_touchkey_probe()
140 data->chip.status_reg = MCS5080_TOUCHKEY_STATUS; in mcs_touchkey_probe()
141 data->chip.pressbit = MCS5080_TOUCHKEY_STATUS_PRESS; in mcs_touchkey_probe()
142 data->chip.press_invert = 1; in mcs_touchkey_probe()
143 data->chip.baseval = MCS5080_TOUCHKEY_BASE_VAL; in mcs_touchkey_probe()
149 dev_err(&client->dev, "i2c read error[%d]\n", fw_ver); in mcs_touchkey_probe()
152 dev_info(&client->dev, "Firmware version: %d\n", fw_ver); in mcs_touchkey_probe()
154 input_dev->name = "MELFAS MCS Touchkey"; in mcs_touchkey_probe()
155 input_dev->id.bustype = BUS_I2C; in mcs_touchkey_probe()
156 input_dev->evbit[0] = BIT_MASK(EV_KEY); in mcs_touchkey_probe()
157 if (!pdata->no_autorepeat) in mcs_touchkey_probe()
158 input_dev->evbit[0] |= BIT_MASK(EV_REP); in mcs_touchkey_probe()
159 input_dev->keycode = data->keycodes; in mcs_touchkey_probe()
160 input_dev->keycodesize = sizeof(data->keycodes[0]); in mcs_touchkey_probe()
161 input_dev->keycodemax = pdata->key_maxval + 1; in mcs_touchkey_probe()
163 for (i = 0; i < pdata->keymap_size; i++) { in mcs_touchkey_probe()
164 unsigned int val = MCS_KEY_VAL(pdata->keymap[i]); in mcs_touchkey_probe()
165 unsigned int code = MCS_KEY_CODE(pdata->keymap[i]); in mcs_touchkey_probe()
167 data->keycodes[val] = code; in mcs_touchkey_probe()
168 __set_bit(code, input_dev->keybit); in mcs_touchkey_probe()
174 if (pdata->cfg_pin) in mcs_touchkey_probe()
175 pdata->cfg_pin(); in mcs_touchkey_probe()
177 if (pdata->poweron) { in mcs_touchkey_probe()
178 data->poweron = pdata->poweron; in mcs_touchkey_probe()
179 data->poweron(true); in mcs_touchkey_probe()
181 error = devm_add_action_or_reset(&client->dev, in mcs_touchkey_probe()
187 error = devm_request_threaded_irq(&client->dev, client->irq, in mcs_touchkey_probe()
190 client->dev.driver->name, data); in mcs_touchkey_probe()
192 dev_err(&client->dev, "Failed to register interrupt\n"); in mcs_touchkey_probe()
208 if (data->poweron) in mcs_touchkey_shutdown()
209 data->poweron(false); in mcs_touchkey_shutdown()
215 struct i2c_client *client = data->client; in mcs_touchkey_suspend()
218 disable_irq(client->irq); in mcs_touchkey_suspend()
221 if (data->poweron) in mcs_touchkey_suspend()
222 data->poweron(false); in mcs_touchkey_suspend()
230 struct i2c_client *client = data->client; in mcs_touchkey_resume()
233 if (data->poweron) in mcs_touchkey_resume()
234 data->poweron(true); in mcs_touchkey_resume()
237 enable_irq(client->irq); in mcs_touchkey_resume()