summaryrefslogtreecommitdiff
path: root/drivers/media/platform/sunxi/sun8i-rotate/sun8i-rotate.h
blob: 32ade97ba5728a7df57f2faab9aa29be9afdbe8e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Allwinner DE2 rotation driver
 *
 * Copyright (C) 2020 Jernej Skrabec <jernej.skrabec@siol.net>
 */

#ifndef _SUN8I_ROTATE_H_
#define _SUN8I_ROTATE_H_

#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>
#include <media/v4l2-mem2mem.h>
#include <media/videobuf2-v4l2.h>
#include <media/videobuf2-dma-contig.h>

#include <linux/platform_device.h>

#define ROTATE_NAME		"sun8i-rotate"

#define ROTATE_GLB_CTL			0x00
#define ROTATE_GLB_CTL_START			BIT(31)
#define ROTATE_GLB_CTL_RESET			BIT(30)
#define ROTATE_GLB_CTL_BURST_LEN(x)		((x) << 16)
#define ROTATE_GLB_CTL_HFLIP			BIT(7)
#define ROTATE_GLB_CTL_VFLIP			BIT(6)
#define ROTATE_GLB_CTL_ROTATION(x)		((x) << 4)
#define ROTATE_GLB_CTL_MODE(x)			((x) << 0)

#define ROTATE_INT			0x04
#define ROTATE_INT_FINISH_IRQ_EN		BIT(16)
#define ROTATE_INT_FINISH_IRQ			BIT(0)

#define ROTATE_IN_FMT			0x20
#define ROTATE_IN_FMT_FORMAT(x)			((x) << 0)

#define ROTATE_IN_SIZE			0x24
#define ROTATE_IN_PITCH0		0x30
#define ROTATE_IN_PITCH1		0x34
#define ROTATE_IN_PITCH2		0x38
#define ROTATE_IN_ADDRL0		0x40
#define ROTATE_IN_ADDRH0		0x44
#define ROTATE_IN_ADDRL1		0x48
#define ROTATE_IN_ADDRH1		0x4c
#define ROTATE_IN_ADDRL2		0x50
#define ROTATE_IN_ADDRH2		0x54
#define ROTATE_OUT_SIZE			0x84
#define ROTATE_OUT_PITCH0		0x90
#define ROTATE_OUT_PITCH1		0x94
#define ROTATE_OUT_PITCH2		0x98
#define ROTATE_OUT_ADDRL0		0xA0
#define ROTATE_OUT_ADDRH0		0xA4
#define ROTATE_OUT_ADDRL1		0xA8
#define ROTATE_OUT_ADDRH1		0xAC
#define ROTATE_OUT_ADDRL2		0xB0
#define ROTATE_OUT_ADDRH2		0xB4

#define ROTATE_BURST_8			0x07
#define ROTATE_BURST_16			0x0f
#define ROTATE_BURST_32			0x1f
#define ROTATE_BURST_64			0x3f

#define ROTATE_MODE_COPY_ROTATE		0x01

#define ROTATE_FORMAT_ARGB32		0x00
#define ROTATE_FORMAT_ABGR32		0x01
#define ROTATE_FORMAT_RGBA32		0x02
#define ROTATE_FORMAT_BGRA32		0x03
#define ROTATE_FORMAT_XRGB32		0x04
#define ROTATE_FORMAT_XBGR32		0x05
#define ROTATE_FORMAT_RGBX32		0x06
#define ROTATE_FORMAT_BGRX32		0x07
#define ROTATE_FORMAT_RGB24		0x08
#define ROTATE_FORMAT_BGR24		0x09
#define ROTATE_FORMAT_RGB565		0x0a
#define ROTATE_FORMAT_BGR565		0x0b
#define ROTATE_FORMAT_ARGB4444		0x0c
#define ROTATE_FORMAT_ABGR4444		0x0d
#define ROTATE_FORMAT_RGBA4444		0x0e
#define ROTATE_FORMAT_BGRA4444		0x0f
#define ROTATE_FORMAT_ARGB1555		0x10
#define ROTATE_FORMAT_ABGR1555		0x11
#define ROTATE_FORMAT_RGBA5551		0x12
#define ROTATE_FORMAT_BGRA5551		0x13

#define ROTATE_FORMAT_YUYV		0x20
#define ROTATE_FORMAT_UYVY		0x21
#define ROTATE_FORMAT_YVYU		0x22
#define ROTATE_FORMAT_VYUV		0x23
#define ROTATE_FORMAT_NV61		0x24
#define ROTATE_FORMAT_NV16		0x25
#define ROTATE_FORMAT_YUV422P		0x26
#define ROTATE_FORMAT_NV21		0x28
#define ROTATE_FORMAT_NV12		0x29
#define ROTATE_FORMAT_YUV420P		0x2A

#define ROTATE_SIZE(w, h)	(((h) - 1) << 16 | ((w) - 1))

#define ROTATE_MIN_WIDTH	8U
#define ROTATE_MIN_HEIGHT	8U
#define ROTATE_MAX_WIDTH	4096U
#define ROTATE_MAX_HEIGHT	4096U

struct rotate_ctx {
	struct v4l2_fh		fh;
	struct rotate_dev	*dev;

	struct v4l2_pix_format	src_fmt;
	struct v4l2_pix_format	dst_fmt;

	struct v4l2_ctrl_handler ctrl_handler;

	u32 hflip;
	u32 vflip;
	u32 rotate;
};

struct rotate_dev {
	struct v4l2_device	v4l2_dev;
	struct video_device	vfd;
	struct device		*dev;
	struct v4l2_m2m_dev	*m2m_dev;

	/* Device file mutex */
	struct mutex		dev_mutex;

	void __iomem		*base;

	struct clk		*bus_clk;
	struct clk		*mod_clk;

	struct reset_control	*rstc;
};

#endif