Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[pandora-kernel.git] / drivers / input / keyboard / nomadik-ske-keypad.c
1 /*
2  * Copyright (C) ST-Ericsson SA 2010
3  *
4  * Author: Naveen Kumar G <naveen.gaddipati@stericsson.com> for ST-Ericsson
5  * Author: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson
6  *
7  * License terms:GNU General Public License (GPL) version 2
8  *
9  * Keypad controller driver for the SKE (Scroll Key Encoder) module used in
10  * the Nomadik 8815 and Ux500 platforms.
11  */
12
13 #include <linux/platform_device.h>
14 #include <linux/interrupt.h>
15 #include <linux/spinlock.h>
16 #include <linux/io.h>
17 #include <linux/delay.h>
18 #include <linux/input.h>
19 #include <linux/slab.h>
20 #include <linux/clk.h>
21
22 #include <plat/ske.h>
23
24 /* SKE_CR bits */
25 #define SKE_KPMLT       (0x1 << 6)
26 #define SKE_KPCN        (0x7 << 3)
27 #define SKE_KPASEN      (0x1 << 2)
28 #define SKE_KPASON      (0x1 << 7)
29
30 /* SKE_IMSC bits */
31 #define SKE_KPIMA       (0x1 << 2)
32
33 /* SKE_ICR bits */
34 #define SKE_KPICS       (0x1 << 3)
35 #define SKE_KPICA       (0x1 << 2)
36
37 /* SKE_RIS bits */
38 #define SKE_KPRISA      (0x1 << 2)
39
40 #define SKE_KEYPAD_ROW_SHIFT    3
41 #define SKE_KPD_KEYMAP_SIZE     (8 * 8)
42
43 /* keypad auto scan registers */
44 #define SKE_ASR0        0x20
45 #define SKE_ASR1        0x24
46 #define SKE_ASR2        0x28
47 #define SKE_ASR3        0x2C
48
49 #define SKE_NUM_ASRX_REGISTERS  (4)
50
51 /**
52  * struct ske_keypad  - data structure used by keypad driver
53  * @irq:        irq no
54  * @reg_base:   ske regsiters base address
55  * @input:      pointer to input device object
56  * @board:      keypad platform device
57  * @keymap:     matrix scan code table for keycodes
58  * @clk:        clock structure pointer
59  */
60 struct ske_keypad {
61         int irq;
62         void __iomem *reg_base;
63         struct input_dev *input;
64         const struct ske_keypad_platform_data *board;
65         unsigned short keymap[SKE_KPD_KEYMAP_SIZE];
66         struct clk *clk;
67         spinlock_t ske_keypad_lock;
68 };
69
70 static void ske_keypad_set_bits(struct ske_keypad *keypad, u16 addr,
71                 u8 mask, u8 data)
72 {
73         u32 ret;
74
75         spin_lock(&keypad->ske_keypad_lock);
76
77         ret = readl(keypad->reg_base + addr);
78         ret &= ~mask;
79         ret |= data;
80         writel(ret, keypad->reg_base + addr);
81
82         spin_unlock(&keypad->ske_keypad_lock);
83 }
84
85 /*
86  * ske_keypad_chip_init: init keypad controller configuration
87  *
88  * Enable Multi key press detection, auto scan mode
89  */
90 static int __devinit ske_keypad_chip_init(struct ske_keypad *keypad)
91 {
92         u32 value;
93         int timeout = 50;
94
95         /* check SKE_RIS to be 0 */
96         while ((readl(keypad->reg_base + SKE_RIS) != 0x00000000) && timeout--)
97                 cpu_relax();
98
99         if (!timeout)
100                 return -EINVAL;
101
102         /*
103          * set debounce value
104          * keypad dbounce is configured in DBCR[15:8]
105          * dbounce value in steps of 32/32.768 ms
106          */
107         spin_lock(&keypad->ske_keypad_lock);
108         value = readl(keypad->reg_base + SKE_DBCR);
109         value = value & 0xff;
110         value |= ((keypad->board->debounce_ms * 32000)/32768) << 8;
111         writel(value, keypad->reg_base + SKE_DBCR);
112         spin_unlock(&keypad->ske_keypad_lock);
113
114         /* enable multi key detection */
115         ske_keypad_set_bits(keypad, SKE_CR, 0x0, SKE_KPMLT);
116
117         /*
118          * set up the number of columns
119          * KPCN[5:3] defines no. of keypad columns to be auto scanned
120          */
121         value = (keypad->board->kcol - 1) << 3;
122         ske_keypad_set_bits(keypad, SKE_CR, SKE_KPCN, value);
123
124         /* clear keypad interrupt for auto(and pending SW) scans */
125         ske_keypad_set_bits(keypad, SKE_ICR, 0x0, SKE_KPICA | SKE_KPICS);
126
127         /* un-mask keypad interrupts */
128         ske_keypad_set_bits(keypad, SKE_IMSC, 0x0, SKE_KPIMA);
129
130         /* enable automatic scan */
131         ske_keypad_set_bits(keypad, SKE_CR, 0x0, SKE_KPASEN);
132
133         return 0;
134 }
135
136 static void ske_keypad_read_data(struct ske_keypad *keypad)
137 {
138         struct input_dev *input = keypad->input;
139         u16 status;
140         int col = 0, row = 0, code;
141         int ske_asr, ske_ris, key_pressed, i;
142
143         /*
144          * Read the auto scan registers
145          *
146          * Each SKE_ASRx (x=0 to x=3) contains two row values.
147          * lower byte contains row value for column 2*x,
148          * upper byte contains row value for column 2*x + 1
149          */
150         for (i = 0; i < SKE_NUM_ASRX_REGISTERS; i++) {
151                 ske_asr = readl(keypad->reg_base + SKE_ASR0 + (4 * i));
152                 if (!ske_asr)
153                         continue;
154
155                 /* now that ASRx is zero, find out the column x and row y*/
156                 if (ske_asr & 0xff) {
157                         col = i * 2;
158                         status = ske_asr & 0xff;
159                 } else {
160                         col = (i * 2) + 1;
161                         status = (ske_asr & 0xff00) >> 8;
162                 }
163
164                 /* find out the row */
165                 row = __ffs(status);
166
167                 code = MATRIX_SCAN_CODE(row, col, SKE_KEYPAD_ROW_SHIFT);
168                 ske_ris = readl(keypad->reg_base + SKE_RIS);
169                 key_pressed = ske_ris & SKE_KPRISA;
170
171                 input_event(input, EV_MSC, MSC_SCAN, code);
172                 input_report_key(input, keypad->keymap[code], key_pressed);
173                 input_sync(input);
174         }
175 }
176
177 static irqreturn_t ske_keypad_irq(int irq, void *dev_id)
178 {
179         struct ske_keypad *keypad = dev_id;
180         int retries = 20;
181
182         /* disable auto scan interrupt; mask the interrupt generated */
183         ske_keypad_set_bits(keypad, SKE_IMSC, ~SKE_KPIMA, 0x0);
184         ske_keypad_set_bits(keypad, SKE_ICR, 0x0, SKE_KPICA);
185
186         while ((readl(keypad->reg_base + SKE_CR) & SKE_KPASON) && --retries)
187                 msleep(5);
188
189         if (retries) {
190                 /* SKEx registers are stable and can be read */
191                 ske_keypad_read_data(keypad);
192         }
193
194         /* enable auto scan interrupts */
195         ske_keypad_set_bits(keypad, SKE_IMSC, 0x0, SKE_KPIMA);
196
197         return IRQ_HANDLED;
198 }
199
200 static int __devinit ske_keypad_probe(struct platform_device *pdev)
201 {
202         const struct ske_keypad_platform_data *plat = pdev->dev.platform_data;
203         struct ske_keypad *keypad;
204         struct input_dev *input;
205         struct resource *res;
206         int irq;
207         int error;
208
209         if (!plat) {
210                 dev_err(&pdev->dev, "invalid keypad platform data\n");
211                 return -EINVAL;
212         }
213
214         irq = platform_get_irq(pdev, 0);
215         if (irq < 0) {
216                 dev_err(&pdev->dev, "failed to get keypad irq\n");
217                 return -EINVAL;
218         }
219
220         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
221         if (!res) {
222                 dev_err(&pdev->dev, "missing platform resources\n");
223                 return -EINVAL;
224         }
225
226         keypad = kzalloc(sizeof(struct ske_keypad), GFP_KERNEL);
227         input = input_allocate_device();
228         if (!keypad || !input) {
229                 dev_err(&pdev->dev, "failed to allocate keypad memory\n");
230                 error = -ENOMEM;
231                 goto err_free_mem;
232         }
233
234         keypad->irq = irq;
235         keypad->board = plat;
236         keypad->input = input;
237         spin_lock_init(&keypad->ske_keypad_lock);
238
239         if (!request_mem_region(res->start, resource_size(res), pdev->name)) {
240                 dev_err(&pdev->dev, "failed to request I/O memory\n");
241                 error = -EBUSY;
242                 goto err_free_mem;
243         }
244
245         keypad->reg_base = ioremap(res->start, resource_size(res));
246         if (!keypad->reg_base) {
247                 dev_err(&pdev->dev, "failed to remap I/O memory\n");
248                 error = -ENXIO;
249                 goto err_free_mem_region;
250         }
251
252         keypad->clk = clk_get(&pdev->dev, NULL);
253         if (IS_ERR(keypad->clk)) {
254                 dev_err(&pdev->dev, "failed to get clk\n");
255                 error = PTR_ERR(keypad->clk);
256                 goto err_iounmap;
257         }
258
259         input->id.bustype = BUS_HOST;
260         input->name = "ux500-ske-keypad";
261         input->dev.parent = &pdev->dev;
262
263         input->keycode = keypad->keymap;
264         input->keycodesize = sizeof(keypad->keymap[0]);
265         input->keycodemax = ARRAY_SIZE(keypad->keymap);
266
267         input_set_capability(input, EV_MSC, MSC_SCAN);
268
269         __set_bit(EV_KEY, input->evbit);
270         if (!plat->no_autorepeat)
271                 __set_bit(EV_REP, input->evbit);
272
273         matrix_keypad_build_keymap(plat->keymap_data, SKE_KEYPAD_ROW_SHIFT,
274                         input->keycode, input->keybit);
275
276         clk_enable(keypad->clk);
277
278         /* go through board initialization helpers */
279         if (keypad->board->init)
280                 keypad->board->init();
281
282         error = ske_keypad_chip_init(keypad);
283         if (error) {
284                 dev_err(&pdev->dev, "unable to init keypad hardware\n");
285                 goto err_clk_disable;
286         }
287
288         error = request_threaded_irq(keypad->irq, NULL, ske_keypad_irq,
289                                      IRQF_ONESHOT, "ske-keypad", keypad);
290         if (error) {
291                 dev_err(&pdev->dev, "allocate irq %d failed\n", keypad->irq);
292                 goto err_clk_disable;
293         }
294
295         error = input_register_device(input);
296         if (error) {
297                 dev_err(&pdev->dev,
298                                 "unable to register input device: %d\n", error);
299                 goto err_free_irq;
300         }
301
302         if (plat->wakeup_enable)
303                 device_init_wakeup(&pdev->dev, true);
304
305         platform_set_drvdata(pdev, keypad);
306
307         return 0;
308
309 err_free_irq:
310         free_irq(keypad->irq, keypad);
311 err_clk_disable:
312         clk_disable(keypad->clk);
313         clk_put(keypad->clk);
314 err_iounmap:
315         iounmap(keypad->reg_base);
316 err_free_mem_region:
317         release_mem_region(res->start, resource_size(res));
318 err_free_mem:
319         input_free_device(input);
320         kfree(keypad);
321         return error;
322 }
323
324 static int __devexit ske_keypad_remove(struct platform_device *pdev)
325 {
326         struct ske_keypad *keypad = platform_get_drvdata(pdev);
327         struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
328
329         free_irq(keypad->irq, keypad);
330
331         input_unregister_device(keypad->input);
332
333         clk_disable(keypad->clk);
334         clk_put(keypad->clk);
335
336         if (keypad->board->exit)
337                 keypad->board->exit();
338
339         iounmap(keypad->reg_base);
340         release_mem_region(res->start, resource_size(res));
341         kfree(keypad);
342
343         return 0;
344 }
345
346 #ifdef CONFIG_PM
347 static int ske_keypad_suspend(struct device *dev)
348 {
349         struct platform_device *pdev = to_platform_device(dev);
350         struct ske_keypad *keypad = platform_get_drvdata(pdev);
351         int irq = platform_get_irq(pdev, 0);
352
353         if (device_may_wakeup(dev))
354                 enable_irq_wake(irq);
355         else
356                 ske_keypad_set_bits(keypad, SKE_IMSC, ~SKE_KPIMA, 0x0);
357
358         return 0;
359 }
360
361 static int ske_keypad_resume(struct device *dev)
362 {
363         struct platform_device *pdev = to_platform_device(dev);
364         struct ske_keypad *keypad = platform_get_drvdata(pdev);
365         int irq = platform_get_irq(pdev, 0);
366
367         if (device_may_wakeup(dev))
368                 disable_irq_wake(irq);
369         else
370                 ske_keypad_set_bits(keypad, SKE_IMSC, 0x0, SKE_KPIMA);
371
372         return 0;
373 }
374
375 static const struct dev_pm_ops ske_keypad_dev_pm_ops = {
376         .suspend = ske_keypad_suspend,
377         .resume = ske_keypad_resume,
378 };
379 #endif
380
381 struct platform_driver ske_keypad_driver = {
382         .driver = {
383                 .name = "nmk-ske-keypad",
384                 .owner  = THIS_MODULE,
385 #ifdef CONFIG_PM
386                 .pm = &ske_keypad_dev_pm_ops,
387 #endif
388         },
389         .probe = ske_keypad_probe,
390         .remove = __devexit_p(ske_keypad_remove),
391 };
392
393 static int __init ske_keypad_init(void)
394 {
395         return platform_driver_probe(&ske_keypad_driver, ske_keypad_probe);
396 }
397 module_init(ske_keypad_init);
398
399 static void __exit ske_keypad_exit(void)
400 {
401         platform_driver_unregister(&ske_keypad_driver);
402 }
403 module_exit(ske_keypad_exit);
404
405 MODULE_LICENSE("GPL v2");
406 MODULE_AUTHOR("Naveen Kumar <naveen.gaddipati@stericsson.com> / Sundar Iyer <sundar.iyer@stericsson.com>");
407 MODULE_DESCRIPTION("Nomadik Scroll-Key-Encoder Keypad Driver");
408 MODULE_ALIAS("platform:nomadik-ske-keypad");