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(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, data: value); |
14 | } else { |
15 | value = peek32(SYSTEM_CTRL); |
16 | value = (value & ~SYSTEM_CTRL_DPMS_MASK) | state; |
17 | poke32(SYSTEM_CTRL, data: 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, data: 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, data: gate); |
79 | else |
80 | poke32(MODE0_GATE, data: 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 | } |
146 |