GNU Linux-libre 4.9.308-gnu1
[releases.git] / drivers / staging / greybus / light.c
1 /*
2  * Greybus Lights protocol driver.
3  *
4  * Copyright 2015 Google Inc.
5  * Copyright 2015 Linaro Ltd.
6  *
7  * Released under the GPLv2 only.
8  */
9
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 <linux/version.h>
16 #include <media/v4l2-flash-led-class.h>
17
18 #include "greybus.h"
19 #include "greybus_protocols.h"
20
21 #define NAMES_MAX       32
22
23 struct gb_channel {
24         u8                              id;
25         u32                             flags;
26         u32                             color;
27         char                            *color_name;
28         u8                              fade_in;
29         u8                              fade_out;
30         u32                             mode;
31         char                            *mode_name;
32         struct attribute                **attrs;
33         struct attribute_group          *attr_group;
34         const struct attribute_group    **attr_groups;
35         struct led_classdev             *led;
36 #if IS_REACHABLE(CONFIG_LEDS_CLASS_FLASH)
37         struct led_classdev_flash       fled;
38         struct led_flash_setting        intensity_uA;
39         struct led_flash_setting        timeout_us;
40 #else
41         struct led_classdev             cled;
42 #endif
43         struct gb_light                 *light;
44         bool                            is_registered;
45         bool                            releasing;
46         bool                            strobe_state;
47         bool                            active;
48         struct mutex                    lock;
49 };
50
51 struct gb_light {
52         u8                      id;
53         char                    *name;
54         struct gb_lights        *glights;
55         u32                     flags;
56         u8                      channels_count;
57         struct gb_channel       *channels;
58         bool                    has_flash;
59         bool                    ready;
60 #if IS_REACHABLE(CONFIG_V4L2_FLASH_LED_CLASS)
61         struct v4l2_flash       *v4l2_flash;
62 #endif
63 };
64
65 struct gb_lights {
66         struct gb_connection    *connection;
67         u8                      lights_count;
68         struct gb_light         *lights;
69         struct mutex            lights_lock;
70 };
71
72 static void gb_lights_channel_free(struct gb_channel *channel);
73
74 static struct gb_connection *get_conn_from_channel(struct gb_channel *channel)
75 {
76         return channel->light->glights->connection;
77 }
78
79 static struct gb_connection *get_conn_from_light(struct gb_light *light)
80 {
81         return light->glights->connection;
82 }
83
84 static bool is_channel_flash(struct gb_channel *channel)
85 {
86         return !!(channel->mode & (GB_CHANNEL_MODE_FLASH | GB_CHANNEL_MODE_TORCH
87                                    | GB_CHANNEL_MODE_INDICATOR));
88 }
89
90 #if IS_REACHABLE(CONFIG_LEDS_CLASS_FLASH)
91 static struct gb_channel *get_channel_from_cdev(struct led_classdev *cdev)
92 {
93         struct led_classdev_flash *fled_cdev = lcdev_to_flcdev(cdev);
94
95         return container_of(fled_cdev, struct gb_channel, fled);
96 }
97
98 static struct led_classdev *get_channel_cdev(struct gb_channel *channel)
99 {
100         return &channel->fled.led_cdev;
101 }
102
103 static struct gb_channel *get_channel_from_mode(struct gb_light *light,
104                                                 u32 mode)
105 {
106         struct gb_channel *channel = NULL;
107         int i;
108
109         for (i = 0; i < light->channels_count; i++) {
110                 channel = &light->channels[i];
111                 if (channel && channel->mode == mode)
112                         break;
113         }
114         return channel;
115 }
116
117 static int __gb_lights_flash_intensity_set(struct gb_channel *channel,
118                                            u32 intensity)
119 {
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;
123         int ret;
124
125         if (channel->releasing)
126                 return -ESHUTDOWN;
127
128         ret = gb_pm_runtime_get_sync(bundle);
129         if (ret < 0)
130                 return ret;
131
132         req.light_id = channel->light->id;
133         req.channel_id = channel->id;
134         req.intensity_uA = cpu_to_le32(intensity);
135
136         ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_FLASH_INTENSITY,
137                                 &req, sizeof(req), NULL, 0);
138
139         gb_pm_runtime_put_autosuspend(bundle);
140
141         return ret;
142 }
143
144 static int __gb_lights_flash_brightness_set(struct gb_channel *channel)
145 {
146         u32 intensity;
147
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);
152
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);
156
157         return __gb_lights_flash_intensity_set(channel, intensity);
158 }
159 #else
160 static struct gb_channel *get_channel_from_cdev(struct led_classdev *cdev)
161 {
162         return container_of(cdev, struct gb_channel, cled);
163 }
164
165 static struct led_classdev *get_channel_cdev(struct gb_channel *channel)
166 {
167         return &channel->cled;
168 }
169
170 static int __gb_lights_flash_brightness_set(struct gb_channel *channel)
171 {
172         return 0;
173 }
174 #endif
175
176 static int gb_lights_color_set(struct gb_channel *channel, u32 color);
177 static int gb_lights_fade_set(struct gb_channel *channel);
178
179 static void led_lock(struct led_classdev *cdev)
180 {
181         mutex_lock(&cdev->led_access);
182 }
183
184 static void led_unlock(struct led_classdev *cdev)
185 {
186         mutex_unlock(&cdev->led_access);
187 }
188
189 #define gb_lights_fade_attr(__dir)                                      \
190 static ssize_t fade_##__dir##_show(struct device *dev,                  \
191                                    struct device_attribute *attr,       \
192                                    char *buf)                           \
193 {                                                                       \
194         struct led_classdev *cdev = dev_get_drvdata(dev);               \
195         struct gb_channel *channel = get_channel_from_cdev(cdev);       \
196                                                                         \
197         return sprintf(buf, "%u\n", channel->fade_##__dir);             \
198 }                                                                       \
199                                                                         \
200 static ssize_t fade_##__dir##_store(struct device *dev,                 \
201                                     struct device_attribute *attr,      \
202                                     const char *buf, size_t size)       \
203 {                                                                       \
204         struct led_classdev *cdev = dev_get_drvdata(dev);               \
205         struct gb_channel *channel = get_channel_from_cdev(cdev);       \
206         u8 fade;                                                        \
207         int ret;                                                        \
208                                                                         \
209         led_lock(cdev);                                                 \
210         if (led_sysfs_is_disabled(cdev)) {                              \
211                 ret = -EBUSY;                                           \
212                 goto unlock;                                            \
213         }                                                               \
214                                                                         \
215         ret = kstrtou8(buf, 0, &fade);                                  \
216         if (ret < 0) {                                                  \
217                 dev_err(dev, "could not parse fade value %d\n", ret);   \
218                 goto unlock;                                            \
219         }                                                               \
220         if (channel->fade_##__dir == fade)                              \
221                 goto unlock;                                            \
222         channel->fade_##__dir = fade;                                   \
223                                                                         \
224         ret = gb_lights_fade_set(channel);                              \
225         if (ret < 0)                                                    \
226                 goto unlock;                                            \
227                                                                         \
228         ret = size;                                                     \
229 unlock:                                                                 \
230         led_unlock(cdev);                                               \
231         return ret;                                                     \
232 }                                                                       \
233 static DEVICE_ATTR_RW(fade_##__dir)
234
235 gb_lights_fade_attr(in);
236 gb_lights_fade_attr(out);
237
238 static ssize_t color_show(struct device *dev, struct device_attribute *attr,
239                           char *buf)
240 {
241         struct led_classdev *cdev = dev_get_drvdata(dev);
242         struct gb_channel *channel = get_channel_from_cdev(cdev);
243
244         return sprintf(buf, "0x%08x\n", channel->color);
245 }
246
247 static ssize_t color_store(struct device *dev, struct device_attribute *attr,
248                            const char *buf, size_t size)
249 {
250         struct led_classdev *cdev = dev_get_drvdata(dev);
251         struct gb_channel *channel = get_channel_from_cdev(cdev);
252         u32 color;
253         int ret;
254
255         led_lock(cdev);
256         if (led_sysfs_is_disabled(cdev)) {
257                 ret = -EBUSY;
258                 goto unlock;
259         }
260         ret = kstrtou32(buf, 0, &color);
261         if (ret < 0) {
262                 dev_err(dev, "could not parse color value %d\n", ret);
263                 goto unlock;
264         }
265
266         ret = gb_lights_color_set(channel, color);
267         if (ret < 0)
268                 goto unlock;
269
270         channel->color = color;
271         ret = size;
272 unlock:
273         led_unlock(cdev);
274         return ret;
275 }
276 static DEVICE_ATTR_RW(color);
277
278 static int channel_attr_groups_set(struct gb_channel *channel,
279                                    struct led_classdev *cdev)
280 {
281         int attr = 0;
282         int size = 0;
283
284         if (channel->flags & GB_LIGHT_CHANNEL_MULTICOLOR)
285                 size++;
286         if (channel->flags & GB_LIGHT_CHANNEL_FADER)
287                 size += 2;
288
289         if (!size)
290                 return 0;
291
292         /* Set attributes based in the channel flags */
293         channel->attrs = kcalloc(size + 1, sizeof(*channel->attrs), GFP_KERNEL);
294         if (!channel->attrs)
295                 return -ENOMEM;
296         channel->attr_group = kcalloc(1, sizeof(*channel->attr_group),
297                                       GFP_KERNEL);
298         if (!channel->attr_group)
299                 return -ENOMEM;
300         channel->attr_groups = kcalloc(2, sizeof(*channel->attr_groups),
301                                        GFP_KERNEL);
302         if (!channel->attr_groups)
303                 return -ENOMEM;
304
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;
310         }
311
312         channel->attr_group->attrs = channel->attrs;
313
314         channel->attr_groups[0] = channel->attr_group;
315
316         cdev->groups = channel->attr_groups;
317
318         return 0;
319 }
320
321 static int gb_lights_fade_set(struct gb_channel *channel)
322 {
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;
326         int ret;
327
328         if (channel->releasing)
329                 return -ESHUTDOWN;
330
331         ret = gb_pm_runtime_get_sync(bundle);
332         if (ret < 0)
333                 return ret;
334
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);
341
342         gb_pm_runtime_put_autosuspend(bundle);
343
344         return ret;
345 }
346
347 static int gb_lights_color_set(struct gb_channel *channel, u32 color)
348 {
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;
352         int ret;
353
354         if (channel->releasing)
355                 return -ESHUTDOWN;
356
357         ret = gb_pm_runtime_get_sync(bundle);
358         if (ret < 0)
359                 return ret;
360
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);
366
367         gb_pm_runtime_put_autosuspend(bundle);
368
369         return ret;
370 }
371
372 static int __gb_lights_led_brightness_set(struct gb_channel *channel)
373 {
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;
377         bool old_active;
378         int ret;
379
380         mutex_lock(&channel->lock);
381         ret = gb_pm_runtime_get_sync(bundle);
382         if (ret < 0)
383                 goto out_unlock;
384
385         old_active = channel->active;
386
387         req.light_id = channel->light->id;
388         req.channel_id = channel->id;
389         req.brightness = (u8)channel->led->brightness;
390
391         ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_BRIGHTNESS,
392                                 &req, sizeof(req), NULL, 0);
393         if (ret < 0)
394                 goto out_pm_put;
395
396         if (channel->led->brightness)
397                 channel->active = true;
398         else
399                 channel->active = false;
400
401         /* we need to keep module alive when turning to active state */
402         if (!old_active && channel->active)
403                 goto out_unlock;
404
405         /*
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.
408          */
409         if (old_active && !channel->active)
410                 gb_pm_runtime_put_autosuspend(bundle);
411
412 out_pm_put:
413         gb_pm_runtime_put_autosuspend(bundle);
414 out_unlock:
415         mutex_unlock(&channel->lock);
416
417         return ret;
418 }
419
420 static int __gb_lights_brightness_set(struct gb_channel *channel)
421 {
422         int ret;
423
424         if (channel->releasing)
425                 return 0;
426
427         if (is_channel_flash(channel))
428                 ret = __gb_lights_flash_brightness_set(channel);
429         else
430                 ret = __gb_lights_led_brightness_set(channel);
431
432         return ret;
433 }
434
435 static int gb_brightness_set(struct led_classdev *cdev,
436                              enum led_brightness value)
437 {
438         struct gb_channel *channel = get_channel_from_cdev(cdev);
439
440         channel->led->brightness = value;
441
442         return __gb_lights_brightness_set(channel);
443 }
444
445 static enum led_brightness gb_brightness_get(struct led_classdev *cdev)
446
447 {
448         struct gb_channel *channel = get_channel_from_cdev(cdev);
449
450         return channel->led->brightness;
451 }
452
453 static int gb_blink_set(struct led_classdev *cdev, unsigned long *delay_on,
454                         unsigned long *delay_off)
455 {
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;
460         bool old_active;
461         int ret;
462
463         if (channel->releasing)
464                 return -ESHUTDOWN;
465
466         if (!delay_on || !delay_off)
467                 return -EINVAL;
468
469         mutex_lock(&channel->lock);
470         ret = gb_pm_runtime_get_sync(bundle);
471         if (ret < 0)
472                 goto out_unlock;
473
474         old_active = channel->active;
475
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);
480
481         ret = gb_operation_sync(connection, GB_LIGHTS_TYPE_SET_BLINK, &req,
482                                 sizeof(req), NULL, 0);
483         if (ret < 0)
484                 goto out_pm_put;
485
486         if (*delay_on)
487                 channel->active = true;
488         else
489                 channel->active = false;
490
491         /* we need to keep module alive when turning to active state */
492         if (!old_active && channel->active)
493                 goto out_unlock;
494
495         /*
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.
498          */
499         if (old_active && !channel->active)
500                 gb_pm_runtime_put_autosuspend(bundle);
501
502 out_pm_put:
503         gb_pm_runtime_put_autosuspend(bundle);
504 out_unlock:
505         mutex_unlock(&channel->lock);
506
507         return ret;
508 }
509
510 static void gb_lights_led_operations_set(struct gb_channel *channel,
511                                          struct led_classdev *cdev)
512 {
513         cdev->brightness_get = gb_brightness_get;
514         cdev->brightness_set_blocking = gb_brightness_set;
515
516         if (channel->flags & GB_LIGHT_CHANNEL_BLINK)
517                 cdev->blink_set = gb_blink_set;
518 }
519
520 #if IS_REACHABLE(CONFIG_V4L2_FLASH_LED_CLASS)
521 /* V4L2 specific helpers */
522 static const struct v4l2_flash_ops v4l2_flash_ops;
523
524 static void __gb_lights_channel_v4l2_config(struct led_flash_setting *channel_s,
525                                             struct led_flash_setting *v4l2_s)
526 {
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;
532 }
533
534 static int gb_lights_light_v4l2_register(struct gb_light *light)
535 {
536         struct gb_connection *connection = get_conn_from_light(light);
537         struct device *dev = &connection->bundle->dev;
538         struct v4l2_flash_config *sd_cfg;
539         struct led_classdev_flash *fled;
540         struct led_classdev_flash *iled = NULL;
541         struct gb_channel *channel_torch, *channel_ind, *channel_flash;
542         int ret = 0;
543
544         sd_cfg = kcalloc(1, sizeof(*sd_cfg), GFP_KERNEL);
545         if (!sd_cfg)
546                 return -ENOMEM;
547
548         channel_torch = get_channel_from_mode(light, GB_CHANNEL_MODE_TORCH);
549         if (channel_torch)
550                 __gb_lights_channel_v4l2_config(&channel_torch->intensity_uA,
551                                                 &sd_cfg->torch_intensity);
552
553         channel_ind = get_channel_from_mode(light, GB_CHANNEL_MODE_INDICATOR);
554         if (channel_ind) {
555                 __gb_lights_channel_v4l2_config(&channel_ind->intensity_uA,
556                                                 &sd_cfg->indicator_intensity);
557                 iled = &channel_ind->fled;
558         }
559
560         channel_flash = get_channel_from_mode(light, GB_CHANNEL_MODE_FLASH);
561         WARN_ON(!channel_flash);
562
563         fled = &channel_flash->fled;
564
565         snprintf(sd_cfg->dev_name, sizeof(sd_cfg->dev_name), "%s", light->name);
566
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;
573
574         light->v4l2_flash = v4l2_flash_init(dev, NULL, fled, iled,
575                                             &v4l2_flash_ops, sd_cfg);
576         if (IS_ERR_OR_NULL(light->v4l2_flash)) {
577                 ret = PTR_ERR(light->v4l2_flash);
578                 goto out_free;
579         }
580
581         return ret;
582
583 out_free:
584         kfree(sd_cfg);
585         return ret;
586 }
587
588 static void gb_lights_light_v4l2_unregister(struct gb_light *light)
589 {
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         ret = gb_lights_channel_flash_config(channel);
1003         if (ret < 0)
1004                 return ret;
1005
1006         return ret;
1007 }
1008
1009 static int gb_lights_light_config(struct gb_lights *glights, u8 id)
1010 {
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;
1014         int ret;
1015         int i;
1016
1017         light->glights = glights;
1018         light->id = id;
1019
1020         req.id = id;
1021
1022         ret = gb_operation_sync(glights->connection,
1023                                 GB_LIGHTS_TYPE_GET_LIGHT_CONFIG,
1024                                 &req, sizeof(req), &conf, sizeof(conf));
1025         if (ret < 0)
1026                 return ret;
1027
1028         if (!conf.channel_count)
1029                 return -EINVAL;
1030         if (!strlen(conf.name))
1031                 return -EINVAL;
1032
1033         light->channels_count = conf.channel_count;
1034         light->name = kstrndup(conf.name, NAMES_MAX, GFP_KERNEL);
1035
1036         light->channels = kzalloc(light->channels_count *
1037                                   sizeof(struct gb_channel), GFP_KERNEL);
1038         if (!light->channels)
1039                 return -ENOMEM;
1040
1041         /* First we collect all the configurations for all channels */
1042         for (i = 0; i < light->channels_count; i++) {
1043                 light->channels[i].id = i;
1044                 ret = gb_lights_channel_config(light, &light->channels[i]);
1045                 if (ret < 0)
1046                         return ret;
1047         }
1048
1049         return 0;
1050 }
1051
1052 static int gb_lights_light_register(struct gb_light *light)
1053 {
1054         int ret;
1055         int i;
1056
1057         /*
1058          * Then, if everything went ok in getting configurations, we register
1059          * the classdev, flash classdev and v4l2 subsystem, if a flash device is
1060          * found.
1061          */
1062         for (i = 0; i < light->channels_count; i++) {
1063                 ret = gb_lights_channel_register(&light->channels[i]);
1064                 if (ret < 0)
1065                         return ret;
1066
1067                 mutex_init(&light->channels[i].lock);
1068         }
1069
1070         light->ready = true;
1071
1072         if (light->has_flash) {
1073                 ret = gb_lights_light_v4l2_register(light);
1074                 if (ret < 0) {
1075                         light->has_flash = false;
1076                         return ret;
1077                 }
1078         }
1079
1080         return 0;
1081 }
1082
1083 static void gb_lights_channel_free(struct gb_channel *channel)
1084 {
1085         kfree(channel->attrs);
1086         kfree(channel->attr_group);
1087         kfree(channel->attr_groups);
1088         kfree(channel->color_name);
1089         kfree(channel->mode_name);
1090         mutex_destroy(&channel->lock);
1091 }
1092
1093 static void gb_lights_channel_release(struct gb_channel *channel)
1094 {
1095         channel->releasing = true;
1096
1097         gb_lights_channel_unregister(channel);
1098
1099         gb_lights_channel_free(channel);
1100 }
1101
1102 static void gb_lights_light_release(struct gb_light *light)
1103 {
1104         int i;
1105
1106         light->ready = false;
1107
1108         if (light->has_flash)
1109                 gb_lights_light_v4l2_unregister(light);
1110         light->has_flash = false;
1111
1112         for (i = 0; i < light->channels_count; i++)
1113                 gb_lights_channel_release(&light->channels[i]);
1114         light->channels_count = 0;
1115
1116         kfree(light->channels);
1117         light->channels = NULL;
1118         kfree(light->name);
1119         light->name = NULL;
1120 }
1121
1122 static void gb_lights_release(struct gb_lights *glights)
1123 {
1124         int i;
1125
1126         if (!glights)
1127                 return;
1128
1129         mutex_lock(&glights->lights_lock);
1130         if (!glights->lights)
1131                 goto free_glights;
1132
1133         for (i = 0; i < glights->lights_count; i++)
1134                 gb_lights_light_release(&glights->lights[i]);
1135
1136         kfree(glights->lights);
1137
1138 free_glights:
1139         mutex_unlock(&glights->lights_lock);
1140         mutex_destroy(&glights->lights_lock);
1141         kfree(glights);
1142 }
1143
1144 static int gb_lights_get_count(struct gb_lights *glights)
1145 {
1146         struct gb_lights_get_lights_response resp;
1147         int ret;
1148
1149         ret = gb_operation_sync(glights->connection, GB_LIGHTS_TYPE_GET_LIGHTS,
1150                                 NULL, 0, &resp, sizeof(resp));
1151         if (ret < 0)
1152                 return ret;
1153
1154         if (!resp.lights_count)
1155                 return -EINVAL;
1156
1157         glights->lights_count = resp.lights_count;
1158
1159         return 0;
1160 }
1161
1162 static int gb_lights_create_all(struct gb_lights *glights)
1163 {
1164         struct gb_connection *connection = glights->connection;
1165         int ret;
1166         int i;
1167
1168         mutex_lock(&glights->lights_lock);
1169         ret = gb_lights_get_count(glights);
1170         if (ret < 0)
1171                 goto out;
1172
1173         glights->lights = kzalloc(glights->lights_count *
1174                                   sizeof(struct gb_light), GFP_KERNEL);
1175         if (!glights->lights) {
1176                 ret = -ENOMEM;
1177                 goto out;
1178         }
1179
1180         for (i = 0; i < glights->lights_count; i++) {
1181                 ret = gb_lights_light_config(glights, i);
1182                 if (ret < 0) {
1183                         dev_err(&connection->bundle->dev,
1184                                 "Fail to configure lights device\n");
1185                         goto out;
1186                 }
1187         }
1188
1189 out:
1190         mutex_unlock(&glights->lights_lock);
1191         return ret;
1192 }
1193
1194 static int gb_lights_register_all(struct gb_lights *glights)
1195 {
1196         struct gb_connection *connection = glights->connection;
1197         int ret = 0;
1198         int i;
1199
1200         mutex_lock(&glights->lights_lock);
1201         for (i = 0; i < glights->lights_count; i++) {
1202                 ret = gb_lights_light_register(&glights->lights[i]);
1203                 if (ret < 0) {
1204                         dev_err(&connection->bundle->dev,
1205                                 "Fail to enable lights device\n");
1206                         break;
1207                 }
1208         }
1209
1210         mutex_unlock(&glights->lights_lock);
1211         return ret;
1212 }
1213
1214 static int gb_lights_request_handler(struct gb_operation *op)
1215 {
1216         struct gb_connection *connection = op->connection;
1217         struct device *dev = &connection->bundle->dev;
1218         struct gb_lights *glights = gb_connection_get_data(connection);
1219         struct gb_light *light;
1220         struct gb_message *request;
1221         struct gb_lights_event_request *payload;
1222         int ret =  0;
1223         u8 light_id;
1224         u8 event;
1225
1226         if (op->type != GB_LIGHTS_TYPE_EVENT) {
1227                 dev_err(dev, "Unsupported unsolicited event: %u\n", op->type);
1228                 return -EINVAL;
1229         }
1230
1231         request = op->request;
1232
1233         if (request->payload_size < sizeof(*payload)) {
1234                 dev_err(dev, "Wrong event size received (%zu < %zu)\n",
1235                         request->payload_size, sizeof(*payload));
1236                 return -EINVAL;
1237         }
1238
1239         payload = request->payload;
1240         light_id = payload->light_id;
1241
1242         if (light_id >= glights->lights_count ||
1243             !glights->lights[light_id].ready) {
1244                 dev_err(dev, "Event received for unconfigured light id: %d\n",
1245                         light_id);
1246                 return -EINVAL;
1247         }
1248
1249         event = payload->event;
1250
1251         if (event & GB_LIGHTS_LIGHT_CONFIG) {
1252                 light = &glights->lights[light_id];
1253
1254                 mutex_lock(&glights->lights_lock);
1255                 gb_lights_light_release(light);
1256                 ret = gb_lights_light_config(glights, light_id);
1257                 if (!ret)
1258                         ret = gb_lights_light_register(light);
1259                 if (ret < 0)
1260                         gb_lights_light_release(light);
1261                 mutex_unlock(&glights->lights_lock);
1262         }
1263
1264         return ret;
1265 }
1266
1267 static int gb_lights_probe(struct gb_bundle *bundle,
1268                            const struct greybus_bundle_id *id)
1269 {
1270         struct greybus_descriptor_cport *cport_desc;
1271         struct gb_connection *connection;
1272         struct gb_lights *glights;
1273         int ret;
1274
1275         if (bundle->num_cports != 1)
1276                 return -ENODEV;
1277
1278         cport_desc = &bundle->cport_desc[0];
1279         if (cport_desc->protocol_id != GREYBUS_PROTOCOL_LIGHTS)
1280                 return -ENODEV;
1281
1282         glights = kzalloc(sizeof(*glights), GFP_KERNEL);
1283         if (!glights)
1284                 return -ENOMEM;
1285
1286         mutex_init(&glights->lights_lock);
1287
1288         connection = gb_connection_create(bundle, le16_to_cpu(cport_desc->id),
1289                                           gb_lights_request_handler);
1290         if (IS_ERR(connection)) {
1291                 ret = PTR_ERR(connection);
1292                 goto out;
1293         }
1294
1295         glights->connection = connection;
1296         gb_connection_set_data(connection, glights);
1297
1298         greybus_set_drvdata(bundle, glights);
1299
1300         /* We aren't ready to receive an incoming request yet */
1301         ret = gb_connection_enable_tx(connection);
1302         if (ret)
1303                 goto error_connection_destroy;
1304
1305         /*
1306          * Setup all the lights devices over this connection, if anything goes
1307          * wrong tear down all lights
1308          */
1309         ret = gb_lights_create_all(glights);
1310         if (ret < 0)
1311                 goto error_connection_disable;
1312
1313         /* We are ready to receive an incoming request now, enable RX as well */
1314         ret = gb_connection_enable(connection);
1315         if (ret)
1316                 goto error_connection_disable;
1317
1318         /* Enable & register lights */
1319         ret = gb_lights_register_all(glights);
1320         if (ret < 0)
1321                 goto error_connection_disable;
1322
1323         gb_pm_runtime_put_autosuspend(bundle);
1324
1325         return 0;
1326
1327 error_connection_disable:
1328         gb_connection_disable(connection);
1329 error_connection_destroy:
1330         gb_connection_destroy(connection);
1331 out:
1332         gb_lights_release(glights);
1333         return ret;
1334 }
1335
1336 static void gb_lights_disconnect(struct gb_bundle *bundle)
1337 {
1338         struct gb_lights *glights = greybus_get_drvdata(bundle);
1339
1340         if (gb_pm_runtime_get_sync(bundle))
1341                 gb_pm_runtime_get_noresume(bundle);
1342
1343         gb_connection_disable(glights->connection);
1344         gb_connection_destroy(glights->connection);
1345
1346         gb_lights_release(glights);
1347 }
1348
1349 static const struct greybus_bundle_id gb_lights_id_table[] = {
1350         { GREYBUS_DEVICE_CLASS(GREYBUS_CLASS_LIGHTS) },
1351         { }
1352 };
1353 MODULE_DEVICE_TABLE(greybus, gb_lights_id_table);
1354
1355 static struct greybus_driver gb_lights_driver = {
1356         .name           = "lights",
1357         .probe          = gb_lights_probe,
1358         .disconnect     = gb_lights_disconnect,
1359         .id_table       = gb_lights_id_table,
1360 };
1361 module_greybus_driver(gb_lights_driver);
1362
1363 MODULE_LICENSE("GPL v2");