Lines Matching refs:channel

65 static void gb_lights_channel_free(struct gb_channel *channel);
67 static struct gb_connection *get_conn_from_channel(struct gb_channel *channel)
69 return channel->light->glights->connection;
77 static bool is_channel_flash(struct gb_channel *channel)
79 return !!(channel->mode & (GB_CHANNEL_MODE_FLASH | GB_CHANNEL_MODE_TORCH
90 static struct led_classdev *get_channel_cdev(struct gb_channel *channel)
92 return &channel->fled.led_cdev;
98 struct gb_channel *channel;
102 channel = &light->channels[i];
103 if (channel->mode == mode)
104 return channel;
109 static int __gb_lights_flash_intensity_set(struct gb_channel *channel,
112 struct gb_connection *connection = get_conn_from_channel(channel);
117 if (channel->releasing)
124 req.light_id = channel->light->id;
125 req.channel_id = channel->id;
136 static int __gb_lights_flash_brightness_set(struct gb_channel *channel)
140 /* If the channel is flash we need to get the attached torch channel */
141 if (channel->mode & GB_CHANNEL_MODE_FLASH)
142 channel = get_channel_from_mode(channel->light,
146 intensity = channel->intensity_uA.min +
147 (channel->intensity_uA.step * channel->led->brightness);
149 return __gb_lights_flash_intensity_set(channel, intensity);
152 static int gb_lights_color_set(struct gb_channel *channel, u32 color);
153 static int gb_lights_fade_set(struct gb_channel *channel);
171 struct gb_channel *channel = get_channel_from_cdev(cdev); \
173 return sprintf(buf, "%u\n", channel->fade_##__dir); \
181 struct gb_channel *channel = get_channel_from_cdev(cdev); \
196 if (channel->fade_##__dir == fade) \
198 channel->fade_##__dir = fade; \
200 ret = gb_lights_fade_set(channel); \
218 struct gb_channel *channel = get_channel_from_cdev(cdev);
220 return sprintf(buf, "0x%08x\n", channel->color);
227 struct gb_channel *channel = get_channel_from_cdev(cdev);
242 ret = gb_lights_color_set(channel, color);
246 channel->color = color;
254 static int channel_attr_groups_set(struct gb_channel *channel,
260 if (channel->flags & GB_LIGHT_CHANNEL_MULTICOLOR)
262 if (channel->flags & GB_LIGHT_CHANNEL_FADER)
268 /* Set attributes based in the channel flags */
269 channel->attrs = kcalloc(size + 1, sizeof(*channel->attrs), GFP_KERNEL);
270 if (!channel->attrs)
272 channel->attr_group = kzalloc(sizeof(*channel->attr_group), GFP_KERNEL);
273 if (!channel->attr_group)
275 channel->attr_groups = kcalloc(2, sizeof(*channel->attr_groups),
277 if (!channel->attr_groups)
280 if (channel->flags & GB_LIGHT_CHANNEL_MULTICOLOR)
281 channel->attrs[attr++] = &dev_attr_color.attr;
282 if (channel->flags & GB_LIGHT_CHANNEL_FADER) {
283 channel->attrs[attr++] = &dev_attr_fade_in.attr;
284 channel->attrs[attr++] = &dev_attr_fade_out.attr;
287 channel->attr_group->attrs = channel->attrs;
289 channel->attr_groups[0] = channel->attr_group;
291 cdev->groups = channel->attr_groups;
296 static int gb_lights_fade_set(struct gb_channel *channel)
298 struct gb_connection *connection = get_conn_from_channel(channel);
303 if (channel->releasing)
310 req.light_id = channel->light->id;
311 req.channel_id = channel->id;
312 req.fade_in = channel->fade_in;
313 req.fade_out = channel->fade_out;
322 static int gb_lights_color_set(struct gb_channel *channel, u32 color)
324 struct gb_connection *connection = get_conn_from_channel(channel);
329 if (channel->releasing)
336 req.light_id = channel->light->id;
337 req.channel_id = channel->id;
347 static int __gb_lights_led_brightness_set(struct gb_channel *channel)
350 struct gb_connection *connection = get_conn_from_channel(channel);
355 mutex_lock(&channel->lock);
360 old_active = channel->active;
362 req.light_id = channel->light->id;
363 req.channel_id = channel->id;
364 req.brightness = (u8)channel->led->brightness;
371 if (channel->led->brightness)
372 channel->active = true;
374 channel->active = false;
377 if (!old_active && channel->active)
384 if (old_active && !channel->active)
390 mutex_unlock(&channel->lock);
395 static int __gb_lights_brightness_set(struct gb_channel *channel)
399 if (channel->releasing)
402 if (is_channel_flash(channel))
403 ret = __gb_lights_flash_brightness_set(channel);
405 ret = __gb_lights_led_brightness_set(channel);
413 struct gb_channel *channel = get_channel_from_cdev(cdev);
415 channel->led->brightness = value;
417 return __gb_lights_brightness_set(channel);
423 struct gb_channel *channel = get_channel_from_cdev(cdev);
425 return channel->led->brightness;
431 struct gb_channel *channel = get_channel_from_cdev(cdev);
432 struct gb_connection *connection = get_conn_from_channel(channel);
438 if (channel->releasing)
444 mutex_lock(&channel->lock);
449 old_active = channel->active;
451 req.light_id = channel->light->id;
452 req.channel_id = channel->id;
462 channel->active = true;
464 channel->active = false;
467 if (!old_active && channel->active)
474 if (old_active && !channel->active)
480 mutex_unlock(&channel->lock);
485 static void gb_lights_led_operations_set(struct gb_channel *channel,
491 if (channel->flags & GB_LIGHT_CHANNEL_BLINK)
587 struct gb_channel *channel = container_of(fcdev, struct gb_channel,
591 ret = __gb_lights_flash_intensity_set(channel, brightness);
611 struct gb_channel *channel = container_of(fcdev, struct gb_channel,
613 struct gb_connection *connection = get_conn_from_channel(channel);
618 if (channel->releasing)
625 req.light_id = channel->light->id;
626 req.channel_id = channel->id;
632 channel->strobe_state = state;
642 struct gb_channel *channel = container_of(fcdev, struct gb_channel,
645 *state = channel->strobe_state;
652 struct gb_channel *channel = container_of(fcdev, struct gb_channel,
654 struct gb_connection *connection = get_conn_from_channel(channel);
659 if (channel->releasing)
666 req.light_id = channel->light->id;
667 req.channel_id = channel->id;
683 struct gb_channel *channel = container_of(fcdev, struct gb_channel,
685 struct gb_connection *connection = get_conn_from_channel(channel);
691 if (channel->releasing)
698 req.light_id = channel->light->id;
699 req.channel_id = channel->id;
720 static int __gb_lights_channel_torch_attach(struct gb_channel *channel,
725 /* we can only attach torch to a flash channel */
726 if (!(channel->mode & GB_CHANNEL_MODE_FLASH))
730 channel->led->max_brightness = channel_torch->led->max_brightness;
733 name = kasprintf(GFP_KERNEL, "%s_%s", channel->led->name,
737 kfree(channel->led->name);
738 channel->led->name = name;
740 channel_torch->led = channel->led;
745 static int __gb_lights_flash_led_register(struct gb_channel *channel)
747 struct gb_connection *connection = get_conn_from_channel(channel);
748 struct led_classdev_flash *fled = &channel->fled;
758 fset->min = channel->intensity_uA.min;
759 fset->max = channel->intensity_uA.max;
760 fset->step = channel->intensity_uA.step;
761 fset->val = channel->intensity_uA.max;
764 if (channel->mode & GB_CHANNEL_MODE_FLASH) {
766 fset->min = channel->timeout_us.min;
767 fset->max = channel->timeout_us.max;
768 fset->step = channel->timeout_us.step;
769 fset->val = channel->timeout_us.max;
773 * If light have torch mode channel, this channel will be the led
776 channel_torch = get_channel_from_mode(channel->light,
779 ret = __gb_lights_channel_torch_attach(channel, channel_torch);
788 channel->is_registered = true;
791 channel->led = NULL;
795 static void __gb_lights_flash_led_unregister(struct gb_channel *channel)
797 if (!channel->is_registered)
800 led_classdev_flash_unregister(&channel->fled);
803 static int gb_lights_channel_flash_config(struct gb_channel *channel)
805 struct gb_connection *connection = get_conn_from_channel(channel);
811 req.light_id = channel->light->id;
812 req.channel_id = channel->id;
824 fset = &channel->intensity_uA;
833 channel->led->max_brightness = (fset->max - fset->min) / fset->step;
836 if (channel->mode & GB_CHANNEL_MODE_FLASH) {
837 fset = &channel->timeout_us;
846 static int gb_lights_channel_flash_config(struct gb_channel *channel)
848 struct gb_connection *connection = get_conn_from_channel(channel);
854 static int __gb_lights_flash_led_register(struct gb_channel *channel)
859 static void __gb_lights_flash_led_unregister(struct gb_channel *channel)
865 static int __gb_lights_led_register(struct gb_channel *channel)
867 struct gb_connection *connection = get_conn_from_channel(channel);
868 struct led_classdev *cdev = get_channel_cdev(channel);
873 channel->led = NULL;
875 channel->is_registered = true;
879 static int gb_lights_channel_register(struct gb_channel *channel)
881 /* Normal LED channel, just register in led classdev and we are done */
882 if (!is_channel_flash(channel))
883 return __gb_lights_led_register(channel);
889 if (!(channel->mode & GB_CHANNEL_MODE_TORCH))
890 return __gb_lights_flash_led_register(channel);
895 static void __gb_lights_led_unregister(struct gb_channel *channel)
897 struct led_classdev *cdev = get_channel_cdev(channel);
899 if (!channel->is_registered)
905 channel->led = NULL;
908 static void gb_lights_channel_unregister(struct gb_channel *channel)
911 if (!is_channel_flash(channel)) {
912 __gb_lights_led_unregister(channel);
916 if (channel->mode & GB_CHANNEL_MODE_TORCH)
917 __gb_lights_led_unregister(channel);
919 __gb_lights_flash_led_unregister(channel);
923 struct gb_channel *channel)
928 struct led_classdev *cdev = get_channel_cdev(channel);
933 req.channel_id = channel->id;
940 channel->light = light;
941 channel->mode = le32_to_cpu(conf.mode);
942 channel->flags = le32_to_cpu(conf.flags);
943 channel->color = le32_to_cpu(conf.color);
944 channel->color_name = kstrndup(conf.color_name, NAMES_MAX, GFP_KERNEL);
945 if (!channel->color_name)
947 channel->mode_name = kstrndup(conf.mode_name, NAMES_MAX, GFP_KERNEL);
948 if (!channel->mode_name)
951 channel->led = cdev;
954 channel->color_name, channel->mode_name);
962 ret = channel_attr_groups_set(channel, cdev);
966 gb_lights_led_operations_set(channel, cdev);
969 * If it is not a flash related channel (flash, torch or indicator) we
973 if (!is_channel_flash(channel))
978 return gb_lights_channel_flash_config(channel);
1056 static void gb_lights_channel_free(struct gb_channel *channel)
1058 kfree(channel->attrs);
1059 kfree(channel->attr_group);
1060 kfree(channel->attr_groups);
1061 kfree(channel->color_name);
1062 kfree(channel->mode_name);
1063 mutex_destroy(&channel->lock);
1066 static void gb_lights_channel_release(struct gb_channel *channel)
1068 channel->releasing = true;
1070 gb_lights_channel_unregister(channel);
1072 gb_lights_channel_free(channel);