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 * SM50x can operate in one of three modes: 0, 1 or Sleep. 29 * On hardware reset, power mode 0 is default. 30 */ 31 void sm750_set_power_mode(unsigned int mode) 32 { 33 unsigned int ctrl = 0; 34 35 ctrl = peek32(POWER_MODE_CTRL) & ~POWER_MODE_CTRL_MODE_MASK; 36 37 if (sm750_get_chip_type() == SM750LE) 38 return; 39 40 switch (mode) { 41 case POWER_MODE_CTRL_MODE_MODE0: 42 ctrl |= POWER_MODE_CTRL_MODE_MODE0; 43 break; 44 45 case POWER_MODE_CTRL_MODE_MODE1: 46 ctrl |= POWER_MODE_CTRL_MODE_MODE1; 47 break; 48 49 case POWER_MODE_CTRL_MODE_SLEEP: 50 ctrl |= POWER_MODE_CTRL_MODE_SLEEP; 51 break; 52 53 default: 54 break; 55 } 56 57 /* Set up other fields in Power Control Register */ 58 if (mode == POWER_MODE_CTRL_MODE_SLEEP) { 59 ctrl &= ~POWER_MODE_CTRL_OSC_INPUT; 60 #ifdef VALIDATION_CHIP 61 ctrl &= ~POWER_MODE_CTRL_336CLK; 62 #endif 63 } else { 64 ctrl |= POWER_MODE_CTRL_OSC_INPUT; 65 #ifdef VALIDATION_CHIP 66 ctrl |= POWER_MODE_CTRL_336CLK; 67 #endif 68 } 69 70 /* Program new power mode. */ 71 poke32(POWER_MODE_CTRL, ctrl); 72 } 73 74 void sm750_set_current_gate(unsigned int gate) 75 { 76 if (get_power_mode() == POWER_MODE_CTRL_MODE_MODE1) 77 poke32(MODE1_GATE, gate); 78 else 79 poke32(MODE0_GATE, gate); 80 } 81 82 /* 83 * This function enable/disable the 2D engine. 84 */ 85 void sm750_enable_2d_engine(unsigned int enable) 86 { 87 u32 gate; 88 89 gate = peek32(CURRENT_GATE); 90 if (enable) 91 gate |= (CURRENT_GATE_DE | CURRENT_GATE_CSC); 92 else 93 gate &= ~(CURRENT_GATE_DE | CURRENT_GATE_CSC); 94 95 sm750_set_current_gate(gate); 96 } 97 98 void sm750_enable_dma(unsigned int enable) 99 { 100 u32 gate; 101 102 /* Enable DMA Gate */ 103 gate = peek32(CURRENT_GATE); 104 if (enable) 105 gate |= CURRENT_GATE_DMA; 106 else 107 gate &= ~CURRENT_GATE_DMA; 108 109 sm750_set_current_gate(gate); 110 } 111 112 /* 113 * This function enable/disable the GPIO Engine 114 */ 115 void sm750_enable_gpio(unsigned int enable) 116 { 117 u32 gate; 118 119 /* Enable GPIO Gate */ 120 gate = peek32(CURRENT_GATE); 121 if (enable) 122 gate |= CURRENT_GATE_GPIO; 123 else 124 gate &= ~CURRENT_GATE_GPIO; 125 126 sm750_set_current_gate(gate); 127 } 128 129 /* 130 * This function enable/disable the I2C Engine 131 */ 132 void sm750_enable_i2c(unsigned int enable) 133 { 134 u32 gate; 135 136 /* Enable I2C Gate */ 137 gate = peek32(CURRENT_GATE); 138 if (enable) 139 gate |= CURRENT_GATE_I2C; 140 else 141 gate &= ~CURRENT_GATE_I2C; 142 143 sm750_set_current_gate(gate); 144 } 145