hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (c) 2020 Rockchip Electronics Co. Ltd.
 *
 * Author: Guochun Huang <hero.huang@rock-chips.com>
 */
 
#include "rk628.h"
#include "rk628_cru.h"
#include "rk628_config.h"
#include "panel.h"
 
void rk628_rgb_decoder_enable(struct rk628 *rk628)
{
       /* config sw_input_mode RGB */
   rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0, SW_INPUT_MODE_MASK,
                 SW_INPUT_MODE(INPUT_MODE_RGB));
 
   /* pinctrl for vop pin */
   rk628_i2c_write(rk628, GRF_GPIO2AB_SEL_CON, 0xffffffff);
   rk628_i2c_write(rk628, GRF_GPIO2C_SEL_CON, 0xffff5555);
   rk628_i2c_write(rk628, GRF_GPIO3AB_SEL_CON, 0x10b010b);
 
   /* rk628: modify IO drive strength for RGB */
   rk628_i2c_write(rk628, GRF_GPIO2A_D0_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO2A_D1_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO2B_D0_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO2B_D1_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO2C_D0_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO2C_D1_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO3A_D0_CON, 0xffff1011);
   rk628_i2c_write(rk628, GRF_GPIO3B_D_CON, 0x10001);
}
 
void rk628_rgb_encoder_enable(struct rk628 *rk628)
{
   rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0,
                 SW_BT_DATA_OEN_MASK | SW_OUTPUT_MODE_MASK,
                 SW_OUTPUT_MODE(OUTPUT_MODE_RGB));
   rk628_i2c_update_bits(rk628, GRF_POST_PROC_CON, SW_DCLK_OUT_INV_EN,
                 SW_DCLK_OUT_INV_EN);
}
 
void rk628_rgb_encoder_disable(struct rk628 *rk628)
{
   rk628_panel_disable(rk628);
   rk628_panel_unprepare(rk628);
}
 
 
void rk628_rgb_rx_enable(struct rk628 *rk628)
{
 
   rk628_rgb_decoder_enable(rk628);
 
}
 
void rk628_rgb_tx_enable(struct rk628 *rk628)
{
   rk628_rgb_encoder_enable(rk628);
 
   rk628_panel_prepare(rk628);
   rk628_panel_enable(rk628);
}
 
void rk628_rgb_tx_disable(struct rk628 *rk628)
{
   rk628_panel_disable(rk628);
}
 
void rk628_bt1120_decoder_enable(struct rk628 *rk628)
{
   struct rk628_display_mode *mode = rk628_display_get_src_mode(rk628);
 
   /* pinctrl for vop pin */
   rk628_i2c_write(rk628, GRF_GPIO2AB_SEL_CON, 0xffffffff);
   rk628_i2c_write(rk628, GRF_GPIO2C_SEL_CON, 0xffff5555);
   rk628_i2c_write(rk628, GRF_GPIO3AB_SEL_CON, 0x10b010b);
 
   /* rk628: modify IO drive strength for RGB */
   rk628_i2c_write(rk628, GRF_GPIO2A_D0_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO2A_D1_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO2B_D0_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO2B_D1_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO2C_D0_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO2C_D1_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO3A_D0_CON, 0xffff1011);
   rk628_i2c_write(rk628, GRF_GPIO3B_D_CON, 0x10001);
 
   /* config sw_input_mode bt1120 */
   rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0, SW_INPUT_MODE_MASK,
                 SW_INPUT_MODE(INPUT_MODE_BT1120));
 
   /* operation resetn_bt1120dec */
   rk628_i2c_write(rk628, CRU_SOFTRST_CON00, 0x10001000);
   rk628_i2c_write(rk628, CRU_SOFTRST_CON00, 0x10000000);
 
   rk628_cru_clk_set_rate(rk628, CGU_BT1120DEC, mode->clock * 1000);
 
#ifdef BT1120_DUAL_EDGE
   rk628_i2c_update_bits(rk628, GRF_RGB_DEC_CON0,
                 DEC_DUALEDGE_EN, DEC_DUALEDGE_EN);
   rk628_i2c_write(rk628, GRF_BT1120_DCLK_DELAY_CON0, 0x10000000);
   rk628_i2c_write(rk628, GRF_BT1120_DCLK_DELAY_CON1, 0);
#endif
 
   rk628_i2c_update_bits(rk628, GRF_RGB_DEC_CON1, SW_SET_X_MASK,
                 SW_SET_X(mode->hdisplay));
   rk628_i2c_update_bits(rk628, GRF_RGB_DEC_CON2, SW_SET_Y_MASK,
                 SW_SET_Y(mode->vdisplay));
 
   rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0,
                 SW_BT_DATA_OEN_MASK | SW_INPUT_MODE_MASK,
                 SW_BT_DATA_OEN | SW_INPUT_MODE(INPUT_MODE_BT1120));
   rk628_i2c_write(rk628, GRF_CSC_CTRL_CON, SW_Y2R_EN(1));
   rk628_i2c_update_bits(rk628, GRF_RGB_DEC_CON0,
                 SW_CAP_EN_PSYNC | SW_CAP_EN_ASYNC | SW_PROGRESS_EN,
                 SW_CAP_EN_PSYNC | SW_CAP_EN_ASYNC | SW_PROGRESS_EN);
}
 
void rk628_bt1120_encoder_enable(struct rk628 *rk628)
{
   u32 val = 0;
 
   /* pinctrl for vop pin */
   rk628_i2c_write(rk628, GRF_GPIO2AB_SEL_CON, 0xffffffff);
   rk628_i2c_write(rk628, GRF_GPIO2C_SEL_CON, 0xffff5555);
   rk628_i2c_write(rk628, GRF_GPIO3AB_SEL_CON, 0x10b010b);
 
   /* rk628: modify IO drive strength for RGB */
   rk628_i2c_write(rk628, GRF_GPIO2A_D0_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO2A_D1_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO2B_D0_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO2B_D1_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO2C_D0_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO2C_D1_CON, 0xffff1111);
   rk628_i2c_write(rk628, GRF_GPIO3A_D0_CON, 0xffff1011);
   rk628_i2c_write(rk628, GRF_GPIO3B_D_CON, 0x10001);
 
   /* config sw_input_mode bt1120 */
   rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0,
                 SW_BT_DATA_OEN_MASK | SW_OUTPUT_MODE_MASK,
                 SW_OUTPUT_MODE(OUTPUT_MODE_BT1120));
   rk628_i2c_write(rk628, GRF_CSC_CTRL_CON, SW_R2Y_EN(1));
   rk628_i2c_update_bits(rk628, GRF_POST_PROC_CON,
                 SW_DCLK_OUT_INV_EN, SW_DCLK_OUT_INV_EN);
 
#ifdef BT1120_DUAL_EDGE
   val |= ENC_DUALEDGE_EN(1);
   rk628_i2c_write(rk628, GRF_BT1120_DCLK_DELAY_CON0, 0x10000000);
   rk628_i2c_write(rk628, GRF_BT1120_DCLK_DELAY_CON1, 0);
#endif
   val |= BT1120_UV_SWAP(1);
   rk628_i2c_write(rk628, GRF_RGB_ENC_CON, val);
}
 
void rk628_bt1120_rx_enable(struct rk628 *rk628)
{
   rk628_bt1120_decoder_enable(rk628);
}
 
void rk628_bt1120_tx_enable(struct rk628 *rk628)
{
   rk628_bt1120_encoder_enable(rk628);
}