Merge tag 'for-v4.12-2' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux...
[sfrench/cifs-2.6.git] / drivers / staging / sm750fb / ddk750_power.c
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 }