Lines Matching full:keypad

3  * Driver for the Cirrus EP93xx matrix keypad controller.
7 * Based on the pxa27x matrix keypad controller by Rodolfo Giometti.
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()
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()
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()
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()
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()
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()
241 keypad->pdata = dev_get_platdata(&pdev->dev); in ep93xx_keypad_probe()
242 if (!keypad->pdata) in ep93xx_keypad_probe()
245 keymap_data = keypad->pdata->keymap_data; 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()
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()
274 keypad->input_dev = input_dev; 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()
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()
304 err = dev_pm_set_wake_irq(&pdev->dev, keypad->irq); in ep93xx_keypad_probe()
320 .name = "ep93xx-keypad",
330 MODULE_DESCRIPTION("EP93xx Matrix Keypad Controller");
331 MODULE_ALIAS("platform:ep93xx-keypad");