From: Seung-Woo Kim Date: Wed, 27 Feb 2019 01:42:30 +0000 (+0900) Subject: input: tizen_detent: apply open/close to support enabled sysfs node X-Git-Tag: submit/tizen/20190228.014846^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0ab5ab24d342df74ee6c05254c7524ef18632073;p=profile%2Fwearable%2Fplatform%2Fkernel%2Flinux-3.18-exynos7270.git input: tizen_detent: apply open/close to support enabled sysfs node To support input device enabled sysfs node functionality, apply open/close operation as like TW3. NOTE: the operation code is from drivers/input/misc/tizen_bezel.c of profile/wearable/platform/kernel/linux-4.9-exynos9110 git tree. Change-Id: I92e95658677556185626bd2ebf6014ef00b1dafb Signed-off-by: Seung-Woo Kim --- diff --git a/drivers/input/misc/tizen_detent.c b/drivers/input/misc/tizen_detent.c index 2ed6aaa026b..ce5a8b1bb57 100644 --- a/drivers/input/misc/tizen_detent.c +++ b/drivers/input/misc/tizen_detent.c @@ -118,6 +118,9 @@ static irqreturn_t hall_sensor_detect_handler(int irq, void *dev_id) if (!ddata->probe_done) goto out; + if (!ddata->open_state) + goto out; + mutex_lock(&ddata->hall_lock); value = hall_sensor_get_status(ddata); @@ -212,7 +215,7 @@ static int hall_sensor_get_sleep_monitor_cb(void* priv, unsigned int *raw_val, i if ((check_level == SLEEP_MONITOR_CHECK_SOFT) ||\ (check_level == SLEEP_MONITOR_CHECK_HARD)){ - if (ddata->resume_state) + if (ddata->open_state) state = DEVICE_ON_ACTIVE1; else state = DEVICE_POWER_OFF; @@ -343,6 +346,53 @@ static struct of_device_id hall_sensor_of_match[] = { }; MODULE_DEVICE_TABLE(of, hall_sensor_of_match); +static int detent_open(struct input_dev *input) +{ + struct device *dev = input->dev.parent; + struct hall_sensor_driverdata *ddata = dev_get_drvdata(dev); + + if (!ddata->probe_done) + return 0; + + hall_sensor_power_on(ddata); + + enable_irq(ddata->hall_a_irq); + enable_irq(ddata->hall_b_irq); + enable_irq(ddata->hall_c_irq); + enable_irq_wake(ddata->hall_a_irq); + enable_irq_wake(ddata->hall_b_irq); + enable_irq_wake(ddata->hall_c_irq); + + ddata->last_status = hall_sensor_get_status(ddata); + ddata->open_state = true; + + dev_info(dev, "%s\n", __func__); + + return 0; +} + +static void detent_close(struct input_dev *input) +{ + struct device *dev = input->dev.parent; + struct hall_sensor_driverdata *ddata = dev_get_drvdata(dev); + + if (!ddata->probe_done) + return; + + ddata->open_state = false; + + disable_irq_wake(ddata->hall_a_irq); + disable_irq_wake(ddata->hall_b_irq); + disable_irq_wake(ddata->hall_c_irq); + disable_irq(ddata->hall_a_irq); + disable_irq(ddata->hall_b_irq); + disable_irq(ddata->hall_c_irq); + + hall_sensor_power_off(ddata); + + dev_info(dev, "%s\n", __func__); +} + static int __devinit hall_sensor_probe(struct platform_device *pdev) { struct hall_sensor_platform_data *pdata; @@ -407,6 +457,8 @@ static int __devinit hall_sensor_probe(struct platform_device *pdev) ddata->input_dev->id.vendor = 0x0001; ddata->input_dev->id.product = 0x0001; ddata->input_dev->id.version = 0x0100; + ddata->input_dev->open = detent_open; + ddata->input_dev->close = detent_close; ret = hall_sensor_regulator_init(ddata); if (ret) { @@ -588,6 +640,7 @@ static int __devinit hall_sensor_probe(struct platform_device *pdev) goto err_create_group; } + ddata->open_state = true; ddata->resume_state = true; ddata->probe_done = true; diff --git a/include/linux/input/tizen_detent.h b/include/linux/input/tizen_detent.h index 2d2dd2575cd..226d62da3ac 100644 --- a/include/linux/input/tizen_detent.h +++ b/include/linux/input/tizen_detent.h @@ -41,6 +41,7 @@ struct hall_sensor_driverdata { bool a_status; bool b_status; bool c_status; + bool open_state; bool resume_state; int last_status; int last_value;