blob: 84f6e8b8c0e251542cfdd63b8b34a26aa50b6797 [file] [log] [blame]
Sudip Mukherjee81dee672015-03-03 16:21:06 +05301#include "ddk750_reg.h"
2#include "ddk750_help.h"
3#include "ddk750_display.h"
4#include "ddk750_power.h"
5#include "ddk750_dvi.h"
6
Isaac Assegaida295042015-06-02 03:14:30 -07007#define primaryWaitVerticalSync(delay) waitNextVerticalSync(0, delay)
Sudip Mukherjee81dee672015-03-03 16:21:06 +05308
Amitoj Kaur Chawlaedb23022015-10-10 02:17:44 +05309static void setDisplayControl(int ctrl, int disp_state)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053010{
11 /* state != 0 means turn on both timing & plane en_bit */
12 unsigned long ulDisplayCtrlReg, ulReservedBits;
13 int cnt;
14
15 cnt = 0;
16
17 /* Set the primary display control */
Juston Li259fef32015-07-14 21:14:45 -070018 if (!ctrl) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +053019 ulDisplayCtrlReg = PEEK32(PANEL_DISPLAY_CTRL);
20 /* Turn on/off the Panel display control */
Amitoj Kaur Chawlaedb23022015-10-10 02:17:44 +053021 if (disp_state) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +053022 /* Timing should be enabled first before enabling the plane
23 * because changing at the same time does not guarantee that
24 * the plane will also enabled or disabled.
Juston Li78376532015-07-14 21:14:30 -070025 */
Sudip Mukherjee81dee672015-03-03 16:21:06 +053026 ulDisplayCtrlReg = FIELD_SET(ulDisplayCtrlReg,
27 PANEL_DISPLAY_CTRL, TIMING, ENABLE);
28 POKE32(PANEL_DISPLAY_CTRL, ulDisplayCtrlReg);
29
30 ulDisplayCtrlReg = FIELD_SET(ulDisplayCtrlReg,
31 PANEL_DISPLAY_CTRL, PLANE, ENABLE);
32
33 /* Added some masks to mask out the reserved bits.
34 * Sometimes, the reserved bits are set/reset randomly when
35 * writing to the PRIMARY_DISPLAY_CTRL, therefore, the register
36 * reserved bits are needed to be masked out.
37 */
38 ulReservedBits = FIELD_SET(0, PANEL_DISPLAY_CTRL, RESERVED_1_MASK, ENABLE) |
39 FIELD_SET(0, PANEL_DISPLAY_CTRL, RESERVED_2_MASK, ENABLE) |
40 FIELD_SET(0, PANEL_DISPLAY_CTRL, RESERVED_3_MASK, ENABLE);
41
42 /* Somehow the register value on the plane is not set
43 * until a few delay. Need to write
44 * and read it a couple times
45 */
Juston Li259fef32015-07-14 21:14:45 -070046 do {
Sudip Mukherjee81dee672015-03-03 16:21:06 +053047 cnt++;
48 POKE32(PANEL_DISPLAY_CTRL, ulDisplayCtrlReg);
Juston Li9ccc5f42015-07-14 21:14:33 -070049 } while ((PEEK32(PANEL_DISPLAY_CTRL) & ~ulReservedBits) !=
Sudip Mukherjee81dee672015-03-03 16:21:06 +053050 (ulDisplayCtrlReg & ~ulReservedBits));
Isaac Assegaida295042015-06-02 03:14:30 -070051 printk("Set Panel Plane enbit:after tried %d times\n", cnt);
Juston Li259fef32015-07-14 21:14:45 -070052 } else {
Sudip Mukherjee81dee672015-03-03 16:21:06 +053053 /* When turning off, there is no rule on the programming
54 * sequence since whenever the clock is off, then it does not
55 * matter whether the plane is enabled or disabled.
56 * Note: Modifying the plane bit will take effect on the
57 * next vertical sync. Need to find out if it is necessary to
58 * wait for 1 vsync before modifying the timing enable bit.
59 * */
60 ulDisplayCtrlReg = FIELD_SET(ulDisplayCtrlReg,
61 PANEL_DISPLAY_CTRL, PLANE, DISABLE);
62 POKE32(PANEL_DISPLAY_CTRL, ulDisplayCtrlReg);
63
64 ulDisplayCtrlReg = FIELD_SET(ulDisplayCtrlReg,
65 PANEL_DISPLAY_CTRL, TIMING, DISABLE);
66 POKE32(PANEL_DISPLAY_CTRL, ulDisplayCtrlReg);
67 }
68
Juston Li259fef32015-07-14 21:14:45 -070069 } else {
70 /* Set the secondary display control */
Sudip Mukherjee81dee672015-03-03 16:21:06 +053071 ulDisplayCtrlReg = PEEK32(CRT_DISPLAY_CTRL);
72
Amitoj Kaur Chawlaedb23022015-10-10 02:17:44 +053073 if (disp_state) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +053074 /* Timing should be enabled first before enabling the plane because changing at the
75 same time does not guarantee that the plane will also enabled or disabled.
76 */
77 ulDisplayCtrlReg = FIELD_SET(ulDisplayCtrlReg,
78 CRT_DISPLAY_CTRL, TIMING, ENABLE);
79 POKE32(CRT_DISPLAY_CTRL, ulDisplayCtrlReg);
80
81 ulDisplayCtrlReg = FIELD_SET(ulDisplayCtrlReg,
82 CRT_DISPLAY_CTRL, PLANE, ENABLE);
83
84 /* Added some masks to mask out the reserved bits.
85 * Sometimes, the reserved bits are set/reset randomly when
86 * writing to the PRIMARY_DISPLAY_CTRL, therefore, the register
87 * reserved bits are needed to be masked out.
88 */
89
90 ulReservedBits = FIELD_SET(0, CRT_DISPLAY_CTRL, RESERVED_1_MASK, ENABLE) |
91 FIELD_SET(0, CRT_DISPLAY_CTRL, RESERVED_2_MASK, ENABLE) |
92 FIELD_SET(0, CRT_DISPLAY_CTRL, RESERVED_3_MASK, ENABLE) |
93 FIELD_SET(0, CRT_DISPLAY_CTRL, RESERVED_4_MASK, ENABLE);
94
Juston Li259fef32015-07-14 21:14:45 -070095 do {
Sudip Mukherjee81dee672015-03-03 16:21:06 +053096 cnt++;
97 POKE32(CRT_DISPLAY_CTRL, ulDisplayCtrlReg);
Juston Li9ccc5f42015-07-14 21:14:33 -070098 } while ((PEEK32(CRT_DISPLAY_CTRL) & ~ulReservedBits) !=
Sudip Mukherjee81dee672015-03-03 16:21:06 +053099 (ulDisplayCtrlReg & ~ulReservedBits));
Isaac Assegaida295042015-06-02 03:14:30 -0700100 printk("Set Crt Plane enbit:after tried %d times\n", cnt);
Juston Li259fef32015-07-14 21:14:45 -0700101 } else {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530102 /* When turning off, there is no rule on the programming
103 * sequence since whenever the clock is off, then it does not
104 * matter whether the plane is enabled or disabled.
105 * Note: Modifying the plane bit will take effect on the next
106 * vertical sync. Need to find out if it is necessary to
107 * wait for 1 vsync before modifying the timing enable bit.
108 */
109 ulDisplayCtrlReg = FIELD_SET(ulDisplayCtrlReg,
110 CRT_DISPLAY_CTRL, PLANE, DISABLE);
111 POKE32(CRT_DISPLAY_CTRL, ulDisplayCtrlReg);
112
113 ulDisplayCtrlReg = FIELD_SET(ulDisplayCtrlReg,
114 CRT_DISPLAY_CTRL, TIMING, DISABLE);
115 POKE32(CRT_DISPLAY_CTRL, ulDisplayCtrlReg);
116 }
117 }
118}
119
Isaac Assegaida295042015-06-02 03:14:30 -0700120static void waitNextVerticalSync(int ctrl, int delay)
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530121{
122 unsigned int status;
Juston Li40403c12015-07-14 21:14:48 -0700123
Juston Li8c11f5a2015-07-14 21:14:35 -0700124 if (!ctrl) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530125 /* primary controller */
126
Juston Li78376532015-07-14 21:14:30 -0700127 /* Do not wait when the Primary PLL is off or display control is already off.
128 This will prevent the software to wait forever. */
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530129 if ((FIELD_GET(PEEK32(PANEL_PLL_CTRL), PANEL_PLL_CTRL, POWER) ==
130 PANEL_PLL_CTRL_POWER_OFF) ||
131 (FIELD_GET(PEEK32(PANEL_DISPLAY_CTRL), PANEL_DISPLAY_CTRL, TIMING) ==
Juston Li259fef32015-07-14 21:14:45 -0700132 PANEL_DISPLAY_CTRL_TIMING_DISABLE)) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530133 return;
134 }
135
Juston Li259fef32015-07-14 21:14:45 -0700136 while (delay-- > 0) {
Juston Li78376532015-07-14 21:14:30 -0700137 /* Wait for end of vsync. */
Juston Li259fef32015-07-14 21:14:45 -0700138 do {
Juston Li78376532015-07-14 21:14:30 -0700139 status = FIELD_GET(PEEK32(SYSTEM_CTRL),
140 SYSTEM_CTRL,
141 PANEL_VSYNC);
Juston Licebafd82015-07-14 21:14:46 -0700142 } while (status == SYSTEM_CTRL_PANEL_VSYNC_ACTIVE);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530143
Juston Li78376532015-07-14 21:14:30 -0700144 /* Wait for start of vsync. */
Juston Li259fef32015-07-14 21:14:45 -0700145 do {
Juston Li78376532015-07-14 21:14:30 -0700146 status = FIELD_GET(PEEK32(SYSTEM_CTRL),
147 SYSTEM_CTRL,
148 PANEL_VSYNC);
Juston Licebafd82015-07-14 21:14:46 -0700149 } while (status == SYSTEM_CTRL_PANEL_VSYNC_INACTIVE);
Juston Li78376532015-07-14 21:14:30 -0700150 }
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530151
Juston Li6338a7812015-07-14 21:14:36 -0700152 } else {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530153
154 /* Do not wait when the Primary PLL is off or display control is already off.
155 This will prevent the software to wait forever. */
156 if ((FIELD_GET(PEEK32(CRT_PLL_CTRL), CRT_PLL_CTRL, POWER) ==
157 CRT_PLL_CTRL_POWER_OFF) ||
158 (FIELD_GET(PEEK32(CRT_DISPLAY_CTRL), CRT_DISPLAY_CTRL, TIMING) ==
Juston Li259fef32015-07-14 21:14:45 -0700159 CRT_DISPLAY_CTRL_TIMING_DISABLE)) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530160 return;
161 }
162
Juston Li259fef32015-07-14 21:14:45 -0700163 while (delay-- > 0) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530164 /* Wait for end of vsync. */
Juston Li259fef32015-07-14 21:14:45 -0700165 do {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530166 status = FIELD_GET(PEEK32(SYSTEM_CTRL),
167 SYSTEM_CTRL,
168 CRT_VSYNC);
Juston Licebafd82015-07-14 21:14:46 -0700169 } while (status == SYSTEM_CTRL_CRT_VSYNC_ACTIVE);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530170
171 /* Wait for start of vsync. */
Juston Li259fef32015-07-14 21:14:45 -0700172 do {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530173 status = FIELD_GET(PEEK32(SYSTEM_CTRL),
174 SYSTEM_CTRL,
175 CRT_VSYNC);
Juston Licebafd82015-07-14 21:14:46 -0700176 } while (status == SYSTEM_CTRL_CRT_VSYNC_INACTIVE);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530177 }
178 }
179}
180
Isaac Assegaida295042015-06-02 03:14:30 -0700181static void swPanelPowerSequence(int disp, int delay)
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530182{
183 unsigned int reg;
184
185 /* disp should be 1 to open sequence */
186 reg = PEEK32(PANEL_DISPLAY_CTRL);
Isaac Assegaida295042015-06-02 03:14:30 -0700187 reg = FIELD_VALUE(reg, PANEL_DISPLAY_CTRL, FPEN, disp);
188 POKE32(PANEL_DISPLAY_CTRL, reg);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530189 primaryWaitVerticalSync(delay);
190
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530191 reg = PEEK32(PANEL_DISPLAY_CTRL);
Isaac Assegaida295042015-06-02 03:14:30 -0700192 reg = FIELD_VALUE(reg, PANEL_DISPLAY_CTRL, DATA, disp);
193 POKE32(PANEL_DISPLAY_CTRL, reg);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530194 primaryWaitVerticalSync(delay);
195
196 reg = PEEK32(PANEL_DISPLAY_CTRL);
Isaac Assegaida295042015-06-02 03:14:30 -0700197 reg = FIELD_VALUE(reg, PANEL_DISPLAY_CTRL, VBIASEN, disp);
198 POKE32(PANEL_DISPLAY_CTRL, reg);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530199 primaryWaitVerticalSync(delay);
200
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530201 reg = PEEK32(PANEL_DISPLAY_CTRL);
Isaac Assegaida295042015-06-02 03:14:30 -0700202 reg = FIELD_VALUE(reg, PANEL_DISPLAY_CTRL, FPEN, disp);
203 POKE32(PANEL_DISPLAY_CTRL, reg);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530204 primaryWaitVerticalSync(delay);
205
206}
207
208void ddk750_setLogicalDispOut(disp_output_t output)
209{
210 unsigned int reg;
Juston Li40403c12015-07-14 21:14:48 -0700211
Juston Li8c11f5a2015-07-14 21:14:35 -0700212 if (output & PNL_2_USAGE) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530213 /* set panel path controller select */
214 reg = PEEK32(PANEL_DISPLAY_CTRL);
Isaac Assegaida295042015-06-02 03:14:30 -0700215 reg = FIELD_VALUE(reg, PANEL_DISPLAY_CTRL, SELECT, (output & PNL_2_MASK)>>PNL_2_OFFSET);
216 POKE32(PANEL_DISPLAY_CTRL, reg);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530217 }
218
Juston Li8c11f5a2015-07-14 21:14:35 -0700219 if (output & CRT_2_USAGE) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530220 /* set crt path controller select */
221 reg = PEEK32(CRT_DISPLAY_CTRL);
Isaac Assegaida295042015-06-02 03:14:30 -0700222 reg = FIELD_VALUE(reg, CRT_DISPLAY_CTRL, SELECT, (output & CRT_2_MASK)>>CRT_2_OFFSET);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530223 /*se blank off */
Isaac Assegaida295042015-06-02 03:14:30 -0700224 reg = FIELD_SET(reg, CRT_DISPLAY_CTRL, BLANK, OFF);
225 POKE32(CRT_DISPLAY_CTRL, reg);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530226
227 }
228
Juston Li8c11f5a2015-07-14 21:14:35 -0700229 if (output & PRI_TP_USAGE) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530230 /* set primary timing and plane en_bit */
Amitoj Kaur Chawlaaeec43d2015-10-10 02:21:30 +0530231 setDisplayControl(0, (output & PRI_TP_MASK) >> PRI_TP_OFFSET);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530232 }
233
Juston Li8c11f5a2015-07-14 21:14:35 -0700234 if (output & SEC_TP_USAGE) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530235 /* set secondary timing and plane en_bit*/
Amitoj Kaur Chawlaaeec43d2015-10-10 02:21:30 +0530236 setDisplayControl(1, (output & SEC_TP_MASK) >> SEC_TP_OFFSET);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530237 }
238
Juston Li8c11f5a2015-07-14 21:14:35 -0700239 if (output & PNL_SEQ_USAGE) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530240 /* set panel sequence */
Amitoj Kaur Chawlaaeec43d2015-10-10 02:21:30 +0530241 swPanelPowerSequence((output & PNL_SEQ_MASK) >> PNL_SEQ_OFFSET, 4);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530242 }
243
Juston Li9ccc5f42015-07-14 21:14:33 -0700244 if (output & DAC_USAGE)
Amitoj Kaur Chawlae80ef452015-10-10 02:20:36 +0530245 setDAC((output & DAC_MASK) >> DAC_OFFSET);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530246
Juston Li9ccc5f42015-07-14 21:14:33 -0700247 if (output & DPMS_USAGE)
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530248 ddk750_setDPMS((output & DPMS_MASK) >> DPMS_OFFSET);
249}