• Home
  • Raw
  • Download

Lines Matching +full:led +full:-

1 // SPDX-License-Identifier: GPL-2.0
2 // TI LM3692x LED chip family driver
3 // Copyright (C) 2017-18 Texas Instruments Incorporated - http://www.ti.com/
99 * struct lm3692x_led -
100 * @lock - Lock for reading/writing the device
101 * @client - Pointer to the I2C client
102 * @led_dev - LED class device pointer
103 * @regmap - Devices register map
104 * @enable_gpio - VDDIO/EN gpio to enable communication interface
105 * @regulator - LED supply regulator pointer
106 * @label - LED label
107 * @led_enable - LED sync to be enabled
108 * @model_id - Current device model ID enumerated
145 static int lm3692x_fault_check(struct lm3692x_led *led) in lm3692x_fault_check() argument
150 ret = regmap_read(led->regmap, LM3692X_FAULT_FLAGS, &read_buf); in lm3692x_fault_check()
155 dev_err(&led->client->dev, "Detected a fault 0x%X\n", read_buf); in lm3692x_fault_check()
160 regmap_read(led->regmap, LM3692X_FAULT_FLAGS, &read_buf); in lm3692x_fault_check()
162 dev_err(&led->client->dev, "Second read of fault flags 0x%X\n", in lm3692x_fault_check()
171 struct lm3692x_led *led = in lm3692x_brightness_set() local
176 mutex_lock(&led->lock); in lm3692x_brightness_set()
178 ret = lm3692x_fault_check(led); in lm3692x_brightness_set()
180 dev_err(&led->client->dev, "Cannot read/clear faults\n"); in lm3692x_brightness_set()
184 ret = regmap_write(led->regmap, LM3692X_BRT_MSB, brt_val); in lm3692x_brightness_set()
186 dev_err(&led->client->dev, "Cannot write MSB\n"); in lm3692x_brightness_set()
190 ret = regmap_write(led->regmap, LM3692X_BRT_LSB, led_brightness_lsb); in lm3692x_brightness_set()
192 dev_err(&led->client->dev, "Cannot write LSB\n"); in lm3692x_brightness_set()
196 mutex_unlock(&led->lock); in lm3692x_brightness_set()
200 static int lm3692x_init(struct lm3692x_led *led) in lm3692x_init() argument
205 if (led->regulator) { in lm3692x_init()
206 ret = regulator_enable(led->regulator); in lm3692x_init()
208 dev_err(&led->client->dev, in lm3692x_init()
214 if (led->enable_gpio) in lm3692x_init()
215 gpiod_direction_output(led->enable_gpio, 1); in lm3692x_init()
217 ret = lm3692x_fault_check(led); in lm3692x_init()
219 dev_err(&led->client->dev, "Cannot read/clear faults\n"); in lm3692x_init()
223 ret = regmap_write(led->regmap, LM3692X_BRT_CTRL, 0x00); in lm3692x_init()
233 ret = regmap_write(led->regmap, LM3692X_EN, LM3692X_DEVICE_EN); in lm3692x_init()
240 ret = regmap_write(led->regmap, LM3692X_BRT_MSB, 0); in lm3692x_init()
244 ret = regmap_write(led->regmap, LM3692X_BRT_LSB, 0); in lm3692x_init()
248 ret = regmap_write(led->regmap, LM3692X_PWM_CTRL, in lm3692x_init()
253 ret = regmap_write(led->regmap, LM3692X_BOOST_CTRL, in lm3692x_init()
260 ret = regmap_write(led->regmap, LM3692X_AUTO_FREQ_HI, 0x00); in lm3692x_init()
264 ret = regmap_write(led->regmap, LM3692X_AUTO_FREQ_LO, 0x00); in lm3692x_init()
268 ret = regmap_write(led->regmap, LM3692X_BL_ADJ_THRESH, 0x00); in lm3692x_init()
272 ret = regmap_write(led->regmap, LM3692X_BRT_CTRL, in lm3692x_init()
277 switch (led->led_enable) { in lm3692x_init()
280 if (led->model_id == LM36923_MODEL) in lm3692x_init()
295 if (led->model_id == LM36923_MODEL) { in lm3692x_init()
300 ret = -EINVAL; in lm3692x_init()
301 dev_err(&led->client->dev, in lm3692x_init()
306 ret = regmap_update_bits(led->regmap, LM3692X_EN, LM3692X_ENABLE_MASK, in lm3692x_init()
311 dev_err(&led->client->dev, "Fail writing initialization values\n"); in lm3692x_init()
313 if (led->enable_gpio) in lm3692x_init()
314 gpiod_direction_output(led->enable_gpio, 0); in lm3692x_init()
316 if (led->regulator) { in lm3692x_init()
317 ret = regulator_disable(led->regulator); in lm3692x_init()
319 dev_err(&led->client->dev, in lm3692x_init()
325 static int lm3692x_probe_dt(struct lm3692x_led *led) in lm3692x_probe_dt() argument
331 led->enable_gpio = devm_gpiod_get_optional(&led->client->dev, in lm3692x_probe_dt()
333 if (IS_ERR(led->enable_gpio)) { in lm3692x_probe_dt()
334 ret = PTR_ERR(led->enable_gpio); in lm3692x_probe_dt()
335 dev_err(&led->client->dev, "Failed to get enable gpio: %d\n", in lm3692x_probe_dt()
340 led->regulator = devm_regulator_get_optional(&led->client->dev, "vled"); in lm3692x_probe_dt()
341 if (IS_ERR(led->regulator)) { in lm3692x_probe_dt()
342 ret = PTR_ERR(led->regulator); in lm3692x_probe_dt()
343 if (ret != -ENODEV) { in lm3692x_probe_dt()
344 if (ret != -EPROBE_DEFER) in lm3692x_probe_dt()
345 dev_err(&led->client->dev, in lm3692x_probe_dt()
350 led->regulator = NULL; in lm3692x_probe_dt()
353 child = device_get_next_child_node(&led->client->dev, child); in lm3692x_probe_dt()
355 dev_err(&led->client->dev, "No LED Child node\n"); in lm3692x_probe_dt()
356 return -ENODEV; in lm3692x_probe_dt()
359 fwnode_property_read_string(child, "linux,default-trigger", in lm3692x_probe_dt()
360 &led->led_dev.default_trigger); in lm3692x_probe_dt()
364 snprintf(led->label, sizeof(led->label), in lm3692x_probe_dt()
365 "%s::", led->client->name); in lm3692x_probe_dt()
367 snprintf(led->label, sizeof(led->label), in lm3692x_probe_dt()
368 "%s:%s", led->client->name, name); in lm3692x_probe_dt()
370 ret = fwnode_property_read_u32(child, "reg", &led->led_enable); in lm3692x_probe_dt()
372 dev_err(&led->client->dev, "reg DT property missing\n"); in lm3692x_probe_dt()
376 led->led_dev.name = led->label; in lm3692x_probe_dt()
378 ret = devm_led_classdev_register(&led->client->dev, &led->led_dev); in lm3692x_probe_dt()
380 dev_err(&led->client->dev, "led register err: %d\n", ret); in lm3692x_probe_dt()
384 led->led_dev.dev->of_node = to_of_node(child); in lm3692x_probe_dt()
392 struct lm3692x_led *led; in lm3692x_probe() local
395 led = devm_kzalloc(&client->dev, sizeof(*led), GFP_KERNEL); in lm3692x_probe()
396 if (!led) in lm3692x_probe()
397 return -ENOMEM; in lm3692x_probe()
399 mutex_init(&led->lock); in lm3692x_probe()
400 led->client = client; in lm3692x_probe()
401 led->led_dev.brightness_set_blocking = lm3692x_brightness_set; in lm3692x_probe()
402 led->model_id = id->driver_data; in lm3692x_probe()
403 i2c_set_clientdata(client, led); in lm3692x_probe()
405 led->regmap = devm_regmap_init_i2c(client, &lm3692x_regmap_config); in lm3692x_probe()
406 if (IS_ERR(led->regmap)) { in lm3692x_probe()
407 ret = PTR_ERR(led->regmap); in lm3692x_probe()
408 dev_err(&client->dev, "Failed to allocate register map: %d\n", in lm3692x_probe()
413 ret = lm3692x_probe_dt(led); in lm3692x_probe()
417 ret = lm3692x_init(led); in lm3692x_probe()
426 struct lm3692x_led *led = i2c_get_clientdata(client); in lm3692x_remove() local
429 ret = regmap_update_bits(led->regmap, LM3692X_EN, LM3692X_DEVICE_EN, 0); in lm3692x_remove()
431 dev_err(&led->client->dev, "Failed to disable regulator\n"); in lm3692x_remove()
435 if (led->enable_gpio) in lm3692x_remove()
436 gpiod_direction_output(led->enable_gpio, 0); in lm3692x_remove()
438 if (led->regulator) { in lm3692x_remove()
439 ret = regulator_disable(led->regulator); in lm3692x_remove()
441 dev_err(&led->client->dev, in lm3692x_remove()
445 mutex_destroy(&led->lock); in lm3692x_remove()
475 MODULE_DESCRIPTION("Texas Instruments LM3692X LED driver");