1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2016 Nexell
4  * Youngbok, Park <ybpark@nexell.co.kr>
5  */
6 
7 /*
8  * FIXME : will be remove after support pinctrl
9  */
10 #include <linux/types.h>
11 #include <asm/io.h>
12 #include <asm/arch/nexell.h>
13 #include "asm/arch/nx_gpio.h"
14 #define NUMBER_OF_GPIO_MODULE 5
15 u32 __g_nx_gpio_valid_bit[NUMBER_OF_GPIO_MODULE] = {
16 	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
17 
18 static struct {
19 	struct nx_gpio_register_set *pregister;
20 } __g_module_variables[NUMBER_OF_GPIO_MODULE] = {
21 	{ (struct nx_gpio_register_set *)PHY_BASEADDR_GPIOA },
22 	{ (struct nx_gpio_register_set *)PHY_BASEADDR_GPIOB },
23 	{ (struct nx_gpio_register_set *)PHY_BASEADDR_GPIOC },
24 	{ (struct nx_gpio_register_set *)PHY_BASEADDR_GPIOD },
25 	{ (struct nx_gpio_register_set *)PHY_BASEADDR_GPIOE },
26 };
27 
28 enum { nx_gpio_max_bit = 32 };
29 
nx_gpio_set_bit(u32 * value,u32 bit,int enable)30 void nx_gpio_set_bit(u32 *value, u32 bit, int enable)
31 {
32 	register u32 newvalue;
33 
34 	newvalue = *value;
35 	newvalue &= ~(1ul << bit);
36 	newvalue |= (u32)enable << bit;
37 	writel(newvalue, value);
38 }
39 
nx_gpio_get_bit(u32 value,u32 bit)40 int nx_gpio_get_bit(u32 value, u32 bit)
41 {
42 	return (int)((value >> bit) & (1ul));
43 }
44 
nx_gpio_set_bit2(u32 * value,u32 bit,u32 bit_value)45 void nx_gpio_set_bit2(u32 *value, u32 bit, u32 bit_value)
46 {
47 	register u32 newvalue = *value;
48 
49 	newvalue = (u32)(newvalue & ~(3ul << (bit * 2)));
50 	newvalue = (u32)(newvalue | (bit_value << (bit * 2)));
51 
52 	writel(newvalue, value);
53 }
54 
nx_gpio_get_bit2(u32 value,u32 bit)55 u32 nx_gpio_get_bit2(u32 value, u32 bit)
56 {
57 	return (u32)((u32)(value >> (bit * 2)) & 3ul);
58 }
59 
nx_gpio_initialize(void)60 int nx_gpio_initialize(void)
61 {
62 	static int binit;
63 	u32 i;
64 
65 	binit = 0;
66 
67 	if (binit == 0) {
68 		for (i = 0; i < NUMBER_OF_GPIO_MODULE; i++)
69 			__g_module_variables[i].pregister = NULL;
70 		binit = true;
71 	}
72 	for (i = 0; i < NUMBER_OF_GPIO_MODULE; i++) {
73 		__g_nx_gpio_valid_bit[i] = 0xFFFFFFFF;
74 	};
75 	return true;
76 }
77 
nx_gpio_get_number_of_module(void)78 u32 nx_gpio_get_number_of_module(void)
79 {
80 	return NUMBER_OF_GPIO_MODULE;
81 }
82 
nx_gpio_get_size_of_register_set(void)83 u32 nx_gpio_get_size_of_register_set(void)
84 {
85 	return sizeof(struct nx_gpio_register_set);
86 }
87 
nx_gpio_set_base_address(u32 module_index,void * base_address)88 void nx_gpio_set_base_address(u32 module_index, void *base_address)
89 {
90 	__g_module_variables[module_index].pregister =
91 		(struct nx_gpio_register_set *)base_address;
92 }
93 
nx_gpio_get_base_address(u32 module_index)94 void *nx_gpio_get_base_address(u32 module_index)
95 {
96 	return (void *)__g_module_variables[module_index].pregister;
97 }
98 
nx_gpio_open_module(u32 module_index)99 int nx_gpio_open_module(u32 module_index)
100 {
101 	register struct nx_gpio_register_set *pregister;
102 
103 	pregister = __g_module_variables[module_index].pregister;
104 	writel(0xFFFFFFFF, &pregister->gpiox_slew_disable_default);
105 	writel(0xFFFFFFFF, &pregister->gpiox_drv1_disable_default);
106 	writel(0xFFFFFFFF, &pregister->gpiox_drv0_disable_default);
107 	writel(0xFFFFFFFF, &pregister->gpiox_pullsel_disable_default);
108 	writel(0xFFFFFFFF, &pregister->gpiox_pullenb_disable_default);
109 	return true;
110 }
111 
nx_gpio_close_module(u32 module_index)112 int nx_gpio_close_module(u32 module_index) { return true; }
113 
nx_gpio_check_busy(u32 module_index)114 int nx_gpio_check_busy(u32 module_index) { return false; }
115 
nx_gpio_set_pad_function(u32 module_index,u32 bit_number,u32 padfunc)116 void nx_gpio_set_pad_function(u32 module_index, u32 bit_number,
117 			      u32 padfunc)
118 {
119 	register struct nx_gpio_register_set *pregister;
120 
121 	pregister = __g_module_variables[module_index].pregister;
122 	nx_gpio_set_bit2(&pregister->gpioxaltfn[bit_number / 16],
123 			 bit_number % 16, padfunc);
124 }
125 
nx_gpio_set_pad_function32(u32 module_index,u32 msbvalue,u32 lsbvalue)126 void nx_gpio_set_pad_function32(u32 module_index, u32 msbvalue, u32 lsbvalue)
127 {
128 	register struct nx_gpio_register_set *pregister;
129 
130 	pregister = __g_module_variables[module_index].pregister;
131 	writel(lsbvalue, &pregister->gpioxaltfn[0]);
132 	writel(msbvalue, &pregister->gpioxaltfn[1]);
133 }
134 
nx_gpio_get_pad_function(u32 module_index,u32 bit_number)135 int nx_gpio_get_pad_function(u32 module_index, u32 bit_number)
136 {
137 	register struct nx_gpio_register_set *pregister;
138 
139 	pregister = __g_module_variables[module_index].pregister;
140 	return (int)nx_gpio_get_bit2
141 		(readl(&pregister->gpioxaltfn[bit_number / 16]),
142 		 bit_number % 16);
143 }
144 
nx_gpio_set_output_enable(u32 module_index,u32 bit_number,int output_enb)145 void nx_gpio_set_output_enable(u32 module_index, u32 bit_number,
146 			       int output_enb)
147 {
148 	register struct nx_gpio_register_set *pregister;
149 
150 	pregister = __g_module_variables[module_index].pregister;
151 	nx_gpio_set_bit(&pregister->gpioxoutenb, bit_number, output_enb);
152 }
153 
nx_gpio_get_detect_enable(u32 module_index,u32 bit_number)154 int nx_gpio_get_detect_enable(u32 module_index, u32 bit_number)
155 {
156 	register struct nx_gpio_register_set *pregister;
157 
158 	pregister = __g_module_variables[module_index].pregister;
159 	return nx_gpio_get_bit(readl(&pregister->gpioxdetenb), bit_number);
160 }
161 
nx_gpio_get_detect_enable32(u32 module_index)162 u32 nx_gpio_get_detect_enable32(u32 module_index)
163 {
164 	register struct nx_gpio_register_set *pregister;
165 
166 	pregister = __g_module_variables[module_index].pregister;
167 	return readl(&pregister->gpioxdetenb);
168 }
169 
nx_gpio_set_detect_enable(u32 module_index,u32 bit_number,int detect_enb)170 void nx_gpio_set_detect_enable(u32 module_index, u32 bit_number,
171 			       int detect_enb)
172 {
173 	register struct nx_gpio_register_set *pregister;
174 
175 	pregister = __g_module_variables[module_index].pregister;
176 	nx_gpio_set_bit(&pregister->gpioxdetenb, bit_number, detect_enb);
177 }
178 
nx_gpio_set_detect_enable32(u32 module_index,u32 enable_flag)179 void nx_gpio_set_detect_enable32(u32 module_index, u32 enable_flag)
180 {
181 	register struct nx_gpio_register_set *pregister;
182 
183 	pregister = __g_module_variables[module_index].pregister;
184 	writel(enable_flag, &pregister->gpioxdetenb);
185 }
186 
nx_gpio_get_output_enable(u32 module_index,u32 bit_number)187 int nx_gpio_get_output_enable(u32 module_index, u32 bit_number)
188 {
189 	register struct nx_gpio_register_set *pregister;
190 
191 	pregister = __g_module_variables[module_index].pregister;
192 	return nx_gpio_get_bit(readl(&pregister->gpioxoutenb), bit_number);
193 }
194 
nx_gpio_set_output_enable32(u32 module_index,int output_enb)195 void nx_gpio_set_output_enable32(u32 module_index, int output_enb)
196 {
197 	register struct nx_gpio_register_set *pregister;
198 
199 	pregister = __g_module_variables[module_index].pregister;
200 	if (output_enb)
201 		writel(0xFFFFFFFF, &pregister->gpioxoutenb);
202 	else
203 		writel(0x0, &pregister->gpioxoutenb);
204 }
205 
nx_gpio_get_output_enable32(u32 module_index)206 u32 nx_gpio_get_output_enable32(u32 module_index)
207 {
208 	register struct nx_gpio_register_set *pregister;
209 
210 	pregister = __g_module_variables[module_index].pregister;
211 	return readl(&pregister->gpioxoutenb);
212 }
213 
nx_gpio_set_output_value(u32 module_index,u32 bit_number,int value)214 void nx_gpio_set_output_value(u32 module_index, u32 bit_number, int value)
215 {
216 	register struct nx_gpio_register_set *pregister;
217 
218 	pregister = __g_module_variables[module_index].pregister;
219 	nx_gpio_set_bit(&pregister->gpioxout, bit_number, value);
220 }
221 
nx_gpio_get_output_value(u32 module_index,u32 bit_number)222 int nx_gpio_get_output_value(u32 module_index, u32 bit_number)
223 {
224 	register struct nx_gpio_register_set *pregister;
225 
226 	pregister = __g_module_variables[module_index].pregister;
227 	return nx_gpio_get_bit(readl(&pregister->gpioxout), bit_number);
228 }
229 
nx_gpio_set_output_value32(u32 module_index,u32 value)230 void nx_gpio_set_output_value32(u32 module_index, u32 value)
231 {
232 	register struct nx_gpio_register_set *pregister;
233 
234 	pregister = __g_module_variables[module_index].pregister;
235 	writel(value, &pregister->gpioxout);
236 }
237 
nx_gpio_get_output_value32(u32 module_index)238 u32 nx_gpio_get_output_value32(u32 module_index)
239 {
240 	register struct nx_gpio_register_set *pregister;
241 
242 	pregister = __g_module_variables[module_index].pregister;
243 	return readl(&pregister->gpioxout);
244 }
245 
nx_gpio_get_input_value(u32 module_index,u32 bit_number)246 int nx_gpio_get_input_value(u32 module_index, u32 bit_number)
247 {
248 	register struct nx_gpio_register_set *pregister;
249 
250 	pregister = __g_module_variables[module_index].pregister;
251 	return nx_gpio_get_bit(readl(&pregister->gpioxpad), bit_number);
252 }
253 
nx_gpio_set_pull_select(u32 module_index,u32 bit_number,int enable)254 void nx_gpio_set_pull_select(u32 module_index, u32 bit_number, int enable)
255 {
256 	nx_gpio_set_bit(&__g_module_variables[module_index]
257 			.pregister->gpiox_pullsel_disable_default,
258 			bit_number, true);
259 	nx_gpio_set_bit
260 		(&__g_module_variables[module_index].pregister->gpiox_pullsel,
261 		 bit_number, enable);
262 }
263 
nx_gpio_set_pull_select32(u32 module_index,u32 value)264 void nx_gpio_set_pull_select32(u32 module_index, u32 value)
265 {
266 	writel(value,
267 	       &__g_module_variables[module_index].pregister->gpiox_pullsel);
268 }
269 
nx_gpio_get_pull_select(u32 module_index,u32 bit_number)270 int nx_gpio_get_pull_select(u32 module_index, u32 bit_number)
271 {
272 	return nx_gpio_get_bit
273 		(__g_module_variables[module_index].pregister->gpiox_pullsel,
274 		 bit_number);
275 }
276 
nx_gpio_get_pull_select32(u32 module_index)277 u32 nx_gpio_get_pull_select32(u32 module_index)
278 {
279 	return __g_module_variables[module_index].pregister->gpiox_pullsel;
280 }
281 
nx_gpio_set_pull_mode(u32 module_index,u32 bit_number,u32 mode)282 void nx_gpio_set_pull_mode(u32 module_index, u32 bit_number, u32 mode)
283 {
284 	nx_gpio_set_bit(&__g_module_variables[module_index]
285 			.pregister->gpiox_pullsel_disable_default,
286 			bit_number, true);
287 	nx_gpio_set_bit(&__g_module_variables[module_index]
288 			.pregister->gpiox_pullenb_disable_default,
289 			bit_number, true);
290 	if (mode == nx_gpio_pull_off) {
291 		nx_gpio_set_bit
292 		 (&__g_module_variables[module_index].pregister->gpiox_pullenb,
293 		 bit_number, false);
294 		nx_gpio_set_bit
295 		 (&__g_module_variables[module_index].pregister->gpiox_pullsel,
296 		 bit_number, false);
297 	} else {
298 		nx_gpio_set_bit
299 		 (&__g_module_variables[module_index].pregister->gpiox_pullsel,
300 		 bit_number, (mode & 1 ? true : false));
301 		nx_gpio_set_bit
302 		 (&__g_module_variables[module_index].pregister->gpiox_pullenb,
303 		 bit_number, true);
304 	}
305 }
306 
nx_gpio_set_fast_slew(u32 module_index,u32 bit_number,int enable)307 void nx_gpio_set_fast_slew(u32 module_index, u32 bit_number,
308 			   int enable)
309 {
310 	register struct nx_gpio_register_set *pregister;
311 
312 	pregister = __g_module_variables[module_index].pregister;
313 	nx_gpio_set_bit(&pregister->gpiox_slew, bit_number,
314 			(int)(!enable));
315 }
316 
nx_gpio_set_drive_strength(u32 module_index,u32 bit_number,u32 drvstrength)317 void nx_gpio_set_drive_strength(u32 module_index, u32 bit_number,
318 				u32 drvstrength)
319 {
320 	register struct nx_gpio_register_set *pregister;
321 
322 	pregister = __g_module_variables[module_index].pregister;
323 	nx_gpio_set_bit(&pregister->gpiox_drv1, bit_number,
324 			(int)(((u32)drvstrength >> 0) & 0x1));
325 	nx_gpio_set_bit(&pregister->gpiox_drv0, bit_number,
326 			(int)(((u32)drvstrength >> 1) & 0x1));
327 }
328 
nx_gpio_set_drive_strength_disable_default(u32 module_index,u32 bit_number,int enable)329 void nx_gpio_set_drive_strength_disable_default(u32 module_index,
330 						u32 bit_number, int enable)
331 {
332 	register struct nx_gpio_register_set *pregister;
333 
334 	pregister = __g_module_variables[module_index].pregister;
335 	nx_gpio_set_bit(&pregister->gpiox_drv1_disable_default, bit_number,
336 			(int)(enable));
337 	nx_gpio_set_bit(&pregister->gpiox_drv0_disable_default, bit_number,
338 			(int)(enable));
339 }
340 
nx_gpio_get_drive_strength(u32 module_index,u32 bit_number)341 u32 nx_gpio_get_drive_strength(u32 module_index, u32 bit_number)
342 {
343 	register struct nx_gpio_register_set *pregister;
344 	register u32 retvalue;
345 
346 	pregister = __g_module_variables[module_index].pregister;
347 	retvalue =
348 		nx_gpio_get_bit(readl(&pregister->gpiox_drv0), bit_number) << 1;
349 	retvalue |=
350 		nx_gpio_get_bit(readl(&pregister->gpiox_drv1), bit_number) << 0;
351 	return retvalue;
352 }
353