video: tegra: dtv: Add ioctl for buffer size query
[linux-3.10.git] / include / media / camera.h
1 /*
2  * Copyright (c) 2013, NVIDIA CORPORATION.  All rights reserved.
3
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms and conditions of the GNU General Public License,
6  * version 2, as published by the Free Software Foundation.
7
8  * This program is distributed in the hope it will be useful, but WITHOUT
9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
11  * more details.
12
13  * You should have received a copy of the GNU General Public License
14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
15  */
16
17 #ifndef __CAMERA_H__
18 #define __CAMERA_H__
19
20 #ifdef __KERNEL__
21 #include <linux/list.h>
22 #include <linux/miscdevice.h>
23 #include <linux/regmap.h>
24 #include <media/nvc.h>
25 #endif
26
27 #define CAMERA_INT_MASK                 0xf0000000
28 #define CAMERA_TABLE_WAIT_US            (CAMERA_INT_MASK | 1)
29 #define CAMERA_TABLE_WAIT_MS            (CAMERA_INT_MASK | 2)
30 #define CAMERA_TABLE_END                (CAMERA_INT_MASK | 9)
31 #define CAMERA_TABLE_PWR                (CAMERA_INT_MASK | 20)
32 #define CAMERA_TABLE_PINMUX             (CAMERA_INT_MASK | 25)
33 #define CAMERA_TABLE_INX_PINMUX         (CAMERA_INT_MASK | 26)
34 #define CAMERA_TABLE_GPIO_ACT           (CAMERA_INT_MASK | 30)
35 #define CAMERA_TABLE_GPIO_DEACT         (CAMERA_INT_MASK | 31)
36 #define CAMERA_TABLE_GPIO_INX_ACT       (CAMERA_INT_MASK | 32)
37 #define CAMERA_TABLE_GPIO_INX_DEACT     (CAMERA_INT_MASK | 33)
38 #define CAMERA_TABLE_REG_NEW_POWER      (CAMERA_INT_MASK | 40)
39 #define CAMERA_TABLE_INX_POWER          (CAMERA_INT_MASK | 41)
40
41 #define CAMERA_TABLE_PWR_FLAG_MASK      0xf0000000
42 #define CAMERA_TABLE_PWR_FLAG_ON        0x80000000
43 #define CAMERA_TABLE_PINMUX_FLAG_MASK   0xf0000000
44 #define CAMERA_TABLE_PINMUX_FLAG_ON     0x80000000
45
46 #define PCLLK_IOCTL_CHIP_REG    _IOW('o', 100, struct virtual_device)
47 #define PCLLK_IOCTL_DEV_REG     _IOW('o', 104, struct camera_device_info)
48 #define PCLLK_IOCTL_DEV_DEL     _IOW('o', 105, int)
49 #define PCLLK_IOCTL_DEV_FREE    _IOW('o', 106, int)
50 #define PCLLK_IOCTL_PWR_WR      _IOW('o', 108, int)
51 #define PCLLK_IOCTL_PWR_RD      _IOR('o', 109, int)
52 #define PCLLK_IOCTL_SEQ_WR      _IOWR('o', 112, struct nvc_param)
53 #define PCLLK_IOCTL_SEQ_RD      _IOWR('o', 113, struct nvc_param)
54 #define PCLLK_IOCTL_UPDATE      _IOW('o', 116, struct nvc_param)
55 #define PCLLK_IOCTL_LAYOUT_WR   _IOW('o', 120, struct nvc_param)
56 #define PCLLK_IOCTL_LAYOUT_RD   _IOWR('o', 121, struct nvc_param)
57 #define PCLLK_IOCTL_PARAM_WR    _IOWR('o', 140, struct nvc_param)
58 #define PCLLK_IOCTL_PARAM_RD    _IOWR('o', 141, struct nvc_param)
59 #define PCLLK_IOCTL_DRV_ADD     _IOW('o', 150, struct nvc_param)
60
61 #define CAMERA_MAX_NAME_LENGTH  32
62 #define CAMDEV_INVALID          0xffffffff
63
64 enum {
65         CAMERA_SEQ_EXEC,
66         CAMERA_SEQ_REGISTER_EXEC,
67         CAMERA_SEQ_REGISTER_ONLY,
68         CAMERA_SEQ_EXIST,
69 };
70
71 enum {
72         CAMERA_DEVICE_TYPE_I2C,
73 };
74
75 struct camera_device_info {
76         u8 name[CAMERA_MAX_NAME_LENGTH];
77         u32 type;
78         u8 bus;
79         u8 addr;
80 };
81
82 struct camera_reg {
83         u32 addr;
84         u32 val;
85 };
86
87 struct regmap_cfg {
88         int addr_bits;
89         int val_bits;
90         u32 cache_type;
91 };
92
93 struct gpio_cfg {
94         int gpio;
95         u8 own;
96         u8 active_high;
97         u8 flag;
98         u8 reserved;
99 };
100
101 #define VIRTUAL_DEV_MAX_REGULATORS      8
102 #define VIRTUAL_DEV_MAX_GPIOS           8
103 #define VIRTUAL_REGNAME_SIZE            (VIRTUAL_DEV_MAX_REGULATORS * \
104                                                 CAMERA_MAX_NAME_LENGTH)
105
106 struct virtual_device {
107         u8 name[32];
108         u32 bus_type;
109         struct regmap_cfg regmap_cfg;
110         u32 gpio_num;
111         u32 reg_num;
112         u8 reg_names[VIRTUAL_REGNAME_SIZE];
113         u32 pwr_on_size;
114         struct camera_reg *power_on;
115         u32 pwr_off_size;
116         struct camera_reg *power_off;
117 };
118
119 enum {
120         UPDATE_PINMUX,
121         UPDATE_GPIO,
122         UPDATE_POWER,
123         UPDATE_MAX_NUM,
124 };
125
126 struct cam_update {
127         u32 type;
128         u32 index;
129         u32 arg;
130 };
131
132 struct cam_device_layout {
133         __u64 guid;
134         __u8 name[CAMERA_MAX_NAME_LENGTH];
135         __u8 alt_name[CAMERA_MAX_NAME_LENGTH];
136         __u8 is_front;
137         __u8 bus;
138         __u8 addr;
139         __u8 addr_byte;
140         __u32 reserved1;
141         __u32 reserved2;
142 };
143
144 #ifdef __KERNEL__
145
146 #define NUM_OF_SEQSTACK         16
147 #define SIZEOF_I2C_BUF          32
148
149 struct camera_module {
150         struct i2c_board_info *sensor;
151         struct i2c_board_info *focuser;
152         struct i2c_board_info *flash;
153 };
154
155 struct camera_platform_data {
156         unsigned cfg;
157         int pinmux_num;
158         struct tegra_pingroup_config **pinmux;
159         struct camera_module *modules;
160 };
161
162 struct camera_device {
163         struct list_head list;
164         u8 name[CAMERA_MAX_NAME_LENGTH];
165         struct device *dev;
166         struct i2c_client *client;
167         struct camera_chip *chip;
168         struct regmap *regmap;
169         struct camera_info *cam;
170         atomic_t in_use;
171         struct mutex mutex;
172         struct nvc_regulator *regs;
173         u32 num_reg;
174         struct nvc_gpio *gpios;
175         u32 num_gpio;
176         struct tegra_pingroup_config **pinmux_tbl;
177         u32 pinmux_num;
178         u32 mclk_enable_idx;
179         u32 mclk_disable_idx;
180         struct regulator *ext_regs;
181         struct camera_reg *seq_stack[NUM_OF_SEQSTACK];
182         int pwr_state;
183         u8 is_power_on;
184         u8 i2c_buf[SIZEOF_I2C_BUF];
185 };
186
187 struct camera_chip {
188         const u8                        name[CAMERA_MAX_NAME_LENGTH];
189         u32                             type;
190         const struct regmap_config      regmap_cfg;
191         struct list_head                list;
192         atomic_t                        ref_cnt;
193         void                            *private;
194         /* function pointers */
195         int     (*init)(struct camera_device *cdev, void *);
196         int     (*release)(struct camera_device *cdev);
197         int     (*power_on)(struct camera_device *cdev);
198         int     (*power_off)(struct camera_device *cdev);
199         int     (*update)(struct camera_device *cdev,
200                         struct cam_update *upd, int num);
201 };
202
203 extern int camera_chip_add(struct camera_chip *chip);
204
205 #ifdef CAMERA_DEVICE_INTERNAL
206
207 struct camera_info {
208         struct list_head list;
209         atomic_t in_use;
210         struct device *dev;
211         struct mutex k_mutex;
212         struct camera_device *cdev;
213 };
214
215 struct camera_platform_info {
216         char dname[CAMERA_MAX_NAME_LENGTH];
217         struct miscdevice miscdev;
218         atomic_t in_use;
219         struct device *dev;
220         struct camera_platform_data *pdata;
221         struct mutex *u_mutex;
222         struct list_head *app_list;
223         struct mutex *d_mutex;
224         struct list_head *dev_list;
225         struct mutex *c_mutex;
226         struct list_head *chip_list;
227         struct dentry *d_entry;
228         void *layout;
229         size_t size_layout;
230 };
231
232 extern int virtual_device_add(
233         struct device *dev, unsigned long arg);
234 extern int camera_regulator_get(struct device *dev,
235         struct nvc_regulator *nvc_reg, char *vreg_name);
236
237 extern int camera_dev_parser(
238         struct camera_device *cdev, u32 addr, u32 val);
239 extern int camera_dev_wr_table(
240         struct camera_device *cdev, struct camera_reg *table);
241 extern int camera_dev_rd_table(
242         struct camera_device *cdev, struct camera_reg *table);
243
244 extern int camera_debugfs_init(struct camera_platform_info *info);
245 extern int camera_debugfs_remove(void);
246
247 #endif
248
249 #endif
250 #endif
251 /* __CAMERA_H__ */