1*ab3bc873SGuochun Huang /* SPDX-License-Identifier: GPL-2.0 */
2*ab3bc873SGuochun Huang /*
3*ab3bc873SGuochun Huang * (C) Copyright 2024 Rockchip Electronics Co., Ltd
4*ab3bc873SGuochun Huang */
5*ab3bc873SGuochun Huang
6*ab3bc873SGuochun Huang #ifndef _RK628_H_
7*ab3bc873SGuochun Huang #define _RK628_H_
8*ab3bc873SGuochun Huang
9*ab3bc873SGuochun Huang #include <asm-generic/gpio.h>
10*ab3bc873SGuochun Huang #include <errno.h>
11*ab3bc873SGuochun Huang #include <common.h>
12*ab3bc873SGuochun Huang #include <dm.h>
13*ab3bc873SGuochun Huang #include <i2c.h>
14*ab3bc873SGuochun Huang #include <dm/uclass.h>
15*ab3bc873SGuochun Huang #include <dm/uclass-id.h>
16*ab3bc873SGuochun Huang #include <power/regulator.h>
17*ab3bc873SGuochun Huang #include <linux/bitfield.h>
18*ab3bc873SGuochun Huang #include <linux/math64.h>
19*ab3bc873SGuochun Huang #include <drm_modes.h>
20*ab3bc873SGuochun Huang
21*ab3bc873SGuochun Huang #include "../rockchip_phy.h"
22*ab3bc873SGuochun Huang
23*ab3bc873SGuochun Huang #define DRIVER_VERSION "0.1.0"
24*ab3bc873SGuochun Huang #define UPDATE(x, h, l) (((x) << (l)) & GENMASK((h), (l)))
25*ab3bc873SGuochun Huang #define HIWORD_UPDATE(v, h, l) ((((v) << (l)) & GENMASK((h), (l))) | \
26*ab3bc873SGuochun Huang (GENMASK((h), (l)) << 16))
27*ab3bc873SGuochun Huang
28*ab3bc873SGuochun Huang #define GRF_SYSTEM_CON0 0x0000
29*ab3bc873SGuochun Huang #define SW_VSYNC_POL_MASK BIT(26)
30*ab3bc873SGuochun Huang #define SW_VSYNC_POL(x) UPDATE(x, 26, 26)
31*ab3bc873SGuochun Huang #define SW_HSYNC_POL_MASK BIT(25)
32*ab3bc873SGuochun Huang #define SW_HSYNC_POL(x) UPDATE(x, 25, 25)
33*ab3bc873SGuochun Huang #define SW_ADAPTER_I2CSLADR_MASK GENMASK(24, 22)
34*ab3bc873SGuochun Huang #define SW_ADAPTER_I2CSLADR(x) UPDATE(x, 24, 22)
35*ab3bc873SGuochun Huang #define SW_EDID_MODE_MASK BIT(21)
36*ab3bc873SGuochun Huang #define SW_EDID_MODE(x) UPDATE(x, 21, 21)
37*ab3bc873SGuochun Huang #define SW_I2S_DATA_OEN_MASK BIT(10)
38*ab3bc873SGuochun Huang #define SW_I2S_DATA_OEN(x) UPDATE(x, 10, 10)
39*ab3bc873SGuochun Huang #define SW_BT_DATA_OEN_MASK BIT(9)
40*ab3bc873SGuochun Huang #define SW_BT_DATA_OEN BIT(9)
41*ab3bc873SGuochun Huang #define SW_EFUSE_HDCP_EN_MASK BIT(8)
42*ab3bc873SGuochun Huang #define SW_EFUSE_HDCP_EN(x) UPDATE(x, 8, 8)
43*ab3bc873SGuochun Huang #define SW_OUTPUT_MODE_MASK GENMASK(5, 3)
44*ab3bc873SGuochun Huang #define SW_OUTPUT_MODE(x) UPDATE(x, 5, 3)
45*ab3bc873SGuochun Huang /* compatible with rk628f */
46*ab3bc873SGuochun Huang #define SW_OUTPUT_RGB_MODE_MASK GENMASK(7, 6)
47*ab3bc873SGuochun Huang #define SW_OUTPUT_RGB_MODE(x) UPDATE(x, 7, 6)
48*ab3bc873SGuochun Huang #define SW_HDMITX_EN_MASK BIT(5)
49*ab3bc873SGuochun Huang #define SW_HDMITX_EN(x) UPDATE(x, 5, 5)
50*ab3bc873SGuochun Huang #define SW_OUTPUT_COMBTX_MODE_MASK GENMASK(4, 3)
51*ab3bc873SGuochun Huang #define SW_OUTPUT_COMBTX_MODE(x) UPDATE(x, 4, 3)
52*ab3bc873SGuochun Huang
53*ab3bc873SGuochun Huang #define SW_INPUT_MODE_MASK GENMASK(2, 0)
54*ab3bc873SGuochun Huang #define SW_INPUT_MODE(x) UPDATE(x, 2, 0)
55*ab3bc873SGuochun Huang #define GRF_SYSTEM_CON1 0x0004
56*ab3bc873SGuochun Huang #define GRF_SYSTEM_CON2 0x0008
57*ab3bc873SGuochun Huang #define GRF_SYSTEM_CON3 0x000c
58*ab3bc873SGuochun Huang #define GRF_GPIO_RX_CEC_SEL_MASK BIT(7)
59*ab3bc873SGuochun Huang #define GRF_GPIO_RX_CEC_SEL(x) UPDATE(x, 7, 7)
60*ab3bc873SGuochun Huang #define GRF_GPIO_RXDDC_SDA_SEL_MASK BIT(6)
61*ab3bc873SGuochun Huang #define GRF_GPIO_RXDDC_SDA_SEL(x) UPDATE(x, 6, 6)
62*ab3bc873SGuochun Huang #define GRF_GPIO_RXDDC_SCL_SEL_MASK BIT(5)
63*ab3bc873SGuochun Huang #define GRF_GPIO_RXDDC_SCL_SEL(x) UPDATE(x, 5, 5)
64*ab3bc873SGuochun Huang #define GRF_DPHY_CH1_EN_MASK BIT(1)
65*ab3bc873SGuochun Huang #define GRF_DPHY_CH1_EN(x) UPDATE(x, 1, 1)
66*ab3bc873SGuochun Huang #define GRF_AS_DSIPHY_MASK BIT(0)
67*ab3bc873SGuochun Huang #define GRF_AS_DSIPHY(x) UPDATE(x, 0, 0)
68*ab3bc873SGuochun Huang #define GRF_SCALER_CON0 0x0010
69*ab3bc873SGuochun Huang #define SCL_8_PIXEL_ALIGN(x) HIWORD_UPDATE(x, 12, 12)
70*ab3bc873SGuochun Huang #define SCL_COLOR_VER_EN(x) HIWORD_UPDATE(x, 10, 10)
71*ab3bc873SGuochun Huang #define SCL_COLOR_BAR_EN(x) HIWORD_UPDATE(x, 9, 9)
72*ab3bc873SGuochun Huang #define SCL_VER_DOWN_MODE(x) HIWORD_UPDATE(x, 8, 8)
73*ab3bc873SGuochun Huang #define SCL_HOR_DOWN_MODE(x) HIWORD_UPDATE(x, 7, 7)
74*ab3bc873SGuochun Huang #define SCL_BIC_COE_SEL(x) HIWORD_UPDATE(x, 6, 5)
75*ab3bc873SGuochun Huang #define SCL_VER_MODE(x) HIWORD_UPDATE(x, 4, 3)
76*ab3bc873SGuochun Huang #define SCL_HOR_MODE(x) HIWORD_UPDATE(x, 2, 1)
77*ab3bc873SGuochun Huang #define SCL_EN(x) HIWORD_UPDATE(x, 0, 0)
78*ab3bc873SGuochun Huang #define GRF_SCALER_CON1 0x0014
79*ab3bc873SGuochun Huang #define SCL_V_FACTOR(x) UPDATE(x, 31, 16)
80*ab3bc873SGuochun Huang #define SCL_H_FACTOR(x) UPDATE(x, 15, 0)
81*ab3bc873SGuochun Huang #define GRF_SCALER_CON2 0x0018
82*ab3bc873SGuochun Huang #define DSP_FRAME_VST(x) UPDATE(x, 28, 16)
83*ab3bc873SGuochun Huang #define DSP_FRAME_HST(x) UPDATE(x, 12, 0)
84*ab3bc873SGuochun Huang #define GRF_SCALER_CON3 0x001c
85*ab3bc873SGuochun Huang #define DSP_HS_END(x) UPDATE(x, 23, 16)
86*ab3bc873SGuochun Huang #define DSP_HTOTAL(x) UPDATE(x, 12, 0)
87*ab3bc873SGuochun Huang #define GRF_SCALER_CON4 0x0020
88*ab3bc873SGuochun Huang #define DSP_HACT_ST(x) UPDATE(x, 28, 16)
89*ab3bc873SGuochun Huang #define DSP_HACT_END(x) UPDATE(x, 12, 0)
90*ab3bc873SGuochun Huang #define GRF_SCALER_CON5 0x0024
91*ab3bc873SGuochun Huang #define DSP_VS_END(x) UPDATE(x, 23, 16)
92*ab3bc873SGuochun Huang #define DSP_VTOTAL(x) UPDATE(x, 12, 0)
93*ab3bc873SGuochun Huang #define GRF_SCALER_CON6 0x0028
94*ab3bc873SGuochun Huang #define DSP_VACT_ST(x) UPDATE(x, 28, 16)
95*ab3bc873SGuochun Huang #define DSP_VACT_END(x) UPDATE(x, 12, 0)
96*ab3bc873SGuochun Huang #define GRF_SCALER_CON7 0x002c
97*ab3bc873SGuochun Huang #define DSP_HBOR_ST(x) UPDATE(x, 28, 16)
98*ab3bc873SGuochun Huang #define DSP_HBOR_END(x) UPDATE(x, 12, 0)
99*ab3bc873SGuochun Huang #define GRF_SCALER_CON8 0x0030
100*ab3bc873SGuochun Huang #define DSP_VBOR_ST(x) UPDATE(x, 28, 16)
101*ab3bc873SGuochun Huang #define DSP_VBOR_END(x) UPDATE(x, 12, 0)
102*ab3bc873SGuochun Huang #define GRF_POST_PROC_CON 0x0034
103*ab3bc873SGuochun Huang #define SW_HDMITX_VSYNC_POL BIT(17)
104*ab3bc873SGuochun Huang #define SW_HDMITX_HSYNC_POL BIT(16)
105*ab3bc873SGuochun Huang #define SW_DCLK_OUT_INV_EN BIT(9)
106*ab3bc873SGuochun Huang #define SW_DCLK_IN_INV_EN BIT(8)
107*ab3bc873SGuochun Huang #define SW_TXPHY_REFCLK_SEL_MASK GENMASK(6, 5)
108*ab3bc873SGuochun Huang #define SW_TXPHY_REFCLK_SEL(x) UPDATE(x, 6, 5)
109*ab3bc873SGuochun Huang #define SW_HDMITX_VCLK_PLLREF_SEL_MASK BIT(4)
110*ab3bc873SGuochun Huang #define SW_HDMITX_VCLK_PLLREF_SEL(x) UPDATE(x, 4, 4)
111*ab3bc873SGuochun Huang #define SW_HDMITX_DCLK_INV_EN BIT(3)
112*ab3bc873SGuochun Huang #define SW_SPLIT_MODE(x) UPDATE(x, 1, 1)
113*ab3bc873SGuochun Huang #define SW_SPLIT_EN BIT(0)
114*ab3bc873SGuochun Huang #define GRF_CSC_CTRL_CON 0x0038
115*ab3bc873SGuochun Huang #define SW_Y2R_MODE(x) HIWORD_UPDATE(x, 13, 12)
116*ab3bc873SGuochun Huang #define SW_FROM_CSC_MATRIX_EN(x) HIWORD_UPDATE(x, 11, 11)
117*ab3bc873SGuochun Huang #define SW_YUV2VYU_SWP(x) HIWORD_UPDATE(x, 8, 8)
118*ab3bc873SGuochun Huang #define SW_R2Y_EN(x) HIWORD_UPDATE(x, 4, 4)
119*ab3bc873SGuochun Huang #define SW_Y2R_EN(x) HIWORD_UPDATE(x, 0, 0)
120*ab3bc873SGuochun Huang #define GRF_LVDS_TX_CON 0x003c
121*ab3bc873SGuochun Huang #define SW_LVDS_CON_DUAL_SEL(x) HIWORD_UPDATE(x, 12, 12)
122*ab3bc873SGuochun Huang #define SW_LVDS_CON_DEN_POLARITY(x) HIWORD_UPDATE(x, 11, 11)
123*ab3bc873SGuochun Huang #define SW_LVDS_CON_HS_POLARITY(x) HIWORD_UPDATE(x, 10, 10)
124*ab3bc873SGuochun Huang #define SW_LVDS_CON_CLKINV(x) HIWORD_UPDATE(x, 9, 9)
125*ab3bc873SGuochun Huang #define SW_LVDS_STARTPHASE(x) HIWORD_UPDATE(x, 8, 8)
126*ab3bc873SGuochun Huang #define SW_LVDS_CON_STARTSEL(x) HIWORD_UPDATE(x, 7, 7)
127*ab3bc873SGuochun Huang #define SW_LVDS_CON_CHASEL(x) HIWORD_UPDATE(x, 6, 6)
128*ab3bc873SGuochun Huang #define SW_LVDS_TIE_VSYNC_VALUE(x) HIWORD_UPDATE(x, 5, 5)
129*ab3bc873SGuochun Huang #define SW_LVDS_TIE_HSYNC_VALUE(x) HIWORD_UPDATE(x, 4, 4)
130*ab3bc873SGuochun Huang #define SW_LVDS_TIE_DEN_ONLY(x) HIWORD_UPDATE(x, 3, 3)
131*ab3bc873SGuochun Huang #define SW_LVDS_CON_MSBSEL(x) HIWORD_UPDATE(x, 2, 2)
132*ab3bc873SGuochun Huang #define SW_LVDS_CON_SELECT(x) HIWORD_UPDATE(x, 1, 0)
133*ab3bc873SGuochun Huang #define GRF_RGB_DEC_CON0 0x0040
134*ab3bc873SGuochun Huang #define SW_HRES_MASK GENMASK(28, 16)
135*ab3bc873SGuochun Huang #define SW_HRES(x) UPDATE(x, 28, 16)
136*ab3bc873SGuochun Huang #define DUAL_DATA_SWAP BIT(6)
137*ab3bc873SGuochun Huang #define DEC_DUALEDGE_EN BIT(5)
138*ab3bc873SGuochun Huang #define SW_PROGRESS_EN BIT(4)
139*ab3bc873SGuochun Huang #define SW_BT1120_YC_SWAP BIT(3)
140*ab3bc873SGuochun Huang #define SW_BT1120_UV_SWAP BIT(2)
141*ab3bc873SGuochun Huang #define SW_CAP_EN_ASYNC BIT(1)
142*ab3bc873SGuochun Huang #define SW_CAP_EN_PSYNC BIT(0)
143*ab3bc873SGuochun Huang #define GRF_RGB_DEC_CON1 0x0044
144*ab3bc873SGuochun Huang #define SW_SET_X_MASK GENMASK(28, 16)
145*ab3bc873SGuochun Huang #define SW_SET_X(x) HIWORD_UPDATE(x, 28, 16)
146*ab3bc873SGuochun Huang #define SW_SET_Y_MASK GENMASK(28, 16)
147*ab3bc873SGuochun Huang #define SW_SET_Y(x) HIWORD_UPDATE(x, 28, 16)
148*ab3bc873SGuochun Huang #define GRF_RGB_DEC_CON2 0x0048
149*ab3bc873SGuochun Huang #define GRF_RGB_ENC_CON 0x004c
150*ab3bc873SGuochun Huang #define BT1120_UV_SWAP(x) HIWORD_UPDATE(x, 5, 5)
151*ab3bc873SGuochun Huang #define ENC_DUALEDGE_EN(x) HIWORD_UPDATE(x, 3, 3)
152*ab3bc873SGuochun Huang #define GRF_MIPI_LANE_DELAY_CON0 0x0050
153*ab3bc873SGuochun Huang #define GRF_MIPI_LANE_DELAY_CON1 0x0054
154*ab3bc873SGuochun Huang #define GRF_BT1120_DCLK_DELAY_CON0 0x0058
155*ab3bc873SGuochun Huang #define GRF_BT1120_DCLK_DELAY_CON1 0x005c
156*ab3bc873SGuochun Huang #define GRF_MIPI_TX0_CON 0x0060
157*ab3bc873SGuochun Huang #define DPIUPDATECFG BIT(26)
158*ab3bc873SGuochun Huang #define DPICOLORM BIT(25)
159*ab3bc873SGuochun Huang #define DPISHUTDN BIT(24)
160*ab3bc873SGuochun Huang #define CSI_PHYRSTZ BIT(21)
161*ab3bc873SGuochun Huang #define CSI_PHYSHUTDOWNZ BIT(20)
162*ab3bc873SGuochun Huang #define FORCETXSTOPMODE_MASK GENMASK(19, 16)
163*ab3bc873SGuochun Huang #define FORCETXSTOPMODE(x) UPDATE(x, 19, 16)
164*ab3bc873SGuochun Huang #define FORCERXMODE_MASK GENMASK(15, 12)
165*ab3bc873SGuochun Huang #define FORCERXMODE(x) UPDATE(x, 15, 12)
166*ab3bc873SGuochun Huang #define PHY_TESTCLR BIT(10)
167*ab3bc873SGuochun Huang #define PHY_TESTCLK BIT(9)
168*ab3bc873SGuochun Huang #define PHY_TESTEN BIT(8)
169*ab3bc873SGuochun Huang #define PHY_TESTDIN_MASK GENMASK(7, 0)
170*ab3bc873SGuochun Huang #define PHY_TESTDIN(x) UPDATE(x, 7, 0)
171*ab3bc873SGuochun Huang #define GRF_DPHY0_STATUS 0x0064
172*ab3bc873SGuochun Huang #define DPHY_PHYLOCK BIT(24)
173*ab3bc873SGuochun Huang #define PHY_TESTDOUT_SHIFT 8
174*ab3bc873SGuochun Huang #define GRF_MIPI_TX1_CON 0x0068
175*ab3bc873SGuochun Huang #define GRF_DPHY1_STATUS 0x006c
176*ab3bc873SGuochun Huang #define GRF_GPIO0AB_SEL_CON 0x0070
177*ab3bc873SGuochun Huang #define GRF_GPIO1AB_SEL_CON 0x0074
178*ab3bc873SGuochun Huang #define GRF_GPIO2AB_SEL_CON 0x0078
179*ab3bc873SGuochun Huang #define GRF_GPIO2C_SEL_CON 0x007c
180*ab3bc873SGuochun Huang #define GRF_GPIO3AB_SEL_CON 0x0080
181*ab3bc873SGuochun Huang #define GRF_GPIO2A_SMT 0x0090
182*ab3bc873SGuochun Huang #define GRF_GPIO2B_SMT 0x0094
183*ab3bc873SGuochun Huang #define GRF_GPIO2C_SMT 0x0098
184*ab3bc873SGuochun Huang #define GRF_GPIO3AB_SMT 0x009c
185*ab3bc873SGuochun Huang #define GRF_GPIO0A_P_CON 0x00a0
186*ab3bc873SGuochun Huang #define GRF_GPIO1A_P_CON 0x00a4
187*ab3bc873SGuochun Huang #define GRF_GPIO2A_P_CON 0x00a8
188*ab3bc873SGuochun Huang #define GRF_GPIO2B_P_CON 0x00ac
189*ab3bc873SGuochun Huang #define GRF_GPIO2C_P_CON 0x00b0
190*ab3bc873SGuochun Huang #define GRF_GPIO3A_P_CON 0x00b4
191*ab3bc873SGuochun Huang #define GRF_GPIO3B_P_CON 0x00b8
192*ab3bc873SGuochun Huang #define GRF_GPIO0B_D_CON 0x00c0
193*ab3bc873SGuochun Huang #define GRF_GPIO1B_D_CON 0x00c4
194*ab3bc873SGuochun Huang #define GRF_GPIO2A_D0_CON 0x00c8
195*ab3bc873SGuochun Huang #define GRF_GPIO2A_D1_CON 0x00cc
196*ab3bc873SGuochun Huang #define GRF_GPIO2B_D0_CON 0x00d0
197*ab3bc873SGuochun Huang #define GRF_GPIO2B_D1_CON 0x00d4
198*ab3bc873SGuochun Huang #define GRF_GPIO2C_D0_CON 0x00d8
199*ab3bc873SGuochun Huang #define GRF_GPIO2C_D1_CON 0x00dc
200*ab3bc873SGuochun Huang #define GRF_GPIO3A_D0_CON 0x00e0
201*ab3bc873SGuochun Huang #define GRF_GPIO3A_D1_CON 0x00e4
202*ab3bc873SGuochun Huang #define GRF_GPIO3B_D_CON 0x00e8
203*ab3bc873SGuochun Huang #define GRF_GPIO_SR_CON 0x00ec
204*ab3bc873SGuochun Huang #define GRF_SW_HDMIRXPHY_CRTL 0x00f4
205*ab3bc873SGuochun Huang #define GRF_INTR0_EN 0x0100
206*ab3bc873SGuochun Huang #define RK628F_HDMIRX_IRQ_EN(x) HIWORD_UPDATE(x, 9, 9)
207*ab3bc873SGuochun Huang #define RK628D_HDMIRX_IRQ_EN(x) HIWORD_UPDATE(x, 8, 8)
208*ab3bc873SGuochun Huang #define GRF_INTR0_CLR_EN 0x0104
209*ab3bc873SGuochun Huang #define GRF_INTR0_STATUS 0x0108
210*ab3bc873SGuochun Huang #define GRF_INTR0_RAW_STATUS 0x010c
211*ab3bc873SGuochun Huang #define GRF_INTR1_EN 0x0110
212*ab3bc873SGuochun Huang #define GRF_INTR1_CLR_EN 0x0114
213*ab3bc873SGuochun Huang #define GRF_INTR1_STATUS 0x0118
214*ab3bc873SGuochun Huang #define GRF_INTR1_RAW_STATUS 0x011c
215*ab3bc873SGuochun Huang #define GRF_SYSTEM_STATUS0 0x0120
216*ab3bc873SGuochun Huang /* 0: i2c mode and mcu mode; 1: i2c mode only */
217*ab3bc873SGuochun Huang #define I2C_ONLY_FLAG BIT(6)
218*ab3bc873SGuochun Huang #define GRF_SYSTEM_STATUS3 0x012c
219*ab3bc873SGuochun Huang #define DECODER_1120_LAST_LINE_NUM_MASK GENMASK(12, 0)
220*ab3bc873SGuochun Huang #define GRF_SYSTEM_STATUS4 0x0130
221*ab3bc873SGuochun Huang #define DECODER_1120_LAST_PIX_NUM_MASK GENMASK(12, 0)
222*ab3bc873SGuochun Huang #define GRF_OS_REG0 0x0140
223*ab3bc873SGuochun Huang #define GRF_OS_REG1 0x0144
224*ab3bc873SGuochun Huang #define GRF_OS_REG2 0x0148
225*ab3bc873SGuochun Huang #define GRF_OS_REG3 0x014c
226*ab3bc873SGuochun Huang #define GRF_RGB_RX_DBG_MEAS0 0x0170
227*ab3bc873SGuochun Huang #define RGB_RX_EVAL_TIME_MASK GENMASK(27, 16)
228*ab3bc873SGuochun Huang #define RGB_RX_MODET_EN BIT(1)
229*ab3bc873SGuochun Huang #define RGB_RX_DCLK_EN BIT(0)
230*ab3bc873SGuochun Huang #define GRF_RGB_RX_DBG_MEAS2 0x0178
231*ab3bc873SGuochun Huang #define RGB_RX_CLKRATE_MASK GENMASK(15, 0)
232*ab3bc873SGuochun Huang #define GRF_RGB_RX_DBG_MEAS3 0x017c
233*ab3bc873SGuochun Huang #define RGB_RX_CNT_EN_MASK BIT(0)
234*ab3bc873SGuochun Huang #define RGB_RX_CNT_EN(x) UPDATE(x, 0, 0)
235*ab3bc873SGuochun Huang #define GRF_RGB_RX_DBG_MEAS4 0x0180
236*ab3bc873SGuochun Huang #define GRF_BT1120_TIMING_CTRL0 0x0190
237*ab3bc873SGuochun Huang #define BT1120_DSP_HS_END(x) UPDATE(x, 28, 16)
238*ab3bc873SGuochun Huang #define BT1120_DSP_HTOTAL(x) UPDATE(x, 12, 0)
239*ab3bc873SGuochun Huang #define GRF_BT1120_TIMING_CTRL1 0x0194
240*ab3bc873SGuochun Huang #define BT1120_DSP_HACT_ST(x) UPDATE(x, 28, 16)
241*ab3bc873SGuochun Huang #define GRF_BT1120_TIMING_CTRL2 0x0198
242*ab3bc873SGuochun Huang #define BT1120_DSP_VS_END(x) UPDATE(x, 28, 16)
243*ab3bc873SGuochun Huang #define BT1120_DSP_VTOTAL(x) UPDATE(x, 12, 0)
244*ab3bc873SGuochun Huang #define GRF_BT1120_TIMING_CTRL3 0x019c
245*ab3bc873SGuochun Huang #define BT1120_DSP_VACT_ST(x) UPDATE(x, 28, 16)
246*ab3bc873SGuochun Huang #define GRF_CSC_MATRIX_COE01_COE00 0x01a0
247*ab3bc873SGuochun Huang #define GRF_CSC_MATRIX_COE10_COE02 0x01a4
248*ab3bc873SGuochun Huang #define GRF_CSC_MATRIX_COE12_COE11 0x01a8
249*ab3bc873SGuochun Huang #define GRF_CSC_MATRIX_COE21_COE20 0x01ac
250*ab3bc873SGuochun Huang #define GRF_CSC_MATRIX_COE22 0x01b0
251*ab3bc873SGuochun Huang #define GRF_CSC_MATRIX_OFFSET0 0x01b4
252*ab3bc873SGuochun Huang #define GRF_CSC_MATRIX_OFFSET1 0x01b8
253*ab3bc873SGuochun Huang #define GRF_CSC_MATRIX_OFFSET2 0x01bc
254*ab3bc873SGuochun Huang #define GRF_SOC_VERSION 0x0200
255*ab3bc873SGuochun Huang #define GRF_OBS_REG 0X0300
256*ab3bc873SGuochun Huang #define GRF_MAX_REGISTER GRF_OBS_REG
257*ab3bc873SGuochun Huang
258*ab3bc873SGuochun Huang #define RK628D_VERSION 0x20200326
259*ab3bc873SGuochun Huang #define RK628F_VERSION 0x20230321
260*ab3bc873SGuochun Huang
261*ab3bc873SGuochun Huang enum {
262*ab3bc873SGuochun Huang COMBTXPHY_MODULEA_EN = BIT(0),
263*ab3bc873SGuochun Huang COMBTXPHY_MODULEB_EN = BIT(1),
264*ab3bc873SGuochun Huang };
265*ab3bc873SGuochun Huang
266*ab3bc873SGuochun Huang enum {
267*ab3bc873SGuochun Huang RK628_DEV_GRF,
268*ab3bc873SGuochun Huang RK628_DEV_COMBRXPHY,
269*ab3bc873SGuochun Huang RK628_DEV_HDMIRX = 3,
270*ab3bc873SGuochun Huang RK628_DEV_CSI,
271*ab3bc873SGuochun Huang RK628_DEV_DSI0,
272*ab3bc873SGuochun Huang RK628_DEV_DSI1,
273*ab3bc873SGuochun Huang RK628_DEV_HDMITX,
274*ab3bc873SGuochun Huang RK628_DEV_GVI,
275*ab3bc873SGuochun Huang RK628_DEV_COMBTXPHY,
276*ab3bc873SGuochun Huang RK628_DEV_ADAPTER,
277*ab3bc873SGuochun Huang RK628_DEV_EFUSE,
278*ab3bc873SGuochun Huang RK628_DEV_CRU,
279*ab3bc873SGuochun Huang RK628_DEV_GPIO0,
280*ab3bc873SGuochun Huang RK628_DEV_GPIO1,
281*ab3bc873SGuochun Huang RK628_DEV_GPIO2,
282*ab3bc873SGuochun Huang RK628_DEV_GPIO3,
283*ab3bc873SGuochun Huang RK628_DEV_MAX,
284*ab3bc873SGuochun Huang };
285*ab3bc873SGuochun Huang
286*ab3bc873SGuochun Huang enum rk628_input_mode {
287*ab3bc873SGuochun Huang INPUT_MODE_HDMI,
288*ab3bc873SGuochun Huang INPUT_MODE_BT1120 = 2,
289*ab3bc873SGuochun Huang INPUT_MODE_RGB,
290*ab3bc873SGuochun Huang INPUT_MODE_YUV,
291*ab3bc873SGuochun Huang };
292*ab3bc873SGuochun Huang
293*ab3bc873SGuochun Huang
294*ab3bc873SGuochun Huang enum rk628_output_mode {
295*ab3bc873SGuochun Huang OUTPUT_MODE_GVI = 1,
296*ab3bc873SGuochun Huang OUTPUT_MODE_LVDS,
297*ab3bc873SGuochun Huang OUTPUT_MODE_HDMI,
298*ab3bc873SGuochun Huang OUTPUT_MODE_CSI,
299*ab3bc873SGuochun Huang OUTPUT_MODE_DSI,
300*ab3bc873SGuochun Huang OUTPUT_MODE_BT1120 = 8,
301*ab3bc873SGuochun Huang OUTPUT_MODE_RGB = 16,
302*ab3bc873SGuochun Huang OUTPUT_MODE_YUV = 24,
303*ab3bc873SGuochun Huang };
304*ab3bc873SGuochun Huang
305*ab3bc873SGuochun Huang enum rk628_phy_mode {
306*ab3bc873SGuochun Huang RK628_PHY_MODE_INVALID,
307*ab3bc873SGuochun Huang RK628_PHY_MODE_VIDEO_MIPI,
308*ab3bc873SGuochun Huang RK628_PHY_MODE_VIDEO_LVDS,
309*ab3bc873SGuochun Huang RK628_PHY_MODE_VIDEO_GVI,
310*ab3bc873SGuochun Huang };
311*ab3bc873SGuochun Huang
312*ab3bc873SGuochun Huang enum lvds_format {
313*ab3bc873SGuochun Huang LVDS_FORMAT_VESA_24BIT,
314*ab3bc873SGuochun Huang LVDS_FORMAT_JEIDA_24BIT,
315*ab3bc873SGuochun Huang LVDS_FORMAT_JEIDA_18BIT,
316*ab3bc873SGuochun Huang LVDS_FORMAT_VESA_18BIT,
317*ab3bc873SGuochun Huang };
318*ab3bc873SGuochun Huang
319*ab3bc873SGuochun Huang enum lvds_link_type {
320*ab3bc873SGuochun Huang LVDS_SINGLE_LINK,
321*ab3bc873SGuochun Huang LVDS_DUAL_LINK_ODD_EVEN_PIXELS,
322*ab3bc873SGuochun Huang LVDS_DUAL_LINK_EVEN_ODD_PIXELS,
323*ab3bc873SGuochun Huang LVDS_DUAL_LINK_LEFT_RIGHT_PIXELS,
324*ab3bc873SGuochun Huang LVDS_DUAL_LINK_RIGHT_LEFT_PIXELS,
325*ab3bc873SGuochun Huang };
326*ab3bc873SGuochun Huang
327*ab3bc873SGuochun Huang enum gvi_color_depth {
328*ab3bc873SGuochun Huang COLOR_DEPTH_RGB_YUV444_18BIT,
329*ab3bc873SGuochun Huang COLOR_DEPTH_RGB_YUV444_24BIT,
330*ab3bc873SGuochun Huang COLOR_DEPTH_RGB_YUV444_30BIT,
331*ab3bc873SGuochun Huang COLOR_DEPTH_YUV422_16BIT = 8,
332*ab3bc873SGuochun Huang COLOR_DEPTH_YUV422_20BIT,
333*ab3bc873SGuochun Huang };
334*ab3bc873SGuochun Huang
335*ab3bc873SGuochun Huang enum dsi_mode_flags {
336*ab3bc873SGuochun Huang RK628_MIPI_DSI_MODE_VIDEO = 1,
337*ab3bc873SGuochun Huang RK628_MIPI_DSI_MODE_VIDEO_BURST = 2,
338*ab3bc873SGuochun Huang RK628_MIPI_DSI_MODE_VIDEO_SYNC_PULSE = 4,
339*ab3bc873SGuochun Huang RK628_MIPI_DSI_MODE_VIDEO_HFP = 8,
340*ab3bc873SGuochun Huang RK628_MIPI_DSI_MODE_VIDEO_HBP = 16,
341*ab3bc873SGuochun Huang RK628_MIPI_DSI_MODE_EOT_PACKET = 32,
342*ab3bc873SGuochun Huang RK628_MIPI_DSI_CLOCK_NON_CONTINUOUS = 64,
343*ab3bc873SGuochun Huang RK628_MIPI_DSI_MODE_LPM = 128,
344*ab3bc873SGuochun Huang };
345*ab3bc873SGuochun Huang
346*ab3bc873SGuochun Huang enum dsi_bus_format {
347*ab3bc873SGuochun Huang RK628_MIPI_DSI_FMT_RGB888,
348*ab3bc873SGuochun Huang RK628_MIPI_DSI_FMT_RGB666,
349*ab3bc873SGuochun Huang RK628_MIPI_DSI_FMT_RGB666_PACKED,
350*ab3bc873SGuochun Huang RK628_MIPI_DSI_FMT_RGB565,
351*ab3bc873SGuochun Huang };
352*ab3bc873SGuochun Huang
353*ab3bc873SGuochun Huang enum gvi_bus_format {
354*ab3bc873SGuochun Huang GVI_MEDIA_BUS_FMT_RGB666_1X18 = 9,
355*ab3bc873SGuochun Huang GVI_MEDIA_BUS_FMT_RGB888_1X24 = 10,
356*ab3bc873SGuochun Huang GVI_MEDIA_BUS_FMT_YUYV10_1X20 = 13,
357*ab3bc873SGuochun Huang GVI_MEDIA_BUS_FMT_YUYV8_1X16 = 17,
358*ab3bc873SGuochun Huang GVI_MEDIA_BUS_FMT_RGB101010_1X30 = 24,
359*ab3bc873SGuochun Huang };
360*ab3bc873SGuochun Huang
361*ab3bc873SGuochun Huang enum bus_format {
362*ab3bc873SGuochun Huang BUS_FMT_RGB = 0,
363*ab3bc873SGuochun Huang BUS_FMT_YUV422 = 1,
364*ab3bc873SGuochun Huang BUS_FMT_YUV444 = 2,
365*ab3bc873SGuochun Huang BUS_FMT_YUV420 = 3,
366*ab3bc873SGuochun Huang BUS_FMT_UNKNOWN,
367*ab3bc873SGuochun Huang };
368*ab3bc873SGuochun Huang
369*ab3bc873SGuochun Huang enum rk628_mode_sync_pol {
370*ab3bc873SGuochun Huang MODE_FLAG_NSYNC,
371*ab3bc873SGuochun Huang MODE_FLAG_PSYNC,
372*ab3bc873SGuochun Huang };
373*ab3bc873SGuochun Huang
374*ab3bc873SGuochun Huang struct rk628_videomode {
375*ab3bc873SGuochun Huang u32 pixelclock; /* pixelclock in Hz */
376*ab3bc873SGuochun Huang
377*ab3bc873SGuochun Huang u32 hactive;
378*ab3bc873SGuochun Huang u32 hfront_porch;
379*ab3bc873SGuochun Huang u32 hback_porch;
380*ab3bc873SGuochun Huang u32 hsync_len;
381*ab3bc873SGuochun Huang
382*ab3bc873SGuochun Huang u32 vactive;
383*ab3bc873SGuochun Huang u32 vfront_porch;
384*ab3bc873SGuochun Huang u32 vback_porch;
385*ab3bc873SGuochun Huang u32 vsync_len;
386*ab3bc873SGuochun Huang
387*ab3bc873SGuochun Huang unsigned int flags; /* display flags */
388*ab3bc873SGuochun Huang };
389*ab3bc873SGuochun Huang
390*ab3bc873SGuochun Huang struct rk628_display_mode {
391*ab3bc873SGuochun Huang int clock; /* in kHz */
392*ab3bc873SGuochun Huang int hdisplay;
393*ab3bc873SGuochun Huang int hsync_start;
394*ab3bc873SGuochun Huang int hsync_end;
395*ab3bc873SGuochun Huang int htotal;
396*ab3bc873SGuochun Huang int vdisplay;
397*ab3bc873SGuochun Huang int vsync_start;
398*ab3bc873SGuochun Huang int vsync_end;
399*ab3bc873SGuochun Huang int vtotal;
400*ab3bc873SGuochun Huang unsigned int flags;
401*ab3bc873SGuochun Huang };
402*ab3bc873SGuochun Huang
403*ab3bc873SGuochun Huang struct cmd_ctrl_hdr {
404*ab3bc873SGuochun Huang u8 dtype; /* data type */
405*ab3bc873SGuochun Huang u8 wait; /* ms */
406*ab3bc873SGuochun Huang u8 dlen; /* payload len */
407*ab3bc873SGuochun Huang } __packed;
408*ab3bc873SGuochun Huang
409*ab3bc873SGuochun Huang struct cmd_desc {
410*ab3bc873SGuochun Huang struct cmd_ctrl_hdr dchdr;
411*ab3bc873SGuochun Huang u8 *payload;
412*ab3bc873SGuochun Huang };
413*ab3bc873SGuochun Huang
414*ab3bc873SGuochun Huang struct panel_cmds {
415*ab3bc873SGuochun Huang u8 *buf;
416*ab3bc873SGuochun Huang unsigned int blen;
417*ab3bc873SGuochun Huang struct cmd_desc *cmds;
418*ab3bc873SGuochun Huang int cmd_cnt;
419*ab3bc873SGuochun Huang };
420*ab3bc873SGuochun Huang
421*ab3bc873SGuochun Huang struct rk628_panel_simple {
422*ab3bc873SGuochun Huang struct udevice *backlight;
423*ab3bc873SGuochun Huang
424*ab3bc873SGuochun Huang struct udevice *supply;
425*ab3bc873SGuochun Huang struct gpio_desc enable_gpio;
426*ab3bc873SGuochun Huang struct gpio_desc reset_gpio;
427*ab3bc873SGuochun Huang struct panel_cmds *on_cmds;
428*ab3bc873SGuochun Huang struct panel_cmds *off_cmds;
429*ab3bc873SGuochun Huang
430*ab3bc873SGuochun Huang struct {
431*ab3bc873SGuochun Huang unsigned int prepare;
432*ab3bc873SGuochun Huang unsigned int enable;
433*ab3bc873SGuochun Huang unsigned int disable;
434*ab3bc873SGuochun Huang unsigned int unprepare;
435*ab3bc873SGuochun Huang unsigned int reset;
436*ab3bc873SGuochun Huang unsigned int init;
437*ab3bc873SGuochun Huang } delay;
438*ab3bc873SGuochun Huang };
439*ab3bc873SGuochun Huang
440*ab3bc873SGuochun Huang struct rk628_dsi {
441*ab3bc873SGuochun Huang int bpp; /* 24/18/16*/
442*ab3bc873SGuochun Huang enum dsi_bus_format bus_format;
443*ab3bc873SGuochun Huang enum dsi_mode_flags mode_flags;
444*ab3bc873SGuochun Huang bool slave;
445*ab3bc873SGuochun Huang bool master;
446*ab3bc873SGuochun Huang uint8_t channel;
447*ab3bc873SGuochun Huang uint8_t lanes;
448*ab3bc873SGuochun Huang uint8_t id; /* 0:dsi0 1:dsi1 */
449*ab3bc873SGuochun Huang struct rk628 *rk628;
450*ab3bc873SGuochun Huang unsigned int lane_mbps; /* per lane */
451*ab3bc873SGuochun Huang };
452*ab3bc873SGuochun Huang
453*ab3bc873SGuochun Huang struct rk628_lvds {
454*ab3bc873SGuochun Huang enum lvds_format format;
455*ab3bc873SGuochun Huang enum lvds_link_type link_type;
456*ab3bc873SGuochun Huang };
457*ab3bc873SGuochun Huang
458*ab3bc873SGuochun Huang struct rk628_gvi {
459*ab3bc873SGuochun Huang enum gvi_bus_format bus_format;
460*ab3bc873SGuochun Huang enum gvi_color_depth color_depth;
461*ab3bc873SGuochun Huang int retry_times;
462*ab3bc873SGuochun Huang uint8_t lanes;
463*ab3bc873SGuochun Huang bool division_mode;
464*ab3bc873SGuochun Huang bool frm_rst;
465*ab3bc873SGuochun Huang u8 byte_mode;
466*ab3bc873SGuochun Huang };
467*ab3bc873SGuochun Huang
468*ab3bc873SGuochun Huang struct rk628_combtxphy {
469*ab3bc873SGuochun Huang enum rk628_phy_mode mode;
470*ab3bc873SGuochun Huang unsigned int flags;
471*ab3bc873SGuochun Huang u8 ref_div;
472*ab3bc873SGuochun Huang u8 fb_div;
473*ab3bc873SGuochun Huang u16 frac_div;
474*ab3bc873SGuochun Huang u8 rate_div;
475*ab3bc873SGuochun Huang u32 bus_width;
476*ab3bc873SGuochun Huang bool division_mode;
477*ab3bc873SGuochun Huang };
478*ab3bc873SGuochun Huang
479*ab3bc873SGuochun Huang struct rk628_rgb {
480*ab3bc873SGuochun Huang struct udevice *vccio_rgb;
481*ab3bc873SGuochun Huang bool bt1120_dual_edge;
482*ab3bc873SGuochun Huang bool bt1120_yc_swap;
483*ab3bc873SGuochun Huang bool bt1120_uv_swap;
484*ab3bc873SGuochun Huang };
485*ab3bc873SGuochun Huang
486*ab3bc873SGuochun Huang struct rk628_hdmi_mode {
487*ab3bc873SGuochun Huang u32 hdisplay;
488*ab3bc873SGuochun Huang u32 hstart;
489*ab3bc873SGuochun Huang u32 hend;
490*ab3bc873SGuochun Huang u32 htotal;
491*ab3bc873SGuochun Huang u32 vdisplay;
492*ab3bc873SGuochun Huang u32 vstart;
493*ab3bc873SGuochun Huang u32 vend;
494*ab3bc873SGuochun Huang u32 vtotal;
495*ab3bc873SGuochun Huang u32 clock;
496*ab3bc873SGuochun Huang unsigned int flags;
497*ab3bc873SGuochun Huang };
498*ab3bc873SGuochun Huang
499*ab3bc873SGuochun Huang struct rk628_hdmirx {
500*ab3bc873SGuochun Huang struct udevice *dev;
501*ab3bc873SGuochun Huang struct rk628 *parent;
502*ab3bc873SGuochun Huang struct rk628_hdmi_mode mode;
503*ab3bc873SGuochun Huang bool src_mode_4K_yuv420;
504*ab3bc873SGuochun Huang bool src_depth_10bit;
505*ab3bc873SGuochun Huang bool phy_lock;
506*ab3bc873SGuochun Huang bool is_hdmi2;
507*ab3bc873SGuochun Huang u32 input_format;
508*ab3bc873SGuochun Huang };
509*ab3bc873SGuochun Huang
510*ab3bc873SGuochun Huang struct rk628 {
511*ab3bc873SGuochun Huang struct udevice *dev;
512*ab3bc873SGuochun Huang struct udevice *power_supply;
513*ab3bc873SGuochun Huang struct gpio_desc reset_gpio;
514*ab3bc873SGuochun Huang struct gpio_desc enable_gpio;
515*ab3bc873SGuochun Huang struct rk628_panel_simple *panel;
516*ab3bc873SGuochun Huang bool display_enabled;
517*ab3bc873SGuochun Huang u32 input_mode;
518*ab3bc873SGuochun Huang u32 output_mode;
519*ab3bc873SGuochun Huang struct drm_display_mode src_mode;
520*ab3bc873SGuochun Huang struct drm_display_mode dst_mode;
521*ab3bc873SGuochun Huang enum bus_format input_fmt;
522*ab3bc873SGuochun Huang enum bus_format output_fmt;
523*ab3bc873SGuochun Huang struct rk628_hdmirx hdmirx;
524*ab3bc873SGuochun Huang struct rk628_dsi dsi0;
525*ab3bc873SGuochun Huang struct rk628_dsi dsi1;
526*ab3bc873SGuochun Huang struct rk628_lvds lvds;
527*ab3bc873SGuochun Huang struct rk628_gvi gvi;
528*ab3bc873SGuochun Huang struct rk628_combtxphy combtxphy;
529*ab3bc873SGuochun Huang int sync_pol;
530*ab3bc873SGuochun Huang u32 version;
531*ab3bc873SGuochun Huang struct rk628_rgb rgb;
532*ab3bc873SGuochun Huang };
533*ab3bc873SGuochun Huang
rk628_input_is_hdmi(struct rk628 * rk628)534*ab3bc873SGuochun Huang static inline bool rk628_input_is_hdmi(struct rk628 *rk628)
535*ab3bc873SGuochun Huang {
536*ab3bc873SGuochun Huang return rk628->input_mode & BIT(INPUT_MODE_HDMI);
537*ab3bc873SGuochun Huang }
538*ab3bc873SGuochun Huang
rk628_input_is_rgb(struct rk628 * rk628)539*ab3bc873SGuochun Huang static inline bool rk628_input_is_rgb(struct rk628 *rk628)
540*ab3bc873SGuochun Huang {
541*ab3bc873SGuochun Huang return rk628->input_mode & BIT(INPUT_MODE_RGB);
542*ab3bc873SGuochun Huang }
543*ab3bc873SGuochun Huang
rk628_input_is_bt1120(struct rk628 * rk628)544*ab3bc873SGuochun Huang static inline bool rk628_input_is_bt1120(struct rk628 *rk628)
545*ab3bc873SGuochun Huang {
546*ab3bc873SGuochun Huang return rk628->input_mode & BIT(INPUT_MODE_BT1120);
547*ab3bc873SGuochun Huang }
548*ab3bc873SGuochun Huang
rk628_output_is_rgb(struct rk628 * rk628)549*ab3bc873SGuochun Huang static inline bool rk628_output_is_rgb(struct rk628 *rk628)
550*ab3bc873SGuochun Huang {
551*ab3bc873SGuochun Huang return rk628->output_mode & BIT(OUTPUT_MODE_RGB);
552*ab3bc873SGuochun Huang }
553*ab3bc873SGuochun Huang
rk628_output_is_bt1120(struct rk628 * rk628)554*ab3bc873SGuochun Huang static inline bool rk628_output_is_bt1120(struct rk628 *rk628)
555*ab3bc873SGuochun Huang {
556*ab3bc873SGuochun Huang return rk628->output_mode & BIT(OUTPUT_MODE_BT1120);
557*ab3bc873SGuochun Huang }
558*ab3bc873SGuochun Huang
rk628_output_is_gvi(struct rk628 * rk628)559*ab3bc873SGuochun Huang static inline bool rk628_output_is_gvi(struct rk628 *rk628)
560*ab3bc873SGuochun Huang {
561*ab3bc873SGuochun Huang return rk628->output_mode & BIT(OUTPUT_MODE_GVI);
562*ab3bc873SGuochun Huang }
563*ab3bc873SGuochun Huang
rk628_output_is_lvds(struct rk628 * rk628)564*ab3bc873SGuochun Huang static inline bool rk628_output_is_lvds(struct rk628 *rk628)
565*ab3bc873SGuochun Huang {
566*ab3bc873SGuochun Huang return rk628->output_mode & BIT(OUTPUT_MODE_LVDS);
567*ab3bc873SGuochun Huang }
568*ab3bc873SGuochun Huang
rk628_output_is_dsi(struct rk628 * rk628)569*ab3bc873SGuochun Huang static inline bool rk628_output_is_dsi(struct rk628 *rk628)
570*ab3bc873SGuochun Huang {
571*ab3bc873SGuochun Huang return rk628->output_mode & BIT(OUTPUT_MODE_DSI);
572*ab3bc873SGuochun Huang }
573*ab3bc873SGuochun Huang
rk628_output_is_csi(struct rk628 * rk628)574*ab3bc873SGuochun Huang static inline bool rk628_output_is_csi(struct rk628 *rk628)
575*ab3bc873SGuochun Huang {
576*ab3bc873SGuochun Huang return rk628->output_mode & BIT(OUTPUT_MODE_CSI);
577*ab3bc873SGuochun Huang }
578*ab3bc873SGuochun Huang
rk628_output_is_hdmi(struct rk628 * rk628)579*ab3bc873SGuochun Huang static inline bool rk628_output_is_hdmi(struct rk628 *rk628)
580*ab3bc873SGuochun Huang {
581*ab3bc873SGuochun Huang return rk628->output_mode & BIT(OUTPUT_MODE_HDMI);
582*ab3bc873SGuochun Huang }
583*ab3bc873SGuochun Huang
rk628_set_input_bus_format(struct rk628 * rk628,enum bus_format format)584*ab3bc873SGuochun Huang static inline void rk628_set_input_bus_format(struct rk628 *rk628, enum bus_format format)
585*ab3bc873SGuochun Huang {
586*ab3bc873SGuochun Huang rk628->input_fmt = format;
587*ab3bc873SGuochun Huang }
588*ab3bc873SGuochun Huang
rk628_get_input_bus_format(struct rk628 * rk628)589*ab3bc873SGuochun Huang static inline enum bus_format rk628_get_input_bus_format(struct rk628 *rk628)
590*ab3bc873SGuochun Huang {
591*ab3bc873SGuochun Huang return rk628->input_fmt;
592*ab3bc873SGuochun Huang }
593*ab3bc873SGuochun Huang
rk628_set_output_bus_format(struct rk628 * rk628,enum bus_format format)594*ab3bc873SGuochun Huang static inline void rk628_set_output_bus_format(struct rk628 *rk628, enum bus_format format)
595*ab3bc873SGuochun Huang {
596*ab3bc873SGuochun Huang rk628->output_fmt = format;
597*ab3bc873SGuochun Huang }
598*ab3bc873SGuochun Huang
rk628_get_output_bus_format(struct rk628 * rk628)599*ab3bc873SGuochun Huang static inline enum bus_format rk628_get_output_bus_format(struct rk628 *rk628)
600*ab3bc873SGuochun Huang {
601*ab3bc873SGuochun Huang return rk628->output_fmt;
602*ab3bc873SGuochun Huang }
603*ab3bc873SGuochun Huang
rk628_i2c_write(struct rk628 * rk628,u32 reg,u32 val)604*ab3bc873SGuochun Huang static inline int rk628_i2c_write(struct rk628 *rk628, u32 reg, u32 val)
605*ab3bc873SGuochun Huang {
606*ab3bc873SGuochun Huang struct dm_i2c_chip *chip = dev_get_parent_platdata(rk628->dev);
607*ab3bc873SGuochun Huang struct i2c_msg msg;
608*ab3bc873SGuochun Huang u8 buf[] = {
609*ab3bc873SGuochun Huang (reg >> 0) & 0xff, (reg >> 8) & 0xff,
610*ab3bc873SGuochun Huang (reg >> 16) & 0xff, (reg >> 24) & 0xff,
611*ab3bc873SGuochun Huang (val >> 0) & 0xff, (val >> 8) & 0xff,
612*ab3bc873SGuochun Huang (val >> 16) & 0xff, (val >> 24) & 0xff
613*ab3bc873SGuochun Huang };
614*ab3bc873SGuochun Huang int ret;
615*ab3bc873SGuochun Huang
616*ab3bc873SGuochun Huang msg.addr = chip->chip_addr;
617*ab3bc873SGuochun Huang msg.flags = 0;
618*ab3bc873SGuochun Huang msg.len = sizeof(buf);
619*ab3bc873SGuochun Huang msg.buf = buf;
620*ab3bc873SGuochun Huang
621*ab3bc873SGuochun Huang ret = dm_i2c_xfer(rk628->dev, &msg, 1);
622*ab3bc873SGuochun Huang if (ret) {
623*ab3bc873SGuochun Huang dev_err(rk628->dev, "Could not execute transfer: %d\n", ret);
624*ab3bc873SGuochun Huang return ret;
625*ab3bc873SGuochun Huang }
626*ab3bc873SGuochun Huang
627*ab3bc873SGuochun Huang return 0;
628*ab3bc873SGuochun Huang }
629*ab3bc873SGuochun Huang
rk628_i2c_read(struct rk628 * rk628,u32 reg,u32 * val)630*ab3bc873SGuochun Huang static inline int rk628_i2c_read(struct rk628 *rk628, u32 reg, u32 *val)
631*ab3bc873SGuochun Huang {
632*ab3bc873SGuochun Huang struct dm_i2c_chip *chip = dev_get_parent_platdata(rk628->dev);
633*ab3bc873SGuochun Huang u32 data;
634*ab3bc873SGuochun Huang struct i2c_msg msg[] = {
635*ab3bc873SGuochun Huang {
636*ab3bc873SGuochun Huang .addr = chip->chip_addr,
637*ab3bc873SGuochun Huang .flags = 0,
638*ab3bc873SGuochun Huang .buf = (u8 *)®,
639*ab3bc873SGuochun Huang .len = 4,
640*ab3bc873SGuochun Huang }, {
641*ab3bc873SGuochun Huang .addr = chip->chip_addr,
642*ab3bc873SGuochun Huang .flags = I2C_M_RD,
643*ab3bc873SGuochun Huang .buf = (u8 *)&data,
644*ab3bc873SGuochun Huang .len = 4,
645*ab3bc873SGuochun Huang }
646*ab3bc873SGuochun Huang };
647*ab3bc873SGuochun Huang int ret;
648*ab3bc873SGuochun Huang
649*ab3bc873SGuochun Huang ret = dm_i2c_xfer(rk628->dev, msg, 2);
650*ab3bc873SGuochun Huang if (ret) {
651*ab3bc873SGuochun Huang dev_err(rk628->dev, "Could not execute transfer: %d\n", ret);
652*ab3bc873SGuochun Huang return ret;
653*ab3bc873SGuochun Huang }
654*ab3bc873SGuochun Huang
655*ab3bc873SGuochun Huang *val = data;
656*ab3bc873SGuochun Huang
657*ab3bc873SGuochun Huang return 0;
658*ab3bc873SGuochun Huang }
659*ab3bc873SGuochun Huang
rk628_i2c_update_bits(struct rk628 * rk628,u32 reg,u32 mask,u32 val)660*ab3bc873SGuochun Huang static inline int rk628_i2c_update_bits(struct rk628 *rk628, u32 reg, u32 mask, u32 val)
661*ab3bc873SGuochun Huang {
662*ab3bc873SGuochun Huang u32 tmp, orig;
663*ab3bc873SGuochun Huang int ret;
664*ab3bc873SGuochun Huang
665*ab3bc873SGuochun Huang ret = rk628_i2c_read(rk628, reg, &orig);
666*ab3bc873SGuochun Huang if (ret)
667*ab3bc873SGuochun Huang return ret;
668*ab3bc873SGuochun Huang
669*ab3bc873SGuochun Huang tmp = orig & ~mask;
670*ab3bc873SGuochun Huang tmp |= val & mask;
671*ab3bc873SGuochun Huang
672*ab3bc873SGuochun Huang return rk628_i2c_write(rk628, reg, tmp);
673*ab3bc873SGuochun Huang }
674*ab3bc873SGuochun Huang
675*ab3bc873SGuochun Huang #define rk628_read_poll_timeout(rk628, addr, val, cond, sleep_us, timeout_us) \
676*ab3bc873SGuochun Huang ({ \
677*ab3bc873SGuochun Huang unsigned long timeout = timer_get_us() + (timeout_us); \
678*ab3bc873SGuochun Huang for (;;) { \
679*ab3bc873SGuochun Huang rk628_i2c_read(rk628, addr, &val); \
680*ab3bc873SGuochun Huang if (cond) \
681*ab3bc873SGuochun Huang break; \
682*ab3bc873SGuochun Huang if ((timeout_us) && time_after(timer_get_us(), timeout)) { \
683*ab3bc873SGuochun Huang rk628_i2c_read(rk628, addr, &val); \
684*ab3bc873SGuochun Huang break; \
685*ab3bc873SGuochun Huang } \
686*ab3bc873SGuochun Huang if (sleep_us) \
687*ab3bc873SGuochun Huang udelay(sleep_us); \
688*ab3bc873SGuochun Huang } \
689*ab3bc873SGuochun Huang (cond) ? 0 : -ETIMEDOUT; \
690*ab3bc873SGuochun Huang })
691*ab3bc873SGuochun Huang
692*ab3bc873SGuochun Huang #endif
693