1// SPDX-License-Identifier: GPL-2.0
2#include "ddk750_chip.h"
3#include "ddk750_reg.h"
4#include "ddk750_power.h"
5
6void 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
21static 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 */
32void 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
75void 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 */
86void 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
99void 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 */
116void 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 */
133void 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

source code of linux/drivers/staging/sm750fb/ddk750_power.c