blob: 667e4f82254425b89503e194d0f807c13b030703 [file] [log] [blame]
Sudip Mukherjee81dee672015-03-03 16:21:06 +05301#include "ddk750_help.h"
2#include "ddk750_reg.h"
3#include "ddk750_power.h"
4
5void ddk750_setDPMS(DPMS_t state)
6{
7 unsigned int value;
Juston Li40403c12015-07-14 21:14:48 -07008
Juston Li8c11f5a2015-07-14 21:14:35 -07009 if (getChipType() == SM750LE) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +053010 value = PEEK32(CRT_DISPLAY_CTRL);
Antoine BLIN9a2c8742015-07-17 15:04:34 +020011 POKE32(CRT_DISPLAY_CTRL, FIELD_VALUE(value, CRT_DISPLAY_CTRL,
12 DPMS, state));
Juston Li6338a7812015-07-14 21:14:36 -070013 } else {
Sudip Mukherjee81dee672015-03-03 16:21:06 +053014 value = PEEK32(SYSTEM_CTRL);
Juston Li0d5e63c2015-07-14 21:14:41 -070015 value = FIELD_VALUE(value, SYSTEM_CTRL, DPMS, state);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053016 POKE32(SYSTEM_CTRL, value);
17 }
18}
19
Mike Rapoport228a4cf82015-09-30 08:24:58 +030020static unsigned int getPowerMode(void)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053021{
Juston Li9ccc5f42015-07-14 21:14:33 -070022 if (getChipType() == SM750LE)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053023 return 0;
Aaron Ouellette9d7a0ff2015-07-16 21:21:16 -040024 return FIELD_GET(PEEK32(POWER_MODE_CTRL), POWER_MODE_CTRL, MODE);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053025}
26
27
28/*
29 * SM50x can operate in one of three modes: 0, 1 or Sleep.
30 * On hardware reset, power mode 0 is default.
31 */
32void setPowerMode(unsigned int powerMode)
33{
Juston Li78376532015-07-14 21:14:30 -070034 unsigned int control_value = 0;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053035
Juston Li78376532015-07-14 21:14:30 -070036 control_value = PEEK32(POWER_MODE_CTRL);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053037
Juston Li9ccc5f42015-07-14 21:14:33 -070038 if (getChipType() == SM750LE)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053039 return;
40
Juston Li259fef32015-07-14 21:14:45 -070041 switch (powerMode) {
Juston Li78376532015-07-14 21:14:30 -070042 case POWER_MODE_CTRL_MODE_MODE0:
Antoine BLIN9a2c8742015-07-17 15:04:34 +020043 control_value = FIELD_SET(control_value, POWER_MODE_CTRL, MODE,
44 MODE0);
Juston Li78376532015-07-14 21:14:30 -070045 break;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053046
Juston Li78376532015-07-14 21:14:30 -070047 case POWER_MODE_CTRL_MODE_MODE1:
Antoine BLIN9a2c8742015-07-17 15:04:34 +020048 control_value = FIELD_SET(control_value, POWER_MODE_CTRL, MODE,
49 MODE1);
Juston Li78376532015-07-14 21:14:30 -070050 break;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053051
Juston Li78376532015-07-14 21:14:30 -070052 case POWER_MODE_CTRL_MODE_SLEEP:
Antoine BLIN9a2c8742015-07-17 15:04:34 +020053 control_value = FIELD_SET(control_value, POWER_MODE_CTRL, MODE,
54 SLEEP);
Juston Li78376532015-07-14 21:14:30 -070055 break;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053056
Juston Li78376532015-07-14 21:14:30 -070057 default:
58 break;
59 }
Sudip Mukherjee81dee672015-03-03 16:21:06 +053060
Juston Li78376532015-07-14 21:14:30 -070061 /* Set up other fields in Power Control Register */
Juston Li259fef32015-07-14 21:14:45 -070062 if (powerMode == POWER_MODE_CTRL_MODE_SLEEP) {
Juston Li78376532015-07-14 21:14:30 -070063 control_value =
Sudip Mukherjee81dee672015-03-03 16:21:06 +053064#ifdef VALIDATION_CHIP
Juston Li7f0ebcc2015-07-14 21:14:31 -070065 FIELD_SET(control_value, POWER_MODE_CTRL, 336CLK, OFF) |
Sudip Mukherjee81dee672015-03-03 16:21:06 +053066#endif
Juston Li7f0ebcc2015-07-14 21:14:31 -070067 FIELD_SET(control_value, POWER_MODE_CTRL, OSC_INPUT, OFF);
Juston Li259fef32015-07-14 21:14:45 -070068 } else {
Juston Li78376532015-07-14 21:14:30 -070069 control_value =
Sudip Mukherjee81dee672015-03-03 16:21:06 +053070#ifdef VALIDATION_CHIP
Juston Li7f0ebcc2015-07-14 21:14:31 -070071 FIELD_SET(control_value, POWER_MODE_CTRL, 336CLK, ON) |
Sudip Mukherjee81dee672015-03-03 16:21:06 +053072#endif
Juston Li7f0ebcc2015-07-14 21:14:31 -070073 FIELD_SET(control_value, POWER_MODE_CTRL, OSC_INPUT, ON);
Juston Li78376532015-07-14 21:14:30 -070074 }
Sudip Mukherjee81dee672015-03-03 16:21:06 +053075
Juston Li78376532015-07-14 21:14:30 -070076 /* Program new power mode. */
77 POKE32(POWER_MODE_CTRL, control_value);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053078}
79
80void setCurrentGate(unsigned int gate)
81{
Juston Li78376532015-07-14 21:14:30 -070082 unsigned int gate_reg;
83 unsigned int mode;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053084
Juston Li78376532015-07-14 21:14:30 -070085 /* Get current power mode. */
86 mode = getPowerMode();
Sudip Mukherjee81dee672015-03-03 16:21:06 +053087
Juston Li259fef32015-07-14 21:14:45 -070088 switch (mode) {
Juston Li78376532015-07-14 21:14:30 -070089 case POWER_MODE_CTRL_MODE_MODE0:
90 gate_reg = MODE0_GATE;
91 break;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053092
Juston Li78376532015-07-14 21:14:30 -070093 case POWER_MODE_CTRL_MODE_MODE1:
94 gate_reg = MODE1_GATE;
95 break;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053096
Juston Li78376532015-07-14 21:14:30 -070097 default:
98 gate_reg = MODE0_GATE;
99 break;
100 }
101 POKE32(gate_reg, gate);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530102}
103
104
105
106/*
107 * This function enable/disable the 2D engine.
108 */
109void enable2DEngine(unsigned int enable)
110{
Amitoj Kaur Chawlaf7415542015-10-18 21:27:57 +0530111 u32 gate;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530112
Juston Li78376532015-07-14 21:14:30 -0700113 gate = PEEK32(CURRENT_GATE);
Juston Li259fef32015-07-14 21:14:45 -0700114 if (enable) {
Juston Li78376532015-07-14 21:14:30 -0700115 gate = FIELD_SET(gate, CURRENT_GATE, DE, ON);
116 gate = FIELD_SET(gate, CURRENT_GATE, CSC, ON);
Juston Li259fef32015-07-14 21:14:45 -0700117 } else {
Juston Li78376532015-07-14 21:14:30 -0700118 gate = FIELD_SET(gate, CURRENT_GATE, DE, OFF);
119 gate = FIELD_SET(gate, CURRENT_GATE, CSC, OFF);
120 }
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530121
Juston Li78376532015-07-14 21:14:30 -0700122 setCurrentGate(gate);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530123}
124
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530125void enableDMA(unsigned int enable)
126{
Amitoj Kaur Chawlaf7415542015-10-18 21:27:57 +0530127 u32 gate;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530128
Juston Li78376532015-07-14 21:14:30 -0700129 /* Enable DMA Gate */
130 gate = PEEK32(CURRENT_GATE);
131 if (enable)
132 gate = FIELD_SET(gate, CURRENT_GATE, DMA, ON);
133 else
134 gate = FIELD_SET(gate, CURRENT_GATE, DMA, OFF);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530135
Juston Li78376532015-07-14 21:14:30 -0700136 setCurrentGate(gate);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530137}
138
139/*
140 * This function enable/disable the GPIO Engine
141 */
142void enableGPIO(unsigned int enable)
143{
Amitoj Kaur Chawlaf7415542015-10-18 21:27:57 +0530144 u32 gate;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530145
Juston Li78376532015-07-14 21:14:30 -0700146 /* Enable GPIO Gate */
147 gate = PEEK32(CURRENT_GATE);
148 if (enable)
149 gate = FIELD_SET(gate, CURRENT_GATE, GPIO, ON);
150 else
151 gate = FIELD_SET(gate, CURRENT_GATE, GPIO, OFF);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530152
Juston Li78376532015-07-14 21:14:30 -0700153 setCurrentGate(gate);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530154}
155
156/*
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530157 * This function enable/disable the I2C Engine
158 */
159void enableI2C(unsigned int enable)
160{
Amitoj Kaur Chawlaf7415542015-10-18 21:27:57 +0530161 u32 gate;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530162
Juston Li78376532015-07-14 21:14:30 -0700163 /* Enable I2C Gate */
164 gate = PEEK32(CURRENT_GATE);
165 if (enable)
166 gate = FIELD_SET(gate, CURRENT_GATE, I2C, ON);
167 else
168 gate = FIELD_SET(gate, CURRENT_GATE, I2C, OFF);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530169
Juston Li78376532015-07-14 21:14:30 -0700170 setCurrentGate(gate);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530171}
172
173