2 * Greybus Lights protocol driver.
4 * Copyright 2015 Google Inc.
5 * Copyright 2015 Linaro Ltd.
7 * Released under the GPLv2 only.
10 #include <linux/kernel.h>
11 #include <linux/leds.h>
12 #include <linux/led-class-flash.h>
13 #include <linux/module.h>
14 #include <linux/slab.h>
15 #include <media/v4l2-flash-led-class.h>
18 #include "greybus_protocols.h"
31 struct attribute **attrs;
32 struct attribute_group *attr_group;
33 const struct attribute_group **attr_groups;
34 struct led_classdev *led;
35 #if IS_REACHABLE(CONFIG_LEDS_CLASS_FLASH)
36 struct led_classdev_flash fled;
37 struct led_flash_setting intensity_uA;
38 struct led_flash_setting timeout_us;
40 struct led_classdev cled;
42 struct gb_light *light;
53 struct gb_lights *glights;
56 struct gb_channel *channels;
59 #if IS_REACHABLE(CONFIG_V4L2_FLASH_LED_CLASS)
60 struct v4l2_flash *v4l2_flash;
61 struct v4l2_flash *v4l2_flash_ind;
66 struct gb_connection *connection;
68 struct gb_light *lights;
69 struct mutex lights_lock;
72 static void gb_lights_channel_free(struct gb_channel *channel);
74 static struct gb_connection *get_conn_from_channel(struct gb_channel *channel)
76 return channel->light->glights->connection;
79 static struct gb_connection *get_conn_from_light(struct gb_light *light)
81 return light->glights->connection;
84 static bool is_channel_flash(struct gb_channel *channel)
86 return !!(channel->mode & (GB_CHANNEL_MODE_FLASH | GB_CHANNEL_MODE_TORCH
87 | GB_CHANNEL_MODE_INDICATOR));
90 #if IS_REACHABLE(CONFIG_LEDS_CLASS_FLASH)
91 static struct gb_channel *get_channel_from_cdev(struct led_classdev *cdev)
93 struct led_classdev_flash *fled_cdev = lcdev_to_flcdev(cdev);
95 return container_of(fled_cdev, struct gb_channel, fled);
98 static struct led_classdev *get_channel_cdev(struct gb_channel *channel)
100 return &channel->fled.led_cdev;
103 static struct gb_channel *get_channel_from_mode(struct gb_light *light,
106 struct gb_channel *channel = NULL;
109 for (i = 0; i < light->channels_count; i++) {
110 channel = &light->channels[i];
111 if (channel && channel->mode == mode)
117 static int __gb_lights_flash_intensity_set(struct gb_channel *channel,
120 struct gb_connection *connection = get_conn_from_channel(channel);
121 struct gb_bundle *bundle = connection->bundle;
122 struct gb_lights_set_flash_intensity_request req;
125 if (channel->releasing)
128 ret = gb_pm_runtime_get_sync(bundle);
132 req.light_id = channel->light->id;
133 req.channel_id = channel->id;
134 req.intensity_uA = cpu_to_le32(intensity);
136 ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_FLASH_INTENSITY,
137 &req, sizeof(req), NULL, 0);
139 gb_pm_runtime_put_autosuspend(bundle);
144 static int __gb_lights_flash_brightness_set(struct gb_channel *channel)
148 /* If the channel is flash we need to get the attached torch channel */
149 if (channel->mode & GB_CHANNEL_MODE_FLASH)
150 channel = get_channel_from_mode(channel->light,
151 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 WARN_ON(!channel_flash);
558 fled = &channel_flash->fled;
560 snprintf(sd_cfg.dev_name, sizeof(sd_cfg.dev_name), "%s", light->name);
561 snprintf(sd_cfg_ind.dev_name, sizeof(sd_cfg_ind.dev_name),
562 "%s indicator", light->name);
564 /* Set the possible values to faults, in our case all faults */
565 sd_cfg.flash_faults = LED_FAULT_OVER_VOLTAGE | LED_FAULT_TIMEOUT |
566 LED_FAULT_OVER_TEMPERATURE | LED_FAULT_SHORT_CIRCUIT |
567 LED_FAULT_OVER_CURRENT | LED_FAULT_INDICATOR |
568 LED_FAULT_UNDER_VOLTAGE | LED_FAULT_INPUT_VOLTAGE |
569 LED_FAULT_LED_OVER_TEMPERATURE;
571 light->v4l2_flash = v4l2_flash_init(dev, NULL, fled, &v4l2_flash_ops,
573 if (IS_ERR(light->v4l2_flash))
574 return PTR_ERR(light->v4l2_flash);
577 light->v4l2_flash_ind =
578 v4l2_flash_indicator_init(dev, NULL, iled, &sd_cfg_ind);
579 if (IS_ERR(light->v4l2_flash_ind)) {
580 v4l2_flash_release(light->v4l2_flash);
581 return PTR_ERR(light->v4l2_flash_ind);
588 static void gb_lights_light_v4l2_unregister(struct gb_light *light)
590 v4l2_flash_release(light->v4l2_flash_ind);
591 v4l2_flash_release(light->v4l2_flash);
594 static int gb_lights_light_v4l2_register(struct gb_light *light)
596 struct gb_connection *connection = get_conn_from_light(light);
598 dev_err(&connection->bundle->dev, "no support for v4l2 subdevices\n");
602 static void gb_lights_light_v4l2_unregister(struct gb_light *light)
607 #if IS_REACHABLE(CONFIG_LEDS_CLASS_FLASH)
608 /* Flash specific operations */
609 static int gb_lights_flash_intensity_set(struct led_classdev_flash *fcdev,
612 struct gb_channel *channel = container_of(fcdev, struct gb_channel,
616 ret = __gb_lights_flash_intensity_set(channel, brightness);
620 fcdev->brightness.val = brightness;
625 static int gb_lights_flash_intensity_get(struct led_classdev_flash *fcdev,
628 *brightness = fcdev->brightness.val;
633 static int gb_lights_flash_strobe_set(struct led_classdev_flash *fcdev,
636 struct gb_channel *channel = container_of(fcdev, struct gb_channel,
638 struct gb_connection *connection = get_conn_from_channel(channel);
639 struct gb_bundle *bundle = connection->bundle;
640 struct gb_lights_set_flash_strobe_request req;
643 if (channel->releasing)
646 ret = gb_pm_runtime_get_sync(bundle);
650 req.light_id = channel->light->id;
651 req.channel_id = channel->id;
652 req.state = state ? 1 : 0;
654 ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_FLASH_STROBE,
655 &req, sizeof(req), NULL, 0);
657 channel->strobe_state = state;
659 gb_pm_runtime_put_autosuspend(bundle);
664 static int gb_lights_flash_strobe_get(struct led_classdev_flash *fcdev,
667 struct gb_channel *channel = container_of(fcdev, struct gb_channel,
670 *state = channel->strobe_state;
674 static int gb_lights_flash_timeout_set(struct led_classdev_flash *fcdev,
677 struct gb_channel *channel = container_of(fcdev, struct gb_channel,
679 struct gb_connection *connection = get_conn_from_channel(channel);
680 struct gb_bundle *bundle = connection->bundle;
681 struct gb_lights_set_flash_timeout_request req;
684 if (channel->releasing)
687 ret = gb_pm_runtime_get_sync(bundle);
691 req.light_id = channel->light->id;
692 req.channel_id = channel->id;
693 req.timeout_us = cpu_to_le32(timeout);
695 ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_FLASH_TIMEOUT,
696 &req, sizeof(req), NULL, 0);
698 fcdev->timeout.val = timeout;
700 gb_pm_runtime_put_autosuspend(bundle);
705 static int gb_lights_flash_fault_get(struct led_classdev_flash *fcdev,
708 struct gb_channel *channel = container_of(fcdev, struct gb_channel,
710 struct gb_connection *connection = get_conn_from_channel(channel);
711 struct gb_bundle *bundle = connection->bundle;
712 struct gb_lights_get_flash_fault_request req;
713 struct gb_lights_get_flash_fault_response resp;
716 if (channel->releasing)
719 ret = gb_pm_runtime_get_sync(bundle);
723 req.light_id = channel->light->id;
724 req.channel_id = channel->id;
726 ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_GET_FLASH_FAULT,
727 &req, sizeof(req), &resp, sizeof(resp));
729 *fault = le32_to_cpu(resp.fault);
731 gb_pm_runtime_put_autosuspend(bundle);
736 static const struct led_flash_ops gb_lights_flash_ops = {
737 .flash_brightness_set = gb_lights_flash_intensity_set,
738 .flash_brightness_get = gb_lights_flash_intensity_get,
739 .strobe_set = gb_lights_flash_strobe_set,
740 .strobe_get = gb_lights_flash_strobe_get,
741 .timeout_set = gb_lights_flash_timeout_set,
742 .fault_get = gb_lights_flash_fault_get,
745 static int __gb_lights_channel_torch_attach(struct gb_channel *channel,
746 struct gb_channel *channel_torch)
750 /* we can only attach torch to a flash channel */
751 if (!(channel->mode & GB_CHANNEL_MODE_FLASH))
754 /* Move torch brightness to the destination */
755 channel->led->max_brightness = channel_torch->led->max_brightness;
757 /* append mode name to flash name */
758 name = kasprintf(GFP_KERNEL, "%s_%s", channel->led->name,
759 channel_torch->mode_name);
762 kfree(channel->led->name);
763 channel->led->name = name;
765 channel_torch->led = channel->led;
770 static int __gb_lights_flash_led_register(struct gb_channel *channel)
772 struct gb_connection *connection = get_conn_from_channel(channel);
773 struct led_classdev_flash *fled = &channel->fled;
774 struct led_flash_setting *fset;
775 struct gb_channel *channel_torch;
778 fled->ops = &gb_lights_flash_ops;
780 fled->led_cdev.flags |= LED_DEV_CAP_FLASH;
782 fset = &fled->brightness;
783 fset->min = channel->intensity_uA.min;
784 fset->max = channel->intensity_uA.max;
785 fset->step = channel->intensity_uA.step;
786 fset->val = channel->intensity_uA.max;
788 /* Only the flash mode have the timeout constraints settings */
789 if (channel->mode & GB_CHANNEL_MODE_FLASH) {
790 fset = &fled->timeout;
791 fset->min = channel->timeout_us.min;
792 fset->max = channel->timeout_us.max;
793 fset->step = channel->timeout_us.step;
794 fset->val = channel->timeout_us.max;
798 * If light have torch mode channel, this channel will be the led
799 * classdev of the registered above flash classdev
801 channel_torch = get_channel_from_mode(channel->light,
802 GB_CHANNEL_MODE_TORCH);
804 ret = __gb_lights_channel_torch_attach(channel, channel_torch);
809 ret = led_classdev_flash_register(&connection->bundle->dev, fled);
813 channel->is_registered = true;
820 static void __gb_lights_flash_led_unregister(struct gb_channel *channel)
822 if (!channel->is_registered)
825 led_classdev_flash_unregister(&channel->fled);
828 static int gb_lights_channel_flash_config(struct gb_channel *channel)
830 struct gb_connection *connection = get_conn_from_channel(channel);
831 struct gb_lights_get_channel_flash_config_request req;
832 struct gb_lights_get_channel_flash_config_response conf;
833 struct led_flash_setting *fset;
836 req.light_id = channel->light->id;
837 req.channel_id = channel->id;
839 ret = gb_operation_sync(connection,
840 GB_LIGHTS_TYPE_GET_CHANNEL_FLASH_CONFIG,
841 &req, sizeof(req), &conf, sizeof(conf));
846 * Intensity constraints for flash related modes: flash, torch,
847 * indicator. They will be needed for v4l2 registration.
849 fset = &channel->intensity_uA;
850 fset->min = le32_to_cpu(conf.intensity_min_uA);
851 fset->max = le32_to_cpu(conf.intensity_max_uA);
852 fset->step = le32_to_cpu(conf.intensity_step_uA);
855 * On flash type, max brightness is set as the number of intensity steps
858 channel->led->max_brightness = (fset->max - fset->min) / fset->step;
860 /* Only the flash mode have the timeout constraints settings */
861 if (channel->mode & GB_CHANNEL_MODE_FLASH) {
862 fset = &channel->timeout_us;
863 fset->min = le32_to_cpu(conf.timeout_min_us);
864 fset->max = le32_to_cpu(conf.timeout_max_us);
865 fset->step = le32_to_cpu(conf.timeout_step_us);
871 static int gb_lights_channel_flash_config(struct gb_channel *channel)
873 struct gb_connection *connection = get_conn_from_channel(channel);
875 dev_err(&connection->bundle->dev, "no support for flash devices\n");
879 static int __gb_lights_flash_led_register(struct gb_channel *channel)
884 static void __gb_lights_flash_led_unregister(struct gb_channel *channel)
890 static int __gb_lights_led_register(struct gb_channel *channel)
892 struct gb_connection *connection = get_conn_from_channel(channel);
893 struct led_classdev *cdev = get_channel_cdev(channel);
896 ret = led_classdev_register(&connection->bundle->dev, cdev);
900 channel->is_registered = true;
904 static int gb_lights_channel_register(struct gb_channel *channel)
906 /* Normal LED channel, just register in led classdev and we are done */
907 if (!is_channel_flash(channel))
908 return __gb_lights_led_register(channel);
911 * Flash Type need more work, register flash classdev, indicator as
912 * flash classdev, torch will be led classdev of the flash classdev.
914 if (!(channel->mode & GB_CHANNEL_MODE_TORCH))
915 return __gb_lights_flash_led_register(channel);
920 static void __gb_lights_led_unregister(struct gb_channel *channel)
922 struct led_classdev *cdev = get_channel_cdev(channel);
924 if (!channel->is_registered)
927 led_classdev_unregister(cdev);
933 static void gb_lights_channel_unregister(struct gb_channel *channel)
935 /* The same as register, handle channels differently */
936 if (!is_channel_flash(channel)) {
937 __gb_lights_led_unregister(channel);
941 if (channel->mode & GB_CHANNEL_MODE_TORCH)
942 __gb_lights_led_unregister(channel);
944 __gb_lights_flash_led_unregister(channel);
947 static int gb_lights_channel_config(struct gb_light *light,
948 struct gb_channel *channel)
950 struct gb_lights_get_channel_config_response conf;
951 struct gb_lights_get_channel_config_request req;
952 struct gb_connection *connection = get_conn_from_light(light);
953 struct led_classdev *cdev = get_channel_cdev(channel);
957 req.light_id = light->id;
958 req.channel_id = channel->id;
960 ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_GET_CHANNEL_CONFIG,
961 &req, sizeof(req), &conf, sizeof(conf));
965 channel->light = light;
966 channel->mode = le32_to_cpu(conf.mode);
967 channel->flags = le32_to_cpu(conf.flags);
968 channel->color = le32_to_cpu(conf.color);
969 channel->color_name = kstrndup(conf.color_name, NAMES_MAX, GFP_KERNEL);
970 if (!channel->color_name)
972 channel->mode_name = kstrndup(conf.mode_name, NAMES_MAX, GFP_KERNEL);
973 if (!channel->mode_name)
978 name = kasprintf(GFP_KERNEL, "%s:%s:%s", light->name,
979 channel->color_name, channel->mode_name);
985 cdev->max_brightness = conf.max_brightness;
987 ret = channel_attr_groups_set(channel, cdev);
991 gb_lights_led_operations_set(channel, cdev);
994 * If it is not a flash related channel (flash, torch or indicator) we
995 * are done here. If not, continue and fetch flash related
998 if (!is_channel_flash(channel))
1001 light->has_flash = true;
1003 ret = gb_lights_channel_flash_config(channel);
1010 static int gb_lights_light_config(struct gb_lights *glights, u8 id)
1012 struct gb_light *light = &glights->lights[id];
1013 struct gb_lights_get_light_config_request req;
1014 struct gb_lights_get_light_config_response conf;
1018 light->glights = glights;
1023 ret = gb_operation_sync(glights->connection,
1024 GB_LIGHTS_TYPE_GET_LIGHT_CONFIG,
1025 &req, sizeof(req), &conf, sizeof(conf));
1029 if (!conf.channel_count)
1031 if (!strlen(conf.name))
1034 light->channels_count = conf.channel_count;
1035 light->name = kstrndup(conf.name, NAMES_MAX, GFP_KERNEL);
1038 light->channels = kcalloc(light->channels_count,
1039 sizeof(struct gb_channel), GFP_KERNEL);
1040 if (!light->channels)
1043 /* First we collect all the configurations for all channels */
1044 for (i = 0; i < light->channels_count; i++) {
1045 light->channels[i].id = i;
1046 ret = gb_lights_channel_config(light, &light->channels[i]);
1054 static int gb_lights_light_register(struct gb_light *light)
1060 * Then, if everything went ok in getting configurations, we register
1061 * the classdev, flash classdev and v4l2 subsystem, if a flash device is
1064 for (i = 0; i < light->channels_count; i++) {
1065 ret = gb_lights_channel_register(&light->channels[i]);
1069 mutex_init(&light->channels[i].lock);
1072 light->ready = true;
1074 if (light->has_flash) {
1075 ret = gb_lights_light_v4l2_register(light);
1077 light->has_flash = false;
1085 static void gb_lights_channel_free(struct gb_channel *channel)
1087 kfree(channel->attrs);
1088 kfree(channel->attr_group);
1089 kfree(channel->attr_groups);
1090 kfree(channel->color_name);
1091 kfree(channel->mode_name);
1092 mutex_destroy(&channel->lock);
1095 static void gb_lights_channel_release(struct gb_channel *channel)
1097 channel->releasing = true;
1099 gb_lights_channel_unregister(channel);
1101 gb_lights_channel_free(channel);
1104 static void gb_lights_light_release(struct gb_light *light)
1108 light->ready = false;
1110 if (light->has_flash)
1111 gb_lights_light_v4l2_unregister(light);
1112 light->has_flash = false;
1114 for (i = 0; i < light->channels_count; i++)
1115 gb_lights_channel_release(&light->channels[i]);
1116 light->channels_count = 0;
1118 kfree(light->channels);
1119 light->channels = NULL;
1124 static void gb_lights_release(struct gb_lights *glights)
1131 mutex_lock(&glights->lights_lock);
1132 if (!glights->lights)
1135 for (i = 0; i < glights->lights_count; i++)
1136 gb_lights_light_release(&glights->lights[i]);
1138 kfree(glights->lights);
1141 mutex_unlock(&glights->lights_lock);
1142 mutex_destroy(&glights->lights_lock);
1146 static int gb_lights_get_count(struct gb_lights *glights)
1148 struct gb_lights_get_lights_response resp;
1151 ret = gb_operation_sync(glights->connection, GB_LIGHTS_TYPE_GET_LIGHTS,
1152 NULL, 0, &resp, sizeof(resp));
1156 if (!resp.lights_count)
1159 glights->lights_count = resp.lights_count;
1164 static int gb_lights_create_all(struct gb_lights *glights)
1166 struct gb_connection *connection = glights->connection;
1170 mutex_lock(&glights->lights_lock);
1171 ret = gb_lights_get_count(glights);
1175 glights->lights = kcalloc(glights->lights_count,
1176 sizeof(struct gb_light), GFP_KERNEL);
1177 if (!glights->lights) {
1182 for (i = 0; i < glights->lights_count; i++) {
1183 ret = gb_lights_light_config(glights, i);
1185 dev_err(&connection->bundle->dev,
1186 "Fail to configure lights device\n");
1192 mutex_unlock(&glights->lights_lock);
1196 static int gb_lights_register_all(struct gb_lights *glights)
1198 struct gb_connection *connection = glights->connection;
1202 mutex_lock(&glights->lights_lock);
1203 for (i = 0; i < glights->lights_count; i++) {
1204 ret = gb_lights_light_register(&glights->lights[i]);
1206 dev_err(&connection->bundle->dev,
1207 "Fail to enable lights device\n");
1212 mutex_unlock(&glights->lights_lock);
1216 static int gb_lights_request_handler(struct gb_operation *op)
1218 struct gb_connection *connection = op->connection;
1219 struct device *dev = &connection->bundle->dev;
1220 struct gb_lights *glights = gb_connection_get_data(connection);
1221 struct gb_light *light;
1222 struct gb_message *request;
1223 struct gb_lights_event_request *payload;
1228 if (op->type != GB_LIGHTS_TYPE_EVENT) {
1229 dev_err(dev, "Unsupported unsolicited event: %u\n", op->type);
1233 request = op->request;
1235 if (request->payload_size < sizeof(*payload)) {
1236 dev_err(dev, "Wrong event size received (%zu < %zu)\n",
1237 request->payload_size, sizeof(*payload));
1241 payload = request->payload;
1242 light_id = payload->light_id;
1244 if (light_id >= glights->lights_count ||
1245 !glights->lights[light_id].ready) {
1246 dev_err(dev, "Event received for unconfigured light id: %d\n",
1251 event = payload->event;
1253 if (event & GB_LIGHTS_LIGHT_CONFIG) {
1254 light = &glights->lights[light_id];
1256 mutex_lock(&glights->lights_lock);
1257 gb_lights_light_release(light);
1258 ret = gb_lights_light_config(glights, light_id);
1260 ret = gb_lights_light_register(light);
1262 gb_lights_light_release(light);
1263 mutex_unlock(&glights->lights_lock);
1269 static int gb_lights_probe(struct gb_bundle *bundle,
1270 const struct greybus_bundle_id *id)
1272 struct greybus_descriptor_cport *cport_desc;
1273 struct gb_connection *connection;
1274 struct gb_lights *glights;
1277 if (bundle->num_cports != 1)
1280 cport_desc = &bundle->cport_desc[0];
1281 if (cport_desc->protocol_id != GREYBUS_PROTOCOL_LIGHTS)
1284 glights = kzalloc(sizeof(*glights), GFP_KERNEL);
1288 mutex_init(&glights->lights_lock);
1290 connection = gb_connection_create(bundle, le16_to_cpu(cport_desc->id),
1291 gb_lights_request_handler);
1292 if (IS_ERR(connection)) {
1293 ret = PTR_ERR(connection);
1297 glights->connection = connection;
1298 gb_connection_set_data(connection, glights);
1300 greybus_set_drvdata(bundle, glights);
1302 /* We aren't ready to receive an incoming request yet */
1303 ret = gb_connection_enable_tx(connection);
1305 goto error_connection_destroy;
1308 * Setup all the lights devices over this connection, if anything goes
1309 * wrong tear down all lights
1311 ret = gb_lights_create_all(glights);
1313 goto error_connection_disable;
1315 /* We are ready to receive an incoming request now, enable RX as well */
1316 ret = gb_connection_enable(connection);
1318 goto error_connection_disable;
1320 /* Enable & register lights */
1321 ret = gb_lights_register_all(glights);
1323 goto error_connection_disable;
1325 gb_pm_runtime_put_autosuspend(bundle);
1329 error_connection_disable:
1330 gb_connection_disable(connection);
1331 error_connection_destroy:
1332 gb_connection_destroy(connection);
1334 gb_lights_release(glights);
1338 static void gb_lights_disconnect(struct gb_bundle *bundle)
1340 struct gb_lights *glights = greybus_get_drvdata(bundle);
1342 if (gb_pm_runtime_get_sync(bundle))
1343 gb_pm_runtime_get_noresume(bundle);
1345 gb_connection_disable(glights->connection);
1346 gb_connection_destroy(glights->connection);
1348 gb_lights_release(glights);
1351 static const struct greybus_bundle_id gb_lights_id_table[] = {
1352 { GREYBUS_DEVICE_CLASS(GREYBUS_CLASS_LIGHTS) },
1355 MODULE_DEVICE_TABLE(greybus, gb_lights_id_table);
1357 static struct greybus_driver gb_lights_driver = {
1359 .probe = gb_lights_probe,
1360 .disconnect = gb_lights_disconnect,
1361 .id_table = gb_lights_id_table,
1363 module_greybus_driver(gb_lights_driver);
1365 MODULE_LICENSE("GPL v2");