Lines Matching refs:keypad

3 // Driver for the IMX keypad port.
78 static void imx_keypad_scan_matrix(struct imx_keypad *keypad,
85 if ((keypad->cols_en_mask & (1 << col)) == 0)
88 * Discharge keypad capacitance:
93 reg_val = readw(keypad->mmio_base + KPDR);
95 writew(reg_val, keypad->mmio_base + KPDR);
97 reg_val = readw(keypad->mmio_base + KPCR);
98 reg_val &= ~((keypad->cols_en_mask & 0xff) << 8);
99 writew(reg_val, keypad->mmio_base + KPCR);
103 reg_val = readw(keypad->mmio_base + KPCR);
104 reg_val |= (keypad->cols_en_mask & 0xff) << 8;
105 writew(reg_val, keypad->mmio_base + KPCR);
112 reg_val = readw(keypad->mmio_base + KPDR);
114 writew(reg_val, keypad->mmio_base + KPDR);
126 reg_val = readw(keypad->mmio_base + KPDR);
127 matrix_volatile_state[col] = (~reg_val) & keypad->rows_en_mask;
134 reg_val = readw(keypad->mmio_base + KPDR);
136 writew(reg_val, keypad->mmio_base + KPDR);
141 * keypad->matrix_stable_state and fire events if changes are detected.
143 static void imx_keypad_fire_events(struct imx_keypad *keypad,
146 struct input_dev *input_dev = keypad->input_dev;
153 if ((keypad->cols_en_mask & (1 << col)) == 0)
156 bits_changed = keypad->matrix_stable_state[col] ^
163 if ((keypad->rows_en_mask & (1 << row)) == 0)
170 input_report_key(input_dev, keypad->keycodes[code],
173 keypad->keycodes[code],
185 struct imx_keypad *keypad = from_timer(keypad, t, check_matrix_timer);
193 imx_keypad_scan_matrix(keypad, matrix_volatile_state);
197 if ((keypad->cols_en_mask & (1 << i)) == 0)
200 if (keypad->matrix_unstable_state[i] ^ matrix_volatile_state[i]) {
209 * keypad->matrix_unstable_state.
214 memcpy(keypad->matrix_unstable_state, matrix_volatile_state,
216 keypad->stable_count = 0;
218 keypad->stable_count++;
224 if (keypad->stable_count < IMX_KEYPAD_SCANS_FOR_STABILITY) {
225 mod_timer(&keypad->check_matrix_timer,
233 * (keypad->stable_count > IMX_KEYPAD_SCANS_FOR_STABILITY) all
236 if (keypad->stable_count == IMX_KEYPAD_SCANS_FOR_STABILITY) {
237 imx_keypad_fire_events(keypad, matrix_volatile_state);
239 memcpy(keypad->matrix_stable_state, matrix_volatile_state,
258 reg_val = readw(keypad->mmio_base + KPSR);
260 writew(reg_val, keypad->mmio_base + KPSR);
262 reg_val = readw(keypad->mmio_base + KPSR);
265 writew(reg_val, keypad->mmio_base + KPSR);
273 mod_timer(&keypad->check_matrix_timer,
276 reg_val = readw(keypad->mmio_base + KPSR);
278 writew(reg_val, keypad->mmio_base + KPSR);
280 reg_val = readw(keypad->mmio_base + KPSR);
283 writew(reg_val, keypad->mmio_base + KPSR);
289 struct imx_keypad *keypad = dev_id;
292 reg_val = readw(keypad->mmio_base + KPSR);
298 writew(reg_val, keypad->mmio_base + KPSR);
300 if (keypad->enabled) {
302 keypad->stable_count = 0;
305 mod_timer(&keypad->check_matrix_timer,
312 static void imx_keypad_config(struct imx_keypad *keypad)
318 * Configure keypad columns as open-drain (KPCR[15:8])
320 reg_val = readw(keypad->mmio_base + KPCR);
321 reg_val |= keypad->rows_en_mask & 0xff; /* rows */
322 reg_val |= (keypad->cols_en_mask & 0xff) << 8; /* cols */
323 writew(reg_val, keypad->mmio_base + KPCR);
326 reg_val = readw(keypad->mmio_base + KPDR);
328 writew(reg_val, keypad->mmio_base + KPDR);
331 writew(0xff00, keypad->mmio_base + KDDR);
337 reg_val = readw(keypad->mmio_base + KPSR);
340 writew(reg_val, keypad->mmio_base + KPSR);
345 writew(reg_val, keypad->mmio_base + KPSR);
348 static void imx_keypad_inhibit(struct imx_keypad *keypad)
353 reg_val = readw(keypad->mmio_base + KPSR);
356 writew(reg_val, keypad->mmio_base + KPSR);
359 reg_val = (keypad->cols_en_mask & 0xff) << 8;
360 writew(reg_val, keypad->mmio_base + KPCR);
365 struct imx_keypad *keypad = input_get_drvdata(dev);
369 /* Mark keypad as being inactive */
370 keypad->enabled = false;
371 synchronize_irq(keypad->irq);
372 del_timer_sync(&keypad->check_matrix_timer);
374 imx_keypad_inhibit(keypad);
377 clk_disable_unprepare(keypad->clk);
382 struct imx_keypad *keypad = input_get_drvdata(dev);
388 error = clk_prepare_enable(keypad->clk);
393 keypad->enabled = true;
395 imx_keypad_config(keypad);
398 if ((readw(keypad->mmio_base + KPDR) & keypad->rows_en_mask) == 0) {
423 struct imx_keypad *keypad;
442 keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad), GFP_KERNEL);
443 if (!keypad) {
448 keypad->input_dev = input_dev;
449 keypad->irq = irq;
450 keypad->stable_count = 0;
452 timer_setup(&keypad->check_matrix_timer,
455 keypad->mmio_base = devm_platform_ioremap_resource(pdev, 0);
456 if (IS_ERR(keypad->mmio_base))
457 return PTR_ERR(keypad->mmio_base);
459 keypad->clk = devm_clk_get(&pdev->dev, NULL);
460 if (IS_ERR(keypad->clk)) {
461 dev_err(&pdev->dev, "failed to get keypad clock\n");
462 return PTR_ERR(keypad->clk);
475 keypad->keycodes, input_dev);
485 if (keypad->keycodes[i] != KEY_RESERVED) {
486 keypad->rows_en_mask |= 1 << row;
487 keypad->cols_en_mask |= 1 << col;
491 dev_dbg(&pdev->dev, "enabled rows mask: %x\n", keypad->rows_en_mask);
492 dev_dbg(&pdev->dev, "enabled cols mask: %x\n", keypad->cols_en_mask);
496 input_set_drvdata(input_dev, keypad);
498 /* Ensure that the keypad will stay dormant until opened */
499 error = clk_prepare_enable(keypad->clk);
502 imx_keypad_inhibit(keypad);
503 clk_disable_unprepare(keypad->clk);
506 pdev->name, keypad);
519 platform_set_drvdata(pdev, keypad);
583 .name = "imx-keypad",
594 MODULE_ALIAS("platform:imx-keypad");