media: sun6i-csi: Move power management to runtime pm in capture
[linux-block.git] / drivers / media / platform / sunxi / sun6i-csi / sun6i_csi.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Copyright (c) 2011-2018 Magewell Electronics Co., Ltd. (Nanjing)
4  * All rights reserved.
5  * Author: Yong Deng <yong.deng@magewell.com>
6  */
7
8 #ifndef __SUN6I_CSI_H__
9 #define __SUN6I_CSI_H__
10
11 #include <media/v4l2-device.h>
12 #include <media/v4l2-fwnode.h>
13 #include <media/videobuf2-v4l2.h>
14
15 #include "sun6i_csi_bridge.h"
16 #include "sun6i_csi_capture.h"
17
18 #define SUN6I_CSI_NAME          "sun6i-csi"
19 #define SUN6I_CSI_DESCRIPTION   "Allwinner A31 CSI Device"
20
21 enum sun6i_csi_port {
22         SUN6I_CSI_PORT_PARALLEL         = 0,
23 };
24
25 struct sun6i_csi_buffer {
26         struct vb2_v4l2_buffer          v4l2_buffer;
27         struct list_head                list;
28 };
29
30 /**
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)
35  * @width:      frame width
36  * @height:     frame height
37  */
38 struct sun6i_csi_config {
39         u32             pixelformat;
40         u32             code;
41         u32             field;
42         u32             width;
43         u32             height;
44 };
45
46 struct sun6i_csi_v4l2 {
47         struct v4l2_device              v4l2_dev;
48         struct media_device             media_dev;
49 };
50
51 struct sun6i_csi_device {
52         struct device                   *dev;
53
54         struct sun6i_csi_config         config;
55         struct sun6i_csi_v4l2           v4l2;
56         struct sun6i_csi_bridge         bridge;
57         struct sun6i_csi_capture        capture;
58
59         struct regmap                   *regmap;
60         struct clk                      *clock_mod;
61         struct clk                      *clock_ram;
62         struct reset_control            *reset;
63 };
64
65 struct sun6i_csi_variant {
66         unsigned long   clock_mod_rate;
67 };
68
69 /**
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_*)
74  *
75  * Return: true if format is supported, false otherwise.
76  */
77 bool sun6i_csi_is_format_supported(struct sun6i_csi_device *csi_dev,
78                                    u32 pixformat, u32 mbus_code);
79
80 /**
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
84  *
85  * Return: 0 if successful, error code otherwise.
86  */
87 int sun6i_csi_update_config(struct sun6i_csi_device *csi_dev,
88                             struct sun6i_csi_config *config);
89
90 /* get bpp form v4l2 pixformat */
91 static inline int sun6i_csi_get_bpp(unsigned int pixformat)
92 {
93         switch (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:
99                 return 8;
100         case V4L2_PIX_FMT_SBGGR10:
101         case V4L2_PIX_FMT_SGBRG10:
102         case V4L2_PIX_FMT_SGRBG10:
103         case V4L2_PIX_FMT_SRGGB10:
104                 return 10;
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:
114                 return 12;
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:
124                 return 16;
125         case V4L2_PIX_FMT_RGB24:
126         case V4L2_PIX_FMT_BGR24:
127                 return 24;
128         case V4L2_PIX_FMT_RGB32:
129         case V4L2_PIX_FMT_BGR32:
130                 return 32;
131         default:
132                 WARN(1, "Unsupported pixformat: 0x%x\n", pixformat);
133                 break;
134         }
135
136         return 0;
137 }
138
139 #endif /* __SUN6I_CSI_H__ */