1 /* SPDX-License-Identifier: GPL-2.0+ */
3 * Copyright (c) 2011-2018 Magewell Electronics Co., Ltd. (Nanjing)
5 * Author: Yong Deng <yong.deng@magewell.com>
8 #ifndef __SUN6I_CSI_H__
9 #define __SUN6I_CSI_H__
11 #include <media/v4l2-device.h>
12 #include <media/v4l2-fwnode.h>
13 #include <media/videobuf2-v4l2.h>
15 #include "sun6i_csi_bridge.h"
16 #include "sun6i_csi_capture.h"
18 #define SUN6I_CSI_NAME "sun6i-csi"
19 #define SUN6I_CSI_DESCRIPTION "Allwinner A31 CSI Device"
22 SUN6I_CSI_PORT_PARALLEL = 0,
25 struct sun6i_csi_buffer {
26 struct vb2_v4l2_buffer v4l2_buffer;
27 struct list_head list;
31 * struct sun6i_csi_config - configs for sun6i csi
32 * @pixelformat: v4l2 pixel format (V4L2_PIX_FMT_*)
33 * @code: media bus format code (MEDIA_BUS_FMT_*)
34 * @field: used interlacing type (enum v4l2_field)
36 * @height: frame height
38 struct sun6i_csi_config {
46 struct sun6i_csi_v4l2 {
47 struct v4l2_device v4l2_dev;
48 struct media_device media_dev;
51 struct sun6i_csi_device {
54 struct sun6i_csi_config config;
55 struct sun6i_csi_v4l2 v4l2;
56 struct sun6i_csi_bridge bridge;
57 struct sun6i_csi_capture capture;
59 struct regmap *regmap;
60 struct clk *clock_mod;
61 struct clk *clock_ram;
62 struct reset_control *reset;
65 struct sun6i_csi_variant {
66 unsigned long clock_mod_rate;
70 * sun6i_csi_is_format_supported() - check if the format supported by csi
71 * @csi_dev: pointer to the csi device
72 * @pixformat: v4l2 pixel format (V4L2_PIX_FMT_*)
73 * @mbus_code: media bus format code (MEDIA_BUS_FMT_*)
75 * Return: true if format is supported, false otherwise.
77 bool sun6i_csi_is_format_supported(struct sun6i_csi_device *csi_dev,
78 u32 pixformat, u32 mbus_code);
81 * sun6i_csi_update_config() - update the csi register settings
82 * @csi_dev: pointer to the csi device
83 * @config: see struct sun6i_csi_config
85 * Return: 0 if successful, error code otherwise.
87 int sun6i_csi_update_config(struct sun6i_csi_device *csi_dev,
88 struct sun6i_csi_config *config);
90 /* get bpp form v4l2 pixformat */
91 static inline int sun6i_csi_get_bpp(unsigned int pixformat)
94 case V4L2_PIX_FMT_SBGGR8:
95 case V4L2_PIX_FMT_SGBRG8:
96 case V4L2_PIX_FMT_SGRBG8:
97 case V4L2_PIX_FMT_SRGGB8:
98 case V4L2_PIX_FMT_JPEG:
100 case V4L2_PIX_FMT_SBGGR10:
101 case V4L2_PIX_FMT_SGBRG10:
102 case V4L2_PIX_FMT_SGRBG10:
103 case V4L2_PIX_FMT_SRGGB10:
105 case V4L2_PIX_FMT_SBGGR12:
106 case V4L2_PIX_FMT_SGBRG12:
107 case V4L2_PIX_FMT_SGRBG12:
108 case V4L2_PIX_FMT_SRGGB12:
109 case V4L2_PIX_FMT_NV12_16L16:
110 case V4L2_PIX_FMT_NV12:
111 case V4L2_PIX_FMT_NV21:
112 case V4L2_PIX_FMT_YUV420:
113 case V4L2_PIX_FMT_YVU420:
115 case V4L2_PIX_FMT_YUYV:
116 case V4L2_PIX_FMT_YVYU:
117 case V4L2_PIX_FMT_UYVY:
118 case V4L2_PIX_FMT_VYUY:
119 case V4L2_PIX_FMT_NV16:
120 case V4L2_PIX_FMT_NV61:
121 case V4L2_PIX_FMT_YUV422P:
122 case V4L2_PIX_FMT_RGB565:
123 case V4L2_PIX_FMT_RGB565X:
125 case V4L2_PIX_FMT_RGB24:
126 case V4L2_PIX_FMT_BGR24:
128 case V4L2_PIX_FMT_RGB32:
129 case V4L2_PIX_FMT_BGR32:
132 WARN(1, "Unsupported pixformat: 0x%x\n", pixformat);
139 #endif /* __SUN6I_CSI_H__ */