1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2020 Rockchip Electronics Co. Ltd. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Author: Guochun Huang<hero.huang@rock-chips.com> 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef RK628_DSI_H 9*4882a593Smuzhiyun #define RK628_DSI_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/delay.h> 12*4882a593Smuzhiyun #include <linux/videodev2.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #include "rk628.h" 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define DSI0_BASE 0x50000 17*4882a593Smuzhiyun #define DSI1_BASE 0x60000 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define DSI_VERSION 0x0000 20*4882a593Smuzhiyun #define DSI_PWR_UP 0x0004 21*4882a593Smuzhiyun #define RESET 0 22*4882a593Smuzhiyun #define POWER_UP BIT(0) 23*4882a593Smuzhiyun #define DSI_CLKMGR_CFG 0x0008 24*4882a593Smuzhiyun #define TO_CLK_DIVISION(x) UPDATE(x, 15, 8) 25*4882a593Smuzhiyun #define TX_ESC_CLK_DIVISION(x) UPDATE(x, 7, 0) 26*4882a593Smuzhiyun #define DSI_DPI_VCID 0x000c 27*4882a593Smuzhiyun #define DPI_VID(x) UPDATE(x, 1, 0) 28*4882a593Smuzhiyun #define DSI_DPI_COLOR_CODING 0x0010 29*4882a593Smuzhiyun #define LOOSELY18_EN BIT(8) 30*4882a593Smuzhiyun #define DPI_COLOR_CODING(x) UPDATE(x, 3, 0) 31*4882a593Smuzhiyun #define DSI_DPI_CFG_POL 0x0014 32*4882a593Smuzhiyun #define COLORM_ACTIVE_LOW BIT(4) 33*4882a593Smuzhiyun #define SHUTD_ACTIVE_LOW BIT(3) 34*4882a593Smuzhiyun #define HSYNC_ACTIVE_LOW BIT(2) 35*4882a593Smuzhiyun #define VSYNC_ACTIVE_LOW BIT(1) 36*4882a593Smuzhiyun #define DATAEN_ACTIVE_LOW BIT(0) 37*4882a593Smuzhiyun #define DSI_DPI_LP_CMD_TIM 0x0018 38*4882a593Smuzhiyun #define OUTVACT_LPCMD_TIME(x) UPDATE(x, 23, 16) 39*4882a593Smuzhiyun #define INVACT_LPCMD_TIME(x) UPDATE(x, 7, 0) 40*4882a593Smuzhiyun #define DSI_PCKHDL_CFG 0x002c 41*4882a593Smuzhiyun #define CRC_RX_EN BIT(4) 42*4882a593Smuzhiyun #define ECC_RX_EN BIT(3) 43*4882a593Smuzhiyun #define BTA_EN BIT(2) 44*4882a593Smuzhiyun #define EOTP_RX_EN BIT(1) 45*4882a593Smuzhiyun #define EOTP_TX_EN BIT(0) 46*4882a593Smuzhiyun #define DSI_GEN_VCID 0x0030 47*4882a593Smuzhiyun #define DSI_MODE_CFG 0x0034 48*4882a593Smuzhiyun #define CMD_VIDEO_MODE(x) UPDATE(x, 0, 0) 49*4882a593Smuzhiyun #define DSI_VID_MODE_CFG 0x0038 50*4882a593Smuzhiyun #define VPG_EN BIT(16) 51*4882a593Smuzhiyun #define LP_CMD_EN BIT(15) 52*4882a593Smuzhiyun #define FRAME_BTA_ACK_EN BIT(14) 53*4882a593Smuzhiyun #define LP_HFP_EN BIT(13) 54*4882a593Smuzhiyun #define LP_HBP_EN BIT(12) 55*4882a593Smuzhiyun #define LP_VACT_EN BIT(11) 56*4882a593Smuzhiyun #define LP_VFP_EN BIT(10) 57*4882a593Smuzhiyun #define LP_VBP_EN BIT(9) 58*4882a593Smuzhiyun #define LP_VSA_EN BIT(8) 59*4882a593Smuzhiyun #define VID_MODE_TYPE(x) UPDATE(x, 1, 0) 60*4882a593Smuzhiyun #define DSI_VID_PKT_SIZE 0x003c 61*4882a593Smuzhiyun #define VID_PKT_SIZE(x) UPDATE(x, 13, 0) 62*4882a593Smuzhiyun #define DSI_VID_NUM_CHUNKS 0x0040 63*4882a593Smuzhiyun #define DSI_VID_NULL_SIZE 0x0044 64*4882a593Smuzhiyun #define DSI_VID_HSA_TIME 0x0048 65*4882a593Smuzhiyun #define VID_HSA_TIME(x) UPDATE(x, 11, 0) 66*4882a593Smuzhiyun #define DSI_VID_HBP_TIME 0x004c 67*4882a593Smuzhiyun #define VID_HBP_TIME(x) UPDATE(x, 11, 0) 68*4882a593Smuzhiyun #define DSI_VID_HLINE_TIME 0x0050 69*4882a593Smuzhiyun #define VID_HLINE_TIME(x) UPDATE(x, 14, 0) 70*4882a593Smuzhiyun #define DSI_VID_VSA_LINES 0x0054 71*4882a593Smuzhiyun #define VSA_LINES(x) UPDATE(x, 9, 0) 72*4882a593Smuzhiyun #define DSI_VID_VBP_LINES 0x0058 73*4882a593Smuzhiyun #define VBP_LINES(x) UPDATE(x, 9, 0) 74*4882a593Smuzhiyun #define DSI_VID_VFP_LINES 0x005c 75*4882a593Smuzhiyun #define VFP_LINES(x) UPDATE(x, 9, 0) 76*4882a593Smuzhiyun #define DSI_VID_VACTIVE_LINES 0x0060 77*4882a593Smuzhiyun #define V_ACTIVE_LINES(x) UPDATE(x, 13, 0) 78*4882a593Smuzhiyun #define DSI_EDPI_CMD_SIZE 0x0064 79*4882a593Smuzhiyun #define EDPI_ALLOWED_CMD_SIZE(x) UPDATE(x, 15, 0) 80*4882a593Smuzhiyun #define DSI_CMD_MODE_CFG 0x0068 81*4882a593Smuzhiyun #define MAX_RD_PKT_SIZE BIT(24) 82*4882a593Smuzhiyun #define DCS_LW_TX BIT(19) 83*4882a593Smuzhiyun #define DCS_SR_0P_TX BIT(18) 84*4882a593Smuzhiyun #define DCS_SW_1P_TX BIT(17) 85*4882a593Smuzhiyun #define DCS_SW_0P_TX BIT(16) 86*4882a593Smuzhiyun #define GEN_LW_TX BIT(14) 87*4882a593Smuzhiyun #define GEN_SR_2P_TX BIT(13) 88*4882a593Smuzhiyun #define GEN_SR_1P_TX BIT(12) 89*4882a593Smuzhiyun #define GEN_SR_0P_TX BIT(11) 90*4882a593Smuzhiyun #define GEN_SW_2P_TX BIT(10) 91*4882a593Smuzhiyun #define GEN_SW_1P_TX BIT(9) 92*4882a593Smuzhiyun #define GEN_SW_0P_TX BIT(8) 93*4882a593Smuzhiyun #define ACK_RQST_EN BIT(1) 94*4882a593Smuzhiyun #define TEAR_FX_EN BIT(0) 95*4882a593Smuzhiyun #define DSI_GEN_HDR 0x006c 96*4882a593Smuzhiyun #define GEN_WC_MSBYTE(x) UPDATE(x, 23, 16) 97*4882a593Smuzhiyun #define GEN_WC_LSBYTE(x) UPDATE(x, 15, 8) 98*4882a593Smuzhiyun #define GEN_VC(x) UPDATE(x, 7, 6) 99*4882a593Smuzhiyun #define GEN_DT(x) UPDATE(x, 5, 0) 100*4882a593Smuzhiyun #define DSI_GEN_PLD_DATA 0x0070 101*4882a593Smuzhiyun #define DSI_CMD_PKT_STATUS 0x0074 102*4882a593Smuzhiyun #define GEN_RD_CMD_BUSY BIT(6) 103*4882a593Smuzhiyun #define GEN_PLD_R_FULL BIT(5) 104*4882a593Smuzhiyun #define GEN_PLD_R_EMPTY BIT(4) 105*4882a593Smuzhiyun #define GEN_PLD_W_FULL BIT(3) 106*4882a593Smuzhiyun #define GEN_PLD_W_EMPTY BIT(2) 107*4882a593Smuzhiyun #define GEN_CMD_FULL BIT(1) 108*4882a593Smuzhiyun #define GEN_CMD_EMPTY BIT(0) 109*4882a593Smuzhiyun #define DSI_TO_CNT_CFG 0x0078 110*4882a593Smuzhiyun #define HSTX_TO_CNT(x) UPDATE(x, 31, 16) 111*4882a593Smuzhiyun #define LPRX_TO_CNT(x) UPDATE(x, 15, 0) 112*4882a593Smuzhiyun #define DSI_HS_RD_TO_CNT 0x007c 113*4882a593Smuzhiyun #define HS_RD_TO_CNT(x) UPDATE(x, 15, 0) 114*4882a593Smuzhiyun #define DSI_LP_RD_TO_CNT 0x0080 115*4882a593Smuzhiyun #define LP_RD_TO_CNT(x) UPDATE(x, 15, 0) 116*4882a593Smuzhiyun #define DSI_HS_WR_TO_CNT 0x0084 117*4882a593Smuzhiyun #define HS_WR_TO_CNT(x) UPDATE(x, 15, 0) 118*4882a593Smuzhiyun #define DSI_LP_WR_TO_CNT 0x0088 119*4882a593Smuzhiyun #define LP_WR_TO_CNT(x) UPDATE(x, 15, 0) 120*4882a593Smuzhiyun #define DSI_BTA_TO_CNT 0x008c 121*4882a593Smuzhiyun #define BTA_TO_CNT(x) UPDATE(x, 15, 0) 122*4882a593Smuzhiyun #define DSI_SDF_3D 0x0090 123*4882a593Smuzhiyun #define DSI_LPCLK_CTRL 0x0094 124*4882a593Smuzhiyun #define AUTO_CLKLANE_CTRL BIT(1) 125*4882a593Smuzhiyun #define PHY_TXREQUESTCLKHS BIT(0) 126*4882a593Smuzhiyun #define DSI_PHY_TMR_LPCLK_CFG 0x0098 127*4882a593Smuzhiyun #define PHY_CLKHS2LP_TIME(x) UPDATE(x, 25, 16) 128*4882a593Smuzhiyun #define PHY_CLKLP2HS_TIME(x) UPDATE(x, 9, 0) 129*4882a593Smuzhiyun #define DSI_PHY_TMR_CFG 0x009c 130*4882a593Smuzhiyun #define PHY_HS2LP_TIME(x) UPDATE(x, 31, 24) 131*4882a593Smuzhiyun #define PHY_LP2HS_TIME(x) UPDATE(x, 23, 16) 132*4882a593Smuzhiyun #define MAX_RD_TIME(x) UPDATE(x, 14, 0) 133*4882a593Smuzhiyun #define DSI_PHY_RSTZ 0x00a0 134*4882a593Smuzhiyun #define PHY_FORCEPLL BIT(3) 135*4882a593Smuzhiyun #define PHY_ENABLECLK BIT(2) 136*4882a593Smuzhiyun #define PHY_RSTZ BIT(1) 137*4882a593Smuzhiyun #define PHY_SHUTDOWNZ BIT(0) 138*4882a593Smuzhiyun #define DSI_PHY_IF_CFG 0x00a4 139*4882a593Smuzhiyun #define PHY_STOP_WAIT_TIME(x) UPDATE(x, 15, 8) 140*4882a593Smuzhiyun #define N_LANES(x) UPDATE(x, 1, 0) 141*4882a593Smuzhiyun #define DSI_PHY_STATUS 0x00b0 142*4882a593Smuzhiyun #define PHY_STOPSTATE3LANE BIT(11) 143*4882a593Smuzhiyun #define PHY_STOPSTATE2LANE BIT(9) 144*4882a593Smuzhiyun #define PHY_STOPSTATE1LANE BIT(7) 145*4882a593Smuzhiyun #define PHY_STOPSTATE0LANE BIT(4) 146*4882a593Smuzhiyun #define PHY_STOPSTATECLKLANE BIT(2) 147*4882a593Smuzhiyun #define PHY_LOCK BIT(0) 148*4882a593Smuzhiyun #define PHY_STOPSTATELANE (PHY_STOPSTATE0LANE | \ 149*4882a593Smuzhiyun PHY_STOPSTATECLKLANE) 150*4882a593Smuzhiyun #define DSI_INT_ST0 0x00bc 151*4882a593Smuzhiyun #define DSI_INT_ST1 0x00c0 152*4882a593Smuzhiyun #define DSI_INT_MSK0 0x00c4 153*4882a593Smuzhiyun #define DSI_INT_MSK1 0x00c8 154*4882a593Smuzhiyun #define DSI_INT_FORCE0 0x00d8 155*4882a593Smuzhiyun #define DSI_INT_FORCE1 0x00dc 156*4882a593Smuzhiyun #define DSI_MAX_REGISTER DSI_INT_FORCE1 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun enum vid_mode_type { 159*4882a593Smuzhiyun VIDEO_MODE, 160*4882a593Smuzhiyun COMMAND_MODE, 161*4882a593Smuzhiyun }; 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun struct rk628_dsi { 164*4882a593Smuzhiyun struct rk628 *rk628; 165*4882a593Smuzhiyun struct v4l2_dv_timings timings; 166*4882a593Smuzhiyun u64 lane_mbps; 167*4882a593Smuzhiyun int vid_mode; 168*4882a593Smuzhiyun int mode_flags; 169*4882a593Smuzhiyun }; 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun void rk628_mipi_dsi_power_on(struct rk628_dsi *dsi); 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun #endif 174