]>
Commit | Line | Data |
---|---|---|
f2efa4ee WY |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* Copyright (C) 2013 - 2020 Intel Corporation */ | |
3 | ||
4 | #ifndef IPU_ISYS_SUBDEV_H | |
5 | #define IPU_ISYS_SUBDEV_H | |
6 | ||
7 | #include <linux/mutex.h> | |
8 | ||
9 | #include <media/media-entity.h> | |
10 | #include <media/v4l2-device.h> | |
11 | #include <media/v4l2-ctrls.h> | |
12 | ||
13 | #include "ipu-isys-queue.h" | |
14 | ||
15 | #define IPU_ISYS_MIPI_CSI2_TYPE_NULL 0x10 | |
16 | #define IPU_ISYS_MIPI_CSI2_TYPE_BLANKING 0x11 | |
17 | #define IPU_ISYS_MIPI_CSI2_TYPE_EMBEDDED8 0x12 | |
18 | #define IPU_ISYS_MIPI_CSI2_TYPE_YUV422_8 0x1e | |
19 | #define IPU_ISYS_MIPI_CSI2_TYPE_YUV422_10 0x1f | |
20 | #define IPU_ISYS_MIPI_CSI2_TYPE_RGB565 0x22 | |
21 | #define IPU_ISYS_MIPI_CSI2_TYPE_RGB888 0x24 | |
22 | #define IPU_ISYS_MIPI_CSI2_TYPE_RAW6 0x28 | |
23 | #define IPU_ISYS_MIPI_CSI2_TYPE_RAW7 0x29 | |
24 | #define IPU_ISYS_MIPI_CSI2_TYPE_RAW8 0x2a | |
25 | #define IPU_ISYS_MIPI_CSI2_TYPE_RAW10 0x2b | |
26 | #define IPU_ISYS_MIPI_CSI2_TYPE_RAW12 0x2c | |
27 | #define IPU_ISYS_MIPI_CSI2_TYPE_RAW14 0x2d | |
28 | /* 1-8 */ | |
29 | #define IPU_ISYS_MIPI_CSI2_TYPE_USER_DEF(i) (0x30 + (i) - 1) | |
30 | ||
31 | #define FMT_ENTRY (struct ipu_isys_fmt_entry []) | |
32 | ||
33 | enum isys_subdev_prop_tgt { | |
34 | IPU_ISYS_SUBDEV_PROP_TGT_SINK_FMT, | |
35 | IPU_ISYS_SUBDEV_PROP_TGT_SINK_CROP, | |
36 | IPU_ISYS_SUBDEV_PROP_TGT_SINK_COMPOSE, | |
37 | IPU_ISYS_SUBDEV_PROP_TGT_SOURCE_COMPOSE, | |
38 | IPU_ISYS_SUBDEV_PROP_TGT_SOURCE_CROP, | |
39 | }; | |
40 | ||
41 | #define IPU_ISYS_SUBDEV_PROP_TGT_NR_OF \ | |
42 | (IPU_ISYS_SUBDEV_PROP_TGT_SOURCE_CROP + 1) | |
43 | ||
44 | enum ipu_isl_mode { | |
45 | IPU_ISL_OFF = 0, /* SOC BE */ | |
46 | IPU_ISL_CSI2_BE, /* RAW BE */ | |
47 | }; | |
48 | ||
49 | enum ipu_be_mode { | |
50 | IPU_BE_RAW = 0, | |
51 | IPU_BE_SOC | |
52 | }; | |
53 | ||
54 | enum ipu_isys_subdev_pixelorder { | |
55 | IPU_ISYS_SUBDEV_PIXELORDER_BGGR = 0, | |
56 | IPU_ISYS_SUBDEV_PIXELORDER_GBRG, | |
57 | IPU_ISYS_SUBDEV_PIXELORDER_GRBG, | |
58 | IPU_ISYS_SUBDEV_PIXELORDER_RGGB, | |
59 | }; | |
60 | ||
61 | struct ipu_isys; | |
62 | ||
63 | struct ipu_isys_subdev { | |
64 | /* Serialise access to any other field in the struct */ | |
65 | struct mutex mutex; | |
66 | struct v4l2_subdev sd; | |
67 | struct ipu_isys *isys; | |
68 | u32 const *const *supported_codes; | |
69 | struct media_pad *pad; | |
70 | struct v4l2_mbus_framefmt *ffmt; | |
71 | struct v4l2_rect *crop; | |
72 | struct v4l2_rect *compose; | |
73 | unsigned int nsinks; | |
74 | unsigned int nsources; | |
75 | struct v4l2_ctrl_handler ctrl_handler; | |
76 | void (*ctrl_init)(struct v4l2_subdev *sd); | |
77 | void (*set_ffmt)(struct v4l2_subdev *sd, | |
5a771b35 | 78 | struct v4l2_subdev_state *sd_state, |
f2efa4ee WY |
79 | struct v4l2_subdev_format *fmt); |
80 | struct { | |
81 | bool crop; | |
82 | bool compose; | |
83 | } *valid_tgts; | |
84 | enum ipu_isl_mode isl_mode; | |
85 | enum ipu_be_mode be_mode; | |
86 | int source; /* SSI stream source; -1 if unset */ | |
87 | }; | |
88 | ||
89 | #define to_ipu_isys_subdev(__sd) \ | |
90 | container_of(__sd, struct ipu_isys_subdev, sd) | |
91 | ||
92 | struct v4l2_mbus_framefmt *__ipu_isys_get_ffmt(struct v4l2_subdev *sd, | |
5a771b35 | 93 | struct v4l2_subdev_state *sd_state, |
f2efa4ee WY |
94 | unsigned int pad, |
95 | unsigned int which); | |
96 | ||
97 | unsigned int ipu_isys_mbus_code_to_bpp(u32 code); | |
98 | unsigned int ipu_isys_mbus_code_to_mipi(u32 code); | |
99 | u32 ipu_isys_subdev_code_to_uncompressed(u32 sink_code); | |
100 | ||
101 | enum ipu_isys_subdev_pixelorder ipu_isys_subdev_get_pixelorder(u32 code); | |
102 | ||
103 | int ipu_isys_subdev_fmt_propagate(struct v4l2_subdev *sd, | |
5a771b35 | 104 | struct v4l2_subdev_state *sd_state, |
f2efa4ee WY |
105 | struct v4l2_mbus_framefmt *ffmt, |
106 | struct v4l2_rect *r, | |
107 | enum isys_subdev_prop_tgt tgt, | |
108 | unsigned int pad, unsigned int which); | |
109 | ||
110 | int ipu_isys_subdev_set_ffmt_default(struct v4l2_subdev *sd, | |
5a771b35 | 111 | struct v4l2_subdev_state *sd_state, |
f2efa4ee WY |
112 | struct v4l2_subdev_format *fmt); |
113 | int __ipu_isys_subdev_set_ffmt(struct v4l2_subdev *sd, | |
5a771b35 | 114 | struct v4l2_subdev_state *sd_state, |
f2efa4ee WY |
115 | struct v4l2_subdev_format *fmt); |
116 | struct v4l2_rect *__ipu_isys_get_selection(struct v4l2_subdev *sd, | |
5a771b35 | 117 | struct v4l2_subdev_state *sd_state, |
f2efa4ee WY |
118 | unsigned int target, |
119 | unsigned int pad, | |
120 | unsigned int which); | |
121 | int ipu_isys_subdev_set_ffmt(struct v4l2_subdev *sd, | |
5a771b35 | 122 | struct v4l2_subdev_state *sd_state, |
f2efa4ee WY |
123 | struct v4l2_subdev_format *fmt); |
124 | int ipu_isys_subdev_get_ffmt(struct v4l2_subdev *sd, | |
5a771b35 | 125 | struct v4l2_subdev_state *sd_state, |
f2efa4ee WY |
126 | struct v4l2_subdev_format *fmt); |
127 | int ipu_isys_subdev_get_sel(struct v4l2_subdev *sd, | |
5a771b35 | 128 | struct v4l2_subdev_state *sd_state, |
f2efa4ee WY |
129 | struct v4l2_subdev_selection *sel); |
130 | int ipu_isys_subdev_set_sel(struct v4l2_subdev *sd, | |
5a771b35 | 131 | struct v4l2_subdev_state *sd_state, |
f2efa4ee WY |
132 | struct v4l2_subdev_selection *sel); |
133 | int ipu_isys_subdev_enum_mbus_code(struct v4l2_subdev *sd, | |
5a771b35 | 134 | struct v4l2_subdev_state *sd_state, |
f2efa4ee WY |
135 | struct v4l2_subdev_mbus_code_enum |
136 | *code); | |
137 | int ipu_isys_subdev_link_validate(struct v4l2_subdev *sd, | |
138 | struct media_link *link, | |
139 | struct v4l2_subdev_format *source_fmt, | |
140 | struct v4l2_subdev_format *sink_fmt); | |
141 | ||
142 | int ipu_isys_subdev_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh); | |
143 | int ipu_isys_subdev_close(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh); | |
144 | int ipu_isys_subdev_init(struct ipu_isys_subdev *asd, | |
145 | struct v4l2_subdev_ops *ops, | |
146 | unsigned int nr_ctrls, | |
147 | unsigned int num_pads, | |
148 | unsigned int num_source, | |
149 | unsigned int num_sink, | |
150 | unsigned int sd_flags); | |
151 | void ipu_isys_subdev_cleanup(struct ipu_isys_subdev *asd); | |
152 | #endif /* IPU_ISYS_SUBDEV_H */ |