• 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  * Samsung keypad driver
25 #include <plat/keypad.h>
87 static void samsung_keypad_scan(struct samsung_keypad *keypad,
90 struct device *dev = keypad->input_dev->dev.parent;
94 for (col = 0; col < keypad->cols; col++) {
103 writel(val, keypad->base + SAMSUNG_KEYIFCOL);
106 val = readl(keypad->base + SAMSUNG_KEYIFROW);
107 row_state[col] = ~val & ((1 << keypad->rows) - 1);
111 writel(0, keypad->base + SAMSUNG_KEYIFCOL);
114 static bool samsung_keypad_report(struct samsung_keypad *keypad,
117 struct input_dev *input_dev = keypad->input_dev;
124 for (col = 0; col < keypad->cols; col++) {
125 changed = row_state[col] ^ keypad->row_state[col];
130 for (row = 0; row < keypad->rows; row++) {
136 dev_dbg(&keypad->input_dev->dev,
140 val = MATRIX_SCAN_CODE(row, col, keypad->row_shift);
144 keypad->keycodes[val], pressed);
146 input_sync(keypad->input_dev);
149 memcpy(keypad->row_state, row_state, sizeof(keypad->row_state));
156 struct samsung_keypad *keypad = dev_id;
162 val = readl(keypad->base + SAMSUNG_KEYIFSTSCLR);
164 writel(~0x0, keypad->base + SAMSUNG_KEYIFSTSCLR);
166 samsung_keypad_scan(keypad, row_state);
168 key_down = samsung_keypad_report(keypad, row_state);
170 wait_event_timeout(keypad->wait, keypad->stopped,
173 } while (key_down && !keypad->stopped);
178 static void samsung_keypad_start(struct samsung_keypad *keypad)
183 keypad->stopped = false;
185 clk_enable(keypad->clk);
188 val = readl(keypad->base + SAMSUNG_KEYIFCON);
190 writel(val, keypad->base + SAMSUNG_KEYIFCON);
193 writel(0, keypad->base + SAMSUNG_KEYIFCOL);
196 static void samsung_keypad_stop(struct samsung_keypad *keypad)
201 keypad->stopped = true;
202 wake_up(&keypad->wait);
203 disable_irq(keypad->irq);
206 writel(~0x0, keypad->base + SAMSUNG_KEYIFSTSCLR);
209 val = readl(keypad->base + SAMSUNG_KEYIFCON);
211 writel(val, keypad->base + SAMSUNG_KEYIFCON);
213 clk_disable(keypad->clk);
219 enable_irq(keypad->irq);
224 struct samsung_keypad *keypad = input_get_drvdata(input_dev);
226 samsung_keypad_start(keypad);
233 struct samsung_keypad *keypad = input_get_drvdata(input_dev);
235 samsung_keypad_stop(keypad);
242 struct samsung_keypad *keypad;
272 keymap_size = (pdata->rows << row_shift) * sizeof(keypad->keycodes[0]);
274 keypad = kzalloc(sizeof(*keypad) + keymap_size, GFP_KERNEL);
276 if (!keypad || !input_dev) {
287 keypad->base = ioremap(res->start, resource_size(res));
288 if (!keypad->base) {
293 keypad->clk = clk_get(&pdev->dev, "keypad");
294 if (IS_ERR(keypad->clk)) {
295 dev_err(&pdev->dev, "failed to get keypad clk\n");
296 error = PTR_ERR(keypad->clk);
300 keypad->input_dev = input_dev;
301 keypad->row_shift = row_shift;
302 keypad->rows = pdata->rows;
303 keypad->cols = pdata->cols;
304 init_waitqueue_head(&keypad->wait);
309 input_set_drvdata(input_dev, keypad);
320 input_dev->keycode = keypad->keycodes;
321 input_dev->keycodesize = sizeof(keypad->keycodes[0]);
327 keypad->irq = platform_get_irq(pdev, 0);
328 if (keypad->irq < 0) {
329 error = keypad->irq;
333 error = request_threaded_irq(keypad->irq, NULL, samsung_keypad_irq,
334 IRQF_ONESHOT, dev_name(&pdev->dev), keypad);
336 dev_err(&pdev->dev, "failed to register keypad interrupt\n");
340 error = input_register_device(keypad->input_dev);
345 platform_set_drvdata(pdev, keypad);
349 free_irq(keypad->irq, keypad);
351 clk_put(keypad->clk);
353 iounmap(keypad->base);
356 kfree(keypad);
363 struct samsung_keypad *keypad = platform_get_drvdata(pdev);
368 input_unregister_device(keypad->input_dev);
374 free_irq(keypad->irq, keypad);
376 clk_put(keypad->clk);
378 iounmap(keypad->base);
379 kfree(keypad);
385 static void samsung_keypad_toggle_wakeup(struct samsung_keypad *keypad,
388 struct device *dev = keypad->input_dev->dev.parent;
391 clk_enable(keypad->clk);
393 val = readl(keypad->base + SAMSUNG_KEYIFCON);
397 enable_irq_wake(keypad->irq);
401 disable_irq_wake(keypad->irq);
403 writel(val, keypad->base + SAMSUNG_KEYIFCON);
405 clk_disable(keypad->clk);
411 struct samsung_keypad *keypad = platform_get_drvdata(pdev);
412 struct input_dev *input_dev = keypad->input_dev;
417 samsung_keypad_stop(keypad);
419 samsung_keypad_toggle_wakeup(keypad, true);
429 struct samsung_keypad *keypad = platform_get_drvdata(pdev);
430 struct input_dev *input_dev = keypad->input_dev;
434 samsung_keypad_toggle_wakeup(keypad, false);
437 samsung_keypad_start(keypad);
452 .name = "samsung-keypad",
455 .name = "s5pv210-keypad",
466 .name = "samsung-keypad",
487 MODULE_DESCRIPTION("Samsung keypad driver");
491 MODULE_ALIAS("platform:samsung-keypad");