Lines Matching +full:led +full:- +full:pattern
2 * leds-lm3533.c -- LM3533 LED driver
4 * Copyright (C) 2011-2012 Texas Instruments
63 static inline int lm3533_led_get_ctrlbank_id(struct lm3533_led *led) in lm3533_led_get_ctrlbank_id() argument
65 return led->id + 2; in lm3533_led_get_ctrlbank_id()
68 static inline u8 lm3533_led_get_lv_reg(struct lm3533_led *led, u8 base) in lm3533_led_get_lv_reg() argument
70 return base + led->id; in lm3533_led_get_lv_reg()
73 static inline u8 lm3533_led_get_pattern(struct lm3533_led *led) in lm3533_led_get_pattern() argument
75 return led->id; in lm3533_led_get_pattern()
78 static inline u8 lm3533_led_get_pattern_reg(struct lm3533_led *led, in lm3533_led_get_pattern_reg() argument
81 return base + lm3533_led_get_pattern(led) * LM3533_REG_PATTERN_STEP; in lm3533_led_get_pattern_reg()
84 static int lm3533_led_pattern_enable(struct lm3533_led *led, int enable) in lm3533_led_pattern_enable() argument
88 int pattern; in lm3533_led_pattern_enable() local
92 dev_dbg(led->cdev.dev, "%s - %d\n", __func__, enable); in lm3533_led_pattern_enable()
94 mutex_lock(&led->mutex); in lm3533_led_pattern_enable()
96 state = test_bit(LM3533_LED_FLAG_PATTERN_ENABLE, &led->flags); in lm3533_led_pattern_enable()
100 pattern = lm3533_led_get_pattern(led); in lm3533_led_pattern_enable()
101 mask = 1 << (2 * pattern); in lm3533_led_pattern_enable()
108 ret = lm3533_update(led->lm3533, LM3533_REG_PATTERN_ENABLE, val, mask); in lm3533_led_pattern_enable()
110 dev_err(led->cdev.dev, "failed to enable pattern %d (%d)\n", in lm3533_led_pattern_enable()
111 pattern, enable); in lm3533_led_pattern_enable()
115 __change_bit(LM3533_LED_FLAG_PATTERN_ENABLE, &led->flags); in lm3533_led_pattern_enable()
117 mutex_unlock(&led->mutex); in lm3533_led_pattern_enable()
125 struct lm3533_led *led = to_lm3533_led(cdev); in lm3533_led_set() local
127 dev_dbg(led->cdev.dev, "%s - %d\n", __func__, value); in lm3533_led_set()
130 lm3533_led_pattern_enable(led, 0); /* disable blink */ in lm3533_led_set()
132 return lm3533_ctrlbank_set_brightness(&led->cb, value); in lm3533_led_set()
137 struct lm3533_led *led = to_lm3533_led(cdev); in lm3533_led_get() local
141 ret = lm3533_ctrlbank_get_brightness(&led->cb, &val); in lm3533_led_get()
145 dev_dbg(led->cdev.dev, "%s - %u\n", __func__, val); in lm3533_led_get()
150 /* Pattern generator defines (delays in us). */
155 #define LM3533_LED_DELAY1_VMAX (LM3533_LED_DELAY2_VMIN - 1)
156 #define LM3533_LED_DELAY2_VMAX (LM3533_LED_DELAY3_VMIN - 1)
167 /* t_step = (t_max - t_min) / (v_max - v_min) */
182 * t_step = (t_max - t_min) / (v_max - v_min)
191 val = (*t + t_step / 2 - t_min) / t_step + v_min; in time_to_val()
193 *t = t_step * (val - v_min) + t_min; in time_to_val()
203 * the following ranges and step-sizes:
247 static u8 lm3533_led_delay_set(struct lm3533_led *led, u8 base, in lm3533_led_delay_set() argument
263 dev_dbg(led->cdev.dev, "%s - %lu: %u (0x%02x)\n", __func__, in lm3533_led_delay_set()
265 reg = lm3533_led_get_pattern_reg(led, base); in lm3533_led_delay_set()
266 ret = lm3533_write(led->lm3533, reg, val); in lm3533_led_delay_set()
268 dev_err(led->cdev.dev, "failed to set delay (%02x)\n", reg); in lm3533_led_delay_set()
275 static int lm3533_led_delay_on_set(struct lm3533_led *led, unsigned long *t) in lm3533_led_delay_on_set() argument
277 return lm3533_led_delay_set(led, LM3533_REG_PATTERN_HIGH_TIME_BASE, t); in lm3533_led_delay_on_set()
280 static int lm3533_led_delay_off_set(struct lm3533_led *led, unsigned long *t) in lm3533_led_delay_off_set() argument
282 return lm3533_led_delay_set(led, LM3533_REG_PATTERN_LOW_TIME_BASE, t); in lm3533_led_delay_off_set()
289 struct lm3533_led *led = to_lm3533_led(cdev); in lm3533_led_blink_set() local
292 dev_dbg(led->cdev.dev, "%s - on = %lu, off = %lu\n", __func__, in lm3533_led_blink_set()
297 return -EINVAL; in lm3533_led_blink_set()
304 ret = lm3533_led_delay_on_set(led, delay_on); in lm3533_led_blink_set()
308 ret = lm3533_led_delay_off_set(led, delay_off); in lm3533_led_blink_set()
312 return lm3533_led_pattern_enable(led, 1); in lm3533_led_blink_set()
319 struct lm3533_led *led = to_lm3533_led(led_cdev); in show_id() local
321 return scnprintf(buf, PAGE_SIZE, "%d\n", led->id); in show_id()
325 * Pattern generator rise/fall times:
327 * 0 - 2048 us (default)
328 * 1 - 262 ms
329 * 2 - 524 ms
330 * 3 - 1.049 s
331 * 4 - 2.097 s
332 * 5 - 4.194 s
333 * 6 - 8.389 s
334 * 7 - 16.78 s
341 struct lm3533_led *led = to_lm3533_led(led_cdev); in show_risefalltime() local
346 reg = lm3533_led_get_pattern_reg(led, base); in show_risefalltime()
347 ret = lm3533_read(led->lm3533, reg, &val); in show_risefalltime()
373 struct lm3533_led *led = to_lm3533_led(led_cdev); in store_risefalltime() local
379 return -EINVAL; in store_risefalltime()
381 reg = lm3533_led_get_pattern_reg(led, base); in store_risefalltime()
382 ret = lm3533_write(led->lm3533, reg, val); in store_risefalltime()
409 struct lm3533_led *led = to_lm3533_led(led_cdev); in show_als_channel() local
415 reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE); in show_als_channel()
416 ret = lm3533_read(led->lm3533, reg, &val); in show_als_channel()
430 struct lm3533_led *led = to_lm3533_led(led_cdev); in store_als_channel() local
438 return -EINVAL; in store_als_channel()
442 return -EINVAL; in store_als_channel()
444 reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE); in store_als_channel()
446 val = channel - 1; in store_als_channel()
448 ret = lm3533_update(led->lm3533, reg, val, mask); in store_als_channel()
459 struct lm3533_led *led = to_lm3533_led(led_cdev); in show_als_en() local
465 reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE); in show_als_en()
466 ret = lm3533_read(led->lm3533, reg, &val); in show_als_en()
480 struct lm3533_led *led = to_lm3533_led(led_cdev); in store_als_en() local
488 return -EINVAL; in store_als_en()
490 reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE); in store_als_en()
498 ret = lm3533_update(led->lm3533, reg, val, mask); in store_als_en()
509 struct lm3533_led *led = to_lm3533_led(led_cdev); in show_linear() local
515 reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE); in show_linear()
516 ret = lm3533_read(led->lm3533, reg, &val); in show_linear()
533 struct lm3533_led *led = to_lm3533_led(led_cdev); in store_linear() local
541 return -EINVAL; in store_linear()
543 reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE); in store_linear()
551 ret = lm3533_update(led->lm3533, reg, val, mask); in store_linear()
563 struct lm3533_led *led = to_lm3533_led(led_cdev); in show_pwm() local
567 ret = lm3533_ctrlbank_get_pwm(&led->cb, &val); in show_pwm()
579 struct lm3533_led *led = to_lm3533_led(led_cdev); in store_pwm() local
584 return -EINVAL; in store_pwm()
586 ret = lm3533_ctrlbank_set_pwm(&led->cb, val); in store_pwm()
617 struct lm3533_led *led = to_lm3533_led(led_cdev); in lm3533_led_attr_is_visible() local
618 umode_t mode = attr->mode; in lm3533_led_attr_is_visible()
622 if (!led->lm3533->have_als) in lm3533_led_attr_is_visible()
639 static int lm3533_led_setup(struct lm3533_led *led, in lm3533_led_setup() argument
644 ret = lm3533_ctrlbank_set_max_current(&led->cb, pdata->max_current); in lm3533_led_setup()
648 return lm3533_ctrlbank_set_pwm(&led->cb, pdata->pwm); in lm3533_led_setup()
655 struct lm3533_led *led; in lm3533_led_probe() local
658 dev_dbg(&pdev->dev, "%s\n", __func__); in lm3533_led_probe()
660 lm3533 = dev_get_drvdata(pdev->dev.parent); in lm3533_led_probe()
662 return -EINVAL; in lm3533_led_probe()
664 pdata = dev_get_platdata(&pdev->dev); in lm3533_led_probe()
666 dev_err(&pdev->dev, "no platform data\n"); in lm3533_led_probe()
667 return -EINVAL; in lm3533_led_probe()
670 if (pdev->id < 0 || pdev->id >= LM3533_LVCTRLBANK_COUNT) { in lm3533_led_probe()
671 dev_err(&pdev->dev, "illegal LED id %d\n", pdev->id); in lm3533_led_probe()
672 return -EINVAL; in lm3533_led_probe()
675 led = devm_kzalloc(&pdev->dev, sizeof(*led), GFP_KERNEL); in lm3533_led_probe()
676 if (!led) in lm3533_led_probe()
677 return -ENOMEM; in lm3533_led_probe()
679 led->lm3533 = lm3533; in lm3533_led_probe()
680 led->cdev.name = pdata->name; in lm3533_led_probe()
681 led->cdev.default_trigger = pdata->default_trigger; in lm3533_led_probe()
682 led->cdev.brightness_set_blocking = lm3533_led_set; in lm3533_led_probe()
683 led->cdev.brightness_get = lm3533_led_get; in lm3533_led_probe()
684 led->cdev.blink_set = lm3533_led_blink_set; in lm3533_led_probe()
685 led->cdev.brightness = LED_OFF; in lm3533_led_probe()
686 led->cdev.groups = lm3533_led_attribute_groups, in lm3533_led_probe()
687 led->id = pdev->id; in lm3533_led_probe()
689 mutex_init(&led->mutex); in lm3533_led_probe()
695 led->cb.lm3533 = lm3533; in lm3533_led_probe()
696 led->cb.id = lm3533_led_get_ctrlbank_id(led); in lm3533_led_probe()
697 led->cb.dev = lm3533->dev; in lm3533_led_probe()
699 platform_set_drvdata(pdev, led); in lm3533_led_probe()
701 ret = led_classdev_register(pdev->dev.parent, &led->cdev); in lm3533_led_probe()
703 dev_err(&pdev->dev, "failed to register LED %d\n", pdev->id); in lm3533_led_probe()
707 led->cb.dev = led->cdev.dev; in lm3533_led_probe()
709 ret = lm3533_led_setup(led, pdata); in lm3533_led_probe()
713 ret = lm3533_ctrlbank_enable(&led->cb); in lm3533_led_probe()
720 led_classdev_unregister(&led->cdev); in lm3533_led_probe()
727 struct lm3533_led *led = platform_get_drvdata(pdev); in lm3533_led_remove() local
729 dev_dbg(&pdev->dev, "%s\n", __func__); in lm3533_led_remove()
731 lm3533_ctrlbank_disable(&led->cb); in lm3533_led_remove()
732 led_classdev_unregister(&led->cdev); in lm3533_led_remove()
740 struct lm3533_led *led = platform_get_drvdata(pdev); in lm3533_led_shutdown() local
742 dev_dbg(&pdev->dev, "%s\n", __func__); in lm3533_led_shutdown()
744 lm3533_ctrlbank_disable(&led->cb); in lm3533_led_shutdown()
745 lm3533_led_set(&led->cdev, LED_OFF); /* disable blink */ in lm3533_led_shutdown()
750 .name = "lm3533-leds",
759 MODULE_DESCRIPTION("LM3533 LED driver");
761 MODULE_ALIAS("platform:lm3533-leds");