Lines Matching +full:matrix +full:- +full:keypad
1 // SPDX-License-Identifier: GPL-2.0-only
23 /* As needed for the matrix parsing code */
39 unsigned long keypad; member
50 if (events[ev] < kpad->info->key_ev_min || in adp5585_keys_validate_events()
51 events[ev] > kpad->info->key_ev_max) in adp5585_keys_validate_events()
58 row = (events[ev] - 1) / kpad->info->max_cols; in adp5585_keys_validate_events()
59 col = (events[ev] - 1) % kpad->info->max_cols; in adp5585_keys_validate_events()
61 if (test_bit(row, &kpad->keypad) && in adp5585_keys_validate_events()
62 test_bit(col + kpad->info->max_rows, &kpad->keypad)) in adp5585_keys_validate_events()
65 return dev_err_probe(kpad->dev, -EINVAL, in adp5585_keys_validate_events()
66 "Invalid unlock/reset event(%u) not used in the keypad\n", in adp5585_keys_validate_events()
78 error = adp5585_keys_validate_events(kpad, adp5585->unlock_keys, in adp5585_keys_check_special_events()
79 adp5585->nkeys_unlock); in adp5585_keys_check_special_events()
83 error = adp5585_keys_validate_events(kpad, adp5585->reset1_keys, in adp5585_keys_check_special_events()
84 adp5585->nkeys_reset1); in adp5585_keys_check_special_events()
88 return adp5585_keys_validate_events(kpad, adp5585->reset2_keys, in adp5585_keys_check_special_events()
89 adp5585->nkeys_reset2); in adp5585_keys_check_special_events()
95 struct adp5585_dev *adp5585 = dev_get_drvdata(kpad->dev->parent); in adp5585_keys_pins_free()
98 for_each_set_bit(pin, &kpad->keypad, adp5585->n_pins) in adp5585_keys_pins_free()
99 clear_bit(pin, adp5585->pin_usage); in adp5585_keys_pins_free()
105 struct device *dev = kpad->dev; in adp5585_keys_parse_fw()
113 n_pins = device_property_count_u32(dev, "adi,keypad-pins"); in adp5585_keys_parse_fw()
114 if (n_pins > adp5585->n_pins) in adp5585_keys_parse_fw()
115 return dev_err_probe(dev, -EINVAL, in adp5585_keys_parse_fw()
116 "Too many keypad pins (%d) defined (max=%d)\n", in adp5585_keys_parse_fw()
117 n_pins, adp5585->n_pins); in adp5585_keys_parse_fw()
122 return -ENOMEM; in adp5585_keys_parse_fw()
124 error = device_property_read_u32_array(dev, "adi,keypad-pins", in adp5585_keys_parse_fw()
131 * "bad" will happen out of it. Worst case, it will be a no-op and no in adp5585_keys_parse_fw()
139 if (keypad_pins[pin] >= adp5585->n_pins) in adp5585_keys_parse_fw()
140 return dev_err_probe(dev, -EINVAL, in adp5585_keys_parse_fw()
141 "Invalid keypad pin(%u) defined\n", in adp5585_keys_parse_fw()
144 if (test_and_set_bit(keypad_pins[pin], adp5585->pin_usage)) in adp5585_keys_parse_fw()
145 return dev_err_probe(dev, -EBUSY, in adp5585_keys_parse_fw()
146 "Keypad pin(%u) already used\n", in adp5585_keys_parse_fw()
149 __set_bit(keypad_pins[pin], &kpad->keypad); in adp5585_keys_parse_fw()
154 * can have holes in our keypad (eg: row0, row1 and row7 enabled). in adp5585_keys_parse_fw()
155 * However, for the matrix parsing functions we need to pass the in adp5585_keys_parse_fw()
157 * pretty much means we will also have holes in our SW keypad. in adp5585_keys_parse_fw()
160 rows = find_last_bit(&kpad->keypad, kpad->info->max_rows) + 1; in adp5585_keys_parse_fw()
161 if (rows == kpad->info->max_rows + 1) in adp5585_keys_parse_fw()
162 return dev_err_probe(dev, -EINVAL, in adp5585_keys_parse_fw()
163 "Now rows defined in the keypad!\n"); in adp5585_keys_parse_fw()
165 cols = find_last_bit(&kpad->keypad, kpad->info->max_cols + kpad->info->max_rows); in adp5585_keys_parse_fw()
166 if (cols < kpad->info->max_rows) in adp5585_keys_parse_fw()
167 return dev_err_probe(dev, -EINVAL, in adp5585_keys_parse_fw()
168 "No columns defined in the keypad!\n"); in adp5585_keys_parse_fw()
170 cols = cols + 1 - kpad->info->max_rows; in adp5585_keys_parse_fw()
173 kpad->keycode, kpad->input); in adp5585_keys_parse_fw()
177 kpad->row_shift = get_count_order(cols); in adp5585_keys_parse_fw()
179 if (device_property_read_bool(kpad->dev, "autorepeat")) in adp5585_keys_parse_fw()
180 __set_bit(EV_REP, kpad->input->evbit); in adp5585_keys_parse_fw()
192 unsigned long keys_bits, start = 0, nbits = kpad->info->max_rows; in adp5585_keys_setup()
193 const struct adp5585_regs *regs = adp5585->regs; in adp5585_keys_setup()
194 unsigned int i = 0, max_cols = kpad->info->max_cols; in adp5585_keys_setup()
204 keys_bits = bitmap_read(&kpad->keypad, start, nbits); in adp5585_keys_setup()
206 error = regmap_write(adp5585->regmap, regs->pin_cfg_a + i, in adp5585_keys_setup()
215 max_cols -= nbits; in adp5585_keys_setup()
221 } while (start < kpad->info->max_rows + kpad->info->max_cols); in adp5585_keys_setup()
234 if (key < kpad->info->key_ev_min || key > kpad->info->key_ev_max) in adp5585_keys_ev_handle()
245 row = (key - 1) / (kpad->info->max_cols); in adp5585_keys_ev_handle()
246 col = (key - 1) % (kpad->info->max_cols); in adp5585_keys_ev_handle()
247 code = MATRIX_SCAN_CODE(row, col, kpad->row_shift); in adp5585_keys_ev_handle()
249 dev_dbg_ratelimited(kpad->dev, "report key(%lu) r(%d) c(%d) code(%d)\n", in adp5585_keys_ev_handle()
250 key, row, col, kpad->keycode[code]); in adp5585_keys_ev_handle()
252 input_report_key(kpad->input, kpad->keycode[code], key_press); in adp5585_keys_ev_handle()
253 input_sync(kpad->input); in adp5585_keys_ev_handle()
261 struct adp5585_dev *adp5585 = dev_get_drvdata(kpad->dev->parent); in adp5585_keys_unreg_notifier()
263 blocking_notifier_chain_unregister(&adp5585->event_notifier, in adp5585_keys_unreg_notifier()
264 &kpad->nb); in adp5585_keys_unreg_notifier()
270 struct adp5585_dev *adp5585 = dev_get_drvdata(pdev->dev.parent); in adp5585_keys_probe()
271 struct device *dev = &pdev->dev; in adp5585_keys_probe()
279 return -ENOMEM; in adp5585_keys_probe()
281 if (!adp5585->irq) in adp5585_keys_probe()
282 return dev_err_probe(dev, -EINVAL, in adp5585_keys_probe()
283 "IRQ is mandatory for the keypad\n"); in adp5585_keys_probe()
285 kpad->dev = dev; in adp5585_keys_probe()
287 kpad->input = devm_input_allocate_device(dev); in adp5585_keys_probe()
288 if (!kpad->input) in adp5585_keys_probe()
289 return -ENOMEM; in adp5585_keys_probe()
291 kpad->info = (const struct adp5585_kpad_chip *)id->driver_data; in adp5585_keys_probe()
292 if (!kpad->info) in adp5585_keys_probe()
293 return -ENODEV; in adp5585_keys_probe()
295 error = regmap_read(adp5585->regmap, ADP5585_ID, &revid); in adp5585_keys_probe()
299 phys = devm_kasprintf(dev, GFP_KERNEL, "%s/input0", pdev->name); in adp5585_keys_probe()
301 return -ENOMEM; in adp5585_keys_probe()
303 kpad->input->name = pdev->name; in adp5585_keys_probe()
304 kpad->input->phys = phys; in adp5585_keys_probe()
306 kpad->input->id.bustype = BUS_I2C; in adp5585_keys_probe()
307 kpad->input->id.vendor = 0x0001; in adp5585_keys_probe()
308 kpad->input->id.product = 0x0001; in adp5585_keys_probe()
309 kpad->input->id.version = revid & ADP5585_REV_ID_MASK; in adp5585_keys_probe()
311 device_set_of_node_from_dev(dev, dev->parent); in adp5585_keys_probe()
321 kpad->nb.notifier_call = adp5585_keys_ev_handle; in adp5585_keys_probe()
322 error = blocking_notifier_chain_register(&adp5585->event_notifier, in adp5585_keys_probe()
323 &kpad->nb); in adp5585_keys_probe()
331 error = input_register_device(kpad->input); in adp5585_keys_probe()
354 { "adp5585-keys", (kernel_ulong_t)&adp5585_kpad_chip_info },
355 { "adp5589-keys", (kernel_ulong_t)&adp5589_kpad_chip_info },
362 .name = "adp5585-keys",