1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright (C) 2016 Nexell Co., Ltd.
4 *
5 * Author: junghyun, kim <jhkim@nexell.co.kr>
6 */
7
8 #include <linux/types.h>
9 #include <linux/io.h>
10
11 #include "s5pxx18_soc_disptop.h"
12 #include "s5pxx18_soc_lvds.h"
13
14 #ifndef pow
pow(int a,int b)15 static inline unsigned int pow(int a, int b)
16 {
17 if (b == 0)
18 return 1;
19 else
20 return a * pow(a, b - 1);
21 }
22 #endif
23
24 static struct nx_lvds_register_set *__g_pregister[NUMBER_OF_LVDS_MODULE];
25
nx_lvds_initialize(void)26 int nx_lvds_initialize(void)
27 {
28 static int binit;
29 u32 i;
30
31 if (binit == 0) {
32 for (i = 0; i < NUMBER_OF_LVDS_MODULE; i++)
33 __g_pregister[i] = NULL;
34 binit = 1;
35 }
36
37 return 1;
38 }
39
nx_lvds_get_number_of_module(void)40 u32 nx_lvds_get_number_of_module(void)
41 {
42 return NUMBER_OF_LVDS_MODULE;
43 }
44
nx_lvds_get_size_of_register_set(void)45 u32 nx_lvds_get_size_of_register_set(void)
46 {
47 return sizeof(struct nx_lvds_register_set);
48 }
49
nx_lvds_set_base_address(u32 module_index,void * base_address)50 void nx_lvds_set_base_address(u32 module_index, void *base_address)
51 {
52 __g_pregister[module_index] =
53 (struct nx_lvds_register_set *)base_address;
54 }
55
nx_lvds_get_base_address(u32 module_index)56 void *nx_lvds_get_base_address(u32 module_index)
57 {
58 return (void *)__g_pregister[module_index];
59 }
60
nx_lvds_get_physical_address(u32 module_index)61 u32 nx_lvds_get_physical_address(u32 module_index)
62 {
63 const u32 physical_addr[] = PHY_BASEADDR_LVDS_LIST;
64
65 return physical_addr[module_index];
66 }
67
nx_lvds_open_module(u32 module_index)68 int nx_lvds_open_module(u32 module_index)
69 {
70 return true;
71 }
72
nx_lvds_close_module(u32 module_index)73 int nx_lvds_close_module(u32 module_index)
74 {
75 return true;
76 }
77
nx_lvds_check_busy(u32 module_index)78 int nx_lvds_check_busy(u32 module_index)
79 {
80 return false;
81 }
82
nx_lvds_set_lvdsctrl0(u32 module_index,u32 regvalue)83 void nx_lvds_set_lvdsctrl0(u32 module_index, u32 regvalue)
84 {
85 register struct nx_lvds_register_set *pregister;
86
87 pregister = __g_pregister[module_index];
88 writel(regvalue, &pregister->lvdsctrl0);
89 }
90
nx_lvds_set_lvdsctrl1(u32 module_index,u32 regvalue)91 void nx_lvds_set_lvdsctrl1(u32 module_index, u32 regvalue)
92 {
93 register struct nx_lvds_register_set *pregister;
94
95 pregister = __g_pregister[module_index];
96 writel(regvalue, &pregister->lvdsctrl1);
97 }
98
nx_lvds_set_lvdsctrl2(u32 module_index,u32 regvalue)99 void nx_lvds_set_lvdsctrl2(u32 module_index, u32 regvalue)
100 {
101 register struct nx_lvds_register_set *pregister;
102
103 pregister = __g_pregister[module_index];
104 writel(regvalue, &pregister->lvdsctrl2);
105 }
106
nx_lvds_set_lvdsctrl3(u32 module_index,u32 regvalue)107 void nx_lvds_set_lvdsctrl3(u32 module_index, u32 regvalue)
108 {
109 register struct nx_lvds_register_set *pregister;
110
111 pregister = __g_pregister[module_index];
112 writel(regvalue, &pregister->lvdsctrl3);
113 }
114
nx_lvds_set_lvdsctrl4(u32 module_index,u32 regvalue)115 void nx_lvds_set_lvdsctrl4(u32 module_index, u32 regvalue)
116 {
117 register struct nx_lvds_register_set *pregister;
118
119 pregister = __g_pregister[module_index];
120 writel(regvalue, &pregister->lvdsctrl4);
121 }
122
nx_lvds_set_lvdstmode0(u32 module_index,u32 regvalue)123 void nx_lvds_set_lvdstmode0(u32 module_index, u32 regvalue)
124 {
125 register struct nx_lvds_register_set *pregister;
126
127 pregister = __g_pregister[module_index];
128 writel(regvalue, &pregister->lvdstmode0);
129 }
130
nx_lvds_set_lvdsloc0(u32 module_index,u32 regvalue)131 void nx_lvds_set_lvdsloc0(u32 module_index, u32 regvalue)
132 {
133 register struct nx_lvds_register_set *pregister;
134
135 pregister = __g_pregister[module_index];
136 writel(regvalue, &pregister->lvdsloc0);
137 }
138
nx_lvds_set_lvdsloc1(u32 module_index,u32 regvalue)139 void nx_lvds_set_lvdsloc1(u32 module_index, u32 regvalue)
140 {
141 register struct nx_lvds_register_set *pregister;
142
143 pregister = __g_pregister[module_index];
144 writel(regvalue, &pregister->lvdsloc1);
145 }
146
nx_lvds_set_lvdsloc2(u32 module_index,u32 regvalue)147 void nx_lvds_set_lvdsloc2(u32 module_index, u32 regvalue)
148 {
149 register struct nx_lvds_register_set *pregister;
150
151 pregister = __g_pregister[module_index];
152 writel(regvalue, &pregister->lvdsloc2);
153 }
154
nx_lvds_set_lvdsloc3(u32 module_index,u32 regvalue)155 void nx_lvds_set_lvdsloc3(u32 module_index, u32 regvalue)
156 {
157 register struct nx_lvds_register_set *pregister;
158
159 pregister = __g_pregister[module_index];
160 writel(regvalue, &pregister->lvdsloc3);
161 }
162
nx_lvds_set_lvdsloc4(u32 module_index,u32 regvalue)163 void nx_lvds_set_lvdsloc4(u32 module_index, u32 regvalue)
164 {
165 register struct nx_lvds_register_set *pregister;
166
167 pregister = __g_pregister[module_index];
168 writel(regvalue, &pregister->lvdsloc4);
169 }
170
nx_lvds_set_lvdsloc5(u32 module_index,u32 regvalue)171 void nx_lvds_set_lvdsloc5(u32 module_index, u32 regvalue)
172 {
173 register struct nx_lvds_register_set *pregister;
174
175 pregister = __g_pregister[module_index];
176 writel(regvalue, &pregister->lvdsloc5);
177 }
178
nx_lvds_set_lvdsloc6(u32 module_index,u32 regvalue)179 void nx_lvds_set_lvdsloc6(u32 module_index, u32 regvalue)
180 {
181 register struct nx_lvds_register_set *pregister;
182
183 pregister = __g_pregister[module_index];
184 writel(regvalue, &pregister->lvdsloc6);
185 }
186
nx_lvds_set_lvdslocmask0(u32 module_index,u32 regvalue)187 void nx_lvds_set_lvdslocmask0(u32 module_index, u32 regvalue)
188 {
189 register struct nx_lvds_register_set *pregister;
190
191 pregister = __g_pregister[module_index];
192 writel(regvalue, &pregister->lvdslocmask0);
193 }
194
nx_lvds_set_lvdslocmask1(u32 module_index,u32 regvalue)195 void nx_lvds_set_lvdslocmask1(u32 module_index, u32 regvalue)
196 {
197 register struct nx_lvds_register_set *pregister;
198
199 pregister = __g_pregister[module_index];
200 writel(regvalue, &pregister->lvdslocmask1);
201 }
202
nx_lvds_set_lvdslocpol0(u32 module_index,u32 regvalue)203 void nx_lvds_set_lvdslocpol0(u32 module_index, u32 regvalue)
204 {
205 register struct nx_lvds_register_set *pregister;
206
207 pregister = __g_pregister[module_index];
208 writel(regvalue, &pregister->lvdslocpol0);
209 }
210
nx_lvds_set_lvdslocpol1(u32 module_index,u32 regvalue)211 void nx_lvds_set_lvdslocpol1(u32 module_index, u32 regvalue)
212 {
213 register struct nx_lvds_register_set *pregister;
214
215 pregister = __g_pregister[module_index];
216 writel(regvalue, &pregister->lvdslocpol1);
217 }
218
nx_lvds_set_lvdsdummy(u32 module_index,u32 regvalue)219 void nx_lvds_set_lvdsdummy(u32 module_index, u32 regvalue)
220 {
221 register struct nx_lvds_register_set *pregister;
222 u32 oldvalue;
223
224 pregister = __g_pregister[module_index];
225 oldvalue = readl(&pregister->lvdsctrl1) & 0x00ffffff;
226 writel(oldvalue | ((regvalue & 0xff) << 24), &pregister->lvdsctrl1);
227 }
228
nx_lvds_get_lvdsdummy(u32 module_index)229 u32 nx_lvds_get_lvdsdummy(u32 module_index)
230 {
231 register struct nx_lvds_register_set *pregister;
232 u32 oldvalue;
233
234 pregister = __g_pregister[module_index];
235 oldvalue = readl(&pregister->lvdsctrl1);
236 oldvalue = oldvalue >> 24;
237 return oldvalue;
238 }
239
nx_lvds_get_lvdsctrl0(u32 module_index)240 u32 nx_lvds_get_lvdsctrl0(u32 module_index)
241 {
242 register struct nx_lvds_register_set *pregister;
243
244 pregister = __g_pregister[module_index];
245 return (u32)readl(&pregister->lvdsctrl0);
246 }
247
nx_lvds_get_lvdsctrl1(u32 module_index)248 u32 nx_lvds_get_lvdsctrl1(u32 module_index)
249 {
250 register struct nx_lvds_register_set *pregister;
251
252 pregister = __g_pregister[module_index];
253 return (u32)readl(&pregister->lvdsctrl1);
254 }
255
nx_lvds_get_lvdsctrl2(u32 module_index)256 u32 nx_lvds_get_lvdsctrl2(u32 module_index)
257 {
258 register struct nx_lvds_register_set *pregister;
259
260 pregister = __g_pregister[module_index];
261 return (u32)readl(&pregister->lvdsctrl2);
262 }
263
nx_lvds_get_lvdsctrl3(u32 module_index)264 u32 nx_lvds_get_lvdsctrl3(u32 module_index)
265 {
266 register struct nx_lvds_register_set *pregister;
267
268 pregister = __g_pregister[module_index];
269 return (u32)readl(&pregister->lvdsctrl3);
270 }
271
nx_lvds_get_lvdsctrl4(u32 module_index)272 u32 nx_lvds_get_lvdsctrl4(u32 module_index)
273 {
274 register struct nx_lvds_register_set *pregister;
275
276 pregister = __g_pregister[module_index];
277 return (u32)readl(&pregister->lvdsctrl4);
278 }
279