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_mlc.h"
12
13 static struct {
14 struct nx_mlc_register_set *pregister;
15 } __g_module_variables[NUMBER_OF_MLC_MODULE] = { { NULL, },};
16
nx_mlc_initialize(void)17 int nx_mlc_initialize(void)
18 {
19 static int binit;
20 u32 i;
21
22 if (binit == 0) {
23 for (i = 0; i < NUMBER_OF_MLC_MODULE; i++)
24 __g_module_variables[i].pregister = NULL;
25 binit = 1;
26 }
27 return 1;
28 }
29
nx_mlc_get_physical_address(u32 module_index)30 u32 nx_mlc_get_physical_address(u32 module_index)
31 {
32 const u32 physical_addr[] = PHY_BASEADDR_MLC_LIST;
33
34 return physical_addr[module_index];
35 }
36
nx_mlc_set_base_address(u32 module_index,void * base_address)37 void nx_mlc_set_base_address(u32 module_index, void *base_address)
38 {
39 __g_module_variables[module_index].pregister =
40 (struct nx_mlc_register_set *)base_address;
41 }
42
nx_mlc_get_base_address(u32 module_index)43 void *nx_mlc_get_base_address(u32 module_index)
44 {
45 return (void *)__g_module_variables[module_index].pregister;
46 }
47
nx_mlc_set_clock_pclk_mode(u32 module_index,enum nx_pclkmode mode)48 void nx_mlc_set_clock_pclk_mode(u32 module_index, enum nx_pclkmode mode)
49 {
50 const u32 pclkmode_pos = 3;
51 u32 clkmode = 0;
52
53 register u32 regvalue;
54 register struct nx_mlc_register_set *pregister;
55
56 pregister = __g_module_variables[module_index].pregister;
57 switch (mode) {
58 case nx_pclkmode_dynamic:
59 clkmode = 0;
60 break;
61 case nx_pclkmode_always:
62 clkmode = 1;
63 break;
64 default:
65 break;
66 }
67 regvalue = pregister->mlcclkenb;
68 regvalue &= ~(1ul << pclkmode_pos);
69 regvalue |= (clkmode & 0x01) << pclkmode_pos;
70
71 writel(regvalue, &pregister->mlcclkenb);
72 }
73
nx_mlc_get_clock_pclk_mode(u32 module_index)74 enum nx_pclkmode nx_mlc_get_clock_pclk_mode(u32 module_index)
75 {
76 const u32 pclkmode_pos = 3;
77
78 if (__g_module_variables[module_index].pregister->mlcclkenb &
79 (1ul << pclkmode_pos)) {
80 return nx_pclkmode_always;
81 }
82 return nx_pclkmode_dynamic;
83 }
84
nx_mlc_set_clock_bclk_mode(u32 module_index,enum nx_bclkmode mode)85 void nx_mlc_set_clock_bclk_mode(u32 module_index, enum nx_bclkmode mode)
86 {
87 register u32 regvalue;
88 register struct nx_mlc_register_set *pregister;
89 u32 clkmode = 0;
90
91 pregister = __g_module_variables[module_index].pregister;
92 switch (mode) {
93 case nx_bclkmode_disable:
94 clkmode = 0;
95 break;
96 case nx_bclkmode_dynamic:
97 clkmode = 2;
98 break;
99 case nx_bclkmode_always:
100 clkmode = 3;
101 break;
102 default:
103 break;
104 }
105 regvalue = pregister->mlcclkenb;
106 regvalue &= ~(0x3);
107 regvalue |= clkmode & 0x3;
108
109 writel(regvalue, &pregister->mlcclkenb);
110 }
111
nx_mlc_get_clock_bclk_mode(u32 module_index)112 enum nx_bclkmode nx_mlc_get_clock_bclk_mode(u32 module_index)
113 {
114 const u32 bclkmode = 3ul << 0;
115
116 switch (__g_module_variables[module_index].pregister->mlcclkenb &
117 bclkmode) {
118 case 0:
119 return nx_bclkmode_disable;
120 case 2:
121 return nx_bclkmode_dynamic;
122 case 3:
123 return nx_bclkmode_always;
124 }
125 return nx_bclkmode_disable;
126 }
127
nx_mlc_set_top_power_mode(u32 module_index,int bpower)128 void nx_mlc_set_top_power_mode(u32 module_index, int bpower)
129 {
130 const u32 pixelbuffer_pwd_pos = 11;
131 const u32 pixelbuffer_pwd_mask = 1ul << pixelbuffer_pwd_pos;
132 const u32 dittyflag_mask = 1ul << 3;
133 register struct nx_mlc_register_set *pregister;
134 register u32 regvalue;
135
136 pregister = __g_module_variables[module_index].pregister;
137 regvalue = pregister->mlccontrolt;
138 regvalue &= ~(pixelbuffer_pwd_mask | dittyflag_mask);
139 regvalue |= (bpower << pixelbuffer_pwd_pos);
140
141 writel(regvalue, &pregister->mlccontrolt);
142 }
143
nx_mlc_get_top_power_mode(u32 module_index)144 int nx_mlc_get_top_power_mode(u32 module_index)
145 {
146 const u32 pixelbuffer_pwd_pos = 11;
147 const u32 pixelbuffer_pwd_mask = 1ul << pixelbuffer_pwd_pos;
148
149 return (int)((__g_module_variables[module_index].pregister->mlccontrolt
150 & pixelbuffer_pwd_mask) >>
151 pixelbuffer_pwd_pos);
152 }
153
nx_mlc_set_top_sleep_mode(u32 module_index,int bsleep)154 void nx_mlc_set_top_sleep_mode(u32 module_index, int bsleep)
155 {
156 const u32 pixelbuffer_sld_pos = 10;
157 const u32 pixelbuffer_sld_mask = 1ul << pixelbuffer_sld_pos;
158 const u32 dittyflag_mask = 1ul << 3;
159 register struct nx_mlc_register_set *pregister;
160 register u32 regvalue;
161
162 bsleep = (int)((u32)bsleep ^ 1);
163 pregister = __g_module_variables[module_index].pregister;
164 regvalue = pregister->mlccontrolt;
165 regvalue &= ~(pixelbuffer_sld_mask | dittyflag_mask);
166 regvalue |= (bsleep << pixelbuffer_sld_pos);
167
168 writel(regvalue, &pregister->mlccontrolt);
169 }
170
nx_mlc_get_top_sleep_mode(u32 module_index)171 int nx_mlc_get_top_sleep_mode(u32 module_index)
172 {
173 const u32 pixelbuffer_sld_pos = 11;
174 const u32 pixelbuffer_sld_mask = 1ul << pixelbuffer_sld_pos;
175
176 return (int)(((__g_module_variables[module_index].pregister->mlccontrolt
177 & pixelbuffer_sld_mask) >>
178 pixelbuffer_sld_pos) ^ 0x01);
179 }
180
nx_mlc_set_top_dirty_flag(u32 module_index)181 void nx_mlc_set_top_dirty_flag(u32 module_index)
182 {
183 const u32 dirtyflag = 1ul << 3;
184 register struct nx_mlc_register_set *pregister;
185 register u32 regvalue;
186
187 pregister = __g_module_variables[module_index].pregister;
188 regvalue = pregister->mlccontrolt;
189 regvalue |= dirtyflag;
190
191 writel(regvalue, &pregister->mlccontrolt);
192 }
193
nx_mlc_get_top_dirty_flag(u32 module_index)194 int nx_mlc_get_top_dirty_flag(u32 module_index)
195 {
196 const u32 dirtyflag_pos = 3;
197 const u32 dirtyflag_mask = 1ul << dirtyflag_pos;
198
199 return (int)((readl(&__g_module_variables[module_index]
200 .pregister->mlccontrolt) &
201 dirtyflag_mask) >> dirtyflag_pos);
202 }
203
nx_mlc_set_mlc_enable(u32 module_index,int benb)204 void nx_mlc_set_mlc_enable(u32 module_index, int benb)
205 {
206 const u32 mlcenb_pos = 1;
207 const u32 mlcenb_mask = 1ul << mlcenb_pos;
208 const u32 dirtyflag_pos = 3;
209 const u32 dirtyflag_mask = 1ul << dirtyflag_pos;
210 register u32 regvalue;
211 register struct nx_mlc_register_set *pregister;
212
213 pregister = __g_module_variables[module_index].pregister;
214 regvalue = pregister->mlccontrolt;
215 regvalue &= ~(mlcenb_mask | dirtyflag_mask);
216 regvalue |= (benb << mlcenb_pos);
217
218 writel(regvalue, &pregister->mlccontrolt);
219 }
220
nx_mlc_get_mlc_enable(u32 module_index)221 int nx_mlc_get_mlc_enable(u32 module_index)
222 {
223 const u32 mlcenb_pos = 1;
224 const u32 mlcenb_mask = 1ul << mlcenb_pos;
225
226 return (int)((__g_module_variables[module_index].pregister->mlccontrolt
227 & mlcenb_mask) >> mlcenb_pos);
228 }
229
nx_mlc_set_field_enable(u32 module_index,int benb)230 void nx_mlc_set_field_enable(u32 module_index, int benb)
231 {
232 const u32 fieldenb_pos = 0;
233 const u32 fieldenb_mask = 1ul << fieldenb_pos;
234 const u32 dirtyflag_pos = 3;
235 const u32 dirtyflag_mask = 1ul << dirtyflag_pos;
236 register u32 regvalue;
237 register struct nx_mlc_register_set *pregister;
238
239 pregister = __g_module_variables[module_index].pregister;
240 regvalue = pregister->mlccontrolt;
241 regvalue &= ~(fieldenb_mask | dirtyflag_mask);
242 regvalue |= (benb << fieldenb_pos);
243
244 writel(regvalue, &pregister->mlccontrolt);
245 }
246
nx_mlc_get_field_enable(u32 module_index)247 int nx_mlc_get_field_enable(u32 module_index)
248 {
249 const u32 fieldenb_pos = 0;
250 const u32 fieldenb_mask = 1ul << fieldenb_pos;
251
252 return (int)(__g_module_variables[module_index].pregister->mlccontrolt &
253 fieldenb_mask);
254 }
255
nx_mlc_set_layer_priority(u32 module_index,enum nx_mlc_priority priority)256 void nx_mlc_set_layer_priority(u32 module_index, enum nx_mlc_priority priority)
257 {
258 const u32 priority_pos = 8;
259 const u32 priority_mask = 0x03 << priority_pos;
260 const u32 dirtyflag_pos = 3;
261 const u32 dirtyflag_mask = 1ul << dirtyflag_pos;
262 register struct nx_mlc_register_set *pregister;
263 register u32 regvalue;
264
265 pregister = __g_module_variables[module_index].pregister;
266 regvalue = pregister->mlccontrolt;
267 regvalue &= ~(priority_mask | dirtyflag_mask);
268 regvalue |= (priority << priority_pos);
269
270 writel(regvalue, &pregister->mlccontrolt);
271 }
272
nx_mlc_set_screen_size(u32 module_index,u32 width,u32 height)273 void nx_mlc_set_screen_size(u32 module_index, u32 width, u32 height)
274 {
275 register struct nx_mlc_register_set *pregister;
276 register u32 regvalue;
277
278 pregister = __g_module_variables[module_index].pregister;
279 regvalue = ((height - 1) << 16) | (width - 1);
280
281 writel(regvalue, &pregister->mlcscreensize);
282 }
283
nx_mlc_get_screen_size(u32 module_index,u32 * pwidth,u32 * pheight)284 void nx_mlc_get_screen_size(u32 module_index, u32 *pwidth, u32 *pheight)
285 {
286 register struct nx_mlc_register_set *pregister;
287
288 pregister = __g_module_variables[module_index].pregister;
289
290 if (pwidth)
291 *pwidth = (pregister->mlcscreensize & 0x0fff) + 1;
292
293 if (pheight)
294 *pheight = ((pregister->mlcscreensize >> 16) & 0x0fff) + 1;
295 }
296
nx_mlc_set_background(u32 module_index,u32 color)297 void nx_mlc_set_background(u32 module_index, u32 color)
298 {
299 register struct nx_mlc_register_set *pregister;
300
301 pregister = __g_module_variables[module_index].pregister;
302 writel(color, &pregister->mlcbgcolor);
303 }
304
nx_mlc_set_dirty_flag(u32 module_index,u32 layer)305 void nx_mlc_set_dirty_flag(u32 module_index, u32 layer)
306 {
307 register struct nx_mlc_register_set *pregister;
308 register u32 regvalue;
309 const u32 dirtyflg_mask = 1ul << 4;
310
311 pregister = __g_module_variables[module_index].pregister;
312 if (layer == 0 || layer == 1) {
313 regvalue = pregister->mlcrgblayer[layer].mlccontrol;
314 regvalue |= dirtyflg_mask;
315
316 writel(regvalue, &pregister->mlcrgblayer[layer].mlccontrol);
317 } else if (layer == 3) {
318 regvalue = pregister->mlcvideolayer.mlccontrol;
319 regvalue |= dirtyflg_mask;
320
321 writel(regvalue, &pregister->mlcvideolayer.mlccontrol);
322 }
323 }
324
nx_mlc_get_dirty_flag(u32 module_index,u32 layer)325 int nx_mlc_get_dirty_flag(u32 module_index, u32 layer)
326 {
327 const u32 dirtyflg_pos = 4;
328 const u32 dirtyflg_mask = 1ul << dirtyflg_pos;
329
330 if (layer == 0 || layer == 1) {
331 return (int)((__g_module_variables[module_index]
332 .pregister->mlcrgblayer[layer]
333 .mlccontrol & dirtyflg_mask) >> dirtyflg_pos);
334 } else if (layer == 2) {
335 return (int)((__g_module_variables[module_index]
336 .pregister->mlcrgblayer2.mlccontrol &
337 dirtyflg_mask) >> dirtyflg_pos);
338 } else if (layer == 3) {
339 return (int)((__g_module_variables[module_index]
340 .pregister->mlcvideolayer.mlccontrol &
341 dirtyflg_mask) >> dirtyflg_pos);
342 }
343 return 0;
344 }
345
nx_mlc_set_layer_enable(u32 module_index,u32 layer,int benb)346 void nx_mlc_set_layer_enable(u32 module_index, u32 layer, int benb)
347 {
348 const u32 layerenb_pos = 5;
349 const u32 layerenb_mask = 0x01 << layerenb_pos;
350 const u32 dirtyflag_pos = 4;
351 const u32 dirtyflag_mask = 1ul << dirtyflag_pos;
352 register u32 regvalue;
353 register struct nx_mlc_register_set *pregister;
354
355 pregister = __g_module_variables[module_index].pregister;
356 if (layer == 0 || layer == 1) {
357 regvalue = pregister->mlcrgblayer[layer].mlccontrol;
358 regvalue &= ~(layerenb_mask | dirtyflag_mask);
359 regvalue |= (benb << layerenb_pos);
360
361 writel(regvalue, &pregister->mlcrgblayer[layer].mlccontrol);
362 } else if (layer == 3) {
363 regvalue = pregister->mlcvideolayer.mlccontrol;
364 regvalue &= ~(layerenb_mask | dirtyflag_mask);
365 regvalue |= (benb << layerenb_pos);
366
367 writel(regvalue, &pregister->mlcvideolayer.mlccontrol);
368 }
369 }
370
nx_mlc_get_layer_enable(u32 module_index,u32 layer)371 int nx_mlc_get_layer_enable(u32 module_index, u32 layer)
372 {
373 const u32 layerenb_pos = 5;
374 const u32 layerenb_mask = 0x01 << layerenb_pos;
375
376 if (layer == 0 || layer == 1) {
377 return (int)((__g_module_variables[module_index]
378 .pregister->mlcrgblayer[layer]
379 .mlccontrol & layerenb_mask) >> layerenb_pos);
380 } else if (layer == 3) {
381 return (int)((__g_module_variables[module_index]
382 .pregister->mlcvideolayer.mlccontrol &
383 layerenb_mask) >> layerenb_pos);
384 }
385 return 0;
386 }
387
nx_mlc_set_lock_size(u32 module_index,u32 layer,u32 locksize)388 void nx_mlc_set_lock_size(u32 module_index, u32 layer, u32 locksize)
389 {
390 const u32 locksize_mask = 3ul << 12;
391 const u32 dirtyflag_pos = 4;
392 const u32 dirtyflag_mask = 1ul << dirtyflag_pos;
393 register struct nx_mlc_register_set *pregister;
394 register u32 regvalue;
395
396 pregister = __g_module_variables[module_index].pregister;
397 locksize >>= 3;
398 if (layer == 0 || layer == 1) {
399 regvalue = pregister->mlcrgblayer[layer].mlccontrol;
400 regvalue &= ~(locksize_mask | dirtyflag_mask);
401 regvalue |= (locksize << 12);
402
403 writel(regvalue, &pregister->mlcrgblayer[layer].mlccontrol);
404 }
405 }
406
nx_mlc_set_alpha_blending(u32 module_index,u32 layer,int benb,u32 alpha)407 void nx_mlc_set_alpha_blending(u32 module_index, u32 layer, int benb, u32 alpha)
408 {
409 const u32 blendenb_pos = 2;
410 const u32 blendenb_mask = 0x01 << blendenb_pos;
411 const u32 dirtyflag_pos = 4;
412 const u32 dirtyflag_mask = 1ul << dirtyflag_pos;
413 const u32 alpha_pos = 28;
414 const u32 alpha_mask = 0xf << alpha_pos;
415 register u32 regvalue;
416 register struct nx_mlc_register_set *pregister;
417
418 pregister = __g_module_variables[module_index].pregister;
419 if (layer == 0 || layer == 1) {
420 regvalue = pregister->mlcrgblayer[layer].mlccontrol;
421 regvalue &= ~(blendenb_mask | dirtyflag_mask);
422 regvalue |= (benb << blendenb_pos);
423
424 writel(regvalue, &pregister->mlcrgblayer[layer].mlccontrol);
425 regvalue = pregister->mlcrgblayer[layer].mlctpcolor;
426 regvalue &= ~alpha_mask;
427 regvalue |= alpha << alpha_pos;
428
429 writel(regvalue, &pregister->mlcrgblayer[layer].mlctpcolor);
430 } else if (layer == 3) {
431 regvalue = pregister->mlcvideolayer.mlccontrol;
432 regvalue &= ~(blendenb_mask | dirtyflag_mask);
433 regvalue |= (benb << blendenb_pos);
434
435 writel(regvalue, &pregister->mlcvideolayer.mlccontrol);
436
437 writel(alpha << alpha_pos,
438 &pregister->mlcvideolayer.mlctpcolor);
439 }
440 }
441
nx_mlc_set_transparency(u32 module_index,u32 layer,int benb,u32 color)442 void nx_mlc_set_transparency(u32 module_index, u32 layer, int benb, u32 color)
443 {
444 const u32 tpenb_pos = 0;
445 const u32 tpenb_mask = 0x01 << tpenb_pos;
446 const u32 dirtyflag_pos = 4;
447 const u32 dirtyflag_mask = 1ul << dirtyflag_pos;
448 const u32 tpcolor_pos = 0;
449 const u32 tpcolor_mask = ((1 << 24) - 1) << tpcolor_pos;
450 register u32 regvalue;
451 register struct nx_mlc_register_set *pregister;
452
453 pregister = __g_module_variables[module_index].pregister;
454 if (layer == 0 || layer == 1) {
455 regvalue = pregister->mlcrgblayer[layer].mlccontrol;
456 regvalue &= ~(tpenb_mask | dirtyflag_mask);
457 regvalue |= (benb << tpenb_pos);
458
459 writel(regvalue, &pregister->mlcrgblayer[layer].mlccontrol);
460 regvalue = pregister->mlcrgblayer[layer].mlctpcolor;
461 regvalue &= ~tpcolor_mask;
462 regvalue |= (color & tpcolor_mask);
463
464 writel(regvalue, &pregister->mlcrgblayer[layer].mlctpcolor);
465 }
466 }
467
nx_mlc_set_color_inversion(u32 module_index,u32 layer,int benb,u32 color)468 void nx_mlc_set_color_inversion(u32 module_index, u32 layer, int benb,
469 u32 color)
470 {
471 const u32 invenb_pos = 1;
472 const u32 invenb_mask = 0x01 << invenb_pos;
473 const u32 dirtyflag_pos = 4;
474 const u32 dirtyflag_mask = 1ul << dirtyflag_pos;
475 const u32 invcolor_pos = 0;
476 const u32 invcolor_mask = ((1 << 24) - 1) << invcolor_pos;
477 register u32 regvalue;
478 register struct nx_mlc_register_set *pregister;
479
480 pregister = __g_module_variables[module_index].pregister;
481 if (layer == 0 || layer == 1) {
482 regvalue = pregister->mlcrgblayer[layer].mlccontrol;
483 regvalue &= ~(invenb_mask | dirtyflag_mask);
484 regvalue |= (benb << invenb_pos);
485
486 writel(regvalue, &pregister->mlcrgblayer[layer].mlccontrol);
487 regvalue = pregister->mlcrgblayer[layer].mlcinvcolor;
488 regvalue &= ~invcolor_mask;
489 regvalue |= (color & invcolor_mask);
490
491 writel(regvalue, &pregister->mlcrgblayer[layer].mlcinvcolor);
492 }
493 }
494
nx_mlc_get_extended_color(u32 module_index,u32 color,enum nx_mlc_rgbfmt format)495 u32 nx_mlc_get_extended_color(u32 module_index, u32 color,
496 enum nx_mlc_rgbfmt format)
497 {
498 u32 rgb[3] = {
499 0,
500 };
501 u32 bw[3] = {
502 0,
503 };
504 u32 bp[3] = {
505 0,
506 };
507 u32 blank = 0;
508 u32 fill = 0;
509 u32 i = 0;
510
511 switch (format) {
512 case nx_mlc_rgbfmt_r5g6b5:
513 bw[0] = 5;
514 bw[1] = 6;
515 bw[2] = 5;
516 bp[0] = 11;
517 bp[1] = 5;
518 bp[2] = 0;
519 break;
520 case nx_mlc_rgbfmt_b5g6r5:
521 bw[0] = 5;
522 bw[1] = 6;
523 bw[2] = 5;
524 bp[0] = 0;
525 bp[1] = 5;
526 bp[2] = 11;
527 break;
528 case nx_mlc_rgbfmt_x1r5g5b5:
529 case nx_mlc_rgbfmt_a1r5g5b5:
530 bw[0] = 5;
531 bw[1] = 5;
532 bw[2] = 5;
533 bp[0] = 10;
534 bp[1] = 5;
535 bp[2] = 0;
536 break;
537 case nx_mlc_rgbfmt_x1b5g5r5:
538 case nx_mlc_rgbfmt_a1b5g5r5:
539 bw[0] = 5;
540 bw[1] = 5;
541 bw[2] = 5;
542 bp[0] = 0;
543 bp[1] = 5;
544 bp[2] = 10;
545 break;
546 case nx_mlc_rgbfmt_x4r4g4b4:
547 case nx_mlc_rgbfmt_a4r4g4b4:
548 bw[0] = 4;
549 bw[1] = 4;
550 bw[2] = 4;
551 bp[0] = 8;
552 bp[1] = 4;
553 bp[2] = 0;
554 break;
555 case nx_mlc_rgbfmt_x4b4g4r4:
556 case nx_mlc_rgbfmt_a4b4g4r4:
557 bw[0] = 4;
558 bw[1] = 4;
559 bw[2] = 4;
560 bp[0] = 0;
561 bp[1] = 4;
562 bp[2] = 8;
563 break;
564 case nx_mlc_rgbfmt_x8r3g3b2:
565 case nx_mlc_rgbfmt_a8r3g3b2:
566 bw[0] = 3;
567 bw[1] = 3;
568 bw[2] = 2;
569 bp[0] = 5;
570 bp[1] = 2;
571 bp[2] = 0;
572 break;
573 case nx_mlc_rgbfmt_x8b3g3r2:
574 case nx_mlc_rgbfmt_a8b3g3r2:
575 bw[0] = 2;
576 bw[1] = 3;
577 bw[2] = 3;
578 bp[0] = 0;
579 bp[1] = 2;
580 bp[2] = 5;
581 break;
582 case nx_mlc_rgbfmt_r8g8b8:
583 case nx_mlc_rgbfmt_a8r8g8b8:
584 bw[0] = 8;
585 bw[1] = 8;
586 bw[2] = 8;
587 bp[0] = 16;
588 bp[1] = 8;
589 bp[2] = 0;
590 break;
591 case nx_mlc_rgbfmt_b8g8r8:
592 case nx_mlc_rgbfmt_a8b8g8r8:
593 bw[0] = 8;
594 bw[1] = 8;
595 bw[2] = 8;
596 bp[0] = 0;
597 bp[1] = 8;
598 bp[2] = 16;
599 break;
600 default:
601 break;
602 }
603 for (i = 0; i < 3; i++) {
604 rgb[i] = (color >> bp[i]) & ((u32)(1 << bw[i]) - 1);
605 fill = bw[i];
606 blank = 8 - fill;
607 rgb[i] <<= blank;
608 while (blank > 0) {
609 rgb[i] |= (rgb[i] >> fill);
610 blank -= fill;
611 fill += fill;
612 }
613 }
614
615 return (rgb[0] << 16) | (rgb[1] << 8) | (rgb[2] << 0);
616 }
617
nx_mlc_set_format_rgb(u32 module_index,u32 layer,enum nx_mlc_rgbfmt format)618 void nx_mlc_set_format_rgb(u32 module_index, u32 layer,
619 enum nx_mlc_rgbfmt format)
620 {
621 const u32 dirtyflag_pos = 4;
622 const u32 dirtyflag_mask = 1ul << dirtyflag_pos;
623 const u32 format_mask = 0xffff0000ul;
624 register u32 regvalue;
625 register struct nx_mlc_register_set *pregister;
626
627 pregister = __g_module_variables[module_index].pregister;
628 if (layer == 0 || layer == 1) {
629 regvalue = pregister->mlcrgblayer[layer].mlccontrol;
630 regvalue &= ~(format_mask | dirtyflag_mask);
631 regvalue |= (u32)format;
632
633 writel(regvalue, &pregister->mlcrgblayer[layer].mlccontrol);
634 }
635 }
636
nx_mlc_set_format_yuv(u32 module_index,enum nx_mlc_yuvfmt format)637 void nx_mlc_set_format_yuv(u32 module_index, enum nx_mlc_yuvfmt format)
638 {
639 const u32 format_mask = 0xffff0000ul;
640 register u32 temp;
641 register struct nx_mlc_register_set *pregister;
642
643 pregister = __g_module_variables[module_index].pregister;
644 temp = pregister->mlcvideolayer.mlccontrol;
645 temp &= ~format_mask;
646 temp |= (u32)format;
647
648 writel(temp, &pregister->mlcvideolayer.mlccontrol);
649 }
650
nx_mlc_set_position(u32 module_index,u32 layer,s32 sx,s32 sy,s32 ex,s32 ey)651 void nx_mlc_set_position(u32 module_index, u32 layer, s32 sx, s32 sy,
652 s32 ex, s32 ey)
653 {
654 register struct nx_mlc_register_set *pregister;
655
656 pregister = __g_module_variables[module_index].pregister;
657 if (layer == 0 || layer == 1) {
658 writel((((u32)sx & 0xffful) << 16) | ((u32)ex & 0xffful),
659 &pregister->mlcrgblayer[layer].mlcleftright);
660
661 writel((((u32)sy & 0xffful) << 16) | ((u32)ey & 0xffful),
662 &pregister->mlcrgblayer[layer].mlctopbottom);
663 } else if (layer == 2) {
664 writel((((u32)sx & 0xffful) << 16) | ((u32)ex & 0xffful),
665 &pregister->mlcrgblayer2.mlcleftright);
666
667 writel((((u32)sy & 0xffful) << 16) | ((u32)ey & 0xffful),
668 &pregister->mlcrgblayer2.mlctopbottom);
669 } else if (layer == 3) {
670 writel((((u32)sx & 0xffful) << 16) | ((u32)ex & 0xffful),
671 &pregister->mlcvideolayer.mlcleftright);
672
673 writel((((u32)sy & 0xffful) << 16) | ((u32)ey & 0xffful),
674 &pregister->mlcvideolayer.mlctopbottom);
675 }
676 }
677
nx_mlc_set_dither_enable_when_using_gamma(u32 module_index,int benable)678 void nx_mlc_set_dither_enable_when_using_gamma(u32 module_index, int benable)
679 {
680 const u32 ditherenb_bitpos = 0;
681 const u32 ditherenb_mask = 1 << ditherenb_bitpos;
682 register struct nx_mlc_register_set *pregister;
683 register u32 read_value;
684
685 pregister = __g_module_variables[module_index].pregister;
686 read_value = pregister->mlcgammacont;
687 read_value &= ~ditherenb_mask;
688 read_value |= ((u32)benable << ditherenb_bitpos);
689
690 writel(read_value, &pregister->mlcgammacont);
691 }
692
nx_mlc_get_dither_enable_when_using_gamma(u32 module_index)693 int nx_mlc_get_dither_enable_when_using_gamma(u32 module_index)
694 {
695 const u32 ditherenb_bitpos = 0;
696 const u32 ditherenb_mask = 1 << ditherenb_bitpos;
697
698 return (int)(__g_module_variables[module_index].pregister->mlcgammacont
699 & ditherenb_mask);
700 }
701
nx_mlc_set_gamma_priority(u32 module_index,int bvideolayer)702 void nx_mlc_set_gamma_priority(u32 module_index, int bvideolayer)
703 {
704 const u32 alphaselect_bitpos = 5;
705 const u32 alphaselect_mask = 1 << alphaselect_bitpos;
706 register struct nx_mlc_register_set *pregister;
707 register u32 read_value;
708
709 pregister = __g_module_variables[module_index].pregister;
710 read_value = pregister->mlcgammacont;
711 read_value &= ~alphaselect_mask;
712 read_value |= ((u32)bvideolayer << alphaselect_bitpos);
713
714 writel(read_value, &pregister->mlcgammacont);
715 }
716
nx_mlc_get_gamma_priority(u32 module_index)717 int nx_mlc_get_gamma_priority(u32 module_index)
718 {
719 const u32 alphaselect_bitpos = 5;
720 const u32 alphaselect_mask = 1 << alphaselect_bitpos;
721
722 return (int)((__g_module_variables[module_index].pregister->mlcgammacont
723 & alphaselect_mask) >> alphaselect_bitpos);
724 }
725
nx_mlc_set_rgblayer_invalid_position(u32 module_index,u32 layer,u32 region,s32 sx,s32 sy,s32 ex,s32 ey,int benb)726 void nx_mlc_set_rgblayer_invalid_position(u32 module_index, u32 layer,
727 u32 region, s32 sx, s32 sy,
728 s32 ex, s32 ey, int benb)
729 {
730 const u32 invalidenb_pos = 28;
731 register struct nx_mlc_register_set *pregister;
732
733 pregister = __g_module_variables[module_index].pregister;
734 if (layer == 0 || layer == 1) {
735 if (region == 0) {
736 writel(((benb << invalidenb_pos) |
737 ((sx & 0x7ff) << 16) | (ex & 0x7ff)),
738 &pregister->mlcrgblayer[layer]
739 .mlcinvalidleftright0);
740
741 writel((((sy & 0x7ff) << 16) | (ey & 0x7ff)),
742 &pregister->mlcrgblayer[layer]
743 .mlcinvalidtopbottom0);
744 } else {
745 writel(((benb << invalidenb_pos) |
746 ((sx & 0x7ff) << 16) | (ex & 0x7ff)),
747 &pregister->mlcrgblayer[layer]
748 .mlcinvalidleftright1);
749
750 writel((((sy & 0x7ff) << 16) | (ey & 0x7ff)),
751 &pregister->mlcrgblayer[layer]
752 .mlcinvalidtopbottom1);
753 }
754 }
755 }
756
nx_mlc_set_rgblayer_stride(u32 module_index,u32 layer,s32 hstride,s32 vstride)757 void nx_mlc_set_rgblayer_stride(u32 module_index, u32 layer, s32 hstride,
758 s32 vstride)
759 {
760 register struct nx_mlc_register_set *pregister;
761
762 pregister = __g_module_variables[module_index].pregister;
763 if (layer == 0 || layer == 1) {
764 writel(hstride, &pregister->mlcrgblayer[layer].mlchstride);
765 writel(vstride, &pregister->mlcrgblayer[layer].mlcvstride);
766 } else if (layer == 2) {
767 writel(hstride, &pregister->mlcrgblayer2.mlchstride);
768 writel(vstride, &pregister->mlcrgblayer2.mlcvstride);
769 }
770 }
771
nx_mlc_set_rgblayer_address(u32 module_index,u32 layer,u32 addr)772 void nx_mlc_set_rgblayer_address(u32 module_index, u32 layer, u32 addr)
773 {
774 register struct nx_mlc_register_set *pregister;
775
776 pregister = __g_module_variables[module_index].pregister;
777 if (layer == 0 || layer == 1)
778 writel(addr, &pregister->mlcrgblayer[layer].mlcaddress);
779 else if (layer == 2)
780 writel(addr, &pregister->mlcrgblayer2.mlcaddress);
781 }
782
nx_mlc_set_rgblayer_gama_table_power_mode(u32 module_index,int bred,int bgreen,int bblue)783 void nx_mlc_set_rgblayer_gama_table_power_mode(u32 module_index, int bred,
784 int bgreen, int bblue)
785 {
786 const u32 bgammatable_pwd_bitpos = 11;
787 const u32 ggammatable_pwd_bitpos = 9;
788 const u32 rgammatable_pwd_bitpos = 3;
789 const u32 bgammatable_pwd_mask = (1 << bgammatable_pwd_bitpos);
790 const u32 ggammatable_pwd_mask = (1 << ggammatable_pwd_bitpos);
791 const u32 rgammatable_pwd_mask = (1 << rgammatable_pwd_bitpos);
792 register u32 read_value;
793 register struct nx_mlc_register_set *pregister;
794
795 pregister = __g_module_variables[module_index].pregister;
796 read_value = pregister->mlcgammacont;
797 read_value &= ~(bgammatable_pwd_mask | ggammatable_pwd_mask |
798 rgammatable_pwd_mask);
799 read_value |= (((u32)bred << rgammatable_pwd_bitpos) |
800 ((u32)bgreen << ggammatable_pwd_bitpos) |
801 ((u32)bblue << bgammatable_pwd_bitpos));
802
803 writel(read_value, &pregister->mlcgammacont);
804 }
805
nx_mlc_get_rgblayer_gama_table_power_mode(u32 module_index,int * pbred,int * pbgreen,int * pbblue)806 void nx_mlc_get_rgblayer_gama_table_power_mode(u32 module_index, int *pbred,
807 int *pbgreen, int *pbblue)
808 {
809 const u32 bgammatable_pwd_bitpos = 11;
810 const u32 ggammatable_pwd_bitpos = 9;
811 const u32 rgammatable_pwd_bitpos = 3;
812 const u32 bgammatable_pwd_mask = (1 << bgammatable_pwd_bitpos);
813 const u32 ggammatable_pwd_mask = (1 << ggammatable_pwd_bitpos);
814 const u32 rgammatable_pwd_mask = (1 << rgammatable_pwd_bitpos);
815 register u32 read_value;
816 register struct nx_mlc_register_set *pregister;
817
818 pregister = __g_module_variables[module_index].pregister;
819 read_value = pregister->mlcgammacont;
820 if (pbred)
821 *pbred = (read_value & rgammatable_pwd_mask) ? 1 : 0;
822
823 if (pbgreen)
824 *pbgreen = (read_value & ggammatable_pwd_mask) ? 1 : 0;
825
826 if (pbblue)
827 *pbblue = (read_value & bgammatable_pwd_mask) ? 1 : 0;
828 }
829
nx_mlc_set_rgblayer_gama_table_sleep_mode(u32 module_index,int bred,int bgreen,int bblue)830 void nx_mlc_set_rgblayer_gama_table_sleep_mode(u32 module_index, int bred,
831 int bgreen, int bblue)
832 {
833 const u32 bgammatable_sld_bitpos = 10;
834 const u32 ggammatable_sld_bitpos = 8;
835 const u32 rgammatable_sld_bitpos = 2;
836 const u32 bgammatable_sld_mask = (1 << bgammatable_sld_bitpos);
837 const u32 ggammatable_sld_mask = (1 << ggammatable_sld_bitpos);
838 const u32 rgammatable_sld_mask = (1 << rgammatable_sld_bitpos);
839 register u32 read_value;
840 register struct nx_mlc_register_set *pregister;
841
842 pregister = __g_module_variables[module_index].pregister;
843 read_value = pregister->mlcgammacont;
844 if (bred)
845 read_value &= ~rgammatable_sld_mask;
846 else
847 read_value |= rgammatable_sld_mask;
848
849 if (bgreen)
850 read_value &= ~ggammatable_sld_mask;
851 else
852 read_value |= ggammatable_sld_mask;
853
854 if (bblue)
855 read_value &= ~bgammatable_sld_mask;
856 else
857 read_value |= bgammatable_sld_mask;
858
859 writel(read_value, &pregister->mlcgammacont);
860 }
861
nx_mlc_get_rgblayer_gama_table_sleep_mode(u32 module_index,int * pbred,int * pbgreen,int * pbblue)862 void nx_mlc_get_rgblayer_gama_table_sleep_mode(u32 module_index, int *pbred,
863 int *pbgreen, int *pbblue)
864 {
865 const u32 bgammatable_sld_bitpos = 10;
866 const u32 ggammatable_sld_bitpos = 8;
867 const u32 rgammatable_sld_bitpos = 2;
868 const u32 bgammatable_sld_mask = (1 << bgammatable_sld_bitpos);
869 const u32 ggammatable_sld_mask = (1 << ggammatable_sld_bitpos);
870 const u32 rgammatable_sld_mask = (1 << rgammatable_sld_bitpos);
871 register u32 read_value;
872 register struct nx_mlc_register_set *pregister;
873
874 pregister = __g_module_variables[module_index].pregister;
875 read_value = pregister->mlcgammacont;
876
877 if (pbred)
878 *pbred = (read_value & rgammatable_sld_mask) ? 0 : 1;
879
880 if (pbgreen)
881 *pbgreen = (read_value & ggammatable_sld_mask) ? 0 : 1;
882
883 if (pbblue)
884 *pbblue = (read_value & bgammatable_sld_mask) ? 0 : 1;
885 }
886
nx_mlc_set_rgblayer_rgamma_table(u32 module_index,u32 dwaddress,u32 dwdata)887 void nx_mlc_set_rgblayer_rgamma_table(u32 module_index, u32 dwaddress,
888 u32 dwdata)
889 {
890 register struct nx_mlc_register_set *pregister;
891 const u32 tableaddr_bitpos = 24;
892
893 pregister = __g_module_variables[module_index].pregister;
894 writel(((dwaddress << tableaddr_bitpos) | dwdata),
895 &pregister->mlcrgammatablewrite);
896 }
897
nx_mlc_set_rgblayer_ggamma_table(u32 module_index,u32 dwaddress,u32 dwdata)898 void nx_mlc_set_rgblayer_ggamma_table(u32 module_index, u32 dwaddress,
899 u32 dwdata)
900 {
901 register struct nx_mlc_register_set *pregister;
902 const u32 tableaddr_bitpos = 24;
903
904 pregister = __g_module_variables[module_index].pregister;
905 writel(((dwaddress << tableaddr_bitpos) | dwdata),
906 &pregister->mlcggammatablewrite);
907 }
908
nx_mlc_set_rgblayer_bgamma_table(u32 module_index,u32 dwaddress,u32 dwdata)909 void nx_mlc_set_rgblayer_bgamma_table(u32 module_index, u32 dwaddress,
910 u32 dwdata)
911 {
912 register struct nx_mlc_register_set *pregister;
913 const u32 tableaddr_bitpos = 24;
914
915 pregister = __g_module_variables[module_index].pregister;
916 writel(((dwaddress << tableaddr_bitpos) | dwdata),
917 &pregister->mlcbgammatablewrite);
918 }
919
nx_mlc_set_rgblayer_gamma_enable(u32 module_index,int benable)920 void nx_mlc_set_rgblayer_gamma_enable(u32 module_index, int benable)
921 {
922 const u32 rgbgammaemb_bitpos = 1;
923 const u32 rgbgammaemb_mask = 1 << rgbgammaemb_bitpos;
924 register u32 read_value;
925 register struct nx_mlc_register_set *pregister;
926
927 pregister = __g_module_variables[module_index].pregister;
928 read_value = pregister->mlcgammacont;
929 read_value &= ~rgbgammaemb_mask;
930 read_value |= (u32)benable << rgbgammaemb_bitpos;
931
932 writel(read_value, &pregister->mlcgammacont);
933 }
934
nx_mlc_get_rgblayer_gamma_enable(u32 module_index)935 int nx_mlc_get_rgblayer_gamma_enable(u32 module_index)
936 {
937 const u32 rgbgammaemb_bitpos = 1;
938 const u32 rgbgammaemb_mask = 1 << rgbgammaemb_bitpos;
939
940 return (int)((__g_module_variables[module_index].pregister->mlcgammacont
941 & rgbgammaemb_mask) >> rgbgammaemb_bitpos);
942 }
943
nx_mlc_set_video_layer_stride(u32 module_index,s32 lu_stride,s32 cb_stride,s32 cr_stride)944 void nx_mlc_set_video_layer_stride(u32 module_index, s32 lu_stride,
945 s32 cb_stride, s32 cr_stride)
946 {
947 register struct nx_mlc_register_set *pregister;
948
949 pregister = __g_module_variables[module_index].pregister;
950
951 writel(lu_stride, &pregister->mlcvideolayer.mlcvstride);
952 writel(cb_stride, &pregister->mlcvideolayer.mlcvstridecb);
953 writel(cr_stride, &pregister->mlcvideolayer.mlcvstridecr);
954 }
955
nx_mlc_set_video_layer_address(u32 module_index,u32 lu_addr,u32 cb_addr,u32 cr_addr)956 void nx_mlc_set_video_layer_address(u32 module_index, u32 lu_addr, u32 cb_addr,
957 u32 cr_addr)
958 {
959 register struct nx_mlc_register_set *pregister;
960
961 pregister = __g_module_variables[module_index].pregister;
962 writel(lu_addr, &pregister->mlcvideolayer.mlcaddress);
963 writel(cb_addr, &pregister->mlcvideolayer.mlcaddresscb);
964 writel(cr_addr, &pregister->mlcvideolayer.mlcaddresscr);
965 }
966
nx_mlc_set_video_layer_address_yuyv(u32 module_index,u32 addr,s32 stride)967 void nx_mlc_set_video_layer_address_yuyv(u32 module_index, u32 addr,
968 s32 stride)
969 {
970 register struct nx_mlc_register_set *pregister;
971
972 pregister = __g_module_variables[module_index].pregister;
973 writel(addr, &pregister->mlcvideolayer.mlcaddress);
974 writel(stride, &pregister->mlcvideolayer.mlcvstride);
975 }
976
nx_mlc_set_video_layer_scale_factor(u32 module_index,u32 hscale,u32 vscale,int bhlumaenb,int bhchromaenb,int bvlumaenb,int bvchromaenb)977 void nx_mlc_set_video_layer_scale_factor(u32 module_index, u32 hscale,
978 u32 vscale, int bhlumaenb,
979 int bhchromaenb, int bvlumaenb,
980 int bvchromaenb)
981 {
982 const u32 filter_luma_pos = 28;
983 const u32 filter_choma_pos = 29;
984 const u32 scale_mask = ((1 << 23) - 1);
985 register struct nx_mlc_register_set *pregister;
986
987 pregister = __g_module_variables[module_index].pregister;
988
989 writel(((bhlumaenb << filter_luma_pos) |
990 (bhchromaenb << filter_choma_pos) | (hscale & scale_mask)),
991 &pregister->mlcvideolayer.mlchscale);
992
993 writel(((bvlumaenb << filter_luma_pos) |
994 (bvchromaenb << filter_choma_pos) | (vscale & scale_mask)),
995 &pregister->mlcvideolayer.mlcvscale);
996 }
997
nx_mlc_set_video_layer_scale_filter(u32 module_index,int bhlumaenb,int bhchromaenb,int bvlumaenb,int bvchromaenb)998 void nx_mlc_set_video_layer_scale_filter(u32 module_index, int bhlumaenb,
999 int bhchromaenb, int bvlumaenb,
1000 int bvchromaenb)
1001 {
1002 const u32 filter_luma_pos = 28;
1003 const u32 filter_choma_pos = 29;
1004 const u32 scale_mask = ((1 << 23) - 1);
1005 register struct nx_mlc_register_set *pregister;
1006 register u32 read_value;
1007
1008 pregister = __g_module_variables[module_index].pregister;
1009 read_value = pregister->mlcvideolayer.mlchscale;
1010 read_value &= scale_mask;
1011 read_value |=
1012 (bhlumaenb << filter_luma_pos) | (bhchromaenb << filter_choma_pos);
1013
1014 writel(read_value, &pregister->mlcvideolayer.mlchscale);
1015 read_value = pregister->mlcvideolayer.mlcvscale;
1016 read_value &= scale_mask;
1017 read_value |=
1018 (bvlumaenb << filter_luma_pos) | (bvchromaenb << filter_choma_pos);
1019
1020 writel(read_value, &pregister->mlcvideolayer.mlcvscale);
1021 }
1022
nx_mlc_get_video_layer_scale_filter(u32 module_index,int * bhlumaenb,int * bhchromaenb,int * bvlumaenb,int * bvchromaenb)1023 void nx_mlc_get_video_layer_scale_filter(u32 module_index, int *bhlumaenb,
1024 int *bhchromaenb, int *bvlumaenb,
1025 int *bvchromaenb)
1026 {
1027 const u32 filter_luma_pos = 28;
1028 const u32 filter_choma_pos = 29;
1029 const u32 filter_mask = 1ul;
1030 register struct nx_mlc_register_set *pregister;
1031 register u32 read_value;
1032
1033 pregister = __g_module_variables[module_index].pregister;
1034 read_value = pregister->mlcvideolayer.mlchscale;
1035 *bhlumaenb = (read_value >> filter_luma_pos) & filter_mask;
1036 *bhchromaenb = (read_value >> filter_choma_pos) & filter_mask;
1037 read_value = pregister->mlcvideolayer.mlcvscale;
1038 *bvlumaenb = (read_value >> filter_luma_pos) & filter_mask;
1039 *bvchromaenb = (read_value >> filter_choma_pos) & filter_mask;
1040 }
1041
nx_mlc_set_video_layer_scale(u32 module_index,u32 sw,u32 sh,u32 dw,u32 dh,int bhlumaenb,int bhchromaenb,int bvlumaenb,int bvchromaenb)1042 void nx_mlc_set_video_layer_scale(u32 module_index, u32 sw, u32 sh, u32 dw,
1043 u32 dh, int bhlumaenb, int bhchromaenb,
1044 int bvlumaenb, int bvchromaenb)
1045 {
1046 const u32 filter_luma_pos = 28;
1047 const u32 filter_choma_pos = 29;
1048 const u32 scale_mask = ((1 << 23) - 1);
1049 register u32 hscale, vscale, cal_sh;
1050 register struct nx_mlc_register_set *pregister;
1051
1052 pregister = __g_module_variables[module_index].pregister;
1053
1054 if ((bhlumaenb || bhchromaenb) && dw > sw) {
1055 sw--;
1056 dw--;
1057 }
1058 hscale = (sw << 11) / dw;
1059
1060 if ((bvlumaenb || bvchromaenb) && dh > sh) {
1061 sh--;
1062 dh--;
1063 vscale = (sh << 11) / dh;
1064
1065 cal_sh = ((vscale * dh) >> 11);
1066 if (sh <= cal_sh)
1067 vscale--;
1068
1069 } else {
1070 vscale = (sh << 11) / dh;
1071 }
1072
1073 writel(((bhlumaenb << filter_luma_pos) |
1074 (bhchromaenb << filter_choma_pos) | (hscale & scale_mask)),
1075 &pregister->mlcvideolayer.mlchscale);
1076
1077 writel(((bvlumaenb << filter_luma_pos) |
1078 (bvchromaenb << filter_choma_pos) | (vscale & scale_mask)),
1079 &pregister->mlcvideolayer.mlcvscale);
1080 }
1081
nx_mlc_set_video_layer_luma_enhance(u32 module_index,u32 contrast,s32 brightness)1082 void nx_mlc_set_video_layer_luma_enhance(u32 module_index, u32 contrast,
1083 s32 brightness)
1084 {
1085 register struct nx_mlc_register_set *pregister;
1086
1087 pregister = __g_module_variables[module_index].pregister;
1088
1089 writel((((u32)brightness & 0xfful) << 8) | contrast,
1090 &pregister->mlcvideolayer.mlcluenh);
1091 }
1092
nx_mlc_set_video_layer_chroma_enhance(u32 module_index,u32 quadrant,s32 cb_a,s32 cb_b,s32 cr_a,s32 cr_b)1093 void nx_mlc_set_video_layer_chroma_enhance(u32 module_index, u32 quadrant,
1094 s32 cb_a, s32 cb_b,
1095 s32 cr_a, s32 cr_b)
1096 {
1097 register struct nx_mlc_register_set *pregister;
1098 register u32 temp;
1099
1100 pregister = __g_module_variables[module_index].pregister;
1101 temp = (((u32)cr_b & 0xfful) << 24) | (((u32)cr_a & 0xfful) << 16) |
1102 (((u32)cb_b & 0xfful) << 8) | (((u32)cb_a & 0xfful) << 0);
1103 if (quadrant > 0) {
1104 writel(temp, &pregister->mlcvideolayer.mlcchenh[quadrant - 1]);
1105 } else {
1106 writel(temp, &pregister->mlcvideolayer.mlcchenh[0]);
1107 writel(temp, &pregister->mlcvideolayer.mlcchenh[1]);
1108 writel(temp, &pregister->mlcvideolayer.mlcchenh[2]);
1109 writel(temp, &pregister->mlcvideolayer.mlcchenh[3]);
1110 }
1111 }
1112
nx_mlc_set_video_layer_line_buffer_power_mode(u32 module_index,int benable)1113 void nx_mlc_set_video_layer_line_buffer_power_mode(u32 module_index,
1114 int benable)
1115 {
1116 const u32 linebuff_pwd_pos = 15;
1117 const u32 linebuff_pwd_mask = 1ul << linebuff_pwd_pos;
1118 const u32 dirtyflag_mask = 1ul << 4;
1119 register u32 regvalue;
1120 register struct nx_mlc_register_set *pregister;
1121
1122 pregister = __g_module_variables[module_index].pregister;
1123 regvalue = pregister->mlcvideolayer.mlccontrol;
1124 regvalue &= ~(linebuff_pwd_mask | dirtyflag_mask);
1125 regvalue |= ((u32)benable << linebuff_pwd_pos);
1126
1127 writel(regvalue, &pregister->mlcvideolayer.mlccontrol);
1128 }
1129
nx_mlc_get_video_layer_line_buffer_power_mode(u32 module_index)1130 int nx_mlc_get_video_layer_line_buffer_power_mode(u32 module_index)
1131 {
1132 const u32 linebuff_pwd_pos = 15;
1133 const u32 linebuff_pwd_mask = 1ul << linebuff_pwd_pos;
1134
1135 return (int)((__g_module_variables[module_index]
1136 .pregister->mlcvideolayer.mlccontrol &
1137 linebuff_pwd_mask) >> linebuff_pwd_pos);
1138 }
1139
nx_mlc_set_video_layer_line_buffer_sleep_mode(u32 module_index,int benable)1140 void nx_mlc_set_video_layer_line_buffer_sleep_mode(u32 module_index,
1141 int benable)
1142 {
1143 const u32 linebuff_slmd_pos = 14;
1144 const u32 linebuff_slmd_mask = 1ul << linebuff_slmd_pos;
1145 const u32 dirtyflag_mask = 1ul << 4;
1146 register u32 regvalue;
1147 register struct nx_mlc_register_set *pregister;
1148
1149 benable = (int)((u32)benable ^ 1);
1150 pregister = __g_module_variables[module_index].pregister;
1151 regvalue = pregister->mlcvideolayer.mlccontrol;
1152 regvalue &= ~(linebuff_slmd_mask | dirtyflag_mask);
1153 regvalue |= (benable << linebuff_slmd_pos);
1154
1155 writel(regvalue, &pregister->mlcvideolayer.mlccontrol);
1156 }
1157
nx_mlc_get_video_layer_line_buffer_sleep_mode(u32 module_index)1158 int nx_mlc_get_video_layer_line_buffer_sleep_mode(u32 module_index)
1159 {
1160 const u32 linebuff_slmd_pos = 14;
1161 const u32 linebuff_slmd_mask = 1ul << linebuff_slmd_pos;
1162 register struct nx_mlc_register_set *pregister;
1163
1164 pregister = __g_module_variables[module_index].pregister;
1165 if (linebuff_slmd_mask & pregister->mlcvideolayer.mlccontrol)
1166 return 0;
1167 else
1168 return 1;
1169 }
1170
nx_mlc_set_video_layer_gama_table_power_mode(u32 module_index,int by,int bu,int bv)1171 void nx_mlc_set_video_layer_gama_table_power_mode(u32 module_index, int by,
1172 int bu, int bv)
1173 {
1174 const u32 vgammatable_pwd_bitpos = 17;
1175 const u32 ugammatable_pwd_bitpos = 15;
1176 const u32 ygammatable_pwd_bitpos = 13;
1177 const u32 vgammatable_pwd_mask = (1 << vgammatable_pwd_bitpos);
1178 const u32 ugammatable_pwd_mask = (1 << ugammatable_pwd_bitpos);
1179 const u32 ygammatable_pwd_mask = (1 << ygammatable_pwd_bitpos);
1180 register u32 read_value;
1181 register struct nx_mlc_register_set *pregister;
1182
1183 pregister = __g_module_variables[module_index].pregister;
1184 read_value = pregister->mlcgammacont;
1185 read_value &= ~(ygammatable_pwd_mask | ugammatable_pwd_mask |
1186 vgammatable_pwd_mask);
1187 read_value |= (((u32)by << ygammatable_pwd_bitpos) |
1188 ((u32)bu << ugammatable_pwd_bitpos) |
1189 ((u32)bv << vgammatable_pwd_bitpos));
1190
1191 writel(read_value, &pregister->mlcgammacont);
1192 }
1193
nx_mlc_get_video_layer_gama_table_power_mode(u32 module_index,int * pby,int * pbu,int * pbv)1194 void nx_mlc_get_video_layer_gama_table_power_mode(u32 module_index, int *pby,
1195 int *pbu, int *pbv)
1196 {
1197 const u32 vgammatable_pwd_bitpos = 17;
1198 const u32 ugammatable_pwd_bitpos = 15;
1199 const u32 ygammatable_pwd_bitpos = 13;
1200 const u32 vgammatable_pwd_mask = (1 << vgammatable_pwd_bitpos);
1201 const u32 ugammatable_pwd_mask = (1 << ugammatable_pwd_bitpos);
1202 const u32 ygammatable_pwd_mask = (1 << ygammatable_pwd_bitpos);
1203 register u32 read_value;
1204 register struct nx_mlc_register_set *pregister;
1205
1206 pregister = __g_module_variables[module_index].pregister;
1207 read_value = pregister->mlcgammacont;
1208 if (pby)
1209 *pby = (read_value & ygammatable_pwd_mask) ? 1 : 0;
1210
1211 if (pbu)
1212 *pbu = (read_value & ugammatable_pwd_mask) ? 1 : 0;
1213
1214 if (pbv)
1215 *pbv = (read_value & vgammatable_pwd_mask) ? 1 : 0;
1216 }
1217
nx_mlc_set_video_layer_gama_table_sleep_mode(u32 module_index,int by,int bu,int bv)1218 void nx_mlc_set_video_layer_gama_table_sleep_mode(u32 module_index, int by,
1219 int bu, int bv)
1220 {
1221 const u32 vgammatable_sld_bitpos = 16;
1222 const u32 ugammatable_sld_bitpos = 14;
1223 const u32 ygammatable_sld_bitpos = 12;
1224 const u32 vgammatable_sld_mask = (1 << vgammatable_sld_bitpos);
1225 const u32 ugammatable_sld_mask = (1 << ugammatable_sld_bitpos);
1226 const u32 ygammatable_sld_mask = (1 << ygammatable_sld_bitpos);
1227 register u32 read_value;
1228 register struct nx_mlc_register_set *pregister;
1229
1230 pregister = __g_module_variables[module_index].pregister;
1231 read_value = pregister->mlcgammacont;
1232 if (by)
1233 read_value &= ~ygammatable_sld_mask;
1234 else
1235 read_value |= ygammatable_sld_mask;
1236
1237 if (bu)
1238 read_value &= ~ugammatable_sld_mask;
1239 else
1240 read_value |= ugammatable_sld_mask;
1241
1242 if (bv)
1243 read_value &= ~vgammatable_sld_mask;
1244 else
1245 read_value |= vgammatable_sld_mask;
1246
1247 writel(read_value, &pregister->mlcgammacont);
1248 }
1249
nx_mlc_get_video_layer_gama_table_sleep_mode(u32 module_index,int * pby,int * pbu,int * pbv)1250 void nx_mlc_get_video_layer_gama_table_sleep_mode(u32 module_index, int *pby,
1251 int *pbu, int *pbv)
1252 {
1253 const u32 vgammatable_sld_bitpos = 16;
1254 const u32 ugammatable_sld_bitpos = 14;
1255 const u32 ygammatable_sld_bitpos = 12;
1256 const u32 vgammatable_sld_mask = (1 << vgammatable_sld_bitpos);
1257 const u32 ugammatable_sld_mask = (1 << ugammatable_sld_bitpos);
1258 const u32 ygammatable_sld_mask = (1 << ygammatable_sld_bitpos);
1259 register u32 read_value;
1260 register struct nx_mlc_register_set *pregister;
1261
1262 pregister = __g_module_variables[module_index].pregister;
1263 read_value = pregister->mlcgammacont;
1264
1265 if (pby)
1266 *pby = (read_value & vgammatable_sld_mask) ? 0 : 1;
1267
1268 if (pbu)
1269 *pbu = (read_value & ugammatable_sld_mask) ? 0 : 1;
1270
1271 if (pbv)
1272 *pbv = (read_value & ygammatable_sld_mask) ? 0 : 1;
1273 }
1274
nx_mlc_set_video_layer_gamma_enable(u32 module_index,int benable)1275 void nx_mlc_set_video_layer_gamma_enable(u32 module_index, int benable)
1276 {
1277 const u32 yuvgammaemb_bitpos = 4;
1278 const u32 yuvgammaemb_mask = 1 << yuvgammaemb_bitpos;
1279 register u32 read_value;
1280 register struct nx_mlc_register_set *pregister;
1281
1282 pregister = __g_module_variables[module_index].pregister;
1283 read_value = pregister->mlcgammacont;
1284 read_value &= ~yuvgammaemb_mask;
1285 read_value |= (u32)benable << yuvgammaemb_bitpos;
1286
1287 writel(read_value, &pregister->mlcgammacont);
1288 }
1289
nx_mlc_get_video_layer_gamma_enable(u32 module_index)1290 int nx_mlc_get_video_layer_gamma_enable(u32 module_index)
1291 {
1292 const u32 yuvgammaemb_bitpos = 4;
1293 const u32 yuvgammaemb_mask = 1 << yuvgammaemb_bitpos;
1294
1295 return (int)((__g_module_variables[module_index].pregister->mlcgammacont
1296 & yuvgammaemb_mask) >> yuvgammaemb_bitpos);
1297 }
1298
nx_mlc_set_gamma_table_poweroff(u32 module_index,int enb)1299 void nx_mlc_set_gamma_table_poweroff(u32 module_index, int enb)
1300 {
1301 register struct nx_mlc_register_set *pregister;
1302 u32 regvalue;
1303
1304 pregister = __g_module_variables[module_index].pregister;
1305 if (enb == 1) {
1306 regvalue = pregister->mlcgammacont;
1307 regvalue = regvalue & 0xf3;
1308 writel(regvalue, &pregister->mlcgammacont);
1309 }
1310 }
1311
nx_mlc_set_mlctop_control_parameter(u32 module_index,int field_enable,int mlcenable,u8 priority,enum g3daddrchangeallowed g3daddr_change_allowed)1312 void nx_mlc_set_mlctop_control_parameter(u32 module_index, int field_enable,
1313 int mlcenable, u8 priority,
1314 enum g3daddrchangeallowed
1315 g3daddr_change_allowed)
1316 {
1317 register u32 mlctopcontrolreg;
1318 register struct nx_mlc_register_set *pregister;
1319
1320 pregister = __g_module_variables[module_index].pregister;
1321 mlctopcontrolreg = (readl(&pregister->mlccontrolt)) & 0xfffffcfc;
1322 mlctopcontrolreg = (u32)(mlctopcontrolreg |
1323 ((priority << 8) | ((mlcenable == 1) << 1) |
1324 (1 ==
1325 field_enable)) | (g3daddr_change_allowed <<
1326 12));
1327 writel(mlctopcontrolreg, &pregister->mlccontrolt);
1328 }
1329
nx_mlc_set_rgb0layer_control_parameter(u32 module_index,int layer_enable,int grp3denable,int tp_enable,u32 transparency_color,int inv_enable,u32 inverse_color,int blend_enable,u8 alpha_value,enum mlc_rgbfmt rbgformat,enum locksizesel lock_size_select)1330 void nx_mlc_set_rgb0layer_control_parameter(u32 module_index, int layer_enable,
1331 int grp3denable, int tp_enable,
1332 u32 transparency_color,
1333 int inv_enable, u32 inverse_color,
1334 int blend_enable, u8 alpha_value,
1335 enum mlc_rgbfmt rbgformat,
1336 enum locksizesel lock_size_select)
1337 {
1338 u32 layer_format;
1339 u32 control_enb;
1340 u32 alpha_argument;
1341 u32 lock_size = (u32)(lock_size_select & 0x3);
1342 u32 rgb0controlreg;
1343 u32 regvalue;
1344 register struct nx_mlc_register_set *pregister;
1345
1346 layer_format = nx_mlc_get_rgbformat(rbgformat);
1347 pregister = __g_module_variables[module_index].pregister;
1348 control_enb =
1349 (u32)((grp3denable << 8) | (layer_enable << 5) |
1350 (blend_enable << 2) | (inv_enable << 1) | tp_enable) & 0x127;
1351 alpha_argument = (u32)(alpha_value & 0xf);
1352
1353 rgb0controlreg = readl(&pregister->mlcrgblayer[0].mlccontrol) & 0x10;
1354 regvalue =
1355 (u32)(((layer_format << 16) | control_enb | (lock_size << 12)) |
1356 rgb0controlreg);
1357 writel(regvalue, &pregister->mlcrgblayer[0].mlccontrol);
1358
1359 regvalue = (u32)((alpha_argument << 28) | transparency_color);
1360 writel(regvalue, &pregister->mlcrgblayer[0].mlctpcolor);
1361 regvalue = inverse_color;
1362 writel(regvalue, &pregister->mlcrgblayer[0].mlcinvcolor);
1363 }
1364
nx_mlc_get_rgbformat(enum mlc_rgbfmt rbgformat)1365 u32 nx_mlc_get_rgbformat(enum mlc_rgbfmt rbgformat)
1366 {
1367 u32 rgbformatvalue;
1368 const u32 format_table[] = {
1369 0x4432ul, 0x4342ul, 0x4211ul, 0x4120ul, 0x4003ul, 0x4554ul,
1370 0x3342ul, 0x2211ul, 0x1120ul, 0x1003ul, 0x4653ul, 0x4653ul,
1371 0x0653ul, 0x4ed3ul, 0x4f84ul, 0xc432ul, 0xc342ul, 0xc211ul,
1372 0xc120ul, 0xb342ul, 0xa211ul, 0x9120ul, 0xc653ul, 0xc653ul,
1373 0x8653ul, 0xced3ul, 0xcf84ul, 0x443aul
1374 };
1375
1376 return rgbformatvalue = format_table[rbgformat];
1377 }
1378
nx_mlc_set_rgb1layer_control_parameter(u32 module_index,int layer_enable,int grp3denable,int tp_enable,u32 transparency_color,int inv_enable,u32 inverse_color,int blend_enable,u8 alpha_value,enum mlc_rgbfmt rbgformat,enum locksizesel lock_size_select)1379 void nx_mlc_set_rgb1layer_control_parameter(u32 module_index, int layer_enable,
1380 int grp3denable, int tp_enable,
1381 u32 transparency_color,
1382 int inv_enable, u32 inverse_color,
1383 int blend_enable, u8 alpha_value,
1384 enum mlc_rgbfmt rbgformat,
1385 enum locksizesel lock_size_select)
1386 {
1387 u32 layer_format;
1388 u32 control_enb;
1389 u32 alpha_argument;
1390 u32 lock_size = (u32)(lock_size_select & 0x3);
1391 u32 rgb0controlreg;
1392 u32 regvalue;
1393 register struct nx_mlc_register_set *pregister;
1394
1395 layer_format = nx_mlc_get_rgbformat(rbgformat);
1396 pregister = __g_module_variables[module_index].pregister;
1397
1398 rgb0controlreg = readl(&pregister->mlcrgblayer[1].mlccontrol) & 0x10;
1399 control_enb =
1400 (u32)((grp3denable << 8) | (layer_enable << 5) |
1401 (blend_enable << 2) | (inv_enable << 1) | tp_enable) & 0x127;
1402 alpha_argument = (u32)(alpha_value & 0xf);
1403 regvalue =
1404 (u32)(((layer_format << 16) | control_enb | (lock_size << 12)) |
1405 rgb0controlreg);
1406 writel(regvalue, &pregister->mlcrgblayer[1].mlccontrol);
1407 regvalue = (u32)((alpha_argument << 28) | transparency_color);
1408 writel(regvalue, &pregister->mlcrgblayer[1].mlctpcolor);
1409 regvalue = inverse_color;
1410 writel(regvalue, &pregister->mlcrgblayer[1].mlcinvcolor);
1411 }
1412
nx_mlc_set_rgb2layer_control_parameter(u32 module_index,int layer_enable,int grp3denable,int tp_enable,u32 transparency_color,int inv_enable,u32 inverse_color,int blend_enable,u8 alpha_value,enum mlc_rgbfmt rbgformat,enum locksizesel lock_size_select)1413 void nx_mlc_set_rgb2layer_control_parameter(u32 module_index, int layer_enable,
1414 int grp3denable, int tp_enable,
1415 u32 transparency_color,
1416 int inv_enable, u32 inverse_color,
1417 int blend_enable, u8 alpha_value,
1418 enum mlc_rgbfmt rbgformat,
1419 enum locksizesel lock_size_select)
1420 {
1421 u32 layer_format;
1422 u32 control_enb;
1423 u32 alpha_argument;
1424 u32 lock_size = (u32)(lock_size_select & 0x3);
1425 u32 rgb0controlreg;
1426 u32 regvalue;
1427 register struct nx_mlc_register_set *pregister;
1428
1429 layer_format = nx_mlc_get_rgbformat(rbgformat);
1430 pregister = __g_module_variables[module_index].pregister;
1431
1432 rgb0controlreg = readl(&pregister->mlcrgblayer2.mlccontrol) & 0x10;
1433 control_enb =
1434 (u32)((grp3denable << 8) | (layer_enable << 5) |
1435 (blend_enable << 2) | (inv_enable << 1) | tp_enable) & 0x127;
1436 alpha_argument = (u32)(alpha_value & 0xf);
1437 regvalue =
1438 (u32)(((layer_format << 16) | control_enb | (lock_size << 12)) |
1439 rgb0controlreg);
1440 writel(regvalue, &pregister->mlcrgblayer2.mlccontrol);
1441 regvalue = (u32)((alpha_argument << 28) | transparency_color);
1442 writel(regvalue, &pregister->mlcrgblayer2.mlctpcolor);
1443 regvalue = inverse_color;
1444 writel(regvalue, &pregister->mlcrgblayer2.mlcinvcolor);
1445 }
1446
nx_mlc_set_video_layer_control_parameter(u32 module_index,int layer_enable,int tp_enable,u32 transparency_color,int inv_enable,u32 inverse_color,int blend_enable,u8 alpha_value,enum nx_mlc_yuvfmt yuvformat)1447 void nx_mlc_set_video_layer_control_parameter(u32 module_index,
1448 int layer_enable, int tp_enable,
1449 u32 transparency_color,
1450 int inv_enable, u32 inverse_color,
1451 int blend_enable, u8 alpha_value,
1452 enum nx_mlc_yuvfmt yuvformat)
1453 {
1454 u32 control_enb;
1455 u32 alpha_argument;
1456 u32 regvalue;
1457 register struct nx_mlc_register_set *pregister;
1458 u32 video_control_reg;
1459
1460 pregister = __g_module_variables[module_index].pregister;
1461
1462 video_control_reg = readl(&pregister->mlcvideolayer.mlccontrol);
1463 control_enb =
1464 (u32)((yuvformat) | (layer_enable << 5) | (blend_enable << 2) |
1465 (inv_enable << 1) | tp_enable) & 0x30027;
1466 alpha_argument = (u32)(alpha_value & 0xf);
1467 regvalue = (u32)(control_enb | video_control_reg);
1468 writel(regvalue, &pregister->mlcvideolayer.mlccontrol);
1469 regvalue = (u32)((alpha_argument << 28) | transparency_color);
1470 writel(regvalue, &pregister->mlcvideolayer.mlctpcolor);
1471 regvalue = (u32)((alpha_argument << 28) | transparency_color);
1472 writel(regvalue, &pregister->mlcvideolayer.mlcinvcolor);
1473 }
1474
nx_mlc_set_srammode(u32 module_index,enum latyername layer_name,enum srammode sram_mode)1475 void nx_mlc_set_srammode(u32 module_index, enum latyername layer_name,
1476 enum srammode sram_mode)
1477 {
1478 u32 control_reg_value;
1479 register struct nx_mlc_register_set *pregister;
1480
1481 pregister = __g_module_variables[module_index].pregister;
1482 switch (layer_name) {
1483 case topmlc:
1484 control_reg_value = readl(&pregister->mlccontrolt);
1485 writel((u32)(control_reg_value | (sram_mode << 10)),
1486 &pregister->mlccontrolt);
1487 control_reg_value = 0;
1488 break;
1489 case rgb0:
1490 control_reg_value =
1491 readl(&pregister->mlcrgblayer[0].mlccontrol);
1492 writel((u32)(control_reg_value | (sram_mode << 14)),
1493 &pregister->mlcrgblayer[0].mlccontrol);
1494 control_reg_value = 0;
1495 break;
1496 case rgb1:
1497 control_reg_value =
1498 readl(&pregister->mlcrgblayer[1].mlccontrol);
1499 writel((u32)(control_reg_value | (sram_mode << 14)),
1500 &pregister->mlcrgblayer[1].mlccontrol);
1501 control_reg_value = 0;
1502 break;
1503 case rgb2:
1504 control_reg_value = readl(&pregister->mlcrgblayer2.mlccontrol);
1505 writel((u32)(control_reg_value | (sram_mode << 14)),
1506 &pregister->mlcrgblayer2.mlccontrol);
1507 control_reg_value = 0;
1508 break;
1509 case video:
1510 control_reg_value = readl(&pregister->mlcvideolayer.mlccontrol);
1511 writel((u32)(control_reg_value | (sram_mode << 14)),
1512 &pregister->mlcvideolayer.mlccontrol);
1513 control_reg_value = 0;
1514 break;
1515 default:
1516 break;
1517 }
1518 }
1519
nx_mlc_set_layer_reg_finish(u32 module_index,enum latyername layer_name)1520 void nx_mlc_set_layer_reg_finish(u32 module_index, enum latyername layer_name)
1521 {
1522 u32 control_reg_value;
1523 register struct nx_mlc_register_set *pregister;
1524
1525 pregister = __g_module_variables[module_index].pregister;
1526
1527 switch (layer_name) {
1528 case topmlc:
1529 control_reg_value = readl(&pregister->mlccontrolt);
1530 writel((u32)(control_reg_value | (1ul << 3)),
1531 &pregister->mlccontrolt);
1532 control_reg_value = 0;
1533 break;
1534 case rgb0:
1535 control_reg_value =
1536 readl(&pregister->mlcrgblayer[0].mlccontrol);
1537 writel((u32)(control_reg_value | (1ul << 4)),
1538 &pregister->mlcrgblayer[0].mlccontrol);
1539 control_reg_value = 0;
1540 break;
1541 case rgb1:
1542 control_reg_value =
1543 readl(&pregister->mlcrgblayer[1].mlccontrol);
1544 writel((u32)(control_reg_value | (1ul << 4)),
1545 &pregister->mlcrgblayer[1].mlccontrol);
1546 control_reg_value = 0;
1547 break;
1548 case rgb2:
1549 control_reg_value = readl(&pregister->mlcrgblayer2.mlccontrol);
1550 writel((u32)(control_reg_value | (1ul << 4)),
1551 &pregister->mlcrgblayer2.mlccontrol);
1552 control_reg_value = 0;
1553 break;
1554 case video:
1555 control_reg_value = readl(&pregister->mlcvideolayer.mlccontrol);
1556 writel((u32)(control_reg_value | (1ul << 4)),
1557 &pregister->mlcvideolayer.mlccontrol);
1558 control_reg_value = 0;
1559 break;
1560 default:
1561 break;
1562 }
1563 }
1564
nx_mlc_set_video_layer_coordinate(u32 module_index,int vfilterenable,int hfilterenable,int vfilterenable_c,int hfilterenable_c,u16 video_layer_with,u16 video_layer_height,s16 left,s16 right,s16 top,s16 bottom)1565 void nx_mlc_set_video_layer_coordinate(u32 module_index, int vfilterenable,
1566 int hfilterenable, int vfilterenable_c,
1567 int hfilterenable_c,
1568 u16 video_layer_with,
1569 u16 video_layer_height, s16 left,
1570 s16 right, s16 top,
1571 s16 bottom)
1572 {
1573 s32 source_width, source_height;
1574 s32 destination_width;
1575 s32 destination_height;
1576 s32 hscale, vscale;
1577 s32 hfilterenb, vfilterenb;
1578 register struct nx_mlc_register_set *pregister;
1579
1580 pregister = __g_module_variables[module_index].pregister;
1581 writel((s32)(((left & 0x0fff) << 16) | (right & 0x0fff)),
1582 &pregister->mlcvideolayer.mlcleftright);
1583 writel((s32)(((top & 0x0fff) << 16) | (bottom & 0x0fff)),
1584 &pregister->mlcvideolayer.mlctopbottom);
1585 source_width = (s32)(video_layer_with - 1);
1586 source_height = (s32)(video_layer_height - 1);
1587 destination_width = (s32)(right - left);
1588 destination_height = (s32)(bottom - top);
1589
1590 hscale =
1591 (s32)((source_width * (1ul << 11) + (destination_width / 2)) /
1592 destination_width);
1593 vscale =
1594 (s32)((source_height * (1ul << 11) +
1595 (destination_height / 2)) / destination_height);
1596
1597 hfilterenb = (u32)(((hfilterenable_c << 29) | (hfilterenable) << 28)) &
1598 0x30000000;
1599 vfilterenb = (u32)(((vfilterenable_c << 29) | (vfilterenable) << 28)) &
1600 0x30000000;
1601 writel((u32)(hfilterenb | (hscale & 0x00ffffff)),
1602 &pregister->mlcvideolayer.mlchscale);
1603 writel((u32)(vfilterenb | (vscale & 0x00ffffff)),
1604 &pregister->mlcvideolayer.mlcvscale);
1605 }
1606
nx_mlc_set_video_layer_filter_scale(u32 module_index,u32 hscale,u32 vscale)1607 void nx_mlc_set_video_layer_filter_scale(u32 module_index, u32 hscale,
1608 u32 vscale)
1609 {
1610 register struct nx_mlc_register_set *pregister;
1611 u32 mlchscale = 0;
1612 u32 mlcvscale = 0;
1613
1614 pregister = __g_module_variables[module_index].pregister;
1615 mlchscale = readl(&pregister->mlcvideolayer.mlchscale) & (~0x00ffffff);
1616 mlcvscale = readl(&pregister->mlcvideolayer.mlcvscale) & (~0x00ffffff);
1617
1618 writel((u32)(mlchscale | (hscale & 0x00ffffff)),
1619 &pregister->mlcvideolayer.mlchscale);
1620 writel((u32)(mlcvscale | (vscale & 0x00ffffff)),
1621 &pregister->mlcvideolayer.mlcvscale);
1622 }
1623
nx_mlc_set_gamma_control_parameter(u32 module_index,int rgbgammaenb,int yuvgammaenb,int yuvalphaarray,int dither_enb)1624 void nx_mlc_set_gamma_control_parameter(u32 module_index, int rgbgammaenb,
1625 int yuvgammaenb, int yuvalphaarray,
1626 int dither_enb)
1627 {
1628 u32 register_data;
1629 register struct nx_mlc_register_set *pregister;
1630
1631 pregister = __g_module_variables[module_index].pregister;
1632 register_data = readl(&pregister->mlcgammacont);
1633 register_data = (register_data & 0xf0c) |
1634 ((yuvalphaarray << 5) | (yuvgammaenb << 4) |
1635 (rgbgammaenb << 1) | (dither_enb << 0));
1636 writel(register_data, &pregister->mlcgammacont);
1637 }
1638
nx_mlc_set_layer_alpha256(u32 module_index,u32 layer,u32 alpha)1639 void nx_mlc_set_layer_alpha256(u32 module_index, u32 layer, u32 alpha)
1640 {
1641 u32 register_data;
1642 register struct nx_mlc_register_set *pregister;
1643
1644 if (alpha < 0)
1645 alpha = 0;
1646 if (alpha > 255)
1647 alpha = 255;
1648
1649 pregister = __g_module_variables[module_index].pregister;
1650 if (layer == 0) {
1651 register_data =
1652 readl(&pregister->mlcrgblayer[0].mlctpcolor) & 0x00ffffff;
1653 register_data = register_data | (alpha << 24);
1654 writel(register_data, &pregister->mlcrgblayer[0].mlctpcolor);
1655 } else if (layer == 1) {
1656 register_data =
1657 readl(&pregister->mlcrgblayer[1].mlctpcolor) & 0x00ffffff;
1658 register_data = register_data | (alpha << 24);
1659 writel(register_data, &pregister->mlcrgblayer[1].mlctpcolor);
1660 } else if (layer == 2) {
1661 register_data =
1662 readl(&pregister->mlcrgblayer[1].mlctpcolor) & 0x00ffffff;
1663 register_data = register_data | (alpha << 24);
1664 writel(register_data, &pregister->mlcrgblayer2.mlctpcolor);
1665 } else {
1666 register_data =
1667 readl(&pregister->mlcvideolayer.mlctpcolor) & 0x00ffffff;
1668 register_data = register_data | (alpha << 24);
1669 writel(register_data, &pregister->mlcvideolayer.mlctpcolor);
1670 }
1671 }
1672
nx_mlc_is_under_flow(u32 module_index)1673 int nx_mlc_is_under_flow(u32 module_index)
1674 {
1675 const u32 underflow_pend_pos = 31;
1676 const u32 underflow_pend_mask = 1ul << underflow_pend_pos;
1677
1678 return (int)((__g_module_variables[module_index].pregister->mlccontrolt
1679 & underflow_pend_mask) >> underflow_pend_pos);
1680 }
1681
nx_mlc_set_gamma_table(u32 module_index,int enb,struct nx_mlc_gamma_table_parameter * p_gammatable)1682 void nx_mlc_set_gamma_table(u32 module_index, int enb,
1683 struct nx_mlc_gamma_table_parameter *p_gammatable)
1684 {
1685 register struct nx_mlc_register_set *pregister;
1686 u32 i, regval = 0;
1687
1688 pregister = __g_module_variables[module_index].pregister;
1689 if (enb == 1) {
1690 regval = readl(&pregister->mlcgammacont);
1691
1692 regval = (1 << 11) | (1 << 9) | (1 << 3);
1693 writel(regval, &pregister->mlcgammacont);
1694
1695 regval = regval | (1 << 10) | (1 << 8) | (1 << 2);
1696 writel(regval, &pregister->mlcgammacont);
1697
1698 for (i = 0; i < 256; i++) {
1699 nx_mlc_set_rgblayer_rgamma_table(module_index, i,
1700 p_gammatable->r_table[i]);
1701 nx_mlc_set_rgblayer_ggamma_table(module_index, i,
1702 p_gammatable->g_table[i]);
1703 nx_mlc_set_rgblayer_bgamma_table(module_index, i,
1704 p_gammatable->b_table[i]);
1705 }
1706
1707 regval = regval | (p_gammatable->alphaselect << 5) |
1708 (p_gammatable->yuvgammaenb << 4 |
1709 p_gammatable->allgammaenb << 4) |
1710 (p_gammatable->rgbgammaenb << 1 |
1711 p_gammatable->allgammaenb << 1) |
1712 (p_gammatable->ditherenb << 1);
1713 writel(regval, &pregister->mlcgammacont);
1714 } else {
1715 regval = regval & ~(1 << 10) & ~(1 << 8) & ~(1 << 2);
1716 writel(regval, &pregister->mlcgammacont);
1717
1718 regval = regval & ~(1 << 11) & ~(1 << 9) & ~(1 << 3);
1719 writel(regval, &pregister->mlcgammacont);
1720 }
1721 }
1722
nx_mlc_get_rgblayer_stride(u32 module_index,u32 layer,s32 * hstride,s32 * vstride)1723 void nx_mlc_get_rgblayer_stride(u32 module_index, u32 layer, s32 *hstride,
1724 s32 *vstride)
1725 {
1726 unsigned int hs, vs;
1727 register struct nx_mlc_register_set *pregister;
1728
1729 pregister = __g_module_variables[module_index].pregister;
1730
1731 hs = readl(&pregister->mlcrgblayer[layer].mlchstride);
1732 vs = readl(&pregister->mlcrgblayer[layer].mlcvstride);
1733
1734 if (hstride)
1735 *(s32 *)hstride = hs;
1736
1737 if (vstride)
1738 *(s32 *)vstride = vs;
1739 }
1740
nx_mlc_get_rgblayer_address(u32 module_index,u32 layer,u32 * phys_address)1741 void nx_mlc_get_rgblayer_address(u32 module_index, u32 layer,
1742 u32 *phys_address)
1743 {
1744 u32 pa;
1745 register struct nx_mlc_register_set *pregister;
1746
1747 pregister = __g_module_variables[module_index].pregister;
1748 pa = readl(&pregister->mlcrgblayer[layer].mlcaddress);
1749
1750 if (phys_address)
1751 *(u32 *)phys_address = pa;
1752 }
1753
nx_mlc_get_position(u32 module_index,u32 layer,int * left,int * top,int * right,int * bottom)1754 void nx_mlc_get_position(u32 module_index, u32 layer, int *left, int *top,
1755 int *right, int *bottom)
1756 {
1757 int lr, tb;
1758 register struct nx_mlc_register_set *pregister;
1759
1760 pregister = __g_module_variables[module_index].pregister;
1761
1762 lr = readl(&pregister->mlcrgblayer[layer].mlcleftright);
1763 tb = readl(&pregister->mlcrgblayer[layer].mlctopbottom);
1764
1765 if (left)
1766 *(int *)left = ((lr >> 16) & 0xFFUL);
1767
1768 if (top)
1769 *(int *)top = ((tb >> 16) & 0xFFUL);
1770
1771 if (right)
1772 *(int *)right = ((lr >> 0) & 0xFFUL);
1773
1774 if (bottom)
1775 *(int *)bottom = ((tb >> 0) & 0xFFUL);
1776 }
1777
nx_mlc_get_video_layer_address_yuyv(u32 module_index,u32 * address,u32 * stride)1778 void nx_mlc_get_video_layer_address_yuyv(u32 module_index, u32 *address,
1779 u32 *stride)
1780 {
1781 u32 a, s;
1782 register struct nx_mlc_register_set *pregister;
1783
1784 pregister = __g_module_variables[module_index].pregister;
1785 a = readl(&pregister->mlcvideolayer.mlcaddress);
1786 s = readl(&pregister->mlcvideolayer.mlcvstride);
1787
1788 if (address)
1789 *(u32 *)address = a;
1790
1791 if (stride)
1792 *(u32 *)stride = s;
1793 }
1794
nx_mlc_get_video_layer_address(u32 module_index,u32 * lu_address,u32 * cb_address,u32 * cr_address)1795 void nx_mlc_get_video_layer_address(u32 module_index, u32 *lu_address,
1796 u32 *cb_address, u32 *cr_address)
1797 {
1798 u32 lua, cba, cra;
1799 register struct nx_mlc_register_set *pregister;
1800
1801 pregister = __g_module_variables[module_index].pregister;
1802
1803 lua = readl(&pregister->mlcvideolayer.mlcaddress);
1804 cba = readl(&pregister->mlcvideolayer.mlcaddresscb);
1805 cra = readl(&pregister->mlcvideolayer.mlcaddresscr);
1806
1807 if (lu_address)
1808 *(u32 *)lu_address = lua;
1809
1810 if (cb_address)
1811 *(u32 *)cb_address = cba;
1812
1813 if (cr_address)
1814 *(u32 *)cr_address = cra;
1815 }
1816
nx_mlc_get_video_layer_stride(u32 module_index,u32 * lu_stride,u32 * cb_stride,u32 * cr_stride)1817 void nx_mlc_get_video_layer_stride(u32 module_index, u32 *lu_stride,
1818 u32 *cb_stride, u32 *cr_stride)
1819 {
1820 u32 lus, cbs, crs;
1821 register struct nx_mlc_register_set *pregister;
1822
1823 pregister = __g_module_variables[module_index].pregister;
1824
1825 lus = readl(&pregister->mlcvideolayer.mlcvstride);
1826 cbs = readl(&pregister->mlcvideolayer.mlcvstridecb);
1827 crs = readl(&pregister->mlcvideolayer.mlcvstridecr);
1828
1829 if (lu_stride)
1830 *(u32 *)lu_stride = lus;
1831
1832 if (cb_stride)
1833 *(u32 *)cb_stride = cbs;
1834
1835 if (cr_stride)
1836 *(u32 *)cr_stride = crs;
1837 }
1838
nx_mlc_get_video_position(u32 module_index,int * left,int * top,int * right,int * bottom)1839 void nx_mlc_get_video_position(u32 module_index, int *left, int *top,
1840 int *right, int *bottom)
1841 {
1842 int lr, tb;
1843 register struct nx_mlc_register_set *pregister;
1844
1845 pregister = __g_module_variables[module_index].pregister;
1846
1847 lr = readl(&pregister->mlcvideolayer.mlcleftright);
1848 tb = readl(&pregister->mlcvideolayer.mlctopbottom);
1849
1850 if (left)
1851 *(int *)left = ((lr >> 16) & 0xFFUL);
1852
1853 if (top)
1854 *(int *)top = ((tb >> 16) & 0xFFUL);
1855
1856 if (right)
1857 *(int *)right = ((lr >> 0) & 0xFFUL);
1858
1859 if (bottom)
1860 *(int *)bottom = ((tb >> 0) & 0xFFUL);
1861 }
1862