Merge branch 'core-objtool-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-block.git] / drivers / media / platform / sunxi / sun8i-rotate / sun8i-rotate.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Allwinner DE2 rotation driver
4  *
5  * Copyright (C) 2020 Jernej Skrabec <jernej.skrabec@siol.net>
6  */
7
8 #ifndef _SUN8I_ROTATE_H_
9 #define _SUN8I_ROTATE_H_
10
11 #include <media/v4l2-ctrls.h>
12 #include <media/v4l2-device.h>
13 #include <media/v4l2-mem2mem.h>
14 #include <media/videobuf2-v4l2.h>
15 #include <media/videobuf2-dma-contig.h>
16
17 #include <linux/platform_device.h>
18
19 #define ROTATE_NAME             "sun8i-rotate"
20
21 #define ROTATE_GLB_CTL                  0x00
22 #define ROTATE_GLB_CTL_START                    BIT(31)
23 #define ROTATE_GLB_CTL_RESET                    BIT(30)
24 #define ROTATE_GLB_CTL_BURST_LEN(x)             ((x) << 16)
25 #define ROTATE_GLB_CTL_HFLIP                    BIT(7)
26 #define ROTATE_GLB_CTL_VFLIP                    BIT(6)
27 #define ROTATE_GLB_CTL_ROTATION(x)              ((x) << 4)
28 #define ROTATE_GLB_CTL_MODE(x)                  ((x) << 0)
29
30 #define ROTATE_INT                      0x04
31 #define ROTATE_INT_FINISH_IRQ_EN                BIT(16)
32 #define ROTATE_INT_FINISH_IRQ                   BIT(0)
33
34 #define ROTATE_IN_FMT                   0x20
35 #define ROTATE_IN_FMT_FORMAT(x)                 ((x) << 0)
36
37 #define ROTATE_IN_SIZE                  0x24
38 #define ROTATE_IN_PITCH0                0x30
39 #define ROTATE_IN_PITCH1                0x34
40 #define ROTATE_IN_PITCH2                0x38
41 #define ROTATE_IN_ADDRL0                0x40
42 #define ROTATE_IN_ADDRH0                0x44
43 #define ROTATE_IN_ADDRL1                0x48
44 #define ROTATE_IN_ADDRH1                0x4c
45 #define ROTATE_IN_ADDRL2                0x50
46 #define ROTATE_IN_ADDRH2                0x54
47 #define ROTATE_OUT_SIZE                 0x84
48 #define ROTATE_OUT_PITCH0               0x90
49 #define ROTATE_OUT_PITCH1               0x94
50 #define ROTATE_OUT_PITCH2               0x98
51 #define ROTATE_OUT_ADDRL0               0xA0
52 #define ROTATE_OUT_ADDRH0               0xA4
53 #define ROTATE_OUT_ADDRL1               0xA8
54 #define ROTATE_OUT_ADDRH1               0xAC
55 #define ROTATE_OUT_ADDRL2               0xB0
56 #define ROTATE_OUT_ADDRH2               0xB4
57
58 #define ROTATE_BURST_8                  0x07
59 #define ROTATE_BURST_16                 0x0f
60 #define ROTATE_BURST_32                 0x1f
61 #define ROTATE_BURST_64                 0x3f
62
63 #define ROTATE_MODE_COPY_ROTATE         0x01
64
65 #define ROTATE_FORMAT_ARGB32            0x00
66 #define ROTATE_FORMAT_ABGR32            0x01
67 #define ROTATE_FORMAT_RGBA32            0x02
68 #define ROTATE_FORMAT_BGRA32            0x03
69 #define ROTATE_FORMAT_XRGB32            0x04
70 #define ROTATE_FORMAT_XBGR32            0x05
71 #define ROTATE_FORMAT_RGBX32            0x06
72 #define ROTATE_FORMAT_BGRX32            0x07
73 #define ROTATE_FORMAT_RGB24             0x08
74 #define ROTATE_FORMAT_BGR24             0x09
75 #define ROTATE_FORMAT_RGB565            0x0a
76 #define ROTATE_FORMAT_BGR565            0x0b
77 #define ROTATE_FORMAT_ARGB4444          0x0c
78 #define ROTATE_FORMAT_ABGR4444          0x0d
79 #define ROTATE_FORMAT_RGBA4444          0x0e
80 #define ROTATE_FORMAT_BGRA4444          0x0f
81 #define ROTATE_FORMAT_ARGB1555          0x10
82 #define ROTATE_FORMAT_ABGR1555          0x11
83 #define ROTATE_FORMAT_RGBA5551          0x12
84 #define ROTATE_FORMAT_BGRA5551          0x13
85
86 #define ROTATE_FORMAT_YUYV              0x20
87 #define ROTATE_FORMAT_UYVY              0x21
88 #define ROTATE_FORMAT_YVYU              0x22
89 #define ROTATE_FORMAT_VYUV              0x23
90 #define ROTATE_FORMAT_NV61              0x24
91 #define ROTATE_FORMAT_NV16              0x25
92 #define ROTATE_FORMAT_YUV422P           0x26
93 #define ROTATE_FORMAT_NV21              0x28
94 #define ROTATE_FORMAT_NV12              0x29
95 #define ROTATE_FORMAT_YUV420P           0x2A
96
97 #define ROTATE_SIZE(w, h)       (((h) - 1) << 16 | ((w) - 1))
98
99 #define ROTATE_MIN_WIDTH        8U
100 #define ROTATE_MIN_HEIGHT       8U
101 #define ROTATE_MAX_WIDTH        4096U
102 #define ROTATE_MAX_HEIGHT       4096U
103
104 struct rotate_ctx {
105         struct v4l2_fh          fh;
106         struct rotate_dev       *dev;
107
108         struct v4l2_pix_format  src_fmt;
109         struct v4l2_pix_format  dst_fmt;
110
111         struct v4l2_ctrl_handler ctrl_handler;
112
113         u32 hflip;
114         u32 vflip;
115         u32 rotate;
116 };
117
118 struct rotate_dev {
119         struct v4l2_device      v4l2_dev;
120         struct video_device     vfd;
121         struct device           *dev;
122         struct v4l2_m2m_dev     *m2m_dev;
123
124         /* Device file mutex */
125         struct mutex            dev_mutex;
126
127         void __iomem            *base;
128
129         struct clk              *bus_clk;
130         struct clk              *mod_clk;
131
132         struct reset_control    *rstc;
133 };
134
135 #endif