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