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