• Home
  • Raw
  • Download

Lines Matching +full:led +full:- +full:max +full:- +full:microamp

1 // SPDX-License-Identifier: GPL-2.0
2 // Flash and torch driver for Texas Instruments LM3601X LED
4 // Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/
9 #include <linux/led-class-flash.h>
74 * struct lm3601x_led -
75 * @fled_cdev: flash LED class device pointer
79 * @led_name: LED label for the Torch or IR LED
138 static int lm3601x_read_faults(struct lm3601x_led *led) in lm3601x_read_faults() argument
143 ret = regmap_read(led->regmap, LM3601X_FLAGS_REG, &flags_val); in lm3601x_read_faults()
145 return -EIO; in lm3601x_read_faults()
147 led->last_flag = 0; in lm3601x_read_faults()
150 led->last_flag |= LED_FAULT_OVER_VOLTAGE; in lm3601x_read_faults()
153 led->last_flag |= LED_FAULT_OVER_TEMPERATURE; in lm3601x_read_faults()
156 led->last_flag |= LED_FAULT_SHORT_CIRCUIT; in lm3601x_read_faults()
159 led->last_flag |= LED_FAULT_OVER_CURRENT; in lm3601x_read_faults()
162 led->last_flag |= LED_FAULT_UNDER_VOLTAGE; in lm3601x_read_faults()
165 led->last_flag |= LED_FAULT_INPUT_VOLTAGE; in lm3601x_read_faults()
168 led->last_flag |= LED_FAULT_LED_OVER_TEMPERATURE; in lm3601x_read_faults()
170 return led->last_flag; in lm3601x_read_faults()
177 struct lm3601x_led *led = fled_cdev_to_led(fled_cdev); in lm3601x_brightness_set() local
180 mutex_lock(&led->lock); in lm3601x_brightness_set()
182 ret = lm3601x_read_faults(led); in lm3601x_brightness_set()
186 if (led->led_mode == LM3601X_LED_TORCH) in lm3601x_brightness_set()
192 ret = regmap_update_bits(led->regmap, LM3601X_ENABLE_REG, in lm3601x_brightness_set()
197 ret = regmap_write(led->regmap, LM3601X_LED_TORCH_REG, brightness); in lm3601x_brightness_set()
201 ret = regmap_update_bits(led->regmap, LM3601X_ENABLE_REG, in lm3601x_brightness_set()
205 mutex_unlock(&led->lock); in lm3601x_brightness_set()
212 struct lm3601x_led *led = fled_cdev_to_led(fled_cdev); in lm3601x_strobe_set() local
217 mutex_lock(&led->lock); in lm3601x_strobe_set()
219 ret = regmap_read(led->regmap, LM3601X_CFG_REG, &current_timeout); in lm3601x_strobe_set()
223 if (led->flash_timeout >= LM3601X_TIMEOUT_XOVER_US) in lm3601x_strobe_set()
224 timeout_reg_val = led->flash_timeout / LM3601X_UPPER_STEP_US + 0x07; in lm3601x_strobe_set()
226 timeout_reg_val = led->flash_timeout / LM3601X_LOWER_STEP_US - 0x01; in lm3601x_strobe_set()
228 if (led->flash_timeout != current_timeout) in lm3601x_strobe_set()
229 ret = regmap_update_bits(led->regmap, LM3601X_CFG_REG, in lm3601x_strobe_set()
233 ret = regmap_update_bits(led->regmap, LM3601X_ENABLE_REG, in lm3601x_strobe_set()
237 ret = regmap_update_bits(led->regmap, LM3601X_ENABLE_REG, in lm3601x_strobe_set()
240 ret = lm3601x_read_faults(led); in lm3601x_strobe_set()
242 mutex_unlock(&led->lock); in lm3601x_strobe_set()
249 struct lm3601x_led *led = fled_cdev_to_led(fled_cdev); in lm3601x_flash_brightness_set() local
253 mutex_lock(&led->lock); in lm3601x_flash_brightness_set()
254 ret = lm3601x_read_faults(led); in lm3601x_flash_brightness_set()
259 ret = regmap_update_bits(led->regmap, LM3601X_ENABLE_REG, in lm3601x_flash_brightness_set()
266 ret = regmap_write(led->regmap, LM3601X_LED_FLASH_REG, brightness_val); in lm3601x_flash_brightness_set()
268 mutex_unlock(&led->lock); in lm3601x_flash_brightness_set()
275 struct lm3601x_led *led = fled_cdev_to_led(fled_cdev); in lm3601x_flash_timeout_set() local
277 mutex_lock(&led->lock); in lm3601x_flash_timeout_set()
279 led->flash_timeout = timeout; in lm3601x_flash_timeout_set()
281 mutex_unlock(&led->lock); in lm3601x_flash_timeout_set()
288 struct lm3601x_led *led = fled_cdev_to_led(fled_cdev); in lm3601x_strobe_get() local
292 mutex_lock(&led->lock); in lm3601x_strobe_get()
294 ret = regmap_read(led->regmap, LM3601X_ENABLE_REG, &strobe_state); in lm3601x_strobe_get()
301 mutex_unlock(&led->lock); in lm3601x_strobe_get()
308 struct lm3601x_led *led = fled_cdev_to_led(fled_cdev); in lm3601x_flash_fault_get() local
310 lm3601x_read_faults(led); in lm3601x_flash_fault_get()
312 *fault = led->last_flag; in lm3601x_flash_fault_get()
325 static int lm3601x_register_leds(struct lm3601x_led *led) in lm3601x_register_leds() argument
330 led->fled_cdev.ops = &flash_ops; in lm3601x_register_leds()
332 setting = &led->fled_cdev.timeout; in lm3601x_register_leds()
333 setting->min = LM3601X_MIN_TIMEOUT_US; in lm3601x_register_leds()
334 setting->max = led->max_flash_timeout; in lm3601x_register_leds()
335 setting->step = LM3601X_LOWER_STEP_US; in lm3601x_register_leds()
336 setting->val = led->max_flash_timeout; in lm3601x_register_leds()
338 setting = &led->fled_cdev.brightness; in lm3601x_register_leds()
339 setting->min = LM3601X_MIN_STROBE_I_UA; in lm3601x_register_leds()
340 setting->max = led->flash_current_max; in lm3601x_register_leds()
341 setting->step = LM3601X_TORCH_REG_DIV; in lm3601x_register_leds()
342 setting->val = led->flash_current_max; in lm3601x_register_leds()
344 led_cdev = &led->fled_cdev.led_cdev; in lm3601x_register_leds()
345 led_cdev->name = led->led_name; in lm3601x_register_leds()
346 led_cdev->brightness_set_blocking = lm3601x_brightness_set; in lm3601x_register_leds()
347 led_cdev->max_brightness = DIV_ROUND_UP(led->torch_current_max, in lm3601x_register_leds()
349 led_cdev->flags |= LED_DEV_CAP_FLASH; in lm3601x_register_leds()
351 return led_classdev_flash_register(&led->client->dev, &led->fled_cdev); in lm3601x_register_leds()
354 static int lm3601x_parse_node(struct lm3601x_led *led) in lm3601x_parse_node() argument
357 int ret = -ENODEV; in lm3601x_parse_node()
360 child = device_get_next_child_node(&led->client->dev, child); in lm3601x_parse_node()
362 dev_err(&led->client->dev, "No LED Child node\n"); in lm3601x_parse_node()
366 ret = fwnode_property_read_u32(child, "reg", &led->led_mode); in lm3601x_parse_node()
368 dev_err(&led->client->dev, "reg DT property missing\n"); in lm3601x_parse_node()
372 if (led->led_mode > LM3601X_LED_TORCH || in lm3601x_parse_node()
373 led->led_mode < LM3601X_LED_IR) { in lm3601x_parse_node()
374 dev_warn(&led->client->dev, "Invalid led mode requested\n"); in lm3601x_parse_node()
375 ret = -EINVAL; in lm3601x_parse_node()
381 if (led->led_mode == LM3601X_LED_TORCH) in lm3601x_parse_node()
387 snprintf(led->led_name, sizeof(led->led_name), in lm3601x_parse_node()
388 "%s:%s", led->client->name, name); in lm3601x_parse_node()
390 ret = fwnode_property_read_u32(child, "led-max-microamp", in lm3601x_parse_node()
391 &led->torch_current_max); in lm3601x_parse_node()
393 dev_warn(&led->client->dev, in lm3601x_parse_node()
394 "led-max-microamp DT property missing\n"); in lm3601x_parse_node()
398 ret = fwnode_property_read_u32(child, "flash-max-microamp", in lm3601x_parse_node()
399 &led->flash_current_max); in lm3601x_parse_node()
401 dev_warn(&led->client->dev, in lm3601x_parse_node()
402 "flash-max-microamp DT property missing\n"); in lm3601x_parse_node()
406 ret = fwnode_property_read_u32(child, "flash-max-timeout-us", in lm3601x_parse_node()
407 &led->max_flash_timeout); in lm3601x_parse_node()
409 dev_warn(&led->client->dev, in lm3601x_parse_node()
410 "flash-max-timeout-us DT property missing\n"); in lm3601x_parse_node()
421 struct lm3601x_led *led; in lm3601x_probe() local
424 led = devm_kzalloc(&client->dev, sizeof(*led), GFP_KERNEL); in lm3601x_probe()
425 if (!led) in lm3601x_probe()
426 return -ENOMEM; in lm3601x_probe()
428 led->client = client; in lm3601x_probe()
429 i2c_set_clientdata(client, led); in lm3601x_probe()
431 ret = lm3601x_parse_node(led); in lm3601x_probe()
433 return -ENODEV; in lm3601x_probe()
435 led->regmap = devm_regmap_init_i2c(client, &lm3601x_regmap); in lm3601x_probe()
436 if (IS_ERR(led->regmap)) { in lm3601x_probe()
437 ret = PTR_ERR(led->regmap); in lm3601x_probe()
438 dev_err(&client->dev, in lm3601x_probe()
443 mutex_init(&led->lock); in lm3601x_probe()
445 return lm3601x_register_leds(led); in lm3601x_probe()
450 struct lm3601x_led *led = i2c_get_clientdata(client); in lm3601x_remove() local
452 led_classdev_flash_unregister(&led->fled_cdev); in lm3601x_remove()
453 mutex_destroy(&led->lock); in lm3601x_remove()
455 return regmap_update_bits(led->regmap, LM3601X_ENABLE_REG, in lm3601x_remove()