1 /* Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved.
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.
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.
13 #include <linux/module.h>
14 #include <linux/platform_device.h>
15 #include <linux/kernel.h>
16 #include <linux/interrupt.h>
17 #include <linux/slab.h>
18 #include <linux/input.h>
19 #include <linux/bitops.h>
20 #include <linux/delay.h>
21 #include <linux/mutex.h>
23 #include <linux/mfd/pm8xxx/core.h>
24 #include <linux/mfd/pm8xxx/gpio.h>
25 #include <linux/input/pmic8xxx-keypad.h>
27 #define PM8XXX_MAX_ROWS 18
28 #define PM8XXX_MAX_COLS 8
29 #define PM8XXX_ROW_SHIFT 3
30 #define PM8XXX_MATRIX_MAX_SIZE (PM8XXX_MAX_ROWS * PM8XXX_MAX_COLS)
32 #define PM8XXX_MIN_ROWS 5
33 #define PM8XXX_MIN_COLS 5
35 #define MAX_SCAN_DELAY 128
36 #define MIN_SCAN_DELAY 1
39 #define MAX_ROW_HOLD_DELAY 122000
40 #define MIN_ROW_HOLD_DELAY 30500
42 #define MAX_DEBOUNCE_TIME 20
43 #define MIN_DEBOUNCE_TIME 5
45 #define KEYP_CTRL 0x148
47 #define KEYP_CTRL_EVNTS BIT(0)
48 #define KEYP_CTRL_EVNTS_MASK 0x3
50 #define KEYP_CTRL_SCAN_COLS_SHIFT 5
51 #define KEYP_CTRL_SCAN_COLS_MIN 5
52 #define KEYP_CTRL_SCAN_COLS_BITS 0x3
54 #define KEYP_CTRL_SCAN_ROWS_SHIFT 2
55 #define KEYP_CTRL_SCAN_ROWS_MIN 5
56 #define KEYP_CTRL_SCAN_ROWS_BITS 0x7
58 #define KEYP_CTRL_KEYP_EN BIT(7)
60 #define KEYP_SCAN 0x149
62 #define KEYP_SCAN_READ_STATE BIT(0)
63 #define KEYP_SCAN_DBOUNCE_SHIFT 1
64 #define KEYP_SCAN_PAUSE_SHIFT 3
65 #define KEYP_SCAN_ROW_HOLD_SHIFT 6
67 #define KEYP_TEST 0x14A
69 #define KEYP_TEST_CLEAR_RECENT_SCAN BIT(6)
70 #define KEYP_TEST_CLEAR_OLD_SCAN BIT(5)
71 #define KEYP_TEST_READ_RESET BIT(4)
72 #define KEYP_TEST_DTEST_EN BIT(3)
73 #define KEYP_TEST_ABORT_READ BIT(0)
75 #define KEYP_TEST_DBG_SELECT_SHIFT 1
77 /* bits of these registers represent
81 #define KEYP_RECENT_DATA 0x14B
82 #define KEYP_OLD_DATA 0x14C
84 #define KEYP_CLOCK_FREQ 32768
87 * struct pmic8xxx_kp - internal keypad data structure
88 * @pdata - keypad platform data pointer
89 * @input - input device pointer for keypad
90 * @key_sense_irq - key press/release irq number
91 * @key_stuck_irq - key stuck notification irq number
92 * @keycodes - array to hold the key codes
93 * @dev - parent device pointer
94 * @keystate - present key press/release state
95 * @stuckstate - present state when key stuck irq
96 * @ctrl_reg - control register value
99 const struct pm8xxx_keypad_platform_data
*pdata
;
100 struct input_dev
*input
;
104 unsigned short keycodes
[PM8XXX_MATRIX_MAX_SIZE
];
107 u16 keystate
[PM8XXX_MAX_ROWS
];
108 u16 stuckstate
[PM8XXX_MAX_ROWS
];
113 static int pmic8xxx_kp_write_u8(struct pmic8xxx_kp
*kp
,
118 rc
= pm8xxx_writeb(kp
->dev
->parent
, reg
, data
);
122 static int pmic8xxx_kp_read(struct pmic8xxx_kp
*kp
,
123 u8
*data
, u16 reg
, unsigned num_bytes
)
127 rc
= pm8xxx_read_buf(kp
->dev
->parent
, reg
, data
, num_bytes
);
131 static int pmic8xxx_kp_read_u8(struct pmic8xxx_kp
*kp
,
136 rc
= pmic8xxx_kp_read(kp
, data
, reg
, 1);
140 static u8
pmic8xxx_col_state(struct pmic8xxx_kp
*kp
, u8 col
)
142 /* all keys pressed on that particular row? */
144 return 1 << kp
->pdata
->num_cols
;
146 return col
& ((1 << kp
->pdata
->num_cols
) - 1);
150 * Synchronous read protocol for RevB0 onwards:
152 * 1. Write '1' to ReadState bit in KEYP_SCAN register
153 * 2. Wait 2*32KHz clocks, so that HW can successfully enter read mode
155 * 3. Read rows in old array first if events are more than one
156 * 4. Read rows in recent array
157 * 5. Wait 4*32KHz clocks
158 * 6. Write '0' to ReadState bit of KEYP_SCAN register so that hw can
159 * synchronously exit read mode.
161 static int pmic8xxx_chk_sync_read(struct pmic8xxx_kp
*kp
)
166 rc
= pmic8xxx_kp_read_u8(kp
, &scan_val
, KEYP_SCAN
);
168 dev_err(kp
->dev
, "Error reading KEYP_SCAN reg, rc=%d\n", rc
);
174 rc
= pmic8xxx_kp_write_u8(kp
, scan_val
, KEYP_SCAN
);
176 dev_err(kp
->dev
, "Error writing KEYP_SCAN reg, rc=%d\n", rc
);
180 /* 2 * 32KHz clocks */
181 udelay((2 * DIV_ROUND_UP(USEC_PER_SEC
, KEYP_CLOCK_FREQ
)) + 1);
186 static int pmic8xxx_kp_read_data(struct pmic8xxx_kp
*kp
, u16
*state
,
187 u16 data_reg
, int read_rows
)
190 u8 new_data
[PM8XXX_MAX_ROWS
];
192 rc
= pmic8xxx_kp_read(kp
, new_data
, data_reg
, read_rows
);
196 for (row
= 0; row
< kp
->pdata
->num_rows
; row
++) {
197 dev_dbg(kp
->dev
, "new_data[%d] = %d\n", row
,
199 state
[row
] = pmic8xxx_col_state(kp
, new_data
[row
]);
205 static int pmic8xxx_kp_read_matrix(struct pmic8xxx_kp
*kp
, u16
*new_state
,
211 if (kp
->pdata
->num_rows
< PM8XXX_MIN_ROWS
)
212 read_rows
= PM8XXX_MIN_ROWS
;
214 read_rows
= kp
->pdata
->num_rows
;
216 pmic8xxx_chk_sync_read(kp
);
219 rc
= pmic8xxx_kp_read_data(kp
, old_state
, KEYP_OLD_DATA
,
223 "Error reading KEYP_OLD_DATA, rc=%d\n", rc
);
228 rc
= pmic8xxx_kp_read_data(kp
, new_state
, KEYP_RECENT_DATA
,
232 "Error reading KEYP_RECENT_DATA, rc=%d\n", rc
);
236 /* 4 * 32KHz clocks */
237 udelay((4 * DIV_ROUND_UP(USEC_PER_SEC
, KEYP_CLOCK_FREQ
)) + 1);
239 rc
= pmic8xxx_kp_read_u8(kp
, &scan_val
, KEYP_SCAN
);
241 dev_err(kp
->dev
, "Error reading KEYP_SCAN reg, rc=%d\n", rc
);
246 rc
= pmic8xxx_kp_write_u8(kp
, scan_val
, KEYP_SCAN
);
248 dev_err(kp
->dev
, "Error writing KEYP_SCAN reg, rc=%d\n", rc
);
253 static void __pmic8xxx_kp_scan_matrix(struct pmic8xxx_kp
*kp
, u16
*new_state
,
258 for (row
= 0; row
< kp
->pdata
->num_rows
; row
++) {
259 int bits_changed
= new_state
[row
] ^ old_state
[row
];
264 for (col
= 0; col
< kp
->pdata
->num_cols
; col
++) {
265 if (!(bits_changed
& (1 << col
)))
268 dev_dbg(kp
->dev
, "key [%d:%d] %s\n", row
, col
,
269 !(new_state
[row
] & (1 << col
)) ?
270 "pressed" : "released");
272 code
= MATRIX_SCAN_CODE(row
, col
, PM8XXX_ROW_SHIFT
);
274 input_event(kp
->input
, EV_MSC
, MSC_SCAN
, code
);
275 input_report_key(kp
->input
,
277 !(new_state
[row
] & (1 << col
)));
279 input_sync(kp
->input
);
284 static bool pmic8xxx_detect_ghost_keys(struct pmic8xxx_kp
*kp
, u16
*new_state
)
286 int row
, found_first
= -1;
287 u16 check
, row_state
;
290 for (row
= 0; row
< kp
->pdata
->num_rows
; row
++) {
291 row_state
= (~new_state
[row
]) &
292 ((1 << kp
->pdata
->num_cols
) - 1);
294 if (hweight16(row_state
) > 1) {
295 if (found_first
== -1)
297 if (check
& row_state
) {
298 dev_dbg(kp
->dev
, "detected ghost key on row[%d]"
299 " and row[%d]\n", found_first
, row
);
308 static int pmic8xxx_kp_scan_matrix(struct pmic8xxx_kp
*kp
, unsigned int events
)
310 u16 new_state
[PM8XXX_MAX_ROWS
];
311 u16 old_state
[PM8XXX_MAX_ROWS
];
316 rc
= pmic8xxx_kp_read_matrix(kp
, new_state
, NULL
);
320 /* detecting ghost key is not an error */
321 if (pmic8xxx_detect_ghost_keys(kp
, new_state
))
323 __pmic8xxx_kp_scan_matrix(kp
, new_state
, kp
->keystate
);
324 memcpy(kp
->keystate
, new_state
, sizeof(new_state
));
326 case 0x3: /* two events - eventcounter is gray-coded */
327 rc
= pmic8xxx_kp_read_matrix(kp
, new_state
, old_state
);
331 __pmic8xxx_kp_scan_matrix(kp
, old_state
, kp
->keystate
);
332 __pmic8xxx_kp_scan_matrix(kp
, new_state
, old_state
);
333 memcpy(kp
->keystate
, new_state
, sizeof(new_state
));
336 dev_dbg(kp
->dev
, "Some key events were lost\n");
337 rc
= pmic8xxx_kp_read_matrix(kp
, new_state
, old_state
);
340 __pmic8xxx_kp_scan_matrix(kp
, old_state
, kp
->keystate
);
341 __pmic8xxx_kp_scan_matrix(kp
, new_state
, old_state
);
342 memcpy(kp
->keystate
, new_state
, sizeof(new_state
));
351 * NOTE: We are reading recent and old data registers blindly
352 * whenever key-stuck interrupt happens, because events counter doesn't
353 * get updated when this interrupt happens due to key stuck doesn't get
354 * considered as key state change.
356 * We are not using old data register contents after they are being read
357 * because it might report the key which was pressed before the key being stuck
358 * as stuck key because it's pressed status is stored in the old data
361 static irqreturn_t
pmic8xxx_kp_stuck_irq(int irq
, void *data
)
363 u16 new_state
[PM8XXX_MAX_ROWS
];
364 u16 old_state
[PM8XXX_MAX_ROWS
];
366 struct pmic8xxx_kp
*kp
= data
;
368 rc
= pmic8xxx_kp_read_matrix(kp
, new_state
, old_state
);
370 dev_err(kp
->dev
, "failed to read keypad matrix\n");
374 __pmic8xxx_kp_scan_matrix(kp
, new_state
, kp
->stuckstate
);
379 static irqreturn_t
pmic8xxx_kp_irq(int irq
, void *data
)
381 struct pmic8xxx_kp
*kp
= data
;
385 rc
= pmic8xxx_kp_read(kp
, &ctrl_val
, KEYP_CTRL
, 1);
387 dev_err(kp
->dev
, "failed to read keyp_ctrl register\n");
391 events
= ctrl_val
& KEYP_CTRL_EVNTS_MASK
;
393 rc
= pmic8xxx_kp_scan_matrix(kp
, events
);
395 dev_err(kp
->dev
, "failed to scan matrix\n");
400 static int __devinit
pmic8xxx_kpd_init(struct pmic8xxx_kp
*kp
)
402 int bits
, rc
, cycles
;
403 u8 scan_val
= 0, ctrl_val
= 0;
404 static const u8 row_bits
[] = {
405 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7,
408 /* Find column bits */
409 if (kp
->pdata
->num_cols
< KEYP_CTRL_SCAN_COLS_MIN
)
412 bits
= kp
->pdata
->num_cols
- KEYP_CTRL_SCAN_COLS_MIN
;
413 ctrl_val
= (bits
& KEYP_CTRL_SCAN_COLS_BITS
) <<
414 KEYP_CTRL_SCAN_COLS_SHIFT
;
417 if (kp
->pdata
->num_rows
< KEYP_CTRL_SCAN_ROWS_MIN
)
420 bits
= row_bits
[kp
->pdata
->num_rows
- KEYP_CTRL_SCAN_ROWS_MIN
];
422 ctrl_val
|= (bits
<< KEYP_CTRL_SCAN_ROWS_SHIFT
);
424 rc
= pmic8xxx_kp_write_u8(kp
, ctrl_val
, KEYP_CTRL
);
426 dev_err(kp
->dev
, "Error writing KEYP_CTRL reg, rc=%d\n", rc
);
430 bits
= (kp
->pdata
->debounce_ms
/ 5) - 1;
432 scan_val
|= (bits
<< KEYP_SCAN_DBOUNCE_SHIFT
);
434 bits
= fls(kp
->pdata
->scan_delay_ms
) - 1;
435 scan_val
|= (bits
<< KEYP_SCAN_PAUSE_SHIFT
);
437 /* Row hold time is a multiple of 32KHz cycles. */
438 cycles
= (kp
->pdata
->row_hold_ns
* KEYP_CLOCK_FREQ
) / NSEC_PER_SEC
;
440 scan_val
|= (cycles
<< KEYP_SCAN_ROW_HOLD_SHIFT
);
442 rc
= pmic8xxx_kp_write_u8(kp
, scan_val
, KEYP_SCAN
);
444 dev_err(kp
->dev
, "Error writing KEYP_SCAN reg, rc=%d\n", rc
);
450 static int __devinit
pmic8xxx_kp_config_gpio(int gpio_start
, int num_gpios
,
451 struct pmic8xxx_kp
*kp
, struct pm_gpio
*gpio_config
)
455 if (gpio_start
< 0 || num_gpios
< 0)
458 for (i
= 0; i
< num_gpios
; i
++) {
459 rc
= pm8xxx_gpio_config(gpio_start
+ i
, gpio_config
);
461 dev_err(kp
->dev
, "%s: FAIL pm8xxx_gpio_config():"
462 "for PM GPIO [%d] rc=%d.\n",
463 __func__
, gpio_start
+ i
, rc
);
471 static int pmic8xxx_kp_enable(struct pmic8xxx_kp
*kp
)
475 kp
->ctrl_reg
|= KEYP_CTRL_KEYP_EN
;
477 rc
= pmic8xxx_kp_write_u8(kp
, kp
->ctrl_reg
, KEYP_CTRL
);
479 dev_err(kp
->dev
, "Error writing KEYP_CTRL reg, rc=%d\n", rc
);
484 static int pmic8xxx_kp_disable(struct pmic8xxx_kp
*kp
)
488 kp
->ctrl_reg
&= ~KEYP_CTRL_KEYP_EN
;
490 rc
= pmic8xxx_kp_write_u8(kp
, kp
->ctrl_reg
, KEYP_CTRL
);
497 static int pmic8xxx_kp_open(struct input_dev
*dev
)
499 struct pmic8xxx_kp
*kp
= input_get_drvdata(dev
);
501 return pmic8xxx_kp_enable(kp
);
504 static void pmic8xxx_kp_close(struct input_dev
*dev
)
506 struct pmic8xxx_kp
*kp
= input_get_drvdata(dev
);
508 pmic8xxx_kp_disable(kp
);
512 * keypad controller should be initialized in the following sequence
513 * only, otherwise it might get into FSM stuck state.
515 * - Initialize keypad control parameters, like no. of rows, columns,
516 * timing values etc.,
517 * - configure rows and column gpios pull up/down.
518 * - set irq edge type.
519 * - enable the keypad controller.
521 static int __devinit
pmic8xxx_kp_probe(struct platform_device
*pdev
)
523 const struct pm8xxx_keypad_platform_data
*pdata
= mfd_get_data(pdev
);
524 const struct matrix_keymap_data
*keymap_data
;
525 struct pmic8xxx_kp
*kp
;
529 struct pm_gpio kypd_drv
= {
530 .direction
= PM_GPIO_DIR_OUT
,
531 .output_buffer
= PM_GPIO_OUT_BUF_OPEN_DRAIN
,
533 .pull
= PM_GPIO_PULL_NO
,
534 .vin_sel
= PM_GPIO_VIN_S3
,
535 .out_strength
= PM_GPIO_STRENGTH_LOW
,
536 .function
= PM_GPIO_FUNC_1
,
540 struct pm_gpio kypd_sns
= {
541 .direction
= PM_GPIO_DIR_IN
,
542 .pull
= PM_GPIO_PULL_UP_31P5
,
543 .vin_sel
= PM_GPIO_VIN_S3
,
544 .out_strength
= PM_GPIO_STRENGTH_NO
,
545 .function
= PM_GPIO_FUNC_NORMAL
,
550 if (!pdata
|| !pdata
->num_cols
|| !pdata
->num_rows
||
551 pdata
->num_cols
> PM8XXX_MAX_COLS
||
552 pdata
->num_rows
> PM8XXX_MAX_ROWS
||
553 pdata
->num_cols
< PM8XXX_MIN_COLS
) {
554 dev_err(&pdev
->dev
, "invalid platform data\n");
558 if (!pdata
->scan_delay_ms
||
559 pdata
->scan_delay_ms
> MAX_SCAN_DELAY
||
560 pdata
->scan_delay_ms
< MIN_SCAN_DELAY
||
561 !is_power_of_2(pdata
->scan_delay_ms
)) {
562 dev_err(&pdev
->dev
, "invalid keypad scan time supplied\n");
566 if (!pdata
->row_hold_ns
||
567 pdata
->row_hold_ns
> MAX_ROW_HOLD_DELAY
||
568 pdata
->row_hold_ns
< MIN_ROW_HOLD_DELAY
||
569 ((pdata
->row_hold_ns
% MIN_ROW_HOLD_DELAY
) != 0)) {
570 dev_err(&pdev
->dev
, "invalid keypad row hold time supplied\n");
574 if (!pdata
->debounce_ms
||
575 ((pdata
->debounce_ms
% 5) != 0) ||
576 pdata
->debounce_ms
> MAX_DEBOUNCE_TIME
||
577 pdata
->debounce_ms
< MIN_DEBOUNCE_TIME
) {
578 dev_err(&pdev
->dev
, "invalid debounce time supplied\n");
582 keymap_data
= pdata
->keymap_data
;
584 dev_err(&pdev
->dev
, "no keymap data supplied\n");
588 kp
= kzalloc(sizeof(*kp
), GFP_KERNEL
);
592 platform_set_drvdata(pdev
, kp
);
595 kp
->dev
= &pdev
->dev
;
597 kp
->input
= input_allocate_device();
599 dev_err(&pdev
->dev
, "unable to allocate input device\n");
601 goto err_alloc_device
;
604 kp
->key_sense_irq
= platform_get_irq(pdev
, 0);
605 if (kp
->key_sense_irq
< 0) {
606 dev_err(&pdev
->dev
, "unable to get keypad sense irq\n");
611 kp
->key_stuck_irq
= platform_get_irq(pdev
, 1);
612 if (kp
->key_stuck_irq
< 0) {
613 dev_err(&pdev
->dev
, "unable to get keypad stuck irq\n");
618 kp
->input
->name
= pdata
->input_name
? : "PMIC8XXX keypad";
619 kp
->input
->phys
= pdata
->input_phys_device
? : "pmic8xxx_keypad/input0";
621 kp
->input
->dev
.parent
= &pdev
->dev
;
623 kp
->input
->id
.bustype
= BUS_I2C
;
624 kp
->input
->id
.version
= 0x0001;
625 kp
->input
->id
.product
= 0x0001;
626 kp
->input
->id
.vendor
= 0x0001;
628 kp
->input
->evbit
[0] = BIT_MASK(EV_KEY
);
631 __set_bit(EV_REP
, kp
->input
->evbit
);
633 kp
->input
->keycode
= kp
->keycodes
;
634 kp
->input
->keycodemax
= PM8XXX_MATRIX_MAX_SIZE
;
635 kp
->input
->keycodesize
= sizeof(kp
->keycodes
);
636 kp
->input
->open
= pmic8xxx_kp_open
;
637 kp
->input
->close
= pmic8xxx_kp_close
;
639 matrix_keypad_build_keymap(keymap_data
, PM8XXX_ROW_SHIFT
,
640 kp
->input
->keycode
, kp
->input
->keybit
);
642 input_set_capability(kp
->input
, EV_MSC
, MSC_SCAN
);
643 input_set_drvdata(kp
->input
, kp
);
645 /* initialize keypad state */
646 memset(kp
->keystate
, 0xff, sizeof(kp
->keystate
));
647 memset(kp
->stuckstate
, 0xff, sizeof(kp
->stuckstate
));
649 rc
= pmic8xxx_kpd_init(kp
);
651 dev_err(&pdev
->dev
, "unable to initialize keypad controller\n");
655 rc
= pmic8xxx_kp_config_gpio(pdata
->cols_gpio_start
,
656 pdata
->num_cols
, kp
, &kypd_sns
);
658 dev_err(&pdev
->dev
, "unable to configure keypad sense lines\n");
659 goto err_gpio_config
;
662 rc
= pmic8xxx_kp_config_gpio(pdata
->rows_gpio_start
,
663 pdata
->num_rows
, kp
, &kypd_drv
);
665 dev_err(&pdev
->dev
, "unable to configure keypad drive lines\n");
666 goto err_gpio_config
;
669 rc
= request_any_context_irq(kp
->key_sense_irq
, pmic8xxx_kp_irq
,
670 IRQF_TRIGGER_RISING
, "pmic-keypad", kp
);
672 dev_err(&pdev
->dev
, "failed to request keypad sense irq\n");
676 rc
= request_any_context_irq(kp
->key_stuck_irq
, pmic8xxx_kp_stuck_irq
,
677 IRQF_TRIGGER_RISING
, "pmic-keypad-stuck", kp
);
679 dev_err(&pdev
->dev
, "failed to request keypad stuck irq\n");
680 goto err_req_stuck_irq
;
683 rc
= pmic8xxx_kp_read_u8(kp
, &ctrl_val
, KEYP_CTRL
);
685 dev_err(&pdev
->dev
, "failed to read KEYP_CTRL register\n");
686 goto err_pmic_reg_read
;
689 kp
->ctrl_reg
= ctrl_val
;
691 rc
= input_register_device(kp
->input
);
693 dev_err(&pdev
->dev
, "unable to register keypad input device\n");
694 goto err_pmic_reg_read
;
697 device_init_wakeup(&pdev
->dev
, pdata
->wakeup
);
702 free_irq(kp
->key_stuck_irq
, kp
);
704 free_irq(kp
->key_sense_irq
, kp
);
707 input_free_device(kp
->input
);
709 platform_set_drvdata(pdev
, NULL
);
714 static int __devexit
pmic8xxx_kp_remove(struct platform_device
*pdev
)
716 struct pmic8xxx_kp
*kp
= platform_get_drvdata(pdev
);
718 device_init_wakeup(&pdev
->dev
, 0);
719 free_irq(kp
->key_stuck_irq
, kp
);
720 free_irq(kp
->key_sense_irq
, kp
);
721 input_unregister_device(kp
->input
);
724 platform_set_drvdata(pdev
, NULL
);
728 #ifdef CONFIG_PM_SLEEP
729 static int pmic8xxx_kp_suspend(struct device
*dev
)
731 struct platform_device
*pdev
= to_platform_device(dev
);
732 struct pmic8xxx_kp
*kp
= platform_get_drvdata(pdev
);
733 struct input_dev
*input_dev
= kp
->input
;
735 if (device_may_wakeup(dev
)) {
736 enable_irq_wake(kp
->key_sense_irq
);
738 mutex_lock(&input_dev
->mutex
);
740 if (input_dev
->users
)
741 pmic8xxx_kp_disable(kp
);
743 mutex_unlock(&input_dev
->mutex
);
749 static int pmic8xxx_kp_resume(struct device
*dev
)
751 struct platform_device
*pdev
= to_platform_device(dev
);
752 struct pmic8xxx_kp
*kp
= platform_get_drvdata(pdev
);
753 struct input_dev
*input_dev
= kp
->input
;
755 if (device_may_wakeup(dev
)) {
756 disable_irq_wake(kp
->key_sense_irq
);
758 mutex_lock(&input_dev
->mutex
);
760 if (input_dev
->users
)
761 pmic8xxx_kp_enable(kp
);
763 mutex_unlock(&input_dev
->mutex
);
770 static SIMPLE_DEV_PM_OPS(pm8xxx_kp_pm_ops
,
771 pmic8xxx_kp_suspend
, pmic8xxx_kp_resume
);
773 static struct platform_driver pmic8xxx_kp_driver
= {
774 .probe
= pmic8xxx_kp_probe
,
775 .remove
= __devexit_p(pmic8xxx_kp_remove
),
777 .name
= PM8XXX_KEYPAD_DEV_NAME
,
778 .owner
= THIS_MODULE
,
779 .pm
= &pm8xxx_kp_pm_ops
,
783 static int __init
pmic8xxx_kp_init(void)
785 return platform_driver_register(&pmic8xxx_kp_driver
);
787 module_init(pmic8xxx_kp_init
);
789 static void __exit
pmic8xxx_kp_exit(void)
791 platform_driver_unregister(&pmic8xxx_kp_driver
);
793 module_exit(pmic8xxx_kp_exit
);
795 MODULE_LICENSE("GPL v2");
796 MODULE_DESCRIPTION("PMIC8XXX keypad driver");
797 MODULE_VERSION("1.0");
798 MODULE_ALIAS("platform:pmic8xxx_keypad");
799 MODULE_AUTHOR("Trilok Soni <tsoni@codeaurora.org>");