Lines Matching +full:vled +full:- +full:supply

1 // SPDX-License-Identifier: GPL-2.0
3 // Copyright (C) 2018-20 Texas Instruments Incorporated - https://www.ti.com/
17 #include <linux/led-class-multicolor.h>
173 * struct lp50xx_chip_info -
274 * struct lp50xx -
276 * @regulator: LED supply regulator pointer
309 const struct lp50xx_chip_info *led_chip = led->priv->chip_info; in lp50xx_brightness_set()
314 mutex_lock(&led->priv->lock); in lp50xx_brightness_set()
315 if (led->ctrl_bank_enabled) in lp50xx_brightness_set()
316 reg_val = led_chip->bank_brt_reg; in lp50xx_brightness_set()
318 reg_val = led_chip->led_brightness0_reg + in lp50xx_brightness_set()
319 led->led_number; in lp50xx_brightness_set()
321 ret = regmap_write(led->priv->regmap, reg_val, brightness); in lp50xx_brightness_set()
323 dev_err(led->priv->dev, in lp50xx_brightness_set()
328 for (i = 0; i < led->mc_cdev.num_colors; i++) { in lp50xx_brightness_set()
329 if (led->ctrl_bank_enabled) { in lp50xx_brightness_set()
330 reg_val = led_chip->bank_mix_reg + i; in lp50xx_brightness_set()
332 led_offset = (led->led_number * 3) + i; in lp50xx_brightness_set()
333 reg_val = led_chip->mix_out0_reg + led_offset; in lp50xx_brightness_set()
336 ret = regmap_write(led->priv->regmap, reg_val, in lp50xx_brightness_set()
337 mc_dev->subled_info[i].intensity); in lp50xx_brightness_set()
339 dev_err(led->priv->dev, in lp50xx_brightness_set()
345 mutex_unlock(&led->priv->lock); in lp50xx_brightness_set()
356 for (i = 0; i < priv->chip_info->max_modules; i++) { in lp50xx_set_banks()
364 ret = regmap_write(priv->regmap, LP50XX_LED_CFG0, led_config_lo); in lp50xx_set_banks()
368 if (priv->chip_info->model_id >= LP5030) in lp50xx_set_banks()
369 ret = regmap_write(priv->regmap, LP5036_LED_CFG1, led_config_hi); in lp50xx_set_banks()
376 return regmap_write(priv->regmap, priv->chip_info->reset_reg, LP50XX_SW_RESET); in lp50xx_reset()
383 ret = gpiod_direction_output(priv->enable_gpio, enable_disable); in lp50xx_enable_disable()
388 return regmap_write(priv->regmap, LP50XX_DEV_CFG0, LP50XX_CHIP_EN); in lp50xx_enable_disable()
390 return regmap_write(priv->regmap, LP50XX_DEV_CFG0, 0); in lp50xx_enable_disable()
402 if (num_leds > priv->chip_info->max_modules) { in lp50xx_probe_leds()
403 dev_err(priv->dev, "reg property is invalid\n"); in lp50xx_probe_leds()
404 return -EINVAL; in lp50xx_probe_leds()
407 priv->num_of_banked_leds = num_leds; in lp50xx_probe_leds()
411 dev_err(priv->dev, "reg property is missing\n"); in lp50xx_probe_leds()
417 dev_err(priv->dev, "Cannot setup banked LEDs\n"); in lp50xx_probe_leds()
421 led->ctrl_bank_enabled = 1; in lp50xx_probe_leds()
425 dev_err(priv->dev, "led reg property missing\n"); in lp50xx_probe_leds()
429 if (led_number > priv->chip_info->num_leds) { in lp50xx_probe_leds()
430 dev_err(priv->dev, "led-sources property is invalid\n"); in lp50xx_probe_leds()
431 return -EINVAL; in lp50xx_probe_leds()
434 led->led_number = led_number; in lp50xx_probe_leds()
448 int ret = -EINVAL; in lp50xx_probe_dt()
453 priv->enable_gpio = devm_gpiod_get_optional(priv->dev, "enable", GPIOD_OUT_LOW); in lp50xx_probe_dt()
454 if (IS_ERR(priv->enable_gpio)) in lp50xx_probe_dt()
455 return dev_err_probe(priv->dev, PTR_ERR(priv->enable_gpio), in lp50xx_probe_dt()
458 priv->regulator = devm_regulator_get(priv->dev, "vled"); in lp50xx_probe_dt()
459 if (IS_ERR(priv->regulator)) in lp50xx_probe_dt()
460 priv->regulator = NULL; in lp50xx_probe_dt()
462 device_for_each_child_node(priv->dev, child) { in lp50xx_probe_dt()
463 led = &priv->leds[i]; in lp50xx_probe_dt()
466 dev_err(priv->dev, "reg property is invalid\n"); in lp50xx_probe_dt()
481 mc_led_info = devm_kcalloc(priv->dev, LP50XX_LEDS_PER_MODULE, in lp50xx_probe_dt()
484 ret = -ENOMEM; in lp50xx_probe_dt()
493 dev_err(priv->dev, "Cannot read color\n"); in lp50xx_probe_dt()
501 led->priv = priv; in lp50xx_probe_dt()
502 led->mc_cdev.num_colors = num_colors; in lp50xx_probe_dt()
503 led->mc_cdev.subled_info = mc_led_info; in lp50xx_probe_dt()
504 led_cdev = &led->mc_cdev.led_cdev; in lp50xx_probe_dt()
505 led_cdev->brightness_set_blocking = lp50xx_brightness_set; in lp50xx_probe_dt()
507 ret = devm_led_classdev_multicolor_register_ext(priv->dev, in lp50xx_probe_dt()
508 &led->mc_cdev, in lp50xx_probe_dt()
511 dev_err(priv->dev, "led register err: %d\n", ret); in lp50xx_probe_dt()
530 count = device_get_child_node_count(&client->dev); in lp50xx_probe()
532 dev_err(&client->dev, "LEDs are not defined in device tree!"); in lp50xx_probe()
533 return -ENODEV; in lp50xx_probe()
536 led = devm_kzalloc(&client->dev, struct_size(led, leds, count), in lp50xx_probe()
539 return -ENOMEM; in lp50xx_probe()
541 mutex_init(&led->lock); in lp50xx_probe()
542 led->client = client; in lp50xx_probe()
543 led->dev = &client->dev; in lp50xx_probe()
544 led->chip_info = device_get_match_data(&client->dev); in lp50xx_probe()
546 led->regmap = devm_regmap_init_i2c(client, in lp50xx_probe()
547 led->chip_info->lp50xx_regmap_config); in lp50xx_probe()
548 if (IS_ERR(led->regmap)) { in lp50xx_probe()
549 ret = PTR_ERR(led->regmap); in lp50xx_probe()
550 dev_err(&client->dev, "Failed to allocate register map: %d\n", in lp50xx_probe()
573 dev_err(led->dev, "Failed to disable chip\n"); in lp50xx_remove()
575 if (led->regulator) { in lp50xx_remove()
576 ret = regulator_disable(led->regulator); in lp50xx_remove()
578 dev_err(led->dev, "Failed to disable regulator\n"); in lp50xx_remove()
581 mutex_destroy(&led->lock); in lp50xx_remove()