blob: 9c7588ef40a57bfa320264fce24d949ed4256674 [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/* Copyright (c) 2009-2010, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#include <linux/module.h>
15#include <linux/platform_device.h>
16#include <linux/kernel.h>
17#include <linux/interrupt.h>
18#include <linux/input.h>
19#include <linux/bitops.h>
20#include <linux/mfd/pmic8058.h>
21#include <linux/delay.h>
22#include <linux/mutex.h>
23#include <linux/slab.h>
24#include <linux/pm.h>
25#include <linux/pm_runtime.h>
26
27#include <linux/input/pmic8058-keypad.h>
28
29#define PM8058_MAX_ROWS 18
30#define PM8058_MAX_COLS 8
31#define PM8058_ROW_SHIFT 3
32#define PM8058_MATRIX_MAX_SIZE (PM8058_MAX_ROWS * PM8058_MAX_COLS)
33
34#define PM8058_MIN_ROWS 5
35#define PM8058_MIN_COLS 5
36
37#define MAX_SCAN_DELAY 128
38#define MIN_SCAN_DELAY 1
39
40/* in nanoseconds */
41#define MAX_ROW_HOLD_DELAY 122000
42#define MIN_ROW_HOLD_DELAY 30500
43
44#define MAX_DEBOUNCE_B0_TIME 20
45#define MIN_DEBOUNCE_B0_TIME 5
46
47#define MAX_DEBOUNCE_A0_TIME 8
48#define MIN_DEBOUNCE_A0_TIME 1
49
50#define KEYP_CTRL 0x148
51
52#define KEYP_CTRL_EVNTS BIT(0)
53#define KEYP_CTRL_EVNTS_MASK 0x3
54
55#define KEYP_CTRL_SCAN_COLS_SHIFT 5
56#define KEYP_CTRL_SCAN_COLS_MIN 5
57#define KEYP_CTRL_SCAN_COLS_BITS 0x3
58
59#define KEYP_CTRL_SCAN_ROWS_SHIFT 2
60#define KEYP_CTRL_SCAN_ROWS_MIN 5
61#define KEYP_CTRL_SCAN_ROWS_BITS 0x7
62
63#define KEYP_CTRL_KEYP_EN BIT(7)
64
65#define KEYP_SCAN 0x149
66
67#define KEYP_SCAN_READ_STATE BIT(0)
68#define KEYP_SCAN_DBOUNCE_SHIFT 1
69#define KEYP_SCAN_PAUSE_SHIFT 3
70#define KEYP_SCAN_ROW_HOLD_SHIFT 6
71
72#define KEYP_TEST 0x14A
73
74#define KEYP_TEST_CLEAR_RECENT_SCAN BIT(6)
75#define KEYP_TEST_CLEAR_OLD_SCAN BIT(5)
76#define KEYP_TEST_READ_RESET BIT(4)
77#define KEYP_TEST_DTEST_EN BIT(3)
78#define KEYP_TEST_ABORT_READ BIT(0)
79
80#define KEYP_TEST_DBG_SELECT_SHIFT 1
81
82/* bits of these register represent
83 * '0' for key press
84 * '1' for key release
85 */
86#define KEYP_RECENT_DATA 0x14B
87#define KEYP_OLD_DATA 0x14C
88
89#define KEYP_CLOCK_FREQ 32768
90
91/* Internal flags */
92#define KEYF_FIX_LAST_ROW 0x01
93
94
95/* ---------------------------------------------------------------------*/
96struct pmic8058_kp {
97 const struct pmic8058_keypad_data *pdata;
98 struct input_dev *input;
99 int key_sense_irq;
100 int key_stuck_irq;
101
102 unsigned short *keycodes;
103
104 struct device *dev;
105 u16 keystate[PM8058_MAX_ROWS];
106 u16 stuckstate[PM8058_MAX_ROWS];
107
108 u32 flags;
109 struct pm8058_chip *pm_chip;
110
111 /* protect read/write */
112 struct mutex mutex;
113 bool user_disabled;
114 u32 disable_depth;
115
116 u8 ctrl_reg;
117};
118
119static int pmic8058_kp_write_u8(struct pmic8058_kp *kp,
120 u8 data, u16 reg)
121{
122 int rc;
123
124 rc = pm8058_write(kp->pm_chip, reg, &data, 1);
125 if (rc < 0)
126 dev_warn(kp->dev, "Error writing pmic8058: %X - ret %X\n",
127 reg, rc);
128 return rc;
129}
130
131static int pmic8058_kp_read(struct pmic8058_kp *kp,
132 u8 *data, u16 reg, unsigned num_bytes)
133{
134 int rc;
135
136 rc = pm8058_read(kp->pm_chip, reg, data, num_bytes);
137 if (rc < 0)
138 dev_warn(kp->dev, "Error reading pmic8058: %X - ret %X\n",
139 reg, rc);
140
141 return rc;
142}
143
144static int pmic8058_kp_read_u8(struct pmic8058_kp *kp,
145 u8 *data, u16 reg)
146{
147 int rc;
148
149 rc = pmic8058_kp_read(kp, data, reg, 1);
150 if (rc < 0)
151 dev_warn(kp->dev, "Error reading pmic8058: %X - ret %X\n",
152 reg, rc);
153 return rc;
154}
155
156static u8 pmic8058_col_state(struct pmic8058_kp *kp, u8 col)
157{
158 /* all keys pressed on that particular row? */
159 if (col == 0x00)
160 return 1 << kp->pdata->num_cols;
161 else
162 return col & ((1 << kp->pdata->num_cols) - 1);
163}
164/* REVISIT: just for debugging, will be removed in final working version */
165static void __dump_kp_regs(struct pmic8058_kp *kp, char *msg)
166{
167 u8 temp;
168
169 dev_dbg(kp->dev, "%s\n", msg);
170
171 pmic8058_kp_read_u8(kp, &temp, KEYP_CTRL);
172 dev_dbg(kp->dev, "KEYP_CTRL - %X\n", temp);
173 pmic8058_kp_read_u8(kp, &temp, KEYP_SCAN);
174 dev_dbg(kp->dev, "KEYP_SCAN - %X\n", temp);
175 pmic8058_kp_read_u8(kp, &temp, KEYP_TEST);
176 dev_dbg(kp->dev, "KEYP_TEST - %X\n", temp);
177}
178
179/* H/W constraint:
180 * One should read recent/old data registers equal to the
181 * number of columns programmed in the keyp_control register,
182 * otherwise h/w state machine may get stuck. In order to avoid this
183 * situation one should check readstate bit in keypad scan
184 * register to be '0' at the end of data read, to make sure
185 * the keypad state machine is not in READ state.
186 */
187static int pmic8058_chk_read_state(struct pmic8058_kp *kp, u16 data_reg)
188{
189 u8 temp, scan_val;
190 int retries = 10, rc;
191
192 do {
193 rc = pmic8058_kp_read_u8(kp, &scan_val, KEYP_SCAN);
194 if (scan_val & 0x1)
195 rc = pmic8058_kp_read_u8(kp, &temp, data_reg);
196 } while ((scan_val & 0x1) && (--retries > 0));
197
198 if (retries == 0)
199 dev_dbg(kp->dev, "Unable to clear read state bit\n");
200
201 return 0;
202}
203/*
204 * Synchronous read protocol for RevB0 onwards:
205 *
206 * 1. Write '1' to ReadState bit in KEYP_SCAN register
207 * 2. Wait 2*32KHz clocks, so that HW can successfully enter read mode
208 * synchronously
209 * 3. Read rows in old array first if events are more than one
210 * 4. Read rows in recent array
211 * 5. Wait 4*32KHz clocks
212 * 6. Write '0' to ReadState bit of KEYP_SCAN register so that hw can
213 * synchronously exit read mode.
214 */
215static int pmic8058_chk_sync_read(struct pmic8058_kp *kp)
216{
217 int rc;
218 u8 scan_val;
219
220 rc = pmic8058_kp_read_u8(kp, &scan_val, KEYP_SCAN);
221 scan_val |= 0x1;
222 rc = pmic8058_kp_write_u8(kp, scan_val, KEYP_SCAN);
223
224 /* 2 * 32KHz clocks */
225 udelay((2 * USEC_PER_SEC / KEYP_CLOCK_FREQ) + 1);
226
227 return rc;
228}
229
230static int pmic8058_kp_read_data(struct pmic8058_kp *kp, u16 *state,
231 u16 data_reg, int read_rows)
232{
233 int rc, row;
234 u8 new_data[PM8058_MAX_ROWS];
235
236 rc = pmic8058_kp_read(kp, new_data, data_reg, read_rows);
237
238 if (!rc) {
239 if (pm8058_rev(kp->pm_chip) == PM_8058_REV_1p0)
240 pmic8058_chk_read_state(kp, data_reg);
241 for (row = 0; row < kp->pdata->num_rows; row++) {
242 dev_dbg(kp->dev, "new_data[%d] = %d\n", row,
243 new_data[row]);
244 state[row] = pmic8058_col_state(kp, new_data[row]);
245 }
246 }
247
248 return rc;
249}
250
251static int pmic8058_kp_read_matrix(struct pmic8058_kp *kp, u16 *new_state,
252 u16 *old_state)
253{
254 int rc, read_rows;
255 u8 scan_val;
256 static u8 rows[] = {
257 5, 6, 7, 8, 10, 10, 12, 12, 15, 15, 15, 18, 18, 18
258 };
259
260 if (kp->flags & KEYF_FIX_LAST_ROW &&
261 (kp->pdata->num_rows != PM8058_MAX_ROWS))
262 read_rows = rows[kp->pdata->num_rows - KEYP_CTRL_SCAN_ROWS_MIN
263 + 1];
264 else
265 read_rows = kp->pdata->num_rows;
266
267 if (pm8058_rev(kp->pm_chip) > PM_8058_REV_1p0)
268 pmic8058_chk_sync_read(kp);
269
270 if (old_state)
271 rc = pmic8058_kp_read_data(kp, old_state, KEYP_OLD_DATA,
272 read_rows);
273
274 rc = pmic8058_kp_read_data(kp, new_state, KEYP_RECENT_DATA,
275 read_rows);
276
277 if (pm8058_rev(kp->pm_chip) > PM_8058_REV_1p0) {
278 /* 4 * 32KHz clocks */
279 udelay((4 * USEC_PER_SEC / KEYP_CLOCK_FREQ) + 1);
280
281 rc = pmic8058_kp_read(kp, &scan_val, KEYP_SCAN, 1);
282 scan_val &= 0xFE;
283 rc = pmic8058_kp_write_u8(kp, scan_val, KEYP_SCAN);
284 }
285
286 return rc;
287}
288
289static int __pmic8058_kp_scan_matrix(struct pmic8058_kp *kp, u16 *new_state,
290 u16 *old_state)
291{
292 int row, col, code;
293
294 for (row = 0; row < kp->pdata->num_rows; row++) {
295 int bits_changed = new_state[row] ^ old_state[row];
296
297 if (!bits_changed)
298 continue;
299
300 for (col = 0; col < kp->pdata->num_cols; col++) {
301 if (!(bits_changed & (1 << col)))
302 continue;
303
304 dev_dbg(kp->dev, "key [%d:%d] %s\n", row, col,
305 !(new_state[row] & (1 << col)) ?
306 "pressed" : "released");
307
308 code = MATRIX_SCAN_CODE(row, col, PM8058_ROW_SHIFT);
309 input_event(kp->input, EV_MSC, MSC_SCAN, code);
310 input_report_key(kp->input,
311 kp->keycodes[code],
312 !(new_state[row] & (1 << col)));
313
314 input_sync(kp->input);
315 }
316 }
317
318 return 0;
319}
320
321static int pmic8058_detect_ghost_keys(struct pmic8058_kp *kp, u16 *new_state)
322{
323 int row, found_first = -1;
324 u16 check, row_state;
325
326 check = 0;
327 for (row = 0; row < kp->pdata->num_rows; row++) {
328 row_state = (~new_state[row]) &
329 ((1 << kp->pdata->num_cols) - 1);
330
331 if (hweight16(row_state) > 1) {
332 if (found_first == -1)
333 found_first = row;
334 if (check & row_state) {
335 dev_dbg(kp->dev, "detected ghost key on row[%d]"
336 "row[%d]\n", found_first, row);
337 return 1;
338 }
339 }
340 check |= row_state;
341 }
342 return 0;
343}
344
345static int pmic8058_kp_scan_matrix(struct pmic8058_kp *kp, unsigned int events)
346{
347 u16 new_state[PM8058_MAX_ROWS];
348 u16 old_state[PM8058_MAX_ROWS];
349 int rc;
350
351 switch (events) {
352 case 0x1:
353 rc = pmic8058_kp_read_matrix(kp, new_state, NULL);
354 if (pmic8058_detect_ghost_keys(kp, new_state))
355 return -EINVAL;
356 __pmic8058_kp_scan_matrix(kp, new_state, kp->keystate);
357 memcpy(kp->keystate, new_state, sizeof(new_state));
358 break;
359 case 0x3: /* two events - eventcounter is gray-coded */
360 rc = pmic8058_kp_read_matrix(kp, new_state, old_state);
361 __pmic8058_kp_scan_matrix(kp, old_state, kp->keystate);
362 __pmic8058_kp_scan_matrix(kp, new_state, old_state);
363 memcpy(kp->keystate, new_state, sizeof(new_state));
364 break;
365 case 0x2:
366 dev_dbg(kp->dev, "Some key events are missed\n");
367 rc = pmic8058_kp_read_matrix(kp, new_state, old_state);
368 __pmic8058_kp_scan_matrix(kp, old_state, kp->keystate);
369 __pmic8058_kp_scan_matrix(kp, new_state, old_state);
370 memcpy(kp->keystate, new_state, sizeof(new_state));
371 break;
372 default:
373 rc = -1;
374 }
375 return rc;
376}
377
378static inline int pmic8058_kp_disabled(struct pmic8058_kp *kp)
379{
380 return kp->disable_depth != 0;
381}
382
383static void pmic8058_kp_enable(struct pmic8058_kp *kp)
384{
385 if (!pmic8058_kp_disabled(kp))
386 return;
387
388 if (--kp->disable_depth == 0) {
389
390 kp->ctrl_reg |= KEYP_CTRL_KEYP_EN;
391 pmic8058_kp_write_u8(kp, kp->ctrl_reg, KEYP_CTRL);
392
393 enable_irq(kp->key_sense_irq);
394 enable_irq(kp->key_stuck_irq);
395 }
396}
397
398static void pmic8058_kp_disable(struct pmic8058_kp *kp)
399{
400 if (kp->disable_depth++ == 0) {
401 disable_irq(kp->key_sense_irq);
402 disable_irq(kp->key_stuck_irq);
403
404 kp->ctrl_reg &= ~KEYP_CTRL_KEYP_EN;
405 pmic8058_kp_write_u8(kp, kp->ctrl_reg, KEYP_CTRL);
406 }
407}
408
409static ssize_t pmic8058_kp_disable_show(struct device *dev,
410 struct device_attribute *attr,
411 char *buf)
412{
413 struct pmic8058_kp *kp = dev_get_drvdata(dev);
414
415 return sprintf(buf, "%u\n", pmic8058_kp_disabled(kp));
416}
417
418static ssize_t pmic8058_kp_disable_store(struct device *dev,
419 struct device_attribute *attr,
420 const char *buf, size_t count)
421{
422 struct pmic8058_kp *kp = dev_get_drvdata(dev);
423 long i = 0;
424 int rc;
425
426 rc = strict_strtoul(buf, 10, &i);
427 if (rc)
428 return -EINVAL;
429
430 i = !!i;
431
432 mutex_lock(&kp->mutex);
433 if (i == kp->user_disabled) {
434 mutex_unlock(&kp->mutex);
435 return count;
436 }
437
438 kp->user_disabled = i;
439
440 if (i)
441 pmic8058_kp_disable(kp);
442 else
443 pmic8058_kp_enable(kp);
444 mutex_unlock(&kp->mutex);
445
446 return count;
447}
448
449static DEVICE_ATTR(disable_kp, 0664, pmic8058_kp_disable_show,
450 pmic8058_kp_disable_store);
451
452
453/*
454 * NOTE: We are reading recent and old data registers blindly
455 * whenever key-stuck interrupt happens, because events counter doesn't
456 * get updated when this interrupt happens due to key stuck doesn't get
457 * considered as key state change.
458 *
459 * We are not using old data register contents after they are being read
460 * because it might report the key which was pressed before the key being stuck
461 * as stuck key because it's pressed status is stored in the old data
462 * register.
463 */
464static irqreturn_t pmic8058_kp_stuck_irq(int irq, void *data)
465{
466 u16 new_state[PM8058_MAX_ROWS];
467 u16 old_state[PM8058_MAX_ROWS];
468 int rc;
469 struct pmic8058_kp *kp = data;
470
471 rc = pmic8058_kp_read_matrix(kp, new_state, old_state);
472 __pmic8058_kp_scan_matrix(kp, new_state, kp->stuckstate);
473
474 return IRQ_HANDLED;
475}
476
477/*
478 * NOTE: Any row multiple interrupt issue - PMIC4 Rev A0
479 *
480 * If the S/W responds to the key-event interrupt too early and reads the
481 * recent data, the keypad FSM will mistakenly go to the IDLE state, instead
482 * of the scan pause state as it is supposed too. Since the key is still
483 * pressed, the keypad scanner will go through the debounce, scan, and generate
484 * another key event interrupt. The workaround for this issue is to add delay
485 * of 1ms between servicing the key event interrupt and reading the recent data.
486 */
487static irqreturn_t pmic8058_kp_irq(int irq, void *data)
488{
489 struct pmic8058_kp *kp = data;
490 u8 ctrl_val, events;
491 int rc;
492
493 if (pm8058_rev(kp->pm_chip) == PM_8058_REV_1p0)
494 mdelay(1);
495
496 dev_dbg(kp->dev, "key sense irq\n");
497 __dump_kp_regs(kp, "pmic8058_kp_irq");
498
499 rc = pmic8058_kp_read(kp, &ctrl_val, KEYP_CTRL, 1);
500 events = ctrl_val & KEYP_CTRL_EVNTS_MASK;
501
502 rc = pmic8058_kp_scan_matrix(kp, events);
503
504 return IRQ_HANDLED;
505}
506/*
507 * NOTE: Last row multi-interrupt issue
508 *
509 * In PMIC Rev A0, if any key in the last row of the keypad matrix
510 * is pressed and held, the H/W keeps on generating interrupts.
511 * Software work-arounds it by programming the keypad controller next level
512 * up rows (for 8x12 matrix it is 15 rows) so the keypad controller
513 * thinks of more-rows than the actual ones, so the actual last-row
514 * in the matrix won't generate multiple interrupts.
515 */
516static int pmic8058_kpd_init(struct pmic8058_kp *kp)
517{
518 int bits, rc, cycles;
519 u8 scan_val = 0, ctrl_val = 0;
520 static u8 row_bits[] = {
521 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7,
522 };
523
524 /* Find column bits */
525 if (kp->pdata->num_cols < KEYP_CTRL_SCAN_COLS_MIN)
526 bits = 0;
527 else
528 bits = kp->pdata->num_cols - KEYP_CTRL_SCAN_COLS_MIN;
529 ctrl_val = (bits & KEYP_CTRL_SCAN_COLS_BITS) <<
530 KEYP_CTRL_SCAN_COLS_SHIFT;
531
532 /* Find row bits */
533 if (kp->pdata->num_rows < KEYP_CTRL_SCAN_ROWS_MIN)
534 bits = 0;
535 else if (kp->pdata->num_rows > PM8058_MAX_ROWS)
536 bits = KEYP_CTRL_SCAN_ROWS_BITS;
537 else
538 bits = row_bits[kp->pdata->num_rows - KEYP_CTRL_SCAN_ROWS_MIN];
539
540 /* Use max rows to fix last row problem if actual rows are less */
541 if (kp->flags & KEYF_FIX_LAST_ROW &&
542 (kp->pdata->num_rows != PM8058_MAX_ROWS))
543 bits = row_bits[kp->pdata->num_rows - KEYP_CTRL_SCAN_ROWS_MIN
544 + 1];
545
546 ctrl_val |= (bits << KEYP_CTRL_SCAN_ROWS_SHIFT);
547
548 rc = pmic8058_kp_write_u8(kp, ctrl_val, KEYP_CTRL);
549
550 if (pm8058_rev(kp->pm_chip) == PM_8058_REV_1p0)
551 bits = fls(kp->pdata->debounce_ms[0]) - 1;
552 else
553 bits = (kp->pdata->debounce_ms[1] / 5) - 1;
554
555 scan_val |= (bits << KEYP_SCAN_DBOUNCE_SHIFT);
556
557 bits = fls(kp->pdata->scan_delay_ms) - 1;
558 scan_val |= (bits << KEYP_SCAN_PAUSE_SHIFT);
559
560 /* Row hold time is a multiple of 32KHz cycles. */
561 cycles = (kp->pdata->row_hold_ns * KEYP_CLOCK_FREQ) / NSEC_PER_SEC;
562
563 scan_val |= (cycles << KEYP_SCAN_ROW_HOLD_SHIFT);
564
565 rc = pmic8058_kp_write_u8(kp, scan_val, KEYP_SCAN);
566
567 return rc;
568}
569
570static int pm8058_kp_config_drv(int gpio_start, int num_gpios)
571{
572 int rc;
573 struct pm8058_gpio kypd_drv = {
574 .direction = PM_GPIO_DIR_OUT,
575 .output_buffer = PM_GPIO_OUT_BUF_OPEN_DRAIN,
576 .output_value = 0,
577 .pull = PM_GPIO_PULL_NO,
578 .vin_sel = 2,
579 .out_strength = PM_GPIO_STRENGTH_LOW,
580 .function = PM_GPIO_FUNC_1,
581 .inv_int_pol = 1,
582 };
583
584 if (gpio_start < 0 || num_gpios < 0 || num_gpios > PM8058_GPIOS)
585 return -EINVAL;
586
587 while (num_gpios--) {
588 rc = pm8058_gpio_config(gpio_start++, &kypd_drv);
589 if (rc) {
590 pr_err("%s: FAIL pm8058_gpio_config(): rc=%d.\n",
591 __func__, rc);
592 return rc;
593 }
594 }
595
596 return 0;
597}
598
599static int pm8058_kp_config_sns(int gpio_start, int num_gpios)
600{
601 int rc;
602 struct pm8058_gpio kypd_sns = {
603 .direction = PM_GPIO_DIR_IN,
604 .pull = PM_GPIO_PULL_UP_31P5,
605 .vin_sel = 2,
606 .out_strength = PM_GPIO_STRENGTH_NO,
607 .function = PM_GPIO_FUNC_NORMAL,
608 .inv_int_pol = 1,
609 };
610
611 if (gpio_start < 0 || num_gpios < 0 || num_gpios > PM8058_GPIOS)
612 return -EINVAL;
613
614 while (num_gpios--) {
615 rc = pm8058_gpio_config(gpio_start++, &kypd_sns);
616 if (rc) {
617 pr_err("%s: FAIL pm8058_gpio_config(): rc=%d.\n",
618 __func__, rc);
619 return rc;
620 }
621 }
622
623 return 0;
624}
625
626/*
627 * keypad controller should be initialized in the following sequence
628 * only, otherwise it might get into FSM stuck state.
629 *
630 * - Initialize keypad control parameters, like no. of rows, columns,
631 * timing values etc.,
632 * - configure rows and column gpios pull up/down.
633 * - set irq edge type.
634 * - enable the keypad controller.
635 */
636static int __devinit pmic8058_kp_probe(struct platform_device *pdev)
637{
638 struct pmic8058_keypad_data *pdata = pdev->dev.platform_data;
639 const struct matrix_keymap_data *keymap_data;
640 struct pmic8058_kp *kp;
641 int rc;
642 unsigned short *keycodes;
643 u8 ctrl_val;
644 struct pm8058_chip *pm_chip;
645
646 pm_chip = dev_get_drvdata(pdev->dev.parent);
647 if (pm_chip == NULL) {
648 dev_err(&pdev->dev, "no parent data passed in\n");
649 return -EFAULT;
650 }
651
652 if (!pdata || !pdata->num_cols || !pdata->num_rows ||
653 pdata->num_cols > PM8058_MAX_COLS ||
654 pdata->num_rows > PM8058_MAX_ROWS ||
655 pdata->num_cols < PM8058_MIN_COLS ||
656 pdata->num_rows < PM8058_MIN_ROWS) {
657 dev_err(&pdev->dev, "invalid platform data\n");
658 return -EINVAL;
659 }
660
661 if (pdata->rows_gpio_start < 0 || pdata->cols_gpio_start < 0) {
662 dev_err(&pdev->dev, "invalid gpio_start platform data\n");
663 return -EINVAL;
664 }
665
666 if (!pdata->scan_delay_ms || pdata->scan_delay_ms > MAX_SCAN_DELAY
667 || pdata->scan_delay_ms < MIN_SCAN_DELAY ||
668 !is_power_of_2(pdata->scan_delay_ms)) {
669 dev_err(&pdev->dev, "invalid keypad scan time supplied\n");
670 return -EINVAL;
671 }
672
673 if (!pdata->row_hold_ns || pdata->row_hold_ns > MAX_ROW_HOLD_DELAY
674 || pdata->row_hold_ns < MIN_ROW_HOLD_DELAY ||
675 ((pdata->row_hold_ns % MIN_ROW_HOLD_DELAY) != 0)) {
676 dev_err(&pdev->dev, "invalid keypad row hold time supplied\n");
677 return -EINVAL;
678 }
679
680 if (pm8058_rev(pm_chip) == PM_8058_REV_1p0) {
681 if (!pdata->debounce_ms
682 || !is_power_of_2(pdata->debounce_ms[0])
683 || pdata->debounce_ms[0] > MAX_DEBOUNCE_A0_TIME
684 || pdata->debounce_ms[0] < MIN_DEBOUNCE_A0_TIME) {
685 dev_err(&pdev->dev, "invalid debounce time supplied\n");
686 return -EINVAL;
687 }
688 } else {
689 if (!pdata->debounce_ms
690 || ((pdata->debounce_ms[1] % 5) != 0)
691 || pdata->debounce_ms[1] > MAX_DEBOUNCE_B0_TIME
692 || pdata->debounce_ms[1] < MIN_DEBOUNCE_B0_TIME) {
693 dev_err(&pdev->dev, "invalid debounce time supplied\n");
694 return -EINVAL;
695 }
696 }
697
698 keymap_data = pdata->keymap_data;
699 if (!keymap_data) {
700 dev_err(&pdev->dev, "no keymap data supplied\n");
701 return -EINVAL;
702 }
703
704 kp = kzalloc(sizeof(*kp), GFP_KERNEL);
705 if (!kp)
706 return -ENOMEM;
707
708 keycodes = kzalloc(PM8058_MATRIX_MAX_SIZE * sizeof(*keycodes),
709 GFP_KERNEL);
710 if (!keycodes) {
711 rc = -ENOMEM;
712 goto err_alloc_mem;
713 }
714
715 platform_set_drvdata(pdev, kp);
716 mutex_init(&kp->mutex);
717
718 kp->pdata = pdata;
719 kp->dev = &pdev->dev;
720 kp->keycodes = keycodes;
721 kp->pm_chip = pm_chip;
722
723 if (pm8058_rev(pm_chip) == PM_8058_REV_1p0)
724 kp->flags |= KEYF_FIX_LAST_ROW;
725
726 kp->input = input_allocate_device();
727 if (!kp->input) {
728 dev_err(&pdev->dev, "unable to allocate input device\n");
729 rc = -ENOMEM;
730 goto err_alloc_device;
731 }
732
733 /* Enable runtime PM ops, start in ACTIVE mode */
734 rc = pm_runtime_set_active(&pdev->dev);
735 if (rc < 0)
736 dev_dbg(&pdev->dev, "unable to set runtime pm state\n");
737 pm_runtime_enable(&pdev->dev);
738
739 kp->key_sense_irq = platform_get_irq(pdev, 0);
740 if (kp->key_sense_irq < 0) {
741 dev_err(&pdev->dev, "unable to get keypad sense irq\n");
742 rc = -ENXIO;
743 goto err_get_irq;
744 }
745
746 kp->key_stuck_irq = platform_get_irq(pdev, 1);
747 if (kp->key_stuck_irq < 0) {
748 dev_err(&pdev->dev, "unable to get keypad stuck irq\n");
749 rc = -ENXIO;
750 goto err_get_irq;
751 }
752
753 if (pdata->input_name)
754 kp->input->name = pdata->input_name;
755 else
756 kp->input->name = "PMIC8058 keypad";
757
758 if (pdata->input_phys_device)
759 kp->input->phys = pdata->input_phys_device;
760 else
761 kp->input->phys = "pmic8058_keypad/input0";
762
763 kp->input->dev.parent = &pdev->dev;
764
765 kp->input->id.bustype = BUS_HOST;
766 kp->input->id.version = 0x0001;
767 kp->input->id.product = 0x0001;
768 kp->input->id.vendor = 0x0001;
769
770 kp->input->evbit[0] = BIT_MASK(EV_KEY);
771
772 if (pdata->rep)
773 __set_bit(EV_REP, kp->input->evbit);
774
775 kp->input->keycode = keycodes;
776 kp->input->keycodemax = PM8058_MATRIX_MAX_SIZE;
777 kp->input->keycodesize = sizeof(*keycodes);
778
779 matrix_keypad_build_keymap(keymap_data, PM8058_ROW_SHIFT,
780 kp->input->keycode, kp->input->keybit);
781
782 input_set_capability(kp->input, EV_MSC, MSC_SCAN);
783 input_set_drvdata(kp->input, kp);
784
785 rc = input_register_device(kp->input);
786 if (rc < 0) {
787 dev_err(&pdev->dev, "unable to register keypad input device\n");
788 goto err_get_irq;
789 }
790
791 /* initialize keypad state */
792 memset(kp->keystate, 0xff, sizeof(kp->keystate));
793 memset(kp->stuckstate, 0xff, sizeof(kp->stuckstate));
794
795 rc = pmic8058_kpd_init(kp);
796 if (rc < 0) {
797 dev_err(&pdev->dev, "unable to initialize keypad controller\n");
798 goto err_kpd_init;
799 }
800
801 rc = pm8058_kp_config_sns(pdata->cols_gpio_start,
802 pdata->num_cols);
803 if (rc < 0) {
804 dev_err(&pdev->dev, "unable to configure keypad sense lines\n");
805 goto err_gpio_config;
806 }
807
808 rc = pm8058_kp_config_drv(pdata->rows_gpio_start,
809 pdata->num_rows);
810 if (rc < 0) {
811 dev_err(&pdev->dev, "unable to configure keypad drive lines\n");
812 goto err_gpio_config;
813 }
814
815 rc = request_threaded_irq(kp->key_sense_irq, NULL, pmic8058_kp_irq,
816 IRQF_TRIGGER_RISING, "pmic-keypad", kp);
817 if (rc < 0) {
818 dev_err(&pdev->dev, "failed to request keypad sense irq\n");
819 goto err_req_sense_irq;
820 }
821
822 rc = request_threaded_irq(kp->key_stuck_irq, NULL,
823 pmic8058_kp_stuck_irq, IRQF_TRIGGER_RISING,
824 "pmic-keypad-stuck", kp);
825 if (rc < 0) {
826 dev_err(&pdev->dev, "failed to request keypad stuck irq\n");
827 goto err_req_stuck_irq;
828 }
829
830 rc = pmic8058_kp_read_u8(kp, &ctrl_val, KEYP_CTRL);
831 ctrl_val |= KEYP_CTRL_KEYP_EN;
832 rc = pmic8058_kp_write_u8(kp, ctrl_val, KEYP_CTRL);
833
834 kp->ctrl_reg = ctrl_val;
835
836 __dump_kp_regs(kp, "probe");
837
838 rc = device_create_file(&pdev->dev, &dev_attr_disable_kp);
839 if (rc < 0)
840 goto err_create_file;
841
842 device_init_wakeup(&pdev->dev, pdata->wakeup);
843
844 return 0;
845
846err_create_file:
847 free_irq(kp->key_stuck_irq, NULL);
848err_req_stuck_irq:
849 free_irq(kp->key_sense_irq, NULL);
850err_req_sense_irq:
851err_gpio_config:
852err_kpd_init:
853 input_unregister_device(kp->input);
854 kp->input = NULL;
855err_get_irq:
856 pm_runtime_set_suspended(&pdev->dev);
857 pm_runtime_disable(&pdev->dev);
858 input_free_device(kp->input);
859err_alloc_device:
860 kfree(keycodes);
861err_alloc_mem:
862 kfree(kp);
863 return rc;
864}
865
866static int __devexit pmic8058_kp_remove(struct platform_device *pdev)
867{
868 struct pmic8058_kp *kp = platform_get_drvdata(pdev);
869
870 pm_runtime_set_suspended(&pdev->dev);
871 pm_runtime_disable(&pdev->dev);
872 device_remove_file(&pdev->dev, &dev_attr_disable_kp);
873 device_init_wakeup(&pdev->dev, 0);
874 free_irq(kp->key_stuck_irq, NULL);
875 free_irq(kp->key_sense_irq, NULL);
876 input_unregister_device(kp->input);
877 platform_set_drvdata(pdev, NULL);
878 kfree(kp->input->keycode);
879 kfree(kp);
880
881 return 0;
882}
883
884#ifdef CONFIG_PM
885static int pmic8058_kp_suspend(struct device *dev)
886{
887 struct pmic8058_kp *kp = dev_get_drvdata(dev);
888
889 if (device_may_wakeup(dev) && !pmic8058_kp_disabled(kp)) {
890 enable_irq_wake(kp->key_sense_irq);
891 } else {
892 mutex_lock(&kp->mutex);
893 pmic8058_kp_disable(kp);
894 mutex_unlock(&kp->mutex);
895 }
896
897 return 0;
898}
899
900static int pmic8058_kp_resume(struct device *dev)
901{
902 struct pmic8058_kp *kp = dev_get_drvdata(dev);
903
904 if (device_may_wakeup(dev) && !pmic8058_kp_disabled(kp)) {
905 disable_irq_wake(kp->key_sense_irq);
906 } else {
907 mutex_lock(&kp->mutex);
908 pmic8058_kp_enable(kp);
909 mutex_unlock(&kp->mutex);
910 }
911
912 return 0;
913}
914
915static struct dev_pm_ops pm8058_kp_pm_ops = {
916 .suspend = pmic8058_kp_suspend,
917 .resume = pmic8058_kp_resume,
918};
919#endif
920
921static struct platform_driver pmic8058_kp_driver = {
922 .probe = pmic8058_kp_probe,
923 .remove = __devexit_p(pmic8058_kp_remove),
924 .driver = {
925 .name = "pm8058-keypad",
926 .owner = THIS_MODULE,
927#ifdef CONFIG_PM
928 .pm = &pm8058_kp_pm_ops,
929#endif
930 },
931};
932
933static int __init pmic8058_kp_init(void)
934{
935 return platform_driver_register(&pmic8058_kp_driver);
936}
937module_init(pmic8058_kp_init);
938
939static void __exit pmic8058_kp_exit(void)
940{
941 platform_driver_unregister(&pmic8058_kp_driver);
942}
943module_exit(pmic8058_kp_exit);
944
945MODULE_LICENSE("GPL v2");
946MODULE_DESCRIPTION("PMIC8058 keypad driver");
947MODULE_VERSION("1.0");
948MODULE_ALIAS("platform:pmic8058_keypad");