leds-lp8860.c (b12ef03a38b20e1bfaa163ed1632625fedd570ee) | leds-lp8860.c (c6b218c9c0d686486dcc39a1d80aff90801ca6fc) |
---|---|
1/* 2 * TI LP8860 4-Channel LED Driver 3 * 4 * Copyright (C) 2014 Texas Instruments 5 * 6 * Author: Dan Murphy <dmurphy@ti.com> 7 * 8 * This program is free software; you can redistribute it and/or --- 8 unchanged lines hidden (view full) --- 17#include <linux/regmap.h> 18#include <linux/regulator/consumer.h> 19#include <linux/module.h> 20#include <linux/mutex.h> 21#include <linux/of.h> 22#include <linux/of_gpio.h> 23#include <linux/gpio/consumer.h> 24#include <linux/slab.h> | 1/* 2 * TI LP8860 4-Channel LED Driver 3 * 4 * Copyright (C) 2014 Texas Instruments 5 * 6 * Author: Dan Murphy <dmurphy@ti.com> 7 * 8 * This program is free software; you can redistribute it and/or --- 8 unchanged lines hidden (view full) --- 17#include <linux/regmap.h> 18#include <linux/regulator/consumer.h> 19#include <linux/module.h> 20#include <linux/mutex.h> 21#include <linux/of.h> 22#include <linux/of_gpio.h> 23#include <linux/gpio/consumer.h> 24#include <linux/slab.h> |
25#include <uapi/linux/uleds.h> |
|
25 26#define LP8860_DISP_CL1_BRT_MSB 0x00 27#define LP8860_DISP_CL1_BRT_LSB 0x01 28#define LP8860_DISP_CL1_CURR_MSB 0x02 29#define LP8860_DISP_CL1_CURR_LSB 0x03 30#define LP8860_CL2_BRT_MSB 0x04 31#define LP8860_CL2_BRT_LSB 0x05 32#define LP8860_CL2_CURRENT 0x06 --- 48 unchanged lines hidden (view full) --- 81#define LP8860_UNLOCK_EEPROM 0x01 82#define LP8860_PROGRAM_EEPROM 0x02 83#define LP8860_EEPROM_CODE_1 0x08 84#define LP8860_EEPROM_CODE_2 0xba 85#define LP8860_EEPROM_CODE_3 0xef 86 87#define LP8860_CLEAR_FAULTS 0x01 88 | 26 27#define LP8860_DISP_CL1_BRT_MSB 0x00 28#define LP8860_DISP_CL1_BRT_LSB 0x01 29#define LP8860_DISP_CL1_CURR_MSB 0x02 30#define LP8860_DISP_CL1_CURR_LSB 0x03 31#define LP8860_CL2_BRT_MSB 0x04 32#define LP8860_CL2_BRT_LSB 0x05 33#define LP8860_CL2_CURRENT 0x06 --- 48 unchanged lines hidden (view full) --- 82#define LP8860_UNLOCK_EEPROM 0x01 83#define LP8860_PROGRAM_EEPROM 0x02 84#define LP8860_EEPROM_CODE_1 0x08 85#define LP8860_EEPROM_CODE_2 0xba 86#define LP8860_EEPROM_CODE_3 0xef 87 88#define LP8860_CLEAR_FAULTS 0x01 89 |
89#define LP8860_DISP_LED_NAME "display_cluster" 90 | |
91/** 92 * struct lp8860_led - 93 * @lock - Lock for reading/writing the device 94 * @client - Pointer to the I2C client 95 * @led_dev - led class device pointer 96 * @regmap - Devices register map 97 * @eeprom_regmap - EEPROM register map 98 * @enable_gpio - VDDIO/EN gpio to enable communication interface 99 * @regulator - LED supply regulator pointer 100 * @label - LED label 101 */ 102struct lp8860_led { 103 struct mutex lock; 104 struct i2c_client *client; 105 struct led_classdev led_dev; 106 struct regmap *regmap; 107 struct regmap *eeprom_regmap; 108 struct gpio_desc *enable_gpio; 109 struct regulator *regulator; | 90/** 91 * struct lp8860_led - 92 * @lock - Lock for reading/writing the device 93 * @client - Pointer to the I2C client 94 * @led_dev - led class device pointer 95 * @regmap - Devices register map 96 * @eeprom_regmap - EEPROM register map 97 * @enable_gpio - VDDIO/EN gpio to enable communication interface 98 * @regulator - LED supply regulator pointer 99 * @label - LED label 100 */ 101struct lp8860_led { 102 struct mutex lock; 103 struct i2c_client *client; 104 struct led_classdev led_dev; 105 struct regmap *regmap; 106 struct regmap *eeprom_regmap; 107 struct gpio_desc *enable_gpio; 108 struct regulator *regulator; |
110 const char *label; | 109 char label[LED_MAX_NAME_SIZE]; |
111}; 112 113struct lp8860_eeprom_reg { 114 uint8_t reg; 115 uint8_t value; 116}; 117 118static struct lp8860_eeprom_reg lp8860_eeprom_disp_regs[] = { --- 263 unchanged lines hidden (view full) --- 382}; 383 384static int lp8860_probe(struct i2c_client *client, 385 const struct i2c_device_id *id) 386{ 387 int ret; 388 struct lp8860_led *led; 389 struct device_node *np = client->dev.of_node; | 110}; 111 112struct lp8860_eeprom_reg { 113 uint8_t reg; 114 uint8_t value; 115}; 116 117static struct lp8860_eeprom_reg lp8860_eeprom_disp_regs[] = { --- 263 unchanged lines hidden (view full) --- 381}; 382 383static int lp8860_probe(struct i2c_client *client, 384 const struct i2c_device_id *id) 385{ 386 int ret; 387 struct lp8860_led *led; 388 struct device_node *np = client->dev.of_node; |
389 struct device_node *child_node; 390 const char *name; |
|
390 391 led = devm_kzalloc(&client->dev, sizeof(*led), GFP_KERNEL); 392 if (!led) 393 return -ENOMEM; 394 | 391 392 led = devm_kzalloc(&client->dev, sizeof(*led), GFP_KERNEL); 393 if (!led) 394 return -ENOMEM; 395 |
395 led->label = LP8860_DISP_LED_NAME; 396 397 if (client->dev.of_node) { 398 ret = of_property_read_string(np, "label", &led->label); 399 if (ret) { 400 dev_err(&client->dev, "Missing label in dt\n"); 401 return -EINVAL; 402 } | 396 for_each_available_child_of_node(np, child_node) { 397 ret = of_property_read_string(child_node, "label", &name); 398 if (!ret) 399 snprintf(led->label, sizeof(led->label), "%s:%s", 400 id->name, name); 401 else 402 snprintf(led->label, sizeof(led->label), 403 "%s::display_cluster", id->name); |
403 } 404 405 led->enable_gpio = devm_gpiod_get_optional(&client->dev, 406 "enable", GPIOD_OUT_LOW); 407 if (IS_ERR(led->enable_gpio)) { 408 ret = PTR_ERR(led->enable_gpio); 409 dev_err(&client->dev, "Failed to get enable gpio: %d\n", ret); 410 return ret; --- 92 unchanged lines hidden --- | 404 } 405 406 led->enable_gpio = devm_gpiod_get_optional(&client->dev, 407 "enable", GPIOD_OUT_LOW); 408 if (IS_ERR(led->enable_gpio)) { 409 ret = PTR_ERR(led->enable_gpio); 410 dev_err(&client->dev, "Failed to get enable gpio: %d\n", ret); 411 return ret; --- 92 unchanged lines hidden --- |