GNU Linux-libre 4.19.207-gnu1
[releases.git] / drivers / staging / greybus / light.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Greybus Lights protocol driver.
4  *
5  * Copyright 2015 Google Inc.
6  * Copyright 2015 Linaro Ltd.
7  */
8
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 <media/v4l2-flash-led-class.h>
15
16 #include "greybus.h"
17 #include "greybus_protocols.h"
18
19 #define NAMES_MAX       32
20
21 struct gb_channel {
22         u8                              id;
23         u32                             flags;
24         u32                             color;
25         char                            *color_name;
26         u8                              fade_in;
27         u8                              fade_out;
28         u32                             mode;
29         char                            *mode_name;
30         struct attribute                **attrs;
31         struct attribute_group          *attr_group;
32         const struct attribute_group    **attr_groups;
33         struct led_classdev             *led;
34 #if IS_REACHABLE(CONFIG_LEDS_CLASS_FLASH)
35         struct led_classdev_flash       fled;
36         struct led_flash_setting        intensity_uA;
37         struct led_flash_setting        timeout_us;
38 #else
39         struct led_classdev             cled;
40 #endif
41         struct gb_light                 *light;
42         bool                            is_registered;
43         bool                            releasing;
44         bool                            strobe_state;
45         bool                            active;
46         struct mutex                    lock;
47 };
48
49 struct gb_light {
50         u8                      id;
51         char                    *name;
52         struct gb_lights        *glights;
53         u32                     flags;
54         u8                      channels_count;
55         struct gb_channel       *channels;
56         bool                    has_flash;
57         bool                    ready;
58 #if IS_REACHABLE(CONFIG_V4L2_FLASH_LED_CLASS)
59         struct v4l2_flash       *v4l2_flash;
60         struct v4l2_flash       *v4l2_flash_ind;
61 #endif
62 };
63
64 struct gb_lights {
65         struct gb_connection    *connection;
66         u8                      lights_count;
67         struct gb_light         *lights;
68         struct mutex            lights_lock;
69 };
70
71 static void gb_lights_channel_free(struct gb_channel *channel);
72
73 static struct gb_connection *get_conn_from_channel(struct gb_channel *channel)
74 {
75         return channel->light->glights->connection;
76 }
77
78 static struct gb_connection *get_conn_from_light(struct gb_light *light)
79 {
80         return light->glights->connection;
81 }
82
83 static bool is_channel_flash(struct gb_channel *channel)
84 {
85         return !!(channel->mode & (GB_CHANNEL_MODE_FLASH | GB_CHANNEL_MODE_TORCH
86                                    | GB_CHANNEL_MODE_INDICATOR));
87 }
88
89 #if IS_REACHABLE(CONFIG_LEDS_CLASS_FLASH)
90 static struct gb_channel *get_channel_from_cdev(struct led_classdev *cdev)
91 {
92         struct led_classdev_flash *fled_cdev = lcdev_to_flcdev(cdev);
93
94         return container_of(fled_cdev, struct gb_channel, fled);
95 }
96
97 static struct led_classdev *get_channel_cdev(struct gb_channel *channel)
98 {
99         return &channel->fled.led_cdev;
100 }
101
102 static struct gb_channel *get_channel_from_mode(struct gb_light *light,
103                                                 u32 mode)
104 {
105         struct gb_channel *channel = NULL;
106         int i;
107
108         for (i = 0; i < light->channels_count; i++) {
109                 channel = &light->channels[i];
110                 if (channel && channel->mode == mode)
111                         break;
112         }
113         return channel;
114 }
115
116 static int __gb_lights_flash_intensity_set(struct gb_channel *channel,
117                                            u32 intensity)
118 {
119         struct gb_connection *connection = get_conn_from_channel(channel);
120         struct gb_bundle *bundle = connection->bundle;
121         struct gb_lights_set_flash_intensity_request req;
122         int ret;
123
124         if (channel->releasing)
125                 return -ESHUTDOWN;
126
127         ret = gb_pm_runtime_get_sync(bundle);
128         if (ret < 0)
129                 return ret;
130
131         req.light_id = channel->light->id;
132         req.channel_id = channel->id;
133         req.intensity_uA = cpu_to_le32(intensity);
134
135         ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_FLASH_INTENSITY,
136                                 &req, sizeof(req), NULL, 0);
137
138         gb_pm_runtime_put_autosuspend(bundle);
139
140         return ret;
141 }
142
143 static int __gb_lights_flash_brightness_set(struct gb_channel *channel)
144 {
145         u32 intensity;
146
147         /* If the channel is flash we need to get the attached torch channel */
148         if (channel->mode & GB_CHANNEL_MODE_FLASH)
149                 channel = get_channel_from_mode(channel->light,
150                                                 GB_CHANNEL_MODE_TORCH);
151
152         /* For not flash we need to convert brightness to intensity */
153         intensity = channel->intensity_uA.min +
154                         (channel->intensity_uA.step * channel->led->brightness);
155
156         return __gb_lights_flash_intensity_set(channel, intensity);
157 }
158 #else
159 static struct gb_channel *get_channel_from_cdev(struct led_classdev *cdev)
160 {
161         return container_of(cdev, struct gb_channel, cled);
162 }
163
164 static struct led_classdev *get_channel_cdev(struct gb_channel *channel)
165 {
166         return &channel->cled;
167 }
168
169 static int __gb_lights_flash_brightness_set(struct gb_channel *channel)
170 {
171         return 0;
172 }
173 #endif
174
175 static int gb_lights_color_set(struct gb_channel *channel, u32 color);
176 static int gb_lights_fade_set(struct gb_channel *channel);
177
178 static void led_lock(struct led_classdev *cdev)
179 {
180         mutex_lock(&cdev->led_access);
181 }
182
183 static void led_unlock(struct led_classdev *cdev)
184 {
185         mutex_unlock(&cdev->led_access);
186 }
187
188 #define gb_lights_fade_attr(__dir)                                      \
189 static ssize_t fade_##__dir##_show(struct device *dev,                  \
190                                    struct device_attribute *attr,       \
191                                    char *buf)                           \
192 {                                                                       \
193         struct led_classdev *cdev = dev_get_drvdata(dev);               \
194         struct gb_channel *channel = get_channel_from_cdev(cdev);       \
195                                                                         \
196         return sprintf(buf, "%u\n", channel->fade_##__dir);             \
197 }                                                                       \
198                                                                         \
199 static ssize_t fade_##__dir##_store(struct device *dev,                 \
200                                     struct device_attribute *attr,      \
201                                     const char *buf, size_t size)       \
202 {                                                                       \
203         struct led_classdev *cdev = dev_get_drvdata(dev);               \
204         struct gb_channel *channel = get_channel_from_cdev(cdev);       \
205         u8 fade;                                                        \
206         int ret;                                                        \
207                                                                         \
208         led_lock(cdev);                                                 \
209         if (led_sysfs_is_disabled(cdev)) {                              \
210                 ret = -EBUSY;                                           \
211                 goto unlock;                                            \
212         }                                                               \
213                                                                         \
214         ret = kstrtou8(buf, 0, &fade);                                  \
215         if (ret < 0) {                                                  \
216                 dev_err(dev, "could not parse fade value %d\n", ret);   \
217                 goto unlock;                                            \
218         }                                                               \
219         if (channel->fade_##__dir == fade)                              \
220                 goto unlock;                                            \
221         channel->fade_##__dir = fade;                                   \
222                                                                         \
223         ret = gb_lights_fade_set(channel);                              \
224         if (ret < 0)                                                    \
225                 goto unlock;                                            \
226                                                                         \
227         ret = size;                                                     \
228 unlock:                                                                 \
229         led_unlock(cdev);                                               \
230         return ret;                                                     \
231 }                                                                       \
232 static DEVICE_ATTR_RW(fade_##__dir)
233
234 gb_lights_fade_attr(in);
235 gb_lights_fade_attr(out);
236
237 static ssize_t color_show(struct device *dev, struct device_attribute *attr,
238                           char *buf)
239 {
240         struct led_classdev *cdev = dev_get_drvdata(dev);
241         struct gb_channel *channel = get_channel_from_cdev(cdev);
242
243         return sprintf(buf, "0x%08x\n", channel->color);
244 }
245
246 static ssize_t color_store(struct device *dev, struct device_attribute *attr,
247                            const char *buf, size_t size)
248 {
249         struct led_classdev *cdev = dev_get_drvdata(dev);
250         struct gb_channel *channel = get_channel_from_cdev(cdev);
251         u32 color;
252         int ret;
253
254         led_lock(cdev);
255         if (led_sysfs_is_disabled(cdev)) {
256                 ret = -EBUSY;
257                 goto unlock;
258         }
259         ret = kstrtou32(buf, 0, &color);
260         if (ret < 0) {
261                 dev_err(dev, "could not parse color value %d\n", ret);
262                 goto unlock;
263         }
264
265         ret = gb_lights_color_set(channel, color);
266         if (ret < 0)
267                 goto unlock;
268
269         channel->color = color;
270         ret = size;
271 unlock:
272         led_unlock(cdev);
273         return ret;
274 }
275 static DEVICE_ATTR_RW(color);
276
277 static int channel_attr_groups_set(struct gb_channel *channel,
278                                    struct led_classdev *cdev)
279 {
280         int attr = 0;
281         int size = 0;
282
283         if (channel->flags & GB_LIGHT_CHANNEL_MULTICOLOR)
284                 size++;
285         if (channel->flags & GB_LIGHT_CHANNEL_FADER)
286                 size += 2;
287
288         if (!size)
289                 return 0;
290
291         /* Set attributes based in the channel flags */
292         channel->attrs = kcalloc(size + 1, sizeof(*channel->attrs), GFP_KERNEL);
293         if (!channel->attrs)
294                 return -ENOMEM;
295         channel->attr_group = kcalloc(1, sizeof(*channel->attr_group),
296                                       GFP_KERNEL);
297         if (!channel->attr_group)
298                 return -ENOMEM;
299         channel->attr_groups = kcalloc(2, sizeof(*channel->attr_groups),
300                                        GFP_KERNEL);
301         if (!channel->attr_groups)
302                 return -ENOMEM;
303
304         if (channel->flags & GB_LIGHT_CHANNEL_MULTICOLOR)
305                 channel->attrs[attr++] = &dev_attr_color.attr;
306         if (channel->flags & GB_LIGHT_CHANNEL_FADER) {
307                 channel->attrs[attr++] = &dev_attr_fade_in.attr;
308                 channel->attrs[attr++] = &dev_attr_fade_out.attr;
309         }
310
311         channel->attr_group->attrs = channel->attrs;
312
313         channel->attr_groups[0] = channel->attr_group;
314
315         cdev->groups = channel->attr_groups;
316
317         return 0;
318 }
319
320 static int gb_lights_fade_set(struct gb_channel *channel)
321 {
322         struct gb_connection *connection = get_conn_from_channel(channel);
323         struct gb_bundle *bundle = connection->bundle;
324         struct gb_lights_set_fade_request req;
325         int ret;
326
327         if (channel->releasing)
328                 return -ESHUTDOWN;
329
330         ret = gb_pm_runtime_get_sync(bundle);
331         if (ret < 0)
332                 return ret;
333
334         req.light_id = channel->light->id;
335         req.channel_id = channel->id;
336         req.fade_in = channel->fade_in;
337         req.fade_out = channel->fade_out;
338         ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_FADE,
339                                 &req, sizeof(req), NULL, 0);
340
341         gb_pm_runtime_put_autosuspend(bundle);
342
343         return ret;
344 }
345
346 static int gb_lights_color_set(struct gb_channel *channel, u32 color)
347 {
348         struct gb_connection *connection = get_conn_from_channel(channel);
349         struct gb_bundle *bundle = connection->bundle;
350         struct gb_lights_set_color_request req;
351         int ret;
352
353         if (channel->releasing)
354                 return -ESHUTDOWN;
355
356         ret = gb_pm_runtime_get_sync(bundle);
357         if (ret < 0)
358                 return ret;
359
360         req.light_id = channel->light->id;
361         req.channel_id = channel->id;
362         req.color = cpu_to_le32(color);
363         ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_COLOR,
364                                 &req, sizeof(req), NULL, 0);
365
366         gb_pm_runtime_put_autosuspend(bundle);
367
368         return ret;
369 }
370
371 static int __gb_lights_led_brightness_set(struct gb_channel *channel)
372 {
373         struct gb_lights_set_brightness_request req;
374         struct gb_connection *connection = get_conn_from_channel(channel);
375         struct gb_bundle *bundle = connection->bundle;
376         bool old_active;
377         int ret;
378
379         mutex_lock(&channel->lock);
380         ret = gb_pm_runtime_get_sync(bundle);
381         if (ret < 0)
382                 goto out_unlock;
383
384         old_active = channel->active;
385
386         req.light_id = channel->light->id;
387         req.channel_id = channel->id;
388         req.brightness = (u8)channel->led->brightness;
389
390         ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_BRIGHTNESS,
391                                 &req, sizeof(req), NULL, 0);
392         if (ret < 0)
393                 goto out_pm_put;
394
395         if (channel->led->brightness)
396                 channel->active = true;
397         else
398                 channel->active = false;
399
400         /* we need to keep module alive when turning to active state */
401         if (!old_active && channel->active)
402                 goto out_unlock;
403
404         /*
405          * on the other hand if going to inactive we still hold a reference and
406          * need to put it, so we could go to suspend.
407          */
408         if (old_active && !channel->active)
409                 gb_pm_runtime_put_autosuspend(bundle);
410
411 out_pm_put:
412         gb_pm_runtime_put_autosuspend(bundle);
413 out_unlock:
414         mutex_unlock(&channel->lock);
415
416         return ret;
417 }
418
419 static int __gb_lights_brightness_set(struct gb_channel *channel)
420 {
421         int ret;
422
423         if (channel->releasing)
424                 return 0;
425
426         if (is_channel_flash(channel))
427                 ret = __gb_lights_flash_brightness_set(channel);
428         else
429                 ret = __gb_lights_led_brightness_set(channel);
430
431         return ret;
432 }
433
434 static int gb_brightness_set(struct led_classdev *cdev,
435                              enum led_brightness value)
436 {
437         struct gb_channel *channel = get_channel_from_cdev(cdev);
438
439         channel->led->brightness = value;
440
441         return __gb_lights_brightness_set(channel);
442 }
443
444 static enum led_brightness gb_brightness_get(struct led_classdev *cdev)
445
446 {
447         struct gb_channel *channel = get_channel_from_cdev(cdev);
448
449         return channel->led->brightness;
450 }
451
452 static int gb_blink_set(struct led_classdev *cdev, unsigned long *delay_on,
453                         unsigned long *delay_off)
454 {
455         struct gb_channel *channel = get_channel_from_cdev(cdev);
456         struct gb_connection *connection = get_conn_from_channel(channel);
457         struct gb_bundle *bundle = connection->bundle;
458         struct gb_lights_blink_request req;
459         bool old_active;
460         int ret;
461
462         if (channel->releasing)
463                 return -ESHUTDOWN;
464
465         if (!delay_on || !delay_off)
466                 return -EINVAL;
467
468         mutex_lock(&channel->lock);
469         ret = gb_pm_runtime_get_sync(bundle);
470         if (ret < 0)
471                 goto out_unlock;
472
473         old_active = channel->active;
474
475         req.light_id = channel->light->id;
476         req.channel_id = channel->id;
477         req.time_on_ms = cpu_to_le16(*delay_on);
478         req.time_off_ms = cpu_to_le16(*delay_off);
479
480         ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_BLINK, &req,
481                                 sizeof(req), NULL, 0);
482         if (ret < 0)
483                 goto out_pm_put;
484
485         if (*delay_on)
486                 channel->active = true;
487         else
488                 channel->active = false;
489
490         /* we need to keep module alive when turning to active state */
491         if (!old_active && channel->active)
492                 goto out_unlock;
493
494         /*
495          * on the other hand if going to inactive we still hold a reference and
496          * need to put it, so we could go to suspend.
497          */
498         if (old_active && !channel->active)
499                 gb_pm_runtime_put_autosuspend(bundle);
500
501 out_pm_put:
502         gb_pm_runtime_put_autosuspend(bundle);
503 out_unlock:
504         mutex_unlock(&channel->lock);
505
506         return ret;
507 }
508
509 static void gb_lights_led_operations_set(struct gb_channel *channel,
510                                          struct led_classdev *cdev)
511 {
512         cdev->brightness_get = gb_brightness_get;
513         cdev->brightness_set_blocking = gb_brightness_set;
514
515         if (channel->flags & GB_LIGHT_CHANNEL_BLINK)
516                 cdev->blink_set = gb_blink_set;
517 }
518
519 #if IS_REACHABLE(CONFIG_V4L2_FLASH_LED_CLASS)
520 /* V4L2 specific helpers */
521 static const struct v4l2_flash_ops v4l2_flash_ops;
522
523 static void __gb_lights_channel_v4l2_config(struct led_flash_setting *channel_s,
524                                             struct led_flash_setting *v4l2_s)
525 {
526         v4l2_s->min = channel_s->min;
527         v4l2_s->max = channel_s->max;
528         v4l2_s->step = channel_s->step;
529         /* For v4l2 val is the default value */
530         v4l2_s->val = channel_s->max;
531 }
532
533 static int gb_lights_light_v4l2_register(struct gb_light *light)
534 {
535         struct gb_connection *connection = get_conn_from_light(light);
536         struct device *dev = &connection->bundle->dev;
537         struct v4l2_flash_config sd_cfg = { {0} }, sd_cfg_ind = { {0} };
538         struct led_classdev_flash *fled;
539         struct led_classdev *iled = NULL;
540         struct gb_channel *channel_torch, *channel_ind, *channel_flash;
541
542         channel_torch = get_channel_from_mode(light, GB_CHANNEL_MODE_TORCH);
543         if (channel_torch)
544                 __gb_lights_channel_v4l2_config(&channel_torch->intensity_uA,
545                                                 &sd_cfg.intensity);
546
547         channel_ind = get_channel_from_mode(light, GB_CHANNEL_MODE_INDICATOR);
548         if (channel_ind) {
549                 __gb_lights_channel_v4l2_config(&channel_ind->intensity_uA,
550                                                 &sd_cfg_ind.intensity);
551                 iled = &channel_ind->fled.led_cdev;
552         }
553
554         channel_flash = get_channel_from_mode(light, GB_CHANNEL_MODE_FLASH);
555         WARN_ON(!channel_flash);
556
557         fled = &channel_flash->fled;
558
559         snprintf(sd_cfg.dev_name, sizeof(sd_cfg.dev_name), "%s", light->name);
560         snprintf(sd_cfg_ind.dev_name, sizeof(sd_cfg_ind.dev_name),
561                  "%s indicator", light->name);
562
563         /* Set the possible values to faults, in our case all faults */
564         sd_cfg.flash_faults = LED_FAULT_OVER_VOLTAGE | LED_FAULT_TIMEOUT |
565                 LED_FAULT_OVER_TEMPERATURE | LED_FAULT_SHORT_CIRCUIT |
566                 LED_FAULT_OVER_CURRENT | LED_FAULT_INDICATOR |
567                 LED_FAULT_UNDER_VOLTAGE | LED_FAULT_INPUT_VOLTAGE |
568                 LED_FAULT_LED_OVER_TEMPERATURE;
569
570         light->v4l2_flash = v4l2_flash_init(dev, NULL, fled, &v4l2_flash_ops,
571                                             &sd_cfg);
572         if (IS_ERR(light->v4l2_flash))
573                 return PTR_ERR(light->v4l2_flash);
574
575         if (channel_ind) {
576                 light->v4l2_flash_ind =
577                         v4l2_flash_indicator_init(dev, NULL, iled, &sd_cfg_ind);
578                 if (IS_ERR(light->v4l2_flash_ind)) {
579                         v4l2_flash_release(light->v4l2_flash);
580                         return PTR_ERR(light->v4l2_flash_ind);
581                 }
582         }
583
584         return 0;
585 }
586
587 static void gb_lights_light_v4l2_unregister(struct gb_light *light)
588 {
589         v4l2_flash_release(light->v4l2_flash_ind);
590         v4l2_flash_release(light->v4l2_flash);
591 }
592 #else
593 static int gb_lights_light_v4l2_register(struct gb_light *light)
594 {
595         struct gb_connection *connection = get_conn_from_light(light);
596
597         dev_err(&connection->bundle->dev, "no support for v4l2 subdevices\n");
598         return 0;
599 }
600
601 static void gb_lights_light_v4l2_unregister(struct gb_light *light)
602 {
603 }
604 #endif
605
606 #if IS_REACHABLE(CONFIG_LEDS_CLASS_FLASH)
607 /* Flash specific operations */
608 static int gb_lights_flash_intensity_set(struct led_classdev_flash *fcdev,
609                                          u32 brightness)
610 {
611         struct gb_channel *channel = container_of(fcdev, struct gb_channel,
612                                                   fled);
613         int ret;
614
615         ret = __gb_lights_flash_intensity_set(channel, brightness);
616         if (ret < 0)
617                 return ret;
618
619         fcdev->brightness.val = brightness;
620
621         return 0;
622 }
623
624 static int gb_lights_flash_intensity_get(struct led_classdev_flash *fcdev,
625                                          u32 *brightness)
626 {
627         *brightness = fcdev->brightness.val;
628
629         return 0;
630 }
631
632 static int gb_lights_flash_strobe_set(struct led_classdev_flash *fcdev,
633                                       bool state)
634 {
635         struct gb_channel *channel = container_of(fcdev, struct gb_channel,
636                                                   fled);
637         struct gb_connection *connection = get_conn_from_channel(channel);
638         struct gb_bundle *bundle = connection->bundle;
639         struct gb_lights_set_flash_strobe_request req;
640         int ret;
641
642         if (channel->releasing)
643                 return -ESHUTDOWN;
644
645         ret = gb_pm_runtime_get_sync(bundle);
646         if (ret < 0)
647                 return ret;
648
649         req.light_id = channel->light->id;
650         req.channel_id = channel->id;
651         req.state = state ? 1 : 0;
652
653         ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_FLASH_STROBE,
654                                 &req, sizeof(req), NULL, 0);
655         if (!ret)
656                 channel->strobe_state = state;
657
658         gb_pm_runtime_put_autosuspend(bundle);
659
660         return ret;
661 }
662
663 static int gb_lights_flash_strobe_get(struct led_classdev_flash *fcdev,
664                                       bool *state)
665 {
666         struct gb_channel *channel = container_of(fcdev, struct gb_channel,
667                                                   fled);
668
669         *state = channel->strobe_state;
670         return 0;
671 }
672
673 static int gb_lights_flash_timeout_set(struct led_classdev_flash *fcdev,
674                                        u32 timeout)
675 {
676         struct gb_channel *channel = container_of(fcdev, struct gb_channel,
677                                                   fled);
678         struct gb_connection *connection = get_conn_from_channel(channel);
679         struct gb_bundle *bundle = connection->bundle;
680         struct gb_lights_set_flash_timeout_request req;
681         int ret;
682
683         if (channel->releasing)
684                 return -ESHUTDOWN;
685
686         ret = gb_pm_runtime_get_sync(bundle);
687         if (ret < 0)
688                 return ret;
689
690         req.light_id = channel->light->id;
691         req.channel_id = channel->id;
692         req.timeout_us = cpu_to_le32(timeout);
693
694         ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_FLASH_TIMEOUT,
695                                 &req, sizeof(req), NULL, 0);
696         if (!ret)
697                 fcdev->timeout.val = timeout;
698
699         gb_pm_runtime_put_autosuspend(bundle);
700
701         return ret;
702 }
703
704 static int gb_lights_flash_fault_get(struct led_classdev_flash *fcdev,
705                                      u32 *fault)
706 {
707         struct gb_channel *channel = container_of(fcdev, struct gb_channel,
708                                                   fled);
709         struct gb_connection *connection = get_conn_from_channel(channel);
710         struct gb_bundle *bundle = connection->bundle;
711         struct gb_lights_get_flash_fault_request req;
712         struct gb_lights_get_flash_fault_response resp;
713         int ret;
714
715         if (channel->releasing)
716                 return -ESHUTDOWN;
717
718         ret = gb_pm_runtime_get_sync(bundle);
719         if (ret < 0)
720                 return ret;
721
722         req.light_id = channel->light->id;
723         req.channel_id = channel->id;
724
725         ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_GET_FLASH_FAULT,
726                                 &req, sizeof(req), &resp, sizeof(resp));
727         if (!ret)
728                 *fault = le32_to_cpu(resp.fault);
729
730         gb_pm_runtime_put_autosuspend(bundle);
731
732         return ret;
733 }
734
735 static const struct led_flash_ops gb_lights_flash_ops = {
736         .flash_brightness_set   = gb_lights_flash_intensity_set,
737         .flash_brightness_get   = gb_lights_flash_intensity_get,
738         .strobe_set             = gb_lights_flash_strobe_set,
739         .strobe_get             = gb_lights_flash_strobe_get,
740         .timeout_set            = gb_lights_flash_timeout_set,
741         .fault_get              = gb_lights_flash_fault_get,
742 };
743
744 static int __gb_lights_channel_torch_attach(struct gb_channel *channel,
745                                             struct gb_channel *channel_torch)
746 {
747         char *name;
748
749         /* we can only attach torch to a flash channel */
750         if (!(channel->mode & GB_CHANNEL_MODE_FLASH))
751                 return 0;
752
753         /* Move torch brightness to the destination */
754         channel->led->max_brightness = channel_torch->led->max_brightness;
755
756         /* append mode name to flash name */
757         name = kasprintf(GFP_KERNEL, "%s_%s", channel->led->name,
758                          channel_torch->mode_name);
759         if (!name)
760                 return -ENOMEM;
761         kfree(channel->led->name);
762         channel->led->name = name;
763
764         channel_torch->led = channel->led;
765
766         return 0;
767 }
768
769 static int __gb_lights_flash_led_register(struct gb_channel *channel)
770 {
771         struct gb_connection *connection = get_conn_from_channel(channel);
772         struct led_classdev_flash *fled = &channel->fled;
773         struct led_flash_setting *fset;
774         struct gb_channel *channel_torch;
775         int ret;
776
777         fled->ops = &gb_lights_flash_ops;
778
779         fled->led_cdev.flags |= LED_DEV_CAP_FLASH;
780
781         fset = &fled->brightness;
782         fset->min = channel->intensity_uA.min;
783         fset->max = channel->intensity_uA.max;
784         fset->step = channel->intensity_uA.step;
785         fset->val = channel->intensity_uA.max;
786
787         /* Only the flash mode have the timeout constraints settings */
788         if (channel->mode & GB_CHANNEL_MODE_FLASH) {
789                 fset = &fled->timeout;
790                 fset->min = channel->timeout_us.min;
791                 fset->max = channel->timeout_us.max;
792                 fset->step = channel->timeout_us.step;
793                 fset->val = channel->timeout_us.max;
794         }
795
796         /*
797          * If light have torch mode channel, this channel will be the led
798          * classdev of the registered above flash classdev
799          */
800         channel_torch = get_channel_from_mode(channel->light,
801                                               GB_CHANNEL_MODE_TORCH);
802         if (channel_torch) {
803                 ret = __gb_lights_channel_torch_attach(channel, channel_torch);
804                 if (ret < 0)
805                         goto fail;
806         }
807
808         ret = led_classdev_flash_register(&connection->bundle->dev, fled);
809         if (ret < 0)
810                 goto fail;
811
812         channel->is_registered = true;
813         return 0;
814 fail:
815         channel->led = NULL;
816         return ret;
817 }
818
819 static void __gb_lights_flash_led_unregister(struct gb_channel *channel)
820 {
821         if (!channel->is_registered)
822                 return;
823
824         led_classdev_flash_unregister(&channel->fled);
825 }
826
827 static int gb_lights_channel_flash_config(struct gb_channel *channel)
828 {
829         struct gb_connection *connection = get_conn_from_channel(channel);
830         struct gb_lights_get_channel_flash_config_request req;
831         struct gb_lights_get_channel_flash_config_response conf;
832         struct led_flash_setting *fset;
833         int ret;
834
835         req.light_id = channel->light->id;
836         req.channel_id = channel->id;
837
838         ret = gb_operation_sync(connection,
839                                 GB_LIGHTS_TYPE_GET_CHANNEL_FLASH_CONFIG,
840                                 &req, sizeof(req), &conf, sizeof(conf));
841         if (ret < 0)
842                 return ret;
843
844         /*
845          * Intensity constraints for flash related modes: flash, torch,
846          * indicator.  They will be needed for v4l2 registration.
847          */
848         fset = &channel->intensity_uA;
849         fset->min = le32_to_cpu(conf.intensity_min_uA);
850         fset->max = le32_to_cpu(conf.intensity_max_uA);
851         fset->step = le32_to_cpu(conf.intensity_step_uA);
852
853         /*
854          * On flash type, max brightness is set as the number of intensity steps
855          * available.
856          */
857         channel->led->max_brightness = (fset->max - fset->min) / fset->step;
858
859         /* Only the flash mode have the timeout constraints settings */
860         if (channel->mode & GB_CHANNEL_MODE_FLASH) {
861                 fset = &channel->timeout_us;
862                 fset->min = le32_to_cpu(conf.timeout_min_us);
863                 fset->max = le32_to_cpu(conf.timeout_max_us);
864                 fset->step = le32_to_cpu(conf.timeout_step_us);
865         }
866
867         return 0;
868 }
869 #else
870 static int gb_lights_channel_flash_config(struct gb_channel *channel)
871 {
872         struct gb_connection *connection = get_conn_from_channel(channel);
873
874         dev_err(&connection->bundle->dev, "no support for flash devices\n");
875         return 0;
876 }
877
878 static int __gb_lights_flash_led_register(struct gb_channel *channel)
879 {
880         return 0;
881 }
882
883 static void __gb_lights_flash_led_unregister(struct gb_channel *channel)
884 {
885 }
886
887 #endif
888
889 static int __gb_lights_led_register(struct gb_channel *channel)
890 {
891         struct gb_connection *connection = get_conn_from_channel(channel);
892         struct led_classdev *cdev = get_channel_cdev(channel);
893         int ret;
894
895         ret = led_classdev_register(&connection->bundle->dev, cdev);
896         if (ret < 0)
897                 channel->led = NULL;
898         else
899                 channel->is_registered = true;
900         return ret;
901 }
902
903 static int gb_lights_channel_register(struct gb_channel *channel)
904 {
905         /* Normal LED channel, just register in led classdev and we are done */
906         if (!is_channel_flash(channel))
907                 return __gb_lights_led_register(channel);
908
909         /*
910          * Flash Type need more work, register flash classdev, indicator as
911          * flash classdev, torch will be led classdev of the flash classdev.
912          */
913         if (!(channel->mode & GB_CHANNEL_MODE_TORCH))
914                 return __gb_lights_flash_led_register(channel);
915
916         return 0;
917 }
918
919 static void __gb_lights_led_unregister(struct gb_channel *channel)
920 {
921         struct led_classdev *cdev = get_channel_cdev(channel);
922
923         if (!channel->is_registered)
924                 return;
925
926         led_classdev_unregister(cdev);
927         kfree(cdev->name);
928         cdev->name = NULL;
929         channel->led = NULL;
930 }
931
932 static void gb_lights_channel_unregister(struct gb_channel *channel)
933 {
934         /* The same as register, handle channels differently */
935         if (!is_channel_flash(channel)) {
936                 __gb_lights_led_unregister(channel);
937                 return;
938         }
939
940         if (channel->mode & GB_CHANNEL_MODE_TORCH)
941                 __gb_lights_led_unregister(channel);
942         else
943                 __gb_lights_flash_led_unregister(channel);
944 }
945
946 static int gb_lights_channel_config(struct gb_light *light,
947                                     struct gb_channel *channel)
948 {
949         struct gb_lights_get_channel_config_response conf;
950         struct gb_lights_get_channel_config_request req;
951         struct gb_connection *connection = get_conn_from_light(light);
952         struct led_classdev *cdev = get_channel_cdev(channel);
953         char *name;
954         int ret;
955
956         req.light_id = light->id;
957         req.channel_id = channel->id;
958
959         ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_GET_CHANNEL_CONFIG,
960                                 &req, sizeof(req), &conf, sizeof(conf));
961         if (ret < 0)
962                 return ret;
963
964         channel->light = light;
965         channel->mode = le32_to_cpu(conf.mode);
966         channel->flags = le32_to_cpu(conf.flags);
967         channel->color = le32_to_cpu(conf.color);
968         channel->color_name = kstrndup(conf.color_name, NAMES_MAX, GFP_KERNEL);
969         if (!channel->color_name)
970                 return -ENOMEM;
971         channel->mode_name = kstrndup(conf.mode_name, NAMES_MAX, GFP_KERNEL);
972         if (!channel->mode_name)
973                 return -ENOMEM;
974
975         channel->led = cdev;
976
977         name = kasprintf(GFP_KERNEL, "%s:%s:%s", light->name,
978                          channel->color_name, channel->mode_name);
979         if (!name)
980                 return -ENOMEM;
981
982         cdev->name = name;
983
984         cdev->max_brightness = conf.max_brightness;
985
986         ret = channel_attr_groups_set(channel, cdev);
987         if (ret < 0)
988                 return ret;
989
990         gb_lights_led_operations_set(channel, cdev);
991
992         /*
993          * If it is not a flash related channel (flash, torch or indicator) we
994          * are done here. If not, continue and fetch flash related
995          * configurations.
996          */
997         if (!is_channel_flash(channel))
998                 return ret;
999
1000         light->has_flash = true;
1001
1002         return gb_lights_channel_flash_config(channel);
1003 }
1004
1005 static int gb_lights_light_config(struct gb_lights *glights, u8 id)
1006 {
1007         struct gb_light *light = &glights->lights[id];
1008         struct gb_lights_get_light_config_request req;
1009         struct gb_lights_get_light_config_response conf;
1010         int ret;
1011         int i;
1012
1013         light->glights = glights;
1014         light->id = id;
1015
1016         req.id = id;
1017
1018         ret = gb_operation_sync(glights->connection,
1019                                 GB_LIGHTS_TYPE_GET_LIGHT_CONFIG,
1020                                 &req, sizeof(req), &conf, sizeof(conf));
1021         if (ret < 0)
1022                 return ret;
1023
1024         if (!conf.channel_count)
1025                 return -EINVAL;
1026         if (!strlen(conf.name))
1027                 return -EINVAL;
1028
1029         light->channels_count = conf.channel_count;
1030         light->name = kstrndup(conf.name, NAMES_MAX, GFP_KERNEL);
1031         if (!light->name)
1032                 return -ENOMEM;
1033         light->channels = kcalloc(light->channels_count,
1034                                   sizeof(struct gb_channel), GFP_KERNEL);
1035         if (!light->channels)
1036                 return -ENOMEM;
1037
1038         /* First we collect all the configurations for all channels */
1039         for (i = 0; i < light->channels_count; i++) {
1040                 light->channels[i].id = i;
1041                 ret = gb_lights_channel_config(light, &light->channels[i]);
1042                 if (ret < 0)
1043                         return ret;
1044         }
1045
1046         return 0;
1047 }
1048
1049 static int gb_lights_light_register(struct gb_light *light)
1050 {
1051         int ret;
1052         int i;
1053
1054         /*
1055          * Then, if everything went ok in getting configurations, we register
1056          * the classdev, flash classdev and v4l2 subsystem, if a flash device is
1057          * found.
1058          */
1059         for (i = 0; i < light->channels_count; i++) {
1060                 ret = gb_lights_channel_register(&light->channels[i]);
1061                 if (ret < 0)
1062                         return ret;
1063
1064                 mutex_init(&light->channels[i].lock);
1065         }
1066
1067         light->ready = true;
1068
1069         if (light->has_flash) {
1070                 ret = gb_lights_light_v4l2_register(light);
1071                 if (ret < 0) {
1072                         light->has_flash = false;
1073                         return ret;
1074                 }
1075         }
1076
1077         return 0;
1078 }
1079
1080 static void gb_lights_channel_free(struct gb_channel *channel)
1081 {
1082         kfree(channel->attrs);
1083         kfree(channel->attr_group);
1084         kfree(channel->attr_groups);
1085         kfree(channel->color_name);
1086         kfree(channel->mode_name);
1087         mutex_destroy(&channel->lock);
1088 }
1089
1090 static void gb_lights_channel_release(struct gb_channel *channel)
1091 {
1092         channel->releasing = true;
1093
1094         gb_lights_channel_unregister(channel);
1095
1096         gb_lights_channel_free(channel);
1097 }
1098
1099 static void gb_lights_light_release(struct gb_light *light)
1100 {
1101         int i;
1102
1103         light->ready = false;
1104
1105         if (light->has_flash)
1106                 gb_lights_light_v4l2_unregister(light);
1107         light->has_flash = false;
1108
1109         for (i = 0; i < light->channels_count; i++)
1110                 gb_lights_channel_release(&light->channels[i]);
1111         light->channels_count = 0;
1112
1113         kfree(light->channels);
1114         light->channels = NULL;
1115         kfree(light->name);
1116         light->name = NULL;
1117 }
1118
1119 static void gb_lights_release(struct gb_lights *glights)
1120 {
1121         int i;
1122
1123         if (!glights)
1124                 return;
1125
1126         mutex_lock(&glights->lights_lock);
1127         if (!glights->lights)
1128                 goto free_glights;
1129
1130         for (i = 0; i < glights->lights_count; i++)
1131                 gb_lights_light_release(&glights->lights[i]);
1132
1133         kfree(glights->lights);
1134
1135 free_glights:
1136         mutex_unlock(&glights->lights_lock);
1137         mutex_destroy(&glights->lights_lock);
1138         kfree(glights);
1139 }
1140
1141 static int gb_lights_get_count(struct gb_lights *glights)
1142 {
1143         struct gb_lights_get_lights_response resp;
1144         int ret;
1145
1146         ret = gb_operation_sync(glights->connection, GB_LIGHTS_TYPE_GET_LIGHTS,
1147                                 NULL, 0, &resp, sizeof(resp));
1148         if (ret < 0)
1149                 return ret;
1150
1151         if (!resp.lights_count)
1152                 return -EINVAL;
1153
1154         glights->lights_count = resp.lights_count;
1155
1156         return 0;
1157 }
1158
1159 static int gb_lights_create_all(struct gb_lights *glights)
1160 {
1161         struct gb_connection *connection = glights->connection;
1162         int ret;
1163         int i;
1164
1165         mutex_lock(&glights->lights_lock);
1166         ret = gb_lights_get_count(glights);
1167         if (ret < 0)
1168                 goto out;
1169
1170         glights->lights = kcalloc(glights->lights_count,
1171                                   sizeof(struct gb_light), GFP_KERNEL);
1172         if (!glights->lights) {
1173                 ret = -ENOMEM;
1174                 goto out;
1175         }
1176
1177         for (i = 0; i < glights->lights_count; i++) {
1178                 ret = gb_lights_light_config(glights, i);
1179                 if (ret < 0) {
1180                         dev_err(&connection->bundle->dev,
1181                                 "Fail to configure lights device\n");
1182                         goto out;
1183                 }
1184         }
1185
1186 out:
1187         mutex_unlock(&glights->lights_lock);
1188         return ret;
1189 }
1190
1191 static int gb_lights_register_all(struct gb_lights *glights)
1192 {
1193         struct gb_connection *connection = glights->connection;
1194         int ret = 0;
1195         int i;
1196
1197         mutex_lock(&glights->lights_lock);
1198         for (i = 0; i < glights->lights_count; i++) {
1199                 ret = gb_lights_light_register(&glights->lights[i]);
1200                 if (ret < 0) {
1201                         dev_err(&connection->bundle->dev,
1202                                 "Fail to enable lights device\n");
1203                         break;
1204                 }
1205         }
1206
1207         mutex_unlock(&glights->lights_lock);
1208         return ret;
1209 }
1210
1211 static int gb_lights_request_handler(struct gb_operation *op)
1212 {
1213         struct gb_connection *connection = op->connection;
1214         struct device *dev = &connection->bundle->dev;
1215         struct gb_lights *glights = gb_connection_get_data(connection);
1216         struct gb_light *light;
1217         struct gb_message *request;
1218         struct gb_lights_event_request *payload;
1219         int ret =  0;
1220         u8 light_id;
1221         u8 event;
1222
1223         if (op->type != GB_LIGHTS_TYPE_EVENT) {
1224                 dev_err(dev, "Unsupported unsolicited event: %u\n", op->type);
1225                 return -EINVAL;
1226         }
1227
1228         request = op->request;
1229
1230         if (request->payload_size < sizeof(*payload)) {
1231                 dev_err(dev, "Wrong event size received (%zu < %zu)\n",
1232                         request->payload_size, sizeof(*payload));
1233                 return -EINVAL;
1234         }
1235
1236         payload = request->payload;
1237         light_id = payload->light_id;
1238
1239         if (light_id >= glights->lights_count ||
1240             !glights->lights[light_id].ready) {
1241                 dev_err(dev, "Event received for unconfigured light id: %d\n",
1242                         light_id);
1243                 return -EINVAL;
1244         }
1245
1246         event = payload->event;
1247
1248         if (event & GB_LIGHTS_LIGHT_CONFIG) {
1249                 light = &glights->lights[light_id];
1250
1251                 mutex_lock(&glights->lights_lock);
1252                 gb_lights_light_release(light);
1253                 ret = gb_lights_light_config(glights, light_id);
1254                 if (!ret)
1255                         ret = gb_lights_light_register(light);
1256                 if (ret < 0)
1257                         gb_lights_light_release(light);
1258                 mutex_unlock(&glights->lights_lock);
1259         }
1260
1261         return ret;
1262 }
1263
1264 static int gb_lights_probe(struct gb_bundle *bundle,
1265                            const struct greybus_bundle_id *id)
1266 {
1267         struct greybus_descriptor_cport *cport_desc;
1268         struct gb_connection *connection;
1269         struct gb_lights *glights;
1270         int ret;
1271
1272         if (bundle->num_cports != 1)
1273                 return -ENODEV;
1274
1275         cport_desc = &bundle->cport_desc[0];
1276         if (cport_desc->protocol_id != GREYBUS_PROTOCOL_LIGHTS)
1277                 return -ENODEV;
1278
1279         glights = kzalloc(sizeof(*glights), GFP_KERNEL);
1280         if (!glights)
1281                 return -ENOMEM;
1282
1283         mutex_init(&glights->lights_lock);
1284
1285         connection = gb_connection_create(bundle, le16_to_cpu(cport_desc->id),
1286                                           gb_lights_request_handler);
1287         if (IS_ERR(connection)) {
1288                 ret = PTR_ERR(connection);
1289                 goto out;
1290         }
1291
1292         glights->connection = connection;
1293         gb_connection_set_data(connection, glights);
1294
1295         greybus_set_drvdata(bundle, glights);
1296
1297         /* We aren't ready to receive an incoming request yet */
1298         ret = gb_connection_enable_tx(connection);
1299         if (ret)
1300                 goto error_connection_destroy;
1301
1302         /*
1303          * Setup all the lights devices over this connection, if anything goes
1304          * wrong tear down all lights
1305          */
1306         ret = gb_lights_create_all(glights);
1307         if (ret < 0)
1308                 goto error_connection_disable;
1309
1310         /* We are ready to receive an incoming request now, enable RX as well */
1311         ret = gb_connection_enable(connection);
1312         if (ret)
1313                 goto error_connection_disable;
1314
1315         /* Enable & register lights */
1316         ret = gb_lights_register_all(glights);
1317         if (ret < 0)
1318                 goto error_connection_disable;
1319
1320         gb_pm_runtime_put_autosuspend(bundle);
1321
1322         return 0;
1323
1324 error_connection_disable:
1325         gb_connection_disable(connection);
1326 error_connection_destroy:
1327         gb_connection_destroy(connection);
1328 out:
1329         gb_lights_release(glights);
1330         return ret;
1331 }
1332
1333 static void gb_lights_disconnect(struct gb_bundle *bundle)
1334 {
1335         struct gb_lights *glights = greybus_get_drvdata(bundle);
1336
1337         if (gb_pm_runtime_get_sync(bundle))
1338                 gb_pm_runtime_get_noresume(bundle);
1339
1340         gb_connection_disable(glights->connection);
1341         gb_connection_destroy(glights->connection);
1342
1343         gb_lights_release(glights);
1344 }
1345
1346 static const struct greybus_bundle_id gb_lights_id_table[] = {
1347         { GREYBUS_DEVICE_CLASS(GREYBUS_CLASS_LIGHTS) },
1348         { }
1349 };
1350 MODULE_DEVICE_TABLE(greybus, gb_lights_id_table);
1351
1352 static struct greybus_driver gb_lights_driver = {
1353         .name           = "lights",
1354         .probe          = gb_lights_probe,
1355         .disconnect     = gb_lights_disconnect,
1356         .id_table       = gb_lights_id_table,
1357 };
1358 module_greybus_driver(gb_lights_driver);
1359
1360 MODULE_LICENSE("GPL v2");