Lines Matching +full:keypad +full:- +full:wakeup

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Driver for the Cirrus EP93xx matrix keypad controller.
7 * Based on the pxa27x matrix keypad controller by Rodolfo Giometti.
11 * The 3-key reset is triggered by pressing the 3 keys in
30 #include <linux/platform_data/keypad-ep93xx.h>
34 * Keypad Interface Register offsets
85 struct ep93xx_keypad *keypad = dev_id; in ep93xx_keypad_irq_handler() local
86 struct input_dev *input_dev = keypad->input_dev; in ep93xx_keypad_irq_handler()
90 status = __raw_readl(keypad->mmio_base + KEY_REG); in ep93xx_keypad_irq_handler()
93 key1 = keypad->keycodes[keycode]; in ep93xx_keypad_irq_handler()
96 key2 = keypad->keycodes[keycode]; in ep93xx_keypad_irq_handler()
99 if (keypad->key1 && key1 != keypad->key1 && key2 != keypad->key1) in ep93xx_keypad_irq_handler()
100 input_report_key(input_dev, keypad->key1, 0); in ep93xx_keypad_irq_handler()
102 if (keypad->key2 && key1 != keypad->key2 && key2 != keypad->key2) in ep93xx_keypad_irq_handler()
103 input_report_key(input_dev, keypad->key2, 0); in ep93xx_keypad_irq_handler()
108 keypad->key1 = key1; in ep93xx_keypad_irq_handler()
109 keypad->key2 = key2; in ep93xx_keypad_irq_handler()
112 if (keypad->key1 && key1 != keypad->key1) in ep93xx_keypad_irq_handler()
113 input_report_key(input_dev, keypad->key1, 0); in ep93xx_keypad_irq_handler()
115 if (keypad->key2 && key1 != keypad->key2) in ep93xx_keypad_irq_handler()
116 input_report_key(input_dev, keypad->key2, 0); in ep93xx_keypad_irq_handler()
120 keypad->key1 = key1; in ep93xx_keypad_irq_handler()
121 keypad->key2 = 0; in ep93xx_keypad_irq_handler()
124 input_report_key(input_dev, keypad->key1, 0); in ep93xx_keypad_irq_handler()
125 input_report_key(input_dev, keypad->key2, 0); in ep93xx_keypad_irq_handler()
127 keypad->key1 = keypad->key2 = 0; in ep93xx_keypad_irq_handler()
134 static void ep93xx_keypad_config(struct ep93xx_keypad *keypad) in ep93xx_keypad_config() argument
136 struct ep93xx_keypad_platform_data *pdata = keypad->pdata; in ep93xx_keypad_config()
139 clk_set_rate(keypad->clk, pdata->clk_rate); in ep93xx_keypad_config()
141 if (pdata->flags & EP93XX_KEYPAD_DISABLE_3_KEY) in ep93xx_keypad_config()
143 if (pdata->flags & EP93XX_KEYPAD_DIAG_MODE) in ep93xx_keypad_config()
145 if (pdata->flags & EP93XX_KEYPAD_BACK_DRIVE) in ep93xx_keypad_config()
147 if (pdata->flags & EP93XX_KEYPAD_TEST_MODE) in ep93xx_keypad_config()
150 val |= ((pdata->debounce << KEY_INIT_DBNC_SHIFT) & KEY_INIT_DBNC_MASK); in ep93xx_keypad_config()
152 val |= ((pdata->prescale << KEY_INIT_PRSCL_SHIFT) & KEY_INIT_PRSCL_MASK); in ep93xx_keypad_config()
154 __raw_writel(val, keypad->mmio_base + KEY_INIT); in ep93xx_keypad_config()
159 struct ep93xx_keypad *keypad = input_get_drvdata(pdev); in ep93xx_keypad_open() local
161 if (!keypad->enabled) { in ep93xx_keypad_open()
162 ep93xx_keypad_config(keypad); in ep93xx_keypad_open()
163 clk_prepare_enable(keypad->clk); in ep93xx_keypad_open()
164 keypad->enabled = true; in ep93xx_keypad_open()
172 struct ep93xx_keypad *keypad = input_get_drvdata(pdev); in ep93xx_keypad_close() local
174 if (keypad->enabled) { in ep93xx_keypad_close()
175 clk_disable_unprepare(keypad->clk); in ep93xx_keypad_close()
176 keypad->enabled = false; in ep93xx_keypad_close()
184 struct ep93xx_keypad *keypad = platform_get_drvdata(pdev); in ep93xx_keypad_suspend() local
185 struct input_dev *input_dev = keypad->input_dev; in ep93xx_keypad_suspend()
187 mutex_lock(&input_dev->mutex); in ep93xx_keypad_suspend()
189 if (keypad->enabled) { in ep93xx_keypad_suspend()
190 clk_disable(keypad->clk); in ep93xx_keypad_suspend()
191 keypad->enabled = false; in ep93xx_keypad_suspend()
194 mutex_unlock(&input_dev->mutex); in ep93xx_keypad_suspend()
202 struct ep93xx_keypad *keypad = platform_get_drvdata(pdev); in ep93xx_keypad_resume() local
203 struct input_dev *input_dev = keypad->input_dev; in ep93xx_keypad_resume()
205 mutex_lock(&input_dev->mutex); in ep93xx_keypad_resume()
208 if (!keypad->enabled) { in ep93xx_keypad_resume()
209 ep93xx_keypad_config(keypad); in ep93xx_keypad_resume()
210 clk_enable(keypad->clk); in ep93xx_keypad_resume()
211 keypad->enabled = true; in ep93xx_keypad_resume()
215 mutex_unlock(&input_dev->mutex); in ep93xx_keypad_resume()
232 struct ep93xx_keypad *keypad; in ep93xx_keypad_probe() local
237 keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad), GFP_KERNEL); in ep93xx_keypad_probe()
238 if (!keypad) in ep93xx_keypad_probe()
239 return -ENOMEM; in ep93xx_keypad_probe()
241 keypad->pdata = dev_get_platdata(&pdev->dev); in ep93xx_keypad_probe()
242 if (!keypad->pdata) in ep93xx_keypad_probe()
243 return -EINVAL; in ep93xx_keypad_probe()
245 keymap_data = keypad->pdata->keymap_data; in ep93xx_keypad_probe()
247 return -EINVAL; in ep93xx_keypad_probe()
249 keypad->irq = platform_get_irq(pdev, 0); in ep93xx_keypad_probe()
250 if (keypad->irq < 0) in ep93xx_keypad_probe()
251 return keypad->irq; in ep93xx_keypad_probe()
253 keypad->mmio_base = devm_platform_ioremap_resource(pdev, 0); in ep93xx_keypad_probe()
254 if (IS_ERR(keypad->mmio_base)) in ep93xx_keypad_probe()
255 return PTR_ERR(keypad->mmio_base); in ep93xx_keypad_probe()
261 err = devm_add_action_or_reset(&pdev->dev, in ep93xx_keypad_probe()
266 keypad->clk = devm_clk_get(&pdev->dev, NULL); in ep93xx_keypad_probe()
267 if (IS_ERR(keypad->clk)) in ep93xx_keypad_probe()
268 return PTR_ERR(keypad->clk); in ep93xx_keypad_probe()
270 input_dev = devm_input_allocate_device(&pdev->dev); in ep93xx_keypad_probe()
272 return -ENOMEM; in ep93xx_keypad_probe()
274 keypad->input_dev = input_dev; in ep93xx_keypad_probe()
276 input_dev->name = pdev->name; in ep93xx_keypad_probe()
277 input_dev->id.bustype = BUS_HOST; in ep93xx_keypad_probe()
278 input_dev->open = ep93xx_keypad_open; in ep93xx_keypad_probe()
279 input_dev->close = ep93xx_keypad_close; in ep93xx_keypad_probe()
283 keypad->keycodes, input_dev); in ep93xx_keypad_probe()
287 if (keypad->pdata->flags & EP93XX_KEYPAD_AUTOREPEAT) in ep93xx_keypad_probe()
288 __set_bit(EV_REP, input_dev->evbit); in ep93xx_keypad_probe()
289 input_set_drvdata(input_dev, keypad); in ep93xx_keypad_probe()
291 err = devm_request_irq(&pdev->dev, keypad->irq, in ep93xx_keypad_probe()
293 0, pdev->name, keypad); in ep93xx_keypad_probe()
301 platform_set_drvdata(pdev, keypad); in ep93xx_keypad_probe()
303 device_init_wakeup(&pdev->dev, 1); in ep93xx_keypad_probe()
304 err = dev_pm_set_wake_irq(&pdev->dev, keypad->irq); in ep93xx_keypad_probe()
306 dev_warn(&pdev->dev, "failed to set up wakeup irq: %d\n", err); in ep93xx_keypad_probe()
313 dev_pm_clear_wake_irq(&pdev->dev); in ep93xx_keypad_remove()
318 .name = "ep93xx-keypad",
328 MODULE_DESCRIPTION("EP93xx Matrix Keypad Controller");
329 MODULE_ALIAS("platform:ep93xx-keypad");