xref: /openbmc/u-boot/board/micronas/vct/dcgu.c (revision 3ba98ed8)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2009 Stefan Roese <sr@denx.de>, DENX Software Engineering
4  *
5  * Original Author Guenter Gebhardt
6  * Copyright (C) 2006 Micronas GmbH
7  */
8 
9 #include <common.h>
10 #include <linux/errno.h>
11 
12 #include "vct.h"
13 
14 int dcgu_set_clk_switch(enum dcgu_hw_module module, enum dcgu_switch setup)
15 {
16 	u32 enable;
17 	union dcgu_clk_en1 en1;
18 	union dcgu_clk_en2 en2;
19 
20 	switch (setup) {
21 	case DCGU_SWITCH_ON:
22 		enable = 1;
23 		break;
24 	case DCGU_SWITCH_OFF:
25 		enable = 0;
26 		break;
27 	default:
28 		printf("%s:%i:Invalid clock switch: %i\n", __FILE__, __LINE__,
29 		       setup);
30 		return -EINVAL;
31 	}
32 
33 	if (module == DCGU_HW_MODULE_CPU)
34 		en2.reg = reg_read(DCGU_CLK_EN2(DCGU_BASE));
35 	else
36 		en1.reg = reg_read(DCGU_CLK_EN1(DCGU_BASE));
37 
38 	switch (module) {
39 	case DCGU_HW_MODULE_MSMC:
40 		en1.bits.en_clkmsmc = enable;
41 		break;
42 	case DCGU_HW_MODULE_SSI_S:
43 		en1.bits.en_clkssi_s = enable;
44 		break;
45 	case DCGU_HW_MODULE_SSI_M:
46 		en1.bits.en_clkssi_m = enable;
47 		break;
48 	case DCGU_HW_MODULE_SMC:
49 		en1.bits.en_clksmc = enable;
50 		break;
51 	case DCGU_HW_MODULE_EBI:
52 		en1.bits.en_clkebi = enable;
53 		break;
54 	case DCGU_HW_MODULE_USB_PLL:
55 		en1.bits.en_usbpll = enable;
56 		break;
57 	case DCGU_HW_MODULE_USB_60:
58 		en1.bits.en_clkusb60 = enable;
59 		break;
60 	case DCGU_HW_MODULE_USB_24:
61 		en1.bits.en_clkusb24 = enable;
62 		break;
63 	case DCGU_HW_MODULE_UART_2:
64 		en1.bits.en_clkuart2 = enable;
65 		break;
66 	case DCGU_HW_MODULE_UART_1:
67 		en1.bits.en_clkuart1 = enable;
68 		break;
69 	case DCGU_HW_MODULE_PERI:
70 		en1.bits.en_clkperi20 = enable;
71 		break;
72 	case DCGU_HW_MODULE_CPU:
73 		en2.bits.en_clkcpu = enable;
74 		break;
75 	case DCGU_HW_MODULE_I2S:
76 		en1.bits.en_clk_i2s_dly = enable;
77 		break;
78 	case DCGU_HW_MODULE_ABP_SCC:
79 		en1.bits.en_clk_scc_abp = enable;
80 		break;
81 	case DCGU_HW_MODULE_SPDIF:
82 		en1.bits.en_clk_dtv_spdo = enable;
83 		break;
84 	case DCGU_HW_MODULE_AD:
85 		en1.bits.en_clkad = enable;
86 		break;
87 	case DCGU_HW_MODULE_MVD:
88 		en1.bits.en_clkmvd = enable;
89 		break;
90 	case DCGU_HW_MODULE_TSD:
91 		en1.bits.en_clktsd = enable;
92 		break;
93 	case DCGU_HW_MODULE_GA:
94 		en1.bits.en_clkga = enable;
95 		break;
96 	case DCGU_HW_MODULE_DVP:
97 		en1.bits.en_clkdvp = enable;
98 		break;
99 	case DCGU_HW_MODULE_MR2:
100 		en1.bits.en_clkmr2 = enable;
101 		break;
102 	case DCGU_HW_MODULE_MR1:
103 		en1.bits.en_clkmr1 = enable;
104 		break;
105 	default:
106 		printf("%s:%i:Invalid hardware module: %i\n", __FILE__,
107 		       __LINE__, module);
108 		return -EINVAL;
109 	}
110 
111 	/*
112 	 * The reg_read() following the reg_write() below forces the write to
113 	 * be really done on the bus.
114 	 * Otherwise the clock may not be switched on when this API function
115 	 * returns, which may cause an bus error if a registers of the hardware
116 	 * module connected to the clock is accessed.
117 	 */
118 	if (module == DCGU_HW_MODULE_CPU) {
119 		reg_write(DCGU_CLK_EN2(DCGU_BASE), en2.reg);
120 		en2.reg = reg_read(DCGU_CLK_EN2(DCGU_BASE));
121 	} else {
122 		reg_write(DCGU_CLK_EN1(DCGU_BASE), en1.reg);
123 		en1.reg = reg_read(DCGU_CLK_EN1(DCGU_BASE));
124 	}
125 
126 	return 0;
127 }
128 
129 int dcgu_set_reset_switch(enum dcgu_hw_module module, enum dcgu_switch setup)
130 {
131 	union dcgu_reset_unit1 val;
132 	u32 enable;
133 
134 	switch (setup) {
135 	case DCGU_SWITCH_ON:
136 		enable = 1;
137 		break;
138 	case DCGU_SWITCH_OFF:
139 		enable = 0;
140 		break;
141 	default:
142 		printf("%s:%i:Invalid reset switch: %i\n", __FILE__, __LINE__,
143 		       setup);
144 		return -EINVAL;
145 	}
146 
147 	val.reg = reg_read(DCGU_RESET_UNIT1(DCGU_BASE));
148 	switch (module) {
149 	case DCGU_HW_MODULE_MSMC:
150 		val.bits.swreset_clkmsmc = enable;
151 		break;
152 	case DCGU_HW_MODULE_SSI_S:
153 		val.bits.swreset_clkssi_s = enable;
154 		break;
155 	case DCGU_HW_MODULE_SSI_M:
156 		val.bits.swreset_clkssi_m = enable;
157 		break;
158 	case DCGU_HW_MODULE_SMC:
159 		val.bits.swreset_clksmc = enable;
160 		break;
161 	case DCGU_HW_MODULE_EBI:
162 		val.bits.swreset_clkebi = enable;
163 		break;
164 	case DCGU_HW_MODULE_USB_60:
165 		val.bits.swreset_clkusb60 = enable;
166 		break;
167 	case DCGU_HW_MODULE_USB_24:
168 		val.bits.swreset_clkusb24 = enable;
169 		break;
170 	case DCGU_HW_MODULE_UART_2:
171 		val.bits.swreset_clkuart2 = enable;
172 		break;
173 	case DCGU_HW_MODULE_UART_1:
174 		val.bits.swreset_clkuart1 = enable;
175 		break;
176 	case DCGU_HW_MODULE_PWM:
177 		val.bits.swreset_pwm = enable;
178 		break;
179 	case DCGU_HW_MODULE_GPT:
180 		val.bits.swreset_gpt = enable;
181 		break;
182 	case DCGU_HW_MODULE_I2C2:
183 		val.bits.swreset_i2c2 = enable;
184 		break;
185 	case DCGU_HW_MODULE_I2C1:
186 		val.bits.swreset_i2c1 = enable;
187 		break;
188 	case DCGU_HW_MODULE_GPIO2:
189 		val.bits.swreset_gpio2 = enable;
190 		break;
191 	case DCGU_HW_MODULE_GPIO1:
192 		val.bits.swreset_gpio1 = enable;
193 		break;
194 	case DCGU_HW_MODULE_CPU:
195 		val.bits.swreset_clkcpu = enable;
196 		break;
197 	case DCGU_HW_MODULE_I2S:
198 		val.bits.swreset_clk_i2s_dly = enable;
199 		break;
200 	case DCGU_HW_MODULE_ABP_SCC:
201 		val.bits.swreset_clk_scc_abp = enable;
202 		break;
203 	case DCGU_HW_MODULE_SPDIF:
204 		val.bits.swreset_clk_dtv_spdo = enable;
205 		break;
206 	case DCGU_HW_MODULE_AD:
207 		val.bits.swreset_clkad = enable;
208 		break;
209 	case DCGU_HW_MODULE_MVD:
210 		val.bits.swreset_clkmvd = enable;
211 		break;
212 	case DCGU_HW_MODULE_TSD:
213 		val.bits.swreset_clktsd = enable;
214 		break;
215 	case DCGU_HW_MODULE_TSIO:
216 		val.bits.swreset_clktsio = enable;
217 		break;
218 	case DCGU_HW_MODULE_GA:
219 		val.bits.swreset_clkga = enable;
220 		break;
221 	case DCGU_HW_MODULE_MPC:
222 		val.bits.swreset_clkmpc = enable;
223 		break;
224 	case DCGU_HW_MODULE_CVE:
225 		val.bits.swreset_clkcve = enable;
226 		break;
227 	case DCGU_HW_MODULE_DVP:
228 		val.bits.swreset_clkdvp = enable;
229 		break;
230 	case DCGU_HW_MODULE_MR2:
231 		val.bits.swreset_clkmr2 = enable;
232 		break;
233 	case DCGU_HW_MODULE_MR1:
234 		val.bits.swreset_clkmr1 = enable;
235 		break;
236 	default:
237 		printf("%s:%i:Invalid hardware module: %i\n", __FILE__,
238 		       __LINE__, module);
239 		return -EINVAL;
240 	}
241 	reg_write(DCGU_RESET_UNIT1(DCGU_BASE), val.reg);
242 
243 	return 0;
244 }
245