static void led_work(struct work_struct *work) { struct wm8350_led *led = container_of(work, struct wm8350_led, work); int ret; int uA; unsigned long flags; mutex_lock(&led->mutex); 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; } uA = (led->max_uA_index * led->value) / LED_FULL; spin_unlock_irqrestore(&led->value_lock, flags); BUG_ON(uA >= ARRAY_SIZE(isink_cur)); ret = regulator_set_current_limit(led->isink, isink_cur[uA], isink_cur[uA]); if (ret != 0) dev_err(led->cdev.dev, "Failed to set %duA: %d\n", isink_cur[uA], ret); wm8350_led_enable(led); out: mutex_unlock(&led->mutex); }
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_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; }
static int wm8350_led_remove(struct platform_device *pdev) { struct wm8350_led *led = platform_get_drvdata(pdev); led_classdev_unregister(&led->cdev); flush_scheduled_work(); wm8350_led_disable(led); regulator_put(led->dcdc); regulator_put(led->isink); kfree(led); return 0; }
static void led_work(struct work_struct *work) { struct wm8350_led *led = container_of(work, struct wm8350_led, work); int ret; int uA; unsigned long flags; mutex_lock(&led->mutex); 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; } /* This scales linearly into the index of valid current * settings which results in a linear scaling of perceived * brightness due to the non-linear current settings provided * by the hardware. */ uA = (led->max_uA_index * led->value) / LED_FULL; spin_unlock_irqrestore(&led->value_lock, flags); BUG_ON(uA >= ARRAY_SIZE(isink_cur)); ret = regulator_set_current_limit(led->isink, isink_cur[uA], isink_cur[uA]); if (ret != 0) dev_err(led->cdev.dev, "Failed to set %duA: %d\n", isink_cur[uA], ret); wm8350_led_enable(led); out: mutex_unlock(&led->mutex); }