1 #include "ddk750_help.h" 2 #include "ddk750_reg.h" 3 #include "ddk750_power.h" 4 5 void ddk750_setDPMS(DPMS_t state) 6 { 7 unsigned int value; 8 9 if (getChipType() == SM750LE) { 10 value = PEEK32(CRT_DISPLAY_CTRL); 11 POKE32(CRT_DISPLAY_CTRL, FIELD_VALUE(value, CRT_DISPLAY_CTRL, 12 DPMS, state)); 13 } else { 14 value = PEEK32(SYSTEM_CTRL); 15 value = FIELD_VALUE(value, SYSTEM_CTRL, DPMS, state); 16 POKE32(SYSTEM_CTRL, value); 17 } 18 } 19 20 static unsigned int getPowerMode(void) 21 { 22 if (getChipType() == SM750LE) 23 return 0; 24 return FIELD_GET(PEEK32(POWER_MODE_CTRL), POWER_MODE_CTRL, MODE); 25 } 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 */ 32 void setPowerMode(unsigned int powerMode) 33 { 34 unsigned int control_value = 0; 35 36 control_value = PEEK32(POWER_MODE_CTRL); 37 38 if (getChipType() == SM750LE) 39 return; 40 41 switch (powerMode) { 42 case POWER_MODE_CTRL_MODE_MODE0: 43 control_value = FIELD_SET(control_value, POWER_MODE_CTRL, MODE, 44 MODE0); 45 break; 46 47 case POWER_MODE_CTRL_MODE_MODE1: 48 control_value = FIELD_SET(control_value, POWER_MODE_CTRL, MODE, 49 MODE1); 50 break; 51 52 case POWER_MODE_CTRL_MODE_SLEEP: 53 control_value = FIELD_SET(control_value, POWER_MODE_CTRL, MODE, 54 SLEEP); 55 break; 56 57 default: 58 break; 59 } 60 61 /* Set up other fields in Power Control Register */ 62 if (powerMode == POWER_MODE_CTRL_MODE_SLEEP) { 63 control_value = 64 #ifdef VALIDATION_CHIP 65 FIELD_SET(control_value, POWER_MODE_CTRL, 336CLK, OFF) | 66 #endif 67 FIELD_SET(control_value, POWER_MODE_CTRL, OSC_INPUT, OFF); 68 } else { 69 control_value = 70 #ifdef VALIDATION_CHIP 71 FIELD_SET(control_value, POWER_MODE_CTRL, 336CLK, ON) | 72 #endif 73 FIELD_SET(control_value, POWER_MODE_CTRL, OSC_INPUT, ON); 74 } 75 76 /* Program new power mode. */ 77 POKE32(POWER_MODE_CTRL, control_value); 78 } 79 80 void setCurrentGate(unsigned int gate) 81 { 82 unsigned int gate_reg; 83 unsigned int mode; 84 85 /* Get current power mode. */ 86 mode = getPowerMode(); 87 88 switch (mode) { 89 case POWER_MODE_CTRL_MODE_MODE0: 90 gate_reg = MODE0_GATE; 91 break; 92 93 case POWER_MODE_CTRL_MODE_MODE1: 94 gate_reg = MODE1_GATE; 95 break; 96 97 default: 98 gate_reg = MODE0_GATE; 99 break; 100 } 101 POKE32(gate_reg, gate); 102 } 103 104 105 106 /* 107 * This function enable/disable the 2D engine. 108 */ 109 void enable2DEngine(unsigned int enable) 110 { 111 u32 gate; 112 113 gate = PEEK32(CURRENT_GATE); 114 if (enable) { 115 gate = FIELD_SET(gate, CURRENT_GATE, DE, ON); 116 gate = FIELD_SET(gate, CURRENT_GATE, CSC, ON); 117 } else { 118 gate = FIELD_SET(gate, CURRENT_GATE, DE, OFF); 119 gate = FIELD_SET(gate, CURRENT_GATE, CSC, OFF); 120 } 121 122 setCurrentGate(gate); 123 } 124 125 void enableDMA(unsigned int enable) 126 { 127 u32 gate; 128 129 /* 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); 135 136 setCurrentGate(gate); 137 } 138 139 /* 140 * This function enable/disable the GPIO Engine 141 */ 142 void enableGPIO(unsigned int enable) 143 { 144 u32 gate; 145 146 /* 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); 152 153 setCurrentGate(gate); 154 } 155 156 /* 157 * This function enable/disable the I2C Engine 158 */ 159 void enableI2C(unsigned int enable) 160 { 161 u32 gate; 162 163 /* 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); 169 170 setCurrentGate(gate); 171 } 172 173 174