Lines Matching refs:led
73 struct led_state led[2];
108 static inline int bd2802_is_rgb_off(struct bd2802_led *led, enum led_ids id,
113 return !led->led[id].r;
115 return !led->led[id].g;
117 return !led->led[id].b;
119 dev_err(&led->client->dev, "%s: Invalid color\n", __func__);
124 static inline int bd2802_is_led_off(struct bd2802_led *led, enum led_ids id)
126 if (led->led[id].r || led->led[id].g || led->led[id].b)
132 static inline int bd2802_is_all_off(struct bd2802_led *led)
137 if (!bd2802_is_led_off(led, i))
171 static void bd2802_update_state(struct bd2802_led *led, enum led_ids id,
181 led->led[i].r = led_bit;
184 led->led[i].g = led_bit;
187 led->led[i].b = led_bit;
190 dev_err(&led->client->dev,
200 if (!bd2802_is_led_off(led, id))
203 if (bd2802_is_all_off(led) && !led->adf_on) {
204 gpiod_set_value(led->reset, 1);
209 * In this case, other led is turned on, and current led is turned
213 bd2802_write_byte(led->client, BD2802_REG_CONTROL, value);
216 static void bd2802_configure(struct bd2802_led *led)
218 struct bd2802_led_platform_data *pdata = led->pdata;
222 bd2802_write_byte(led->client, reg, pdata->rgb_time);
225 bd2802_write_byte(led->client, reg, pdata->rgb_time);
228 static void bd2802_reset_cancel(struct bd2802_led *led)
230 gpiod_set_value(led->reset, 0);
232 bd2802_configure(led);
235 static void bd2802_enable(struct bd2802_led *led, enum led_ids id)
240 other_led_on = !bd2802_is_led_off(led, other_led);
246 bd2802_write_byte(led->client, BD2802_REG_CONTROL, value);
249 static void bd2802_set_on(struct bd2802_led *led, enum led_ids id,
254 if (bd2802_is_all_off(led) && !led->adf_on)
255 bd2802_reset_cancel(led);
258 bd2802_write_byte(led->client, reg, led->rgb_current);
260 bd2802_write_byte(led->client, reg, BD2802_CURRENT_000);
262 bd2802_write_byte(led->client, reg, BD2802_PATTERN_FULL);
264 bd2802_enable(led, id);
265 bd2802_update_state(led, id, color, BD2802_ON);
268 static void bd2802_set_blink(struct bd2802_led *led, enum led_ids id,
273 if (bd2802_is_all_off(led) && !led->adf_on)
274 bd2802_reset_cancel(led);
277 bd2802_write_byte(led->client, reg, BD2802_CURRENT_000);
279 bd2802_write_byte(led->client, reg, led->rgb_current);
281 bd2802_write_byte(led->client, reg, led->wave_pattern);
283 bd2802_enable(led, id);
284 bd2802_update_state(led, id, color, BD2802_BLINK);
287 static void bd2802_turn_on(struct bd2802_led *led, enum led_ids id,
291 dev_err(&led->client->dev,
297 bd2802_set_blink(led, id, color);
299 bd2802_set_on(led, id, color);
302 static void bd2802_turn_off(struct bd2802_led *led, enum led_ids id,
307 if (bd2802_is_rgb_off(led, id, color))
311 bd2802_write_byte(led->client, reg, BD2802_CURRENT_000);
313 bd2802_write_byte(led->client, reg, BD2802_CURRENT_000);
315 bd2802_update_state(led, id, color, BD2802_OFF);
322 struct bd2802_led *led = i2c_get_clientdata(to_i2c_client(dev));\
330 down_write(&led->rwsem); \
331 bd2802_write_byte(led->client, reg_addr, (u8) val); \
332 up_write(&led->rwsem); \
388 static void bd2802_enable_adv_conf(struct bd2802_led *led)
393 ret = device_create_file(&led->client->dev,
396 dev_err(&led->client->dev, "failed: sysfs file %s\n",
402 if (bd2802_is_all_off(led))
403 bd2802_reset_cancel(led);
405 led->adf_on = 1;
411 device_remove_file(&led->client->dev,
415 static void bd2802_disable_adv_conf(struct bd2802_led *led)
420 device_remove_file(&led->client->dev,
423 if (bd2802_is_all_off(led))
424 gpiod_set_value(led->reset, 1);
426 led->adf_on = 0;
432 struct bd2802_led *led = i2c_get_clientdata(to_i2c_client(dev));
435 down_read(&led->rwsem);
436 if (led->adf_on)
440 up_read(&led->rwsem);
448 struct bd2802_led *led = i2c_get_clientdata(to_i2c_client(dev));
453 down_write(&led->rwsem);
454 if (!led->adf_on && !strncmp(buf, "on", 2))
455 bd2802_enable_adv_conf(led);
456 else if (led->adf_on && !strncmp(buf, "off", 3))
457 bd2802_disable_adv_conf(led);
458 up_write(&led->rwsem);
476 struct bd2802_led *led = i2c_get_clientdata(to_i2c_client(dev));\
478 down_read(&led->rwsem); \
479 ret = sprintf(buf, "0x%02x\n", led->attr_name); \
480 up_read(&led->rwsem); \
486 struct bd2802_led *led = i2c_get_clientdata(to_i2c_client(dev));\
494 down_write(&led->rwsem); \
495 led->attr_name = val; \
496 up_write(&led->rwsem); \
521 struct bd2802_led *led = \
523 led->led_id = id; \
524 led->color = clr; \
526 led->state = BD2802_OFF; \
527 bd2802_turn_off(led, led->led_id, led->color); \
529 led->state = BD2802_ON; \
530 bd2802_turn_on(led, led->led_id, led->color, BD2802_ON);\
537 struct bd2802_led *led = \
541 led->led_id = id; \
542 led->color = clr; \
543 led->state = BD2802_BLINK; \
544 bd2802_turn_on(led, led->led_id, led->color, BD2802_BLINK); \
555 static int bd2802_register_led_classdev(struct bd2802_led *led)
559 led->cdev_led1r.name = "led1_R";
560 led->cdev_led1r.brightness = LED_OFF;
561 led->cdev_led1r.brightness_set_blocking = bd2802_set_led1r_brightness;
562 led->cdev_led1r.blink_set = bd2802_set_led1r_blink;
564 ret = led_classdev_register(&led->client->dev, &led->cdev_led1r);
566 dev_err(&led->client->dev, "couldn't register LED %s\n",
567 led->cdev_led1r.name);
571 led->cdev_led1g.name = "led1_G";
572 led->cdev_led1g.brightness = LED_OFF;
573 led->cdev_led1g.brightness_set_blocking = bd2802_set_led1g_brightness;
574 led->cdev_led1g.blink_set = bd2802_set_led1g_blink;
576 ret = led_classdev_register(&led->client->dev, &led->cdev_led1g);
578 dev_err(&led->client->dev, "couldn't register LED %s\n",
579 led->cdev_led1g.name);
583 led->cdev_led1b.name = "led1_B";
584 led->cdev_led1b.brightness = LED_OFF;
585 led->cdev_led1b.brightness_set_blocking = bd2802_set_led1b_brightness;
586 led->cdev_led1b.blink_set = bd2802_set_led1b_blink;
588 ret = led_classdev_register(&led->client->dev, &led->cdev_led1b);
590 dev_err(&led->client->dev, "couldn't register LED %s\n",
591 led->cdev_led1b.name);
595 led->cdev_led2r.name = "led2_R";
596 led->cdev_led2r.brightness = LED_OFF;
597 led->cdev_led2r.brightness_set_blocking = bd2802_set_led2r_brightness;
598 led->cdev_led2r.blink_set = bd2802_set_led2r_blink;
600 ret = led_classdev_register(&led->client->dev, &led->cdev_led2r);
602 dev_err(&led->client->dev, "couldn't register LED %s\n",
603 led->cdev_led2r.name);
607 led->cdev_led2g.name = "led2_G";
608 led->cdev_led2g.brightness = LED_OFF;
609 led->cdev_led2g.brightness_set_blocking = bd2802_set_led2g_brightness;
610 led->cdev_led2g.blink_set = bd2802_set_led2g_blink;
612 ret = led_classdev_register(&led->client->dev, &led->cdev_led2g);
614 dev_err(&led->client->dev, "couldn't register LED %s\n",
615 led->cdev_led2g.name);
619 led->cdev_led2b.name = "led2_B";
620 led->cdev_led2b.brightness = LED_OFF;
621 led->cdev_led2b.brightness_set_blocking = bd2802_set_led2b_brightness;
622 led->cdev_led2b.blink_set = bd2802_set_led2b_blink;
623 led->cdev_led2b.flags |= LED_CORE_SUSPENDRESUME;
625 ret = led_classdev_register(&led->client->dev, &led->cdev_led2b);
627 dev_err(&led->client->dev, "couldn't register LED %s\n",
628 led->cdev_led2b.name);
635 led_classdev_unregister(&led->cdev_led2g);
637 led_classdev_unregister(&led->cdev_led2r);
639 led_classdev_unregister(&led->cdev_led1b);
641 led_classdev_unregister(&led->cdev_led1g);
643 led_classdev_unregister(&led->cdev_led1r);
649 static void bd2802_unregister_led_classdev(struct bd2802_led *led)
651 led_classdev_unregister(&led->cdev_led2b);
652 led_classdev_unregister(&led->cdev_led2g);
653 led_classdev_unregister(&led->cdev_led2r);
654 led_classdev_unregister(&led->cdev_led1b);
655 led_classdev_unregister(&led->cdev_led1g);
656 led_classdev_unregister(&led->cdev_led1r);
661 struct bd2802_led *led;
664 led = devm_kzalloc(&client->dev, sizeof(struct bd2802_led), GFP_KERNEL);
665 if (!led)
668 led->client = client;
669 i2c_set_clientdata(client, led);
678 led->reset = devm_gpiod_get(&client->dev, "reset", GPIOD_OUT_LOW);
679 if (IS_ERR(led->reset))
680 return PTR_ERR(led->reset);
694 gpiod_set_value(led->reset, 1);
697 led->wave_pattern = BD2802_PATTERN_HALF;
698 led->rgb_current = BD2802_CURRENT_032;
700 init_rwsem(&led->rwsem);
703 ret = device_create_file(&led->client->dev,
706 dev_err(&led->client->dev, "failed: sysfs file %s\n",
712 ret = bd2802_register_led_classdev(led);
720 device_remove_file(&led->client->dev, bd2802_attributes[i]);
726 struct bd2802_led *led = i2c_get_clientdata(client);
729 gpiod_set_value(led->reset, 1);
730 bd2802_unregister_led_classdev(led);
731 if (led->adf_on)
732 bd2802_disable_adv_conf(led);
734 device_remove_file(&led->client->dev, bd2802_attributes[i]);
738 static void bd2802_restore_state(struct bd2802_led *led)
743 if (led->led[i].r)
744 bd2802_turn_on(led, i, RED, led->led[i].r);
745 if (led->led[i].g)
746 bd2802_turn_on(led, i, GREEN, led->led[i].g);
747 if (led->led[i].b)
748 bd2802_turn_on(led, i, BLUE, led->led[i].b);
755 struct bd2802_led *led = i2c_get_clientdata(client);
757 gpiod_set_value(led->reset, 1);
765 struct bd2802_led *led = i2c_get_clientdata(client);
767 if (!bd2802_is_all_off(led) || led->adf_on) {
768 bd2802_reset_cancel(led);
769 bd2802_restore_state(led);