]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - drivers/media/pci/intel/ipu-isys-subdev.h
Revert "UBUNTU: SAUCE: IPU6 driver release for kernel 5.14 on 2021-11-01"
[mirror_ubuntu-jammy-kernel.git] / drivers / media / pci / intel / ipu-isys-subdev.h
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,
78 struct v4l2_subdev_pad_config *cfg,
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,
93 struct v4l2_subdev_pad_config
94 *cfg,
95 unsigned int pad,
96 unsigned int which);
97
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);
101
102 enum ipu_isys_subdev_pixelorder ipu_isys_subdev_get_pixelorder(u32 code);
103
104 int ipu_isys_subdev_fmt_propagate(struct v4l2_subdev *sd,
105 struct v4l2_subdev_pad_config *cfg,
106 struct v4l2_mbus_framefmt *ffmt,
107 struct v4l2_rect *r,
108 enum isys_subdev_prop_tgt tgt,
109 unsigned int pad, unsigned int which);
110
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,
119 unsigned int target,
120 unsigned int pad,
121 unsigned int which);
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
137 *code);
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);
142
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 */