• Home
  • Raw
  • Download

Lines Matching refs:keypad

83 static void samsung_keypad_scan(struct samsung_keypad *keypad,  in samsung_keypad_scan()  argument
89 for (col = 0; col < keypad->cols; col++) { in samsung_keypad_scan()
90 if (keypad->type == KEYPAD_TYPE_S5PV210) { in samsung_keypad_scan()
98 writel(val, keypad->base + SAMSUNG_KEYIFCOL); in samsung_keypad_scan()
101 val = readl(keypad->base + SAMSUNG_KEYIFROW); in samsung_keypad_scan()
102 row_state[col] = ~val & ((1 << keypad->rows) - 1); in samsung_keypad_scan()
106 writel(0, keypad->base + SAMSUNG_KEYIFCOL); in samsung_keypad_scan()
109 static bool samsung_keypad_report(struct samsung_keypad *keypad, in samsung_keypad_report() argument
112 struct input_dev *input_dev = keypad->input_dev; in samsung_keypad_report()
119 for (col = 0; col < keypad->cols; col++) { in samsung_keypad_report()
120 changed = row_state[col] ^ keypad->row_state[col]; in samsung_keypad_report()
125 for (row = 0; row < keypad->rows; row++) { in samsung_keypad_report()
131 dev_dbg(&keypad->input_dev->dev, in samsung_keypad_report()
135 val = MATRIX_SCAN_CODE(row, col, keypad->row_shift); in samsung_keypad_report()
139 keypad->keycodes[val], pressed); in samsung_keypad_report()
141 input_sync(keypad->input_dev); in samsung_keypad_report()
144 memcpy(keypad->row_state, row_state, sizeof(keypad->row_state)); in samsung_keypad_report()
151 struct samsung_keypad *keypad = dev_id; in samsung_keypad_irq() local
156 pm_runtime_get_sync(&keypad->pdev->dev); in samsung_keypad_irq()
159 val = readl(keypad->base + SAMSUNG_KEYIFSTSCLR); in samsung_keypad_irq()
161 writel(~0x0, keypad->base + SAMSUNG_KEYIFSTSCLR); in samsung_keypad_irq()
163 samsung_keypad_scan(keypad, row_state); in samsung_keypad_irq()
165 key_down = samsung_keypad_report(keypad, row_state); in samsung_keypad_irq()
167 wait_event_timeout(keypad->wait, keypad->stopped, in samsung_keypad_irq()
170 } while (key_down && !keypad->stopped); in samsung_keypad_irq()
172 pm_runtime_put(&keypad->pdev->dev); in samsung_keypad_irq()
177 static void samsung_keypad_start(struct samsung_keypad *keypad) in samsung_keypad_start() argument
181 pm_runtime_get_sync(&keypad->pdev->dev); in samsung_keypad_start()
184 keypad->stopped = false; in samsung_keypad_start()
186 clk_enable(keypad->clk); in samsung_keypad_start()
189 val = readl(keypad->base + SAMSUNG_KEYIFCON); in samsung_keypad_start()
191 writel(val, keypad->base + SAMSUNG_KEYIFCON); in samsung_keypad_start()
194 writel(0, keypad->base + SAMSUNG_KEYIFCOL); in samsung_keypad_start()
196 pm_runtime_put(&keypad->pdev->dev); in samsung_keypad_start()
199 static void samsung_keypad_stop(struct samsung_keypad *keypad) in samsung_keypad_stop() argument
203 pm_runtime_get_sync(&keypad->pdev->dev); in samsung_keypad_stop()
206 keypad->stopped = true; in samsung_keypad_stop()
207 wake_up(&keypad->wait); in samsung_keypad_stop()
208 disable_irq(keypad->irq); in samsung_keypad_stop()
211 writel(~0x0, keypad->base + SAMSUNG_KEYIFSTSCLR); in samsung_keypad_stop()
214 val = readl(keypad->base + SAMSUNG_KEYIFCON); in samsung_keypad_stop()
216 writel(val, keypad->base + SAMSUNG_KEYIFCON); in samsung_keypad_stop()
218 clk_disable(keypad->clk); in samsung_keypad_stop()
224 enable_irq(keypad->irq); in samsung_keypad_stop()
226 pm_runtime_put(&keypad->pdev->dev); in samsung_keypad_stop()
231 struct samsung_keypad *keypad = input_get_drvdata(input_dev); in samsung_keypad_open() local
233 samsung_keypad_start(keypad); in samsung_keypad_open()
240 struct samsung_keypad *keypad = input_get_drvdata(input_dev); in samsung_keypad_close() local
242 samsung_keypad_stop(keypad); in samsung_keypad_close()
323 struct samsung_keypad *keypad; in samsung_keypad_probe() local
354 keymap_size = (pdata->rows << row_shift) * sizeof(keypad->keycodes[0]); in samsung_keypad_probe()
356 keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad) + keymap_size, in samsung_keypad_probe()
359 if (!keypad || !input_dev) in samsung_keypad_probe()
366 keypad->base = devm_ioremap(&pdev->dev, res->start, resource_size(res)); in samsung_keypad_probe()
367 if (!keypad->base) in samsung_keypad_probe()
370 keypad->clk = devm_clk_get(&pdev->dev, "keypad"); in samsung_keypad_probe()
371 if (IS_ERR(keypad->clk)) { in samsung_keypad_probe()
373 return PTR_ERR(keypad->clk); in samsung_keypad_probe()
376 error = clk_prepare(keypad->clk); in samsung_keypad_probe()
382 keypad->input_dev = input_dev; in samsung_keypad_probe()
383 keypad->pdev = pdev; in samsung_keypad_probe()
384 keypad->row_shift = row_shift; in samsung_keypad_probe()
385 keypad->rows = pdata->rows; in samsung_keypad_probe()
386 keypad->cols = pdata->cols; in samsung_keypad_probe()
387 keypad->stopped = true; in samsung_keypad_probe()
388 init_waitqueue_head(&keypad->wait); in samsung_keypad_probe()
391 keypad->type = of_device_is_compatible(pdev->dev.of_node, in samsung_keypad_probe()
394 keypad->type = platform_get_device_id(pdev)->driver_data; in samsung_keypad_probe()
405 keypad->keycodes, input_dev); in samsung_keypad_probe()
415 input_set_drvdata(input_dev, keypad); in samsung_keypad_probe()
417 keypad->irq = platform_get_irq(pdev, 0); in samsung_keypad_probe()
418 if (keypad->irq < 0) { in samsung_keypad_probe()
419 error = keypad->irq; in samsung_keypad_probe()
423 error = devm_request_threaded_irq(&pdev->dev, keypad->irq, NULL, in samsung_keypad_probe()
425 dev_name(&pdev->dev), keypad); in samsung_keypad_probe()
432 platform_set_drvdata(pdev, keypad); in samsung_keypad_probe()
435 error = input_register_device(keypad->input_dev); in samsung_keypad_probe()
449 clk_unprepare(keypad->clk); in samsung_keypad_probe()
455 struct samsung_keypad *keypad = platform_get_drvdata(pdev); in samsung_keypad_remove() local
459 input_unregister_device(keypad->input_dev); in samsung_keypad_remove()
461 clk_unprepare(keypad->clk); in samsung_keypad_remove()
470 struct samsung_keypad *keypad = platform_get_drvdata(pdev); in samsung_keypad_runtime_suspend() local
474 if (keypad->stopped) in samsung_keypad_runtime_suspend()
478 error = enable_irq_wake(keypad->irq); in samsung_keypad_runtime_suspend()
480 keypad->wake_enabled = true; in samsung_keypad_runtime_suspend()
482 val = readl(keypad->base + SAMSUNG_KEYIFCON); in samsung_keypad_runtime_suspend()
484 writel(val, keypad->base + SAMSUNG_KEYIFCON); in samsung_keypad_runtime_suspend()
486 clk_disable(keypad->clk); in samsung_keypad_runtime_suspend()
494 struct samsung_keypad *keypad = platform_get_drvdata(pdev); in samsung_keypad_runtime_resume() local
497 if (keypad->stopped) in samsung_keypad_runtime_resume()
500 clk_enable(keypad->clk); in samsung_keypad_runtime_resume()
502 val = readl(keypad->base + SAMSUNG_KEYIFCON); in samsung_keypad_runtime_resume()
504 writel(val, keypad->base + SAMSUNG_KEYIFCON); in samsung_keypad_runtime_resume()
506 if (keypad->wake_enabled) in samsung_keypad_runtime_resume()
507 disable_irq_wake(keypad->irq); in samsung_keypad_runtime_resume()
514 static void samsung_keypad_toggle_wakeup(struct samsung_keypad *keypad, in samsung_keypad_toggle_wakeup() argument
519 clk_enable(keypad->clk); in samsung_keypad_toggle_wakeup()
521 val = readl(keypad->base + SAMSUNG_KEYIFCON); in samsung_keypad_toggle_wakeup()
524 if (device_may_wakeup(&keypad->pdev->dev)) in samsung_keypad_toggle_wakeup()
525 enable_irq_wake(keypad->irq); in samsung_keypad_toggle_wakeup()
528 if (device_may_wakeup(&keypad->pdev->dev)) in samsung_keypad_toggle_wakeup()
529 disable_irq_wake(keypad->irq); in samsung_keypad_toggle_wakeup()
531 writel(val, keypad->base + SAMSUNG_KEYIFCON); in samsung_keypad_toggle_wakeup()
533 clk_disable(keypad->clk); in samsung_keypad_toggle_wakeup()
539 struct samsung_keypad *keypad = platform_get_drvdata(pdev); in samsung_keypad_suspend() local
540 struct input_dev *input_dev = keypad->input_dev; in samsung_keypad_suspend()
545 samsung_keypad_stop(keypad); in samsung_keypad_suspend()
547 samsung_keypad_toggle_wakeup(keypad, true); in samsung_keypad_suspend()
557 struct samsung_keypad *keypad = platform_get_drvdata(pdev); in samsung_keypad_resume() local
558 struct input_dev *input_dev = keypad->input_dev; in samsung_keypad_resume()
562 samsung_keypad_toggle_wakeup(keypad, false); in samsung_keypad_resume()
565 samsung_keypad_start(keypad); in samsung_keypad_resume()