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