1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Support for Medifield PNW Camera Imaging ISP subsystem.
5 * Copyright (c) 2010 Intel Corporation. All Rights Reserved.
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License version
9 * 2 as published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
18 #ifndef ATOMISP_PLATFORM_H_
19 #define ATOMISP_PLATFORM_H_
21 #include <asm/intel-family.h>
22 #include <asm/processor.h>
24 #include <linux/i2c.h>
25 #include <linux/sfi.h>
26 #include <media/v4l2-subdev.h>
29 #define MAX_SENSORS_PER_PORT 4
30 #define MAX_STREAMS_PER_CHANNEL 2
32 #define CAMERA_MODULE_ID_LEN 64
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
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
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. */
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.
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 */
85 /* CSI2-MIPI specific format: YUV data.
87 ATOMISP_INPUT_FORMAT_YUV420_8_SHIFT, /* YUV420 8-bit (Chroma Shifted
89 ATOMISP_INPUT_FORMAT_YUV420_10_SHIFT, /* YUV420 8-bit (Chroma Shifted
92 /* CSI2-MIPI specific format: Generic long packet data
94 ATOMISP_INPUT_FORMAT_EMBEDDED, /* Embedded 8-bit non Image Data */
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.
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 */
111 #define N_ATOMISP_INPUT_FORMAT (ATOMISP_INPUT_FORMAT_USER_DEF8 + 1)
113 enum intel_v4l2_subdev_type {
123 struct intel_v4l2_subdev_id {
125 enum intel_v4l2_subdev_type type;
126 enum atomisp_camera_port port;
129 struct intel_v4l2_subdev_i2c_board_info {
130 struct i2c_board_info board_info;
134 struct intel_v4l2_subdev_table {
135 struct intel_v4l2_subdev_i2c_board_info v4l2_subdev;
136 enum intel_v4l2_subdev_type type;
137 enum atomisp_camera_port port;
138 struct v4l2_subdev *subdev;
141 struct atomisp_platform_data {
142 struct intel_v4l2_subdev_table *subdevs;
145 /* Describe the capacities of one single sensor. */
146 struct atomisp_sensor_caps {
147 /* The number of streams this sensor can output. */
152 /* Describe the capacities of sensors connected to one camera port. */
153 struct atomisp_camera_caps {
154 /* The number of sensors connected to this camera port. */
156 /* The capacities of each sensor. */
157 struct atomisp_sensor_caps sensor[MAX_SENSORS_PER_PORT];
158 /* Define whether stream control is required for multiple streams. */
159 bool multi_stream_ctrl;
163 * Sensor of external ISP can send multiple steams with different mipi data
164 * type in the same virtual channel. This information needs to come from the
165 * sensor or external ISP
167 struct atomisp_isys_config_info {
173 struct atomisp_input_stream_info {
174 enum atomisp_input_stream_id stream;
176 /* Sensor driver fills ch_id with the id
177 of the virtual channel. */
179 /* Tells how many streams in this virtual channel. If 0 ignore rest
180 * and the input format will be from mipi_info */
183 * if more isys_configs is more than 0, sensor needs to configure the
184 * input format differently. width and height can be 0. If width and
185 * height is not zero, then the corresponsing data needs to be set
187 struct atomisp_isys_config_info isys_info[MAX_STREAMS_PER_CHANNEL];
190 struct camera_vcm_control;
191 struct camera_vcm_ops {
192 int (*power_up)(struct v4l2_subdev *sd, struct camera_vcm_control *vcm);
193 int (*power_down)(struct v4l2_subdev *sd,
194 struct camera_vcm_control *vcm);
195 int (*queryctrl)(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc,
196 struct camera_vcm_control *vcm);
197 int (*g_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl,
198 struct camera_vcm_control *vcm);
199 int (*s_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl,
200 struct camera_vcm_control *vcm);
203 struct camera_vcm_control {
204 char camera_module[CAMERA_MODULE_ID_LEN];
205 struct camera_vcm_ops *ops;
206 struct list_head list;
209 struct camera_sensor_platform_data {
210 int (*flisclk_ctrl)(struct v4l2_subdev *subdev, int flag);
211 int (*csi_cfg)(struct v4l2_subdev *subdev, int flag);
214 * New G-Min power and GPIO interface to control individual
215 * lines as implemented on all known camera modules.
217 int (*gpio0_ctrl)(struct v4l2_subdev *subdev, int on);
218 int (*gpio1_ctrl)(struct v4l2_subdev *subdev, int on);
219 int (*v1p8_ctrl)(struct v4l2_subdev *subdev, int on);
220 int (*v2p8_ctrl)(struct v4l2_subdev *subdev, int on);
221 int (*v1p2_ctrl)(struct v4l2_subdev *subdev, int on);
222 struct camera_vcm_control *(*get_vcm_ctrl)(struct v4l2_subdev *subdev,
226 struct camera_mipi_info {
227 enum atomisp_camera_port port;
228 unsigned int num_lanes;
229 enum atomisp_input_format input_format;
230 enum atomisp_bayer_order raw_bayer_order;
231 struct atomisp_sensor_mode_data data;
232 enum atomisp_input_format metadata_format;
235 const u32 *metadata_effective_width;
238 const struct atomisp_platform_data *atomisp_get_platform_data(void);
239 const struct atomisp_camera_caps *atomisp_get_default_camera_caps(void);
241 /* API from old platform_camera.h, new CPUID implementation */
242 #define __IS_SOC(x) (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && \
243 boot_cpu_data.x86 == 6 && \
244 boot_cpu_data.x86_model == (x))
245 #define __IS_SOCS(x,y) (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && \
246 boot_cpu_data.x86 == 6 && \
247 (boot_cpu_data.x86_model == (x) || \
248 boot_cpu_data.x86_model == (y)))
250 #define IS_MFLD __IS_SOC(INTEL_FAM6_ATOM_SALTWELL_MID)
251 #define IS_BYT __IS_SOC(INTEL_FAM6_ATOM_SILVERMONT)
252 #define IS_CHT __IS_SOC(INTEL_FAM6_ATOM_AIRMONT)
253 #define IS_MRFD __IS_SOC(INTEL_FAM6_ATOM_SILVERMONT_MID)
254 #define IS_MOFD __IS_SOC(INTEL_FAM6_ATOM_AIRMONT_MID)
256 /* Both CHT and MOFD come with ISP2401 */
257 #define IS_ISP2401 __IS_SOCS(INTEL_FAM6_ATOM_AIRMONT, \
258 INTEL_FAM6_ATOM_AIRMONT_MID)
260 #endif /* ATOMISP_PLATFORM_H_ */