1 #include "ddk750_chip.h" 2 #include "ddk750_reg.h" 3 #include "ddk750_power.h" 4 5 void ddk750_set_dpms(DPMS_t state) 6 { 7 unsigned int value; 8 9 if (sm750_get_chip_type() == SM750LE) { 10 value = peek32(CRT_DISPLAY_CTRL) & ~CRT_DISPLAY_CTRL_DPMS_MASK; 11 value |= (state << CRT_DISPLAY_CTRL_DPMS_SHIFT); 12 poke32(CRT_DISPLAY_CTRL, value); 13 } else { 14 value = peek32(SYSTEM_CTRL); 15 value = (value & ~SYSTEM_CTRL_DPMS_MASK) | state; 16 poke32(SYSTEM_CTRL, value); 17 } 18 } 19 20 static unsigned int get_power_mode(void) 21 { 22 if (sm750_get_chip_type() == SM750LE) 23 return 0; 24 return peek32(POWER_MODE_CTRL) & POWER_MODE_CTRL_MODE_MASK; 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 sm750_set_power_mode(unsigned int mode) 33 { 34 unsigned int ctrl = 0; 35 36 ctrl = peek32(POWER_MODE_CTRL) & ~POWER_MODE_CTRL_MODE_MASK; 37 38 if (sm750_get_chip_type() == SM750LE) 39 return; 40 41 switch (mode) { 42 case POWER_MODE_CTRL_MODE_MODE0: 43 ctrl |= POWER_MODE_CTRL_MODE_MODE0; 44 break; 45 46 case POWER_MODE_CTRL_MODE_MODE1: 47 ctrl |= POWER_MODE_CTRL_MODE_MODE1; 48 break; 49 50 case POWER_MODE_CTRL_MODE_SLEEP: 51 ctrl |= POWER_MODE_CTRL_MODE_SLEEP; 52 break; 53 54 default: 55 break; 56 } 57 58 /* Set up other fields in Power Control Register */ 59 if (mode == POWER_MODE_CTRL_MODE_SLEEP) { 60 ctrl &= ~POWER_MODE_CTRL_OSC_INPUT; 61 #ifdef VALIDATION_CHIP 62 ctrl &= ~POWER_MODE_CTRL_336CLK; 63 #endif 64 } else { 65 ctrl |= POWER_MODE_CTRL_OSC_INPUT; 66 #ifdef VALIDATION_CHIP 67 ctrl |= POWER_MODE_CTRL_336CLK; 68 #endif 69 } 70 71 /* Program new power mode. */ 72 poke32(POWER_MODE_CTRL, ctrl); 73 } 74 75 void sm750_set_current_gate(unsigned int gate) 76 { 77 if (get_power_mode() == POWER_MODE_CTRL_MODE_MODE1) 78 poke32(MODE1_GATE, gate); 79 else 80 poke32(MODE0_GATE, gate); 81 } 82 83 84 85 /* 86 * This function enable/disable the 2D engine. 87 */ 88 void sm750_enable_2d_engine(unsigned int enable) 89 { 90 u32 gate; 91 92 gate = peek32(CURRENT_GATE); 93 if (enable) 94 gate |= (CURRENT_GATE_DE | CURRENT_GATE_CSC); 95 else 96 gate &= ~(CURRENT_GATE_DE | CURRENT_GATE_CSC); 97 98 sm750_set_current_gate(gate); 99 } 100 101 void sm750_enable_dma(unsigned int enable) 102 { 103 u32 gate; 104 105 /* Enable DMA Gate */ 106 gate = peek32(CURRENT_GATE); 107 if (enable) 108 gate |= CURRENT_GATE_DMA; 109 else 110 gate &= ~CURRENT_GATE_DMA; 111 112 sm750_set_current_gate(gate); 113 } 114 115 /* 116 * This function enable/disable the GPIO Engine 117 */ 118 void sm750_enable_gpio(unsigned int enable) 119 { 120 u32 gate; 121 122 /* Enable GPIO Gate */ 123 gate = peek32(CURRENT_GATE); 124 if (enable) 125 gate |= CURRENT_GATE_GPIO; 126 else 127 gate &= ~CURRENT_GATE_GPIO; 128 129 sm750_set_current_gate(gate); 130 } 131 132 /* 133 * This function enable/disable the I2C Engine 134 */ 135 void sm750_enable_i2c(unsigned int enable) 136 { 137 u32 gate; 138 139 /* Enable I2C Gate */ 140 gate = peek32(CURRENT_GATE); 141 if (enable) 142 gate |= CURRENT_GATE_I2C; 143 else 144 gate &= ~CURRENT_GATE_I2C; 145 146 sm750_set_current_gate(gate); 147 } 148 149 150