Lines Matching refs:keypad
29 #include <linux/platform_data/keypad-pxa27x.h>
90 #define keypad_readl(off) __raw_readl(keypad->mmio_base + (off))
91 #define keypad_writel(off, v) __raw_writel((v), keypad->mmio_base + (off))
118 static int pxa27x_keypad_matrix_key_parse_dt(struct pxa27x_keypad *keypad,
121 struct input_dev *input_dev = keypad->input_dev;
141 keypad->keycodes, input_dev);
148 static int pxa27x_keypad_direct_key_parse_dt(struct pxa27x_keypad *keypad,
151 struct input_dev *input_dev = keypad->input_dev;
178 * default value. Default value is set when configure the keypad.
201 keypad->keycodes[MAX_MATRIX_KEY_NUM + i] = code;
208 static int pxa27x_keypad_rotary_parse_dt(struct pxa27x_keypad *keypad,
217 struct input_dev *input_dev = keypad->input_dev;
239 * If the prop is not set, it means keypad does not need
257 keypad->keycodes[n] = keycode;
261 keypad->keycodes[n + 1] = keycode;
275 keypad->rotary_rel_code[0] = pdata->rotary0_rel_code;
276 keypad->rotary_rel_code[1] = pdata->rotary1_rel_code;
281 static int pxa27x_keypad_build_keycode_from_dt(struct pxa27x_keypad *keypad)
283 struct input_dev *input_dev = keypad->input_dev;
295 error = pxa27x_keypad_matrix_key_parse_dt(keypad, pdata);
301 error = pxa27x_keypad_direct_key_parse_dt(keypad, pdata);
307 error = pxa27x_keypad_rotary_parse_dt(keypad, pdata);
324 input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes);
326 keypad->pdata = pdata;
332 static int pxa27x_keypad_build_keycode_from_dt(struct pxa27x_keypad *keypad)
334 dev_info(keypad->input_dev->dev.parent, "missing platform data\n");
341 static int pxa27x_keypad_build_keycode(struct pxa27x_keypad *keypad)
343 const struct pxa27x_keypad_platform_data *pdata = keypad->pdata;
344 struct input_dev *input_dev = keypad->input_dev;
352 keypad->keycodes, input_dev);
360 input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes);
365 keypad->keycodes[MAX_MATRIX_KEY_NUM + i] = keycode;
372 keypad->keycodes[MAX_MATRIX_KEY_NUM + 0] = keycode;
376 keypad->keycodes[MAX_MATRIX_KEY_NUM + 1] = keycode;
379 keypad->rotary_rel_code[0] = -1;
381 keypad->rotary_rel_code[0] = pdata->rotary0_rel_code;
389 keypad->keycodes[MAX_MATRIX_KEY_NUM + 2] = keycode;
393 keypad->keycodes[MAX_MATRIX_KEY_NUM + 3] = keycode;
396 keypad->rotary_rel_code[1] = -1;
398 keypad->rotary_rel_code[1] = pdata->rotary1_rel_code;
408 static void pxa27x_keypad_scan_matrix(struct pxa27x_keypad *keypad)
410 const struct pxa27x_keypad_platform_data *pdata = keypad->pdata;
411 struct input_dev *input_dev = keypad->input_dev;
456 bits_changed = keypad->matrix_key_state[col] ^ new_state[col];
464 code = MATRIX_SCAN_CODE(row, col, keypad->row_shift);
467 input_report_key(input_dev, keypad->keycodes[code],
472 memcpy(keypad->matrix_key_state, new_state, sizeof(new_state));
487 static void report_rotary_event(struct pxa27x_keypad *keypad, int r, int delta)
489 struct input_dev *dev = keypad->input_dev;
494 if (keypad->rotary_rel_code[r] == -1) {
496 unsigned char keycode = keypad->keycodes[code];
506 input_report_rel(dev, keypad->rotary_rel_code[r], delta);
511 static void pxa27x_keypad_scan_rotary(struct pxa27x_keypad *keypad)
513 const struct pxa27x_keypad_platform_data *pdata = keypad->pdata;
521 report_rotary_event(keypad, 0, rotary_delta(kprec));
524 report_rotary_event(keypad, 1, rotary_delta(kprec >> 16));
527 static void pxa27x_keypad_scan_direct(struct pxa27x_keypad *keypad)
529 const struct pxa27x_keypad_platform_data *pdata = keypad->pdata;
530 struct input_dev *input_dev = keypad->input_dev;
538 pxa27x_keypad_scan_rotary(keypad);
545 new_state = ~KPDK_DK(kpdk) & keypad->direct_key_mask;
547 new_state = KPDK_DK(kpdk) & keypad->direct_key_mask;
549 bits_changed = keypad->direct_key_state ^ new_state;
559 input_report_key(input_dev, keypad->keycodes[code],
564 keypad->direct_key_state = new_state;
567 static void clear_wakeup_event(struct pxa27x_keypad *keypad)
569 const struct pxa27x_keypad_platform_data *pdata = keypad->pdata;
577 struct pxa27x_keypad *keypad = dev_id;
580 clear_wakeup_event(keypad);
583 pxa27x_keypad_scan_direct(keypad);
586 pxa27x_keypad_scan_matrix(keypad);
591 static void pxa27x_keypad_config(struct pxa27x_keypad *keypad)
593 const struct pxa27x_keypad_platform_data *pdata = keypad->pdata;
628 keypad->direct_key_mask = pdata->direct_key_mask;
630 keypad->direct_key_mask = ((1 << direct_key_num) - 1) & ~mask;
643 struct pxa27x_keypad *keypad = input_get_drvdata(dev);
646 ret = clk_prepare_enable(keypad->clk);
650 pxa27x_keypad_config(keypad);
657 struct pxa27x_keypad *keypad = input_get_drvdata(dev);
660 clk_disable_unprepare(keypad->clk);
666 struct pxa27x_keypad *keypad = platform_get_drvdata(pdev);
669 * If the keypad is used a wake up source, clock can not be disabled.
673 enable_irq_wake(keypad->irq);
675 clk_disable_unprepare(keypad->clk);
683 struct pxa27x_keypad *keypad = platform_get_drvdata(pdev);
684 struct input_dev *input_dev = keypad->input_dev;
688 * If the keypad is used as wake up source, the clock is not turned
692 disable_irq_wake(keypad->irq);
698 ret = clk_prepare_enable(keypad->clk);
700 pxa27x_keypad_config(keypad);
718 struct pxa27x_keypad *keypad;
730 keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad),
732 if (!keypad)
739 keypad->pdata = pdata;
740 keypad->input_dev = input_dev;
741 keypad->irq = irq;
743 keypad->mmio_base = devm_platform_ioremap_resource(pdev, 0);
744 if (IS_ERR(keypad->mmio_base))
745 return PTR_ERR(keypad->mmio_base);
747 keypad->clk = devm_clk_get(&pdev->dev, NULL);
748 if (IS_ERR(keypad->clk)) {
749 dev_err(&pdev->dev, "failed to get keypad clock\n");
750 return PTR_ERR(keypad->clk);
759 input_dev->keycode = keypad->keycodes;
760 input_dev->keycodesize = sizeof(keypad->keycodes[0]);
761 input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes);
763 input_set_drvdata(input_dev, keypad);
769 error = pxa27x_keypad_build_keycode(keypad);
771 error = pxa27x_keypad_build_keycode_from_dt(keypad);
777 pdata = keypad->pdata;
784 keypad->row_shift = get_count_order(pdata->matrix_key_cols);
786 if ((pdata->enable_rotary0 && keypad->rotary_rel_code[0] != -1) ||
787 (pdata->enable_rotary1 && keypad->rotary_rel_code[1] != -1)) {
792 0, pdev->name, keypad);
805 platform_set_drvdata(pdev, keypad);
813 { .compatible = "marvell,pxa27x-keypad" },
822 .name = "pxa27x-keypad",
832 MODULE_ALIAS("platform:pxa27x-keypad");