07328f9ec622b805f468961bcf6a3e4a463dd46c
[linux-3.10.git] / include / media / camera_common.h
1 /**
2  * camera_common.h - utilities for tegra camera driver
3  *
4  * Copyright (c) 2015-2016, NVIDIA Corporation.  All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #ifndef __camera_common__
20 #define __camera_common__
21
22 #include <linux/delay.h>
23 #include <linux/fs.h>
24 #include <linux/i2c.h>
25 #include <linux/regmap.h>
26 #include <linux/clk.h>
27 #include <linux/regulator/consumer.h>
28 #include <linux/platform_device.h>
29 #include <linux/videodev2.h>
30
31 #include <linux/kernel.h>
32 #include <linux/debugfs.h>
33
34 #include <media/v4l2-device.h>
35 #include <media/v4l2-subdev.h>
36 #include <media/v4l2-ctrls.h>
37 #include <media/soc_camera.h>
38 #include <media/nvc_focus.h>
39
40 #define V4L2_CID_TEGRA_CAMERA_BASE      (V4L2_CTRL_CLASS_CAMERA | 0x2000)
41
42 #define V4L2_CID_FRAME_LENGTH           (V4L2_CID_TEGRA_CAMERA_BASE+0)
43 #define V4L2_CID_COARSE_TIME            (V4L2_CID_TEGRA_CAMERA_BASE+1)
44 #define V4L2_CID_COARSE_TIME_SHORT      (V4L2_CID_TEGRA_CAMERA_BASE+2)
45 #define V4L2_CID_GROUP_HOLD             (V4L2_CID_TEGRA_CAMERA_BASE+3)
46 #define V4L2_CID_HDR_EN                 (V4L2_CID_TEGRA_CAMERA_BASE+4)
47 #define V4L2_CID_EEPROM_DATA            (V4L2_CID_TEGRA_CAMERA_BASE+5)
48 #define V4L2_CID_OTP_DATA               (V4L2_CID_TEGRA_CAMERA_BASE+6)
49 #define V4L2_CID_FUSE_ID                (V4L2_CID_TEGRA_CAMERA_BASE+7)
50
51 #define V4L2_CID_TEGRA_CAMERA_LAST      (V4L2_CID_TEGRA_CAMERA_BASE+8)
52 #define V4L2_CID_VI_BYPASS_MODE         (V4L2_CID_TEGRA_CAMERA_BASE+9)
53
54 #define MAX_BUFFER_SIZE                 32
55 #define MAX_CID_CONTROLS                16
56
57 struct reg_8 {
58         u16 addr;
59         u8 val;
60 };
61
62 struct reg_16 {
63         u16 addr;
64         u16 val;
65 };
66
67 struct camera_common_power_rail {
68         struct regulator *dvdd;
69         struct regulator *avdd;
70         struct regulator *iovdd;
71         struct regulator *vcmvdd;
72         struct clk *mclk;
73         unsigned int pwdn_gpio;
74         unsigned int reset_gpio;
75         unsigned int af_gpio;
76         bool state;
77 };
78
79 struct camera_common_regulators {
80         const char *avdd;
81         const char *dvdd;
82         const char *iovdd;
83         const char *vcmvdd;
84 };
85
86 struct camera_common_pdata {
87         const char *mclk_name; /* NULL for default default_mclk */
88         const char *parentclk_name; /* NULL for no parent clock*/
89         unsigned int pwdn_gpio;
90         unsigned int reset_gpio;
91         unsigned int af_gpio;
92         unsigned int eeprom_base_addr;
93         bool ext_reg;
94         int (*power_on)(struct camera_common_power_rail *pw);
95         int (*power_off)(struct camera_common_power_rail *pw);
96         struct camera_common_regulators regulators;
97         bool use_cam_gpio;
98         bool has_eeprom;
99 };
100
101 struct camera_common_eeprom_data {
102         struct i2c_client *i2c_client;
103         struct i2c_adapter *adap;
104         struct i2c_board_info brd;
105         struct regmap *regmap;
106 };
107
108 int
109 regmap_util_write_table_8(struct regmap *regmap,
110                           const struct reg_8 table[],
111                           const struct reg_8 override_list[],
112                           int num_override_regs,
113                           u16 wait_ms_addr, u16 end_addr);
114
115 int
116 regmap_util_write_table_16_as_8(struct regmap *regmap,
117                                 const struct reg_16 table[],
118                                 const struct reg_16 override_list[],
119                                 int num_override_regs,
120                                 u16 wait_ms_addr, u16 end_addr);
121
122 enum switch_state {
123         SWITCH_OFF,
124         SWITCH_ON,
125 };
126
127 static const s64 switch_ctrl_qmenu[] = {
128         SWITCH_OFF, SWITCH_ON
129 };
130
131 struct camera_common_frmfmt {
132         struct v4l2_frmsize_discrete    size;
133         const int *framerates;
134         int     num_framerates;
135         bool    hdr_en;
136         int     mode;
137 };
138
139 struct camera_common_colorfmt {
140         enum v4l2_mbus_pixelcode        code;
141         enum v4l2_colorspace            colorspace;
142         int                             pix_fmt;
143 };
144
145 struct camera_common_data;
146
147 struct camera_common_sensor_ops {
148         int (*power_on)(struct camera_common_data *s_data);
149         int (*power_off)(struct camera_common_data *s_data);
150         int (*write_reg)(struct camera_common_data *s_data,
151           u16 addr, u8 val);
152         int (*read_reg)(struct camera_common_data *s_data,
153           u16 addr, u8 *val);
154 };
155
156 struct camera_common_data {
157         struct camera_common_sensor_ops         *ops;
158         struct v4l2_ctrl_handler                *ctrl_handler;
159         struct i2c_client                       *i2c_client;
160         struct device                           *dev;
161         const struct camera_common_frmfmt       *frmfmt;
162         const struct camera_common_colorfmt     *colorfmt;
163         const struct camera_common_colorfmt     *color_fmts;
164         struct dentry                           *debugdir;
165         struct camera_common_power_rail         *power;
166
167         struct v4l2_subdev                      subdev;
168         struct v4l2_ctrl                        **ctrls;
169
170         void    *priv;
171         int     ident;
172         int     numctrls;
173         int     csi_port;
174         int     numlanes;
175         int     mode;
176         int     numfmts;
177         int     num_color_fmts;
178         int     def_mode, def_width, def_height;
179         int     def_clk_freq;
180         int     fmt_width, fmt_height;
181 };
182
183 struct camera_common_focuser_data;
184
185 struct camera_common_focuser_ops {
186         int (*power_on)(struct camera_common_focuser_data *s_data);
187         int (*power_off)(struct camera_common_focuser_data *s_data);
188         int (*load_config)(struct camera_common_focuser_data *s_data);
189         int (*ctrls_init)(struct camera_common_focuser_data *s_data);
190 };
191
192 struct camera_common_focuser_data {
193         struct camera_common_focuser_ops        *ops;
194         struct v4l2_ctrl_handler                *ctrl_handler;
195         struct v4l2_subdev                      subdev;
196         struct v4l2_ctrl                        **ctrls;
197         struct i2c_client                       *i2c_client;
198
199         struct nv_focuser_config                config;
200         void                                    *priv;
201         int                                     pwr_dev;
202         int                                     def_position;
203 };
204
205 static inline void msleep_range(unsigned int delay_base)
206 {
207         usleep_range(delay_base * 1000, delay_base * 1000 + 500);
208 }
209
210 static inline struct camera_common_data *to_camera_common_data(
211         const struct i2c_client *client)
212 {
213         return container_of(i2c_get_clientdata(client),
214                             struct camera_common_data, subdev);
215 }
216
217 static inline struct camera_common_focuser_data *to_camera_common_focuser_data(
218         const struct i2c_client *client)
219 {
220         return container_of(i2c_get_clientdata(client),
221                             struct camera_common_focuser_data, subdev);
222 }
223
224 int camera_common_g_ctrl(struct camera_common_data *s_data,
225                          struct v4l2_control *control);
226
227 int camera_common_regulator_get(struct i2c_client *client,
228                        struct regulator **vreg, const char *vreg_name);
229 int camera_common_parse_clocks(struct i2c_client *client,
230                         struct camera_common_pdata *pdata);
231 int camera_common_parse_ports(struct i2c_client *client,
232                               struct camera_common_data *s_data);
233
234 int camera_common_debugfs_show(struct seq_file *s, void *unused);
235 ssize_t camera_common_debugfs_write(
236         struct file *file,
237         char const __user *buf,
238         size_t count,
239         loff_t *offset);
240 int camera_common_debugfs_open(struct inode *inode, struct file *file);
241 void camera_common_remove_debugfs(struct camera_common_data *s_data);
242 void camera_common_create_debugfs(struct camera_common_data *s_data,
243                 const char *name);
244
245 const struct camera_common_colorfmt *camera_common_find_datafmt(
246                 enum v4l2_mbus_pixelcode code);
247 int camera_common_enum_mbus_code(struct v4l2_subdev *sd,
248                                 struct v4l2_subdev_fh *fh,
249                                 struct v4l2_subdev_mbus_code_enum *code);
250 int camera_common_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
251                          enum v4l2_mbus_pixelcode *code);
252 int camera_common_try_fmt(struct v4l2_subdev *sd,
253                            struct v4l2_mbus_framefmt *mf);
254 int camera_common_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf);
255 int camera_common_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf);
256 int camera_common_enum_framesizes(struct v4l2_subdev *sd,
257                 struct v4l2_frmsizeenum *fsizes);
258 int camera_common_enum_frameintervals(struct v4l2_subdev *sd,
259                 struct v4l2_frmivalenum *fintervals);
260
261 int camera_common_g_chip_ident(struct v4l2_subdev *sd,
262                              struct v4l2_dbg_chip_ident *id);
263 int camera_common_s_power(struct v4l2_subdev *sd, int on);
264 void camera_common_dpd_disable(struct camera_common_data *s_data);
265 void camera_common_dpd_enable(struct camera_common_data *s_data);
266 int camera_common_g_mbus_config(struct v4l2_subdev *sd,
267                               struct v4l2_mbus_config *cfg);
268 /* Focuser */
269 int camera_common_focuser_init(struct camera_common_focuser_data *s_data);
270 int camera_common_focuser_s_power(struct v4l2_subdev *sd, int on);
271
272 #endif /* __camera_common__ */