• Home
  • Raw
  • Download

Lines Matching +full:key +full:- +full:enable

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * DaVinci Key Scan Driver for TI platforms
9 * Initial Code: Sandeep Paulraj <s-paulraj@ti.com>
22 #include <linux/platform_data/keyscan-davinci.h>
24 /* Key scan registers */
37 /* Key Control Register (KEYCTRL) */
65 struct device *dev = &davinci_ks->input->dev; in davinci_ks_initialize()
66 struct davinci_ks_platform_data *pdata = davinci_ks->pdata; in davinci_ks_initialize()
69 /* Enable all interrupts */ in davinci_ks_initialize()
71 davinci_ks->base + DAVINCI_KEYSCAN_INTENA); in davinci_ks_initialize()
75 davinci_ks->base + DAVINCI_KEYSCAN_INTCLR); in davinci_ks_initialize()
78 __raw_writel(pdata->strobe, in davinci_ks_initialize()
79 davinci_ks->base + DAVINCI_KEYSCAN_STRBWIDTH); in davinci_ks_initialize()
80 __raw_writel(pdata->interval, in davinci_ks_initialize()
81 davinci_ks->base + DAVINCI_KEYSCAN_INTERVAL); in davinci_ks_initialize()
83 davinci_ks->base + DAVINCI_KEYSCAN_CONTTIME); in davinci_ks_initialize()
86 switch (pdata->matrix_type) { in davinci_ks_initialize()
94 dev_err(dev->parent, "wrong matrix type\n"); in davinci_ks_initialize()
95 return -EINVAL; in davinci_ks_initialize()
98 /* Enable key scan module and set matrix type */ in davinci_ks_initialize()
100 matrix_ctrl, davinci_ks->base + DAVINCI_KEYSCAN_KEYCTRL); in davinci_ks_initialize()
108 struct device *dev = &davinci_ks->input->dev; in davinci_ks_interrupt()
109 unsigned short *keymap = davinci_ks->keymap; in davinci_ks_interrupt()
110 int keymapsize = davinci_ks->pdata->keymapsize; in davinci_ks_interrupt()
117 __raw_writel(0x0, davinci_ks->base + DAVINCI_KEYSCAN_INTENA); in davinci_ks_interrupt()
119 /* Reading previous and new status of the key scan */ in davinci_ks_interrupt()
120 prev_status = __raw_readl(davinci_ks->base + DAVINCI_KEYSCAN_PREVSTATE); in davinci_ks_interrupt()
121 new_status = __raw_readl(davinci_ks->base + DAVINCI_KEYSCAN_CURRENTST); in davinci_ks_interrupt()
128 * that no key changes are being missed in davinci_ks_interrupt()
134 dev_dbg(dev->parent, "key %d %s\n", keycode, in davinci_ks_interrupt()
136 input_report_key(davinci_ks->input, keycode, in davinci_ks_interrupt()
138 input_sync(davinci_ks->input); in davinci_ks_interrupt()
143 davinci_ks->base + DAVINCI_KEYSCAN_INTCLR); in davinci_ks_interrupt()
146 /* Enable interrupts */ in davinci_ks_interrupt()
147 __raw_writel(0x1, davinci_ks->base + DAVINCI_KEYSCAN_INTENA); in davinci_ks_interrupt()
157 struct device *dev = &pdev->dev; in davinci_ks_probe()
161 if (pdata->device_enable) { in davinci_ks_probe()
162 error = pdata->device_enable(dev); in davinci_ks_probe()
164 dev_dbg(dev, "device enable function failed\n"); in davinci_ks_probe()
169 if (!pdata->keymap) { in davinci_ks_probe()
171 return -EINVAL; in davinci_ks_probe()
175 sizeof(unsigned short) * pdata->keymapsize, GFP_KERNEL); in davinci_ks_probe()
178 return -ENOMEM; in davinci_ks_probe()
181 memcpy(davinci_ks->keymap, pdata->keymap, in davinci_ks_probe()
182 sizeof(unsigned short) * pdata->keymapsize); in davinci_ks_probe()
187 error = -ENOMEM; in davinci_ks_probe()
191 davinci_ks->input = key_dev; in davinci_ks_probe()
193 davinci_ks->irq = platform_get_irq(pdev, 0); in davinci_ks_probe()
194 if (davinci_ks->irq < 0) { in davinci_ks_probe()
195 error = davinci_ks->irq; in davinci_ks_probe()
202 error = -EINVAL; in davinci_ks_probe()
206 davinci_ks->pbase = res->start; in davinci_ks_probe()
207 davinci_ks->base_size = resource_size(res); in davinci_ks_probe()
209 mem = request_mem_region(davinci_ks->pbase, davinci_ks->base_size, in davinci_ks_probe()
210 pdev->name); in davinci_ks_probe()
212 dev_err(dev, "key scan registers at %08x are not free\n", in davinci_ks_probe()
213 davinci_ks->pbase); in davinci_ks_probe()
214 error = -EBUSY; in davinci_ks_probe()
218 davinci_ks->base = ioremap(davinci_ks->pbase, davinci_ks->base_size); in davinci_ks_probe()
219 if (!davinci_ks->base) { in davinci_ks_probe()
221 error = -ENOMEM; in davinci_ks_probe()
225 /* Enable auto repeat feature of Linux input subsystem */ in davinci_ks_probe()
226 if (pdata->rep) in davinci_ks_probe()
227 __set_bit(EV_REP, key_dev->evbit); in davinci_ks_probe()
230 __set_bit(EV_KEY, key_dev->evbit); in davinci_ks_probe()
233 davinci_ks->pdata = pdata; in davinci_ks_probe()
235 for (i = 0; i < davinci_ks->pdata->keymapsize; i++) in davinci_ks_probe()
236 __set_bit(davinci_ks->pdata->keymap[i], key_dev->keybit); in davinci_ks_probe()
238 key_dev->name = "davinci_keyscan"; in davinci_ks_probe()
239 key_dev->phys = "davinci_keyscan/input0"; in davinci_ks_probe()
240 key_dev->dev.parent = dev; in davinci_ks_probe()
241 key_dev->id.bustype = BUS_HOST; in davinci_ks_probe()
242 key_dev->id.vendor = 0x0001; in davinci_ks_probe()
243 key_dev->id.product = 0x0001; in davinci_ks_probe()
244 key_dev->id.version = 0x0001; in davinci_ks_probe()
245 key_dev->keycode = davinci_ks->keymap; in davinci_ks_probe()
246 key_dev->keycodesize = sizeof(davinci_ks->keymap[0]); in davinci_ks_probe()
247 key_dev->keycodemax = davinci_ks->pdata->keymapsize; in davinci_ks_probe()
249 error = input_register_device(davinci_ks->input); in davinci_ks_probe()
251 dev_err(dev, "unable to register davinci key scan device\n"); in davinci_ks_probe()
255 error = request_irq(davinci_ks->irq, davinci_ks_interrupt, in davinci_ks_probe()
256 0, pdev->name, davinci_ks); in davinci_ks_probe()
258 dev_err(dev, "unable to register davinci key scan interrupt\n"); in davinci_ks_probe()
264 dev_err(dev, "unable to initialize davinci key scan device\n"); in davinci_ks_probe()
272 free_irq(davinci_ks->irq, davinci_ks); in davinci_ks_probe()
274 input_unregister_device(davinci_ks->input); in davinci_ks_probe()
277 iounmap(davinci_ks->base); in davinci_ks_probe()
279 release_mem_region(davinci_ks->pbase, davinci_ks->base_size); in davinci_ks_probe()
292 free_irq(davinci_ks->irq, davinci_ks); in davinci_ks_remove()
294 input_unregister_device(davinci_ks->input); in davinci_ks_remove()
296 iounmap(davinci_ks->base); in davinci_ks_remove()
297 release_mem_region(davinci_ks->pbase, davinci_ks->base_size); in davinci_ks_remove()
314 MODULE_DESCRIPTION("Texas Instruments DaVinci Key Scan Driver");