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
13static struct {
14	struct nx_mlc_register_set *pregister;
15} __g_module_variables[NUMBER_OF_MLC_MODULE] = { { NULL, },};
16
17int 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
30u32 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
37void 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
43void *nx_mlc_get_base_address(u32 module_index)
44{
45	return (void *)__g_module_variables[module_index].pregister;
46}
47
48void 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
74enum 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
85void 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
112enum 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
128void 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
144int 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
154void 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
171int 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
181void 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
194int 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
204void 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
221int 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
230void 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
247int 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
256void 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
273void 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
284void 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
297void 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
305void 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
325int 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
346void 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
371int 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
388void 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
407void 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
442void 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
468void 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
495u32 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
618void 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
637void 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
651void 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
678void 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
693int 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
702void 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
717int 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
726void 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
757void 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
772void 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
783void 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
806void 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
830void 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
862void 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
887void 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
898void 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
909void 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
920void 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
935int 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
944void 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
956void 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
967void 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
977void 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
998void 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
1023void 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
1042void 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
1082void 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
1093void 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
1113void 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
1130int 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
1140void 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
1158int 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
1171void 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
1194void 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
1218void 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
1250void 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
1275void 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
1290int 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
1299void 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
1312void 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
1330void 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
1365u32 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
1379void 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
1413void 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
1447void 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
1475void 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
1520void 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
1565void 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
1607void 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
1624void 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
1639void 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
1673int 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
1682void 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
1723void 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
1741void 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
1754void 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
1778void 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
1795void 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
1817void 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
1839void 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