Lines Matching +full:led +full:-

1 // SPDX-License-Identifier: GPL-2.0-only
3 * LED driver for WM8350 driven LEDS.
88 static int wm8350_led_enable(struct wm8350_led *led) in wm8350_led_enable() argument
92 if (led->enabled) in wm8350_led_enable()
95 ret = regulator_enable(led->isink); in wm8350_led_enable()
97 dev_err(led->cdev.dev, "Failed to enable ISINK: %d\n", ret); in wm8350_led_enable()
101 ret = regulator_enable(led->dcdc); in wm8350_led_enable()
103 dev_err(led->cdev.dev, "Failed to enable DCDC: %d\n", ret); in wm8350_led_enable()
104 regulator_disable(led->isink); in wm8350_led_enable()
108 led->enabled = 1; in wm8350_led_enable()
113 static int wm8350_led_disable(struct wm8350_led *led) in wm8350_led_disable() argument
117 if (!led->enabled) in wm8350_led_disable()
120 ret = regulator_disable(led->dcdc); in wm8350_led_disable()
122 dev_err(led->cdev.dev, "Failed to disable DCDC: %d\n", ret); in wm8350_led_disable()
126 ret = regulator_disable(led->isink); in wm8350_led_disable()
128 dev_err(led->cdev.dev, "Failed to disable ISINK: %d\n", ret); in wm8350_led_disable()
129 ret = regulator_enable(led->dcdc); in wm8350_led_disable()
131 dev_err(led->cdev.dev, "Failed to reenable DCDC: %d\n", in wm8350_led_disable()
136 led->enabled = 0; in wm8350_led_disable()
144 struct wm8350_led *led = to_wm8350_led(led_cdev); in wm8350_led_set() local
149 led->value = value; in wm8350_led_set()
151 spin_lock_irqsave(&led->value_lock, flags); in wm8350_led_set()
153 if (led->value == LED_OFF) { in wm8350_led_set()
154 spin_unlock_irqrestore(&led->value_lock, flags); in wm8350_led_set()
155 return wm8350_led_disable(led); in wm8350_led_set()
160 * brightness due to the non-linear current settings provided in wm8350_led_set()
163 uA = (led->max_uA_index * led->value) / LED_FULL; in wm8350_led_set()
164 spin_unlock_irqrestore(&led->value_lock, flags); in wm8350_led_set()
167 ret = regulator_set_current_limit(led->isink, isink_cur[uA], in wm8350_led_set()
170 dev_err(led->cdev.dev, "Failed to set %duA: %d\n", in wm8350_led_set()
175 return wm8350_led_enable(led); in wm8350_led_set()
180 struct wm8350_led *led = platform_get_drvdata(pdev); in wm8350_led_shutdown() local
182 led->value = LED_OFF; in wm8350_led_shutdown()
183 wm8350_led_disable(led); in wm8350_led_shutdown()
189 struct wm8350_led *led; in wm8350_led_probe() local
190 struct wm8350_led_platform_data *pdata = dev_get_platdata(&pdev->dev); in wm8350_led_probe()
194 dev_err(&pdev->dev, "no platform data\n"); in wm8350_led_probe()
195 return -ENODEV; in wm8350_led_probe()
198 if (pdata->max_uA < isink_cur[0]) { in wm8350_led_probe()
199 dev_err(&pdev->dev, "Invalid maximum current %duA\n", in wm8350_led_probe()
200 pdata->max_uA); in wm8350_led_probe()
201 return -EINVAL; in wm8350_led_probe()
204 isink = devm_regulator_get(&pdev->dev, "led_isink"); in wm8350_led_probe()
206 dev_err(&pdev->dev, "%s: can't get ISINK\n", __func__); in wm8350_led_probe()
210 dcdc = devm_regulator_get(&pdev->dev, "led_vcc"); in wm8350_led_probe()
212 dev_err(&pdev->dev, "%s: can't get DCDC\n", __func__); in wm8350_led_probe()
216 led = devm_kzalloc(&pdev->dev, sizeof(*led), GFP_KERNEL); in wm8350_led_probe()
217 if (led == NULL) in wm8350_led_probe()
218 return -ENOMEM; in wm8350_led_probe()
220 led->cdev.brightness_set_blocking = wm8350_led_set; in wm8350_led_probe()
221 led->cdev.default_trigger = pdata->default_trigger; in wm8350_led_probe()
222 led->cdev.name = pdata->name; in wm8350_led_probe()
223 led->cdev.flags |= LED_CORE_SUSPENDRESUME; in wm8350_led_probe()
224 led->enabled = regulator_is_enabled(isink); in wm8350_led_probe()
225 led->isink = isink; in wm8350_led_probe()
226 led->dcdc = dcdc; in wm8350_led_probe()
228 for (i = 0; i < ARRAY_SIZE(isink_cur) - 1; i++) in wm8350_led_probe()
229 if (isink_cur[i] >= pdata->max_uA) in wm8350_led_probe()
231 led->max_uA_index = i; in wm8350_led_probe()
232 if (pdata->max_uA != isink_cur[i]) in wm8350_led_probe()
233 dev_warn(&pdev->dev, in wm8350_led_probe()
236 pdata->max_uA); in wm8350_led_probe()
238 spin_lock_init(&led->value_lock); in wm8350_led_probe()
239 led->value = LED_OFF; in wm8350_led_probe()
240 platform_set_drvdata(pdev, led); in wm8350_led_probe()
242 return led_classdev_register(&pdev->dev, &led->cdev); in wm8350_led_probe()
247 struct wm8350_led *led = platform_get_drvdata(pdev); in wm8350_led_remove() local
249 led_classdev_unregister(&led->cdev); in wm8350_led_remove()
250 wm8350_led_disable(led); in wm8350_led_remove()
255 .name = "wm8350-led",
265 MODULE_DESCRIPTION("WM8350 LED driver");
267 MODULE_ALIAS("platform:wm8350-led");