Skip to content

Commit

Permalink
leds: wm8350: Remove work queue
Browse files Browse the repository at this point in the history
Now the core implements the work queue, remove it from the drivers,
and switch to using brightness_set_blocking op.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
Acked-by: Antonio Ospite <ao2@ao2.it>
Reviewed-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
lunn authored and janaszewski committed Jan 4, 2016
1 parent 77e8503 commit 0dd756f
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 40 deletions.
64 changes: 25 additions & 39 deletions drivers/leds/leds-wm8350.c
Expand Up @@ -89,40 +89,42 @@ static const int isink_cur[] = {
#define to_wm8350_led(led_cdev) \
container_of(led_cdev, struct wm8350_led, cdev)

static void wm8350_led_enable(struct wm8350_led *led)
static int wm8350_led_enable(struct wm8350_led *led)
{
int ret;
int ret = 0;

if (led->enabled)
return;
return ret;

ret = regulator_enable(led->isink);
if (ret != 0) {
dev_err(led->cdev.dev, "Failed to enable ISINK: %d\n", ret);
return;
return ret;
}

ret = regulator_enable(led->dcdc);
if (ret != 0) {
dev_err(led->cdev.dev, "Failed to enable DCDC: %d\n", ret);
regulator_disable(led->isink);
return;
return ret;
}

led->enabled = 1;

return ret;
}

static void wm8350_led_disable(struct wm8350_led *led)
static int wm8350_led_disable(struct wm8350_led *led)
{
int ret;
int ret = 0;

if (!led->enabled)
return;
return ret;

ret = regulator_disable(led->dcdc);
if (ret != 0) {
dev_err(led->cdev.dev, "Failed to disable DCDC: %d\n", ret);
return;
return ret;
}

ret = regulator_disable(led->isink);
Expand All @@ -132,27 +134,29 @@ static void wm8350_led_disable(struct wm8350_led *led)
if (ret != 0)
dev_err(led->cdev.dev, "Failed to reenable DCDC: %d\n",
ret);
return;
return ret;
}

led->enabled = 0;

return ret;
}

static void led_work(struct work_struct *work)
static int wm8350_led_set(struct led_classdev *led_cdev,
enum led_brightness value)
{
struct wm8350_led *led = container_of(work, struct wm8350_led, work);
struct wm8350_led *led = to_wm8350_led(led_cdev);
unsigned long flags;
int ret;
int uA;
unsigned long flags;

mutex_lock(&led->mutex);
led->value = value;

spin_lock_irqsave(&led->value_lock, flags);

if (led->value == LED_OFF) {
spin_unlock_irqrestore(&led->value_lock, flags);
wm8350_led_disable(led);
goto out;
return wm8350_led_disable(led);
}

/* This scales linearly into the index of valid current
Expand All @@ -166,36 +170,21 @@ static void led_work(struct work_struct *work)

ret = regulator_set_current_limit(led->isink, isink_cur[uA],
isink_cur[uA]);
if (ret != 0)
if (ret != 0) {
dev_err(led->cdev.dev, "Failed to set %duA: %d\n",
isink_cur[uA], ret);
return ret;
}

wm8350_led_enable(led);

out:
mutex_unlock(&led->mutex);
}

static void wm8350_led_set(struct led_classdev *led_cdev,
enum led_brightness value)
{
struct wm8350_led *led = to_wm8350_led(led_cdev);
unsigned long flags;

spin_lock_irqsave(&led->value_lock, flags);
led->value = value;
schedule_work(&led->work);
spin_unlock_irqrestore(&led->value_lock, flags);
return wm8350_led_enable(led);
}

static void wm8350_led_shutdown(struct platform_device *pdev)
{
struct wm8350_led *led = platform_get_drvdata(pdev);

mutex_lock(&led->mutex);
led->value = LED_OFF;
wm8350_led_disable(led);
mutex_unlock(&led->mutex);
}

static int wm8350_led_probe(struct platform_device *pdev)
Expand Down Expand Up @@ -232,7 +221,7 @@ static int wm8350_led_probe(struct platform_device *pdev)
if (led == NULL)
return -ENOMEM;

led->cdev.brightness_set = wm8350_led_set;
led->cdev.brightness_set_blocking = wm8350_led_set;
led->cdev.default_trigger = pdata->default_trigger;
led->cdev.name = pdata->name;
led->cdev.flags |= LED_CORE_SUSPENDRESUME;
Expand All @@ -251,8 +240,6 @@ static int wm8350_led_probe(struct platform_device *pdev)
pdata->max_uA);

spin_lock_init(&led->value_lock);
mutex_init(&led->mutex);
INIT_WORK(&led->work, led_work);
led->value = LED_OFF;
platform_set_drvdata(pdev, led);

Expand All @@ -264,7 +251,6 @@ static int wm8350_led_remove(struct platform_device *pdev)
struct wm8350_led *led = platform_get_drvdata(pdev);

led_classdev_unregister(&led->cdev);
flush_work(&led->work);
wm8350_led_disable(led);
return 0;
}
Expand Down
1 change: 0 additions & 1 deletion include/linux/mfd/wm8350/pmic.h
Expand Up @@ -715,7 +715,6 @@ struct wm8350_led_platform_data {

struct wm8350_led {
struct platform_device *pdev;
struct mutex mutex;
struct work_struct work;
spinlock_t value_lock;
enum led_brightness value;
Expand Down

0 comments on commit 0dd756f

Please sign in to comment.