Lines Matching +full:debounce +full:- +full:release +full:- +full:ms
1 // SPDX-License-Identifier: GPL-2.0-or-later
53 * Errata i689: If a key is released for a time shorter than debounce time,
54 * the keyboard will idle and never detect the key release. The workaround
55 * is to use at least a 12ms debounce time. See omap5432 TRM chapter
60 ((((dbms) * 1000) / ((1 << ((ptv) + 1)) * (1000000 / 32768))) - 1)
90 return __raw_readl(keypad_data->base + in kbd_readl()
91 keypad_data->reg_offset + offset); in kbd_readl()
97 keypad_data->base + keypad_data->reg_offset + offset); in kbd_writel()
102 return __raw_readl(keypad_data->base + in kbd_read_irqreg()
103 keypad_data->irqreg_offset + offset); in kbd_read_irqreg()
110 keypad_data->base + keypad_data->irqreg_offset + offset); in kbd_write_irqreg()
116 struct input_dev *input_dev = keypad_data->input; in omap4_keypad_report_keys()
124 for_each_set_bit(bit, mask, keypad_data->rows * BITS_PER_BYTE) { in omap4_keypad_report_keys()
127 code = MATRIX_SCAN_CODE(row, col, keypad_data->row_shift); in omap4_keypad_report_keys()
130 input_report_key(input_dev, keypad_data->keymap[code], down); in omap4_keypad_report_keys()
145 mutex_lock(&keypad_data->lock); in omap4_keypad_scan_keys()
147 changed = keys ^ keypad_data->keys; in omap4_keypad_scan_keys()
151 * lost key-up interrupt and just now catching up. in omap4_keypad_scan_keys()
158 keypad_data->keys = keys; in omap4_keypad_scan_keys()
160 mutex_unlock(&keypad_data->lock); in omap4_keypad_scan_keys()
177 struct device *dev = keypad_data->input->dev.parent; in omap4_keypad_irq_thread_fn()
205 struct device *dev = input->dev.parent; in omap4_keypad_open()
212 disable_irq(keypad_data->irq); in omap4_keypad_open()
227 enable_irq(keypad_data->irq); in omap4_keypad_open()
237 /* Disable interrupts and wake-up events */ in omap4_keypad_stop()
250 struct device *dev = input->dev.parent; in omap4_keypad_close()
258 disable_irq(keypad_data->irq); in omap4_keypad_close()
260 enable_irq(keypad_data->irq); in omap4_keypad_close()
269 struct device_node *np = dev->of_node; in omap4_keypad_parse_dt()
272 err = matrix_keypad_parse_properties(dev, &keypad_data->rows, in omap4_keypad_parse_dt()
273 &keypad_data->cols); in omap4_keypad_parse_dt()
277 keypad_data->no_autorepeat = of_property_read_bool(np, "linux,input-no-autorepeat"); in omap4_keypad_parse_dt()
287 rev = __raw_readl(keypad_data->base + OMAP4_KBD_REVISION); in omap4_keypad_check_revision()
292 keypad_data->reg_offset = 0x00; in omap4_keypad_check_revision()
293 keypad_data->irqreg_offset = 0x00; in omap4_keypad_check_revision()
296 keypad_data->reg_offset = 0x10; in omap4_keypad_check_revision()
297 keypad_data->irqreg_offset = 0x0c; in omap4_keypad_check_revision()
301 return -EINVAL; in omap4_keypad_check_revision()
309 * Interrupt may not happen for key-up events. We must clear stuck
310 * key-up events after the keyboard hardware has auto-idled.
321 return -EBUSY; in omap4_keypad_runtime_suspend()
341 struct device *dev = &pdev->dev; in omap4_keypad_probe()
355 return -ENOMEM; in omap4_keypad_probe()
358 keypad_data->irq = irq; in omap4_keypad_probe()
359 mutex_init(&keypad_data->lock); in omap4_keypad_probe()
366 keypad_data->base = devm_platform_ioremap_resource(pdev, 0); in omap4_keypad_probe()
367 if (IS_ERR(keypad_data->base)) in omap4_keypad_probe()
368 return PTR_ERR(keypad_data->base); in omap4_keypad_probe()
402 keypad_data->input = input_dev = devm_input_allocate_device(dev); in omap4_keypad_probe()
404 return -ENOMEM; in omap4_keypad_probe()
406 input_dev->name = pdev->name; in omap4_keypad_probe()
407 input_dev->id.bustype = BUS_HOST; in omap4_keypad_probe()
408 input_dev->id.vendor = 0x0001; in omap4_keypad_probe()
409 input_dev->id.product = 0x0001; in omap4_keypad_probe()
410 input_dev->id.version = 0x0001; in omap4_keypad_probe()
412 input_dev->open = omap4_keypad_open; in omap4_keypad_probe()
413 input_dev->close = omap4_keypad_close; in omap4_keypad_probe()
416 if (!keypad_data->no_autorepeat) in omap4_keypad_probe()
417 __set_bit(EV_REP, input_dev->evbit); in omap4_keypad_probe()
421 keypad_data->row_shift = get_count_order(keypad_data->cols); in omap4_keypad_probe()
422 max_keys = keypad_data->rows << keypad_data->row_shift; in omap4_keypad_probe()
423 keypad_data->keymap = devm_kcalloc(dev, in omap4_keypad_probe()
425 sizeof(keypad_data->keymap[0]), in omap4_keypad_probe()
427 if (!keypad_data->keymap) { in omap4_keypad_probe()
429 return -ENOMEM; in omap4_keypad_probe()
433 keypad_data->rows, keypad_data->cols, in omap4_keypad_probe()
434 keypad_data->keymap, input_dev); in omap4_keypad_probe()
440 error = devm_request_threaded_irq(dev, keypad_data->irq, in omap4_keypad_probe()
444 "omap4-keypad", keypad_data); in omap4_keypad_probe()
450 error = input_register_device(keypad_data->input); in omap4_keypad_probe()
457 error = dev_pm_set_wake_irq(dev, keypad_data->irq); in omap4_keypad_probe()
466 dev_pm_clear_wake_irq(&pdev->dev); in omap4_keypad_remove()
472 { .compatible = "ti,omap4-keypad" },
481 .name = "omap4-keypad",
491 MODULE_ALIAS("platform:omap4-keypad");