1// SPDX-License-Identifier: GPL-2.0 2#include "ddk750_chip.h" 3#include "ddk750_reg.h" 4#include "ddk750_power.h" 5 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 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 */ 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 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 */ 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 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 */ 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 */ 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