diff options
| author | Doug Zobel <dzobel1@motorola.com> | 2014-05-28 14:56:04 -0500 | 
|---|---|---|
| committer | Jee Su Chang <w20740@motorola.com> | 2014-05-28 22:56:20 +0000 | 
| commit | c66cbe57cd16f9f170f1116f6646705b4e65f50f (patch) | |
| tree | 73722b58995cde36a185ca569100a2fe8060d1e1 /drivers | |
| parent | 6c26f50d6d2f5f7d3b13b24af5912bae663f6f1c (diff) | |
| download | olio-linux-3.10-c66cbe57cd16f9f170f1116f6646705b4e65f50f.tar.xz olio-linux-3.10-c66cbe57cd16f9f170f1116f6646705b4e65f50f.zip | |
IKXCLOCK-1662 vib: device vibrates continously
Hold wakelock while vibrator is on
Change-Id: Ic5bf79e033726bf729500c754109be5a4c60c647
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/misc/vib-gpio.c | 21 | 
1 files changed, 17 insertions, 4 deletions
| diff --git a/drivers/misc/vib-gpio.c b/drivers/misc/vib-gpio.c index 98a17d79b10..c893bd544e4 100644 --- a/drivers/misc/vib-gpio.c +++ b/drivers/misc/vib-gpio.c @@ -24,6 +24,7 @@  #include <linux/slab.h>  #include <linux/regulator/consumer.h>  #include <linux/of.h> +#include <linux/wakelock.h>  /* TODO: replace with correct header */  #include "../staging/android/timed_output.h" @@ -34,6 +35,7 @@ struct vib_gpio_data {  	struct hrtimer timer;  	spinlock_t lock;  	struct mutex io_mutex; /* protect GPIO & regulator operations */ +	struct wake_lock wake_lock;  	struct regulator *reg;  	int gpio; @@ -70,6 +72,9 @@ static void vib_gpio_set(struct vib_gpio_data *vib_data, int on)  	mutex_lock(&(vib_data->io_mutex));  	if (on) { +		if (!wake_lock_active(&vib_data->wake_lock)) +			wake_lock(&vib_data->wake_lock); +  		if (!vib_data->vib_power_state) {  			power_on(vib_data);  			vib_data->vib_power_state = 1; @@ -86,6 +91,8 @@ static void vib_gpio_set(struct vib_gpio_data *vib_data, int on)  			power_off(vib_data);  			vib_data->vib_power_state = 0;  		} + +		wake_unlock(&vib_data->wake_lock);  	}  	mutex_unlock(&(vib_data->io_mutex)); @@ -165,6 +172,8 @@ static int vib_gpio_probe(struct platform_device *pdev)  	mutex_init(&(vib_data->io_mutex)); +	wake_lock_init(&vib_data->wake_lock, WAKE_LOCK_SUSPEND, "vibrator"); +  	platform_set_drvdata(pdev, vib_data);  	vib_data->gpio = -1; @@ -176,7 +185,7 @@ static int vib_gpio_probe(struct platform_device *pdev)  	np = pdev->dev.of_node;  	if (!np) {  		dev_err(&pdev->dev, "required device_tree entry not found\n"); -		goto free_mem; +		goto destroy_wakelock;  	}  	if (!of_property_read_u32(np, "gpio", &prop)) @@ -195,7 +204,7 @@ static int vib_gpio_probe(struct platform_device *pdev)  	vib_data->reg = regulator_get(&pdev->dev, "vib-gpio");  	if (IS_ERR(vib_data->reg)) {  		ret = PTR_ERR(vib_data->reg); -		goto free_mem; +		goto destroy_wakelock;  	}  	INIT_WORK(&vib_data->vib_work, vib_gpio_update); @@ -218,13 +227,14 @@ static int vib_gpio_probe(struct platform_device *pdev)  	vib_gpio_enable(&vib_data->dev, vib_data->initial_vibrate); -	pr_info("vib gpio probe done"); +	pr_info("vib gpio probe done\n");  	return 0;  reg_put:  	regulator_put(vib_data->reg); +destroy_wakelock: +	wake_lock_destroy(&vib_data->wake_lock);  	mutex_destroy(&(vib_data->io_mutex)); -free_mem:  	kfree(vib_data);  err:  	return ret; @@ -236,6 +246,9 @@ static int vib_gpio_remove(struct platform_device *pdev)  	timed_output_dev_unregister(&vib_data->dev);  	regulator_put(vib_data->reg); +	if (wake_lock_active(&vib_data->wake_lock)) +		wake_unlock(&vib_data->wake_lock); +	wake_lock_destroy(&vib_data->wake_lock);  	mutex_destroy(&(vib_data->io_mutex));  	kfree(vib_data); |