mirror of https://gitee.com/openkylin/linux.git
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:
parent
00a88a19d1
commit
525d6a65a2
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue