Lines Matching refs:keypad
86 static void enable_row_irqs(struct matrix_keypad *keypad)
88 const struct matrix_keypad_platform_data *pdata = keypad->pdata;
99 static void disable_row_irqs(struct matrix_keypad *keypad)
101 const struct matrix_keypad_platform_data *pdata = keypad->pdata;
117 struct matrix_keypad *keypad =
119 struct input_dev *input_dev = keypad->input_dev;
121 const struct matrix_keypad_platform_data *pdata = keypad->pdata;
148 bits_changed = keypad->last_key_state[col] ^ new_state[col];
156 code = MATRIX_SCAN_CODE(row, col, keypad->row_shift);
165 memcpy(keypad->last_key_state, new_state, sizeof(new_state));
170 spin_lock_irq(&keypad->lock);
171 keypad->scan_pending = false;
172 enable_row_irqs(keypad);
173 spin_unlock_irq(&keypad->lock);
178 struct matrix_keypad *keypad = id;
181 spin_lock_irqsave(&keypad->lock, flags);
188 if (unlikely(keypad->scan_pending || keypad->stopped))
191 disable_row_irqs(keypad);
192 keypad->scan_pending = true;
193 schedule_delayed_work(&keypad->work,
194 msecs_to_jiffies(keypad->pdata->debounce_ms));
197 spin_unlock_irqrestore(&keypad->lock, flags);
203 struct matrix_keypad *keypad = input_get_drvdata(dev);
205 keypad->stopped = false;
212 schedule_delayed_work(&keypad->work, 0);
219 struct matrix_keypad *keypad = input_get_drvdata(dev);
221 spin_lock_irq(&keypad->lock);
222 keypad->stopped = true;
223 spin_unlock_irq(&keypad->lock);
225 flush_delayed_work(&keypad->work);
230 disable_row_irqs(keypad);
233 static void matrix_keypad_enable_wakeup(struct matrix_keypad *keypad)
235 const struct matrix_keypad_platform_data *pdata = keypad->pdata;
241 keypad->gpio_all_disabled = true;
245 if (!test_bit(i, keypad->disabled_gpios)) {
249 __set_bit(i, keypad->disabled_gpios);
255 static void matrix_keypad_disable_wakeup(struct matrix_keypad *keypad)
257 const struct matrix_keypad_platform_data *pdata = keypad->pdata;
262 if (keypad->gpio_all_disabled) {
264 keypad->gpio_all_disabled = false;
268 if (test_and_clear_bit(i, keypad->disabled_gpios)) {
279 struct matrix_keypad *keypad = platform_get_drvdata(pdev);
281 matrix_keypad_stop(keypad->input_dev);
284 matrix_keypad_enable_wakeup(keypad);
292 struct matrix_keypad *keypad = platform_get_drvdata(pdev);
295 matrix_keypad_disable_wakeup(keypad);
297 matrix_keypad_start(keypad->input_dev);
306 struct matrix_keypad *keypad)
308 const struct matrix_keypad_platform_data *pdata = keypad->pdata;
340 "matrix-keypad", keypad);
353 "matrix-keypad", keypad);
364 disable_row_irqs(keypad);
369 free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad);
382 static void matrix_keypad_free_gpio(struct matrix_keypad *keypad)
384 const struct matrix_keypad_platform_data *pdata = keypad->pdata;
388 free_irq(pdata->clustered_irq, keypad);
391 free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad);
424 dev_err(dev, "number of keypad rows/columns not specified\n");
483 struct matrix_keypad *keypad;
497 keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL);
499 if (!keypad || !input_dev) {
504 keypad->input_dev = input_dev;
505 keypad->pdata = pdata;
506 keypad->row_shift = get_count_order(pdata->num_col_gpios);
507 keypad->stopped = true;
508 INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan);
509 spin_lock_init(&keypad->lock);
529 input_set_drvdata(input_dev, keypad);
531 err = matrix_keypad_init_gpio(pdev, keypad);
535 err = input_register_device(keypad->input_dev);
540 platform_set_drvdata(pdev, keypad);
545 matrix_keypad_free_gpio(keypad);
548 kfree(keypad);
554 struct matrix_keypad *keypad = platform_get_drvdata(pdev);
556 matrix_keypad_free_gpio(keypad);
557 input_unregister_device(keypad->input_dev);
558 kfree(keypad);
565 { .compatible = "gpio-matrix-keypad" },
575 .name = "matrix-keypad",
585 MODULE_ALIAS("platform:matrix-keypad");