Lines Matching +full:gpio +full:- +full:defaults

1 // SPDX-License-Identifier: GPL-2.0
3 // Copyright (C) 2018-20 Texas Instruments Incorporated - https://www.ti.com/
5 #include <linux/gpio/consumer.h>
17 #include <linux/led-class-multicolor.h>
73 /* LEDX_BRT registers are all 0xff for defaults */
76 /* OUTX_CLR registers are all 0x0 for defaults */
92 /* LEDX_BRT registers are all 0xff for defaults */
96 /* OUTX_CLR registers are all 0x0 for defaults */
115 /* LEDX_BRT registers are all 0xff for defaults */
120 /* OUTX_CLR registers are all 0x0 for defaults */
171 * struct lp50xx_chip_info -
271 * struct lp50xx -
272 * @enable_gpio: hardware enable gpio
304 const struct lp50xx_chip_info *led_chip = led->priv->chip_info;
309 mutex_lock(&led->priv->lock);
310 if (led->ctrl_bank_enabled)
311 reg_val = led_chip->bank_brt_reg;
313 reg_val = led_chip->led_brightness0_reg +
314 led->led_number;
316 ret = regmap_write(led->priv->regmap, reg_val, brightness);
318 dev_err(led->priv->dev,
323 for (i = 0; i < led->mc_cdev.num_colors; i++) {
324 if (led->ctrl_bank_enabled) {
325 reg_val = led_chip->bank_mix_reg + i;
327 led_offset = (led->led_number * 3) + i;
328 reg_val = led_chip->mix_out0_reg + led_offset;
331 ret = regmap_write(led->priv->regmap, reg_val,
332 mc_dev->subled_info[i].intensity);
334 dev_err(led->priv->dev,
340 mutex_unlock(&led->priv->lock);
351 for (i = 0; i < priv->chip_info->max_modules; i++) {
359 ret = regmap_write(priv->regmap, LP50XX_LED_CFG0, led_config_lo);
363 if (priv->chip_info->model_id >= LP5030)
364 ret = regmap_write(priv->regmap, LP5036_LED_CFG1, led_config_hi);
371 return regmap_write(priv->regmap, priv->chip_info->reset_reg, LP50XX_SW_RESET);
378 ret = gpiod_direction_output(priv->enable_gpio, enable_disable);
383 return regmap_write(priv->regmap, LP50XX_DEV_CFG0, LP50XX_CHIP_EN);
385 return regmap_write(priv->regmap, LP50XX_DEV_CFG0, 0);
397 if (num_leds > priv->chip_info->max_modules) {
398 dev_err(priv->dev, "reg property is invalid\n");
399 return -EINVAL;
404 dev_err(priv->dev, "reg property is missing\n");
410 dev_err(priv->dev, "Cannot setup banked LEDs\n");
414 led->ctrl_bank_enabled = 1;
418 dev_err(priv->dev, "led reg property missing\n");
422 if (led_number > priv->chip_info->num_leds) {
423 dev_err(priv->dev, "led-sources property is invalid\n");
424 return -EINVAL;
427 led->led_number = led_number;
440 int ret = -EINVAL;
445 priv->enable_gpio = devm_gpiod_get_optional(priv->dev, "enable", GPIOD_OUT_LOW);
446 if (IS_ERR(priv->enable_gpio))
447 return dev_err_probe(priv->dev, PTR_ERR(priv->enable_gpio),
448 "Failed to get enable GPIO\n");
450 priv->regulator = devm_regulator_get(priv->dev, "vled");
451 if (IS_ERR(priv->regulator))
452 priv->regulator = NULL;
454 device_for_each_child_node_scoped(priv->dev, child) {
455 led = &priv->leds[i];
458 dev_err(priv->dev, "reg property is invalid\n");
473 mc_led_info = devm_kcalloc(priv->dev, LP50XX_LEDS_PER_MODULE,
476 return -ENOMEM;
484 dev_err(priv->dev, "Cannot read color\n");
489 dev_err(priv->dev, "reg must be set\n");
490 return -EINVAL;
492 dev_err(priv->dev, "reg %i out of range\n", multi_index);
493 return -EINVAL;
500 led->priv = priv;
501 led->mc_cdev.num_colors = num_colors;
502 led->mc_cdev.subled_info = mc_led_info;
503 led_cdev = &led->mc_cdev.led_cdev;
504 led_cdev->brightness_set_blocking = lp50xx_brightness_set;
506 ret = devm_led_classdev_multicolor_register_ext(priv->dev,
507 &led->mc_cdev,
510 dev_err(priv->dev, "led register err: %d\n", ret);
525 count = device_get_child_node_count(&client->dev);
527 dev_err(&client->dev, "LEDs are not defined in device tree!");
528 return -ENODEV;
531 led = devm_kzalloc(&client->dev, struct_size(led, leds, count),
534 return -ENOMEM;
536 mutex_init(&led->lock);
537 led->client = client;
538 led->dev = &client->dev;
539 led->chip_info = device_get_match_data(&client->dev);
541 led->regmap = devm_regmap_init_i2c(client,
542 led->chip_info->lp50xx_regmap_config);
543 if (IS_ERR(led->regmap)) {
544 ret = PTR_ERR(led->regmap);
545 dev_err(&client->dev, "Failed to allocate register map: %d\n",
568 dev_err(led->dev, "Failed to disable chip\n");
570 if (led->regulator) {
571 ret = regulator_disable(led->regulator);
573 dev_err(led->dev, "Failed to disable regulator\n");
576 mutex_destroy(&led->lock);