1 // SPDX-License-Identifier: GPL-2.0 2 #include "ddk750_chip.h" 3 #include "ddk750_reg.h" 4 #include "ddk750_power.h" 5 ddk750_set_dpms(enum dpms state)6void ddk750_set_dpms(enum dpms state) 7 { 8 unsigned int value; 9 10 if (sm750_get_chip_type() == SM750LE) { 11 value = peek32(CRT_DISPLAY_CTRL) & ~CRT_DISPLAY_CTRL_DPMS_MASK; 12 value |= (state << CRT_DISPLAY_CTRL_DPMS_SHIFT); 13 poke32(CRT_DISPLAY_CTRL, value); 14 } else { 15 value = peek32(SYSTEM_CTRL); 16 value = (value & ~SYSTEM_CTRL_DPMS_MASK) | state; 17 poke32(SYSTEM_CTRL, value); 18 } 19 } 20 get_power_mode(void)21static unsigned int get_power_mode(void) 22 { 23 if (sm750_get_chip_type() == SM750LE) 24 return 0; 25 return peek32(POWER_MODE_CTRL) & POWER_MODE_CTRL_MODE_MASK; 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 */ sm750_set_power_mode(unsigned int mode)32void 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 sm750_set_current_gate(unsigned int gate)75void 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 * This function enable/disable the 2D engine. 85 */ sm750_enable_2d_engine(unsigned int enable)86void sm750_enable_2d_engine(unsigned int enable) 87 { 88 u32 gate; 89 90 gate = peek32(CURRENT_GATE); 91 if (enable) 92 gate |= (CURRENT_GATE_DE | CURRENT_GATE_CSC); 93 else 94 gate &= ~(CURRENT_GATE_DE | CURRENT_GATE_CSC); 95 96 sm750_set_current_gate(gate); 97 } 98 sm750_enable_dma(unsigned int enable)99void sm750_enable_dma(unsigned int enable) 100 { 101 u32 gate; 102 103 /* Enable DMA Gate */ 104 gate = peek32(CURRENT_GATE); 105 if (enable) 106 gate |= CURRENT_GATE_DMA; 107 else 108 gate &= ~CURRENT_GATE_DMA; 109 110 sm750_set_current_gate(gate); 111 } 112 113 /* 114 * This function enable/disable the GPIO Engine 115 */ sm750_enable_gpio(unsigned int enable)116void sm750_enable_gpio(unsigned int enable) 117 { 118 u32 gate; 119 120 /* Enable GPIO Gate */ 121 gate = peek32(CURRENT_GATE); 122 if (enable) 123 gate |= CURRENT_GATE_GPIO; 124 else 125 gate &= ~CURRENT_GATE_GPIO; 126 127 sm750_set_current_gate(gate); 128 } 129 130 /* 131 * This function enable/disable the I2C Engine 132 */ sm750_enable_i2c(unsigned int enable)133void sm750_enable_i2c(unsigned int enable) 134 { 135 u32 gate; 136 137 /* Enable I2C Gate */ 138 gate = peek32(CURRENT_GATE); 139 if (enable) 140 gate |= CURRENT_GATE_I2C; 141 else 142 gate &= ~CURRENT_GATE_I2C; 143 144 sm750_set_current_gate(gate); 145 } 146