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