Lines Matching +full:input +full:- +full:value

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) ST-Ericsson SA 2010
5 * Author: Naveen Kumar G <naveen.gaddipati@stericsson.com> for ST-Ericsson
6 * Author: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson
17 #include <linux/input.h>
22 #include <linux/platform_data/keypad-nomadik-ske.h>
54 * struct ske_keypad - data structure used by keypad driver
57 * @input: pointer to input device object
67 struct input_dev *input; member
80 spin_lock(&keypad->ske_keypad_lock); in ske_keypad_set_bits()
82 ret = readl(keypad->reg_base + addr); in ske_keypad_set_bits()
85 writel(ret, keypad->reg_base + addr); in ske_keypad_set_bits()
87 spin_unlock(&keypad->ske_keypad_lock); in ske_keypad_set_bits()
97 u32 value; in ske_keypad_chip_init() local
98 int timeout = keypad->board->debounce_ms; in ske_keypad_chip_init()
101 while ((readl(keypad->reg_base + SKE_RIS) != 0x00000000) && timeout--) in ske_keypad_chip_init()
104 if (timeout == -1) in ske_keypad_chip_init()
105 return -EINVAL; in ske_keypad_chip_init()
108 * set debounce value in ske_keypad_chip_init()
110 * dbounce value in steps of 32/32.768 ms in ske_keypad_chip_init()
112 spin_lock(&keypad->ske_keypad_lock); in ske_keypad_chip_init()
113 value = readl(keypad->reg_base + SKE_DBCR); in ske_keypad_chip_init()
114 value = value & 0xff; in ske_keypad_chip_init()
115 value |= ((keypad->board->debounce_ms * 32000)/32768) << 8; in ske_keypad_chip_init()
116 writel(value, keypad->reg_base + SKE_DBCR); in ske_keypad_chip_init()
117 spin_unlock(&keypad->ske_keypad_lock); in ske_keypad_chip_init()
126 value = (keypad->board->kcol - 1) << 3; in ske_keypad_chip_init()
127 ske_keypad_set_bits(keypad, SKE_CR, SKE_KPCN, value); in ske_keypad_chip_init()
132 /* un-mask keypad interrupts */ in ske_keypad_chip_init()
144 struct input_dev *input = keypad->input; in ske_keypad_report() local
157 ske_ris = readl(keypad->reg_base + SKE_RIS); in ske_keypad_report()
160 input_event(input, EV_MSC, MSC_SCAN, code); in ske_keypad_report()
161 input_report_key(input, keypad->keymap[code], key_pressed); in ske_keypad_report()
162 input_sync(input); in ske_keypad_report()
163 num_of_rows--; in ske_keypad_report()
177 * lower byte contains row value for column 2*x, in ske_keypad_read_data()
178 * upper byte contains row value for column 2*x + 1 in ske_keypad_read_data()
181 ske_asr = readl(keypad->reg_base + SKE_ASR0 + (4 * i)); in ske_keypad_read_data()
202 int timeout = keypad->board->debounce_ms; in ske_keypad_irq()
208 while ((readl(keypad->reg_base + SKE_CR) & SKE_KPASON) && --timeout) in ske_keypad_irq()
215 while ((readl(keypad->reg_base + SKE_RIS)) && --timeout) in ske_keypad_irq()
228 keypad->board->exit(); in ske_keypad_board_exit()
234 dev_get_platdata(&pdev->dev); in ske_keypad_probe()
235 struct device *dev = &pdev->dev; in ske_keypad_probe()
237 struct input_dev *input; in ske_keypad_probe() local
242 dev_err(&pdev->dev, "invalid keypad platform data\n"); in ske_keypad_probe()
243 return -EINVAL; in ske_keypad_probe()
252 input = devm_input_allocate_device(dev); in ske_keypad_probe()
253 if (!keypad || !input) { in ske_keypad_probe()
254 dev_err(&pdev->dev, "failed to allocate keypad memory\n"); in ske_keypad_probe()
255 return -ENOMEM; in ske_keypad_probe()
258 keypad->irq = irq; in ske_keypad_probe()
259 keypad->board = plat; in ske_keypad_probe()
260 keypad->input = input; in ske_keypad_probe()
261 spin_lock_init(&keypad->ske_keypad_lock); in ske_keypad_probe()
263 keypad->reg_base = devm_platform_ioremap_resource(pdev, 0); in ske_keypad_probe()
264 if (IS_ERR(keypad->reg_base)) in ske_keypad_probe()
265 return PTR_ERR(keypad->reg_base); in ske_keypad_probe()
267 keypad->pclk = devm_clk_get_enabled(dev, "apb_pclk"); in ske_keypad_probe()
268 if (IS_ERR(keypad->pclk)) { in ske_keypad_probe()
269 dev_err(&pdev->dev, "failed to get pclk\n"); in ske_keypad_probe()
270 return PTR_ERR(keypad->pclk); in ske_keypad_probe()
273 keypad->clk = devm_clk_get_enabled(dev, NULL); in ske_keypad_probe()
274 if (IS_ERR(keypad->clk)) { in ske_keypad_probe()
275 dev_err(&pdev->dev, "failed to get clk\n"); in ske_keypad_probe()
276 return PTR_ERR(keypad->clk); in ske_keypad_probe()
279 input->id.bustype = BUS_HOST; in ske_keypad_probe()
280 input->name = "ux500-ske-keypad"; in ske_keypad_probe()
281 input->dev.parent = &pdev->dev; in ske_keypad_probe()
283 error = matrix_keypad_build_keymap(plat->keymap_data, NULL, in ske_keypad_probe()
285 keypad->keymap, input); in ske_keypad_probe()
287 dev_err(&pdev->dev, "Failed to build keymap\n"); in ske_keypad_probe()
291 input_set_capability(input, EV_MSC, MSC_SCAN); in ske_keypad_probe()
292 if (!plat->no_autorepeat) in ske_keypad_probe()
293 __set_bit(EV_REP, input->evbit); in ske_keypad_probe()
296 if (keypad->board->init) in ske_keypad_probe()
297 keypad->board->init(); in ske_keypad_probe()
299 if (keypad->board->exit) { in ske_keypad_probe()
308 dev_err(&pdev->dev, "unable to init keypad hardware\n"); in ske_keypad_probe()
312 error = devm_request_threaded_irq(dev, keypad->irq, in ske_keypad_probe()
314 IRQF_ONESHOT, "ske-keypad", keypad); in ske_keypad_probe()
316 dev_err(&pdev->dev, "allocate irq %d failed\n", keypad->irq); in ske_keypad_probe()
320 error = input_register_device(input); in ske_keypad_probe()
322 dev_err(&pdev->dev, in ske_keypad_probe()
323 "unable to register input device: %d\n", error); in ske_keypad_probe()
327 if (plat->wakeup_enable) in ske_keypad_probe()
328 device_init_wakeup(&pdev->dev, true); in ske_keypad_probe()
368 .name = "nmk-ske-keypad",
377 MODULE_DESCRIPTION("Nomadik Scroll-Key-Encoder Keypad Driver");
378 MODULE_ALIAS("platform:nomadik-ske-keypad");