linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/4] Input: twl*-vibra cleanups (devm_* conversion, system wq)
@ 2013-01-11  9:27 Peter Ujfalusi
  2013-01-11  9:28 ` [PATCH v2 1/4] Input: twl4030-vibra: Convert to use devm_* in probe Peter Ujfalusi
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Peter Ujfalusi @ 2013-01-11  9:27 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input, linux-kernel

Hi Dmitry,

Changes since v1:
- Use devm_input_allocate_device()
- swtich drivers to use system workqueue

Cover letter from v1 (resend set):

This series seams to got lost:
https://lkml.org/lkml/2012/6/15/128

Can you take it for 3.9?

Convert the twl4030, twl6040 vibra drivers to use devm_ at probe time to clean
up the code a bit.
The twl6040-vibra driver needed bigger change since the ordering of the
initialization was not correct.

Regards,
Peter
---
Peter Ujfalusi (4):
  Input: twl4030-vibra: Convert to use devm_* in probe
  input: twl4030-vibra: Use system workqueue
  Input: twl6040-vibra: Code cleanup in probe with devm_* conversion
  input: twl6040-vibra: Use system workqueue

 drivers/input/misc/twl4030-vibra.c |  45 ++--------------
 drivers/input/misc/twl6040-vibra.c | 106 +++++++++++++++----------------------
 2 files changed, 47 insertions(+), 104 deletions(-)

-- 
1.8.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 1/4] Input: twl4030-vibra: Convert to use devm_* in probe
  2013-01-11  9:27 [PATCH v2 0/4] Input: twl*-vibra cleanups (devm_* conversion, system wq) Peter Ujfalusi
@ 2013-01-11  9:28 ` Peter Ujfalusi
  2013-01-11 17:06   ` Dmitry Torokhov
  2013-01-11  9:28 ` [PATCH v2 2/4] input: twl4030-vibra: Use system workqueue Peter Ujfalusi
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Peter Ujfalusi @ 2013-01-11  9:28 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input, linux-kernel

Cleanup to use devm_* when it is possible at probe time.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
---
 drivers/input/misc/twl4030-vibra.c | 26 ++++----------------------
 1 file changed, 4 insertions(+), 22 deletions(-)

diff --git a/drivers/input/misc/twl4030-vibra.c b/drivers/input/misc/twl4030-vibra.c
index 78eb6b3..e2e2a26 100644
--- a/drivers/input/misc/twl4030-vibra.c
+++ b/drivers/input/misc/twl4030-vibra.c
@@ -219,7 +219,7 @@ static int twl4030_vibra_probe(struct platform_device *pdev)
 		return -EINVAL;
 	}
 
-	info = kzalloc(sizeof(*info), GFP_KERNEL);
+	info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
 	if (!info)
 		return -ENOMEM;
 
@@ -227,11 +227,10 @@ static int twl4030_vibra_probe(struct platform_device *pdev)
 	info->coexist = twl4030_vibra_check_coexist(pdata, twl4030_core_node);
 	INIT_WORK(&info->play_work, vibra_play_work);
 
-	info->input_dev = input_allocate_device();
+	info->input_dev = devm_input_allocate_device(&pdev->dev);
 	if (info->input_dev == NULL) {
 		dev_err(&pdev->dev, "couldn't allocate input device\n");
-		ret = -ENOMEM;
-		goto err_kzalloc;
+		return -ENOMEM;
 	}
 
 	input_set_drvdata(info->input_dev, info);
@@ -246,7 +245,7 @@ static int twl4030_vibra_probe(struct platform_device *pdev)
 	ret = input_ff_create_memless(info->input_dev, NULL, vibra_play);
 	if (ret < 0) {
 		dev_dbg(&pdev->dev, "couldn't register vibrator to FF\n");
-		goto err_ialloc;
+		return ret;
 	}
 
 	ret = input_register_device(info->input_dev);
@@ -262,28 +261,11 @@ static int twl4030_vibra_probe(struct platform_device *pdev)
 
 err_iff:
 	input_ff_destroy(info->input_dev);
-err_ialloc:
-	input_free_device(info->input_dev);
-err_kzalloc:
-	kfree(info);
 	return ret;
 }
 
-static int twl4030_vibra_remove(struct platform_device *pdev)
-{
-	struct vibra_info *info = platform_get_drvdata(pdev);
-
-	/* this also free ff-memless and calls close if needed */
-	input_unregister_device(info->input_dev);
-	kfree(info);
-	platform_set_drvdata(pdev, NULL);
-
-	return 0;
-}
-
 static struct platform_driver twl4030_vibra_driver = {
 	.probe		= twl4030_vibra_probe,
-	.remove		= twl4030_vibra_remove,
 	.driver		= {
 		.name	= "twl4030-vibra",
 		.owner	= THIS_MODULE,
-- 
1.8.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 2/4] input: twl4030-vibra: Use system workqueue
  2013-01-11  9:27 [PATCH v2 0/4] Input: twl*-vibra cleanups (devm_* conversion, system wq) Peter Ujfalusi
  2013-01-11  9:28 ` [PATCH v2 1/4] Input: twl4030-vibra: Convert to use devm_* in probe Peter Ujfalusi
@ 2013-01-11  9:28 ` Peter Ujfalusi
  2013-01-11 17:06   ` Dmitry Torokhov
  2013-01-11  9:28 ` [PATCH v2 3/4] Input: twl6040-vibra: Code cleanup in probe with devm_* conversion Peter Ujfalusi
  2013-01-11  9:28 ` [PATCH v2 4/4] input: twl6040-vibra: Use system workqueue Peter Ujfalusi
  3 siblings, 1 reply; 8+ messages in thread
From: Peter Ujfalusi @ 2013-01-11  9:28 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input, linux-kernel

It is time to switch to system wq instead creating a queue for the driver.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
---
 drivers/input/misc/twl4030-vibra.c | 19 +------------------
 1 file changed, 1 insertion(+), 18 deletions(-)

diff --git a/drivers/input/misc/twl4030-vibra.c b/drivers/input/misc/twl4030-vibra.c
index e2e2a26..68a5f33 100644
--- a/drivers/input/misc/twl4030-vibra.c
+++ b/drivers/input/misc/twl4030-vibra.c
@@ -43,7 +43,6 @@ struct vibra_info {
 	struct device		*dev;
 	struct input_dev	*input_dev;
 
-	struct workqueue_struct *workqueue;
 	struct work_struct	play_work;
 
 	bool			enabled;
@@ -143,19 +142,7 @@ static int vibra_play(struct input_dev *input, void *data,
 	if (!info->speed)
 		info->speed = effect->u.rumble.weak_magnitude >> 9;
 	info->direction = effect->direction < EFFECT_DIR_180_DEG ? 0 : 1;
-	queue_work(info->workqueue, &info->play_work);
-	return 0;
-}
-
-static int twl4030_vibra_open(struct input_dev *input)
-{
-	struct vibra_info *info = input_get_drvdata(input);
-
-	info->workqueue = create_singlethread_workqueue("vibra");
-	if (info->workqueue == NULL) {
-		dev_err(&input->dev, "couldn't create workqueue\n");
-		return -ENOMEM;
-	}
+	schedule_work(&info->play_work);
 	return 0;
 }
 
@@ -164,9 +151,6 @@ static void twl4030_vibra_close(struct input_dev *input)
 	struct vibra_info *info = input_get_drvdata(input);
 
 	cancel_work_sync(&info->play_work);
-	INIT_WORK(&info->play_work, vibra_play_work); /* cleanup */
-	destroy_workqueue(info->workqueue);
-	info->workqueue = NULL;
 
 	if (info->enabled)
 		vibra_disable(info);
@@ -238,7 +222,6 @@ static int twl4030_vibra_probe(struct platform_device *pdev)
 	info->input_dev->name = "twl4030:vibrator";
 	info->input_dev->id.version = 1;
 	info->input_dev->dev.parent = pdev->dev.parent;
-	info->input_dev->open = twl4030_vibra_open;
 	info->input_dev->close = twl4030_vibra_close;
 	__set_bit(FF_RUMBLE, info->input_dev->ffbit);
 
-- 
1.8.1

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 3/4] Input: twl6040-vibra: Code cleanup in probe with devm_* conversion
  2013-01-11  9:27 [PATCH v2 0/4] Input: twl*-vibra cleanups (devm_* conversion, system wq) Peter Ujfalusi
  2013-01-11  9:28 ` [PATCH v2 1/4] Input: twl4030-vibra: Convert to use devm_* in probe Peter Ujfalusi
  2013-01-11  9:28 ` [PATCH v2 2/4] input: twl4030-vibra: Use system workqueue Peter Ujfalusi
@ 2013-01-11  9:28 ` Peter Ujfalusi
  2013-01-11 17:04   ` Dmitry Torokhov
  2013-01-11  9:28 ` [PATCH v2 4/4] input: twl6040-vibra: Use system workqueue Peter Ujfalusi
  3 siblings, 1 reply; 8+ messages in thread
From: Peter Ujfalusi @ 2013-01-11  9:28 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input, linux-kernel

Convert the probe to use devm_*. At the same time reorder the calls
so we will register the input device as the last step when the driver
is loaded.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
---
 drivers/input/misc/twl6040-vibra.c | 102 ++++++++++++++++---------------------
 1 file changed, 45 insertions(+), 57 deletions(-)

diff --git a/drivers/input/misc/twl6040-vibra.c b/drivers/input/misc/twl6040-vibra.c
index 71a28ee..f6c0f58 100644
--- a/drivers/input/misc/twl6040-vibra.c
+++ b/drivers/input/misc/twl6040-vibra.c
@@ -275,7 +275,7 @@ static int twl6040_vibra_probe(struct platform_device *pdev)
 		return -EINVAL;
 	}
 
-	info = kzalloc(sizeof(*info), GFP_KERNEL);
+	info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
 	if (!info) {
 		dev_err(&pdev->dev, "couldn't allocate memory\n");
 		return -ENOMEM;
@@ -309,53 +309,23 @@ static int twl6040_vibra_probe(struct platform_device *pdev)
 	if ((!info->vibldrv_res && !info->viblmotor_res) ||
 	    (!info->vibrdrv_res && !info->vibrmotor_res)) {
 		dev_err(info->dev, "invalid vibra driver/motor resistance\n");
-		ret = -EINVAL;
-		goto err_kzalloc;
+		return -EINVAL;
 	}
 
 	info->irq = platform_get_irq(pdev, 0);
 	if (info->irq < 0) {
 		dev_err(info->dev, "invalid irq\n");
-		ret = -EINVAL;
-		goto err_kzalloc;
+		return -EINVAL;
 	}
 
 	mutex_init(&info->mutex);
 
-	info->input_dev = input_allocate_device();
-	if (info->input_dev == NULL) {
-		dev_err(info->dev, "couldn't allocate input device\n");
-		ret = -ENOMEM;
-		goto err_kzalloc;
-	}
-
-	input_set_drvdata(info->input_dev, info);
-
-	info->input_dev->name = "twl6040:vibrator";
-	info->input_dev->id.version = 1;
-	info->input_dev->dev.parent = pdev->dev.parent;
-	info->input_dev->close = twl6040_vibra_close;
-	__set_bit(FF_RUMBLE, info->input_dev->ffbit);
-
-	ret = input_ff_create_memless(info->input_dev, NULL, vibra_play);
-	if (ret < 0) {
-		dev_err(info->dev, "couldn't register vibrator to FF\n");
-		goto err_ialloc;
-	}
-
-	ret = input_register_device(info->input_dev);
-	if (ret < 0) {
-		dev_err(info->dev, "couldn't register input device\n");
-		goto err_iff;
-	}
-
-	platform_set_drvdata(pdev, info);
-
-	ret = request_threaded_irq(info->irq, NULL, twl6040_vib_irq_handler, 0,
-				   "twl6040_irq_vib", info);
+	ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL,
+					twl6040_vib_irq_handler, 0,
+					"twl6040_irq_vib", info);
 	if (ret) {
 		dev_err(info->dev, "VIB IRQ request failed: %d\n", ret);
-		goto err_irq;
+		return ret;
 	}
 
 	info->supplies[0].supply = "vddvibl";
@@ -368,7 +338,7 @@ static int twl6040_vibra_probe(struct platform_device *pdev)
 				 ARRAY_SIZE(info->supplies), info->supplies);
 	if (ret) {
 		dev_err(info->dev, "couldn't get regulators %d\n", ret);
-		goto err_regulator;
+		return ret;
 	}
 
 	if (vddvibl_uV) {
@@ -377,7 +347,7 @@ static int twl6040_vibra_probe(struct platform_device *pdev)
 		if (ret) {
 			dev_err(info->dev, "failed to set VDDVIBL volt %d\n",
 				ret);
-			goto err_voltage;
+			goto err_regulator;
 		}
 	}
 
@@ -387,7 +357,7 @@ static int twl6040_vibra_probe(struct platform_device *pdev)
 		if (ret) {
 			dev_err(info->dev, "failed to set VDDVIBR volt %d\n",
 				ret);
-			goto err_voltage;
+			goto err_regulator;
 		}
 	}
 
@@ -395,26 +365,47 @@ static int twl6040_vibra_probe(struct platform_device *pdev)
 	if (info->workqueue == NULL) {
 		dev_err(info->dev, "couldn't create workqueue\n");
 		ret = -ENOMEM;
-		goto err_voltage;
+		goto err_regulator;
 	}
 	INIT_WORK(&info->play_work, vibra_play_work);
 
+	info->input_dev = devm_input_allocate_device(&pdev->dev);
+	if (info->input_dev == NULL) {
+		dev_err(info->dev, "couldn't allocate input device\n");
+		ret = -ENOMEM;
+		goto err_wq;
+	}
+
+	input_set_drvdata(info->input_dev, info);
+
+	info->input_dev->name = "twl6040:vibrator";
+	info->input_dev->id.version = 1;
+	info->input_dev->dev.parent = pdev->dev.parent;
+	info->input_dev->close = twl6040_vibra_close;
+	__set_bit(FF_RUMBLE, info->input_dev->ffbit);
+
+	ret = input_ff_create_memless(info->input_dev, NULL, vibra_play);
+	if (ret < 0) {
+		dev_err(info->dev, "couldn't register vibrator to FF\n");
+		goto err_wq;
+	}
+
+	ret = input_register_device(info->input_dev);
+	if (ret < 0) {
+		dev_err(info->dev, "couldn't register input device\n");
+		goto err_iff;
+	}
+
+	platform_set_drvdata(pdev, info);
+
 	return 0;
 
-err_voltage:
-	regulator_bulk_free(ARRAY_SIZE(info->supplies), info->supplies);
-err_regulator:
-	free_irq(info->irq, info);
-err_irq:
-	input_unregister_device(info->input_dev);
-	info->input_dev = NULL;
 err_iff:
-	if (info->input_dev)
-		input_ff_destroy(info->input_dev);
-err_ialloc:
-	input_free_device(info->input_dev);
-err_kzalloc:
-	kfree(info);
+	input_ff_destroy(info->input_dev);
+err_wq:
+	destroy_workqueue(info->workqueue);
+err_regulator:
+	regulator_bulk_free(ARRAY_SIZE(info->supplies), info->supplies);
 	return ret;
 }
 
@@ -422,11 +413,8 @@ static int twl6040_vibra_remove(struct platform_device *pdev)
 {
 	struct vibra_info *info = platform_get_drvdata(pdev);
 
-	input_unregister_device(info->input_dev);
-	free_irq(info->irq, info);
 	regulator_bulk_free(ARRAY_SIZE(info->supplies), info->supplies);
 	destroy_workqueue(info->workqueue);
-	kfree(info);
 
 	return 0;
 }
-- 
1.8.1

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 4/4] input: twl6040-vibra: Use system workqueue
  2013-01-11  9:27 [PATCH v2 0/4] Input: twl*-vibra cleanups (devm_* conversion, system wq) Peter Ujfalusi
                   ` (2 preceding siblings ...)
  2013-01-11  9:28 ` [PATCH v2 3/4] Input: twl6040-vibra: Code cleanup in probe with devm_* conversion Peter Ujfalusi
@ 2013-01-11  9:28 ` Peter Ujfalusi
  3 siblings, 0 replies; 8+ messages in thread
From: Peter Ujfalusi @ 2013-01-11  9:28 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input, linux-kernel

It is time to switch to system wq instead creating a queue for the driver.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
---
 drivers/input/misc/twl6040-vibra.c | 16 +++-------------
 1 file changed, 3 insertions(+), 13 deletions(-)

diff --git a/drivers/input/misc/twl6040-vibra.c b/drivers/input/misc/twl6040-vibra.c
index f6c0f58..160f0a2 100644
--- a/drivers/input/misc/twl6040-vibra.c
+++ b/drivers/input/misc/twl6040-vibra.c
@@ -45,7 +45,6 @@
 struct vibra_info {
 	struct device *dev;
 	struct input_dev *input_dev;
-	struct workqueue_struct *workqueue;
 	struct work_struct play_work;
 	struct mutex mutex;
 	int irq;
@@ -213,7 +212,7 @@ static int vibra_play(struct input_dev *input, void *data,
 	info->strong_speed = effect->u.rumble.strong_magnitude;
 	info->direction = effect->direction < EFFECT_DIR_180_DEG ? 1 : -1;
 
-	ret = queue_work(info->workqueue, &info->play_work);
+	ret = schedule_work(&info->play_work);
 	if (!ret) {
 		dev_info(&input->dev, "work is already on queue\n");
 		return ret;
@@ -361,19 +360,13 @@ static int twl6040_vibra_probe(struct platform_device *pdev)
 		}
 	}
 
-	info->workqueue = alloc_workqueue("twl6040-vibra", 0, 0);
-	if (info->workqueue == NULL) {
-		dev_err(info->dev, "couldn't create workqueue\n");
-		ret = -ENOMEM;
-		goto err_regulator;
-	}
 	INIT_WORK(&info->play_work, vibra_play_work);
 
 	info->input_dev = devm_input_allocate_device(&pdev->dev);
 	if (info->input_dev == NULL) {
 		dev_err(info->dev, "couldn't allocate input device\n");
 		ret = -ENOMEM;
-		goto err_wq;
+		goto err_regulator;
 	}
 
 	input_set_drvdata(info->input_dev, info);
@@ -387,7 +380,7 @@ static int twl6040_vibra_probe(struct platform_device *pdev)
 	ret = input_ff_create_memless(info->input_dev, NULL, vibra_play);
 	if (ret < 0) {
 		dev_err(info->dev, "couldn't register vibrator to FF\n");
-		goto err_wq;
+		goto err_regulator;
 	}
 
 	ret = input_register_device(info->input_dev);
@@ -402,8 +395,6 @@ static int twl6040_vibra_probe(struct platform_device *pdev)
 
 err_iff:
 	input_ff_destroy(info->input_dev);
-err_wq:
-	destroy_workqueue(info->workqueue);
 err_regulator:
 	regulator_bulk_free(ARRAY_SIZE(info->supplies), info->supplies);
 	return ret;
@@ -414,7 +405,6 @@ static int twl6040_vibra_remove(struct platform_device *pdev)
 	struct vibra_info *info = platform_get_drvdata(pdev);
 
 	regulator_bulk_free(ARRAY_SIZE(info->supplies), info->supplies);
-	destroy_workqueue(info->workqueue);
 
 	return 0;
 }
-- 
1.8.1

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 3/4] Input: twl6040-vibra: Code cleanup in probe with devm_* conversion
  2013-01-11  9:28 ` [PATCH v2 3/4] Input: twl6040-vibra: Code cleanup in probe with devm_* conversion Peter Ujfalusi
@ 2013-01-11 17:04   ` Dmitry Torokhov
  0 siblings, 0 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2013-01-11 17:04 UTC (permalink / raw)
  To: Peter Ujfalusi; +Cc: linux-input, linux-kernel

Hi Peter,

On Fri, Jan 11, 2013 at 10:28:02AM +0100, Peter Ujfalusi wrote:
> @@ -422,11 +413,8 @@ static int twl6040_vibra_remove(struct platform_device *pdev)
>  {
>  	struct vibra_info *info = platform_get_drvdata(pdev);
>  
> -	input_unregister_device(info->input_dev);
> -	free_irq(info->irq, info);
>  	regulator_bulk_free(ARRAY_SIZE(info->supplies), info->supplies);
>  	destroy_workqueue(info->workqueue);
> -	kfree(info);
>  


I do not think we can switch to managed resources while using
non-managed version of regulator_bulk_get, because with this patch you
shutting down regulators (presumably making device inoperable) while
the input device and interrupt are alive and kicking. BTW, the wq patch
should have been before this one in the queue as again you can't
destroy work queue while input device is active.

I see 3 ways here:

1. Change regulator core to allow separate owner device from the device
the resource is attached to.

2. Create custom version of devm_regulator_bulk_get() and use it in
twl6040.

3. Keep the resources unmanaged.

Unless there are many drivers like twl6040 to justify 1 I'd go with 3.

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 1/4] Input: twl4030-vibra: Convert to use devm_* in probe
  2013-01-11  9:28 ` [PATCH v2 1/4] Input: twl4030-vibra: Convert to use devm_* in probe Peter Ujfalusi
@ 2013-01-11 17:06   ` Dmitry Torokhov
  0 siblings, 0 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2013-01-11 17:06 UTC (permalink / raw)
  To: Peter Ujfalusi; +Cc: linux-input, linux-kernel

On Fri, Jan 11, 2013 at 10:28:00AM +0100, Peter Ujfalusi wrote:
> Cleanup to use devm_* when it is possible at probe time.
> 
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>

Applied, thank you Peter.

> ---
>  drivers/input/misc/twl4030-vibra.c | 26 ++++----------------------
>  1 file changed, 4 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/input/misc/twl4030-vibra.c b/drivers/input/misc/twl4030-vibra.c
> index 78eb6b3..e2e2a26 100644
> --- a/drivers/input/misc/twl4030-vibra.c
> +++ b/drivers/input/misc/twl4030-vibra.c
> @@ -219,7 +219,7 @@ static int twl4030_vibra_probe(struct platform_device *pdev)
>  		return -EINVAL;
>  	}
>  
> -	info = kzalloc(sizeof(*info), GFP_KERNEL);
> +	info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
>  	if (!info)
>  		return -ENOMEM;
>  
> @@ -227,11 +227,10 @@ static int twl4030_vibra_probe(struct platform_device *pdev)
>  	info->coexist = twl4030_vibra_check_coexist(pdata, twl4030_core_node);
>  	INIT_WORK(&info->play_work, vibra_play_work);
>  
> -	info->input_dev = input_allocate_device();
> +	info->input_dev = devm_input_allocate_device(&pdev->dev);
>  	if (info->input_dev == NULL) {
>  		dev_err(&pdev->dev, "couldn't allocate input device\n");
> -		ret = -ENOMEM;
> -		goto err_kzalloc;
> +		return -ENOMEM;
>  	}
>  
>  	input_set_drvdata(info->input_dev, info);
> @@ -246,7 +245,7 @@ static int twl4030_vibra_probe(struct platform_device *pdev)
>  	ret = input_ff_create_memless(info->input_dev, NULL, vibra_play);
>  	if (ret < 0) {
>  		dev_dbg(&pdev->dev, "couldn't register vibrator to FF\n");
> -		goto err_ialloc;
> +		return ret;
>  	}
>  
>  	ret = input_register_device(info->input_dev);
> @@ -262,28 +261,11 @@ static int twl4030_vibra_probe(struct platform_device *pdev)
>  
>  err_iff:
>  	input_ff_destroy(info->input_dev);
> -err_ialloc:
> -	input_free_device(info->input_dev);
> -err_kzalloc:
> -	kfree(info);
>  	return ret;
>  }
>  
> -static int twl4030_vibra_remove(struct platform_device *pdev)
> -{
> -	struct vibra_info *info = platform_get_drvdata(pdev);
> -
> -	/* this also free ff-memless and calls close if needed */
> -	input_unregister_device(info->input_dev);
> -	kfree(info);
> -	platform_set_drvdata(pdev, NULL);
> -
> -	return 0;
> -}
> -
>  static struct platform_driver twl4030_vibra_driver = {
>  	.probe		= twl4030_vibra_probe,
> -	.remove		= twl4030_vibra_remove,
>  	.driver		= {
>  		.name	= "twl4030-vibra",
>  		.owner	= THIS_MODULE,
> -- 
> 1.8.1
> 

-- 
Dmitry

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 2/4] input: twl4030-vibra: Use system workqueue
  2013-01-11  9:28 ` [PATCH v2 2/4] input: twl4030-vibra: Use system workqueue Peter Ujfalusi
@ 2013-01-11 17:06   ` Dmitry Torokhov
  0 siblings, 0 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2013-01-11 17:06 UTC (permalink / raw)
  To: Peter Ujfalusi; +Cc: linux-input, linux-kernel

On Fri, Jan 11, 2013 at 10:28:01AM +0100, Peter Ujfalusi wrote:
> It is time to switch to system wq instead creating a queue for the driver.
> 
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>

Applied, thank you.

> ---
>  drivers/input/misc/twl4030-vibra.c | 19 +------------------
>  1 file changed, 1 insertion(+), 18 deletions(-)
> 
> diff --git a/drivers/input/misc/twl4030-vibra.c b/drivers/input/misc/twl4030-vibra.c
> index e2e2a26..68a5f33 100644
> --- a/drivers/input/misc/twl4030-vibra.c
> +++ b/drivers/input/misc/twl4030-vibra.c
> @@ -43,7 +43,6 @@ struct vibra_info {
>  	struct device		*dev;
>  	struct input_dev	*input_dev;
>  
> -	struct workqueue_struct *workqueue;
>  	struct work_struct	play_work;
>  
>  	bool			enabled;
> @@ -143,19 +142,7 @@ static int vibra_play(struct input_dev *input, void *data,
>  	if (!info->speed)
>  		info->speed = effect->u.rumble.weak_magnitude >> 9;
>  	info->direction = effect->direction < EFFECT_DIR_180_DEG ? 0 : 1;
> -	queue_work(info->workqueue, &info->play_work);
> -	return 0;
> -}
> -
> -static int twl4030_vibra_open(struct input_dev *input)
> -{
> -	struct vibra_info *info = input_get_drvdata(input);
> -
> -	info->workqueue = create_singlethread_workqueue("vibra");
> -	if (info->workqueue == NULL) {
> -		dev_err(&input->dev, "couldn't create workqueue\n");
> -		return -ENOMEM;
> -	}
> +	schedule_work(&info->play_work);
>  	return 0;
>  }
>  
> @@ -164,9 +151,6 @@ static void twl4030_vibra_close(struct input_dev *input)
>  	struct vibra_info *info = input_get_drvdata(input);
>  
>  	cancel_work_sync(&info->play_work);
> -	INIT_WORK(&info->play_work, vibra_play_work); /* cleanup */
> -	destroy_workqueue(info->workqueue);
> -	info->workqueue = NULL;
>  
>  	if (info->enabled)
>  		vibra_disable(info);
> @@ -238,7 +222,6 @@ static int twl4030_vibra_probe(struct platform_device *pdev)
>  	info->input_dev->name = "twl4030:vibrator";
>  	info->input_dev->id.version = 1;
>  	info->input_dev->dev.parent = pdev->dev.parent;
> -	info->input_dev->open = twl4030_vibra_open;
>  	info->input_dev->close = twl4030_vibra_close;
>  	__set_bit(FF_RUMBLE, info->input_dev->ffbit);
>  
> -- 
> 1.8.1
> 

-- 
Dmitry

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2013-01-11 17:06 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-11  9:27 [PATCH v2 0/4] Input: twl*-vibra cleanups (devm_* conversion, system wq) Peter Ujfalusi
2013-01-11  9:28 ` [PATCH v2 1/4] Input: twl4030-vibra: Convert to use devm_* in probe Peter Ujfalusi
2013-01-11 17:06   ` Dmitry Torokhov
2013-01-11  9:28 ` [PATCH v2 2/4] input: twl4030-vibra: Use system workqueue Peter Ujfalusi
2013-01-11 17:06   ` Dmitry Torokhov
2013-01-11  9:28 ` [PATCH v2 3/4] Input: twl6040-vibra: Code cleanup in probe with devm_* conversion Peter Ujfalusi
2013-01-11 17:04   ` Dmitry Torokhov
2013-01-11  9:28 ` [PATCH v2 4/4] input: twl6040-vibra: Use system workqueue Peter Ujfalusi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).