Lines Matching +full:auto +full:- +full:detection

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) ST-Ericsson SA 2010
5 * Author: Naveen Kumar G <naveen.gaddipati@stericsson.com> for ST-Ericsson
6 * Author: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson
22 #include <linux/platform_data/keypad-nomadik-ske.h>
44 /* keypad auto scan registers */
54 * struct ske_keypad - data structure used by keypad driver
78 spin_lock(&keypad->ske_keypad_lock); in ske_keypad_set_bits()
80 ret = readl(keypad->reg_base + addr); in ske_keypad_set_bits()
83 writel(ret, keypad->reg_base + addr); in ske_keypad_set_bits()
85 spin_unlock(&keypad->ske_keypad_lock); in ske_keypad_set_bits()
91 * Enable Multi key press detection, auto scan mode
96 int timeout = keypad->board->debounce_ms; in ske_keypad_chip_init()
99 while ((readl(keypad->reg_base + SKE_RIS) != 0x00000000) && timeout--) in ske_keypad_chip_init()
102 if (timeout == -1) in ske_keypad_chip_init()
103 return -EINVAL; in ske_keypad_chip_init()
110 spin_lock(&keypad->ske_keypad_lock); in ske_keypad_chip_init()
111 value = readl(keypad->reg_base + SKE_DBCR); in ske_keypad_chip_init()
113 value |= ((keypad->board->debounce_ms * 32000)/32768) << 8; in ske_keypad_chip_init()
114 writel(value, keypad->reg_base + SKE_DBCR); in ske_keypad_chip_init()
115 spin_unlock(&keypad->ske_keypad_lock); in ske_keypad_chip_init()
117 /* enable multi key detection */ in ske_keypad_chip_init()
122 * KPCN[5:3] defines no. of keypad columns to be auto scanned in ske_keypad_chip_init()
124 value = (keypad->board->kcol - 1) << 3; in ske_keypad_chip_init()
127 /* clear keypad interrupt for auto(and pending SW) scans */ in ske_keypad_chip_init()
130 /* un-mask keypad interrupts */ in ske_keypad_chip_init()
142 struct input_dev *input = keypad->input; in ske_keypad_report()
155 ske_ris = readl(keypad->reg_base + SKE_RIS); in ske_keypad_report()
159 input_report_key(input, keypad->keymap[code], key_pressed); in ske_keypad_report()
161 num_of_rows--; in ske_keypad_report()
172 * Read the auto scan registers in ske_keypad_read_data()
179 ske_asr = readl(keypad->reg_base + SKE_ASR0 + (4 * i)); in ske_keypad_read_data()
200 int timeout = keypad->board->debounce_ms; in ske_keypad_irq()
202 /* disable auto scan interrupt; mask the interrupt generated */ in ske_keypad_irq()
206 while ((readl(keypad->reg_base + SKE_CR) & SKE_KPASON) && --timeout) in ske_keypad_irq()
213 while ((readl(keypad->reg_base + SKE_RIS)) && --timeout) in ske_keypad_irq()
216 /* enable auto scan interrupts */ in ske_keypad_irq()
225 dev_get_platdata(&pdev->dev); in ske_keypad_probe()
233 dev_err(&pdev->dev, "invalid keypad platform data\n"); in ske_keypad_probe()
234 return -EINVAL; in ske_keypad_probe()
239 return -EINVAL; in ske_keypad_probe()
243 dev_err(&pdev->dev, "missing platform resources\n"); in ske_keypad_probe()
244 return -EINVAL; in ske_keypad_probe()
250 dev_err(&pdev->dev, "failed to allocate keypad memory\n"); in ske_keypad_probe()
251 error = -ENOMEM; in ske_keypad_probe()
255 keypad->irq = irq; in ske_keypad_probe()
256 keypad->board = plat; in ske_keypad_probe()
257 keypad->input = input; in ske_keypad_probe()
258 spin_lock_init(&keypad->ske_keypad_lock); in ske_keypad_probe()
260 if (!request_mem_region(res->start, resource_size(res), pdev->name)) { in ske_keypad_probe()
261 dev_err(&pdev->dev, "failed to request I/O memory\n"); in ske_keypad_probe()
262 error = -EBUSY; in ske_keypad_probe()
266 keypad->reg_base = ioremap(res->start, resource_size(res)); in ske_keypad_probe()
267 if (!keypad->reg_base) { in ske_keypad_probe()
268 dev_err(&pdev->dev, "failed to remap I/O memory\n"); in ske_keypad_probe()
269 error = -ENXIO; in ske_keypad_probe()
273 keypad->pclk = clk_get(&pdev->dev, "apb_pclk"); in ske_keypad_probe()
274 if (IS_ERR(keypad->pclk)) { in ske_keypad_probe()
275 dev_err(&pdev->dev, "failed to get pclk\n"); in ske_keypad_probe()
276 error = PTR_ERR(keypad->pclk); in ske_keypad_probe()
280 keypad->clk = clk_get(&pdev->dev, NULL); in ske_keypad_probe()
281 if (IS_ERR(keypad->clk)) { in ske_keypad_probe()
282 dev_err(&pdev->dev, "failed to get clk\n"); in ske_keypad_probe()
283 error = PTR_ERR(keypad->clk); in ske_keypad_probe()
287 input->id.bustype = BUS_HOST; in ske_keypad_probe()
288 input->name = "ux500-ske-keypad"; in ske_keypad_probe()
289 input->dev.parent = &pdev->dev; in ske_keypad_probe()
291 error = matrix_keypad_build_keymap(plat->keymap_data, NULL, in ske_keypad_probe()
293 keypad->keymap, input); in ske_keypad_probe()
295 dev_err(&pdev->dev, "Failed to build keymap\n"); in ske_keypad_probe()
300 if (!plat->no_autorepeat) in ske_keypad_probe()
301 __set_bit(EV_REP, input->evbit); in ske_keypad_probe()
303 error = clk_prepare_enable(keypad->pclk); in ske_keypad_probe()
305 dev_err(&pdev->dev, "Failed to prepare/enable pclk\n"); in ske_keypad_probe()
309 error = clk_prepare_enable(keypad->clk); in ske_keypad_probe()
311 dev_err(&pdev->dev, "Failed to prepare/enable clk\n"); in ske_keypad_probe()
317 if (keypad->board->init) in ske_keypad_probe()
318 keypad->board->init(); in ske_keypad_probe()
322 dev_err(&pdev->dev, "unable to init keypad hardware\n"); in ske_keypad_probe()
326 error = request_threaded_irq(keypad->irq, NULL, ske_keypad_irq, in ske_keypad_probe()
327 IRQF_ONESHOT, "ske-keypad", keypad); in ske_keypad_probe()
329 dev_err(&pdev->dev, "allocate irq %d failed\n", keypad->irq); in ske_keypad_probe()
335 dev_err(&pdev->dev, in ske_keypad_probe()
340 if (plat->wakeup_enable) in ske_keypad_probe()
341 device_init_wakeup(&pdev->dev, true); in ske_keypad_probe()
348 free_irq(keypad->irq, keypad); in ske_keypad_probe()
350 clk_disable_unprepare(keypad->clk); in ske_keypad_probe()
352 clk_disable_unprepare(keypad->pclk); in ske_keypad_probe()
354 clk_put(keypad->clk); in ske_keypad_probe()
356 clk_put(keypad->pclk); in ske_keypad_probe()
358 iounmap(keypad->reg_base); in ske_keypad_probe()
360 release_mem_region(res->start, resource_size(res)); in ske_keypad_probe()
372 free_irq(keypad->irq, keypad); in ske_keypad_remove()
374 input_unregister_device(keypad->input); in ske_keypad_remove()
376 clk_disable_unprepare(keypad->clk); in ske_keypad_remove()
377 clk_put(keypad->clk); in ske_keypad_remove()
379 if (keypad->board->exit) in ske_keypad_remove()
380 keypad->board->exit(); in ske_keypad_remove()
382 iounmap(keypad->reg_base); in ske_keypad_remove()
383 release_mem_region(res->start, resource_size(res)); in ske_keypad_remove()
424 .name = "nmk-ske-keypad",
434 MODULE_DESCRIPTION("Nomadik Scroll-Key-Encoder Keypad Driver");
435 MODULE_ALIAS("platform:nomadik-ske-keypad");