2 * Copyright (C) 2012 Spreadtrum Communications Inc.
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
14 #include <linux/kernel.h>
16 #include <linux/slab.h>
17 #include <linux/spinlock.h>
18 #include <linux/module.h>
19 #include <linux/init.h>
21 #include <linux/interrupt.h>
22 #include <linux/irq.h>
23 #include <linux/sched.h>
25 #include <linux/sysctl.h>
26 #include <linux/proc_fs.h>
27 #include <linux/gpio.h>
28 #include <linux/delay.h>
29 #include <linux/platform_device.h>
30 #include <linux/input.h>
31 #include <linux/input/matrix_keypad.h>
32 #include <linux/sysrq.h>
33 #include <linux/sched.h>
34 #include <linux/of_device.h>
35 #include <linux/of_address.h>
36 #include <linux/of_gpio.h>
38 #include <soc/sprd/globalregs.h>
39 #include <soc/sprd/hardware.h>
40 #include <soc/sprd/board.h>
41 #include <soc/sprd/gpio.h>
42 #include <soc/sprd/adi.h>
43 #include <soc/sprd/kpd.h>
44 #include <soc/sprd/sci.h>
45 #include <soc/sprd/sci_glb_regs.h>
46 #include <linux/wakelock.h>
48 #include <soc/sprd/sec_debug.h>
51 #include <linux/input-hook.h>
53 #define WAKELOCK_TIME HZ/10
55 #define DEBUG_KEYPAD 0
58 #define KPD_REG_BASE (SPRD_KPD_BASE)
60 static unsigned long KPD_REG_BASE;
63 #define KPD_CTRL (KPD_REG_BASE + 0x00)
64 #define KPD_EN (0x01 << 0)
65 #define KPD_SLEEP_EN (0x01 << 1)
66 #define KPD_LONG_KEY_EN (0x01 << 2)
69 #define KPDCTL_ROW_MSK_V0 (0x3f << 18) /* enable rows 2 - 7 */
70 #define KPDCTL_COL_MSK_V0 (0x3f << 10) /* enable cols 2 - 7 */
73 #define KPDCTL_ROW_MSK_V1 (0xff << 16) /* enable rows 0 - 7 */
74 #define KPDCTL_COL_MSK_V1 (0xff << 8) /* enable cols 0 - 7 */
76 #define KPD_INT_EN (KPD_REG_BASE + 0x04)
77 #define KPD_INT_RAW_STATUS (KPD_REG_BASE + 0x08)
78 #define KPD_INT_MASK_STATUS (KPD_REG_BASE + 0x0C)
79 #define KPD_INT_ALL (0xfff)
80 #define KPD_INT_DOWNUP (0x0ff)
81 #define KPD_INT_LONG (0xf00)
82 #define KPD_PRESS_INT0 (1 << 0)
83 #define KPD_PRESS_INT1 (1 << 1)
84 #define KPD_PRESS_INT2 (1 << 2)
85 #define KPD_PRESS_INT3 (1 << 3)
86 #define KPD_RELEASE_INT0 (1 << 4)
87 #define KPD_RELEASE_INT1 (1 << 5)
88 #define KPD_RELEASE_INT2 (1 << 6)
89 #define KPD_RELEASE_INT3 (1 << 7)
90 #define KPD_LONG_KEY_INT0 (1 << 8)
91 #define KPD_LONG_KEY_INT1 (1 << 9)
92 #define KPD_LONG_KEY_INT2 (1 << 10)
93 #define KPD_LONG_KEY_INT3 (1 << 11)
95 #define KPD_INT_CLR (KPD_REG_BASE + 0x10)
96 #define KPD_POLARITY (KPD_REG_BASE + 0x18)
97 #define KPD_CFG_ROW_POLARITY (0xff)
98 #define KPD_CFG_COL_POLARITY (0xFF00)
99 #define CFG_ROW_POLARITY (KPD_CFG_ROW_POLARITY & 0x00FF)
100 #define CFG_COL_POLARITY (KPD_CFG_COL_POLARITY & 0xFF00)
102 #define KPD_DEBOUNCE_CNT (KPD_REG_BASE + 0x1C)
103 #define KPD_LONG_KEY_CNT (KPD_REG_BASE + 0x20)
105 #define KPD_SLEEP_CNT (KPD_REG_BASE + 0x24)
106 #define KPD_SLEEP_CNT_VALUE(_X_MS_) (_X_MS_ * 32.768 -1)
107 #define KPD_CLK_DIV_CNT (KPD_REG_BASE + 0x28)
109 #define KPD_KEY_STATUS (KPD_REG_BASE + 0x2C)
110 #define KPD_INT0_COL(_X_) (((_X_)>> 0) & 0x7)
111 #define KPD_INT0_ROW(_X_) (((_X_)>> 4) & 0x7)
112 #define KPD_INT0_DOWN(_X_) (((_X_)>> 7) & 0x1)
113 #define KPD_INT1_COL(_X_) (((_X_)>> 8) & 0x7)
114 #define KPD_INT1_ROW(_X_) (((_X_)>> 12) & 0x7)
115 #define KPD_INT1_DOWN(_X_) (((_X_)>> 15) & 0x1)
116 #define KPD_INT2_COL(_X_) (((_X_)>> 16) & 0x7)
117 #define KPD_INT2_ROW(_X_) (((_X_)>> 20) & 0x7)
118 #define KPD_INT2_DOWN(_X_) (((_X_)>> 23) & 0x1)
119 #define KPD_INT3_COL(_X_) (((_X_)>> 24) & 0x7)
120 #define KPD_INT3_ROW(_X_) (((_X_)>> 28) & 0x7)
121 #define KPD_INT3_DOWN(_X_) (((_X_)>> 31) & 0x1)
123 #define KPD_SLEEP_STATUS (KPD_REG_BASE + 0x0030)
124 #define KPD_DEBUG_STATUS1 (KPD_REG_BASE + 0x0034)
125 #define KPD_DEBUG_STATUS2 (KPD_REG_BASE + 0x0038)
128 #define PB_INT EIC_KEY_POWER
133 #if defined(CONFIG_ARCH_SC8825)
134 static __devinit void __keypad_enable(void)
136 sci_glb_set(REG_GLB_SOFT_RST, BIT_KPD_RST);
138 sci_glb_clr(REG_GLB_SOFT_RST, BIT_KPD_RST);
139 sci_glb_set(REG_GLB_GEN0, BIT_KPD_EB | BIT_RTC_KPD_EB);
141 static __devexit void __keypad_disable(void)
143 sci_glb_clr(REG_GLB_GEN0, BIT_KPD_EB | BIT_RTC_KPD_EB);
146 static int __keypad_controller_ver(void)
151 #elif defined(CONFIG_ARCH_SCX35)
152 static void __keypad_enable(void)
154 sci_glb_set(REG_AON_APB_APB_RST0, BIT_KPD_SOFT_RST);
156 sci_glb_clr(REG_AON_APB_APB_RST0, BIT_KPD_SOFT_RST);
157 sci_glb_set(REG_AON_APB_APB_EB0, BIT_KPD_EB);
158 sci_glb_set(REG_AON_APB_APB_RTC_EB, BIT_KPD_RTC_EB);
161 static void __keypad_disable(void)
163 sci_glb_clr(REG_AON_APB_APB_EB0, BIT_KPD_EB);
164 sci_glb_clr(REG_AON_APB_APB_RTC_EB, BIT_KPD_RTC_EB);
166 static int __keypad_controller_ver(void)
172 #error "Pls fill the low level enable function"
175 struct sci_keypad_t {
176 struct input_dev *input_dev;
180 unsigned int keyup_test_jiffies;
182 struct wake_lock key_wake_lock;
186 extern struct class *sec_class;
187 struct device *key_dev, *powerkey_dev;
188 EXPORT_SYMBOL(key_dev);
189 EXPORT_SYMBOL(powerkey_dev);
190 extern uint8_t vol_down_keys_pressed;
191 uint8_t keys_pressed;
192 static ssize_t key_show(struct device *dev, struct device_attribute *attr, char *buf);
193 static ssize_t powerkey_show(struct device *dev, struct device_attribute *attr, char *buf);
194 static ssize_t store_reset_enable(struct device *dev, struct device_attribute
195 *devattr, const char *buf, size_t count);
196 static ssize_t show_reset_enable(struct device *dev, struct device_attribute *attr, char *buf);
198 static DEVICE_ATTR(sec_key_pressed, S_IRUGO, key_show, NULL);
199 static DEVICE_ATTR(sec_powerkey_pressed, S_IRUGO, powerkey_show, NULL);
200 static DEVICE_ATTR(reset_enable, S_IRUGO | S_IWUSR | S_IWGRP, show_reset_enable, store_reset_enable);
202 static struct attribute *sec_powerkey_attributes[] = {
203 &dev_attr_sec_powerkey_pressed.attr,
204 &dev_attr_reset_enable.attr,
208 static struct attribute_group sec_powerkey_attr_group = {
209 .attrs = sec_powerkey_attributes,
212 static ssize_t key_show(struct device *dev, struct device_attribute *attr, char *buf)
214 uint8_t default_press = 0x80;
215 int is_key_checked = 0;
216 uint8_t keys_pressed;
218 keys_pressed = __raw_readl(KPD_KEY_STATUS);
219 if ((keys_pressed & default_press) | vol_down_keys_pressed)
220 is_key_checked = sprintf(buf, "%s\n", "PRESS");
222 is_key_checked = sprintf(buf, "%s\n", "RELEASE");
224 return is_key_checked;
226 static ssize_t powerkey_show(struct device *dev, struct device_attribute *attr, char *buf)
228 struct sci_keypad_t *sci_kpd = dev_get_drvdata(powerkey_dev);
229 int is_key_checked = 0;
231 is_key_checked = sprintf(buf, "%s\n",
232 sci_kpd->powerkey_state ? "PRESS" : "RELEASE");
234 return is_key_checked;
237 static ssize_t store_reset_enable(struct device *dev, struct device_attribute
238 *devattr, const char *buf, size_t count)
242 ret = kstrtoul(buf, 10, &value);
244 pr_err("%s: failed to get buf value\n", __func__);
249 sci_adi_set(ANA_REG_GLB_SWRST_CTRL, BIT_KEY2_7S_RST_EN);
251 sci_adi_clr(ANA_REG_GLB_SWRST_CTRL, BIT_KEY2_7S_RST_EN);
253 pr_info("%s: %sabled one key reset.\n", __func__, value ? "en":"dis");
258 static ssize_t show_reset_enable(struct device *dev, struct device_attribute *attr, char *buf)
262 reg_val = sci_adi_read(ANA_REG_GLB_SWRST_CTRL);
263 reg_val &= BIT_KEY2_7S_RST_EN;
265 pr_info("%s: %sabled one key reset.\n", __func__, reg_val ? "en":"dis");
267 return sprintf(buf, "%d\n", !!reg_val);
273 static void dump_keypad_register(void)
275 #define INT_MASK_STS (SPRD_INTC1_BASE + 0x0000)
276 #define INT_RAW_STS (SPRD_INTC1_BASE + 0x0004)
277 #define INT_EN (SPRD_INTC1_BASE + 0x0008)
278 #define INT_DIS (SPRD_INTC1_BASE + 0x000C)
280 printk("\nREG_INT_MASK_STS = 0x%08x\n", __raw_readl(INT_MASK_STS));
281 printk("REG_INT_RAW_STS = 0x%08x\n", __raw_readl(INT_RAW_STS));
282 printk("REG_INT_EN = 0x%08x\n", __raw_readl(INT_EN));
283 printk("REG_INT_DIS = 0x%08x\n", __raw_readl(INT_DIS));
284 printk("REG_KPD_CTRL = 0x%08x\n", __raw_readl(KPD_CTRL));
285 printk("REG_KPD_INT_EN = 0x%08x\n", __raw_readl(KPD_INT_EN));
286 printk("REG_KPD_INT_RAW_STATUS = 0x%08x\n",
287 __raw_readl(KPD_INT_RAW_STATUS));
288 printk("REG_KPD_INT_MASK_STATUS = 0x%08x\n",
289 __raw_readl(KPD_INT_MASK_STATUS));
290 printk("REG_KPD_INT_CLR = 0x%08x\n", __raw_readl(KPD_INT_CLR));
291 printk("REG_KPD_POLARITY = 0x%08x\n", __raw_readl(KPD_POLARITY));
292 printk("REG_KPD_DEBOUNCE_CNT = 0x%08x\n",
293 __raw_readl(KPD_DEBOUNCE_CNT));
294 printk("REG_KPD_LONG_KEY_CNT = 0x%08x\n",
295 __raw_readl(KPD_LONG_KEY_CNT));
296 printk("REG_KPD_SLEEP_CNT = 0x%08x\n", __raw_readl(KPD_SLEEP_CNT));
297 printk("REG_KPD_CLK_DIV_CNT = 0x%08x\n", __raw_readl(KPD_CLK_DIV_CNT));
298 printk("REG_KPD_KEY_STATUS = 0x%08x\n", __raw_readl(KPD_KEY_STATUS));
299 printk("REG_KPD_SLEEP_STATUS = 0x%08x\n",
300 __raw_readl(KPD_SLEEP_STATUS));
303 static void dump_keypad_register(void)
308 static int sci_keypad_check_validity(unsigned short key)
310 if ((key == KEY_VOLUMEUP) || (key == KEY_VOLUMEDOWN) ||\
311 (key == KEY_MENU) || (key == KEY_POWER))
317 static void sci_keypad_report_event(struct sci_keypad_t *sci_kpd, int col, int row, int state)
319 unsigned short *keycodes = sci_kpd->input_dev->keycode;
320 unsigned int row_shift = get_count_order(sci_kpd->cols);
323 key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)];
325 if (sci_keypad_check_validity(key))
330 (&sci_kpd->key_wake_lock, WAKELOCK_TIME);
332 input_report_key(sci_kpd->input_dev, key, state);
333 input_sync(sci_kpd->input_dev);
334 sec_debug_check_crash_key(key, state);
339 static irqreturn_t sci_keypad_isr(int irq, void *dev_id)
341 unsigned short key = 0;
343 struct sci_keypad_t *sci_kpd = dev_id;
344 unsigned long int_status = __raw_readl(KPD_INT_MASK_STATUS);
345 unsigned long key_status = __raw_readl(KPD_KEY_STATUS);
346 unsigned short *keycodes = sci_kpd->input_dev->keycode;
347 unsigned int row_shift = get_count_order(sci_kpd->cols);
350 value = __raw_readl(KPD_INT_CLR);
351 value |= KPD_INT_ALL;
352 __raw_writel(value, KPD_INT_CLR);
354 if ((int_status & KPD_PRESS_INT0)) {
355 col = KPD_INT0_COL(key_status);
356 row = KPD_INT0_ROW(key_status);
357 sci_keypad_report_event(dev_id, col, row, true);
359 if (int_status & KPD_RELEASE_INT0) {
360 col = KPD_INT0_COL(key_status);
361 row = KPD_INT0_ROW(key_status);
362 key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)];
363 sci_keypad_report_event(dev_id, col, row, false);
366 if ((int_status & KPD_PRESS_INT1)) {
367 col = KPD_INT1_COL(key_status);
368 row = KPD_INT1_ROW(key_status);
369 key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)];
370 sci_keypad_report_event(dev_id, col, row, true);
372 if (int_status & KPD_RELEASE_INT1) {
373 col = KPD_INT1_COL(key_status);
374 row = KPD_INT1_ROW(key_status);
375 key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)];
376 sci_keypad_report_event(dev_id, col, row, false);
379 if ((int_status & KPD_PRESS_INT2)) {
380 col = KPD_INT2_COL(key_status);
381 row = KPD_INT2_ROW(key_status);
382 key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)];
383 sci_keypad_report_event(dev_id, col, row, true);
385 if (int_status & KPD_RELEASE_INT2) {
386 col = KPD_INT2_COL(key_status);
387 row = KPD_INT2_ROW(key_status);
388 key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)];
389 sci_keypad_report_event(dev_id, col, row, false);
392 if (int_status & KPD_PRESS_INT3) {
393 col = KPD_INT3_COL(key_status);
394 row = KPD_INT3_ROW(key_status);
395 key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)];
396 sci_keypad_report_event(dev_id, col, row, true);
398 if (int_status & KPD_RELEASE_INT3) {
399 col = KPD_INT3_COL(key_status);
400 row = KPD_INT3_ROW(key_status);
401 key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)];
402 sci_keypad_report_event(dev_id, col, row, false);
408 static irqreturn_t sci_powerkey_isr(int irq, void *dev_id)
409 { //TODO: if usign gpio(eic), need add row , cols to platform data.
410 static unsigned long last_value = 1;
411 unsigned short key = KEY_POWER;
412 unsigned long value = !(gpio_get_value(PB_INT));
413 struct sci_keypad_t *sci_kpd = dev_id;
415 wake_lock_timeout(&sci_kpd->key_wake_lock, WAKELOCK_TIME);
417 if (last_value == value) {
418 /* seems an event is missing, just report it */
419 input_report_key(sci_kpd->input_dev, key, last_value);
420 input_sync(sci_kpd->input_dev);
424 /* Release : low level */
425 #ifdef HOOK_POWER_KEY
426 input_report_key_hook(sci_kpd->input_dev, key, 0);
428 sci_kpd->powerkey_state = 0;
429 input_report_key(sci_kpd->input_dev, key, 0);
430 input_sync(sci_kpd->input_dev);
431 irq_set_irq_type(irq, IRQF_TRIGGER_HIGH);
433 /* Press : high level */
434 #ifdef HOOK_POWER_KEY
435 input_report_key_hook(sci_kpd->input_dev, key, 1);
437 sci_kpd->powerkey_state = 1;
438 input_report_key(sci_kpd->input_dev, key, 1);
439 input_sync(sci_kpd->input_dev);
440 irq_set_irq_type(irq, IRQF_TRIGGER_LOW);
444 sec_debug_check_crash_key(key, value);
451 static struct sci_keypad_platdata *sci_keypad_parse_dt(
454 struct sci_keypad_platform_data *pdata;
455 struct device_node *np = dev->of_node, *key_np;
456 uint32_t num_rows, num_cols;
457 uint32_t rows_choose_hw, cols_choose_hw;
458 uint32_t debounce_time;
459 struct matrix_keymap_data *keymap_data;
460 uint32_t *keymap, key_count;
464 ret = of_address_to_resource(np, 0, &res);
466 dev_err(dev, "no reg of property specified\n");
469 KPD_REG_BASE = (unsigned long)ioremap_nocache(res.start,
470 resource_size(&res));
473 PB_INT = of_get_gpio(np, 0);
475 dev_err(dev, "no gpios of property specified\n");
478 pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
480 dev_err(dev, "could not allocate memory for platform data\n");
483 ret = of_property_read_u32(np, "sprd,keypad-num-rows", &num_rows);
485 dev_err(dev, "no sprd,keypad-num-rows of property specified\n");
488 pdata->rows_number = num_rows;
490 ret = of_property_read_u32(np, "sprd,keypad-num-columns", &num_cols);
492 dev_err(dev, "no sprd,keypad-num-columns of property specified\n");
495 pdata->cols_number = num_cols;
497 ret = of_property_read_u32(np, "sprd,debounce_time", &debounce_time);
501 pdata->debounce_time = debounce_time;
503 if (of_get_property(np, "linux,input-no-autorepeat", NULL))
504 pdata->repeat = false;
505 if(of_get_property(np, "sprd,support_long_key", NULL))
506 pdata->support_long_key = false;
507 if (of_get_property(np, "linux,input-wakeup", NULL))
508 pdata->wakeup = true;
511 ret = of_property_read_u32(np, "sprd,keypad-rows-choose-hw", &rows_choose_hw);
513 dev_err(dev, "no sprd,keypad-rows-choose-hw of property specified\n");
516 pdata->rows_choose_hw = rows_choose_hw;
518 ret = of_property_read_u32(np, "sprd,keypad-cols-choose-hw", &cols_choose_hw);
520 dev_err(dev, "no sprd,keypad-cols-choose-hw of property specified\n");
523 pdata->cols_choose_hw = cols_choose_hw;
525 keymap_data = kzalloc(sizeof(*keymap_data), GFP_KERNEL);
527 dev_err(dev, "could not allocate memory for keymap_data\n");
530 pdata->keymap_data = keymap_data;
532 key_count = of_get_child_count(np);
533 keymap_data->keymap_size = key_count;
534 keymap = kzalloc(sizeof(uint32_t) * key_count, GFP_KERNEL);
536 dev_err(dev, "could not allocate memory for keymap\n");
539 keymap_data->keymap = keymap;
541 for_each_child_of_node(np, key_np) {
542 u32 row, col, key_code;
543 ret = of_property_read_u32(key_np, "keypad,row", &row);
545 goto fail_parse_keymap;
546 ret = of_property_read_u32(key_np, "keypad,column", &col);
548 goto fail_parse_keymap;
549 ret = of_property_read_u32(key_np, "linux,code", &key_code);
551 goto fail_parse_keymap;
552 *keymap++ = KEY(row, col, key_code);
553 pr_info("sci_keypad_parse_dt: %d, %d, %d\n",row, col, key_code);
560 dev_err(dev, "failed parsing keymap\n");
562 keymap_data->keymap = NULL;
565 pdata->keymap_data = NULL;
571 static struct sci_keypad_platdata *sci_keypad_parse_dt(
579 static int sprd_eic_button_state(void)
581 int button_state = 0;
584 gpio_value = !!gpio_get_value(PB_INT);
586 //if(1 == button->active_low) {
599 printk("GPIO_%d=%d, button_state=%d\n", PB_INT, gpio_value, button_state);
601 return button_state; //0==released, 1==pressed
604 static ssize_t sprd_eic_button_show(struct kobject *kobj, struct kobj_attribute *attr, char *buff)
608 status = sprd_eic_button_state();
609 printk("button status = %d (0 == released, 1 == pressed)\n", status);
610 return sprintf(buff, "%d\n", status);
613 static struct kobject *sprd_eic_button_kobj = NULL;
614 static struct kobj_attribute sprd_eic_button_attr =
615 __ATTR(status, 0644, sprd_eic_button_show, NULL);
617 static int sprd_eic_button_sysfs_init(void)
621 sprd_eic_button_kobj = kobject_create_and_add("sprd_eic_button", kernel_kobj);
622 if (sprd_eic_button_kobj == NULL) {
624 printk("register sysfs failed. ret = %d\n", ret);
628 ret = sysfs_create_file(sprd_eic_button_kobj, &sprd_eic_button_attr.attr);
630 printk("create sysfs failed. ret = %d\n", ret);
634 printk("sprd_eic_button_sysfs_init success\n");
639 static int sci_keypad_probe(struct platform_device *pdev)
641 struct sci_keypad_t *sci_kpd;
642 struct input_dev *input_dev;
643 struct sci_keypad_platform_data *pdata = pdev->dev.platform_data;
646 unsigned int row_shift, keycodemax;
647 struct device_node *np = pdev->dev.of_node;
649 if (pdev->dev.of_node && !pdata){
650 pdata = sci_keypad_parse_dt(&pdev->dev);
652 pdev->dev.platform_data = pdata;
656 printk(KERN_WARNING "sci_keypad_probe get platform_data NULL\n");
660 row_shift = get_count_order(pdata->cols_number);
661 keycodemax = pdata->rows_number << row_shift;
663 sci_kpd = kzalloc(sizeof(struct sci_keypad_t) +
664 keycodemax * sizeof(unsigned short), GFP_KERNEL);
665 input_dev = input_allocate_device();
667 if (!sci_kpd || !input_dev) {
671 platform_set_drvdata(pdev, sci_kpd);
673 wake_lock_init(&sci_kpd->key_wake_lock,
674 WAKE_LOCK_SUSPEND, "power-keys_wake_lock");
676 sci_kpd->input_dev = input_dev;
677 sci_kpd->rows = pdata->rows_number;
678 sci_kpd->cols = pdata->cols_number;
682 __raw_writel(KPD_INT_ALL, KPD_INT_CLR);
683 __raw_writel(CFG_ROW_POLARITY | CFG_COL_POLARITY, KPD_POLARITY);
684 __raw_writel(1, KPD_CLK_DIV_CNT);
685 __raw_writel(0xc, KPD_LONG_KEY_CNT);
686 __raw_writel(0x5, KPD_DEBOUNCE_CNT);
688 sci_kpd->irq = platform_get_irq(pdev, 0);
689 if (sci_kpd->irq < 0) {
691 dev_err(&pdev->dev, "Get irq number error,Keypad Module\n");
695 request_irq(sci_kpd->irq, sci_keypad_isr, IRQF_NO_SUSPEND, "sci-keypad", sci_kpd);
697 dev_err(&pdev->dev, "unable to claim irq %d\n", sci_kpd->irq);
701 input_dev->name = pdev->name;
703 input_dev->name = "sci-keypad";
705 input_dev->phys = "sci-key/input0";
706 input_dev->dev.parent = &pdev->dev;
707 input_set_drvdata(input_dev, sci_kpd);
709 input_dev->id.bustype = BUS_HOST;
710 input_dev->id.vendor = 0x0001;
711 input_dev->id.product = 0x0001;
712 input_dev->id.version = 0x0100;
714 input_dev->keycode = &sci_kpd[1];
715 input_dev->keycodesize = sizeof(unsigned short);
716 input_dev->keycodemax = keycodemax;
718 matrix_keypad_build_keymap(pdata->keymap_data, NULL, pdata->rows_number, pdata->cols_number,
719 input_dev->keycode, input_dev);
721 /* there are keys from hw other than keypad controller */
722 __set_bit(KEY_POWER, input_dev->keybit);
723 __set_bit(EV_KEY, input_dev->evbit);
725 __set_bit(EV_REP, input_dev->evbit);
727 error = input_register_device(input_dev);
729 dev_err(&pdev->dev, "unable to register input device\n");
732 device_init_wakeup(&pdev->dev, 1);
734 value = KPD_INT_DOWNUP;
735 if (pdata->support_long_key)
736 value |= KPD_INT_LONG;
737 __raw_writel(value, KPD_INT_EN);
738 value = KPD_SLEEP_CNT_VALUE(1000);
739 __raw_writel(value, KPD_SLEEP_CNT);
741 if (__keypad_controller_ver() == 0) {
742 if ((pdata->rows_choose_hw & ~KPDCTL_ROW_MSK_V0)
743 || (pdata->cols_choose_hw & ~KPDCTL_COL_MSK_V0)) {
744 pr_warn("Error rows_choose_hw Or cols_choose_hw\n");
746 pdata->rows_choose_hw &= KPDCTL_ROW_MSK_V0;
747 pdata->cols_choose_hw &= KPDCTL_COL_MSK_V0;
749 } else if (__keypad_controller_ver() == 1) {
750 if ((pdata->rows_choose_hw & ~KPDCTL_ROW_MSK_V1)
751 || (pdata->cols_choose_hw & ~KPDCTL_COL_MSK_V1)) {
752 pr_warn("Error rows_choose_hw\n");
754 pdata->rows_choose_hw &= KPDCTL_ROW_MSK_V1;
755 pdata->cols_choose_hw &= KPDCTL_COL_MSK_V1;
759 ("This driver don't support this keypad controller version Now\n");
762 KPD_EN | KPD_SLEEP_EN | pdata->
763 rows_choose_hw | pdata->cols_choose_hw;
764 if (pdata->support_long_key)
765 value |= KPD_LONG_KEY_EN;
766 __raw_writel(value, KPD_CTRL);
768 gpio_request(PB_INT, "powerkey");
769 gpio_direction_input(PB_INT);
770 error = request_irq(gpio_to_irq(PB_INT), sci_powerkey_isr,
771 IRQF_TRIGGER_HIGH | IRQF_NO_SUSPEND,
772 "powerkey", sci_kpd);
774 dev_err(&pdev->dev, "unable to claim irq %d\n",
775 gpio_to_irq(PB_INT));
779 key_dev = device_create(sec_class, NULL, 0, "%s", "sec_key");
780 if (device_create_file(key_dev, &dev_attr_sec_key_pressed) < 0)
781 pr_err("Failed to create device file(%s)!\n", dev_attr_sec_key_pressed.attr.name);
783 powerkey_dev = device_create(sec_class, NULL, 0, NULL, "sec_powerkey");
784 if (sysfs_create_group(&powerkey_dev->kobj, &sec_powerkey_attr_group))
785 pr_err("Failed to create sysfs group(%s)!\n", "sec_powerkey");
786 dev_set_drvdata(powerkey_dev, sci_kpd);
789 dump_keypad_register();
790 sprd_eic_button_sysfs_init();
793 free_irq(gpio_to_irq(PB_INT), pdev);
795 input_free_device(input_dev);
796 free_irq(sci_kpd->irq, pdev);
798 platform_set_drvdata(pdev, NULL);
805 static int sci_keypad_remove(struct
810 struct sci_keypad_t *sci_kpd = platform_get_drvdata(pdev);
811 struct sci_keypad_platform_data *pdata = pdev->dev.platform_data;
812 /* disable sci keypad controller */
813 __raw_writel(KPD_INT_ALL, KPD_INT_CLR);
814 value = __raw_readl(KPD_CTRL);
816 __raw_writel(value, KPD_CTRL);
819 wake_lock_destroy(&sci_kpd->key_wake_lock);
820 free_irq(sci_kpd->irq, pdev);
821 input_unregister_device(sci_kpd->input_dev);
823 platform_set_drvdata(pdev, NULL);
824 if(pdev->dev.of_node){
825 kfree(pdata->keymap_data->keymap);
826 kfree(pdata->keymap_data);
833 static int sci_keypad_suspend(struct platform_device *dev, pm_message_t state)
838 static int sci_keypad_resume(struct platform_device *dev)
840 struct sci_keypad_platform_data *pdata = dev->dev.platform_data;
844 __raw_writel(KPD_INT_ALL, KPD_INT_CLR);
845 __raw_writel(CFG_ROW_POLARITY | CFG_COL_POLARITY, KPD_POLARITY);
846 __raw_writel(1, KPD_CLK_DIV_CNT);
847 __raw_writel(0xc, KPD_LONG_KEY_CNT);
848 __raw_writel(0x5, KPD_DEBOUNCE_CNT);
850 value = KPD_INT_DOWNUP;
851 if (pdata->support_long_key)
852 value |= KPD_INT_LONG;
853 __raw_writel(value, KPD_INT_EN);
854 value = KPD_SLEEP_CNT_VALUE(1000);
855 __raw_writel(value, KPD_SLEEP_CNT);
858 KPD_EN | KPD_SLEEP_EN | pdata->
859 rows_choose_hw | pdata->cols_choose_hw;
860 if (pdata->support_long_key)
861 value |= KPD_LONG_KEY_EN;
862 __raw_writel(value, KPD_CTRL);
867 #define sci_keypad_suspend NULL
868 #define sci_keypad_resume NULL
871 static struct of_device_id keypad_match_table[] = {
872 { .compatible = "sprd,sci-keypad", },
875 struct platform_driver sci_keypad_driver = {
876 .probe = sci_keypad_probe,
877 .remove = sci_keypad_remove,
878 .suspend = sci_keypad_suspend,
879 .resume = sci_keypad_resume,
881 .name = "sci-keypad",.owner = THIS_MODULE,
882 .of_match_table = keypad_match_table,
886 static int __init sci_keypad_init(void)
888 #ifdef HOOK_POWER_KEY
891 return platform_driver_register(&sci_keypad_driver);
894 static void __exit sci_keypad_exit(void)
896 #ifdef HOOK_POWER_KEY
899 platform_driver_unregister(&sci_keypad_driver);
902 module_init(sci_keypad_init);
903 module_exit(sci_keypad_exit);
904 MODULE_LICENSE("GPL");
905 MODULE_AUTHOR("spreadtrum.com");
906 MODULE_DESCRIPTION("Keypad driver for spreadtrum:questions contact steve zhan");
907 MODULE_ALIAS("platform:sci-keypad");