• Home
  • Raw
  • Download

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

2  * LED driver : leds-ktd2692.c
15 #include <linux/led-class-flash.h>
67 /* maximum LED current in movie mode */
69 /* maximum LED current in flash mode */
73 /* max LED brightness level */
78 /* Related LED Flash class device */
98 static void ktd2692_expresswire_start(struct ktd2692_context *led) in ktd2692_expresswire_start() argument
100 gpiod_direction_output(led->ctrl_gpio, KTD2692_HIGH); in ktd2692_expresswire_start()
104 static void ktd2692_expresswire_reset(struct ktd2692_context *led) in ktd2692_expresswire_reset() argument
106 gpiod_direction_output(led->ctrl_gpio, KTD2692_LOW); in ktd2692_expresswire_reset()
110 static void ktd2692_expresswire_end(struct ktd2692_context *led) in ktd2692_expresswire_end() argument
112 gpiod_direction_output(led->ctrl_gpio, KTD2692_LOW); in ktd2692_expresswire_end()
114 gpiod_direction_output(led->ctrl_gpio, KTD2692_HIGH); in ktd2692_expresswire_end()
118 static void ktd2692_expresswire_set_bit(struct ktd2692_context *led, bool bit) in ktd2692_expresswire_set_bit() argument
137 gpiod_direction_output(led->ctrl_gpio, KTD2692_LOW); in ktd2692_expresswire_set_bit()
139 gpiod_direction_output(led->ctrl_gpio, KTD2692_HIGH); in ktd2692_expresswire_set_bit()
142 gpiod_direction_output(led->ctrl_gpio, KTD2692_LOW); in ktd2692_expresswire_set_bit()
144 gpiod_direction_output(led->ctrl_gpio, KTD2692_HIGH); in ktd2692_expresswire_set_bit()
149 static void ktd2692_expresswire_write(struct ktd2692_context *led, u8 value) in ktd2692_expresswire_write() argument
153 ktd2692_expresswire_start(led); in ktd2692_expresswire_write()
154 for (i = 7; i >= 0; i--) in ktd2692_expresswire_write()
155 ktd2692_expresswire_set_bit(led, value & BIT(i)); in ktd2692_expresswire_write()
156 ktd2692_expresswire_end(led); in ktd2692_expresswire_write()
163 struct ktd2692_context *led = fled_cdev_to_led(fled_cdev); in ktd2692_led_brightness_set() local
165 mutex_lock(&led->lock); in ktd2692_led_brightness_set()
168 led->mode = KTD2692_MODE_DISABLE; in ktd2692_led_brightness_set()
169 gpiod_direction_output(led->aux_gpio, KTD2692_LOW); in ktd2692_led_brightness_set()
171 ktd2692_expresswire_write(led, brightness | in ktd2692_led_brightness_set()
173 led->mode = KTD2692_MODE_MOVIE; in ktd2692_led_brightness_set()
176 ktd2692_expresswire_write(led, led->mode | KTD2692_REG_MODE_BASE); in ktd2692_led_brightness_set()
177 mutex_unlock(&led->lock); in ktd2692_led_brightness_set()
185 struct ktd2692_context *led = fled_cdev_to_led(fled_cdev); in ktd2692_led_flash_strobe_set() local
186 struct led_flash_setting *timeout = &fled_cdev->timeout; in ktd2692_led_flash_strobe_set()
189 mutex_lock(&led->lock); in ktd2692_led_flash_strobe_set()
192 flash_tm_reg = GET_TIMEOUT_OFFSET(timeout->val, timeout->step); in ktd2692_led_flash_strobe_set()
193 ktd2692_expresswire_write(led, flash_tm_reg in ktd2692_led_flash_strobe_set()
196 led->mode = KTD2692_MODE_FLASH; in ktd2692_led_flash_strobe_set()
197 gpiod_direction_output(led->aux_gpio, KTD2692_HIGH); in ktd2692_led_flash_strobe_set()
199 led->mode = KTD2692_MODE_DISABLE; in ktd2692_led_flash_strobe_set()
200 gpiod_direction_output(led->aux_gpio, KTD2692_LOW); in ktd2692_led_flash_strobe_set()
203 ktd2692_expresswire_write(led, led->mode | KTD2692_REG_MODE_BASE); in ktd2692_led_flash_strobe_set()
205 fled_cdev->led_cdev.brightness = LED_OFF; in ktd2692_led_flash_strobe_set()
206 led->mode = KTD2692_MODE_DISABLE; in ktd2692_led_flash_strobe_set()
208 mutex_unlock(&led->lock); in ktd2692_led_flash_strobe_set()
225 step = KTD2692_MM_TO_FL_RATIO(cfg->flash_max_microamp) in ktd2692_init_movie_current_max()
230 offset--; in ktd2692_init_movie_current_max()
231 } while ((movie_current_microamp > cfg->movie_max_microamp) && in ktd2692_init_movie_current_max()
234 cfg->max_brightness = offset; in ktd2692_init_movie_current_max()
242 setting = &fled_cdev->timeout; in ktd2692_init_flash_timeout()
243 setting->min = KTD2692_FLASH_MODE_TIMEOUT_DISABLE; in ktd2692_init_flash_timeout()
244 setting->max = cfg->flash_max_timeout; in ktd2692_init_flash_timeout()
245 setting->step = cfg->flash_max_timeout in ktd2692_init_flash_timeout()
246 / (KTD2692_FLASH_MODE_TIMEOUT_LEVELS - 1); in ktd2692_init_flash_timeout()
247 setting->val = cfg->flash_max_timeout; in ktd2692_init_flash_timeout()
250 static void ktd2692_setup(struct ktd2692_context *led) in ktd2692_setup() argument
252 led->mode = KTD2692_MODE_DISABLE; in ktd2692_setup()
253 ktd2692_expresswire_reset(led); in ktd2692_setup()
254 gpiod_direction_output(led->aux_gpio, KTD2692_LOW); in ktd2692_setup()
256 ktd2692_expresswire_write(led, (KTD2962_MM_MIN_CURR_THRESHOLD_SCALE - 1) in ktd2692_setup()
258 ktd2692_expresswire_write(led, KTD2692_FLASH_MODE_CURR_PERCENT(45) in ktd2692_setup()
262 static int ktd2692_parse_dt(struct ktd2692_context *led, struct device *dev, in ktd2692_parse_dt() argument
265 struct device_node *np = dev->of_node; in ktd2692_parse_dt()
269 if (!dev->of_node) in ktd2692_parse_dt()
270 return -ENXIO; in ktd2692_parse_dt()
272 led->ctrl_gpio = devm_gpiod_get(dev, "ctrl", GPIOD_ASIS); in ktd2692_parse_dt()
273 ret = PTR_ERR_OR_ZERO(led->ctrl_gpio); in ktd2692_parse_dt()
275 dev_err(dev, "cannot get ctrl-gpios %d\n", ret); in ktd2692_parse_dt()
279 led->aux_gpio = devm_gpiod_get(dev, "aux", GPIOD_ASIS); in ktd2692_parse_dt()
280 ret = PTR_ERR_OR_ZERO(led->aux_gpio); in ktd2692_parse_dt()
282 dev_err(dev, "cannot get aux-gpios %d\n", ret); in ktd2692_parse_dt()
286 led->regulator = devm_regulator_get(dev, "vin"); in ktd2692_parse_dt()
287 if (IS_ERR(led->regulator)) in ktd2692_parse_dt()
288 led->regulator = NULL; in ktd2692_parse_dt()
290 if (led->regulator) { in ktd2692_parse_dt()
291 ret = regulator_enable(led->regulator); in ktd2692_parse_dt()
298 dev_err(dev, "No DT child node found for connected LED.\n"); in ktd2692_parse_dt()
299 return -EINVAL; in ktd2692_parse_dt()
302 led->fled_cdev.led_cdev.name = in ktd2692_parse_dt()
303 of_get_property(child_node, "label", NULL) ? : child_node->name; in ktd2692_parse_dt()
305 ret = of_property_read_u32(child_node, "led-max-microamp", in ktd2692_parse_dt()
306 &cfg->movie_max_microamp); in ktd2692_parse_dt()
308 dev_err(dev, "failed to parse led-max-microamp\n"); in ktd2692_parse_dt()
312 ret = of_property_read_u32(child_node, "flash-max-microamp", in ktd2692_parse_dt()
313 &cfg->flash_max_microamp); in ktd2692_parse_dt()
315 dev_err(dev, "failed to parse flash-max-microamp\n"); in ktd2692_parse_dt()
319 ret = of_property_read_u32(child_node, "flash-max-timeout-us", in ktd2692_parse_dt()
320 &cfg->flash_max_timeout); in ktd2692_parse_dt()
322 dev_err(dev, "failed to parse flash-max-timeout-us\n"); in ktd2692_parse_dt()
338 struct ktd2692_context *led; in ktd2692_probe() local
344 led = devm_kzalloc(&pdev->dev, sizeof(*led), GFP_KERNEL); in ktd2692_probe()
345 if (!led) in ktd2692_probe()
346 return -ENOMEM; in ktd2692_probe()
348 fled_cdev = &led->fled_cdev; in ktd2692_probe()
349 led_cdev = &fled_cdev->led_cdev; in ktd2692_probe()
351 ret = ktd2692_parse_dt(led, &pdev->dev, &led_cfg); in ktd2692_probe()
358 fled_cdev->ops = &flash_ops; in ktd2692_probe()
360 led_cdev->max_brightness = led_cfg.max_brightness; in ktd2692_probe()
361 led_cdev->brightness_set_blocking = ktd2692_led_brightness_set; in ktd2692_probe()
362 led_cdev->flags |= LED_CORE_SUSPENDRESUME | LED_DEV_CAP_FLASH; in ktd2692_probe()
364 mutex_init(&led->lock); in ktd2692_probe()
366 platform_set_drvdata(pdev, led); in ktd2692_probe()
368 ret = led_classdev_flash_register(&pdev->dev, fled_cdev); in ktd2692_probe()
370 dev_err(&pdev->dev, "can't register LED %s\n", led_cdev->name); in ktd2692_probe()
371 mutex_destroy(&led->lock); in ktd2692_probe()
375 ktd2692_setup(led); in ktd2692_probe()
382 struct ktd2692_context *led = platform_get_drvdata(pdev); in ktd2692_remove() local
385 led_classdev_flash_unregister(&led->fled_cdev); in ktd2692_remove()
387 if (led->regulator) { in ktd2692_remove()
388 ret = regulator_disable(led->regulator); in ktd2692_remove()
390 dev_err(&pdev->dev, in ktd2692_remove()
394 mutex_destroy(&led->lock); in ktd2692_remove()
417 MODULE_DESCRIPTION("Kinetic KTD2692 LED driver");