Merge tag 'pinctrl-v5.8-4' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[linux-2.6-microblaze.git] / drivers / staging / media / atomisp / include / linux / atomisp_platform.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Support for Medifield PNW Camera Imaging ISP subsystem.
4  *
5  * Copyright (c) 2010 Intel Corporation. All Rights Reserved.
6  *
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.
10  *
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.
15  *
16  *
17  */
18 #ifndef ATOMISP_PLATFORM_H_
19 #define ATOMISP_PLATFORM_H_
20
21 #include <asm/intel-family.h>
22 #include <asm/processor.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 #define N_ATOMISP_INPUT_FORMAT (ATOMISP_INPUT_FORMAT_USER_DEF8 + 1)
112
113 enum intel_v4l2_subdev_type {
114         RAW_CAMERA = 1,
115         SOC_CAMERA = 2,
116         CAMERA_MOTOR = 3,
117         LED_FLASH = 4,
118         XENON_FLASH = 5,
119         FILE_INPUT = 6,
120         TEST_PATTERN = 7,
121 };
122
123 struct intel_v4l2_subdev_id {
124         char name[17];
125         enum intel_v4l2_subdev_type type;
126         enum atomisp_camera_port    port;
127 };
128
129 struct intel_v4l2_subdev_i2c_board_info {
130         struct i2c_board_info board_info;
131         int i2c_adapter_id;
132 };
133
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;
139 };
140
141 struct atomisp_platform_data {
142         struct intel_v4l2_subdev_table *subdevs;
143 };
144
145 /* Describe the capacities of one single sensor. */
146 struct atomisp_sensor_caps {
147         /* The number of streams this sensor can output. */
148         int stream_num;
149         bool is_slave;
150 };
151
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. */
155         int sensor_num;
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;
160 };
161
162 /*
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
166  */
167 struct atomisp_isys_config_info {
168         u8 input_format;
169         u16 width;
170         u16 height;
171 };
172
173 struct atomisp_input_stream_info {
174         enum atomisp_input_stream_id stream;
175         u8 enable;
176         /* Sensor driver fills ch_id with the id
177            of the virtual channel. */
178         u8 ch_id;
179         /* Tells how many streams in this virtual channel. If 0 ignore rest
180          * and the input format will be from mipi_info */
181         u8 isys_configs;
182         /*
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
186          */
187         struct atomisp_isys_config_info isys_info[MAX_STREAMS_PER_CHANNEL];
188 };
189
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);
201 };
202
203 struct camera_vcm_control {
204         char camera_module[CAMERA_MODULE_ID_LEN];
205         struct camera_vcm_ops *ops;
206         struct list_head list;
207 };
208
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);
212
213         /*
214          * New G-Min power and GPIO interface to control individual
215          * lines as implemented on all known camera modules.
216          */
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,
223                 char *module_id);
224 };
225
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;
233         u32                             metadata_width;
234         u32                             metadata_height;
235         const u32                       *metadata_effective_width;
236 };
237
238 const struct atomisp_platform_data *atomisp_get_platform_data(void);
239 const struct atomisp_camera_caps *atomisp_get_default_camera_caps(void);
240
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)))
249
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)
255
256 /* Both CHT and MOFD come with ISP2401 */
257 #define IS_ISP2401 __IS_SOCS(INTEL_FAM6_ATOM_AIRMONT, \
258                              INTEL_FAM6_ATOM_AIRMONT_MID)
259
260 #endif /* ATOMISP_PLATFORM_H_ */