media: video: tegra: max77387 flash device bringup
[linux-3.10.git] / include / media / nvc.h
1 /* Copyright (c) 2012 - 2013, NVIDIA CORPORATION.  All rights reserved.
2
3  * This program is free software; you can redistribute it and/or modify it
4  * under the terms and conditions of the GNU General Public License,
5  * version 2, as published by the Free Software Foundation.
6
7  * This program is distributed in the hope it will be useful, but WITHOUT
8  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
10  * more details.
11
12  * You should have received a copy of the GNU General Public License
13  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
14  */
15
16 #ifndef __NVC_H__
17 #define __NVC_H__
18
19 #include <linux/ioctl.h>
20
21 #define NVC_INT2FLOAT_DIVISOR_1K        1000
22 #define NVC_INT2FLOAT_DIVISOR_1M        1000000
23 #define NVC_INT2FLOAT_DIVISOR           1000
24
25 struct nvc_param {
26         int param;
27         __u32 sizeofvalue;
28         __u32 variant;
29         void *p_value;
30 } __packed;
31
32 enum nvc_params {
33         NVC_PARAM_EXPOSURE = 0,
34         NVC_PARAM_GAIN,
35         NVC_PARAM_FRAMERATE,
36         NVC_PARAM_MAX_FRAMERATE,
37         NVC_PARAM_INPUT_CLOCK,
38         NVC_PARAM_LOCUS,
39         NVC_PARAM_FLASH_CAPS,
40         NVC_PARAM_FLASH_LEVEL,
41         NVC_PARAM_FLASH_PIN_STATE,
42         NVC_PARAM_TORCH_CAPS,
43         NVC_PARAM_TORCH_LEVEL,
44         NVC_PARAM_FOCAL_LEN,
45         NVC_PARAM_MAX_APERTURE,
46         NVC_PARAM_FNUMBER,
47         NVC_PARAM_EXPOSURE_LIMITS,
48         NVC_PARAM_GAIN_LIMITS,
49         NVC_PARAM_FRAMERATE_LIMITS,
50         NVC_PARAM_FRAME_RATES,
51         NVC_PARAM_CLOCK_LIMITS,
52         NVC_PARAM_EXP_LATCH_TIME,
53         NVC_PARAM_REGION_USED,
54         NVC_PARAM_CALIBRATION_DATA,
55         NVC_PARAM_CALIBRATION_OVERRIDES,
56         NVC_PARAM_SELF_TEST,
57         NVC_PARAM_STS,
58         NVC_PARAM_TESTMODE,
59         NVC_PARAM_EXPECTED_VALUES,
60         NVC_PARAM_RESET,
61         NVC_PARAM_OPTIMIZE_RES,
62         NVC_PARAM_DETECT_COLOR_TEMP,
63         NVC_PARAM_LINES_PER_SEC,
64         NVC_PARAM_CAPS,
65         NVC_PARAM_CUSTOM_BLOCK_INFO,
66         NVC_PARAM_STEREO_CAP,
67         NVC_PARAM_FOCUS_STEREO,
68         NVC_PARAM_STEREO,
69         NVC_PARAM_INHERENT_GAIN,
70         NVC_PARAM_VIEW_ANGLE_H,
71         NVC_PARAM_VIEW_ANGLE_V,
72         NVC_PARAM_ISP_SETTING,
73         NVC_PARAM_OPERATION_MODE,
74         NVC_PARAM_SUPPORT_ISP,
75         NVC_PARAM_AWB_LOCK,
76         NVC_PARAM_AE_LOCK,
77         NVC_PARAM_RES_CHANGE_WAIT_TIME,
78         NVC_PARAM_FACTORY_CALIBRATION_DATA,
79         NVC_PARAM_DEV_ID,
80         NVC_PARAM_GROUP_HOLD,
81         NVC_PARAM_SET_SENSOR_FLASH_MODE,
82         NVC_PARAM_TORCH_QUERY,
83         NVC_PARAM_FLASH_EXT_CAPS,
84         NVC_PARAM_TORCH_EXT_CAPS,
85         NVC_PARAM_BEGIN_VENDOR_EXTENSIONS = 0x10000000,
86         NVC_PARAM_CALIBRATION_STATUS,
87         NVC_PARAM_TEST_PATTERN,
88         NVC_PARAM_MODULE_INFO,
89         NVC_PARAM_FLASH_MAX_POWER,
90         NVC_PARAM_DIRECTION,
91         NVC_PARAM_SENSOR_TYPE,
92         NVC_PARAM_DLI_CHECK,
93         NVC_PARAM_PARALLEL_DLI_CHECK,
94         NVC_PARAM_BRACKET_CAPS,
95         NVC_PARAM_NUM,
96         NVC_PARAM_I2C,
97         NVC_PARAM_FORCE32 = 0x7FFFFFFF
98 };
99
100 /* sync off */
101 #define NVC_SYNC_OFF                    0
102 /* use only this device (the one receiving the call) */
103 #define NVC_SYNC_MASTER                 1
104 /* use only the synced device (the "other" device) */
105 #define NVC_SYNC_SLAVE                  2
106 /* use both synced devices at the same time */
107 #define NVC_SYNC_STEREO                 3
108
109 #define NVC_RESET_HARD                  0
110 #define NVC_RESET_SOFT                  1
111
112 struct nvc_param_isp {
113         int attr;
114         void *p_data;
115         __u32 data_size;
116 } __packed;
117
118 struct nvc_isp_focus_param {
119         __s32 min_pos;
120         __s32 max_pos;
121         __s32 hyperfocal;
122         __s32 macro;
123         __s32 powersave;
124 } __packed;
125
126 struct nvc_isp_focus_pos {
127         __u32 is_auto;
128         __s32 value;
129 } __packed;
130
131 struct nvc_isp_focus_region {
132         __u32 num_region;
133         __s32 value;
134 } __packed;
135
136 enum nvc_params_isp {
137         NVC_PARAM_ISP_FOCUS_CAF = 16389,
138         NVC_PARAM_ISP_FOCUS_CAF_PAUSE,
139         NVC_PARAM_ISP_FOCUS_CAF_STS,
140         NVC_PARAM_ISP_FOCUS_POS = 16407,
141         NVC_PARAM_ISP_FOCUS_RANGE,
142         NVC_PARAM_ISP_FOCUS_AF_RGN = 16413,
143         NVC_PARAM_ISP_FOCUS_AF_RGN_MASK,
144         NVC_PARAM_ISP_FOCUS_AF_RGN_STS,
145         NVC_PARAM_ISP_FOCUS_CTRL = 16424,
146         NVC_PARAM_ISP_FOCUS_TRGR,
147         NVC_PARAM_ISP_FOCUS_STS,
148 };
149
150 #define NVC_PARAM_ISP_FOCUS_STS_BUSY    0
151 #define NVC_PARAM_ISP_FOCUS_STS_LOCKD   1
152 #define NVC_PARAM_ISP_FOCUS_STS_FAILD   2
153 #define NVC_PARAM_ISP_FOCUS_STS_ERR     3
154
155 #define NVC_PARAM_ISP_FOCUS_CTRL_ON     0
156 #define NVC_PARAM_ISP_FOCUS_CTRL_OFF    1
157 #define NVC_PARAM_ISP_FOCUS_CTRL_AUTO   2
158 #define NVC_PARAM_ISP_FOCUS_CTRL_ALOCK  3
159
160 #define NVC_PARAM_ISP_FOCUS_CAF_CONVRG  1
161 #define NVC_PARAM_ISP_FOCUS_CAF_SEARCH  2
162
163 #define NVC_PARAM_ISP_FOCUS_POS_INF     0
164
165
166 #define NVC_IOCTL_PWR_WR                _IOW('o', 102, int)
167 #define NVC_IOCTL_PWR_RD                _IOW('o', 103, int)
168 #define NVC_IOCTL_PARAM_WR              _IOW('o', 104, struct nvc_param)
169 #define NVC_IOCTL_PARAM_RD              _IOWR('o', 105, struct nvc_param)
170 #define NVC_IOCTL_PARAM_ISP_RD          _IOWR('o', 200, struct nvc_param_isp)
171 #define NVC_IOCTL_PARAM_ISP_WR          _IOWR('o', 201, struct nvc_param_isp)
172
173
174 #ifdef __KERNEL__
175
176 #include <linux/regulator/consumer.h>
177
178 /* The NVC_CFG_ defines are for the .cfg entry in the
179  * platform data structure.
180  */
181 /* Device not registered if not found */
182 #define NVC_CFG_NODEV                   (1 << 0)
183 /* Don't return errors */
184 #define NVC_CFG_NOERR                   (1 << 1)
185 /* Always go to _PWR_STDBY instead of _PWR_OFF */
186 #define NVC_CFG_OFF2STDBY               (1 << 2)
187 /* Init device at sys boot */
188 #define NVC_CFG_BOOT_INIT               (1 << 3)
189 /* Sync mode uses an I2C MUX to send at same time */
190 #define NVC_CFG_SYNC_I2C_MUX            (1 << 4)
191
192 /* Expected higher level power calls are:
193  * 1 = OFF
194  * 2 = STANDBY
195  * 3 = ON
196  * These will be multiplied by 2 before given to the driver's PM code that
197  * uses the _PWR_ defines. This allows us to insert defines to give more power
198  * granularity and still remain linear with regards to the power usage and
199  * full power state transition latency for easy implementation of PM
200  * algorithms.
201  * The PM actions:
202  * _PWR_ERR = Non-valid state.
203  * _PWR_OFF_FORCE = _PWR_OFF is forced regardless of standby mechanisms.
204  * _PWR_OFF = Device, regulators, clocks, etc is turned off.  The longest
205  *            transition time to _PWR_ON is from this state.
206  * _PWR_STDBY_OFF = Device is useless but powered.  No communication possible.
207  *                  Device does not retain programming.  Main purpose is for
208  *                  faster return to _PWR_ON without regulator delays.
209  * _PWR_STDBY = Device is in standby.  Device retains programming.
210  * _PWR_COMM = Device is powered enough to communicate with the device.
211  * _PWR_ON = Device is at full power with active output.
212  *
213  * The kernel drivers treat these calls as Guaranteed Level Of Service.
214  */
215
216 #define NVC_PWR_ERR                     0
217 #define NVC_PWR_OFF_FORCE               1
218 #define NVC_PWR_OFF                     2
219 #define NVC_PWR_STDBY_OFF               3
220 #define NVC_PWR_STDBY                   4
221 #define NVC_PWR_COMM                    5
222 #define NVC_PWR_ON                      6
223
224 struct nvc_regulator_init {
225         unsigned vreg_num;
226         const char *vreg_name;
227 };
228
229 struct nvc_regulator {
230         bool vreg_flag;
231         struct regulator *vreg;
232         const char *vreg_name;
233 };
234
235 /* The GPIO mechanism uses the _gpio_type in the device's header file as a key
236  * to define all the possible GPIO's the device will need.  The key is used to
237  * combine the GPIO's defined in the platform board file using the
238  * nvc_gpio_pdata structure with the nvc_gpio structure in the nvc kernel
239  * driver.
240  */
241 struct nvc_gpio_pdata {
242         /* use a _gpio_type enum from the device's header file */
243         unsigned gpio_type;
244         /* the GPIO system number */
245         unsigned gpio;
246         /* init_en is typically set to true for all GPIO's used by the driver.
247          * However, some GPIO's are used by multiple drivers (CSI MUX, reset,
248          * etc.).  In this case, this is set true for only one of the drivers
249          * that uses the GPIO and false for the others.  If the platform board
250          * file initializes the GPIO, then this is false for all of the drivers
251          * using the GPIO.
252          */
253         bool init_en;
254         /* this defines the assert level for the general purpose GPIO's
255          * (_GPIO_TYPE_GPx, etc.).  The _GPIO_TYPE_GPx can be used for a GPIO
256          * that the driver doesn't know about but is needed in order for the
257          * device to work (CSI select, regulator, etc.).  The driver will
258          * blindly assert the GPIO when the device is operational and deassert
259          * when the device is turned off.
260          */
261         bool active_high;
262 };
263
264 struct nvc_gpio_init {
265         /* key to match in nvc_gpio_pdata */
266         unsigned gpio_type;
267         /* same as in gpio.h */
268         unsigned long flags;
269         /* same as in gpio.h */
270         const char *label;
271         /* used instead of nvc_gpio_pdata.active_high if use_flags true */
272         bool active_high;
273         /* false if nvc_gpio_pdata.active_high used else flags is used */
274         bool use_flags;
275 };
276
277 struct nvc_gpio {
278         unsigned gpio; /* system GPIO number */
279         bool own; /* gets set if driver initializes */
280         bool active_high; /* used for GP GPIOs */
281         bool valid; /* set if struct data is valid */
282         bool flag; /* scratch flag for driver implementation */
283 };
284
285 #endif /* __KERNEL__ */
286
287 #endif /* __NVC_H__ */
288