• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Support for Medifield PNW Camera Imaging ISP subsystem.
3  *
4  * Copyright (c) 2010 Intel Corporation. All Rights Reserved.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License version
8  * 2 as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18  * 02110-1301, USA.
19  *
20  */
21 #ifndef ATOMISP_PLATFORM_H_
22 #define ATOMISP_PLATFORM_H_
23 
24 #include <linux/i2c.h>
25 #include <linux/sfi.h>
26 #include <media/v4l2-subdev.h>
27 #include "atomisp.h"
28 
29 #define MAX_SENSORS_PER_PORT 4
30 #define MAX_STREAMS_PER_CHANNEL 2
31 
32 #define CAMERA_MODULE_ID_LEN 64
33 
34 enum atomisp_bayer_order {
35 	atomisp_bayer_order_grbg,
36 	atomisp_bayer_order_rggb,
37 	atomisp_bayer_order_bggr,
38 	atomisp_bayer_order_gbrg
39 };
40 
41 enum atomisp_input_stream_id {
42 	ATOMISP_INPUT_STREAM_GENERAL = 0,
43 	ATOMISP_INPUT_STREAM_CAPTURE = 0,
44 	ATOMISP_INPUT_STREAM_POSTVIEW,
45 	ATOMISP_INPUT_STREAM_PREVIEW,
46 	ATOMISP_INPUT_STREAM_VIDEO,
47 	ATOMISP_INPUT_STREAM_NUM
48 };
49 
50 enum atomisp_input_format {
51 	ATOMISP_INPUT_FORMAT_YUV420_8_LEGACY,/* 8 bits per subpixel (legacy) */
52 	ATOMISP_INPUT_FORMAT_YUV420_8, /* 8 bits per subpixel */
53 	ATOMISP_INPUT_FORMAT_YUV420_10,/* 10 bits per subpixel */
54 	ATOMISP_INPUT_FORMAT_YUV420_16,/* 16 bits per subpixel */
55 	ATOMISP_INPUT_FORMAT_YUV422_8, /* UYVY..UVYV, 8 bits per subpixel */
56 	ATOMISP_INPUT_FORMAT_YUV422_10,/* UYVY..UVYV, 10 bits per subpixel */
57 	ATOMISP_INPUT_FORMAT_YUV422_16,/* UYVY..UVYV, 16 bits per subpixel */
58 	ATOMISP_INPUT_FORMAT_RGB_444,  /* BGR..BGR, 4 bits per subpixel */
59 	ATOMISP_INPUT_FORMAT_RGB_555,  /* BGR..BGR, 5 bits per subpixel */
60 	ATOMISP_INPUT_FORMAT_RGB_565,  /* BGR..BGR, 5 bits B and R, 6 bits G */
61 	ATOMISP_INPUT_FORMAT_RGB_666,  /* BGR..BGR, 6 bits per subpixel */
62 	ATOMISP_INPUT_FORMAT_RGB_888,  /* BGR..BGR, 8 bits per subpixel */
63 	ATOMISP_INPUT_FORMAT_RAW_6,    /* RAW data, 6 bits per pixel */
64 	ATOMISP_INPUT_FORMAT_RAW_7,    /* RAW data, 7 bits per pixel */
65 	ATOMISP_INPUT_FORMAT_RAW_8,    /* RAW data, 8 bits per pixel */
66 	ATOMISP_INPUT_FORMAT_RAW_10,   /* RAW data, 10 bits per pixel */
67 	ATOMISP_INPUT_FORMAT_RAW_12,   /* RAW data, 12 bits per pixel */
68 	ATOMISP_INPUT_FORMAT_RAW_14,   /* RAW data, 14 bits per pixel */
69 	ATOMISP_INPUT_FORMAT_RAW_16,   /* RAW data, 16 bits per pixel */
70 	ATOMISP_INPUT_FORMAT_BINARY_8, /* Binary byte stream. */
71 
72 	/* CSI2-MIPI specific format: Generic short packet data. It is used to
73 	 * keep the timing information for the opening/closing of shutters,
74 	 * triggering of flashes and etc.
75 	 */
76 	ATOMISP_INPUT_FORMAT_GENERIC_SHORT1,  /* Generic Short Packet Code 1 */
77 	ATOMISP_INPUT_FORMAT_GENERIC_SHORT2,  /* Generic Short Packet Code 2 */
78 	ATOMISP_INPUT_FORMAT_GENERIC_SHORT3,  /* Generic Short Packet Code 3 */
79 	ATOMISP_INPUT_FORMAT_GENERIC_SHORT4,  /* Generic Short Packet Code 4 */
80 	ATOMISP_INPUT_FORMAT_GENERIC_SHORT5,  /* Generic Short Packet Code 5 */
81 	ATOMISP_INPUT_FORMAT_GENERIC_SHORT6,  /* Generic Short Packet Code 6 */
82 	ATOMISP_INPUT_FORMAT_GENERIC_SHORT7,  /* Generic Short Packet Code 7 */
83 	ATOMISP_INPUT_FORMAT_GENERIC_SHORT8,  /* Generic Short Packet Code 8 */
84 
85 	/* CSI2-MIPI specific format: YUV data.
86 	 */
87 	ATOMISP_INPUT_FORMAT_YUV420_8_SHIFT,  /* YUV420 8-bit (Chroma Shifted
88 						 Pixel Sampling) */
89 	ATOMISP_INPUT_FORMAT_YUV420_10_SHIFT, /* YUV420 8-bit (Chroma Shifted
90 						 Pixel Sampling) */
91 
92 	/* CSI2-MIPI specific format: Generic long packet data
93 	 */
94 	ATOMISP_INPUT_FORMAT_EMBEDDED, /* Embedded 8-bit non Image Data */
95 
96 	/* CSI2-MIPI specific format: User defined byte-based data. For example,
97 	 * the data transmitter (e.g. the SoC sensor) can keep the JPEG data as
98 	 * the User Defined Data Type 4 and the MPEG data as the
99 	 * User Defined Data Type 7.
100 	 */
101 	ATOMISP_INPUT_FORMAT_USER_DEF1,  /* User defined 8-bit data type 1 */
102 	ATOMISP_INPUT_FORMAT_USER_DEF2,  /* User defined 8-bit data type 2 */
103 	ATOMISP_INPUT_FORMAT_USER_DEF3,  /* User defined 8-bit data type 3 */
104 	ATOMISP_INPUT_FORMAT_USER_DEF4,  /* User defined 8-bit data type 4 */
105 	ATOMISP_INPUT_FORMAT_USER_DEF5,  /* User defined 8-bit data type 5 */
106 	ATOMISP_INPUT_FORMAT_USER_DEF6,  /* User defined 8-bit data type 6 */
107 	ATOMISP_INPUT_FORMAT_USER_DEF7,  /* User defined 8-bit data type 7 */
108 	ATOMISP_INPUT_FORMAT_USER_DEF8,  /* User defined 8-bit data type 8 */
109 };
110 
111 enum intel_v4l2_subdev_type {
112 	RAW_CAMERA = 1,
113 	SOC_CAMERA = 2,
114 	CAMERA_MOTOR = 3,
115 	LED_FLASH = 4,
116 	XENON_FLASH = 5,
117 	FILE_INPUT = 6,
118 	TEST_PATTERN = 7,
119 };
120 
121 struct intel_v4l2_subdev_id {
122 	char name[17];
123 	enum intel_v4l2_subdev_type type;
124 	enum atomisp_camera_port    port;
125 };
126 
127 struct intel_v4l2_subdev_i2c_board_info {
128 	struct i2c_board_info board_info;
129 	int i2c_adapter_id;
130 };
131 
132 struct intel_v4l2_subdev_table {
133 	struct intel_v4l2_subdev_i2c_board_info v4l2_subdev;
134 	enum intel_v4l2_subdev_type type;
135 	enum atomisp_camera_port port;
136 	struct v4l2_subdev *subdev;
137 };
138 
139 struct atomisp_platform_data {
140 	struct intel_v4l2_subdev_table *subdevs;
141 };
142 
143 /* Describe the capacities of one single sensor. */
144 struct atomisp_sensor_caps {
145 	/* The number of streams this sensor can output. */
146 	int stream_num;
147 	bool is_slave;
148 };
149 
150 /* Describe the capacities of sensors connected to one camera port. */
151 struct atomisp_camera_caps {
152 	/* The number of sensors connected to this camera port. */
153 	int sensor_num;
154 	/* The capacities of each sensor. */
155 	struct atomisp_sensor_caps sensor[MAX_SENSORS_PER_PORT];
156 	/* Define whether stream control is required for multiple streams. */
157 	bool multi_stream_ctrl;
158 };
159 
160 /*
161  *  Sensor of external ISP can send multiple steams with different mipi data
162  * type in the same virtual channel. This information needs to come from the
163  * sensor or external ISP
164  */
165 struct atomisp_isys_config_info {
166 	u8 input_format;
167 	u16 width;
168 	u16 height;
169 };
170 
171 struct atomisp_input_stream_info {
172 	enum atomisp_input_stream_id stream;
173 	u8 enable;
174 	/* Sensor driver fills ch_id with the id
175 	   of the virtual channel. */
176 	u8 ch_id;
177 	/* Tells how many streams in this virtual channel. If 0 ignore rest
178 	 * and the input format will be from mipi_info */
179 	u8 isys_configs;
180 	/*
181 	 * if more isys_configs is more than 0, sensor needs to configure the
182 	 * input format differently. width and height can be 0. If width and
183 	 * height is not zero, then the corresponsing data needs to be set
184 	 */
185 	struct atomisp_isys_config_info isys_info[MAX_STREAMS_PER_CHANNEL];
186 };
187 
188 struct camera_vcm_control;
189 struct camera_vcm_ops {
190 	int (*power_up)(struct v4l2_subdev *sd, struct camera_vcm_control *vcm);
191 	int (*power_down)(struct v4l2_subdev *sd,
192 			struct camera_vcm_control *vcm);
193 	int (*queryctrl)(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc,
194 			struct camera_vcm_control *vcm);
195 	int (*g_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl,
196 			struct camera_vcm_control *vcm);
197 	int (*s_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl,
198 			struct camera_vcm_control *vcm);
199 };
200 
201 struct camera_vcm_control {
202 	char camera_module[CAMERA_MODULE_ID_LEN];
203 	struct camera_vcm_ops *ops;
204 	struct list_head list;
205 };
206 
207 struct camera_sensor_platform_data {
208 	int (*gpio_ctrl)(struct v4l2_subdev *subdev, int flag);
209 	int (*flisclk_ctrl)(struct v4l2_subdev *subdev, int flag);
210 	int (*power_ctrl)(struct v4l2_subdev *subdev, int flag);
211 	int (*csi_cfg)(struct v4l2_subdev *subdev, int flag);
212 	bool (*low_fps)(void);
213 	int (*platform_init)(struct i2c_client *);
214 	int (*platform_deinit)(void);
215 	char *(*msr_file_name)(void);
216 	struct atomisp_camera_caps *(*get_camera_caps)(void);
217 	int (*gpio_intr_ctrl)(struct v4l2_subdev *subdev);
218 
219 	/* New G-Min power and GPIO interface, replaces
220 	 * power/gpio_ctrl with methods to control individual
221 	 * lines as implemented on all known camera modules. */
222 	int (*gpio0_ctrl)(struct v4l2_subdev *subdev, int on);
223 	int (*gpio1_ctrl)(struct v4l2_subdev *subdev, int on);
224 	int (*v1p8_ctrl)(struct v4l2_subdev *subdev, int on);
225 	int (*v2p8_ctrl)(struct v4l2_subdev *subdev, int on);
226 	int (*v1p2_ctrl)(struct v4l2_subdev *subdev, int on);
227 	struct camera_vcm_control * (*get_vcm_ctrl)(struct v4l2_subdev *subdev,
228 						    char *module_id);
229 };
230 
231 struct camera_af_platform_data {
232 	int (*power_ctrl)(struct v4l2_subdev *subdev, int flag);
233 };
234 
235 const struct camera_af_platform_data *camera_get_af_platform_data(void);
236 
237 struct camera_mipi_info {
238 	enum atomisp_camera_port        port;
239 	unsigned int                    num_lanes;
240 	enum atomisp_input_format       input_format;
241 	enum atomisp_bayer_order        raw_bayer_order;
242 	struct atomisp_sensor_mode_data data;
243 	enum atomisp_input_format       metadata_format;
244 	uint32_t                        metadata_width;
245 	uint32_t                        metadata_height;
246 	const uint32_t                  *metadata_effective_width;
247 };
248 
249 extern const struct atomisp_platform_data *atomisp_get_platform_data(void);
250 extern const struct atomisp_camera_caps *atomisp_get_default_camera_caps(void);
251 
252 /* API from old platform_camera.h, new CPUID implementation */
253 #define __IS_SOC(x) (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && \
254 		     boot_cpu_data.x86 == 6 &&                       \
255 		     boot_cpu_data.x86_model == x)
256 
257 #define IS_MFLD	__IS_SOC(0x27)
258 #define IS_BYT	__IS_SOC(0x37)
259 #define IS_CHT	__IS_SOC(0x4C)
260 #define IS_MOFD	__IS_SOC(0x5A)
261 
262 #endif /* ATOMISP_PLATFORM_H_ */
263