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