From b636b56bf9fdb1d4a443e25f93e81adcbf780d37 Mon Sep 17 00:00:00 2001 From: Paul Keith Date: Tue, 4 Oct 2016 06:10:44 -0700 Subject: [PATCH] ss_vibrator: Make sysfs compatible with CMHW * Add default/max/min/threshold * Change max value to 100 * Move intensity sysfs for CMHW * Minor driver cleanups apq8084 tweaks: * Add DEFAULT_INTENSITY and set it to 5000; use as default value in ss_vibrator_probe and pwm_default_show * Use DEFAULT_INTENSITY and MAX_INTENSITY in pwm_default_show and pmw_max_show Change-Id: Ie7ce0319e2df717c2a8cbf6ce23baab201fc0350 Signed-off-by: Paul Keith Signed-off-by: Corinna Vinschen [haggertk]: Bring cvxda's apq8084 version back into klte tree Signed-off-by: Kevin F. Haggerty --- drivers/motor/ss_vibrator.c | 72 +++++++++++++++++++++++++++---------- drivers/motor/ss_vibrator.h | 1 + 2 files changed, 54 insertions(+), 19 deletions(-) diff --git a/drivers/motor/ss_vibrator.c b/drivers/motor/ss_vibrator.c index c32d7b16c09..e41abe91dac 100755 --- a/drivers/motor/ss_vibrator.c +++ b/drivers/motor/ss_vibrator.c @@ -56,12 +56,12 @@ struct ss_vib { void vibe_set_intensity(int intensity) { - if (0 == intensity) + if (intensity == 0) vibe_pwm_onoff(0); else { - if (MAX_INTENSITY == intensity) + if (intensity == MAX_INTENSITY) intensity = 1; - else if (0 != intensity) { + else if (intensity != 0) { int tmp = MAX_INTENSITY - intensity; intensity = (tmp / 79); // 79 := 10000 / 127 } @@ -252,7 +252,8 @@ static void set_vibrator(struct ss_vib *vib) gpio_direction_output(vibrator_drvdata.vib_en_gpio,VIBRATION_ON); gpio_set_value(vibrator_drvdata.vib_en_gpio,VIBRATION_ON); #endif - hrtimer_start(&vib->vib_timer, ktime_set(vib->timevalue / 1000, (vib->timevalue % 1000) * 1000000),HRTIMER_MODE_REL); + hrtimer_start(&vib->vib_timer, ktime_set(vib->timevalue / 1000, + (vib->timevalue % 1000) * 1000000),HRTIMER_MODE_REL); } else { if(vibrator_drvdata.is_pmic_vib_pwm){ //PMIC PWM gpio_set_value(vibrator_drvdata.vib_pwm_gpio, \ @@ -308,7 +309,8 @@ static void vibrator_enable(struct timed_output_dev *dev, int value) pr_info("[VIB]: OFF\n"); vib->state = 0; } else { - pr_info("[VIB]: ON, Duration : %d msec, intensity : %d\n", value, vib->intensity); + pr_info("[VIB]: ON, Duration : %d msec, intensity : %d\n", + value, vib->intensity); vib->state = 1; vib->timevalue = value; } @@ -727,27 +729,27 @@ static ssize_t store_vib_tuning(struct device *dev, g_nlra_gp_clk_m, g_nlra_gp_clk_n, g_nlra_gp_clk_d, g_nlra_gp_clk_pwm_mul, motor_strength, motor_min_strength); - return count; -} + return count; +} -static DEVICE_ATTR(vib_tuning, 0660, show_vib_tuning, store_vib_tuning); +static DEVICE_ATTR(vib_tuning, 0660, show_vib_tuning, store_vib_tuning); static ssize_t intensity_store(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) { struct timed_output_dev *t_dev = dev_get_drvdata(dev); - struct ss_vib *vib = container_of(t_dev, struct ss_vib, timed_dev); - int ret = 0, set_intensity = 0; + struct ss_vib *vib = container_of(t_dev, struct ss_vib, timed_dev); + int ret = 0, set_intensity = 0; ret = kstrtoint(buf, 0, &set_intensity); - if ((set_intensity < 0) || (set_intensity > MAX_INTENSITY)) { - pr_err("[VIB]: %sout of rage\n", __func__); + if ((set_intensity < 0) || (set_intensity > (MAX_INTENSITY / 100))) { + pr_err("[VIB]: %sout of range\n", __func__); return -EINVAL; } - vibe_set_intensity(set_intensity); - vib->intensity = set_intensity; + vibe_set_intensity((set_intensity * 100)); + vib->intensity = (set_intensity * 100); return count; } @@ -756,12 +758,40 @@ static ssize_t intensity_show(struct device *dev, struct device_attribute *attr, char *buf) { struct timed_output_dev *t_dev = dev_get_drvdata(dev); - struct ss_vib *vib = container_of(t_dev, struct ss_vib, timed_dev); + struct ss_vib *vib = container_of(t_dev, struct ss_vib, timed_dev); - return sprintf(buf, "intensity: %u\n", vib->intensity); + return sprintf(buf, "%u\n", (vib->intensity / 100)); } -static DEVICE_ATTR(intensity, 0660, intensity_show, intensity_store); +static ssize_t pwm_default_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%u\n", (DEFAULT_INTENSITY / 100)); +} + +static ssize_t pwm_max_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%u\n", (MAX_INTENSITY / 100)); +} + +static ssize_t pwm_min_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%u\n", 0); +} + +static ssize_t pwm_threshold_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%u\n", 75); +} + +static DEVICE_ATTR(pwm_default, 0444, pwm_default_show, NULL); +static DEVICE_ATTR(pwm_max, 0444, pwm_max_show, NULL); +static DEVICE_ATTR(pwm_min, 0444, pwm_min_show, NULL); +static DEVICE_ATTR(pwm_threshold, 0444, pwm_threshold_show, NULL); +static DEVICE_ATTR(pwm_value, 0644, intensity_show, intensity_store); static int ss_vibrator_probe(struct platform_device *pdev) { @@ -805,7 +835,7 @@ static int ss_vibrator_probe(struct platform_device *pdev) vibrator_drvdata.pwm_dev = NULL; vib->state = 0; - vib->intensity = MAX_INTENSITY; + vib->intensity = DEFAULT_INTENSITY; vib->timeout = VIB_DEFAULT_TIMEOUT; vibrator_initialize(); @@ -834,7 +864,11 @@ static int ss_vibrator_probe(struct platform_device *pdev) goto err_read_vib; } - rc = sysfs_create_file(&vib->timed_dev.dev->kobj, &dev_attr_intensity.attr); + rc = sysfs_create_file(&vib->timed_dev.dev->kobj, &dev_attr_pwm_default.attr); + rc = sysfs_create_file(&vib->timed_dev.dev->kobj, &dev_attr_pwm_min.attr); + rc = sysfs_create_file(&vib->timed_dev.dev->kobj, &dev_attr_pwm_max.attr); + rc = sysfs_create_file(&vib->timed_dev.dev->kobj, &dev_attr_pwm_threshold.attr); + rc = sysfs_create_file(&vib->timed_dev.dev->kobj, &dev_attr_pwm_value.attr); if (rc < 0) { pr_err("[VIB]: Failed to register sysfs intensity: %d\n", rc); } diff --git a/drivers/motor/ss_vibrator.h b/drivers/motor/ss_vibrator.h index ee63a672e1e..0af19bbf7d7 100644 --- a/drivers/motor/ss_vibrator.h +++ b/drivers/motor/ss_vibrator.h @@ -33,6 +33,7 @@ struct pm_gpio vib_pwm = { #define VIBRATION_ON 1 #define VIBRATION_OFF 0 +#define DEFAULT_INTENSITY 5000 #define MAX_INTENSITY 10000 #if defined(CONFIG_MACH_KS01SKT) \