xref: /OK3568_Linux_fs/kernel/drivers/misc/rk628/rk628_rgb.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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 #include "rk628.h"
9*4882a593Smuzhiyun #include "rk628_cru.h"
10*4882a593Smuzhiyun #include "rk628_config.h"
11*4882a593Smuzhiyun #include "panel.h"
12*4882a593Smuzhiyun 
rk628_rgb_decoder_enable(struct rk628 * rk628)13*4882a593Smuzhiyun void rk628_rgb_decoder_enable(struct rk628 *rk628)
14*4882a593Smuzhiyun {
15*4882a593Smuzhiyun 		/* config sw_input_mode RGB */
16*4882a593Smuzhiyun 	rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0, SW_INPUT_MODE_MASK,
17*4882a593Smuzhiyun 			      SW_INPUT_MODE(INPUT_MODE_RGB));
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun 	/* pinctrl for vop pin */
20*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2AB_SEL_CON, 0xffffffff);
21*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2C_SEL_CON, 0xffff5555);
22*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO3AB_SEL_CON, 0x10b010b);
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun 	/* rk628: modify IO drive strength for RGB */
25*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2A_D0_CON, 0xffff1111);
26*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2A_D1_CON, 0xffff1111);
27*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2B_D0_CON, 0xffff1111);
28*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2B_D1_CON, 0xffff1111);
29*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2C_D0_CON, 0xffff1111);
30*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2C_D1_CON, 0xffff1111);
31*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO3A_D0_CON, 0xffff1011);
32*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO3B_D_CON, 0x10001);
33*4882a593Smuzhiyun }
34*4882a593Smuzhiyun 
rk628_rgb_encoder_enable(struct rk628 * rk628)35*4882a593Smuzhiyun void rk628_rgb_encoder_enable(struct rk628 *rk628)
36*4882a593Smuzhiyun {
37*4882a593Smuzhiyun 	rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0,
38*4882a593Smuzhiyun 			      SW_BT_DATA_OEN_MASK | SW_OUTPUT_MODE_MASK,
39*4882a593Smuzhiyun 			      SW_OUTPUT_MODE(OUTPUT_MODE_RGB));
40*4882a593Smuzhiyun 	rk628_i2c_update_bits(rk628, GRF_POST_PROC_CON, SW_DCLK_OUT_INV_EN,
41*4882a593Smuzhiyun 			      SW_DCLK_OUT_INV_EN);
42*4882a593Smuzhiyun }
43*4882a593Smuzhiyun 
rk628_rgb_encoder_disable(struct rk628 * rk628)44*4882a593Smuzhiyun void rk628_rgb_encoder_disable(struct rk628 *rk628)
45*4882a593Smuzhiyun {
46*4882a593Smuzhiyun 	rk628_panel_disable(rk628);
47*4882a593Smuzhiyun 	rk628_panel_unprepare(rk628);
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 
rk628_rgb_rx_enable(struct rk628 * rk628)51*4882a593Smuzhiyun void rk628_rgb_rx_enable(struct rk628 *rk628)
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 	rk628_rgb_decoder_enable(rk628);
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun 
rk628_rgb_tx_enable(struct rk628 * rk628)58*4882a593Smuzhiyun void rk628_rgb_tx_enable(struct rk628 *rk628)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun 	rk628_rgb_encoder_enable(rk628);
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	rk628_panel_prepare(rk628);
63*4882a593Smuzhiyun 	rk628_panel_enable(rk628);
64*4882a593Smuzhiyun }
65*4882a593Smuzhiyun 
rk628_rgb_tx_disable(struct rk628 * rk628)66*4882a593Smuzhiyun void rk628_rgb_tx_disable(struct rk628 *rk628)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun 	rk628_panel_disable(rk628);
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun 
rk628_bt1120_decoder_enable(struct rk628 * rk628)71*4882a593Smuzhiyun void rk628_bt1120_decoder_enable(struct rk628 *rk628)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun 	struct rk628_display_mode *mode = rk628_display_get_src_mode(rk628);
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun 	/* pinctrl for vop pin */
76*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2AB_SEL_CON, 0xffffffff);
77*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2C_SEL_CON, 0xffff5555);
78*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO3AB_SEL_CON, 0x10b010b);
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 	/* rk628: modify IO drive strength for RGB */
81*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2A_D0_CON, 0xffff1111);
82*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2A_D1_CON, 0xffff1111);
83*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2B_D0_CON, 0xffff1111);
84*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2B_D1_CON, 0xffff1111);
85*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2C_D0_CON, 0xffff1111);
86*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2C_D1_CON, 0xffff1111);
87*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO3A_D0_CON, 0xffff1011);
88*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO3B_D_CON, 0x10001);
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	/* config sw_input_mode bt1120 */
91*4882a593Smuzhiyun 	rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0, SW_INPUT_MODE_MASK,
92*4882a593Smuzhiyun 			      SW_INPUT_MODE(INPUT_MODE_BT1120));
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	/* operation resetn_bt1120dec */
95*4882a593Smuzhiyun 	rk628_i2c_write(rk628, CRU_SOFTRST_CON00, 0x10001000);
96*4882a593Smuzhiyun 	rk628_i2c_write(rk628, CRU_SOFTRST_CON00, 0x10000000);
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	rk628_cru_clk_set_rate(rk628, CGU_BT1120DEC, mode->clock * 1000);
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun #ifdef BT1120_DUAL_EDGE
101*4882a593Smuzhiyun 	rk628_i2c_update_bits(rk628, GRF_RGB_DEC_CON0,
102*4882a593Smuzhiyun 			      DEC_DUALEDGE_EN, DEC_DUALEDGE_EN);
103*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_BT1120_DCLK_DELAY_CON0, 0x10000000);
104*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_BT1120_DCLK_DELAY_CON1, 0);
105*4882a593Smuzhiyun #endif
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun 	rk628_i2c_update_bits(rk628, GRF_RGB_DEC_CON1, SW_SET_X_MASK,
108*4882a593Smuzhiyun 			      SW_SET_X(mode->hdisplay));
109*4882a593Smuzhiyun 	rk628_i2c_update_bits(rk628, GRF_RGB_DEC_CON2, SW_SET_Y_MASK,
110*4882a593Smuzhiyun 			      SW_SET_Y(mode->vdisplay));
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 	rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0,
113*4882a593Smuzhiyun 			      SW_BT_DATA_OEN_MASK | SW_INPUT_MODE_MASK,
114*4882a593Smuzhiyun 			      SW_BT_DATA_OEN | SW_INPUT_MODE(INPUT_MODE_BT1120));
115*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_CSC_CTRL_CON, SW_Y2R_EN(1));
116*4882a593Smuzhiyun 	rk628_i2c_update_bits(rk628, GRF_RGB_DEC_CON0,
117*4882a593Smuzhiyun 			      SW_CAP_EN_PSYNC | SW_CAP_EN_ASYNC | SW_PROGRESS_EN,
118*4882a593Smuzhiyun 			      SW_CAP_EN_PSYNC | SW_CAP_EN_ASYNC | SW_PROGRESS_EN);
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun 
rk628_bt1120_encoder_enable(struct rk628 * rk628)121*4882a593Smuzhiyun void rk628_bt1120_encoder_enable(struct rk628 *rk628)
122*4882a593Smuzhiyun {
123*4882a593Smuzhiyun 	u32 val = 0;
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun 	/* pinctrl for vop pin */
126*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2AB_SEL_CON, 0xffffffff);
127*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2C_SEL_CON, 0xffff5555);
128*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO3AB_SEL_CON, 0x10b010b);
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 	/* rk628: modify IO drive strength for RGB */
131*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2A_D0_CON, 0xffff1111);
132*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2A_D1_CON, 0xffff1111);
133*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2B_D0_CON, 0xffff1111);
134*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2B_D1_CON, 0xffff1111);
135*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2C_D0_CON, 0xffff1111);
136*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO2C_D1_CON, 0xffff1111);
137*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO3A_D0_CON, 0xffff1011);
138*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_GPIO3B_D_CON, 0x10001);
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 	/* config sw_input_mode bt1120 */
141*4882a593Smuzhiyun 	rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0,
142*4882a593Smuzhiyun 			      SW_BT_DATA_OEN_MASK | SW_OUTPUT_MODE_MASK,
143*4882a593Smuzhiyun 			      SW_OUTPUT_MODE(OUTPUT_MODE_BT1120));
144*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_CSC_CTRL_CON, SW_R2Y_EN(1));
145*4882a593Smuzhiyun 	rk628_i2c_update_bits(rk628, GRF_POST_PROC_CON,
146*4882a593Smuzhiyun 			      SW_DCLK_OUT_INV_EN, SW_DCLK_OUT_INV_EN);
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun #ifdef BT1120_DUAL_EDGE
149*4882a593Smuzhiyun 	val |= ENC_DUALEDGE_EN(1);
150*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_BT1120_DCLK_DELAY_CON0, 0x10000000);
151*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_BT1120_DCLK_DELAY_CON1, 0);
152*4882a593Smuzhiyun #endif
153*4882a593Smuzhiyun 	val |= BT1120_UV_SWAP(1);
154*4882a593Smuzhiyun 	rk628_i2c_write(rk628, GRF_RGB_ENC_CON, val);
155*4882a593Smuzhiyun }
156*4882a593Smuzhiyun 
rk628_bt1120_rx_enable(struct rk628 * rk628)157*4882a593Smuzhiyun void rk628_bt1120_rx_enable(struct rk628 *rk628)
158*4882a593Smuzhiyun {
159*4882a593Smuzhiyun 	rk628_bt1120_decoder_enable(rk628);
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun 
rk628_bt1120_tx_enable(struct rk628 * rk628)162*4882a593Smuzhiyun void rk628_bt1120_tx_enable(struct rk628 *rk628)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun 	rk628_bt1120_encoder_enable(rk628);
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
167