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