1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * V4L2 flash LED sub-device registration helpers.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2015 Samsung Electronics Co., Ltd
6*4882a593Smuzhiyun * Author: Jacek Anaszewski <j.anaszewski@samsung.com>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #ifndef _V4L2_FLASH_H
10*4882a593Smuzhiyun #define _V4L2_FLASH_H
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #include <media/v4l2-ctrls.h>
13*4882a593Smuzhiyun #include <media/v4l2-subdev.h>
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun struct led_classdev_flash;
16*4882a593Smuzhiyun struct led_classdev;
17*4882a593Smuzhiyun struct v4l2_flash;
18*4882a593Smuzhiyun enum led_brightness;
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun /**
21*4882a593Smuzhiyun * struct v4l2_flash_ctrl_data - flash control initialization data, filled
22*4882a593Smuzhiyun * basing on the features declared by the LED flash
23*4882a593Smuzhiyun * class driver in the v4l2_flash_config
24*4882a593Smuzhiyun * @config: initialization data for a control
25*4882a593Smuzhiyun * @cid: contains v4l2 flash control id if the config
26*4882a593Smuzhiyun * field was initialized, 0 otherwise
27*4882a593Smuzhiyun */
28*4882a593Smuzhiyun struct v4l2_flash_ctrl_data {
29*4882a593Smuzhiyun struct v4l2_ctrl_config config;
30*4882a593Smuzhiyun u32 cid;
31*4882a593Smuzhiyun };
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun /**
34*4882a593Smuzhiyun * struct v4l2_flash_ops - V4L2 flash operations
35*4882a593Smuzhiyun *
36*4882a593Smuzhiyun * @external_strobe_set: Setup strobing the flash by hardware pin state
37*4882a593Smuzhiyun * assertion.
38*4882a593Smuzhiyun * @intensity_to_led_brightness: Convert intensity to brightness in a device
39*4882a593Smuzhiyun * specific manner
40*4882a593Smuzhiyun * @led_brightness_to_intensity: convert brightness to intensity in a device
41*4882a593Smuzhiyun * specific manner.
42*4882a593Smuzhiyun */
43*4882a593Smuzhiyun struct v4l2_flash_ops {
44*4882a593Smuzhiyun int (*external_strobe_set)(struct v4l2_flash *v4l2_flash,
45*4882a593Smuzhiyun bool enable);
46*4882a593Smuzhiyun enum led_brightness (*intensity_to_led_brightness)
47*4882a593Smuzhiyun (struct v4l2_flash *v4l2_flash, s32 intensity);
48*4882a593Smuzhiyun s32 (*led_brightness_to_intensity)
49*4882a593Smuzhiyun (struct v4l2_flash *v4l2_flash, enum led_brightness);
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun /**
53*4882a593Smuzhiyun * struct v4l2_flash_config - V4L2 Flash sub-device initialization data
54*4882a593Smuzhiyun * @dev_name: the name of the media entity,
55*4882a593Smuzhiyun * unique in the system
56*4882a593Smuzhiyun * @intensity: non-flash strobe constraints for the LED
57*4882a593Smuzhiyun * @flash_faults: bitmask of flash faults that the LED flash class
58*4882a593Smuzhiyun * device can report; corresponding LED_FAULT* bit
59*4882a593Smuzhiyun * definitions are available in the header file
60*4882a593Smuzhiyun * <linux/led-class-flash.h>
61*4882a593Smuzhiyun * @has_external_strobe: external strobe capability
62*4882a593Smuzhiyun */
63*4882a593Smuzhiyun struct v4l2_flash_config {
64*4882a593Smuzhiyun char dev_name[32];
65*4882a593Smuzhiyun struct led_flash_setting intensity;
66*4882a593Smuzhiyun u32 flash_faults;
67*4882a593Smuzhiyun unsigned int has_external_strobe:1;
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun /**
71*4882a593Smuzhiyun * struct v4l2_flash - Flash sub-device context
72*4882a593Smuzhiyun * @fled_cdev: LED flash class device controlled by this sub-device
73*4882a593Smuzhiyun * @iled_cdev: LED class device representing indicator LED associated
74*4882a593Smuzhiyun * with the LED flash class device
75*4882a593Smuzhiyun * @ops: V4L2 specific flash ops
76*4882a593Smuzhiyun * @sd: V4L2 sub-device
77*4882a593Smuzhiyun * @hdl: flash controls handler
78*4882a593Smuzhiyun * @ctrls: array of pointers to controls, whose values define
79*4882a593Smuzhiyun * the sub-device state
80*4882a593Smuzhiyun */
81*4882a593Smuzhiyun struct v4l2_flash {
82*4882a593Smuzhiyun struct led_classdev_flash *fled_cdev;
83*4882a593Smuzhiyun struct led_classdev *iled_cdev;
84*4882a593Smuzhiyun const struct v4l2_flash_ops *ops;
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun struct v4l2_subdev sd;
87*4882a593Smuzhiyun struct v4l2_ctrl_handler hdl;
88*4882a593Smuzhiyun struct v4l2_ctrl **ctrls;
89*4882a593Smuzhiyun };
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun /**
92*4882a593Smuzhiyun * v4l2_subdev_to_v4l2_flash - Returns a &struct v4l2_flash from the
93*4882a593Smuzhiyun * &struct v4l2_subdev embedded on it.
94*4882a593Smuzhiyun *
95*4882a593Smuzhiyun * @sd: pointer to &struct v4l2_subdev
96*4882a593Smuzhiyun */
v4l2_subdev_to_v4l2_flash(struct v4l2_subdev * sd)97*4882a593Smuzhiyun static inline struct v4l2_flash *v4l2_subdev_to_v4l2_flash(
98*4882a593Smuzhiyun struct v4l2_subdev *sd)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun return container_of(sd, struct v4l2_flash, sd);
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun /**
104*4882a593Smuzhiyun * v4l2_ctrl_to_v4l2_flash - Returns a &struct v4l2_flash from the
105*4882a593Smuzhiyun * &struct v4l2_ctrl embedded on it.
106*4882a593Smuzhiyun *
107*4882a593Smuzhiyun * @c: pointer to &struct v4l2_ctrl
108*4882a593Smuzhiyun */
v4l2_ctrl_to_v4l2_flash(struct v4l2_ctrl * c)109*4882a593Smuzhiyun static inline struct v4l2_flash *v4l2_ctrl_to_v4l2_flash(struct v4l2_ctrl *c)
110*4882a593Smuzhiyun {
111*4882a593Smuzhiyun return container_of(c->handler, struct v4l2_flash, hdl);
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_V4L2_FLASH_LED_CLASS)
115*4882a593Smuzhiyun /**
116*4882a593Smuzhiyun * v4l2_flash_init - initialize V4L2 flash led sub-device
117*4882a593Smuzhiyun * @dev: flash device, e.g. an I2C device
118*4882a593Smuzhiyun * @fwn: fwnode_handle of the LED, may be NULL if the same as device's
119*4882a593Smuzhiyun * @fled_cdev: LED flash class device to wrap
120*4882a593Smuzhiyun * @ops: V4L2 Flash device ops
121*4882a593Smuzhiyun * @config: initialization data for V4L2 Flash sub-device
122*4882a593Smuzhiyun *
123*4882a593Smuzhiyun * Create V4L2 Flash sub-device wrapping given LED subsystem device.
124*4882a593Smuzhiyun * The ops pointer is stored by the V4L2 flash framework. No
125*4882a593Smuzhiyun * references are held to config nor its contents once this function
126*4882a593Smuzhiyun * has returned.
127*4882a593Smuzhiyun *
128*4882a593Smuzhiyun * Returns: A valid pointer, or, when an error occurs, the return
129*4882a593Smuzhiyun * value is encoded using ERR_PTR(). Use IS_ERR() to check and
130*4882a593Smuzhiyun * PTR_ERR() to obtain the numeric return value.
131*4882a593Smuzhiyun */
132*4882a593Smuzhiyun struct v4l2_flash *v4l2_flash_init(
133*4882a593Smuzhiyun struct device *dev, struct fwnode_handle *fwn,
134*4882a593Smuzhiyun struct led_classdev_flash *fled_cdev,
135*4882a593Smuzhiyun const struct v4l2_flash_ops *ops, struct v4l2_flash_config *config);
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun /**
138*4882a593Smuzhiyun * v4l2_flash_indicator_init - initialize V4L2 indicator sub-device
139*4882a593Smuzhiyun * @dev: flash device, e.g. an I2C device
140*4882a593Smuzhiyun * @fwn: fwnode_handle of the LED, may be NULL if the same as device's
141*4882a593Smuzhiyun * @iled_cdev: LED flash class device representing the indicator LED
142*4882a593Smuzhiyun * @config: initialization data for V4L2 Flash sub-device
143*4882a593Smuzhiyun *
144*4882a593Smuzhiyun * Create V4L2 Flash sub-device wrapping given LED subsystem device.
145*4882a593Smuzhiyun * The ops pointer is stored by the V4L2 flash framework. No
146*4882a593Smuzhiyun * references are held to config nor its contents once this function
147*4882a593Smuzhiyun * has returned.
148*4882a593Smuzhiyun *
149*4882a593Smuzhiyun * Returns: A valid pointer, or, when an error occurs, the return
150*4882a593Smuzhiyun * value is encoded using ERR_PTR(). Use IS_ERR() to check and
151*4882a593Smuzhiyun * PTR_ERR() to obtain the numeric return value.
152*4882a593Smuzhiyun */
153*4882a593Smuzhiyun struct v4l2_flash *v4l2_flash_indicator_init(
154*4882a593Smuzhiyun struct device *dev, struct fwnode_handle *fwn,
155*4882a593Smuzhiyun struct led_classdev *iled_cdev, struct v4l2_flash_config *config);
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun /**
158*4882a593Smuzhiyun * v4l2_flash_release - release V4L2 Flash sub-device
159*4882a593Smuzhiyun * @v4l2_flash: the V4L2 Flash sub-device to release
160*4882a593Smuzhiyun *
161*4882a593Smuzhiyun * Release V4L2 Flash sub-device.
162*4882a593Smuzhiyun */
163*4882a593Smuzhiyun void v4l2_flash_release(struct v4l2_flash *v4l2_flash);
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun #else
v4l2_flash_init(struct device * dev,struct fwnode_handle * fwn,struct led_classdev_flash * fled_cdev,const struct v4l2_flash_ops * ops,struct v4l2_flash_config * config)166*4882a593Smuzhiyun static inline struct v4l2_flash *v4l2_flash_init(
167*4882a593Smuzhiyun struct device *dev, struct fwnode_handle *fwn,
168*4882a593Smuzhiyun struct led_classdev_flash *fled_cdev,
169*4882a593Smuzhiyun const struct v4l2_flash_ops *ops, struct v4l2_flash_config *config)
170*4882a593Smuzhiyun {
171*4882a593Smuzhiyun return NULL;
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun
v4l2_flash_indicator_init(struct device * dev,struct fwnode_handle * fwn,struct led_classdev * iled_cdev,struct v4l2_flash_config * config)174*4882a593Smuzhiyun static inline struct v4l2_flash *v4l2_flash_indicator_init(
175*4882a593Smuzhiyun struct device *dev, struct fwnode_handle *fwn,
176*4882a593Smuzhiyun struct led_classdev *iled_cdev, struct v4l2_flash_config *config)
177*4882a593Smuzhiyun {
178*4882a593Smuzhiyun return NULL;
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun
v4l2_flash_release(struct v4l2_flash * v4l2_flash)181*4882a593Smuzhiyun static inline void v4l2_flash_release(struct v4l2_flash *v4l2_flash)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun }
184*4882a593Smuzhiyun #endif /* CONFIG_V4L2_FLASH_LED_CLASS */
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun #endif /* _V4L2_FLASH_H */
187