blob: 4023c476b9e439e96b9d2870a43b65050849d44f [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 */
Mike Rapoportb117b632016-02-10 18:34:06 +020012 unsigned long reg, val, reserved;
13 int cnt = 0;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053014
Juston Li259fef32015-07-14 21:14:45 -070015 if (!ctrl) {
Mike Rapoportb117b632016-02-10 18:34:06 +020016 reg = PANEL_DISPLAY_CTRL;
17 reserved = PANEL_DISPLAY_CTRL_RESERVED_MASK;
Juston Li259fef32015-07-14 21:14:45 -070018 } else {
Mike Rapoportb117b632016-02-10 18:34:06 +020019 reg = CRT_DISPLAY_CTRL;
20 reserved = CRT_DISPLAY_CTRL_RESERVED_MASK;
21 }
Sudip Mukherjee81dee672015-03-03 16:21:06 +053022
Mike Rapoportb117b632016-02-10 18:34:06 +020023 val = PEEK32(reg);
24 if (disp_state) {
25 /*
26 * Timing should be enabled first before enabling the
27 * plane because changing at the same time does not
28 * guarantee that the plane will also enabled or
29 * disabled.
30 */
Mike Rapoport6fba39c2016-02-10 18:34:08 +020031 val |= DISPLAY_CTRL_TIMING;
Mike Rapoportb117b632016-02-10 18:34:06 +020032 POKE32(reg, val);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053033
Mike Rapoport6fba39c2016-02-10 18:34:08 +020034 val |= DISPLAY_CTRL_PLANE;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053035
Mike Rapoportb117b632016-02-10 18:34:06 +020036 /*
37 * Somehow the register value on the plane is not set
38 * until a few delay. Need to write and read it a
39 * couple times
40 */
41 do {
42 cnt++;
43 POKE32(reg, val);
44 } while ((PEEK32(reg) & ~reserved) != (val & ~reserved));
45 pr_debug("Set Plane enbit:after tried %d times\n", cnt);
46 } else {
47 /*
48 * When turning off, there is no rule on the
49 * programming sequence since whenever the clock is
50 * off, then it does not matter whether the plane is
51 * enabled or disabled. Note: Modifying the plane bit
52 * will take effect on the next vertical sync. Need to
53 * find out if it is necessary to wait for 1 vsync
54 * before modifying the timing enable bit.
55 */
Mike Rapoport6fba39c2016-02-10 18:34:08 +020056 val &= ~DISPLAY_CTRL_PLANE;
Mike Rapoportb117b632016-02-10 18:34:06 +020057 POKE32(reg, val);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053058
Mike Rapoport6fba39c2016-02-10 18:34:08 +020059 val &= ~DISPLAY_CTRL_TIMING;
Mike Rapoportb117b632016-02-10 18:34:06 +020060 POKE32(reg, val);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053061 }
62}
63
Isaac Assegaida295042015-06-02 03:14:30 -070064static void waitNextVerticalSync(int ctrl, int delay)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053065{
66 unsigned int status;
Juston Li40403c12015-07-14 21:14:48 -070067
Juston Li8c11f5a2015-07-14 21:14:35 -070068 if (!ctrl) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +053069 /* primary controller */
70
yeongjun Kimc9d67dc2016-06-15 00:36:07 +090071 /*
72 * Do not wait when the Primary PLL is off or display control is
73 * already off. This will prevent the software to wait forever.
74 */
Mike Rapoport5557eb12016-02-10 18:33:57 +020075 if (!(PEEK32(PANEL_PLL_CTRL) & PLL_CTRL_POWER) ||
Mike Rapoport6fba39c2016-02-10 18:34:08 +020076 !(PEEK32(PANEL_DISPLAY_CTRL) & DISPLAY_CTRL_TIMING)) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +053077 return;
78 }
79
Juston Li259fef32015-07-14 21:14:45 -070080 while (delay-- > 0) {
Juston Li78376532015-07-14 21:14:30 -070081 /* Wait for end of vsync. */
Juston Li259fef32015-07-14 21:14:45 -070082 do {
Mike Rapoport410c7562016-01-17 20:04:18 +020083 status = PEEK32(SYSTEM_CTRL);
84 } while (status & SYSTEM_CTRL_PANEL_VSYNC_ACTIVE);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053085
Juston Li78376532015-07-14 21:14:30 -070086 /* Wait for start of vsync. */
Juston Li259fef32015-07-14 21:14:45 -070087 do {
Mike Rapoport410c7562016-01-17 20:04:18 +020088 status = PEEK32(SYSTEM_CTRL);
89 } while (!(status & SYSTEM_CTRL_PANEL_VSYNC_ACTIVE));
Juston Li78376532015-07-14 21:14:30 -070090 }
Sudip Mukherjee81dee672015-03-03 16:21:06 +053091
Juston Li6338a7812015-07-14 21:14:36 -070092 } else {
yeongjun Kimc9d67dc2016-06-15 00:36:07 +090093 /*
94 * Do not wait when the Primary PLL is off or display control is
95 * already off. This will prevent the software to wait forever.
96 */
Mike Rapoport5557eb12016-02-10 18:33:57 +020097 if (!(PEEK32(CRT_PLL_CTRL) & PLL_CTRL_POWER) ||
Mike Rapoport6fba39c2016-02-10 18:34:08 +020098 !(PEEK32(CRT_DISPLAY_CTRL) & DISPLAY_CTRL_TIMING)) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +053099 return;
100 }
101
Juston Li259fef32015-07-14 21:14:45 -0700102 while (delay-- > 0) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530103 /* Wait for end of vsync. */
Juston Li259fef32015-07-14 21:14:45 -0700104 do {
Mike Rapoport410c7562016-01-17 20:04:18 +0200105 status = PEEK32(SYSTEM_CTRL);
106 } while (status & SYSTEM_CTRL_PANEL_VSYNC_ACTIVE);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530107
108 /* Wait for start of vsync. */
Juston Li259fef32015-07-14 21:14:45 -0700109 do {
Mike Rapoport410c7562016-01-17 20:04:18 +0200110 status = PEEK32(SYSTEM_CTRL);
111 } while (!(status & SYSTEM_CTRL_PANEL_VSYNC_ACTIVE));
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530112 }
113 }
114}
115
Isaac Assegaida295042015-06-02 03:14:30 -0700116static void swPanelPowerSequence(int disp, int delay)
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530117{
118 unsigned int reg;
119
120 /* disp should be 1 to open sequence */
121 reg = PEEK32(PANEL_DISPLAY_CTRL);
Mike Rapoport6fba39c2016-02-10 18:34:08 +0200122 reg |= (disp ? PANEL_DISPLAY_CTRL_FPEN : 0);
Isaac Assegaida295042015-06-02 03:14:30 -0700123 POKE32(PANEL_DISPLAY_CTRL, reg);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530124 primaryWaitVerticalSync(delay);
125
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530126 reg = PEEK32(PANEL_DISPLAY_CTRL);
Mike Rapoport6fba39c2016-02-10 18:34:08 +0200127 reg |= (disp ? PANEL_DISPLAY_CTRL_DATA : 0);
Isaac Assegaida295042015-06-02 03:14:30 -0700128 POKE32(PANEL_DISPLAY_CTRL, reg);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530129 primaryWaitVerticalSync(delay);
130
131 reg = PEEK32(PANEL_DISPLAY_CTRL);
Mike Rapoport6fba39c2016-02-10 18:34:08 +0200132 reg |= (disp ? PANEL_DISPLAY_CTRL_VBIASEN : 0);
Isaac Assegaida295042015-06-02 03:14:30 -0700133 POKE32(PANEL_DISPLAY_CTRL, reg);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530134 primaryWaitVerticalSync(delay);
135
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530136 reg = PEEK32(PANEL_DISPLAY_CTRL);
Mike Rapoport6fba39c2016-02-10 18:34:08 +0200137 reg |= (disp ? PANEL_DISPLAY_CTRL_FPEN : 0);
Isaac Assegaida295042015-06-02 03:14:30 -0700138 POKE32(PANEL_DISPLAY_CTRL, reg);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530139 primaryWaitVerticalSync(delay);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530140}
141
142void ddk750_setLogicalDispOut(disp_output_t output)
143{
144 unsigned int reg;
Juston Li40403c12015-07-14 21:14:48 -0700145
Juston Li8c11f5a2015-07-14 21:14:35 -0700146 if (output & PNL_2_USAGE) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530147 /* set panel path controller select */
148 reg = PEEK32(PANEL_DISPLAY_CTRL);
Mike Rapoportc4e893b2016-02-10 18:34:10 +0200149 reg &= ~PANEL_DISPLAY_CTRL_SELECT_MASK;
150 reg |= (((output & PNL_2_MASK) >> PNL_2_OFFSET) <<
151 PANEL_DISPLAY_CTRL_SELECT_SHIFT);
Isaac Assegaida295042015-06-02 03:14:30 -0700152 POKE32(PANEL_DISPLAY_CTRL, reg);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530153 }
154
Juston Li8c11f5a2015-07-14 21:14:35 -0700155 if (output & CRT_2_USAGE) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530156 /* set crt path controller select */
157 reg = PEEK32(CRT_DISPLAY_CTRL);
Mike Rapoportcdce1f12016-02-10 18:34:19 +0200158 reg &= ~CRT_DISPLAY_CTRL_SELECT_MASK;
159 reg |= (((output & CRT_2_MASK) >> CRT_2_OFFSET) <<
160 CRT_DISPLAY_CTRL_SELECT_SHIFT);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530161 /*se blank off */
Mike Rapoportd8264ed2016-02-10 18:34:18 +0200162 reg &= ~CRT_DISPLAY_CTRL_BLANK;
Isaac Assegaida295042015-06-02 03:14:30 -0700163 POKE32(CRT_DISPLAY_CTRL, reg);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530164 }
165
Juston Li8c11f5a2015-07-14 21:14:35 -0700166 if (output & PRI_TP_USAGE) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530167 /* set primary timing and plane en_bit */
Amitoj Kaur Chawlaaeec43d2015-10-10 02:21:30 +0530168 setDisplayControl(0, (output & PRI_TP_MASK) >> PRI_TP_OFFSET);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530169 }
170
Juston Li8c11f5a2015-07-14 21:14:35 -0700171 if (output & SEC_TP_USAGE) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530172 /* set secondary timing and plane en_bit*/
Amitoj Kaur Chawlaaeec43d2015-10-10 02:21:30 +0530173 setDisplayControl(1, (output & SEC_TP_MASK) >> SEC_TP_OFFSET);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530174 }
175
Juston Li8c11f5a2015-07-14 21:14:35 -0700176 if (output & PNL_SEQ_USAGE) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530177 /* set panel sequence */
Amitoj Kaur Chawlaaeec43d2015-10-10 02:21:30 +0530178 swPanelPowerSequence((output & PNL_SEQ_MASK) >> PNL_SEQ_OFFSET, 4);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530179 }
180
Juston Li9ccc5f42015-07-14 21:14:33 -0700181 if (output & DAC_USAGE)
Amitoj Kaur Chawlae80ef452015-10-10 02:20:36 +0530182 setDAC((output & DAC_MASK) >> DAC_OFFSET);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530183
Juston Li9ccc5f42015-07-14 21:14:33 -0700184 if (output & DPMS_USAGE)
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530185 ddk750_setDPMS((output & DPMS_MASK) >> DPMS_OFFSET);
186}