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
|