leds: lp3944: Remove work queue

Now the core implements the work queue, remove it from the driver,
and switch to using brightness_set_blocking op.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Acked-by: Antonio Ospite <ao2@ao2.it>
Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
This commit is contained in:
Andrew Lunn 2015-08-20 12:09:57 +02:00 committed by Jacek Anaszewski
parent 00a88a19d1
commit 525d6a65a2
1 changed files with 8 additions and 24 deletions

View File

@ -31,7 +31,6 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/workqueue.h>
#include <linux/leds-lp3944.h> #include <linux/leds-lp3944.h>
/* Read Only Registers */ /* Read Only Registers */
@ -68,10 +67,8 @@
struct lp3944_led_data { struct lp3944_led_data {
u8 id; u8 id;
enum lp3944_type type; enum lp3944_type type;
enum lp3944_status status;
struct led_classdev ldev; struct led_classdev ldev;
struct i2c_client *client; struct i2c_client *client;
struct work_struct work;
}; };
struct lp3944_data { struct lp3944_data {
@ -275,13 +272,12 @@ static int lp3944_led_set_blink(struct led_classdev *led_cdev,
dev_dbg(&led->client->dev, "%s: OK hardware accelerated blink!\n", dev_dbg(&led->client->dev, "%s: OK hardware accelerated blink!\n",
__func__); __func__);
led->status = LP3944_LED_STATUS_DIM0; lp3944_led_set(led, LP3944_LED_STATUS_DIM0);
schedule_work(&led->work);
return 0; return 0;
} }
static void lp3944_led_set_brightness(struct led_classdev *led_cdev, static int lp3944_led_set_brightness(struct led_classdev *led_cdev,
enum led_brightness brightness) enum led_brightness brightness)
{ {
struct lp3944_led_data *led = ldev_to_led(led_cdev); struct lp3944_led_data *led = ldev_to_led(led_cdev);
@ -289,16 +285,7 @@ static void lp3944_led_set_brightness(struct led_classdev *led_cdev,
dev_dbg(&led->client->dev, "%s: %s, %d\n", dev_dbg(&led->client->dev, "%s: %s, %d\n",
__func__, led_cdev->name, brightness); __func__, led_cdev->name, brightness);
led->status = !!brightness; return lp3944_led_set(led, !!brightness);
schedule_work(&led->work);
}
static void lp3944_led_work(struct work_struct *work)
{
struct lp3944_led_data *led;
led = container_of(work, struct lp3944_led_data, work);
lp3944_led_set(led, led->status);
} }
static int lp3944_configure(struct i2c_client *client, static int lp3944_configure(struct i2c_client *client,
@ -318,14 +305,13 @@ static int lp3944_configure(struct i2c_client *client,
case LP3944_LED_TYPE_LED: case LP3944_LED_TYPE_LED:
case LP3944_LED_TYPE_LED_INVERTED: case LP3944_LED_TYPE_LED_INVERTED:
led->type = pled->type; led->type = pled->type;
led->status = pled->status;
led->ldev.name = pled->name; led->ldev.name = pled->name;
led->ldev.max_brightness = 1; led->ldev.max_brightness = 1;
led->ldev.brightness_set = lp3944_led_set_brightness; led->ldev.brightness_set_blocking =
lp3944_led_set_brightness;
led->ldev.blink_set = lp3944_led_set_blink; led->ldev.blink_set = lp3944_led_set_blink;
led->ldev.flags = LED_CORE_SUSPENDRESUME; led->ldev.flags = LED_CORE_SUSPENDRESUME;
INIT_WORK(&led->work, lp3944_led_work);
err = led_classdev_register(&client->dev, &led->ldev); err = led_classdev_register(&client->dev, &led->ldev);
if (err < 0) { if (err < 0) {
dev_err(&client->dev, dev_err(&client->dev,
@ -336,14 +322,14 @@ static int lp3944_configure(struct i2c_client *client,
/* to expose the default value to userspace */ /* to expose the default value to userspace */
led->ldev.brightness = led->ldev.brightness =
(enum led_brightness) led->status; (enum led_brightness) pled->status;
/* Set the default led status */ /* Set the default led status */
err = lp3944_led_set(led, led->status); err = lp3944_led_set(led, pled->status);
if (err < 0) { if (err < 0) {
dev_err(&client->dev, dev_err(&client->dev,
"%s couldn't set STATUS %d\n", "%s couldn't set STATUS %d\n",
led->ldev.name, led->status); led->ldev.name, pled->status);
goto exit; goto exit;
} }
break; break;
@ -364,7 +350,6 @@ static int lp3944_configure(struct i2c_client *client,
case LP3944_LED_TYPE_LED: case LP3944_LED_TYPE_LED:
case LP3944_LED_TYPE_LED_INVERTED: case LP3944_LED_TYPE_LED_INVERTED:
led_classdev_unregister(&data->leds[i].ldev); led_classdev_unregister(&data->leds[i].ldev);
cancel_work_sync(&data->leds[i].work);
break; break;
case LP3944_LED_TYPE_NONE: case LP3944_LED_TYPE_NONE:
@ -424,7 +409,6 @@ static int lp3944_remove(struct i2c_client *client)
case LP3944_LED_TYPE_LED: case LP3944_LED_TYPE_LED:
case LP3944_LED_TYPE_LED_INVERTED: case LP3944_LED_TYPE_LED_INVERTED:
led_classdev_unregister(&data->leds[i].ldev); led_classdev_unregister(&data->leds[i].ldev);
cancel_work_sync(&data->leds[i].work);
break; break;
case LP3944_LED_TYPE_NONE: case LP3944_LED_TYPE_NONE: