Lines Matching refs:keypad

3 // Driver for the IMX keypad port.
79 static void imx_keypad_scan_matrix(struct imx_keypad *keypad,
86 if ((keypad->cols_en_mask & (1 << col)) == 0)
89 * Discharge keypad capacitance:
94 reg_val = readw(keypad->mmio_base + KPDR);
96 writew(reg_val, keypad->mmio_base + KPDR);
98 reg_val = readw(keypad->mmio_base + KPCR);
99 reg_val &= ~((keypad->cols_en_mask & 0xff) << 8);
100 writew(reg_val, keypad->mmio_base + KPCR);
104 reg_val = readw(keypad->mmio_base + KPCR);
105 reg_val |= (keypad->cols_en_mask & 0xff) << 8;
106 writew(reg_val, keypad->mmio_base + KPCR);
113 reg_val = readw(keypad->mmio_base + KPDR);
115 writew(reg_val, keypad->mmio_base + KPDR);
127 reg_val = readw(keypad->mmio_base + KPDR);
128 matrix_volatile_state[col] = (~reg_val) & keypad->rows_en_mask;
135 reg_val = readw(keypad->mmio_base + KPDR);
137 writew(reg_val, keypad->mmio_base + KPDR);
142 * keypad->matrix_stable_state and fire events if changes are detected.
144 static void imx_keypad_fire_events(struct imx_keypad *keypad,
147 struct input_dev *input_dev = keypad->input_dev;
154 if ((keypad->cols_en_mask & (1 << col)) == 0)
157 bits_changed = keypad->matrix_stable_state[col] ^
164 if ((keypad->rows_en_mask & (1 << row)) == 0)
171 input_report_key(input_dev, keypad->keycodes[code],
174 keypad->keycodes[code],
186 struct imx_keypad *keypad = from_timer(keypad, t, check_matrix_timer);
194 imx_keypad_scan_matrix(keypad, matrix_volatile_state);
198 if ((keypad->cols_en_mask & (1 << i)) == 0)
201 if (keypad->matrix_unstable_state[i] ^ matrix_volatile_state[i]) {
210 * keypad->matrix_unstable_state.
215 memcpy(keypad->matrix_unstable_state, matrix_volatile_state,
217 keypad->stable_count = 0;
219 keypad->stable_count++;
225 if (keypad->stable_count < IMX_KEYPAD_SCANS_FOR_STABILITY) {
226 mod_timer(&keypad->check_matrix_timer,
234 * (keypad->stable_count > IMX_KEYPAD_SCANS_FOR_STABILITY) all
237 if (keypad->stable_count == IMX_KEYPAD_SCANS_FOR_STABILITY) {
238 imx_keypad_fire_events(keypad, matrix_volatile_state);
240 memcpy(keypad->matrix_stable_state, matrix_volatile_state,
259 reg_val = readw(keypad->mmio_base + KPSR);
261 writew(reg_val, keypad->mmio_base + KPSR);
263 reg_val = readw(keypad->mmio_base + KPSR);
266 writew(reg_val, keypad->mmio_base + KPSR);
274 mod_timer(&keypad->check_matrix_timer,
277 reg_val = readw(keypad->mmio_base + KPSR);
279 writew(reg_val, keypad->mmio_base + KPSR);
281 reg_val = readw(keypad->mmio_base + KPSR);
284 writew(reg_val, keypad->mmio_base + KPSR);
290 struct imx_keypad *keypad = dev_id;
293 reg_val = readw(keypad->mmio_base + KPSR);
299 writew(reg_val, keypad->mmio_base + KPSR);
301 if (keypad->enabled) {
303 keypad->stable_count = 0;
306 mod_timer(&keypad->check_matrix_timer,
313 static void imx_keypad_config(struct imx_keypad *keypad)
319 * Configure keypad columns as open-drain (KPCR[15:8])
321 reg_val = readw(keypad->mmio_base + KPCR);
322 reg_val |= keypad->rows_en_mask & 0xff; /* rows */
323 reg_val |= (keypad->cols_en_mask & 0xff) << 8; /* cols */
324 writew(reg_val, keypad->mmio_base + KPCR);
327 reg_val = readw(keypad->mmio_base + KPDR);
329 writew(reg_val, keypad->mmio_base + KPDR);
332 writew(0xff00, keypad->mmio_base + KDDR);
338 reg_val = readw(keypad->mmio_base + KPSR);
341 writew(reg_val, keypad->mmio_base + KPSR);
346 writew(reg_val, keypad->mmio_base + KPSR);
349 static void imx_keypad_inhibit(struct imx_keypad *keypad)
354 reg_val = readw(keypad->mmio_base + KPSR);
357 writew(reg_val, keypad->mmio_base + KPSR);
360 reg_val = (keypad->cols_en_mask & 0xff) << 8;
361 writew(reg_val, keypad->mmio_base + KPCR);
366 struct imx_keypad *keypad = input_get_drvdata(dev);
370 /* Mark keypad as being inactive */
371 keypad->enabled = false;
372 synchronize_irq(keypad->irq);
373 del_timer_sync(&keypad->check_matrix_timer);
375 imx_keypad_inhibit(keypad);
378 clk_disable_unprepare(keypad->clk);
383 struct imx_keypad *keypad = input_get_drvdata(dev);
389 error = clk_prepare_enable(keypad->clk);
394 keypad->enabled = true;
396 imx_keypad_config(keypad);
399 if ((readw(keypad->mmio_base + KPDR) & keypad->rows_en_mask) == 0) {
420 struct imx_keypad *keypad;
434 keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad), GFP_KERNEL);
435 if (!keypad) {
440 keypad->input_dev = input_dev;
441 keypad->irq = irq;
442 keypad->stable_count = 0;
444 timer_setup(&keypad->check_matrix_timer,
447 keypad->mmio_base = devm_platform_ioremap_resource(pdev, 0);
448 if (IS_ERR(keypad->mmio_base))
449 return PTR_ERR(keypad->mmio_base);
451 keypad->clk = devm_clk_get(&pdev->dev, NULL);
452 if (IS_ERR(keypad->clk)) {
453 dev_err(&pdev->dev, "failed to get keypad clock\n");
454 return PTR_ERR(keypad->clk);
467 keypad->keycodes, input_dev);
477 if (keypad->keycodes[i] != KEY_RESERVED) {
478 keypad->rows_en_mask |= 1 << row;
479 keypad->cols_en_mask |= 1 << col;
483 dev_dbg(&pdev->dev, "enabled rows mask: %x\n", keypad->rows_en_mask);
484 dev_dbg(&pdev->dev, "enabled cols mask: %x\n", keypad->cols_en_mask);
488 input_set_drvdata(input_dev, keypad);
490 /* Ensure that the keypad will stay dormant until opened */
491 error = clk_prepare_enable(keypad->clk);
494 imx_keypad_inhibit(keypad);
495 clk_disable_unprepare(keypad->clk);
498 pdev->name, keypad);
511 platform_set_drvdata(pdev, keypad);
575 .name = "imx-keypad",
586 MODULE_ALIAS("platform:imx-keypad");