]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - drivers/media/pci/intel/ipu-isys-subdev.h
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
CommitLineData
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
33enum 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
44enum ipu_isl_mode {
45 IPU_ISL_OFF = 0, /* SOC BE */
46 IPU_ISL_CSI2_BE, /* RAW BE */
47};
48
49enum ipu_be_mode {
50 IPU_BE_RAW = 0,
51 IPU_BE_SOC
52};
53
54enum 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
61struct ipu_isys;
62
63struct 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
92struct 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
97unsigned int ipu_isys_mbus_code_to_bpp(u32 code);
98unsigned int ipu_isys_mbus_code_to_mipi(u32 code);
99u32 ipu_isys_subdev_code_to_uncompressed(u32 sink_code);
100
101enum ipu_isys_subdev_pixelorder ipu_isys_subdev_get_pixelorder(u32 code);
102
103int 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
110int 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);
113int __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);
116struct 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);
121int 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);
124int 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);
127int 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);
130int 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);
133int 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);
137int 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
142int ipu_isys_subdev_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
143int ipu_isys_subdev_close(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
144int 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);
151void ipu_isys_subdev_cleanup(struct ipu_isys_subdev *asd);
152#endif /* IPU_ISYS_SUBDEV_H */