Lines Matching refs:keypad
82 static void imx_keypad_scan_matrix(struct imx_keypad *keypad, in imx_keypad_scan_matrix() argument
89 if ((keypad->cols_en_mask & (1 << col)) == 0) in imx_keypad_scan_matrix()
97 reg_val = readw(keypad->mmio_base + KPDR); in imx_keypad_scan_matrix()
99 writew(reg_val, keypad->mmio_base + KPDR); in imx_keypad_scan_matrix()
101 reg_val = readw(keypad->mmio_base + KPCR); in imx_keypad_scan_matrix()
102 reg_val &= ~((keypad->cols_en_mask & 0xff) << 8); in imx_keypad_scan_matrix()
103 writew(reg_val, keypad->mmio_base + KPCR); in imx_keypad_scan_matrix()
107 reg_val = readw(keypad->mmio_base + KPCR); in imx_keypad_scan_matrix()
108 reg_val |= (keypad->cols_en_mask & 0xff) << 8; in imx_keypad_scan_matrix()
109 writew(reg_val, keypad->mmio_base + KPCR); in imx_keypad_scan_matrix()
116 reg_val = readw(keypad->mmio_base + KPDR); in imx_keypad_scan_matrix()
118 writew(reg_val, keypad->mmio_base + KPDR); in imx_keypad_scan_matrix()
130 reg_val = readw(keypad->mmio_base + KPDR); in imx_keypad_scan_matrix()
131 matrix_volatile_state[col] = (~reg_val) & keypad->rows_en_mask; in imx_keypad_scan_matrix()
138 reg_val = readw(keypad->mmio_base + KPDR); in imx_keypad_scan_matrix()
140 writew(reg_val, keypad->mmio_base + KPDR); in imx_keypad_scan_matrix()
147 static void imx_keypad_fire_events(struct imx_keypad *keypad, in imx_keypad_fire_events() argument
150 struct input_dev *input_dev = keypad->input_dev; in imx_keypad_fire_events()
157 if ((keypad->cols_en_mask & (1 << col)) == 0) in imx_keypad_fire_events()
160 bits_changed = keypad->matrix_stable_state[col] ^ in imx_keypad_fire_events()
167 if ((keypad->rows_en_mask & (1 << row)) == 0) in imx_keypad_fire_events()
174 input_report_key(input_dev, keypad->keycodes[code], in imx_keypad_fire_events()
177 keypad->keycodes[code], in imx_keypad_fire_events()
189 struct imx_keypad *keypad = (struct imx_keypad *) data; in imx_keypad_check_for_events() local
197 imx_keypad_scan_matrix(keypad, matrix_volatile_state); in imx_keypad_check_for_events()
201 if ((keypad->cols_en_mask & (1 << i)) == 0) in imx_keypad_check_for_events()
204 if (keypad->matrix_unstable_state[i] ^ matrix_volatile_state[i]) { in imx_keypad_check_for_events()
218 memcpy(keypad->matrix_unstable_state, matrix_volatile_state, in imx_keypad_check_for_events()
220 keypad->stable_count = 0; in imx_keypad_check_for_events()
222 keypad->stable_count++; in imx_keypad_check_for_events()
228 if (keypad->stable_count < IMX_KEYPAD_SCANS_FOR_STABILITY) { in imx_keypad_check_for_events()
229 mod_timer(&keypad->check_matrix_timer, in imx_keypad_check_for_events()
240 if (keypad->stable_count == IMX_KEYPAD_SCANS_FOR_STABILITY) { in imx_keypad_check_for_events()
241 imx_keypad_fire_events(keypad, matrix_volatile_state); in imx_keypad_check_for_events()
243 memcpy(keypad->matrix_stable_state, matrix_volatile_state, in imx_keypad_check_for_events()
262 reg_val = readw(keypad->mmio_base + KPSR); in imx_keypad_check_for_events()
264 writew(reg_val, keypad->mmio_base + KPSR); in imx_keypad_check_for_events()
266 reg_val = readw(keypad->mmio_base + KPSR); in imx_keypad_check_for_events()
269 writew(reg_val, keypad->mmio_base + KPSR); in imx_keypad_check_for_events()
277 mod_timer(&keypad->check_matrix_timer, in imx_keypad_check_for_events()
280 reg_val = readw(keypad->mmio_base + KPSR); in imx_keypad_check_for_events()
282 writew(reg_val, keypad->mmio_base + KPSR); in imx_keypad_check_for_events()
284 reg_val = readw(keypad->mmio_base + KPSR); in imx_keypad_check_for_events()
287 writew(reg_val, keypad->mmio_base + KPSR); in imx_keypad_check_for_events()
293 struct imx_keypad *keypad = dev_id; in imx_keypad_irq_handler() local
296 reg_val = readw(keypad->mmio_base + KPSR); in imx_keypad_irq_handler()
302 writew(reg_val, keypad->mmio_base + KPSR); in imx_keypad_irq_handler()
304 if (keypad->enabled) { in imx_keypad_irq_handler()
306 keypad->stable_count = 0; in imx_keypad_irq_handler()
309 mod_timer(&keypad->check_matrix_timer, in imx_keypad_irq_handler()
316 static void imx_keypad_config(struct imx_keypad *keypad) in imx_keypad_config() argument
324 reg_val = readw(keypad->mmio_base + KPCR); in imx_keypad_config()
325 reg_val |= keypad->rows_en_mask & 0xff; /* rows */ in imx_keypad_config()
326 reg_val |= (keypad->cols_en_mask & 0xff) << 8; /* cols */ in imx_keypad_config()
327 writew(reg_val, keypad->mmio_base + KPCR); in imx_keypad_config()
330 reg_val = readw(keypad->mmio_base + KPDR); in imx_keypad_config()
332 writew(reg_val, keypad->mmio_base + KPDR); in imx_keypad_config()
335 writew(0xff00, keypad->mmio_base + KDDR); in imx_keypad_config()
341 reg_val = readw(keypad->mmio_base + KPSR); in imx_keypad_config()
344 writew(reg_val, keypad->mmio_base + KPSR); in imx_keypad_config()
349 writew(reg_val, keypad->mmio_base + KPSR); in imx_keypad_config()
352 static void imx_keypad_inhibit(struct imx_keypad *keypad) in imx_keypad_inhibit() argument
357 reg_val = readw(keypad->mmio_base + KPSR); in imx_keypad_inhibit()
360 writew(reg_val, keypad->mmio_base + KPSR); in imx_keypad_inhibit()
363 reg_val = (keypad->cols_en_mask & 0xff) << 8; in imx_keypad_inhibit()
364 writew(reg_val, keypad->mmio_base + KPCR); in imx_keypad_inhibit()
369 struct imx_keypad *keypad = input_get_drvdata(dev); in imx_keypad_close() local
374 keypad->enabled = false; in imx_keypad_close()
375 synchronize_irq(keypad->irq); in imx_keypad_close()
376 del_timer_sync(&keypad->check_matrix_timer); in imx_keypad_close()
378 imx_keypad_inhibit(keypad); in imx_keypad_close()
381 clk_disable_unprepare(keypad->clk); in imx_keypad_close()
386 struct imx_keypad *keypad = input_get_drvdata(dev); in imx_keypad_open() local
392 error = clk_prepare_enable(keypad->clk); in imx_keypad_open()
397 keypad->enabled = true; in imx_keypad_open()
399 imx_keypad_config(keypad); in imx_keypad_open()
402 if ((readw(keypad->mmio_base + KPDR) & keypad->rows_en_mask) == 0) { in imx_keypad_open()
427 struct imx_keypad *keypad; in imx_keypad_probe() local
449 keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad), GFP_KERNEL); in imx_keypad_probe()
450 if (!keypad) { in imx_keypad_probe()
455 keypad->input_dev = input_dev; in imx_keypad_probe()
456 keypad->irq = irq; in imx_keypad_probe()
457 keypad->stable_count = 0; in imx_keypad_probe()
459 setup_timer(&keypad->check_matrix_timer, in imx_keypad_probe()
460 imx_keypad_check_for_events, (unsigned long) keypad); in imx_keypad_probe()
463 keypad->mmio_base = devm_ioremap_resource(&pdev->dev, res); in imx_keypad_probe()
464 if (IS_ERR(keypad->mmio_base)) in imx_keypad_probe()
465 return PTR_ERR(keypad->mmio_base); in imx_keypad_probe()
467 keypad->clk = devm_clk_get(&pdev->dev, NULL); in imx_keypad_probe()
468 if (IS_ERR(keypad->clk)) { in imx_keypad_probe()
470 return PTR_ERR(keypad->clk); in imx_keypad_probe()
483 keypad->keycodes, input_dev); in imx_keypad_probe()
493 if (keypad->keycodes[i] != KEY_RESERVED) { in imx_keypad_probe()
494 keypad->rows_en_mask |= 1 << row; in imx_keypad_probe()
495 keypad->cols_en_mask |= 1 << col; in imx_keypad_probe()
499 dev_dbg(&pdev->dev, "enabled rows mask: %x\n", keypad->rows_en_mask); in imx_keypad_probe()
500 dev_dbg(&pdev->dev, "enabled cols mask: %x\n", keypad->cols_en_mask); in imx_keypad_probe()
504 input_set_drvdata(input_dev, keypad); in imx_keypad_probe()
507 error = 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()