Lines Matching +full:led +full:- +full:8
1 // SPDX-License-Identifier: GPL-2.0-only
3 * TI LP8860 4-Channel LED Driver
90 * @led_dev: led class device pointer
94 * @regulator: LED supply regulator pointer
139 static int lp8860_unlock_eeprom(struct lp8860_led *led, int lock)
143 mutex_lock(&led->lock);
146 ret = regmap_write(led->regmap,
150 dev_err(&led->client->dev, "EEPROM Unlock failed\n");
154 ret = regmap_write(led->regmap,
158 dev_err(&led->client->dev, "EEPROM Unlock failed\n");
161 ret = regmap_write(led->regmap,
165 dev_err(&led->client->dev, "EEPROM Unlock failed\n");
169 ret = regmap_write(led->regmap,
175 mutex_unlock(&led->lock);
179 static int lp8860_fault_check(struct lp8860_led *led)
184 ret = regmap_read(led->regmap, LP8860_LED_FAULT, &read_buf);
190 ret = regmap_read(led->regmap, LP8860_FAULT, &read_buf);
198 ret = regmap_write(led->regmap, LP8860_FAULT_CLEAR,
207 struct lp8860_led *led =
212 mutex_lock(&led->lock);
214 ret = lp8860_fault_check(led);
216 dev_err(&led->client->dev, "Cannot read/clear faults\n");
220 ret = regmap_write(led->regmap, LP8860_DISP_CL1_BRT_MSB,
221 (disp_brightness & 0xff00) >> 8);
223 dev_err(&led->client->dev, "Cannot write CL1 MSB\n");
227 ret = regmap_write(led->regmap, LP8860_DISP_CL1_BRT_LSB,
230 dev_err(&led->client->dev, "Cannot write CL1 LSB\n");
234 mutex_unlock(&led->lock);
238 static int lp8860_init(struct lp8860_led *led)
243 if (led->regulator) {
244 ret = regulator_enable(led->regulator);
246 dev_err(&led->client->dev,
252 gpiod_direction_output(led->enable_gpio, 1);
254 ret = lp8860_fault_check(led);
258 ret = regmap_read(led->regmap, LP8860_STATUS, &read_buf);
262 ret = lp8860_unlock_eeprom(led, LP8860_UNLOCK_EEPROM);
264 dev_err(&led->client->dev, "Failed unlocking EEPROM\n");
270 ret = regmap_write(led->eeprom_regmap,
274 dev_err(&led->client->dev, "Failed writing EEPROM\n");
279 ret = lp8860_unlock_eeprom(led, LP8860_LOCK_EEPROM);
283 ret = regmap_write(led->regmap,
287 dev_err(&led->client->dev, "Failed programming EEPROM\n");
295 gpiod_direction_output(led->enable_gpio, 0);
297 if (led->regulator) {
298 ret = regulator_disable(led->regulator);
300 dev_err(&led->client->dev,
328 .reg_bits = 8,
329 .val_bits = 8,
366 .reg_bits = 8,
367 .val_bits = 8,
378 struct lp8860_led *led;
379 struct device_node *np = dev_of_node(&client->dev);
383 led = devm_kzalloc(&client->dev, sizeof(*led), GFP_KERNEL);
384 if (!led)
385 return -ENOMEM;
389 return -EINVAL;
391 led->enable_gpio = devm_gpiod_get_optional(&client->dev,
393 if (IS_ERR(led->enable_gpio)) {
394 ret = PTR_ERR(led->enable_gpio);
395 dev_err(&client->dev, "Failed to get enable gpio: %d\n", ret);
399 led->regulator = devm_regulator_get(&client->dev, "vled");
400 if (IS_ERR(led->regulator))
401 led->regulator = NULL;
403 led->client = client;
404 led->led_dev.brightness_set_blocking = lp8860_brightness_set;
406 mutex_init(&led->lock);
408 i2c_set_clientdata(client, led);
410 led->regmap = devm_regmap_init_i2c(client, &lp8860_regmap_config);
411 if (IS_ERR(led->regmap)) {
412 ret = PTR_ERR(led->regmap);
413 dev_err(&client->dev, "Failed to allocate register map: %d\n",
418 led->eeprom_regmap = devm_regmap_init_i2c(client, &lp8860_eeprom_regmap_config);
419 if (IS_ERR(led->eeprom_regmap)) {
420 ret = PTR_ERR(led->eeprom_regmap);
421 dev_err(&client->dev, "Failed to allocate register map: %d\n",
426 ret = lp8860_init(led);
434 ret = devm_led_classdev_register_ext(&client->dev, &led->led_dev,
437 dev_err(&client->dev, "led register err: %d\n", ret);
446 struct lp8860_led *led = i2c_get_clientdata(client);
449 gpiod_direction_output(led->enable_gpio, 0);
451 if (led->regulator) {
452 ret = regulator_disable(led->regulator);
454 dev_err(&led->client->dev,
458 mutex_destroy(&led->lock);
484 MODULE_DESCRIPTION("Texas Instruments LP8860 LED driver");