Lines Matching +full:pwm +full:- +full:leds

1 // SPDX-License-Identifier: GPL-2.0
3 * Driver for LEDs connected to the Intel Cherry Trail Whiskey Cove PMIC
14 #include <linux/leds.h>
55 u16 pwm; member
65 unsigned int pwm; member
77 struct cht_wc_led leds[CHT_WC_LED_COUNT]; member
86 .pwm = CHT_WC_LED1_PWM,
94 .pwm = CHT_WC_LED2_PWM,
112 mutex_lock(&led->mutex); in cht_wc_leds_brightness_set()
115 ret = regmap_update_bits(led->regmap, led->regs->ctrl, in cht_wc_leds_brightness_set()
116 led->regs->on_off_mask, led->regs->off_val); in cht_wc_leds_brightness_set()
118 dev_err(cdev->dev, "Failed to turn off: %d\n", ret); in cht_wc_leds_brightness_set()
123 ret = regmap_update_bits(led->regmap, led->regs->fsm, in cht_wc_leds_brightness_set()
126 dev_err(cdev->dev, "Failed to update LED FSM reg: %d\n", ret); in cht_wc_leds_brightness_set()
128 ret = regmap_write(led->regmap, led->regs->pwm, value); in cht_wc_leds_brightness_set()
130 dev_err(cdev->dev, "Failed to set brightness: %d\n", ret); in cht_wc_leds_brightness_set()
134 ret = regmap_update_bits(led->regmap, led->regs->ctrl, in cht_wc_leds_brightness_set()
135 led->regs->on_off_mask, led->regs->on_val); in cht_wc_leds_brightness_set()
137 dev_err(cdev->dev, "Failed to turn on: %d\n", ret); in cht_wc_leds_brightness_set()
140 mutex_unlock(&led->mutex); in cht_wc_leds_brightness_set()
150 mutex_lock(&led->mutex); in cht_wc_leds_brightness_get()
152 ret = regmap_read(led->regmap, led->regs->ctrl, &val); in cht_wc_leds_brightness_get()
154 dev_err(cdev->dev, "Failed to read LED CTRL reg: %d\n", ret); in cht_wc_leds_brightness_get()
159 val &= led->regs->on_off_mask; in cht_wc_leds_brightness_get()
160 if (val != led->regs->on_val) { in cht_wc_leds_brightness_get()
165 ret = regmap_read(led->regmap, led->regs->pwm, &val); in cht_wc_leds_brightness_get()
167 dev_err(cdev->dev, "Failed to read LED PWM reg: %d\n", ret); in cht_wc_leds_brightness_get()
174 mutex_unlock(&led->mutex); in cht_wc_leds_brightness_get()
200 * period < 750 ms - select 2 HZ
201 * 750 ms <= period < 1500 ms - select 1 HZ
202 * 1500 ms <= period < 3000 ms - select 1/2 HZ
203 * 3000 ms <= period < 5000 ms - select 1/4 HZ
204 * 5000 ms <= period - return -1
217 return -1; in cht_wc_leds_find_freq()
228 mutex_lock(&led->mutex); in cht_wc_leds_set_effect()
237 ret = regmap_update_bits(led->regmap, led->regs->fsm, in cht_wc_leds_set_effect()
240 dev_err(cdev->dev, "Failed to update LED FSM reg: %d\n", ret); in cht_wc_leds_set_effect()
244 ret = -EINVAL; in cht_wc_leds_set_effect()
248 ret = regmap_update_bits(led->regmap, led->regs->fsm, in cht_wc_leds_set_effect()
251 dev_err(cdev->dev, "Failed to update LED FSM reg: %d\n", ret); in cht_wc_leds_set_effect()
254 ret = regmap_update_bits(led->regmap, led->regs->ctrl, in cht_wc_leds_set_effect()
255 CHT_WC_LED_F_MASK | led->regs->on_off_mask, in cht_wc_leds_set_effect()
256 ctrl | led->regs->on_val); in cht_wc_leds_set_effect()
258 dev_err(cdev->dev, "Failed to update LED CTRL reg: %d\n", ret); in cht_wc_leds_set_effect()
263 mutex_unlock(&led->mutex); in cht_wc_leds_set_effect()
278 * when the default "charging-blink-full-solid" trigger is used to in cht_wc_leds_blink_set()
281 if (cdev->flags & LED_INIT_DEFAULT_TRIGGER) { in cht_wc_leds_blink_set()
300 return -EINVAL; in cht_wc_leds_pattern_set()
318 ret = regmap_read(led->regmap, led->regs->ctrl, &saved_regs->ctrl); in cht_wc_led_save_regs()
322 ret = regmap_read(led->regmap, led->regs->fsm, &saved_regs->fsm); in cht_wc_led_save_regs()
326 return regmap_read(led->regmap, led->regs->pwm, &saved_regs->pwm); in cht_wc_led_save_regs()
332 regmap_write(led->regmap, led->regs->ctrl, saved_regs->ctrl); in cht_wc_led_restore_regs()
333 regmap_write(led->regmap, led->regs->fsm, saved_regs->fsm); in cht_wc_led_restore_regs()
334 regmap_write(led->regmap, led->regs->pwm, saved_regs->pwm); in cht_wc_led_restore_regs()
339 struct intel_soc_pmic *pmic = dev_get_drvdata(pdev->dev.parent); in cht_wc_leds_probe()
340 struct cht_wc_leds *leds; in cht_wc_leds_probe() local
349 if (pmic->cht_wc_model == INTEL_CHT_WC_LENOVO_YT3_X90) in cht_wc_leds_probe()
350 return -ENODEV; in cht_wc_leds_probe()
352 leds = devm_kzalloc(&pdev->dev, sizeof(*leds), GFP_KERNEL); in cht_wc_leds_probe()
353 if (!leds) in cht_wc_leds_probe()
354 return -ENOMEM; in cht_wc_leds_probe()
357 * LED1 might be in hw-controlled mode when this driver gets loaded; and in cht_wc_leds_probe()
361 leds->leds[0].regs = &cht_wc_led_regs[0]; in cht_wc_leds_probe()
362 leds->leds[0].regmap = pmic->regmap; in cht_wc_leds_probe()
363 ret = cht_wc_led_save_regs(&leds->leds[0], &leds->led1_initial_regs); in cht_wc_leds_probe()
368 switch (pmic->cht_wc_model) { in cht_wc_leds_probe()
370 leds->leds[0].cdev.default_trigger = "max170xx_battery-charging-blink-full-solid"; in cht_wc_leds_probe()
373 leds->leds[0].cdev.default_trigger = "bq27520-0-charging-blink-full-solid"; in cht_wc_leds_probe()
376 leds->leds[0].cdev.default_trigger = "bq27542-0-charging-blink-full-solid"; in cht_wc_leds_probe()
379 dev_warn(&pdev->dev, "Unknown model, no default charging trigger\n"); in cht_wc_leds_probe()
384 struct cht_wc_led *led = &leds->leds[i]; in cht_wc_leds_probe()
386 led->regs = &cht_wc_led_regs[i]; in cht_wc_leds_probe()
387 led->regmap = pmic->regmap; in cht_wc_leds_probe()
388 mutex_init(&led->mutex); in cht_wc_leds_probe()
389 led->cdev.name = cht_wc_leds_names[i]; in cht_wc_leds_probe()
390 led->cdev.brightness_set_blocking = cht_wc_leds_brightness_set; in cht_wc_leds_probe()
391 led->cdev.brightness_get = cht_wc_leds_brightness_get; in cht_wc_leds_probe()
392 led->cdev.blink_set = cht_wc_leds_blink_set; in cht_wc_leds_probe()
393 led->cdev.pattern_set = cht_wc_leds_pattern_set; in cht_wc_leds_probe()
394 led->cdev.pattern_clear = cht_wc_leds_pattern_clear; in cht_wc_leds_probe()
395 led->cdev.max_brightness = 255; in cht_wc_leds_probe()
397 ret = devm_led_classdev_register(&pdev->dev, &led->cdev); in cht_wc_leds_probe()
402 platform_set_drvdata(pdev, leds); in cht_wc_leds_probe()
408 struct cht_wc_leds *leds = platform_get_drvdata(pdev); in cht_wc_leds_remove() local
410 /* Restore LED1 regs if hw-control was active else leave LED1 off */ in cht_wc_leds_remove()
411 if (!(leds->led1_initial_regs.ctrl & CHT_WC_LED1_SWCTL)) in cht_wc_leds_remove()
412 cht_wc_led_restore_regs(&leds->leds[0], &leds->led1_initial_regs); in cht_wc_leds_remove()
417 struct cht_wc_leds *leds = platform_get_drvdata(pdev); in cht_wc_leds_disable() local
421 cht_wc_leds_brightness_set(&leds->leds[i].cdev, 0); in cht_wc_leds_disable()
423 /* Restore LED1 regs if hw-control was active else leave LED1 off */ in cht_wc_leds_disable()
424 if (!(leds->led1_initial_regs.ctrl & CHT_WC_LED1_SWCTL)) in cht_wc_leds_disable()
425 cht_wc_led_restore_regs(&leds->leds[0], &leds->led1_initial_regs); in cht_wc_leds_disable()
428 /* On suspend save current settings and turn LEDs off */
431 struct cht_wc_leds *leds = dev_get_drvdata(dev); in cht_wc_leds_suspend() local
435 ret = cht_wc_led_save_regs(&leds->leds[i], &leds->leds[i].saved_regs); in cht_wc_leds_suspend()
447 struct cht_wc_leds *leds = dev_get_drvdata(dev); in cht_wc_leds_resume() local
451 cht_wc_led_restore_regs(&leds->leds[i], &leds->leds[i].saved_regs); in cht_wc_leds_resume()
470 MODULE_DESCRIPTION("Intel Cherry Trail Whiskey Cove PMIC LEDs driver");