• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/input/keyboard/

Lines Matching refs:keypad

2  * Driver for the IMX keypad port.
84 static void imx_keypad_scan_matrix(struct imx_keypad *keypad,
91 if ((keypad->cols_en_mask & (1 << col)) == 0)
94 * Discharge keypad capacitance:
99 reg_val = readw(keypad->mmio_base + KPDR);
101 writew(reg_val, keypad->mmio_base + KPDR);
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);
109 reg_val = readw(keypad->mmio_base + KPCR);
110 reg_val |= (keypad->cols_en_mask & 0xff) << 8;
111 writew(reg_val, keypad->mmio_base + KPCR);
118 reg_val = readw(keypad->mmio_base + KPDR);
120 writew(reg_val, keypad->mmio_base + KPDR);
132 reg_val = readw(keypad->mmio_base + KPDR);
133 matrix_volatile_state[col] = (~reg_val) & keypad->rows_en_mask;
140 reg_val = readw(keypad->mmio_base + KPDR);
142 writew(reg_val, keypad->mmio_base + KPDR);
147 * keypad->matrix_stable_state and fire events if changes are detected.
149 static void imx_keypad_fire_events(struct imx_keypad *keypad,
152 struct input_dev *input_dev = keypad->input_dev;
159 if ((keypad->cols_en_mask & (1 << col)) == 0)
162 bits_changed = keypad->matrix_stable_state[col] ^
169 if ((keypad->rows_en_mask & (1 << row)) == 0)
176 input_report_key(input_dev, keypad->keycodes[code],
179 keypad->keycodes[code],
191 struct imx_keypad *keypad = (struct imx_keypad *) data;
199 imx_keypad_scan_matrix(keypad, matrix_volatile_state);
203 if ((keypad->cols_en_mask & (1 << i)) == 0)
206 if (keypad->matrix_unstable_state[i] ^ matrix_volatile_state[i]) {
215 * keypad->matrix_unstable_state.
220 memcpy(keypad->matrix_unstable_state, matrix_volatile_state,
222 keypad->stable_count = 0;
224 keypad->stable_count++;
230 if (keypad->stable_count < IMX_KEYPAD_SCANS_FOR_STABILITY) {
231 mod_timer(&keypad->check_matrix_timer,
239 * (keypad->stable_count > IMX_KEYPAD_SCANS_FOR_STABILITY) all
242 if (keypad->stable_count == IMX_KEYPAD_SCANS_FOR_STABILITY) {
243 imx_keypad_fire_events(keypad, matrix_volatile_state);
245 memcpy(keypad->matrix_stable_state, matrix_volatile_state,
264 reg_val = readw(keypad->mmio_base + KPSR);
266 writew(reg_val, keypad->mmio_base + KPSR);
268 reg_val = readw(keypad->mmio_base + KPSR);
271 writew(reg_val, keypad->mmio_base + KPSR);
279 mod_timer(&keypad->check_matrix_timer,
282 reg_val = readw(keypad->mmio_base + KPSR);
284 writew(reg_val, keypad->mmio_base + KPSR);
286 reg_val = readw(keypad->mmio_base + KPSR);
289 writew(reg_val, keypad->mmio_base + KPSR);
295 struct imx_keypad *keypad = dev_id;
298 reg_val = readw(keypad->mmio_base + KPSR);
304 writew(reg_val, keypad->mmio_base + KPSR);
306 if (keypad->enabled) {
308 keypad->stable_count = 0;
311 mod_timer(&keypad->check_matrix_timer,
318 static void imx_keypad_config(struct imx_keypad *keypad)
324 * Configure keypad columns as open-drain (KPCR[15:8])
326 reg_val = readw(keypad->mmio_base + KPCR);
327 reg_val |= keypad->rows_en_mask & 0xff; /* rows */
328 reg_val |= (keypad->cols_en_mask & 0xff) << 8; /* cols */
329 writew(reg_val, keypad->mmio_base + KPCR);
332 reg_val = readw(keypad->mmio_base + KPDR);
334 writew(reg_val, keypad->mmio_base + KPDR);
337 writew(0xff00, keypad->mmio_base + KDDR);
343 reg_val = readw(keypad->mmio_base + KPSR);
346 writew(reg_val, keypad->mmio_base + KPSR);
351 writew(reg_val, keypad->mmio_base + KPSR);
354 static void imx_keypad_inhibit(struct imx_keypad *keypad)
359 reg_val = readw(keypad->mmio_base + KPSR);
361 writew(reg_val, keypad->mmio_base + KPSR);
364 writew(0xff00, keypad->mmio_base + KPCR);
369 struct imx_keypad *keypad = input_get_drvdata(dev);
373 /* Mark keypad as being inactive */
374 keypad->enabled = false;
375 synchronize_irq(keypad->irq);
376 del_timer_sync(&keypad->check_matrix_timer);
378 imx_keypad_inhibit(keypad);
381 clk_disable(keypad->clk);
386 struct imx_keypad *keypad = input_get_drvdata(dev);
391 keypad->enabled = true;
394 clk_enable(keypad->clk);
395 imx_keypad_config(keypad);
398 if ((readw(keypad->mmio_base + KPDR) & keypad->rows_en_mask) == 0) {
414 struct imx_keypad *keypad;
449 keypad = kzalloc(sizeof(struct imx_keypad), GFP_KERNEL);
450 if (!keypad) {
456 keypad->input_dev = input_dev;
457 keypad->irq = irq;
458 keypad->stable_count = 0;
460 setup_timer(&keypad->check_matrix_timer,
461 imx_keypad_check_for_events, (unsigned long) keypad);
463 keypad->mmio_base = ioremap(res->start, resource_size(res));
464 if (keypad->mmio_base == NULL) {
470 keypad->clk = clk_get(&pdev->dev, "kpp");
471 if (IS_ERR(keypad->clk)) {
472 dev_err(&pdev->dev, "failed to get keypad clock\n");
473 error = PTR_ERR(keypad->clk);
479 keypad->rows_en_mask |= 1 << KEY_ROW(keymap_data->keymap[i]);
480 keypad->cols_en_mask |= 1 << KEY_COL(keymap_data->keymap[i]);
483 if (keypad->rows_en_mask > ((1 << MAX_MATRIX_KEY_ROWS) - 1) ||
484 keypad->cols_en_mask > ((1 << MAX_MATRIX_KEY_COLS) - 1)) {
490 dev_dbg(&pdev->dev, "enabled rows mask: %x\n", keypad->rows_en_mask);
491 dev_dbg(&pdev->dev, "enabled cols mask: %x\n", keypad->cols_en_mask);
500 input_dev->keycode = keypad->keycodes;
501 input_dev->keycodesize = sizeof(keypad->keycodes[0]);
502 input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes);
505 keypad->keycodes, input_dev->keybit);
508 input_set_drvdata(input_dev, keypad);
510 /* Ensure that the keypad will stay dormant until opened */
511 imx_keypad_inhibit(keypad);
514 pdev->name, keypad);
527 platform_set_drvdata(pdev, keypad);
535 clk_put(keypad->clk);
537 iounmap(keypad->mmio_base);
539 kfree(keypad);
549 struct imx_keypad *keypad = platform_get_drvdata(pdev);
556 input_unregister_device(keypad->input_dev);
558 free_irq(keypad->irq, keypad);
559 clk_put(keypad->clk);
561 iounmap(keypad->mmio_base);
565 kfree(keypad);
572 .name = "imx-keypad",
595 MODULE_ALIAS("platform:imx-keypad");