|
@@ -31,7 +31,6 @@
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/leds.h>
|
|
|
#include <linux/mutex.h>
|
|
|
-#include <linux/workqueue.h>
|
|
|
#include <linux/leds-lp3944.h>
|
|
|
|
|
|
/* Read Only Registers */
|
|
@@ -68,10 +67,8 @@
|
|
|
struct lp3944_led_data {
|
|
|
u8 id;
|
|
|
enum lp3944_type type;
|
|
|
- enum lp3944_status status;
|
|
|
struct led_classdev ldev;
|
|
|
struct i2c_client *client;
|
|
|
- struct work_struct work;
|
|
|
};
|
|
|
|
|
|
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",
|
|
|
__func__);
|
|
|
|
|
|
- led->status = LP3944_LED_STATUS_DIM0;
|
|
|
- schedule_work(&led->work);
|
|
|
+ lp3944_led_set(led, LP3944_LED_STATUS_DIM0);
|
|
|
|
|
|
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)
|
|
|
{
|
|
|
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",
|
|
|
__func__, led_cdev->name, brightness);
|
|
|
|
|
|
- led->status = !!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);
|
|
|
+ return lp3944_led_set(led, !!brightness);
|
|
|
}
|
|
|
|
|
|
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_INVERTED:
|
|
|
led->type = pled->type;
|
|
|
- led->status = pled->status;
|
|
|
led->ldev.name = pled->name;
|
|
|
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.flags = LED_CORE_SUSPENDRESUME;
|
|
|
|
|
|
- INIT_WORK(&led->work, lp3944_led_work);
|
|
|
err = led_classdev_register(&client->dev, &led->ldev);
|
|
|
if (err < 0) {
|
|
|
dev_err(&client->dev,
|
|
@@ -336,14 +322,14 @@ static int lp3944_configure(struct i2c_client *client,
|
|
|
|
|
|
/* to expose the default value to userspace */
|
|
|
led->ldev.brightness =
|
|
|
- (enum led_brightness) led->status;
|
|
|
+ (enum led_brightness) pled->status;
|
|
|
|
|
|
/* Set the default led status */
|
|
|
- err = lp3944_led_set(led, led->status);
|
|
|
+ err = lp3944_led_set(led, pled->status);
|
|
|
if (err < 0) {
|
|
|
dev_err(&client->dev,
|
|
|
"%s couldn't set STATUS %d\n",
|
|
|
- led->ldev.name, led->status);
|
|
|
+ led->ldev.name, pled->status);
|
|
|
goto exit;
|
|
|
}
|
|
|
break;
|
|
@@ -364,7 +350,6 @@ exit:
|
|
|
case LP3944_LED_TYPE_LED:
|
|
|
case LP3944_LED_TYPE_LED_INVERTED:
|
|
|
led_classdev_unregister(&data->leds[i].ldev);
|
|
|
- cancel_work_sync(&data->leds[i].work);
|
|
|
break;
|
|
|
|
|
|
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_INVERTED:
|
|
|
led_classdev_unregister(&data->leds[i].ldev);
|
|
|
- cancel_work_sync(&data->leds[i].work);
|
|
|
break;
|
|
|
|
|
|
case LP3944_LED_TYPE_NONE:
|