• Home
  • Raw
  • Download

Lines Matching +full:rotary +full:- +full:encoder

32 #include <linux/platform_data/keypad-pxa27x.h>
38 #define KPREC 0x0010 /* Keypad Rotary Encoder register */
42 /* Keypad Automatic Scan Multiple Key Presser register 0-3 */
50 #define KPC_MKRN(n) ((((n) - 1) & 0x7) << 26) /* matrix key row number */
51 #define KPC_MKCN(n) ((((n) - 1) & 0x7) << 23) /* matrix key column number */
52 #define KPC_DKN(n) ((((n) - 1) & 0x7) << 6) /* direct key number */
66 #define KPC_RE_ZERO_DEB (0x1 << 4) /* Rotary Encoder Zero Debounce */
67 #define KPC_REE1 (0x1 << 3) /* Rotary Encoder1 Enable */
68 #define KPC_REE0 (0x1 << 2) /* Rotary Encoder0 Enable */
93 #define keypad_readl(off) __raw_readl(keypad->mmio_base + (off))
94 #define keypad_writel(off, v) __raw_writel((v), keypad->mmio_base + (off))
124 struct input_dev *input_dev = keypad->input_dev; in pxa27x_keypad_matrix_key_parse_dt()
125 struct device *dev = input_dev->dev.parent; in pxa27x_keypad_matrix_key_parse_dt()
135 return -EINVAL; in pxa27x_keypad_matrix_key_parse_dt()
138 pdata->matrix_key_rows = rows; in pxa27x_keypad_matrix_key_parse_dt()
139 pdata->matrix_key_cols = cols; in pxa27x_keypad_matrix_key_parse_dt()
142 pdata->matrix_key_rows, in pxa27x_keypad_matrix_key_parse_dt()
143 pdata->matrix_key_cols, in pxa27x_keypad_matrix_key_parse_dt()
144 keypad->keycodes, input_dev); in pxa27x_keypad_matrix_key_parse_dt()
154 struct input_dev *input_dev = keypad->input_dev; in pxa27x_keypad_direct_key_parse_dt()
155 struct device *dev = input_dev->dev.parent; in pxa27x_keypad_direct_key_parse_dt()
156 struct device_node *np = dev->of_node; in pxa27x_keypad_direct_key_parse_dt()
163 error = of_property_read_u32(np, "marvell,direct-key-count", in pxa27x_keypad_direct_key_parse_dt()
164 &pdata->direct_key_num); in pxa27x_keypad_direct_key_parse_dt()
167 * If do not have marvel,direct-key-count defined, in pxa27x_keypad_direct_key_parse_dt()
170 return error == -EINVAL ? 0 : error; in pxa27x_keypad_direct_key_parse_dt()
173 error = of_property_read_u32(np, "marvell,direct-key-mask", in pxa27x_keypad_direct_key_parse_dt()
174 &pdata->direct_key_mask); in pxa27x_keypad_direct_key_parse_dt()
176 if (error != -EINVAL) in pxa27x_keypad_direct_key_parse_dt()
180 * If marvell,direct-key-mask is not defined, driver will use in pxa27x_keypad_direct_key_parse_dt()
183 pdata->direct_key_mask = 0; in pxa27x_keypad_direct_key_parse_dt()
186 pdata->direct_key_low_active = of_property_read_bool(np, in pxa27x_keypad_direct_key_parse_dt()
187 "marvell,direct-key-low-active"); in pxa27x_keypad_direct_key_parse_dt()
189 prop = of_get_property(np, "marvell,direct-key-map", &proplen); in pxa27x_keypad_direct_key_parse_dt()
191 return -EINVAL; in pxa27x_keypad_direct_key_parse_dt()
194 return -EINVAL; in pxa27x_keypad_direct_key_parse_dt()
200 return -EINVAL; in pxa27x_keypad_direct_key_parse_dt()
204 keypad->keycodes[MAX_MATRIX_KEY_NUM + i] = code; in pxa27x_keypad_direct_key_parse_dt()
205 __set_bit(code, input_dev->keybit); in pxa27x_keypad_direct_key_parse_dt()
219 const char relkeyname[] = {"marvell,rotary-rel-key"}; in pxa27x_keypad_rotary_parse_dt()
220 struct input_dev *input_dev = keypad->input_dev; in pxa27x_keypad_rotary_parse_dt()
221 struct device *dev = input_dev->dev.parent; in pxa27x_keypad_rotary_parse_dt()
222 struct device_node *np = dev->of_node; in pxa27x_keypad_rotary_parse_dt()
225 /* if can read correct rotary key-code, we do not need this. */ in pxa27x_keypad_rotary_parse_dt()
231 pdata->rotary0_rel_code = (code & 0xffff); in pxa27x_keypad_rotary_parse_dt()
232 __set_bit(relcode, input_dev->relbit); in pxa27x_keypad_rotary_parse_dt()
235 pdata->rotary1_rel_code = relcode; in pxa27x_keypad_rotary_parse_dt()
236 __set_bit(relcode, input_dev->relbit); in pxa27x_keypad_rotary_parse_dt()
251 * Now we depends on direct-rel-code. in pxa27x_keypad_rotary_parse_dt()
260 keypad->keycodes[n] = keycode; in pxa27x_keypad_rotary_parse_dt()
261 __set_bit(keycode, input_dev->keybit); in pxa27x_keypad_rotary_parse_dt()
264 keypad->keycodes[n + 1] = keycode; in pxa27x_keypad_rotary_parse_dt()
265 __set_bit(keycode, input_dev->keybit); in pxa27x_keypad_rotary_parse_dt()
268 pdata->rotary0_rel_code = -1; in pxa27x_keypad_rotary_parse_dt()
270 pdata->rotary1_rel_code = -1; in pxa27x_keypad_rotary_parse_dt()
273 pdata->enable_rotary0 = 1; in pxa27x_keypad_rotary_parse_dt()
275 pdata->enable_rotary1 = 1; in pxa27x_keypad_rotary_parse_dt()
278 keypad->rotary_rel_code[0] = pdata->rotary0_rel_code; in pxa27x_keypad_rotary_parse_dt()
279 keypad->rotary_rel_code[1] = pdata->rotary1_rel_code; in pxa27x_keypad_rotary_parse_dt()
286 struct input_dev *input_dev = keypad->input_dev; in pxa27x_keypad_build_keycode_from_dt()
287 struct device *dev = input_dev->dev.parent; in pxa27x_keypad_build_keycode_from_dt()
288 struct device_node *np = dev->of_node; in pxa27x_keypad_build_keycode_from_dt()
295 return -ENOMEM; in pxa27x_keypad_build_keycode_from_dt()
312 dev_err(dev, "failed to parse rotary key\n"); in pxa27x_keypad_build_keycode_from_dt()
316 error = of_property_read_u32(np, "marvell,debounce-interval", in pxa27x_keypad_build_keycode_from_dt()
317 &pdata->debounce_interval); in pxa27x_keypad_build_keycode_from_dt()
319 dev_err(dev, "failed to parse debounce-interval\n"); in pxa27x_keypad_build_keycode_from_dt()
325 * key or rotary key. in pxa27x_keypad_build_keycode_from_dt()
327 input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes); in pxa27x_keypad_build_keycode_from_dt()
329 keypad->pdata = pdata; in pxa27x_keypad_build_keycode_from_dt()
337 dev_info(keypad->input_dev->dev.parent, "missing platform data\n"); in pxa27x_keypad_build_keycode_from_dt()
339 return -EINVAL; in pxa27x_keypad_build_keycode_from_dt()
346 const struct pxa27x_keypad_platform_data *pdata = keypad->pdata; in pxa27x_keypad_build_keycode()
347 struct input_dev *input_dev = keypad->input_dev; in pxa27x_keypad_build_keycode()
352 error = matrix_keypad_build_keymap(pdata->matrix_keymap_data, NULL, in pxa27x_keypad_build_keycode()
353 pdata->matrix_key_rows, in pxa27x_keypad_build_keycode()
354 pdata->matrix_key_cols, in pxa27x_keypad_build_keycode()
355 keypad->keycodes, input_dev); in pxa27x_keypad_build_keycode()
361 * or rotary keys. in pxa27x_keypad_build_keycode()
363 input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes); in pxa27x_keypad_build_keycode()
366 for (i = 0; i < pdata->direct_key_num; i++) { in pxa27x_keypad_build_keycode()
367 keycode = pdata->direct_key_map[i]; in pxa27x_keypad_build_keycode()
368 keypad->keycodes[MAX_MATRIX_KEY_NUM + i] = keycode; in pxa27x_keypad_build_keycode()
369 __set_bit(keycode, input_dev->keybit); in pxa27x_keypad_build_keycode()
372 if (pdata->enable_rotary0) { in pxa27x_keypad_build_keycode()
373 if (pdata->rotary0_up_key && pdata->rotary0_down_key) { in pxa27x_keypad_build_keycode()
374 keycode = pdata->rotary0_up_key; in pxa27x_keypad_build_keycode()
375 keypad->keycodes[MAX_MATRIX_KEY_NUM + 0] = keycode; in pxa27x_keypad_build_keycode()
376 __set_bit(keycode, input_dev->keybit); in pxa27x_keypad_build_keycode()
378 keycode = pdata->rotary0_down_key; in pxa27x_keypad_build_keycode()
379 keypad->keycodes[MAX_MATRIX_KEY_NUM + 1] = keycode; in pxa27x_keypad_build_keycode()
380 __set_bit(keycode, input_dev->keybit); in pxa27x_keypad_build_keycode()
382 keypad->rotary_rel_code[0] = -1; in pxa27x_keypad_build_keycode()
384 keypad->rotary_rel_code[0] = pdata->rotary0_rel_code; in pxa27x_keypad_build_keycode()
385 __set_bit(pdata->rotary0_rel_code, input_dev->relbit); in pxa27x_keypad_build_keycode()
389 if (pdata->enable_rotary1) { in pxa27x_keypad_build_keycode()
390 if (pdata->rotary1_up_key && pdata->rotary1_down_key) { in pxa27x_keypad_build_keycode()
391 keycode = pdata->rotary1_up_key; in pxa27x_keypad_build_keycode()
392 keypad->keycodes[MAX_MATRIX_KEY_NUM + 2] = keycode; in pxa27x_keypad_build_keycode()
393 __set_bit(keycode, input_dev->keybit); in pxa27x_keypad_build_keycode()
395 keycode = pdata->rotary1_down_key; in pxa27x_keypad_build_keycode()
396 keypad->keycodes[MAX_MATRIX_KEY_NUM + 3] = keycode; in pxa27x_keypad_build_keycode()
397 __set_bit(keycode, input_dev->keybit); in pxa27x_keypad_build_keycode()
399 keypad->rotary_rel_code[1] = -1; in pxa27x_keypad_build_keycode()
401 keypad->rotary_rel_code[1] = pdata->rotary1_rel_code; in pxa27x_keypad_build_keycode()
402 __set_bit(pdata->rotary1_rel_code, input_dev->relbit); in pxa27x_keypad_build_keycode()
406 __clear_bit(KEY_RESERVED, input_dev->keybit); in pxa27x_keypad_build_keycode()
413 const struct pxa27x_keypad_platform_data *pdata = keypad->pdata; in pxa27x_keypad_scan_matrix()
414 struct input_dev *input_dev = keypad->input_dev; in pxa27x_keypad_scan_matrix()
431 if (col >= pdata->matrix_key_cols || in pxa27x_keypad_scan_matrix()
432 row >= pdata->matrix_key_rows) in pxa27x_keypad_scan_matrix()
455 for (col = 0; col < pdata->matrix_key_cols; col++) { in pxa27x_keypad_scan_matrix()
459 bits_changed = keypad->matrix_key_state[col] ^ new_state[col]; in pxa27x_keypad_scan_matrix()
463 for (row = 0; row < pdata->matrix_key_rows; row++) { in pxa27x_keypad_scan_matrix()
467 code = MATRIX_SCAN_CODE(row, col, keypad->row_shift); in pxa27x_keypad_scan_matrix()
470 input_report_key(input_dev, keypad->keycodes[code], in pxa27x_keypad_scan_matrix()
475 memcpy(keypad->matrix_key_state, new_state, sizeof(new_state)); in pxa27x_keypad_scan_matrix()
485 return (kprec & 0xff) - 0x7f - 0xff; in rotary_delta()
487 return (kprec & 0xff) - 0x7f; in rotary_delta()
492 struct input_dev *dev = keypad->input_dev; in report_rotary_event()
497 if (keypad->rotary_rel_code[r] == -1) { in report_rotary_event()
499 unsigned char keycode = keypad->keycodes[code]; in report_rotary_event()
501 /* simulate a press-n-release */ in report_rotary_event()
509 input_report_rel(dev, keypad->rotary_rel_code[r], delta); in report_rotary_event()
516 const struct pxa27x_keypad_platform_data *pdata = keypad->pdata; in pxa27x_keypad_scan_rotary()
523 if (pdata->enable_rotary0) in pxa27x_keypad_scan_rotary()
526 if (pdata->enable_rotary1) in pxa27x_keypad_scan_rotary()
532 const struct pxa27x_keypad_platform_data *pdata = keypad->pdata; in pxa27x_keypad_scan_direct()
533 struct input_dev *input_dev = keypad->input_dev; in pxa27x_keypad_scan_direct()
540 if (pdata->enable_rotary0 || pdata->enable_rotary1) in pxa27x_keypad_scan_direct()
547 if (pdata->direct_key_low_active) in pxa27x_keypad_scan_direct()
548 new_state = ~KPDK_DK(kpdk) & keypad->direct_key_mask; in pxa27x_keypad_scan_direct()
550 new_state = KPDK_DK(kpdk) & keypad->direct_key_mask; in pxa27x_keypad_scan_direct()
552 bits_changed = keypad->direct_key_state ^ new_state; in pxa27x_keypad_scan_direct()
557 for (i = 0; i < pdata->direct_key_num; i++) { in pxa27x_keypad_scan_direct()
562 input_report_key(input_dev, keypad->keycodes[code], in pxa27x_keypad_scan_direct()
567 keypad->direct_key_state = new_state; in pxa27x_keypad_scan_direct()
572 const struct pxa27x_keypad_platform_data *pdata = keypad->pdata; in clear_wakeup_event()
574 if (pdata->clear_wakeup_event) in clear_wakeup_event()
575 (pdata->clear_wakeup_event)(); in clear_wakeup_event()
596 const struct pxa27x_keypad_platform_data *pdata = keypad->pdata; in pxa27x_keypad_config()
604 if (pdata->matrix_key_rows && pdata->matrix_key_cols) { in pxa27x_keypad_config()
606 kpc |= KPC_MKRN(pdata->matrix_key_rows) | in pxa27x_keypad_config()
607 KPC_MKCN(pdata->matrix_key_cols); in pxa27x_keypad_config()
610 /* enable rotary key, debounce interval same as direct keys */ in pxa27x_keypad_config()
611 if (pdata->enable_rotary0) { in pxa27x_keypad_config()
617 if (pdata->enable_rotary1) { in pxa27x_keypad_config()
623 if (pdata->direct_key_num > direct_key_num) in pxa27x_keypad_config()
624 direct_key_num = pdata->direct_key_num; in pxa27x_keypad_config()
630 if (pdata->direct_key_mask) in pxa27x_keypad_config()
631 keypad->direct_key_mask = pdata->direct_key_mask; in pxa27x_keypad_config()
633 keypad->direct_key_mask = ((1 << direct_key_num) - 1) & ~mask; in pxa27x_keypad_config()
641 keypad_writel(KPKDI, pdata->debounce_interval); in pxa27x_keypad_config()
649 ret = clk_prepare_enable(keypad->clk); in pxa27x_keypad_open()
663 clk_disable_unprepare(keypad->clk); in pxa27x_keypad_close()
676 if (device_may_wakeup(&pdev->dev)) in pxa27x_keypad_suspend()
677 enable_irq_wake(keypad->irq); in pxa27x_keypad_suspend()
679 clk_disable_unprepare(keypad->clk); in pxa27x_keypad_suspend()
688 struct input_dev *input_dev = keypad->input_dev; in pxa27x_keypad_resume()
695 if (device_may_wakeup(&pdev->dev)) { in pxa27x_keypad_resume()
696 disable_irq_wake(keypad->irq); in pxa27x_keypad_resume()
698 mutex_lock(&input_dev->mutex); in pxa27x_keypad_resume()
700 if (input_dev->users) { in pxa27x_keypad_resume()
702 ret = clk_prepare_enable(keypad->clk); in pxa27x_keypad_resume()
707 mutex_unlock(&input_dev->mutex); in pxa27x_keypad_resume()
721 dev_get_platdata(&pdev->dev); in pxa27x_keypad_probe()
722 struct device_node *np = pdev->dev.of_node; in pxa27x_keypad_probe()
730 return -EINVAL; in pxa27x_keypad_probe()
734 dev_err(&pdev->dev, "failed to get keypad irq\n"); in pxa27x_keypad_probe()
735 return -ENXIO; in pxa27x_keypad_probe()
740 dev_err(&pdev->dev, "failed to get I/O memory\n"); in pxa27x_keypad_probe()
741 return -ENXIO; in pxa27x_keypad_probe()
744 keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad), in pxa27x_keypad_probe()
747 return -ENOMEM; in pxa27x_keypad_probe()
749 input_dev = devm_input_allocate_device(&pdev->dev); in pxa27x_keypad_probe()
751 return -ENOMEM; in pxa27x_keypad_probe()
753 keypad->pdata = pdata; in pxa27x_keypad_probe()
754 keypad->input_dev = input_dev; in pxa27x_keypad_probe()
755 keypad->irq = irq; in pxa27x_keypad_probe()
757 keypad->mmio_base = devm_ioremap_resource(&pdev->dev, res); in pxa27x_keypad_probe()
758 if (IS_ERR(keypad->mmio_base)) in pxa27x_keypad_probe()
759 return PTR_ERR(keypad->mmio_base); in pxa27x_keypad_probe()
761 keypad->clk = devm_clk_get(&pdev->dev, NULL); in pxa27x_keypad_probe()
762 if (IS_ERR(keypad->clk)) { in pxa27x_keypad_probe()
763 dev_err(&pdev->dev, "failed to get keypad clock\n"); in pxa27x_keypad_probe()
764 return PTR_ERR(keypad->clk); in pxa27x_keypad_probe()
767 input_dev->name = pdev->name; in pxa27x_keypad_probe()
768 input_dev->id.bustype = BUS_HOST; in pxa27x_keypad_probe()
769 input_dev->open = pxa27x_keypad_open; in pxa27x_keypad_probe()
770 input_dev->close = pxa27x_keypad_close; in pxa27x_keypad_probe()
771 input_dev->dev.parent = &pdev->dev; in pxa27x_keypad_probe()
773 input_dev->keycode = keypad->keycodes; in pxa27x_keypad_probe()
774 input_dev->keycodesize = sizeof(keypad->keycodes[0]); in pxa27x_keypad_probe()
775 input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes); in pxa27x_keypad_probe()
779 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); in pxa27x_keypad_probe()
791 pdata = keypad->pdata; in pxa27x_keypad_probe()
794 dev_err(&pdev->dev, "failed to build keycode\n"); in pxa27x_keypad_probe()
798 keypad->row_shift = get_count_order(pdata->matrix_key_cols); in pxa27x_keypad_probe()
800 if ((pdata->enable_rotary0 && keypad->rotary_rel_code[0] != -1) || in pxa27x_keypad_probe()
801 (pdata->enable_rotary1 && keypad->rotary_rel_code[1] != -1)) { in pxa27x_keypad_probe()
802 input_dev->evbit[0] |= BIT_MASK(EV_REL); in pxa27x_keypad_probe()
805 error = devm_request_irq(&pdev->dev, irq, pxa27x_keypad_irq_handler, in pxa27x_keypad_probe()
806 0, pdev->name, keypad); in pxa27x_keypad_probe()
808 dev_err(&pdev->dev, "failed to request IRQ\n"); in pxa27x_keypad_probe()
815 dev_err(&pdev->dev, "failed to register input device\n"); in pxa27x_keypad_probe()
820 device_init_wakeup(&pdev->dev, 1); in pxa27x_keypad_probe()
827 { .compatible = "marvell,pxa27x-keypad" },
836 .name = "pxa27x-keypad",
846 MODULE_ALIAS("platform:pxa27x-keypad");