Lines Matching +full:led +full:- +full:1
1 // SPDX-License-Identifier: GPL-2.0-only
3 * TI LP8864/LP8866 4/6 Channel LED Driver
30 /* Textual meaning for status bits, starting from bit 1 */
32 "Vin under-voltage fault",
33 "Vin over-voltage fault",
34 "Vdd under-voltage fault",
35 "Vin over-current fault",
42 /* Textual meaning for status bits, starting from bit 1 */
46 "Boost over-current fault",
49 "Missing LED resistor fault",
56 "LED 1 fault",
57 "LED 2 fault",
58 "LED 3 fault",
59 "LED 4 fault",
60 "LED 5 fault",
61 "LED 6 fault",
62 "LED open fault",
63 "LED internal short fault",
64 "LED short to GND fault",
74 * @led_dev: led class device pointer
76 * @led_status_mask: Helps to report LED fault only once
85 static int lp8864_fault_check(struct lp8864_led *led) in lp8864_fault_check() argument
90 ret = regmap_read(led->regmap, LP8864_SUPPLY_STATUS, &val); in lp8864_fault_check()
96 if (val & BIT(i * 2 + 1)) in lp8864_fault_check()
97 dev_warn(&led->client->dev, "%s\n", lp8864_supply_status_msg[i]); in lp8864_fault_check()
101 * both have to be written "1" simultaneously to clear the corresponding in lp8864_fault_check()
105 ret = regmap_write(led->regmap, LP8864_SUPPLY_STATUS, val >> 1 | val); in lp8864_fault_check()
109 ret = regmap_read(led->regmap, LP8864_BOOST_STATUS, &val); in lp8864_fault_check()
115 if (val & BIT(i * 2 + 1)) in lp8864_fault_check()
116 dev_warn(&led->client->dev, "%s\n", lp8864_boost_status_msg[i]); in lp8864_fault_check()
119 ret = regmap_write(led->regmap, LP8864_BOOST_STATUS, val >> 1 | val); in lp8864_fault_check()
123 ret = regmap_read(led->regmap, LP8864_LED_STATUS, &val); in lp8864_fault_check()
129 * power-down in lp8864_fault_check()
131 val &= ~led->led_status_mask; in lp8864_fault_check()
135 dev_warn(&led->client->dev, "%s\n", lp8864_led_status_msg[i]); in lp8864_fault_check()
138 * Mark those which maintain their value until device power-down as in lp8864_fault_check()
141 led->led_status_mask |= val & ~LP8864_LED_STATUS_WR_MASK; in lp8864_fault_check()
148 ret = regmap_write(led->regmap, LP8864_LED_STATUS, val >> 1 | val); in lp8864_fault_check()
155 dev_err(&led->client->dev, "Failed to read/clear faults (%pe)\n", ERR_PTR(ret)); in lp8864_fault_check()
163 struct lp8864_led *led = container_of(led_cdev, struct lp8864_led, led_dev); in lp8864_brightness_set() local
164 /* Scale 0..LED_FULL into 16-bit HW brightness */ in lp8864_brightness_set()
168 ret = lp8864_fault_check(led); in lp8864_brightness_set()
172 ret = regmap_write(led->regmap, LP8864_BRT_CONTROL, val); in lp8864_brightness_set()
174 dev_err(&led->client->dev, "Failed to write brightness value\n"); in lp8864_brightness_set()
181 struct lp8864_led *led = container_of(led_cdev, struct lp8864_led, led_dev); in lp8864_brightness_get() local
185 ret = regmap_read(led->regmap, LP8864_BRT_CONTROL, &val); in lp8864_brightness_get()
187 dev_err(&led->client->dev, "Failed to read brightness value\n"); in lp8864_brightness_get()
191 /* Scale 16-bit HW brightness into 0..LED_FULL */ in lp8864_brightness_get()
211 struct lp8864_led *led; in lp8864_probe() local
212 struct device_node *np = dev_of_node(&client->dev); in lp8864_probe()
217 led = devm_kzalloc(&client->dev, sizeof(*led), GFP_KERNEL); in lp8864_probe()
218 if (!led) in lp8864_probe()
219 return -ENOMEM; in lp8864_probe()
223 dev_err(&client->dev, "No LED function defined\n"); in lp8864_probe()
224 return -EINVAL; in lp8864_probe()
227 ret = devm_regulator_get_enable_optional(&client->dev, "vled"); in lp8864_probe()
228 if (ret && ret != -ENODEV) in lp8864_probe()
229 return dev_err_probe(&client->dev, ret, "Failed to enable vled regulator\n"); in lp8864_probe()
231 enable_gpio = devm_gpiod_get_optional(&client->dev, "enable", GPIOD_OUT_HIGH); in lp8864_probe()
233 return dev_err_probe(&client->dev, PTR_ERR(enable_gpio), in lp8864_probe()
236 ret = devm_add_action_or_reset(&client->dev, lp8864_disable_gpio, enable_gpio); in lp8864_probe()
240 led->client = client; in lp8864_probe()
241 led->led_dev.brightness_set_blocking = lp8864_brightness_set; in lp8864_probe()
242 led->led_dev.brightness_get = lp8864_brightness_get; in lp8864_probe()
244 led->regmap = devm_regmap_init_i2c(client, &lp8864_regmap_config); in lp8864_probe()
245 if (IS_ERR(led->regmap)) in lp8864_probe()
246 return dev_err_probe(&client->dev, PTR_ERR(led->regmap), in lp8864_probe()
250 ret = regmap_update_bits(led->regmap, LP8864_USER_CONFIG1, LP8864_BRT_MODE_MASK, in lp8864_probe()
253 dev_err(&led->client->dev, "Failed to set brightness control mode\n"); in lp8864_probe()
257 ret = lp8864_fault_check(led); in lp8864_probe()
265 ret = devm_led_classdev_register_ext(&client->dev, &led->led_dev, &init_data); in lp8864_probe()
267 dev_err(&client->dev, "Failed to register LED device (%pe)\n", ERR_PTR(ret)); in lp8864_probe()
294 MODULE_DESCRIPTION("Texas Instruments LP8864/LP8866 LED driver");