Lines Matching refs:keypad

84 static void imx_keypad_scan_matrix(struct imx_keypad *keypad,  in imx_keypad_scan_matrix()  argument
91 if ((keypad->cols_en_mask & (1 << col)) == 0) in imx_keypad_scan_matrix()
99 reg_val = readw(keypad->mmio_base + KPDR); in imx_keypad_scan_matrix()
101 writew(reg_val, keypad->mmio_base + KPDR); in imx_keypad_scan_matrix()
103 reg_val = readw(keypad->mmio_base + KPCR); in imx_keypad_scan_matrix()
104 reg_val &= ~((keypad->cols_en_mask & 0xff) << 8); in imx_keypad_scan_matrix()
105 writew(reg_val, keypad->mmio_base + KPCR); in imx_keypad_scan_matrix()
109 reg_val = readw(keypad->mmio_base + KPCR); in imx_keypad_scan_matrix()
110 reg_val |= (keypad->cols_en_mask & 0xff) << 8; in imx_keypad_scan_matrix()
111 writew(reg_val, keypad->mmio_base + KPCR); in imx_keypad_scan_matrix()
118 reg_val = readw(keypad->mmio_base + KPDR); in imx_keypad_scan_matrix()
120 writew(reg_val, keypad->mmio_base + KPDR); in imx_keypad_scan_matrix()
132 reg_val = readw(keypad->mmio_base + KPDR); in imx_keypad_scan_matrix()
133 matrix_volatile_state[col] = (~reg_val) & keypad->rows_en_mask; in imx_keypad_scan_matrix()
140 reg_val = readw(keypad->mmio_base + KPDR); in imx_keypad_scan_matrix()
142 writew(reg_val, keypad->mmio_base + KPDR); in imx_keypad_scan_matrix()
149 static void imx_keypad_fire_events(struct imx_keypad *keypad, in imx_keypad_fire_events() argument
152 struct input_dev *input_dev = keypad->input_dev; in imx_keypad_fire_events()
159 if ((keypad->cols_en_mask & (1 << col)) == 0) in imx_keypad_fire_events()
162 bits_changed = keypad->matrix_stable_state[col] ^ in imx_keypad_fire_events()
169 if ((keypad->rows_en_mask & (1 << row)) == 0) in imx_keypad_fire_events()
176 input_report_key(input_dev, keypad->keycodes[code], in imx_keypad_fire_events()
179 keypad->keycodes[code], in imx_keypad_fire_events()
191 struct imx_keypad *keypad = (struct imx_keypad *) data; in imx_keypad_check_for_events() local
199 imx_keypad_scan_matrix(keypad, matrix_volatile_state); in imx_keypad_check_for_events()
203 if ((keypad->cols_en_mask & (1 << i)) == 0) in imx_keypad_check_for_events()
206 if (keypad->matrix_unstable_state[i] ^ matrix_volatile_state[i]) { in imx_keypad_check_for_events()
220 memcpy(keypad->matrix_unstable_state, matrix_volatile_state, in imx_keypad_check_for_events()
222 keypad->stable_count = 0; in imx_keypad_check_for_events()
224 keypad->stable_count++; in imx_keypad_check_for_events()
230 if (keypad->stable_count < IMX_KEYPAD_SCANS_FOR_STABILITY) { in imx_keypad_check_for_events()
231 mod_timer(&keypad->check_matrix_timer, in imx_keypad_check_for_events()
242 if (keypad->stable_count == IMX_KEYPAD_SCANS_FOR_STABILITY) { in imx_keypad_check_for_events()
243 imx_keypad_fire_events(keypad, matrix_volatile_state); in imx_keypad_check_for_events()
245 memcpy(keypad->matrix_stable_state, matrix_volatile_state, in imx_keypad_check_for_events()
264 reg_val = readw(keypad->mmio_base + KPSR); in imx_keypad_check_for_events()
266 writew(reg_val, keypad->mmio_base + KPSR); in imx_keypad_check_for_events()
268 reg_val = readw(keypad->mmio_base + KPSR); in imx_keypad_check_for_events()
271 writew(reg_val, keypad->mmio_base + KPSR); in imx_keypad_check_for_events()
279 mod_timer(&keypad->check_matrix_timer, in imx_keypad_check_for_events()
282 reg_val = readw(keypad->mmio_base + KPSR); in imx_keypad_check_for_events()
284 writew(reg_val, keypad->mmio_base + KPSR); in imx_keypad_check_for_events()
286 reg_val = readw(keypad->mmio_base + KPSR); in imx_keypad_check_for_events()
289 writew(reg_val, keypad->mmio_base + KPSR); in imx_keypad_check_for_events()
295 struct imx_keypad *keypad = dev_id; in imx_keypad_irq_handler() local
298 reg_val = readw(keypad->mmio_base + KPSR); in imx_keypad_irq_handler()
304 writew(reg_val, keypad->mmio_base + KPSR); in imx_keypad_irq_handler()
306 if (keypad->enabled) { in imx_keypad_irq_handler()
308 keypad->stable_count = 0; in imx_keypad_irq_handler()
311 mod_timer(&keypad->check_matrix_timer, in imx_keypad_irq_handler()
318 static void imx_keypad_config(struct imx_keypad *keypad) in imx_keypad_config() argument
326 reg_val = readw(keypad->mmio_base + KPCR); in imx_keypad_config()
327 reg_val |= keypad->rows_en_mask & 0xff; /* rows */ in imx_keypad_config()
328 reg_val |= (keypad->cols_en_mask & 0xff) << 8; /* cols */ in imx_keypad_config()
329 writew(reg_val, keypad->mmio_base + KPCR); in imx_keypad_config()
332 reg_val = readw(keypad->mmio_base + KPDR); in imx_keypad_config()
334 writew(reg_val, keypad->mmio_base + KPDR); in imx_keypad_config()
337 writew(0xff00, keypad->mmio_base + KDDR); in imx_keypad_config()
343 reg_val = readw(keypad->mmio_base + KPSR); in imx_keypad_config()
346 writew(reg_val, keypad->mmio_base + KPSR); in imx_keypad_config()
351 writew(reg_val, keypad->mmio_base + KPSR); in imx_keypad_config()
354 static void imx_keypad_inhibit(struct imx_keypad *keypad) in imx_keypad_inhibit() argument
359 reg_val = readw(keypad->mmio_base + KPSR); in imx_keypad_inhibit()
362 writew(reg_val, keypad->mmio_base + KPSR); in imx_keypad_inhibit()
365 reg_val = (keypad->cols_en_mask & 0xff) << 8; in imx_keypad_inhibit()
366 writew(reg_val, keypad->mmio_base + KPCR); in imx_keypad_inhibit()
371 struct imx_keypad *keypad = input_get_drvdata(dev); in imx_keypad_close() local
376 keypad->enabled = false; in imx_keypad_close()
377 synchronize_irq(keypad->irq); in imx_keypad_close()
378 del_timer_sync(&keypad->check_matrix_timer); in imx_keypad_close()
380 imx_keypad_inhibit(keypad); in imx_keypad_close()
383 clk_disable_unprepare(keypad->clk); in imx_keypad_close()
388 struct imx_keypad *keypad = input_get_drvdata(dev); in imx_keypad_open() local
394 error = clk_prepare_enable(keypad->clk); in imx_keypad_open()
399 keypad->enabled = true; in imx_keypad_open()
401 imx_keypad_config(keypad); in imx_keypad_open()
404 if ((readw(keypad->mmio_base + KPDR) & keypad->rows_en_mask) == 0) { in imx_keypad_open()
429 struct imx_keypad *keypad; in imx_keypad_probe() local
451 keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad), GFP_KERNEL); in imx_keypad_probe()
452 if (!keypad) { in imx_keypad_probe()
457 keypad->input_dev = input_dev; in imx_keypad_probe()
458 keypad->irq = irq; in imx_keypad_probe()
459 keypad->stable_count = 0; in imx_keypad_probe()
461 setup_timer(&keypad->check_matrix_timer, in imx_keypad_probe()
462 imx_keypad_check_for_events, (unsigned long) keypad); in imx_keypad_probe()
465 keypad->mmio_base = devm_ioremap_resource(&pdev->dev, res); in imx_keypad_probe()
466 if (IS_ERR(keypad->mmio_base)) in imx_keypad_probe()
467 return PTR_ERR(keypad->mmio_base); in imx_keypad_probe()
469 keypad->clk = devm_clk_get(&pdev->dev, NULL); in imx_keypad_probe()
470 if (IS_ERR(keypad->clk)) { in imx_keypad_probe()
472 return PTR_ERR(keypad->clk); in imx_keypad_probe()
485 keypad->keycodes, input_dev); in imx_keypad_probe()
495 if (keypad->keycodes[i] != KEY_RESERVED) { in imx_keypad_probe()
496 keypad->rows_en_mask |= 1 << row; in imx_keypad_probe()
497 keypad->cols_en_mask |= 1 << col; in imx_keypad_probe()
501 dev_dbg(&pdev->dev, "enabled rows mask: %x\n", keypad->rows_en_mask); in imx_keypad_probe()
502 dev_dbg(&pdev->dev, "enabled cols mask: %x\n", keypad->cols_en_mask); in imx_keypad_probe()
506 input_set_drvdata(input_dev, keypad); in imx_keypad_probe()
509 clk_prepare_enable(keypad->clk); in imx_keypad_probe()
510 imx_keypad_inhibit(keypad); in imx_keypad_probe()
511 clk_disable_unprepare(keypad->clk); in imx_keypad_probe()
514 pdev->name, keypad); in imx_keypad_probe()
527 platform_set_drvdata(pdev, keypad); in imx_keypad_probe()