Merge remote-tracking branch 'spi/topic/core' into spi-next
[sfrench/cifs-2.6.git] / drivers / staging / sm750fb / ddk750_power.c
1 // SPDX-License-Identifier: GPL-2.0
2 #include "ddk750_chip.h"
3 #include "ddk750_reg.h"
4 #include "ddk750_power.h"
5
6 void ddk750_set_dpms(DPMS_t 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
21 static 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  */
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  * This function enable/disable the 2D engine.
85  */
86 void 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
99 void 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  */
116 void 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  */
133 void 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 }