/*----------------------------------------------------------------------------*/ static int kpd_create_attr(struct device_driver *driver) { int idx, err = 0; int num = (int)(sizeof(kpd_attr_list) / sizeof(kpd_attr_list[0])); if (driver == NULL) return -EINVAL; for (idx = 0; idx < num; idx++) { err = driver_create_file(driver, kpd_attr_list[idx]); if (err) { kpd_info("driver_create_file (%s) = %d\n", kpd_attr_list[idx]->attr.name, err); break; } } return err; }
static int __init kpd_mod_init(void) { int r; r = platform_driver_register(&kpd_pdrv); if (r) { kpd_info("register driver failed (%d)\n", r); return r; } #ifdef USE_EARLY_SUSPEND register_early_suspend(&kpd_early_suspend_desc); #endif #ifdef CONFIG_MTK_SMARTBOOK_SUPPORT #ifdef CONFIG_HAS_SBSUSPEND register_sb_handler(&kpd_sb_handler_desc); #endif #endif return 0; }
static int kpd_pdrv_probe(struct platform_device *pdev) { int i, r; int err = 0; struct clk *kpd_clk = NULL; kpd_info("Keypad probe start!!!\n"); /*kpd-clk should be control by kpd driver, not depend on default clock state*/ kpd_clk = devm_clk_get(&pdev->dev, "kpd-clk"); if (!IS_ERR(kpd_clk)) { clk_prepare(kpd_clk); clk_enable(kpd_clk); } else { kpd_print("get kpd-clk fail, but not return, maybe kpd-clk is set by ccf.\n"); } kp_base = of_iomap(pdev->dev.of_node, 0); if (!kp_base) { kpd_info("KP iomap failed\n"); return -ENODEV; }; kp_irqnr = irq_of_parse_and_map(pdev->dev.of_node, 0); if (!kp_irqnr) { kpd_info("KP get irqnr failed\n"); return -ENODEV; } kpd_info("kp base: 0x%p, addr:0x%p, kp irq: %d\n", kp_base, &kp_base, kp_irqnr); /* initialize and register input device (/dev/input/eventX) */ kpd_input_dev = input_allocate_device(); if (!kpd_input_dev) { kpd_print("input allocate device fail.\n"); return -ENOMEM; } kpd_input_dev->name = KPD_NAME; kpd_input_dev->id.bustype = BUS_HOST; kpd_input_dev->id.vendor = 0x2454; kpd_input_dev->id.product = 0x6500; kpd_input_dev->id.version = 0x0010; kpd_input_dev->open = kpd_open; kpd_get_dts_info(pdev->dev.of_node); #ifdef CONFIG_ARCH_MT8173 wake_lock_init(&pwrkey_lock, WAKE_LOCK_SUSPEND, "PWRKEY"); #endif /* fulfill custom settings */ kpd_memory_setting(); __set_bit(EV_KEY, kpd_input_dev->evbit); #if defined(CONFIG_KPD_PWRKEY_USE_EINT) || defined(CONFIG_KPD_PWRKEY_USE_PMIC) __set_bit(kpd_dts_data.kpd_sw_pwrkey, kpd_input_dev->keybit); kpd_keymap[8] = 0; #endif if (!kpd_dts_data.kpd_use_extend_type) { for (i = 17; i < KPD_NUM_KEYS; i += 9) /* only [8] works for Power key */ kpd_keymap[i] = 0; } for (i = 0; i < KPD_NUM_KEYS; i++) { if (kpd_keymap[i] != 0) __set_bit(kpd_keymap[i], kpd_input_dev->keybit); } #if KPD_AUTOTEST for (i = 0; i < ARRAY_SIZE(kpd_auto_keymap); i++) __set_bit(kpd_auto_keymap[i], kpd_input_dev->keybit); #endif #if KPD_HAS_SLIDE_QWERTY __set_bit(EV_SW, kpd_input_dev->evbit); __set_bit(SW_LID, kpd_input_dev->swbit); #endif if (kpd_dts_data.kpd_sw_rstkey) __set_bit(kpd_dts_data.kpd_sw_rstkey, kpd_input_dev->keybit); #ifdef KPD_KEY_MAP __set_bit(KPD_KEY_MAP, kpd_input_dev->keybit); #endif #ifdef CONFIG_MTK_MRDUMP_KEY __set_bit(KEY_RESTART, kpd_input_dev->keybit); #endif kpd_input_dev->dev.parent = &pdev->dev; r = input_register_device(kpd_input_dev); if (r) { kpd_info("register input device failed (%d)\n", r); input_free_device(kpd_input_dev); return r; } /* register device (/dev/mt6575-kpd) */ kpd_dev.parent = &pdev->dev; r = misc_register(&kpd_dev); if (r) { kpd_info("register device failed (%d)\n", r); input_unregister_device(kpd_input_dev); return r; } wake_lock_init(&kpd_suspend_lock, WAKE_LOCK_SUSPEND, "kpd wakelock"); /* register IRQ and EINT */ kpd_set_debounce(kpd_dts_data.kpd_key_debounce); r = request_irq(kp_irqnr, kpd_irq_handler, IRQF_TRIGGER_NONE, KPD_NAME, NULL); if (r) { kpd_info("register IRQ failed (%d)\n", r); misc_deregister(&kpd_dev); input_unregister_device(kpd_input_dev); return r; } mt_eint_register(); #ifndef KPD_EARLY_PORTING /*add for avoid early porting build err the macro is defined in custom file */ long_press_reboot_function_setting(); /* /API 4 for kpd long press reboot function setting */ #endif hrtimer_init(&aee_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); aee_timer.function = aee_timer_func; #if AEE_ENABLE_5_15 hrtimer_init(&aee_timer_5s, CLOCK_MONOTONIC, HRTIMER_MODE_REL); aee_timer_5s.function = aee_timer_5s_func; #endif err = kpd_create_attr(&kpd_pdrv.driver); if (err) { kpd_info("create attr file fail\n"); kpd_delete_attr(&kpd_pdrv.driver); return err; } kpd_info("%s Done\n", __func__); return 0; }
//Camera key bring up -E static int kpd_pdrv_probe(struct platform_device *pdev) { int i, r; int err = 0; struct clk *kpd_clk = NULL; //Keypad porting - S #if 1 struct pinctrl *pinctrl1; struct pinctrl_state *pins_default, *pins_eint_int; #endif //Keypad porting - E kpd_info("Keypad probe start!!!\n"); /*kpd-clk should be control by kpd driver, not depend on default clock state*/ kpd_clk = devm_clk_get(&pdev->dev, "kpd-clk"); if (!IS_ERR(kpd_clk)) { clk_prepare(kpd_clk); clk_enable(kpd_clk); } else { kpd_print("get kpd-clk fail, but not return, maybe kpd-clk is set by ccf.\n"); } kp_base = of_iomap(pdev->dev.of_node, 0); if (!kp_base) { kpd_info("KP iomap failed\n"); return -ENODEV; }; kp_irqnr = irq_of_parse_and_map(pdev->dev.of_node, 0); if (!kp_irqnr) { kpd_info("KP get irqnr failed\n"); return -ENODEV; } kpd_info("kp base: 0x%p, addr:0x%p, kp irq: %d\n", kp_base, &kp_base, kp_irqnr); /* initialize and register input device (/dev/input/eventX) */ kpd_input_dev = input_allocate_device(); if (!kpd_input_dev) { kpd_print("input allocate device fail.\n"); return -ENOMEM; } kpd_input_dev->name = KPD_NAME; kpd_input_dev->id.bustype = BUS_HOST; kpd_input_dev->id.vendor = 0x2454; kpd_input_dev->id.product = 0x6500; kpd_input_dev->id.version = 0x0010; kpd_input_dev->open = kpd_open; kpd_get_dts_info(pdev->dev.of_node); #ifdef CONFIG_ARCH_MT8173 wake_lock_init(&pwrkey_lock, WAKE_LOCK_SUSPEND, "PWRKEY"); #endif /* fulfill custom settings */ kpd_memory_setting(); __set_bit(EV_KEY, kpd_input_dev->evbit); //keypad bring up - S #if 1 //for volume down key pinctrl1 = devm_pinctrl_get(&pdev->dev); if (IS_ERR(pinctrl1)) { err = PTR_ERR(pinctrl1); dev_err(&pdev->dev, "fwq Cannot find voldown pinctrl1!\n"); return err; } pins_default = pinctrl_lookup_state(pinctrl1, "default"); if (IS_ERR(pins_default)) { err = PTR_ERR(pins_default); dev_err(&pdev->dev, "fwq Cannot find voldown pinctrl default!\n"); } pins_eint_int = pinctrl_lookup_state(pinctrl1, "kpd_pins_eint"); if (IS_ERR(pins_eint_int)) { err = PTR_ERR(pins_eint_int); dev_err(&pdev->dev, "fwq Cannot find voldown pinctrl state_eint_int!\n"); return err; } #endif #if 0 gpio_request(KPD_VOLUP , "KPD_KCOL1"); gpio_direction_input(KPD_VOLUP); gpio_free(KPD_VOLUP); #endif pinctrl_select_state(pinctrl1, pins_eint_int); //keypad bring up - E /**/ err = hall_gpio_eint_setup(pdev); if (err!=0) { kpd_print("[Keypad] %s , hall_gpio_eint_setup failed (%d)\n", __FUNCTION__ , err ); } proc_create_data("hall_out_status", 0444, NULL, &hall_out_status_fops, NULL); sdev.name = "hall_gpio"; sdev.index = 0; sdev.state = 1; r = switch_dev_register(&sdev); if (r) { kpd_info("[Keypad] %s , register switch device failed (%d)\n", __FUNCTION__ , r); switch_dev_unregister(&sdev); return r; } /**/ switch_set_state((struct switch_dev *)&sdev, 1); // state initialization /**/ /**/ mutex_init(&hall_state_mutex); INIT_DELAYED_WORK(&hall_work, hall_work_func); /**/ /**/ #if defined(CONFIG_KPD_PWRKEY_USE_EINT) || defined(CONFIG_KPD_PWRKEY_USE_PMIC) __set_bit(kpd_dts_data.kpd_sw_pwrkey, kpd_input_dev->keybit); kpd_keymap[8] = 0; #endif if (!kpd_dts_data.kpd_use_extend_type) { for (i = 17; i < KPD_NUM_KEYS; i += 9) /* only [8] works for Power key */ kpd_keymap[i] = 0; } for (i = 0; i < KPD_NUM_KEYS; i++) { if (kpd_keymap[i] != 0) __set_bit(kpd_keymap[i], kpd_input_dev->keybit); } #if KPD_AUTOTEST for (i = 0; i < ARRAY_SIZE(kpd_auto_keymap); i++) __set_bit(kpd_auto_keymap[i], kpd_input_dev->keybit); #endif #if KPD_HAS_SLIDE_QWERTY __set_bit(EV_SW, kpd_input_dev->evbit); __set_bit(SW_LID, kpd_input_dev->swbit); #endif if (kpd_dts_data.kpd_sw_rstkey) __set_bit(kpd_dts_data.kpd_sw_rstkey, kpd_input_dev->keybit); #ifdef KPD_KEY_MAP __set_bit(KPD_KEY_MAP, kpd_input_dev->keybit); #endif #ifdef CONFIG_MTK_MRDUMP_KEY __set_bit(KEY_RESTART, kpd_input_dev->keybit); #endif //Caerma key porting #if 1 for (i = 0; i < KPD_CAMERA_NUM; i++) { if (kpd_camerakeymap[i] != 0) __set_bit(kpd_camerakeymap[i], kpd_input_dev->keybit); kpd_info("[Keypad] set kpd_camerakeymap[%d]" , i); } #endif kpd_input_dev->dev.parent = &pdev->dev; r = input_register_device(kpd_input_dev); if (r) { kpd_info("register input device failed (%d)\n", r); input_free_device(kpd_input_dev); return r; } /* register device (/dev/mt6575-kpd) */ kpd_dev.parent = &pdev->dev; r = misc_register(&kpd_dev); if (r) { kpd_info("register device failed (%d)\n", r); input_unregister_device(kpd_input_dev); return r; } wake_lock_init(&kpd_suspend_lock, WAKE_LOCK_SUSPEND, "kpd wakelock"); /* register IRQ and EINT */ kpd_set_debounce(kpd_dts_data.kpd_key_debounce); r = request_irq(kp_irqnr, kpd_irq_handler, IRQF_TRIGGER_NONE, KPD_NAME, NULL); if (r) { kpd_info("register IRQ failed (%d)\n", r); misc_deregister(&kpd_dev); input_unregister_device(kpd_input_dev); return r; } mt_eint_register(); //Camera key bring up -S printk("camera_key_setup_eint() START!!\n"); kpd_camerakey_setup_eint(); printk("camera_key_setup_eint() Done!!\n"); //Camera key bring up -E #ifndef KPD_EARLY_PORTING /*add for avoid early porting build err the macro is defined in custom file */ long_press_reboot_function_setting(); /* /API 4 for kpd long press reboot function setting */ #endif hrtimer_init(&aee_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); aee_timer.function = aee_timer_func; #if AEE_ENABLE_5_15 hrtimer_init(&aee_timer_5s, CLOCK_MONOTONIC, HRTIMER_MODE_REL); aee_timer_5s.function = aee_timer_5s_func; #endif #ifdef PWK_DUMP hrtimer_init(&aee_timer_powerkey_30s, CLOCK_MONOTONIC, HRTIMER_MODE_REL); aee_timer_powerkey_30s.function = aee_timer_30s_func; #endif err = kpd_create_attr(&kpd_pdrv.driver); if (err) { kpd_info("create attr file fail\n"); kpd_delete_attr(&kpd_pdrv.driver); return err; } kpd_info("%s Done\n", __func__); return 0; }