Lines Matching full:keypad
8 * Keypad controller driver for the SKE (Scroll Key Encoder) module used in
22 #include <linux/platform_data/keypad-nomadik-ske.h>
44 /* keypad auto scan registers */
54 * struct ske_keypad - data structure used by keypad driver
58 * @board: keypad platform device
62 * @ske_keypad_lock: spinlock protecting the keypad read/writes
75 static void ske_keypad_set_bits(struct ske_keypad *keypad, u16 addr, in ske_keypad_set_bits() argument
80 spin_lock(&keypad->ske_keypad_lock); in ske_keypad_set_bits()
82 ret = readl(keypad->reg_base + addr); in ske_keypad_set_bits()
85 writel(ret, keypad->reg_base + addr); in ske_keypad_set_bits()
87 spin_unlock(&keypad->ske_keypad_lock); in ske_keypad_set_bits()
91 * ske_keypad_chip_init: init keypad controller configuration
95 static int __init ske_keypad_chip_init(struct ske_keypad *keypad) in ske_keypad_chip_init() argument
98 int timeout = keypad->board->debounce_ms; in ske_keypad_chip_init()
101 while ((readl(keypad->reg_base + SKE_RIS) != 0x00000000) && timeout--) in ske_keypad_chip_init()
109 * keypad dbounce is configured in DBCR[15:8] in ske_keypad_chip_init()
112 spin_lock(&keypad->ske_keypad_lock); in ske_keypad_chip_init()
113 value = readl(keypad->reg_base + SKE_DBCR); in ske_keypad_chip_init()
115 value |= ((keypad->board->debounce_ms * 32000)/32768) << 8; in ske_keypad_chip_init()
116 writel(value, keypad->reg_base + SKE_DBCR); in ske_keypad_chip_init()
117 spin_unlock(&keypad->ske_keypad_lock); in ske_keypad_chip_init()
120 ske_keypad_set_bits(keypad, SKE_CR, 0x0, SKE_KPMLT); in ske_keypad_chip_init()
124 * KPCN[5:3] defines no. of keypad columns to be auto scanned in ske_keypad_chip_init()
126 value = (keypad->board->kcol - 1) << 3; in ske_keypad_chip_init()
127 ske_keypad_set_bits(keypad, SKE_CR, SKE_KPCN, value); in ske_keypad_chip_init()
129 /* clear keypad interrupt for auto(and pending SW) scans */ in ske_keypad_chip_init()
130 ske_keypad_set_bits(keypad, SKE_ICR, 0x0, SKE_KPICA | SKE_KPICS); in ske_keypad_chip_init()
132 /* un-mask keypad interrupts */ in ske_keypad_chip_init()
133 ske_keypad_set_bits(keypad, SKE_IMSC, 0x0, SKE_KPIMA); in ske_keypad_chip_init()
136 ske_keypad_set_bits(keypad, SKE_CR, 0x0, SKE_KPASEN); in ske_keypad_chip_init()
141 static void ske_keypad_report(struct ske_keypad *keypad, u8 status, int col) in ske_keypad_report() argument
144 struct input_dev *input = keypad->input; in ske_keypad_report()
157 ske_ris = readl(keypad->reg_base + SKE_RIS); in ske_keypad_report()
161 input_report_key(input, keypad->keymap[code], key_pressed); in ske_keypad_report()
167 static void ske_keypad_read_data(struct ske_keypad *keypad) in ske_keypad_read_data() argument
181 ske_asr = readl(keypad->reg_base + SKE_ASR0 + (4 * i)); in ske_keypad_read_data()
189 ske_keypad_report(keypad, status, col); in ske_keypad_read_data()
194 ske_keypad_report(keypad, status, col); in ske_keypad_read_data()
201 struct ske_keypad *keypad = dev_id; in ske_keypad_irq() local
202 int timeout = keypad->board->debounce_ms; in ske_keypad_irq()
205 ske_keypad_set_bits(keypad, SKE_IMSC, ~SKE_KPIMA, 0x0); in ske_keypad_irq()
206 ske_keypad_set_bits(keypad, SKE_ICR, 0x0, SKE_KPICA); in ske_keypad_irq()
208 while ((readl(keypad->reg_base + SKE_CR) & SKE_KPASON) && --timeout) in ske_keypad_irq()
212 ske_keypad_read_data(keypad); in ske_keypad_irq()
215 while ((readl(keypad->reg_base + SKE_RIS)) && --timeout) in ske_keypad_irq()
219 ske_keypad_set_bits(keypad, SKE_IMSC, 0x0, SKE_KPIMA); in ske_keypad_irq()
228 struct ske_keypad *keypad; in ske_keypad_probe() local
235 dev_err(&pdev->dev, "invalid keypad platform data\n"); in ske_keypad_probe()
249 keypad = kzalloc(sizeof(struct ske_keypad), GFP_KERNEL); in ske_keypad_probe()
251 if (!keypad || !input) { in ske_keypad_probe()
252 dev_err(&pdev->dev, "failed to allocate keypad memory\n"); in ske_keypad_probe()
257 keypad->irq = irq; in ske_keypad_probe()
258 keypad->board = plat; in ske_keypad_probe()
259 keypad->input = input; in ske_keypad_probe()
260 spin_lock_init(&keypad->ske_keypad_lock); in ske_keypad_probe()
268 keypad->reg_base = ioremap(res->start, resource_size(res)); in ske_keypad_probe()
269 if (!keypad->reg_base) { in ske_keypad_probe()
275 keypad->pclk = clk_get(&pdev->dev, "apb_pclk"); in ske_keypad_probe()
276 if (IS_ERR(keypad->pclk)) { in ske_keypad_probe()
278 error = PTR_ERR(keypad->pclk); in ske_keypad_probe()
282 keypad->clk = clk_get(&pdev->dev, NULL); in ske_keypad_probe()
283 if (IS_ERR(keypad->clk)) { in ske_keypad_probe()
285 error = PTR_ERR(keypad->clk); in ske_keypad_probe()
290 input->name = "ux500-ske-keypad"; in ske_keypad_probe()
295 keypad->keymap, input); in ske_keypad_probe()
305 error = clk_prepare_enable(keypad->pclk); in ske_keypad_probe()
311 error = clk_prepare_enable(keypad->clk); in ske_keypad_probe()
319 if (keypad->board->init) in ske_keypad_probe()
320 keypad->board->init(); in ske_keypad_probe()
322 error = ske_keypad_chip_init(keypad); in ske_keypad_probe()
324 dev_err(&pdev->dev, "unable to init keypad hardware\n"); in ske_keypad_probe()
328 error = request_threaded_irq(keypad->irq, NULL, ske_keypad_irq, in ske_keypad_probe()
329 IRQF_ONESHOT, "ske-keypad", keypad); in ske_keypad_probe()
331 dev_err(&pdev->dev, "allocate irq %d failed\n", keypad->irq); in ske_keypad_probe()
345 platform_set_drvdata(pdev, keypad); in ske_keypad_probe()
350 free_irq(keypad->irq, keypad); in ske_keypad_probe()
352 clk_disable_unprepare(keypad->clk); in ske_keypad_probe()
354 clk_disable_unprepare(keypad->pclk); in ske_keypad_probe()
356 clk_put(keypad->clk); in ske_keypad_probe()
358 clk_put(keypad->pclk); in ske_keypad_probe()
360 iounmap(keypad->reg_base); in ske_keypad_probe()
365 kfree(keypad); in ske_keypad_probe()
371 struct ske_keypad *keypad = platform_get_drvdata(pdev); in ske_keypad_remove() local
374 free_irq(keypad->irq, keypad); in ske_keypad_remove()
376 input_unregister_device(keypad->input); in ske_keypad_remove()
378 clk_disable_unprepare(keypad->clk); in ske_keypad_remove()
379 clk_put(keypad->clk); in ske_keypad_remove()
381 if (keypad->board->exit) in ske_keypad_remove()
382 keypad->board->exit(); in ske_keypad_remove()
384 iounmap(keypad->reg_base); in ske_keypad_remove()
386 kfree(keypad); in ske_keypad_remove()
395 struct ske_keypad *keypad = platform_get_drvdata(pdev); in ske_keypad_suspend() local
401 ske_keypad_set_bits(keypad, SKE_IMSC, ~SKE_KPIMA, 0x0); in ske_keypad_suspend()
409 struct ske_keypad *keypad = platform_get_drvdata(pdev); in ske_keypad_resume() local
415 ske_keypad_set_bits(keypad, SKE_IMSC, 0x0, SKE_KPIMA); in ske_keypad_resume()
426 .name = "nmk-ske-keypad",
436 MODULE_DESCRIPTION("Nomadik Scroll-Key-Encoder Keypad Driver");
437 MODULE_ALIAS("platform:nomadik-ske-keypad");