drivers: soc_camera: imx230 eeprom support
[linux-3.10.git] / include / media / imx230.h
1 /**
2  * Copyright (c) 2015-2016, 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 __IMX230_H__
18 #define __IMX230_H__
19
20 #include <linux/ioctl.h>  /* For IOCTL macros */
21 #include <media/nvc.h>
22 #include <media/nvc_image.h>
23
24
25 #define IMX230_IOCTL_SET_MODE                   _IOW('o', 1, struct imx230_mode)
26 #define IMX230_IOCTL_GET_STATUS         _IOR('o', 2, __u8)
27 #define IMX230_IOCTL_SET_FRAME_LENGTH           _IOW('o', 3, __u32)
28 #define IMX230_IOCTL_SET_COARSE_TIME            _IOW('o', 4, __u32)
29 #define IMX230_IOCTL_SET_GAIN                   _IOW('o', 5, __u16)
30 #define IMX230_IOCTL_GET_SENSORDATA             _IOR('o', 6, \
31          struct imx230_sensordata)
32 #define IMX230_IOCTL_SET_GROUP_HOLD             _IOW('o', 7, struct imx230_ae)
33 #define IMX230_IOCTL_SET_HDR_COARSE_TIME        _IOW('o', 8, struct imx230_hdr)
34 #define IMX230_IOCTL_SET_POWER                  _IOW('o', 20, __u32)
35
36 #define IMX230_EEPROM_PRESENT           (1)
37
38 /* IMX230 module has AT24C128C 16KB eeprom
39  * with a page size of 64 bytes */
40 #if IMX230_EEPROM_PRESENT
41 #define IMX230_EEPROM_ADDRESS           0x50
42 #define IMX230_EEPROM_SIZE              16384
43 #define IMX230_EEPROM_STR_SIZE          (IMX230_EEPROM_SIZE * 2)
44 #define IMX230_EEPROM_BLOCK_SIZE        (64)
45 #define IMX230_EEPROM_NUM_BLOCKS \
46          (IMX230_EEPROM_SIZE / IMX230_EEPROM_BLOCK_SIZE)
47 #endif /* if IMX230_EEPROM_PRESENT */
48
49 #define IMX230_OTP_CTRL_ADDR            0x0A00
50 #define IMX230_OTP_STATUS_ADDR          0x0A01
51 #define IMX230_OTP_PAGE_NUM_ADDR        0x0A02
52 #define IMX230_OTP_PAGE_START_ADDR      0x0A04
53 #define IMX230_OTP_PAGE_END_ADDR        0x0A43
54 #define IMX230_OTP_NUM_PAGES            (18)
55 #define IMX230_OTP_PAGE_SIZE \
56          (IMX230_OTP_PAGE_END_ADDR - IMX230_OTP_PAGE_START_ADDR + 1)
57 #define IMX230_OTP_SIZE \
58          (IMX230_OTP_PAGE_SIZE * IMX230_OTP_NUM_PAGES)
59 #define IMX230_OTP_STR_SIZE (IMX230_OTP_SIZE * 2)
60 #define IMX230_OTP_STATUS_IN_PROGRESS           0
61 #define IMX230_OTP_STATUS_READ_COMPLETE 1
62 #define IMX230_OTP_STATUS_READ_FAIL             5
63
64 #define IMX230_FUSE_ID_OTP_ROW_ADDR     0x0A36
65 #define IMX230_FUSE_ID_OTP_PAGE 31 /*0x1F*/
66 #define IMX230_FUSE_ID_SIZE     11
67 #define IMX230_FUSE_ID_STR_SIZE (IMX230_FUSE_ID_SIZE * 2)
68
69 #define IMX230_FRAME_LENGTH_ADDR_MSB            0x0340
70 #define IMX230_FRAME_LENGTH_ADDR_LSB            0x0341
71 #define IMX230_COARSE_TIME_ADDR_MSB             0x0202
72 #define IMX230_COARSE_TIME_ADDR_LSB             0x0203
73 #define IMX230_COARSE_TIME_SHORT_ADDR_MSB       0x0224
74 #define IMX230_COARSE_TIME_SHORT_ADDR_LSB       0x0225
75 #define IMX230_GAIN_ADDR_MSB                    0x0204
76 #define IMX230_GAIN_ADDR_LSB                    0x0205
77 #define IMX230_GAIN_SHORT_ADDR_MSB              0x0216
78 #define IMX230_GAIN_SHORT_ADDR_LSB              0x0217
79 #define IMX230_GROUP_HOLD_ADDR                  0x0104
80
81 #define IMX230_MASK_CORRUPT_FRAME_ADDR          0x0105
82 #define IMX230_MASK_CORRUPT_FRAME_TRANSMIT      0
83 #define IMX230_MASK_CORRUPT_FRAME_MASK          1
84
85 #define IMX230_CROP_X_START_ADDR_MSB    0x0344
86 #define IMX230_CROP_X_START_ADDR_LSB    0x0345
87 #define IMX230_CROP_Y_START_ADDR_MSB    0x0346
88 #define IMX230_CROP_Y_START_ADDR_LSB    0x0347
89 #define IMX230_CROP_X_END_ADDR_MSB      0x0348
90 #define IMX230_CROP_X_END_ADDR_LSB      0x0349
91 #define IMX230_CROP_Y_END_ADDR_MSB      0x034A
92 #define IMX230_CROP_Y_END_ADDR_LSB      0x034B
93 #define IMX230_CROP_X_OUTPUT_SIZE_MSB   0x034C
94 #define IMX230_CROP_X_OUTPUT_SIZE_LSB   0x034D
95 #define IMX230_CROP_Y_OUTPUT_SIZE_MSB   0x034E
96 #define IMX230_CROP_Y_OUTPUT_SIZE_LSB   0x034F
97
98 struct imx230_mode {
99         __u32 xres;
100         __u32 yres;
101         __u32 frame_length;
102         __u32 coarse_time;
103         __u32 coarse_time_short;
104         __u16 gain;
105         __u8 hdr_en;
106 };
107
108 struct imx230_hdr {
109         __u32 coarse_time_long;
110         __u32 coarse_time_short;
111 };
112
113 struct imx230_ae {
114         __u32 frame_length;
115         __u8  frame_length_enable;
116         __u32 coarse_time;
117         __u32 coarse_time_short;
118         __u8  coarse_time_enable;
119         __s32 gain;
120         __u8  gain_enable;
121 };
122
123 struct imx230_sensordata {
124         __u32 fuse_id_size;
125         __u8  fuse_id[IMX230_FUSE_ID_SIZE];
126 };
127
128 #ifdef __KERNEL__
129 struct imx230_power_rail {
130         struct regulator *dvdd;
131         struct regulator *avdd;
132         struct regulator *iovdd;
133         struct regulator *ext_reg1;
134         struct regulator *ext_reg2;
135         struct clk *mclk;
136         unsigned int pwdn_gpio;
137         unsigned int cam1_gpio;
138         unsigned int reset_gpio;
139         unsigned int af_gpio;
140 };
141
142 struct imx230_platform_data {
143         const char *mclk_name; /* NULL for default default_mclk */
144         unsigned int cam1_gpio;
145         unsigned int reset_gpio;
146         unsigned int af_gpio;
147         bool ext_reg;
148         int (*power_on)(struct imx230_power_rail *pw);
149         int (*power_off)(struct imx230_power_rail *pw);
150 };
151 #endif /* __KERNEL__ */
152
153 #endif  /* __IMX230_H__ */