1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright (C) 2013 - 2020 Intel Corporation */
4 #ifndef IPU_ISYS_SUBDEV_H
5 #define IPU_ISYS_SUBDEV_H
7 #include <linux/mutex.h>
9 #include <media/media-entity.h>
10 #include <media/v4l2-device.h>
11 #include <media/v4l2-ctrls.h>
13 #include "ipu-isys-queue.h"
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
29 #define IPU_ISYS_MIPI_CSI2_TYPE_USER_DEF(i) (0x30 + (i) - 1)
31 #define FMT_ENTRY (struct ipu_isys_fmt_entry [])
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
,
41 #define IPU_ISYS_SUBDEV_PROP_TGT_NR_OF \
42 (IPU_ISYS_SUBDEV_PROP_TGT_SOURCE_CROP + 1)
45 IPU_ISL_OFF
= 0, /* SOC BE */
46 IPU_ISL_CSI2_BE
, /* RAW BE */
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
,
63 struct ipu_isys_subdev
{
64 /* Serialise access to any other field in the struct */
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
;
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
,
78 struct v4l2_subdev_pad_config
*cfg
,
79 struct v4l2_subdev_format
*fmt
);
84 enum ipu_isl_mode isl_mode
;
85 enum ipu_be_mode be_mode
;
86 int source
; /* SSI stream source; -1 if unset */
89 #define to_ipu_isys_subdev(__sd) \
90 container_of(__sd, struct ipu_isys_subdev, sd)
92 struct v4l2_mbus_framefmt
*__ipu_isys_get_ffmt(struct v4l2_subdev
*sd
,
93 struct v4l2_subdev_pad_config
98 unsigned int ipu_isys_mbus_code_to_bpp(u32 code
);
99 unsigned int ipu_isys_mbus_code_to_mipi(u32 code
);
100 u32
ipu_isys_subdev_code_to_uncompressed(u32 sink_code
);
102 enum ipu_isys_subdev_pixelorder
ipu_isys_subdev_get_pixelorder(u32 code
);
104 int ipu_isys_subdev_fmt_propagate(struct v4l2_subdev
*sd
,
105 struct v4l2_subdev_pad_config
*cfg
,
106 struct v4l2_mbus_framefmt
*ffmt
,
108 enum isys_subdev_prop_tgt tgt
,
109 unsigned int pad
, unsigned int which
);
111 int ipu_isys_subdev_set_ffmt_default(struct v4l2_subdev
*sd
,
112 struct v4l2_subdev_pad_config
*cfg
,
113 struct v4l2_subdev_format
*fmt
);
114 int __ipu_isys_subdev_set_ffmt(struct v4l2_subdev
*sd
,
115 struct v4l2_subdev_pad_config
*cfg
,
116 struct v4l2_subdev_format
*fmt
);
117 struct v4l2_rect
*__ipu_isys_get_selection(struct v4l2_subdev
*sd
,
118 struct v4l2_subdev_pad_config
*cfg
,
122 int ipu_isys_subdev_set_ffmt(struct v4l2_subdev
*sd
,
123 struct v4l2_subdev_pad_config
*cfg
,
124 struct v4l2_subdev_format
*fmt
);
125 int ipu_isys_subdev_get_ffmt(struct v4l2_subdev
*sd
,
126 struct v4l2_subdev_pad_config
*cfg
,
127 struct v4l2_subdev_format
*fmt
);
128 int ipu_isys_subdev_get_sel(struct v4l2_subdev
*sd
,
129 struct v4l2_subdev_pad_config
*cfg
,
130 struct v4l2_subdev_selection
*sel
);
131 int ipu_isys_subdev_set_sel(struct v4l2_subdev
*sd
,
132 struct v4l2_subdev_pad_config
*cfg
,
133 struct v4l2_subdev_selection
*sel
);
134 int ipu_isys_subdev_enum_mbus_code(struct v4l2_subdev
*sd
,
135 struct v4l2_subdev_pad_config
*cfg
,
136 struct v4l2_subdev_mbus_code_enum
138 int ipu_isys_subdev_link_validate(struct v4l2_subdev
*sd
,
139 struct media_link
*link
,
140 struct v4l2_subdev_format
*source_fmt
,
141 struct v4l2_subdev_format
*sink_fmt
);
143 int ipu_isys_subdev_open(struct v4l2_subdev
*sd
, struct v4l2_subdev_fh
*fh
);
144 int ipu_isys_subdev_close(struct v4l2_subdev
*sd
, struct v4l2_subdev_fh
*fh
);
145 int ipu_isys_subdev_init(struct ipu_isys_subdev
*asd
,
146 struct v4l2_subdev_ops
*ops
,
147 unsigned int nr_ctrls
,
148 unsigned int num_pads
,
149 unsigned int num_source
,
150 unsigned int num_sink
,
151 unsigned int sd_flags
);
152 void ipu_isys_subdev_cleanup(struct ipu_isys_subdev
*asd
);
153 #endif /* IPU_ISYS_SUBDEV_H */