1 // SPDX-License-Identifier: GPL-2.0
3 * Greybus Lights protocol driver.
5 * Copyright 2015 Google Inc.
6 * Copyright 2015 Linaro Ltd.
9 #include <linux/kernel.h>
10 #include <linux/leds.h>
11 #include <linux/led-class-flash.h>
12 #include <linux/module.h>
13 #include <linux/slab.h>
14 #include <linux/greybus.h>
15 #include <media/v4l2-flash-led-class.h>
28 struct attribute **attrs;
29 struct attribute_group *attr_group;
30 const struct attribute_group **attr_groups;
31 struct led_classdev *led;
32 #if IS_REACHABLE(CONFIG_LEDS_CLASS_FLASH)
33 struct led_classdev_flash fled;
34 struct led_flash_setting intensity_uA;
35 struct led_flash_setting timeout_us;
37 struct led_classdev cled;
39 struct gb_light *light;
50 struct gb_lights *glights;
53 struct gb_channel *channels;
56 #if IS_REACHABLE(CONFIG_V4L2_FLASH_LED_CLASS)
57 struct v4l2_flash *v4l2_flash;
58 struct v4l2_flash *v4l2_flash_ind;
63 struct gb_connection *connection;
65 struct gb_light *lights;
66 struct mutex lights_lock;
69 static void gb_lights_channel_free(struct gb_channel *channel);
71 static struct gb_connection *get_conn_from_channel(struct gb_channel *channel)
73 return channel->light->glights->connection;
76 static struct gb_connection *get_conn_from_light(struct gb_light *light)
78 return light->glights->connection;
81 static bool is_channel_flash(struct gb_channel *channel)
83 return !!(channel->mode & (GB_CHANNEL_MODE_FLASH | GB_CHANNEL_MODE_TORCH
84 | GB_CHANNEL_MODE_INDICATOR));
87 #if IS_REACHABLE(CONFIG_LEDS_CLASS_FLASH)
88 static struct gb_channel *get_channel_from_cdev(struct led_classdev *cdev)
90 struct led_classdev_flash *fled_cdev = lcdev_to_flcdev(cdev);
92 return container_of(fled_cdev, struct gb_channel, fled);
95 static struct led_classdev *get_channel_cdev(struct gb_channel *channel)
97 return &channel->fled.led_cdev;
100 static struct gb_channel *get_channel_from_mode(struct gb_light *light,
103 struct gb_channel *channel;
106 for (i = 0; i < light->channels_count; i++) {
107 channel = &light->channels[i];
108 if (channel->mode == mode)
114 static int __gb_lights_flash_intensity_set(struct gb_channel *channel,
117 struct gb_connection *connection = get_conn_from_channel(channel);
118 struct gb_bundle *bundle = connection->bundle;
119 struct gb_lights_set_flash_intensity_request req;
122 if (channel->releasing)
125 ret = gb_pm_runtime_get_sync(bundle);
129 req.light_id = channel->light->id;
130 req.channel_id = channel->id;
131 req.intensity_uA = cpu_to_le32(intensity);
133 ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_FLASH_INTENSITY,
134 &req, sizeof(req), NULL, 0);
136 gb_pm_runtime_put_autosuspend(bundle);
141 static int __gb_lights_flash_brightness_set(struct gb_channel *channel)
145 /* If the channel is flash we need to get the attached torch channel */
146 if (channel->mode & GB_CHANNEL_MODE_FLASH)
147 channel = get_channel_from_mode(channel->light,
148 GB_CHANNEL_MODE_TORCH);
153 /* For not flash we need to convert brightness to intensity */
154 intensity = channel->intensity_uA.min +
155 (channel->intensity_uA.step * channel->led->brightness);
157 return __gb_lights_flash_intensity_set(channel, intensity);
160 static struct gb_channel *get_channel_from_cdev(struct led_classdev *cdev)
162 return container_of(cdev, struct gb_channel, cled);
165 static struct led_classdev *get_channel_cdev(struct gb_channel *channel)
167 return &channel->cled;
170 static int __gb_lights_flash_brightness_set(struct gb_channel *channel)
176 static int gb_lights_color_set(struct gb_channel *channel, u32 color);
177 static int gb_lights_fade_set(struct gb_channel *channel);
179 static void led_lock(struct led_classdev *cdev)
181 mutex_lock(&cdev->led_access);
184 static void led_unlock(struct led_classdev *cdev)
186 mutex_unlock(&cdev->led_access);
189 #define gb_lights_fade_attr(__dir) \
190 static ssize_t fade_##__dir##_show(struct device *dev, \
191 struct device_attribute *attr, \
194 struct led_classdev *cdev = dev_get_drvdata(dev); \
195 struct gb_channel *channel = get_channel_from_cdev(cdev); \
197 return sprintf(buf, "%u\n", channel->fade_##__dir); \
200 static ssize_t fade_##__dir##_store(struct device *dev, \
201 struct device_attribute *attr, \
202 const char *buf, size_t size) \
204 struct led_classdev *cdev = dev_get_drvdata(dev); \
205 struct gb_channel *channel = get_channel_from_cdev(cdev); \
210 if (led_sysfs_is_disabled(cdev)) { \
215 ret = kstrtou8(buf, 0, &fade); \
217 dev_err(dev, "could not parse fade value %d\n", ret); \
220 if (channel->fade_##__dir == fade) \
222 channel->fade_##__dir = fade; \
224 ret = gb_lights_fade_set(channel); \
233 static DEVICE_ATTR_RW(fade_##__dir)
235 gb_lights_fade_attr(in);
236 gb_lights_fade_attr(out);
238 static ssize_t color_show(struct device *dev, struct device_attribute *attr,
241 struct led_classdev *cdev = dev_get_drvdata(dev);
242 struct gb_channel *channel = get_channel_from_cdev(cdev);
244 return sprintf(buf, "0x%08x\n", channel->color);
247 static ssize_t color_store(struct device *dev, struct device_attribute *attr,
248 const char *buf, size_t size)
250 struct led_classdev *cdev = dev_get_drvdata(dev);
251 struct gb_channel *channel = get_channel_from_cdev(cdev);
256 if (led_sysfs_is_disabled(cdev)) {
260 ret = kstrtou32(buf, 0, &color);
262 dev_err(dev, "could not parse color value %d\n", ret);
266 ret = gb_lights_color_set(channel, color);
270 channel->color = color;
276 static DEVICE_ATTR_RW(color);
278 static int channel_attr_groups_set(struct gb_channel *channel,
279 struct led_classdev *cdev)
284 if (channel->flags & GB_LIGHT_CHANNEL_MULTICOLOR)
286 if (channel->flags & GB_LIGHT_CHANNEL_FADER)
292 /* Set attributes based in the channel flags */
293 channel->attrs = kcalloc(size + 1, sizeof(*channel->attrs), GFP_KERNEL);
296 channel->attr_group = kcalloc(1, sizeof(*channel->attr_group),
298 if (!channel->attr_group)
300 channel->attr_groups = kcalloc(2, sizeof(*channel->attr_groups),
302 if (!channel->attr_groups)
305 if (channel->flags & GB_LIGHT_CHANNEL_MULTICOLOR)
306 channel->attrs[attr++] = &dev_attr_color.attr;
307 if (channel->flags & GB_LIGHT_CHANNEL_FADER) {
308 channel->attrs[attr++] = &dev_attr_fade_in.attr;
309 channel->attrs[attr++] = &dev_attr_fade_out.attr;
312 channel->attr_group->attrs = channel->attrs;
314 channel->attr_groups[0] = channel->attr_group;
316 cdev->groups = channel->attr_groups;
321 static int gb_lights_fade_set(struct gb_channel *channel)
323 struct gb_connection *connection = get_conn_from_channel(channel);
324 struct gb_bundle *bundle = connection->bundle;
325 struct gb_lights_set_fade_request req;
328 if (channel->releasing)
331 ret = gb_pm_runtime_get_sync(bundle);
335 req.light_id = channel->light->id;
336 req.channel_id = channel->id;
337 req.fade_in = channel->fade_in;
338 req.fade_out = channel->fade_out;
339 ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_FADE,
340 &req, sizeof(req), NULL, 0);
342 gb_pm_runtime_put_autosuspend(bundle);
347 static int gb_lights_color_set(struct gb_channel *channel, u32 color)
349 struct gb_connection *connection = get_conn_from_channel(channel);
350 struct gb_bundle *bundle = connection->bundle;
351 struct gb_lights_set_color_request req;
354 if (channel->releasing)
357 ret = gb_pm_runtime_get_sync(bundle);
361 req.light_id = channel->light->id;
362 req.channel_id = channel->id;
363 req.color = cpu_to_le32(color);
364 ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_COLOR,
365 &req, sizeof(req), NULL, 0);
367 gb_pm_runtime_put_autosuspend(bundle);
372 static int __gb_lights_led_brightness_set(struct gb_channel *channel)
374 struct gb_lights_set_brightness_request req;
375 struct gb_connection *connection = get_conn_from_channel(channel);
376 struct gb_bundle *bundle = connection->bundle;
380 mutex_lock(&channel->lock);
381 ret = gb_pm_runtime_get_sync(bundle);
385 old_active = channel->active;
387 req.light_id = channel->light->id;
388 req.channel_id = channel->id;
389 req.brightness = (u8)channel->led->brightness;
391 ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_BRIGHTNESS,
392 &req, sizeof(req), NULL, 0);
396 if (channel->led->brightness)
397 channel->active = true;
399 channel->active = false;
401 /* we need to keep module alive when turning to active state */
402 if (!old_active && channel->active)
406 * on the other hand if going to inactive we still hold a reference and
407 * need to put it, so we could go to suspend.
409 if (old_active && !channel->active)
410 gb_pm_runtime_put_autosuspend(bundle);
413 gb_pm_runtime_put_autosuspend(bundle);
415 mutex_unlock(&channel->lock);
420 static int __gb_lights_brightness_set(struct gb_channel *channel)
424 if (channel->releasing)
427 if (is_channel_flash(channel))
428 ret = __gb_lights_flash_brightness_set(channel);
430 ret = __gb_lights_led_brightness_set(channel);
435 static int gb_brightness_set(struct led_classdev *cdev,
436 enum led_brightness value)
438 struct gb_channel *channel = get_channel_from_cdev(cdev);
440 channel->led->brightness = value;
442 return __gb_lights_brightness_set(channel);
445 static enum led_brightness gb_brightness_get(struct led_classdev *cdev)
448 struct gb_channel *channel = get_channel_from_cdev(cdev);
450 return channel->led->brightness;
453 static int gb_blink_set(struct led_classdev *cdev, unsigned long *delay_on,
454 unsigned long *delay_off)
456 struct gb_channel *channel = get_channel_from_cdev(cdev);
457 struct gb_connection *connection = get_conn_from_channel(channel);
458 struct gb_bundle *bundle = connection->bundle;
459 struct gb_lights_blink_request req;
463 if (channel->releasing)
466 if (!delay_on || !delay_off)
469 mutex_lock(&channel->lock);
470 ret = gb_pm_runtime_get_sync(bundle);
474 old_active = channel->active;
476 req.light_id = channel->light->id;
477 req.channel_id = channel->id;
478 req.time_on_ms = cpu_to_le16(*delay_on);
479 req.time_off_ms = cpu_to_le16(*delay_off);
481 ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_BLINK, &req,
482 sizeof(req), NULL, 0);
487 channel->active = true;
489 channel->active = false;
491 /* we need to keep module alive when turning to active state */
492 if (!old_active && channel->active)
496 * on the other hand if going to inactive we still hold a reference and
497 * need to put it, so we could go to suspend.
499 if (old_active && !channel->active)
500 gb_pm_runtime_put_autosuspend(bundle);
503 gb_pm_runtime_put_autosuspend(bundle);
505 mutex_unlock(&channel->lock);
510 static void gb_lights_led_operations_set(struct gb_channel *channel,
511 struct led_classdev *cdev)
513 cdev->brightness_get = gb_brightness_get;
514 cdev->brightness_set_blocking = gb_brightness_set;
516 if (channel->flags & GB_LIGHT_CHANNEL_BLINK)
517 cdev->blink_set = gb_blink_set;
520 #if IS_REACHABLE(CONFIG_V4L2_FLASH_LED_CLASS)
521 /* V4L2 specific helpers */
522 static const struct v4l2_flash_ops v4l2_flash_ops;
524 static void __gb_lights_channel_v4l2_config(struct led_flash_setting *channel_s,
525 struct led_flash_setting *v4l2_s)
527 v4l2_s->min = channel_s->min;
528 v4l2_s->max = channel_s->max;
529 v4l2_s->step = channel_s->step;
530 /* For v4l2 val is the default value */
531 v4l2_s->val = channel_s->max;
534 static int gb_lights_light_v4l2_register(struct gb_light *light)
536 struct gb_connection *connection = get_conn_from_light(light);
537 struct device *dev = &connection->bundle->dev;
538 struct v4l2_flash_config sd_cfg = { {0} }, sd_cfg_ind = { {0} };
539 struct led_classdev_flash *fled;
540 struct led_classdev *iled = NULL;
541 struct gb_channel *channel_torch, *channel_ind, *channel_flash;
543 channel_torch = get_channel_from_mode(light, GB_CHANNEL_MODE_TORCH);
545 __gb_lights_channel_v4l2_config(&channel_torch->intensity_uA,
548 channel_ind = get_channel_from_mode(light, GB_CHANNEL_MODE_INDICATOR);
550 __gb_lights_channel_v4l2_config(&channel_ind->intensity_uA,
551 &sd_cfg_ind.intensity);
552 iled = &channel_ind->fled.led_cdev;
555 channel_flash = get_channel_from_mode(light, GB_CHANNEL_MODE_FLASH);
556 if (!channel_flash) {
557 dev_err(dev, "failed to get flash channel from mode\n");
561 fled = &channel_flash->fled;
563 snprintf(sd_cfg.dev_name, sizeof(sd_cfg.dev_name), "%s", light->name);
564 snprintf(sd_cfg_ind.dev_name, sizeof(sd_cfg_ind.dev_name),
565 "%s indicator", light->name);
567 /* Set the possible values to faults, in our case all faults */
568 sd_cfg.flash_faults = LED_FAULT_OVER_VOLTAGE | LED_FAULT_TIMEOUT |
569 LED_FAULT_OVER_TEMPERATURE | LED_FAULT_SHORT_CIRCUIT |
570 LED_FAULT_OVER_CURRENT | LED_FAULT_INDICATOR |
571 LED_FAULT_UNDER_VOLTAGE | LED_FAULT_INPUT_VOLTAGE |
572 LED_FAULT_LED_OVER_TEMPERATURE;
574 light->v4l2_flash = v4l2_flash_init(dev, NULL, fled, &v4l2_flash_ops,
576 if (IS_ERR(light->v4l2_flash))
577 return PTR_ERR(light->v4l2_flash);
580 light->v4l2_flash_ind =
581 v4l2_flash_indicator_init(dev, NULL, iled, &sd_cfg_ind);
582 if (IS_ERR(light->v4l2_flash_ind)) {
583 v4l2_flash_release(light->v4l2_flash);
584 return PTR_ERR(light->v4l2_flash_ind);
591 static void gb_lights_light_v4l2_unregister(struct gb_light *light)
593 v4l2_flash_release(light->v4l2_flash_ind);
594 v4l2_flash_release(light->v4l2_flash);
597 static int gb_lights_light_v4l2_register(struct gb_light *light)
599 struct gb_connection *connection = get_conn_from_light(light);
601 dev_err(&connection->bundle->dev, "no support for v4l2 subdevices\n");
605 static void gb_lights_light_v4l2_unregister(struct gb_light *light)
610 #if IS_REACHABLE(CONFIG_LEDS_CLASS_FLASH)
611 /* Flash specific operations */
612 static int gb_lights_flash_intensity_set(struct led_classdev_flash *fcdev,
615 struct gb_channel *channel = container_of(fcdev, struct gb_channel,
619 ret = __gb_lights_flash_intensity_set(channel, brightness);
623 fcdev->brightness.val = brightness;
628 static int gb_lights_flash_intensity_get(struct led_classdev_flash *fcdev,
631 *brightness = fcdev->brightness.val;
636 static int gb_lights_flash_strobe_set(struct led_classdev_flash *fcdev,
639 struct gb_channel *channel = container_of(fcdev, struct gb_channel,
641 struct gb_connection *connection = get_conn_from_channel(channel);
642 struct gb_bundle *bundle = connection->bundle;
643 struct gb_lights_set_flash_strobe_request req;
646 if (channel->releasing)
649 ret = gb_pm_runtime_get_sync(bundle);
653 req.light_id = channel->light->id;
654 req.channel_id = channel->id;
655 req.state = state ? 1 : 0;
657 ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_FLASH_STROBE,
658 &req, sizeof(req), NULL, 0);
660 channel->strobe_state = state;
662 gb_pm_runtime_put_autosuspend(bundle);
667 static int gb_lights_flash_strobe_get(struct led_classdev_flash *fcdev,
670 struct gb_channel *channel = container_of(fcdev, struct gb_channel,
673 *state = channel->strobe_state;
677 static int gb_lights_flash_timeout_set(struct led_classdev_flash *fcdev,
680 struct gb_channel *channel = container_of(fcdev, struct gb_channel,
682 struct gb_connection *connection = get_conn_from_channel(channel);
683 struct gb_bundle *bundle = connection->bundle;
684 struct gb_lights_set_flash_timeout_request req;
687 if (channel->releasing)
690 ret = gb_pm_runtime_get_sync(bundle);
694 req.light_id = channel->light->id;
695 req.channel_id = channel->id;
696 req.timeout_us = cpu_to_le32(timeout);
698 ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_FLASH_TIMEOUT,
699 &req, sizeof(req), NULL, 0);
701 fcdev->timeout.val = timeout;
703 gb_pm_runtime_put_autosuspend(bundle);
708 static int gb_lights_flash_fault_get(struct led_classdev_flash *fcdev,
711 struct gb_channel *channel = container_of(fcdev, struct gb_channel,
713 struct gb_connection *connection = get_conn_from_channel(channel);
714 struct gb_bundle *bundle = connection->bundle;
715 struct gb_lights_get_flash_fault_request req;
716 struct gb_lights_get_flash_fault_response resp;
719 if (channel->releasing)
722 ret = gb_pm_runtime_get_sync(bundle);
726 req.light_id = channel->light->id;
727 req.channel_id = channel->id;
729 ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_GET_FLASH_FAULT,
730 &req, sizeof(req), &resp, sizeof(resp));
732 *fault = le32_to_cpu(resp.fault);
734 gb_pm_runtime_put_autosuspend(bundle);
739 static const struct led_flash_ops gb_lights_flash_ops = {
740 .flash_brightness_set = gb_lights_flash_intensity_set,
741 .flash_brightness_get = gb_lights_flash_intensity_get,
742 .strobe_set = gb_lights_flash_strobe_set,
743 .strobe_get = gb_lights_flash_strobe_get,
744 .timeout_set = gb_lights_flash_timeout_set,
745 .fault_get = gb_lights_flash_fault_get,
748 static int __gb_lights_channel_torch_attach(struct gb_channel *channel,
749 struct gb_channel *channel_torch)
753 /* we can only attach torch to a flash channel */
754 if (!(channel->mode & GB_CHANNEL_MODE_FLASH))
757 /* Move torch brightness to the destination */
758 channel->led->max_brightness = channel_torch->led->max_brightness;
760 /* append mode name to flash name */
761 name = kasprintf(GFP_KERNEL, "%s_%s", channel->led->name,
762 channel_torch->mode_name);
765 kfree(channel->led->name);
766 channel->led->name = name;
768 channel_torch->led = channel->led;
773 static int __gb_lights_flash_led_register(struct gb_channel *channel)
775 struct gb_connection *connection = get_conn_from_channel(channel);
776 struct led_classdev_flash *fled = &channel->fled;
777 struct led_flash_setting *fset;
778 struct gb_channel *channel_torch;
781 fled->ops = &gb_lights_flash_ops;
783 fled->led_cdev.flags |= LED_DEV_CAP_FLASH;
785 fset = &fled->brightness;
786 fset->min = channel->intensity_uA.min;
787 fset->max = channel->intensity_uA.max;
788 fset->step = channel->intensity_uA.step;
789 fset->val = channel->intensity_uA.max;
791 /* Only the flash mode have the timeout constraints settings */
792 if (channel->mode & GB_CHANNEL_MODE_FLASH) {
793 fset = &fled->timeout;
794 fset->min = channel->timeout_us.min;
795 fset->max = channel->timeout_us.max;
796 fset->step = channel->timeout_us.step;
797 fset->val = channel->timeout_us.max;
801 * If light have torch mode channel, this channel will be the led
802 * classdev of the registered above flash classdev
804 channel_torch = get_channel_from_mode(channel->light,
805 GB_CHANNEL_MODE_TORCH);
807 ret = __gb_lights_channel_torch_attach(channel, channel_torch);
812 ret = led_classdev_flash_register(&connection->bundle->dev, fled);
816 channel->is_registered = true;
823 static void __gb_lights_flash_led_unregister(struct gb_channel *channel)
825 if (!channel->is_registered)
828 led_classdev_flash_unregister(&channel->fled);
831 static int gb_lights_channel_flash_config(struct gb_channel *channel)
833 struct gb_connection *connection = get_conn_from_channel(channel);
834 struct gb_lights_get_channel_flash_config_request req;
835 struct gb_lights_get_channel_flash_config_response conf;
836 struct led_flash_setting *fset;
839 req.light_id = channel->light->id;
840 req.channel_id = channel->id;
842 ret = gb_operation_sync(connection,
843 GB_LIGHTS_TYPE_GET_CHANNEL_FLASH_CONFIG,
844 &req, sizeof(req), &conf, sizeof(conf));
849 * Intensity constraints for flash related modes: flash, torch,
850 * indicator. They will be needed for v4l2 registration.
852 fset = &channel->intensity_uA;
853 fset->min = le32_to_cpu(conf.intensity_min_uA);
854 fset->max = le32_to_cpu(conf.intensity_max_uA);
855 fset->step = le32_to_cpu(conf.intensity_step_uA);
858 * On flash type, max brightness is set as the number of intensity steps
861 channel->led->max_brightness = (fset->max - fset->min) / fset->step;
863 /* Only the flash mode have the timeout constraints settings */
864 if (channel->mode & GB_CHANNEL_MODE_FLASH) {
865 fset = &channel->timeout_us;
866 fset->min = le32_to_cpu(conf.timeout_min_us);
867 fset->max = le32_to_cpu(conf.timeout_max_us);
868 fset->step = le32_to_cpu(conf.timeout_step_us);
874 static int gb_lights_channel_flash_config(struct gb_channel *channel)
876 struct gb_connection *connection = get_conn_from_channel(channel);
878 dev_err(&connection->bundle->dev, "no support for flash devices\n");
882 static int __gb_lights_flash_led_register(struct gb_channel *channel)
887 static void __gb_lights_flash_led_unregister(struct gb_channel *channel)
893 static int __gb_lights_led_register(struct gb_channel *channel)
895 struct gb_connection *connection = get_conn_from_channel(channel);
896 struct led_classdev *cdev = get_channel_cdev(channel);
899 ret = led_classdev_register(&connection->bundle->dev, cdev);
903 channel->is_registered = true;
907 static int gb_lights_channel_register(struct gb_channel *channel)
909 /* Normal LED channel, just register in led classdev and we are done */
910 if (!is_channel_flash(channel))
911 return __gb_lights_led_register(channel);
914 * Flash Type need more work, register flash classdev, indicator as
915 * flash classdev, torch will be led classdev of the flash classdev.
917 if (!(channel->mode & GB_CHANNEL_MODE_TORCH))
918 return __gb_lights_flash_led_register(channel);
923 static void __gb_lights_led_unregister(struct gb_channel *channel)
925 struct led_classdev *cdev = get_channel_cdev(channel);
927 if (!channel->is_registered)
930 led_classdev_unregister(cdev);
936 static void gb_lights_channel_unregister(struct gb_channel *channel)
938 /* The same as register, handle channels differently */
939 if (!is_channel_flash(channel)) {
940 __gb_lights_led_unregister(channel);
944 if (channel->mode & GB_CHANNEL_MODE_TORCH)
945 __gb_lights_led_unregister(channel);
947 __gb_lights_flash_led_unregister(channel);
950 static int gb_lights_channel_config(struct gb_light *light,
951 struct gb_channel *channel)
953 struct gb_lights_get_channel_config_response conf;
954 struct gb_lights_get_channel_config_request req;
955 struct gb_connection *connection = get_conn_from_light(light);
956 struct led_classdev *cdev = get_channel_cdev(channel);
960 req.light_id = light->id;
961 req.channel_id = channel->id;
963 ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_GET_CHANNEL_CONFIG,
964 &req, sizeof(req), &conf, sizeof(conf));
968 channel->light = light;
969 channel->mode = le32_to_cpu(conf.mode);
970 channel->flags = le32_to_cpu(conf.flags);
971 channel->color = le32_to_cpu(conf.color);
972 channel->color_name = kstrndup(conf.color_name, NAMES_MAX, GFP_KERNEL);
973 if (!channel->color_name)
975 channel->mode_name = kstrndup(conf.mode_name, NAMES_MAX, GFP_KERNEL);
976 if (!channel->mode_name)
981 name = kasprintf(GFP_KERNEL, "%s:%s:%s", light->name,
982 channel->color_name, channel->mode_name);
988 cdev->max_brightness = conf.max_brightness;
990 ret = channel_attr_groups_set(channel, cdev);
994 gb_lights_led_operations_set(channel, cdev);
997 * If it is not a flash related channel (flash, torch or indicator) we
998 * are done here. If not, continue and fetch flash related
1001 if (!is_channel_flash(channel))
1004 light->has_flash = true;
1006 return gb_lights_channel_flash_config(channel);
1009 static int gb_lights_light_config(struct gb_lights *glights, u8 id)
1011 struct gb_light *light = &glights->lights[id];
1012 struct gb_lights_get_light_config_request req;
1013 struct gb_lights_get_light_config_response conf;
1017 light->glights = glights;
1022 ret = gb_operation_sync(glights->connection,
1023 GB_LIGHTS_TYPE_GET_LIGHT_CONFIG,
1024 &req, sizeof(req), &conf, sizeof(conf));
1028 if (!conf.channel_count)
1030 if (!strlen(conf.name))
1033 light->channels_count = conf.channel_count;
1034 light->name = kstrndup(conf.name, NAMES_MAX, GFP_KERNEL);
1037 light->channels = kcalloc(light->channels_count,
1038 sizeof(struct gb_channel), GFP_KERNEL);
1039 if (!light->channels)
1042 /* First we collect all the configurations for all channels */
1043 for (i = 0; i < light->channels_count; i++) {
1044 light->channels[i].id = i;
1045 ret = gb_lights_channel_config(light, &light->channels[i]);
1053 static int gb_lights_light_register(struct gb_light *light)
1059 * Then, if everything went ok in getting configurations, we register
1060 * the classdev, flash classdev and v4l2 subsystem, if a flash device is
1063 for (i = 0; i < light->channels_count; i++) {
1064 ret = gb_lights_channel_register(&light->channels[i]);
1068 mutex_init(&light->channels[i].lock);
1071 light->ready = true;
1073 if (light->has_flash) {
1074 ret = gb_lights_light_v4l2_register(light);
1076 light->has_flash = false;
1084 static void gb_lights_channel_free(struct gb_channel *channel)
1086 kfree(channel->attrs);
1087 kfree(channel->attr_group);
1088 kfree(channel->attr_groups);
1089 kfree(channel->color_name);
1090 kfree(channel->mode_name);
1091 mutex_destroy(&channel->lock);
1094 static void gb_lights_channel_release(struct gb_channel *channel)
1096 channel->releasing = true;
1098 gb_lights_channel_unregister(channel);
1100 gb_lights_channel_free(channel);
1103 static void gb_lights_light_release(struct gb_light *light)
1107 light->ready = false;
1109 if (light->has_flash)
1110 gb_lights_light_v4l2_unregister(light);
1111 light->has_flash = false;
1113 for (i = 0; i < light->channels_count; i++)
1114 gb_lights_channel_release(&light->channels[i]);
1115 light->channels_count = 0;
1117 kfree(light->channels);
1118 light->channels = NULL;
1123 static void gb_lights_release(struct gb_lights *glights)
1130 mutex_lock(&glights->lights_lock);
1131 if (!glights->lights)
1134 for (i = 0; i < glights->lights_count; i++)
1135 gb_lights_light_release(&glights->lights[i]);
1137 kfree(glights->lights);
1140 mutex_unlock(&glights->lights_lock);
1141 mutex_destroy(&glights->lights_lock);
1145 static int gb_lights_get_count(struct gb_lights *glights)
1147 struct gb_lights_get_lights_response resp;
1150 ret = gb_operation_sync(glights->connection, GB_LIGHTS_TYPE_GET_LIGHTS,
1151 NULL, 0, &resp, sizeof(resp));
1155 if (!resp.lights_count)
1158 glights->lights_count = resp.lights_count;
1163 static int gb_lights_create_all(struct gb_lights *glights)
1165 struct gb_connection *connection = glights->connection;
1169 mutex_lock(&glights->lights_lock);
1170 ret = gb_lights_get_count(glights);
1174 glights->lights = kcalloc(glights->lights_count,
1175 sizeof(struct gb_light), GFP_KERNEL);
1176 if (!glights->lights) {
1181 for (i = 0; i < glights->lights_count; i++) {
1182 ret = gb_lights_light_config(glights, i);
1184 dev_err(&connection->bundle->dev,
1185 "Fail to configure lights device\n");
1191 mutex_unlock(&glights->lights_lock);
1195 static int gb_lights_register_all(struct gb_lights *glights)
1197 struct gb_connection *connection = glights->connection;
1201 mutex_lock(&glights->lights_lock);
1202 for (i = 0; i < glights->lights_count; i++) {
1203 ret = gb_lights_light_register(&glights->lights[i]);
1205 dev_err(&connection->bundle->dev,
1206 "Fail to enable lights device\n");
1211 mutex_unlock(&glights->lights_lock);
1215 static int gb_lights_request_handler(struct gb_operation *op)
1217 struct gb_connection *connection = op->connection;
1218 struct device *dev = &connection->bundle->dev;
1219 struct gb_lights *glights = gb_connection_get_data(connection);
1220 struct gb_light *light;
1221 struct gb_message *request;
1222 struct gb_lights_event_request *payload;
1227 if (op->type != GB_LIGHTS_TYPE_EVENT) {
1228 dev_err(dev, "Unsupported unsolicited event: %u\n", op->type);
1232 request = op->request;
1234 if (request->payload_size < sizeof(*payload)) {
1235 dev_err(dev, "Wrong event size received (%zu < %zu)\n",
1236 request->payload_size, sizeof(*payload));
1240 payload = request->payload;
1241 light_id = payload->light_id;
1243 if (light_id >= glights->lights_count ||
1244 !glights->lights[light_id].ready) {
1245 dev_err(dev, "Event received for unconfigured light id: %d\n",
1250 event = payload->event;
1252 if (event & GB_LIGHTS_LIGHT_CONFIG) {
1253 light = &glights->lights[light_id];
1255 mutex_lock(&glights->lights_lock);
1256 gb_lights_light_release(light);
1257 ret = gb_lights_light_config(glights, light_id);
1259 ret = gb_lights_light_register(light);
1261 gb_lights_light_release(light);
1262 mutex_unlock(&glights->lights_lock);
1268 static int gb_lights_probe(struct gb_bundle *bundle,
1269 const struct greybus_bundle_id *id)
1271 struct greybus_descriptor_cport *cport_desc;
1272 struct gb_connection *connection;
1273 struct gb_lights *glights;
1276 if (bundle->num_cports != 1)
1279 cport_desc = &bundle->cport_desc[0];
1280 if (cport_desc->protocol_id != GREYBUS_PROTOCOL_LIGHTS)
1283 glights = kzalloc(sizeof(*glights), GFP_KERNEL);
1287 mutex_init(&glights->lights_lock);
1289 connection = gb_connection_create(bundle, le16_to_cpu(cport_desc->id),
1290 gb_lights_request_handler);
1291 if (IS_ERR(connection)) {
1292 ret = PTR_ERR(connection);
1296 glights->connection = connection;
1297 gb_connection_set_data(connection, glights);
1299 greybus_set_drvdata(bundle, glights);
1301 /* We aren't ready to receive an incoming request yet */
1302 ret = gb_connection_enable_tx(connection);
1304 goto error_connection_destroy;
1307 * Setup all the lights devices over this connection, if anything goes
1308 * wrong tear down all lights
1310 ret = gb_lights_create_all(glights);
1312 goto error_connection_disable;
1314 /* We are ready to receive an incoming request now, enable RX as well */
1315 ret = gb_connection_enable(connection);
1317 goto error_connection_disable;
1319 /* Enable & register lights */
1320 ret = gb_lights_register_all(glights);
1322 goto error_connection_disable;
1324 gb_pm_runtime_put_autosuspend(bundle);
1328 error_connection_disable:
1329 gb_connection_disable(connection);
1330 error_connection_destroy:
1331 gb_connection_destroy(connection);
1333 gb_lights_release(glights);
1337 static void gb_lights_disconnect(struct gb_bundle *bundle)
1339 struct gb_lights *glights = greybus_get_drvdata(bundle);
1341 if (gb_pm_runtime_get_sync(bundle))
1342 gb_pm_runtime_get_noresume(bundle);
1344 gb_connection_disable(glights->connection);
1345 gb_connection_destroy(glights->connection);
1347 gb_lights_release(glights);
1350 static const struct greybus_bundle_id gb_lights_id_table[] = {
1351 { GREYBUS_DEVICE_CLASS(GREYBUS_CLASS_LIGHTS) },
1354 MODULE_DEVICE_TABLE(greybus, gb_lights_id_table);
1356 static struct greybus_driver gb_lights_driver = {
1358 .probe = gb_lights_probe,
1359 .disconnect = gb_lights_disconnect,
1360 .id_table = gb_lights_id_table,
1362 module_greybus_driver(gb_lights_driver);
1364 MODULE_LICENSE("GPL v2");