// SPDX-License-Identifier: GPL-2.0+ /* * Copyright (C) 2016 Nexell Co., Ltd. * * Author: junghyun, kim */ #include #include #include "s5pxx18_soc_mlc.h" static struct { struct nx_mlc_register_set *pregister; } __g_module_variables[NUMBER_OF_MLC_MODULE] = { { NULL, },}; int nx_mlc_initialize(void) { static int binit; u32 i; if (binit == 0) { for (i = 0; i < NUMBER_OF_MLC_MODULE; i++) __g_module_variables[i].pregister = NULL; binit = 1; } return 1; } u32 nx_mlc_get_physical_address(u32 module_index) { const u32 physical_addr[] = PHY_BASEADDR_MLC_LIST; return physical_addr[module_index]; } void nx_mlc_set_base_address(u32 module_index, void *base_address) { __g_module_variables[module_index].pregister = (struct nx_mlc_register_set *)base_address; } void *nx_mlc_get_base_address(u32 module_index) { return (void *)__g_module_variables[module_index].pregister; } void nx_mlc_set_clock_pclk_mode(u32 module_index, enum nx_pclkmode mode) { const u32 pclkmode_pos = 3; u32 clkmode = 0; register u32 regvalue; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; switch (mode) { case nx_pclkmode_dynamic: clkmode = 0; break; case nx_pclkmode_always: clkmode = 1; break; default: break; } regvalue = pregister->mlcclkenb; regvalue &= ~(1ul << pclkmode_pos); regvalue |= (clkmode & 0x01) << pclkmode_pos; writel(regvalue, &pregister->mlcclkenb); } enum nx_pclkmode nx_mlc_get_clock_pclk_mode(u32 module_index) { const u32 pclkmode_pos = 3; if (__g_module_variables[module_index].pregister->mlcclkenb & (1ul << pclkmode_pos)) { return nx_pclkmode_always; } return nx_pclkmode_dynamic; } void nx_mlc_set_clock_bclk_mode(u32 module_index, enum nx_bclkmode mode) { register u32 regvalue; register struct nx_mlc_register_set *pregister; u32 clkmode = 0; pregister = __g_module_variables[module_index].pregister; switch (mode) { case nx_bclkmode_disable: clkmode = 0; break; case nx_bclkmode_dynamic: clkmode = 2; break; case nx_bclkmode_always: clkmode = 3; break; default: break; } regvalue = pregister->mlcclkenb; regvalue &= ~(0x3); regvalue |= clkmode & 0x3; writel(regvalue, &pregister->mlcclkenb); } enum nx_bclkmode nx_mlc_get_clock_bclk_mode(u32 module_index) { const u32 bclkmode = 3ul << 0; switch (__g_module_variables[module_index].pregister->mlcclkenb & bclkmode) { case 0: return nx_bclkmode_disable; case 2: return nx_bclkmode_dynamic; case 3: return nx_bclkmode_always; } return nx_bclkmode_disable; } void nx_mlc_set_top_power_mode(u32 module_index, int bpower) { const u32 pixelbuffer_pwd_pos = 11; const u32 pixelbuffer_pwd_mask = 1ul << pixelbuffer_pwd_pos; const u32 dittyflag_mask = 1ul << 3; register struct nx_mlc_register_set *pregister; register u32 regvalue; pregister = __g_module_variables[module_index].pregister; regvalue = pregister->mlccontrolt; regvalue &= ~(pixelbuffer_pwd_mask | dittyflag_mask); regvalue |= (bpower << pixelbuffer_pwd_pos); writel(regvalue, &pregister->mlccontrolt); } int nx_mlc_get_top_power_mode(u32 module_index) { const u32 pixelbuffer_pwd_pos = 11; const u32 pixelbuffer_pwd_mask = 1ul << pixelbuffer_pwd_pos; return (int)((__g_module_variables[module_index].pregister->mlccontrolt & pixelbuffer_pwd_mask) >> pixelbuffer_pwd_pos); } void nx_mlc_set_top_sleep_mode(u32 module_index, int bsleep) { const u32 pixelbuffer_sld_pos = 10; const u32 pixelbuffer_sld_mask = 1ul << pixelbuffer_sld_pos; const u32 dittyflag_mask = 1ul << 3; register struct nx_mlc_register_set *pregister; register u32 regvalue; bsleep = (int)((u32)bsleep ^ 1); pregister = __g_module_variables[module_index].pregister; regvalue = pregister->mlccontrolt; regvalue &= ~(pixelbuffer_sld_mask | dittyflag_mask); regvalue |= (bsleep << pixelbuffer_sld_pos); writel(regvalue, &pregister->mlccontrolt); } int nx_mlc_get_top_sleep_mode(u32 module_index) { const u32 pixelbuffer_sld_pos = 11; const u32 pixelbuffer_sld_mask = 1ul << pixelbuffer_sld_pos; return (int)(((__g_module_variables[module_index].pregister->mlccontrolt & pixelbuffer_sld_mask) >> pixelbuffer_sld_pos) ^ 0x01); } void nx_mlc_set_top_dirty_flag(u32 module_index) { const u32 dirtyflag = 1ul << 3; register struct nx_mlc_register_set *pregister; register u32 regvalue; pregister = __g_module_variables[module_index].pregister; regvalue = pregister->mlccontrolt; regvalue |= dirtyflag; writel(regvalue, &pregister->mlccontrolt); } int nx_mlc_get_top_dirty_flag(u32 module_index) { const u32 dirtyflag_pos = 3; const u32 dirtyflag_mask = 1ul << dirtyflag_pos; return (int)((readl(&__g_module_variables[module_index] .pregister->mlccontrolt) & dirtyflag_mask) >> dirtyflag_pos); } void nx_mlc_set_mlc_enable(u32 module_index, int benb) { const u32 mlcenb_pos = 1; const u32 mlcenb_mask = 1ul << mlcenb_pos; const u32 dirtyflag_pos = 3; const u32 dirtyflag_mask = 1ul << dirtyflag_pos; register u32 regvalue; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; regvalue = pregister->mlccontrolt; regvalue &= ~(mlcenb_mask | dirtyflag_mask); regvalue |= (benb << mlcenb_pos); writel(regvalue, &pregister->mlccontrolt); } int nx_mlc_get_mlc_enable(u32 module_index) { const u32 mlcenb_pos = 1; const u32 mlcenb_mask = 1ul << mlcenb_pos; return (int)((__g_module_variables[module_index].pregister->mlccontrolt & mlcenb_mask) >> mlcenb_pos); } void nx_mlc_set_field_enable(u32 module_index, int benb) { const u32 fieldenb_pos = 0; const u32 fieldenb_mask = 1ul << fieldenb_pos; const u32 dirtyflag_pos = 3; const u32 dirtyflag_mask = 1ul << dirtyflag_pos; register u32 regvalue; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; regvalue = pregister->mlccontrolt; regvalue &= ~(fieldenb_mask | dirtyflag_mask); regvalue |= (benb << fieldenb_pos); writel(regvalue, &pregister->mlccontrolt); } int nx_mlc_get_field_enable(u32 module_index) { const u32 fieldenb_pos = 0; const u32 fieldenb_mask = 1ul << fieldenb_pos; return (int)(__g_module_variables[module_index].pregister->mlccontrolt & fieldenb_mask); } void nx_mlc_set_layer_priority(u32 module_index, enum nx_mlc_priority priority) { const u32 priority_pos = 8; const u32 priority_mask = 0x03 << priority_pos; const u32 dirtyflag_pos = 3; const u32 dirtyflag_mask = 1ul << dirtyflag_pos; register struct nx_mlc_register_set *pregister; register u32 regvalue; pregister = __g_module_variables[module_index].pregister; regvalue = pregister->mlccontrolt; regvalue &= ~(priority_mask | dirtyflag_mask); regvalue |= (priority << priority_pos); writel(regvalue, &pregister->mlccontrolt); } void nx_mlc_set_screen_size(u32 module_index, u32 width, u32 height) { register struct nx_mlc_register_set *pregister; register u32 regvalue; pregister = __g_module_variables[module_index].pregister; regvalue = ((height - 1) << 16) | (width - 1); writel(regvalue, &pregister->mlcscreensize); } void nx_mlc_get_screen_size(u32 module_index, u32 *pwidth, u32 *pheight) { register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; if (pwidth) *pwidth = (pregister->mlcscreensize & 0x0fff) + 1; if (pheight) *pheight = ((pregister->mlcscreensize >> 16) & 0x0fff) + 1; } void nx_mlc_set_background(u32 module_index, u32 color) { register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; writel(color, &pregister->mlcbgcolor); } void nx_mlc_set_dirty_flag(u32 module_index, u32 layer) { register struct nx_mlc_register_set *pregister; register u32 regvalue; const u32 dirtyflg_mask = 1ul << 4; pregister = __g_module_variables[module_index].pregister; if (layer == 0 || layer == 1) { regvalue = pregister->mlcrgblayer[layer].mlccontrol; regvalue |= dirtyflg_mask; writel(regvalue, &pregister->mlcrgblayer[layer].mlccontrol); } else if (layer == 3) { regvalue = pregister->mlcvideolayer.mlccontrol; regvalue |= dirtyflg_mask; writel(regvalue, &pregister->mlcvideolayer.mlccontrol); } } int nx_mlc_get_dirty_flag(u32 module_index, u32 layer) { const u32 dirtyflg_pos = 4; const u32 dirtyflg_mask = 1ul << dirtyflg_pos; if (layer == 0 || layer == 1) { return (int)((__g_module_variables[module_index] .pregister->mlcrgblayer[layer] .mlccontrol & dirtyflg_mask) >> dirtyflg_pos); } else if (layer == 2) { return (int)((__g_module_variables[module_index] .pregister->mlcrgblayer2.mlccontrol & dirtyflg_mask) >> dirtyflg_pos); } else if (layer == 3) { return (int)((__g_module_variables[module_index] .pregister->mlcvideolayer.mlccontrol & dirtyflg_mask) >> dirtyflg_pos); } return 0; } void nx_mlc_set_layer_enable(u32 module_index, u32 layer, int benb) { const u32 layerenb_pos = 5; const u32 layerenb_mask = 0x01 << layerenb_pos; const u32 dirtyflag_pos = 4; const u32 dirtyflag_mask = 1ul << dirtyflag_pos; register u32 regvalue; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; if (layer == 0 || layer == 1) { regvalue = pregister->mlcrgblayer[layer].mlccontrol; regvalue &= ~(layerenb_mask | dirtyflag_mask); regvalue |= (benb << layerenb_pos); writel(regvalue, &pregister->mlcrgblayer[layer].mlccontrol); } else if (layer == 3) { regvalue = pregister->mlcvideolayer.mlccontrol; regvalue &= ~(layerenb_mask | dirtyflag_mask); regvalue |= (benb << layerenb_pos); writel(regvalue, &pregister->mlcvideolayer.mlccontrol); } } int nx_mlc_get_layer_enable(u32 module_index, u32 layer) { const u32 layerenb_pos = 5; const u32 layerenb_mask = 0x01 << layerenb_pos; if (layer == 0 || layer == 1) { return (int)((__g_module_variables[module_index] .pregister->mlcrgblayer[layer] .mlccontrol & layerenb_mask) >> layerenb_pos); } else if (layer == 3) { return (int)((__g_module_variables[module_index] .pregister->mlcvideolayer.mlccontrol & layerenb_mask) >> layerenb_pos); } return 0; } void nx_mlc_set_lock_size(u32 module_index, u32 layer, u32 locksize) { const u32 locksize_mask = 3ul << 12; const u32 dirtyflag_pos = 4; const u32 dirtyflag_mask = 1ul << dirtyflag_pos; register struct nx_mlc_register_set *pregister; register u32 regvalue; pregister = __g_module_variables[module_index].pregister; locksize >>= 3; if (layer == 0 || layer == 1) { regvalue = pregister->mlcrgblayer[layer].mlccontrol; regvalue &= ~(locksize_mask | dirtyflag_mask); regvalue |= (locksize << 12); writel(regvalue, &pregister->mlcrgblayer[layer].mlccontrol); } } void nx_mlc_set_alpha_blending(u32 module_index, u32 layer, int benb, u32 alpha) { const u32 blendenb_pos = 2; const u32 blendenb_mask = 0x01 << blendenb_pos; const u32 dirtyflag_pos = 4; const u32 dirtyflag_mask = 1ul << dirtyflag_pos; const u32 alpha_pos = 28; const u32 alpha_mask = 0xf << alpha_pos; register u32 regvalue; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; if (layer == 0 || layer == 1) { regvalue = pregister->mlcrgblayer[layer].mlccontrol; regvalue &= ~(blendenb_mask | dirtyflag_mask); regvalue |= (benb << blendenb_pos); writel(regvalue, &pregister->mlcrgblayer[layer].mlccontrol); regvalue = pregister->mlcrgblayer[layer].mlctpcolor; regvalue &= ~alpha_mask; regvalue |= alpha << alpha_pos; writel(regvalue, &pregister->mlcrgblayer[layer].mlctpcolor); } else if (layer == 3) { regvalue = pregister->mlcvideolayer.mlccontrol; regvalue &= ~(blendenb_mask | dirtyflag_mask); regvalue |= (benb << blendenb_pos); writel(regvalue, &pregister->mlcvideolayer.mlccontrol); writel(alpha << alpha_pos, &pregister->mlcvideolayer.mlctpcolor); } } void nx_mlc_set_transparency(u32 module_index, u32 layer, int benb, u32 color) { const u32 tpenb_pos = 0; const u32 tpenb_mask = 0x01 << tpenb_pos; const u32 dirtyflag_pos = 4; const u32 dirtyflag_mask = 1ul << dirtyflag_pos; const u32 tpcolor_pos = 0; const u32 tpcolor_mask = ((1 << 24) - 1) << tpcolor_pos; register u32 regvalue; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; if (layer == 0 || layer == 1) { regvalue = pregister->mlcrgblayer[layer].mlccontrol; regvalue &= ~(tpenb_mask | dirtyflag_mask); regvalue |= (benb << tpenb_pos); writel(regvalue, &pregister->mlcrgblayer[layer].mlccontrol); regvalue = pregister->mlcrgblayer[layer].mlctpcolor; regvalue &= ~tpcolor_mask; regvalue |= (color & tpcolor_mask); writel(regvalue, &pregister->mlcrgblayer[layer].mlctpcolor); } } void nx_mlc_set_color_inversion(u32 module_index, u32 layer, int benb, u32 color) { const u32 invenb_pos = 1; const u32 invenb_mask = 0x01 << invenb_pos; const u32 dirtyflag_pos = 4; const u32 dirtyflag_mask = 1ul << dirtyflag_pos; const u32 invcolor_pos = 0; const u32 invcolor_mask = ((1 << 24) - 1) << invcolor_pos; register u32 regvalue; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; if (layer == 0 || layer == 1) { regvalue = pregister->mlcrgblayer[layer].mlccontrol; regvalue &= ~(invenb_mask | dirtyflag_mask); regvalue |= (benb << invenb_pos); writel(regvalue, &pregister->mlcrgblayer[layer].mlccontrol); regvalue = pregister->mlcrgblayer[layer].mlcinvcolor; regvalue &= ~invcolor_mask; regvalue |= (color & invcolor_mask); writel(regvalue, &pregister->mlcrgblayer[layer].mlcinvcolor); } } u32 nx_mlc_get_extended_color(u32 module_index, u32 color, enum nx_mlc_rgbfmt format) { u32 rgb[3] = { 0, }; u32 bw[3] = { 0, }; u32 bp[3] = { 0, }; u32 blank = 0; u32 fill = 0; u32 i = 0; switch (format) { case nx_mlc_rgbfmt_r5g6b5: bw[0] = 5; bw[1] = 6; bw[2] = 5; bp[0] = 11; bp[1] = 5; bp[2] = 0; break; case nx_mlc_rgbfmt_b5g6r5: bw[0] = 5; bw[1] = 6; bw[2] = 5; bp[0] = 0; bp[1] = 5; bp[2] = 11; break; case nx_mlc_rgbfmt_x1r5g5b5: case nx_mlc_rgbfmt_a1r5g5b5: bw[0] = 5; bw[1] = 5; bw[2] = 5; bp[0] = 10; bp[1] = 5; bp[2] = 0; break; case nx_mlc_rgbfmt_x1b5g5r5: case nx_mlc_rgbfmt_a1b5g5r5: bw[0] = 5; bw[1] = 5; bw[2] = 5; bp[0] = 0; bp[1] = 5; bp[2] = 10; break; case nx_mlc_rgbfmt_x4r4g4b4: case nx_mlc_rgbfmt_a4r4g4b4: bw[0] = 4; bw[1] = 4; bw[2] = 4; bp[0] = 8; bp[1] = 4; bp[2] = 0; break; case nx_mlc_rgbfmt_x4b4g4r4: case nx_mlc_rgbfmt_a4b4g4r4: bw[0] = 4; bw[1] = 4; bw[2] = 4; bp[0] = 0; bp[1] = 4; bp[2] = 8; break; case nx_mlc_rgbfmt_x8r3g3b2: case nx_mlc_rgbfmt_a8r3g3b2: bw[0] = 3; bw[1] = 3; bw[2] = 2; bp[0] = 5; bp[1] = 2; bp[2] = 0; break; case nx_mlc_rgbfmt_x8b3g3r2: case nx_mlc_rgbfmt_a8b3g3r2: bw[0] = 2; bw[1] = 3; bw[2] = 3; bp[0] = 0; bp[1] = 2; bp[2] = 5; break; case nx_mlc_rgbfmt_r8g8b8: case nx_mlc_rgbfmt_a8r8g8b8: bw[0] = 8; bw[1] = 8; bw[2] = 8; bp[0] = 16; bp[1] = 8; bp[2] = 0; break; case nx_mlc_rgbfmt_b8g8r8: case nx_mlc_rgbfmt_a8b8g8r8: bw[0] = 8; bw[1] = 8; bw[2] = 8; bp[0] = 0; bp[1] = 8; bp[2] = 16; break; default: break; } for (i = 0; i < 3; i++) { rgb[i] = (color >> bp[i]) & ((u32)(1 << bw[i]) - 1); fill = bw[i]; blank = 8 - fill; rgb[i] <<= blank; while (blank > 0) { rgb[i] |= (rgb[i] >> fill); blank -= fill; fill += fill; } } return (rgb[0] << 16) | (rgb[1] << 8) | (rgb[2] << 0); } void nx_mlc_set_format_rgb(u32 module_index, u32 layer, enum nx_mlc_rgbfmt format) { const u32 dirtyflag_pos = 4; const u32 dirtyflag_mask = 1ul << dirtyflag_pos; const u32 format_mask = 0xffff0000ul; register u32 regvalue; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; if (layer == 0 || layer == 1) { regvalue = pregister->mlcrgblayer[layer].mlccontrol; regvalue &= ~(format_mask | dirtyflag_mask); regvalue |= (u32)format; writel(regvalue, &pregister->mlcrgblayer[layer].mlccontrol); } } void nx_mlc_set_format_yuv(u32 module_index, enum nx_mlc_yuvfmt format) { const u32 format_mask = 0xffff0000ul; register u32 temp; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; temp = pregister->mlcvideolayer.mlccontrol; temp &= ~format_mask; temp |= (u32)format; writel(temp, &pregister->mlcvideolayer.mlccontrol); } void nx_mlc_set_position(u32 module_index, u32 layer, s32 sx, s32 sy, s32 ex, s32 ey) { register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; if (layer == 0 || layer == 1) { writel((((u32)sx & 0xffful) << 16) | ((u32)ex & 0xffful), &pregister->mlcrgblayer[layer].mlcleftright); writel((((u32)sy & 0xffful) << 16) | ((u32)ey & 0xffful), &pregister->mlcrgblayer[layer].mlctopbottom); } else if (layer == 2) { writel((((u32)sx & 0xffful) << 16) | ((u32)ex & 0xffful), &pregister->mlcrgblayer2.mlcleftright); writel((((u32)sy & 0xffful) << 16) | ((u32)ey & 0xffful), &pregister->mlcrgblayer2.mlctopbottom); } else if (layer == 3) { writel((((u32)sx & 0xffful) << 16) | ((u32)ex & 0xffful), &pregister->mlcvideolayer.mlcleftright); writel((((u32)sy & 0xffful) << 16) | ((u32)ey & 0xffful), &pregister->mlcvideolayer.mlctopbottom); } } void nx_mlc_set_dither_enable_when_using_gamma(u32 module_index, int benable) { const u32 ditherenb_bitpos = 0; const u32 ditherenb_mask = 1 << ditherenb_bitpos; register struct nx_mlc_register_set *pregister; register u32 read_value; pregister = __g_module_variables[module_index].pregister; read_value = pregister->mlcgammacont; read_value &= ~ditherenb_mask; read_value |= ((u32)benable << ditherenb_bitpos); writel(read_value, &pregister->mlcgammacont); } int nx_mlc_get_dither_enable_when_using_gamma(u32 module_index) { const u32 ditherenb_bitpos = 0; const u32 ditherenb_mask = 1 << ditherenb_bitpos; return (int)(__g_module_variables[module_index].pregister->mlcgammacont & ditherenb_mask); } void nx_mlc_set_gamma_priority(u32 module_index, int bvideolayer) { const u32 alphaselect_bitpos = 5; const u32 alphaselect_mask = 1 << alphaselect_bitpos; register struct nx_mlc_register_set *pregister; register u32 read_value; pregister = __g_module_variables[module_index].pregister; read_value = pregister->mlcgammacont; read_value &= ~alphaselect_mask; read_value |= ((u32)bvideolayer << alphaselect_bitpos); writel(read_value, &pregister->mlcgammacont); } int nx_mlc_get_gamma_priority(u32 module_index) { const u32 alphaselect_bitpos = 5; const u32 alphaselect_mask = 1 << alphaselect_bitpos; return (int)((__g_module_variables[module_index].pregister->mlcgammacont & alphaselect_mask) >> alphaselect_bitpos); } void nx_mlc_set_rgblayer_invalid_position(u32 module_index, u32 layer, u32 region, s32 sx, s32 sy, s32 ex, s32 ey, int benb) { const u32 invalidenb_pos = 28; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; if (layer == 0 || layer == 1) { if (region == 0) { writel(((benb << invalidenb_pos) | ((sx & 0x7ff) << 16) | (ex & 0x7ff)), &pregister->mlcrgblayer[layer] .mlcinvalidleftright0); writel((((sy & 0x7ff) << 16) | (ey & 0x7ff)), &pregister->mlcrgblayer[layer] .mlcinvalidtopbottom0); } else { writel(((benb << invalidenb_pos) | ((sx & 0x7ff) << 16) | (ex & 0x7ff)), &pregister->mlcrgblayer[layer] .mlcinvalidleftright1); writel((((sy & 0x7ff) << 16) | (ey & 0x7ff)), &pregister->mlcrgblayer[layer] .mlcinvalidtopbottom1); } } } void nx_mlc_set_rgblayer_stride(u32 module_index, u32 layer, s32 hstride, s32 vstride) { register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; if (layer == 0 || layer == 1) { writel(hstride, &pregister->mlcrgblayer[layer].mlchstride); writel(vstride, &pregister->mlcrgblayer[layer].mlcvstride); } else if (layer == 2) { writel(hstride, &pregister->mlcrgblayer2.mlchstride); writel(vstride, &pregister->mlcrgblayer2.mlcvstride); } } void nx_mlc_set_rgblayer_address(u32 module_index, u32 layer, u32 addr) { register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; if (layer == 0 || layer == 1) writel(addr, &pregister->mlcrgblayer[layer].mlcaddress); else if (layer == 2) writel(addr, &pregister->mlcrgblayer2.mlcaddress); } void nx_mlc_set_rgblayer_gama_table_power_mode(u32 module_index, int bred, int bgreen, int bblue) { const u32 bgammatable_pwd_bitpos = 11; const u32 ggammatable_pwd_bitpos = 9; const u32 rgammatable_pwd_bitpos = 3; const u32 bgammatable_pwd_mask = (1 << bgammatable_pwd_bitpos); const u32 ggammatable_pwd_mask = (1 << ggammatable_pwd_bitpos); const u32 rgammatable_pwd_mask = (1 << rgammatable_pwd_bitpos); register u32 read_value; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; read_value = pregister->mlcgammacont; read_value &= ~(bgammatable_pwd_mask | ggammatable_pwd_mask | rgammatable_pwd_mask); read_value |= (((u32)bred << rgammatable_pwd_bitpos) | ((u32)bgreen << ggammatable_pwd_bitpos) | ((u32)bblue << bgammatable_pwd_bitpos)); writel(read_value, &pregister->mlcgammacont); } void nx_mlc_get_rgblayer_gama_table_power_mode(u32 module_index, int *pbred, int *pbgreen, int *pbblue) { const u32 bgammatable_pwd_bitpos = 11; const u32 ggammatable_pwd_bitpos = 9; const u32 rgammatable_pwd_bitpos = 3; const u32 bgammatable_pwd_mask = (1 << bgammatable_pwd_bitpos); const u32 ggammatable_pwd_mask = (1 << ggammatable_pwd_bitpos); const u32 rgammatable_pwd_mask = (1 << rgammatable_pwd_bitpos); register u32 read_value; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; read_value = pregister->mlcgammacont; if (pbred) *pbred = (read_value & rgammatable_pwd_mask) ? 1 : 0; if (pbgreen) *pbgreen = (read_value & ggammatable_pwd_mask) ? 1 : 0; if (pbblue) *pbblue = (read_value & bgammatable_pwd_mask) ? 1 : 0; } void nx_mlc_set_rgblayer_gama_table_sleep_mode(u32 module_index, int bred, int bgreen, int bblue) { const u32 bgammatable_sld_bitpos = 10; const u32 ggammatable_sld_bitpos = 8; const u32 rgammatable_sld_bitpos = 2; const u32 bgammatable_sld_mask = (1 << bgammatable_sld_bitpos); const u32 ggammatable_sld_mask = (1 << ggammatable_sld_bitpos); const u32 rgammatable_sld_mask = (1 << rgammatable_sld_bitpos); register u32 read_value; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; read_value = pregister->mlcgammacont; if (bred) read_value &= ~rgammatable_sld_mask; else read_value |= rgammatable_sld_mask; if (bgreen) read_value &= ~ggammatable_sld_mask; else read_value |= ggammatable_sld_mask; if (bblue) read_value &= ~bgammatable_sld_mask; else read_value |= bgammatable_sld_mask; writel(read_value, &pregister->mlcgammacont); } void nx_mlc_get_rgblayer_gama_table_sleep_mode(u32 module_index, int *pbred, int *pbgreen, int *pbblue) { const u32 bgammatable_sld_bitpos = 10; const u32 ggammatable_sld_bitpos = 8; const u32 rgammatable_sld_bitpos = 2; const u32 bgammatable_sld_mask = (1 << bgammatable_sld_bitpos); const u32 ggammatable_sld_mask = (1 << ggammatable_sld_bitpos); const u32 rgammatable_sld_mask = (1 << rgammatable_sld_bitpos); register u32 read_value; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; read_value = pregister->mlcgammacont; if (pbred) *pbred = (read_value & rgammatable_sld_mask) ? 0 : 1; if (pbgreen) *pbgreen = (read_value & ggammatable_sld_mask) ? 0 : 1; if (pbblue) *pbblue = (read_value & bgammatable_sld_mask) ? 0 : 1; } void nx_mlc_set_rgblayer_rgamma_table(u32 module_index, u32 dwaddress, u32 dwdata) { register struct nx_mlc_register_set *pregister; const u32 tableaddr_bitpos = 24; pregister = __g_module_variables[module_index].pregister; writel(((dwaddress << tableaddr_bitpos) | dwdata), &pregister->mlcrgammatablewrite); } void nx_mlc_set_rgblayer_ggamma_table(u32 module_index, u32 dwaddress, u32 dwdata) { register struct nx_mlc_register_set *pregister; const u32 tableaddr_bitpos = 24; pregister = __g_module_variables[module_index].pregister; writel(((dwaddress << tableaddr_bitpos) | dwdata), &pregister->mlcggammatablewrite); } void nx_mlc_set_rgblayer_bgamma_table(u32 module_index, u32 dwaddress, u32 dwdata) { register struct nx_mlc_register_set *pregister; const u32 tableaddr_bitpos = 24; pregister = __g_module_variables[module_index].pregister; writel(((dwaddress << tableaddr_bitpos) | dwdata), &pregister->mlcbgammatablewrite); } void nx_mlc_set_rgblayer_gamma_enable(u32 module_index, int benable) { const u32 rgbgammaemb_bitpos = 1; const u32 rgbgammaemb_mask = 1 << rgbgammaemb_bitpos; register u32 read_value; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; read_value = pregister->mlcgammacont; read_value &= ~rgbgammaemb_mask; read_value |= (u32)benable << rgbgammaemb_bitpos; writel(read_value, &pregister->mlcgammacont); } int nx_mlc_get_rgblayer_gamma_enable(u32 module_index) { const u32 rgbgammaemb_bitpos = 1; const u32 rgbgammaemb_mask = 1 << rgbgammaemb_bitpos; return (int)((__g_module_variables[module_index].pregister->mlcgammacont & rgbgammaemb_mask) >> rgbgammaemb_bitpos); } void nx_mlc_set_video_layer_stride(u32 module_index, s32 lu_stride, s32 cb_stride, s32 cr_stride) { register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; writel(lu_stride, &pregister->mlcvideolayer.mlcvstride); writel(cb_stride, &pregister->mlcvideolayer.mlcvstridecb); writel(cr_stride, &pregister->mlcvideolayer.mlcvstridecr); } void nx_mlc_set_video_layer_address(u32 module_index, u32 lu_addr, u32 cb_addr, u32 cr_addr) { register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; writel(lu_addr, &pregister->mlcvideolayer.mlcaddress); writel(cb_addr, &pregister->mlcvideolayer.mlcaddresscb); writel(cr_addr, &pregister->mlcvideolayer.mlcaddresscr); } void nx_mlc_set_video_layer_address_yuyv(u32 module_index, u32 addr, s32 stride) { register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; writel(addr, &pregister->mlcvideolayer.mlcaddress); writel(stride, &pregister->mlcvideolayer.mlcvstride); } void nx_mlc_set_video_layer_scale_factor(u32 module_index, u32 hscale, u32 vscale, int bhlumaenb, int bhchromaenb, int bvlumaenb, int bvchromaenb) { const u32 filter_luma_pos = 28; const u32 filter_choma_pos = 29; const u32 scale_mask = ((1 << 23) - 1); register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; writel(((bhlumaenb << filter_luma_pos) | (bhchromaenb << filter_choma_pos) | (hscale & scale_mask)), &pregister->mlcvideolayer.mlchscale); writel(((bvlumaenb << filter_luma_pos) | (bvchromaenb << filter_choma_pos) | (vscale & scale_mask)), &pregister->mlcvideolayer.mlcvscale); } void nx_mlc_set_video_layer_scale_filter(u32 module_index, int bhlumaenb, int bhchromaenb, int bvlumaenb, int bvchromaenb) { const u32 filter_luma_pos = 28; const u32 filter_choma_pos = 29; const u32 scale_mask = ((1 << 23) - 1); register struct nx_mlc_register_set *pregister; register u32 read_value; pregister = __g_module_variables[module_index].pregister; read_value = pregister->mlcvideolayer.mlchscale; read_value &= scale_mask; read_value |= (bhlumaenb << filter_luma_pos) | (bhchromaenb << filter_choma_pos); writel(read_value, &pregister->mlcvideolayer.mlchscale); read_value = pregister->mlcvideolayer.mlcvscale; read_value &= scale_mask; read_value |= (bvlumaenb << filter_luma_pos) | (bvchromaenb << filter_choma_pos); writel(read_value, &pregister->mlcvideolayer.mlcvscale); } void nx_mlc_get_video_layer_scale_filter(u32 module_index, int *bhlumaenb, int *bhchromaenb, int *bvlumaenb, int *bvchromaenb) { const u32 filter_luma_pos = 28; const u32 filter_choma_pos = 29; const u32 filter_mask = 1ul; register struct nx_mlc_register_set *pregister; register u32 read_value; pregister = __g_module_variables[module_index].pregister; read_value = pregister->mlcvideolayer.mlchscale; *bhlumaenb = (read_value >> filter_luma_pos) & filter_mask; *bhchromaenb = (read_value >> filter_choma_pos) & filter_mask; read_value = pregister->mlcvideolayer.mlcvscale; *bvlumaenb = (read_value >> filter_luma_pos) & filter_mask; *bvchromaenb = (read_value >> filter_choma_pos) & filter_mask; } void 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) { const u32 filter_luma_pos = 28; const u32 filter_choma_pos = 29; const u32 scale_mask = ((1 << 23) - 1); register u32 hscale, vscale, cal_sh; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; if ((bhlumaenb || bhchromaenb) && dw > sw) { sw--; dw--; } hscale = (sw << 11) / dw; if ((bvlumaenb || bvchromaenb) && dh > sh) { sh--; dh--; vscale = (sh << 11) / dh; cal_sh = ((vscale * dh) >> 11); if (sh <= cal_sh) vscale--; } else { vscale = (sh << 11) / dh; } writel(((bhlumaenb << filter_luma_pos) | (bhchromaenb << filter_choma_pos) | (hscale & scale_mask)), &pregister->mlcvideolayer.mlchscale); writel(((bvlumaenb << filter_luma_pos) | (bvchromaenb << filter_choma_pos) | (vscale & scale_mask)), &pregister->mlcvideolayer.mlcvscale); } void nx_mlc_set_video_layer_luma_enhance(u32 module_index, u32 contrast, s32 brightness) { register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; writel((((u32)brightness & 0xfful) << 8) | contrast, &pregister->mlcvideolayer.mlcluenh); } void nx_mlc_set_video_layer_chroma_enhance(u32 module_index, u32 quadrant, s32 cb_a, s32 cb_b, s32 cr_a, s32 cr_b) { register struct nx_mlc_register_set *pregister; register u32 temp; pregister = __g_module_variables[module_index].pregister; temp = (((u32)cr_b & 0xfful) << 24) | (((u32)cr_a & 0xfful) << 16) | (((u32)cb_b & 0xfful) << 8) | (((u32)cb_a & 0xfful) << 0); if (quadrant > 0) { writel(temp, &pregister->mlcvideolayer.mlcchenh[quadrant - 1]); } else { writel(temp, &pregister->mlcvideolayer.mlcchenh[0]); writel(temp, &pregister->mlcvideolayer.mlcchenh[1]); writel(temp, &pregister->mlcvideolayer.mlcchenh[2]); writel(temp, &pregister->mlcvideolayer.mlcchenh[3]); } } void nx_mlc_set_video_layer_line_buffer_power_mode(u32 module_index, int benable) { const u32 linebuff_pwd_pos = 15; const u32 linebuff_pwd_mask = 1ul << linebuff_pwd_pos; const u32 dirtyflag_mask = 1ul << 4; register u32 regvalue; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; regvalue = pregister->mlcvideolayer.mlccontrol; regvalue &= ~(linebuff_pwd_mask | dirtyflag_mask); regvalue |= ((u32)benable << linebuff_pwd_pos); writel(regvalue, &pregister->mlcvideolayer.mlccontrol); } int nx_mlc_get_video_layer_line_buffer_power_mode(u32 module_index) { const u32 linebuff_pwd_pos = 15; const u32 linebuff_pwd_mask = 1ul << linebuff_pwd_pos; return (int)((__g_module_variables[module_index] .pregister->mlcvideolayer.mlccontrol & linebuff_pwd_mask) >> linebuff_pwd_pos); } void nx_mlc_set_video_layer_line_buffer_sleep_mode(u32 module_index, int benable) { const u32 linebuff_slmd_pos = 14; const u32 linebuff_slmd_mask = 1ul << linebuff_slmd_pos; const u32 dirtyflag_mask = 1ul << 4; register u32 regvalue; register struct nx_mlc_register_set *pregister; benable = (int)((u32)benable ^ 1); pregister = __g_module_variables[module_index].pregister; regvalue = pregister->mlcvideolayer.mlccontrol; regvalue &= ~(linebuff_slmd_mask | dirtyflag_mask); regvalue |= (benable << linebuff_slmd_pos); writel(regvalue, &pregister->mlcvideolayer.mlccontrol); } int nx_mlc_get_video_layer_line_buffer_sleep_mode(u32 module_index) { const u32 linebuff_slmd_pos = 14; const u32 linebuff_slmd_mask = 1ul << linebuff_slmd_pos; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; if (linebuff_slmd_mask & pregister->mlcvideolayer.mlccontrol) return 0; else return 1; } void nx_mlc_set_video_layer_gama_table_power_mode(u32 module_index, int by, int bu, int bv) { const u32 vgammatable_pwd_bitpos = 17; const u32 ugammatable_pwd_bitpos = 15; const u32 ygammatable_pwd_bitpos = 13; const u32 vgammatable_pwd_mask = (1 << vgammatable_pwd_bitpos); const u32 ugammatable_pwd_mask = (1 << ugammatable_pwd_bitpos); const u32 ygammatable_pwd_mask = (1 << ygammatable_pwd_bitpos); register u32 read_value; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; read_value = pregister->mlcgammacont; read_value &= ~(ygammatable_pwd_mask | ugammatable_pwd_mask | vgammatable_pwd_mask); read_value |= (((u32)by << ygammatable_pwd_bitpos) | ((u32)bu << ugammatable_pwd_bitpos) | ((u32)bv << vgammatable_pwd_bitpos)); writel(read_value, &pregister->mlcgammacont); } void nx_mlc_get_video_layer_gama_table_power_mode(u32 module_index, int *pby, int *pbu, int *pbv) { const u32 vgammatable_pwd_bitpos = 17; const u32 ugammatable_pwd_bitpos = 15; const u32 ygammatable_pwd_bitpos = 13; const u32 vgammatable_pwd_mask = (1 << vgammatable_pwd_bitpos); const u32 ugammatable_pwd_mask = (1 << ugammatable_pwd_bitpos); const u32 ygammatable_pwd_mask = (1 << ygammatable_pwd_bitpos); register u32 read_value; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; read_value = pregister->mlcgammacont; if (pby) *pby = (read_value & ygammatable_pwd_mask) ? 1 : 0; if (pbu) *pbu = (read_value & ugammatable_pwd_mask) ? 1 : 0; if (pbv) *pbv = (read_value & vgammatable_pwd_mask) ? 1 : 0; } void nx_mlc_set_video_layer_gama_table_sleep_mode(u32 module_index, int by, int bu, int bv) { const u32 vgammatable_sld_bitpos = 16; const u32 ugammatable_sld_bitpos = 14; const u32 ygammatable_sld_bitpos = 12; const u32 vgammatable_sld_mask = (1 << vgammatable_sld_bitpos); const u32 ugammatable_sld_mask = (1 << ugammatable_sld_bitpos); const u32 ygammatable_sld_mask = (1 << ygammatable_sld_bitpos); register u32 read_value; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; read_value = pregister->mlcgammacont; if (by) read_value &= ~ygammatable_sld_mask; else read_value |= ygammatable_sld_mask; if (bu) read_value &= ~ugammatable_sld_mask; else read_value |= ugammatable_sld_mask; if (bv) read_value &= ~vgammatable_sld_mask; else read_value |= vgammatable_sld_mask; writel(read_value, &pregister->mlcgammacont); } void nx_mlc_get_video_layer_gama_table_sleep_mode(u32 module_index, int *pby, int *pbu, int *pbv) { const u32 vgammatable_sld_bitpos = 16; const u32 ugammatable_sld_bitpos = 14; const u32 ygammatable_sld_bitpos = 12; const u32 vgammatable_sld_mask = (1 << vgammatable_sld_bitpos); const u32 ugammatable_sld_mask = (1 << ugammatable_sld_bitpos); const u32 ygammatable_sld_mask = (1 << ygammatable_sld_bitpos); register u32 read_value; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; read_value = pregister->mlcgammacont; if (pby) *pby = (read_value & vgammatable_sld_mask) ? 0 : 1; if (pbu) *pbu = (read_value & ugammatable_sld_mask) ? 0 : 1; if (pbv) *pbv = (read_value & ygammatable_sld_mask) ? 0 : 1; } void nx_mlc_set_video_layer_gamma_enable(u32 module_index, int benable) { const u32 yuvgammaemb_bitpos = 4; const u32 yuvgammaemb_mask = 1 << yuvgammaemb_bitpos; register u32 read_value; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; read_value = pregister->mlcgammacont; read_value &= ~yuvgammaemb_mask; read_value |= (u32)benable << yuvgammaemb_bitpos; writel(read_value, &pregister->mlcgammacont); } int nx_mlc_get_video_layer_gamma_enable(u32 module_index) { const u32 yuvgammaemb_bitpos = 4; const u32 yuvgammaemb_mask = 1 << yuvgammaemb_bitpos; return (int)((__g_module_variables[module_index].pregister->mlcgammacont & yuvgammaemb_mask) >> yuvgammaemb_bitpos); } void nx_mlc_set_gamma_table_poweroff(u32 module_index, int enb) { register struct nx_mlc_register_set *pregister; u32 regvalue; pregister = __g_module_variables[module_index].pregister; if (enb == 1) { regvalue = pregister->mlcgammacont; regvalue = regvalue & 0xf3; writel(regvalue, &pregister->mlcgammacont); } } void nx_mlc_set_mlctop_control_parameter(u32 module_index, int field_enable, int mlcenable, u8 priority, enum g3daddrchangeallowed g3daddr_change_allowed) { register u32 mlctopcontrolreg; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; mlctopcontrolreg = (readl(&pregister->mlccontrolt)) & 0xfffffcfc; mlctopcontrolreg = (u32)(mlctopcontrolreg | ((priority << 8) | ((mlcenable == 1) << 1) | (1 == field_enable)) | (g3daddr_change_allowed << 12)); writel(mlctopcontrolreg, &pregister->mlccontrolt); } void 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) { u32 layer_format; u32 control_enb; u32 alpha_argument; u32 lock_size = (u32)(lock_size_select & 0x3); u32 rgb0controlreg; u32 regvalue; register struct nx_mlc_register_set *pregister; layer_format = nx_mlc_get_rgbformat(rbgformat); pregister = __g_module_variables[module_index].pregister; control_enb = (u32)((grp3denable << 8) | (layer_enable << 5) | (blend_enable << 2) | (inv_enable << 1) | tp_enable) & 0x127; alpha_argument = (u32)(alpha_value & 0xf); rgb0controlreg = readl(&pregister->mlcrgblayer[0].mlccontrol) & 0x10; regvalue = (u32)(((layer_format << 16) | control_enb | (lock_size << 12)) | rgb0controlreg); writel(regvalue, &pregister->mlcrgblayer[0].mlccontrol); regvalue = (u32)((alpha_argument << 28) | transparency_color); writel(regvalue, &pregister->mlcrgblayer[0].mlctpcolor); regvalue = inverse_color; writel(regvalue, &pregister->mlcrgblayer[0].mlcinvcolor); } u32 nx_mlc_get_rgbformat(enum mlc_rgbfmt rbgformat) { u32 rgbformatvalue; const u32 format_table[] = { 0x4432ul, 0x4342ul, 0x4211ul, 0x4120ul, 0x4003ul, 0x4554ul, 0x3342ul, 0x2211ul, 0x1120ul, 0x1003ul, 0x4653ul, 0x4653ul, 0x0653ul, 0x4ed3ul, 0x4f84ul, 0xc432ul, 0xc342ul, 0xc211ul, 0xc120ul, 0xb342ul, 0xa211ul, 0x9120ul, 0xc653ul, 0xc653ul, 0x8653ul, 0xced3ul, 0xcf84ul, 0x443aul }; return rgbformatvalue = format_table[rbgformat]; } void 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) { u32 layer_format; u32 control_enb; u32 alpha_argument; u32 lock_size = (u32)(lock_size_select & 0x3); u32 rgb0controlreg; u32 regvalue; register struct nx_mlc_register_set *pregister; layer_format = nx_mlc_get_rgbformat(rbgformat); pregister = __g_module_variables[module_index].pregister; rgb0controlreg = readl(&pregister->mlcrgblayer[1].mlccontrol) & 0x10; control_enb = (u32)((grp3denable << 8) | (layer_enable << 5) | (blend_enable << 2) | (inv_enable << 1) | tp_enable) & 0x127; alpha_argument = (u32)(alpha_value & 0xf); regvalue = (u32)(((layer_format << 16) | control_enb | (lock_size << 12)) | rgb0controlreg); writel(regvalue, &pregister->mlcrgblayer[1].mlccontrol); regvalue = (u32)((alpha_argument << 28) | transparency_color); writel(regvalue, &pregister->mlcrgblayer[1].mlctpcolor); regvalue = inverse_color; writel(regvalue, &pregister->mlcrgblayer[1].mlcinvcolor); } void 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) { u32 layer_format; u32 control_enb; u32 alpha_argument; u32 lock_size = (u32)(lock_size_select & 0x3); u32 rgb0controlreg; u32 regvalue; register struct nx_mlc_register_set *pregister; layer_format = nx_mlc_get_rgbformat(rbgformat); pregister = __g_module_variables[module_index].pregister; rgb0controlreg = readl(&pregister->mlcrgblayer2.mlccontrol) & 0x10; control_enb = (u32)((grp3denable << 8) | (layer_enable << 5) | (blend_enable << 2) | (inv_enable << 1) | tp_enable) & 0x127; alpha_argument = (u32)(alpha_value & 0xf); regvalue = (u32)(((layer_format << 16) | control_enb | (lock_size << 12)) | rgb0controlreg); writel(regvalue, &pregister->mlcrgblayer2.mlccontrol); regvalue = (u32)((alpha_argument << 28) | transparency_color); writel(regvalue, &pregister->mlcrgblayer2.mlctpcolor); regvalue = inverse_color; writel(regvalue, &pregister->mlcrgblayer2.mlcinvcolor); } void 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) { u32 control_enb; u32 alpha_argument; u32 regvalue; register struct nx_mlc_register_set *pregister; u32 video_control_reg; pregister = __g_module_variables[module_index].pregister; video_control_reg = readl(&pregister->mlcvideolayer.mlccontrol); control_enb = (u32)((yuvformat) | (layer_enable << 5) | (blend_enable << 2) | (inv_enable << 1) | tp_enable) & 0x30027; alpha_argument = (u32)(alpha_value & 0xf); regvalue = (u32)(control_enb | video_control_reg); writel(regvalue, &pregister->mlcvideolayer.mlccontrol); regvalue = (u32)((alpha_argument << 28) | transparency_color); writel(regvalue, &pregister->mlcvideolayer.mlctpcolor); regvalue = (u32)((alpha_argument << 28) | transparency_color); writel(regvalue, &pregister->mlcvideolayer.mlcinvcolor); } void nx_mlc_set_srammode(u32 module_index, enum latyername layer_name, enum srammode sram_mode) { u32 control_reg_value; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; switch (layer_name) { case topmlc: control_reg_value = readl(&pregister->mlccontrolt); writel((u32)(control_reg_value | (sram_mode << 10)), &pregister->mlccontrolt); control_reg_value = 0; break; case rgb0: control_reg_value = readl(&pregister->mlcrgblayer[0].mlccontrol); writel((u32)(control_reg_value | (sram_mode << 14)), &pregister->mlcrgblayer[0].mlccontrol); control_reg_value = 0; break; case rgb1: control_reg_value = readl(&pregister->mlcrgblayer[1].mlccontrol); writel((u32)(control_reg_value | (sram_mode << 14)), &pregister->mlcrgblayer[1].mlccontrol); control_reg_value = 0; break; case rgb2: control_reg_value = readl(&pregister->mlcrgblayer2.mlccontrol); writel((u32)(control_reg_value | (sram_mode << 14)), &pregister->mlcrgblayer2.mlccontrol); control_reg_value = 0; break; case video: control_reg_value = readl(&pregister->mlcvideolayer.mlccontrol); writel((u32)(control_reg_value | (sram_mode << 14)), &pregister->mlcvideolayer.mlccontrol); control_reg_value = 0; break; default: break; } } void nx_mlc_set_layer_reg_finish(u32 module_index, enum latyername layer_name) { u32 control_reg_value; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; switch (layer_name) { case topmlc: control_reg_value = readl(&pregister->mlccontrolt); writel((u32)(control_reg_value | (1ul << 3)), &pregister->mlccontrolt); control_reg_value = 0; break; case rgb0: control_reg_value = readl(&pregister->mlcrgblayer[0].mlccontrol); writel((u32)(control_reg_value | (1ul << 4)), &pregister->mlcrgblayer[0].mlccontrol); control_reg_value = 0; break; case rgb1: control_reg_value = readl(&pregister->mlcrgblayer[1].mlccontrol); writel((u32)(control_reg_value | (1ul << 4)), &pregister->mlcrgblayer[1].mlccontrol); control_reg_value = 0; break; case rgb2: control_reg_value = readl(&pregister->mlcrgblayer2.mlccontrol); writel((u32)(control_reg_value | (1ul << 4)), &pregister->mlcrgblayer2.mlccontrol); control_reg_value = 0; break; case video: control_reg_value = readl(&pregister->mlcvideolayer.mlccontrol); writel((u32)(control_reg_value | (1ul << 4)), &pregister->mlcvideolayer.mlccontrol); control_reg_value = 0; break; default: break; } } void 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) { s32 source_width, source_height; s32 destination_width; s32 destination_height; s32 hscale, vscale; s32 hfilterenb, vfilterenb; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; writel((s32)(((left & 0x0fff) << 16) | (right & 0x0fff)), &pregister->mlcvideolayer.mlcleftright); writel((s32)(((top & 0x0fff) << 16) | (bottom & 0x0fff)), &pregister->mlcvideolayer.mlctopbottom); source_width = (s32)(video_layer_with - 1); source_height = (s32)(video_layer_height - 1); destination_width = (s32)(right - left); destination_height = (s32)(bottom - top); hscale = (s32)((source_width * (1ul << 11) + (destination_width / 2)) / destination_width); vscale = (s32)((source_height * (1ul << 11) + (destination_height / 2)) / destination_height); hfilterenb = (u32)(((hfilterenable_c << 29) | (hfilterenable) << 28)) & 0x30000000; vfilterenb = (u32)(((vfilterenable_c << 29) | (vfilterenable) << 28)) & 0x30000000; writel((u32)(hfilterenb | (hscale & 0x00ffffff)), &pregister->mlcvideolayer.mlchscale); writel((u32)(vfilterenb | (vscale & 0x00ffffff)), &pregister->mlcvideolayer.mlcvscale); } void nx_mlc_set_video_layer_filter_scale(u32 module_index, u32 hscale, u32 vscale) { register struct nx_mlc_register_set *pregister; u32 mlchscale = 0; u32 mlcvscale = 0; pregister = __g_module_variables[module_index].pregister; mlchscale = readl(&pregister->mlcvideolayer.mlchscale) & (~0x00ffffff); mlcvscale = readl(&pregister->mlcvideolayer.mlcvscale) & (~0x00ffffff); writel((u32)(mlchscale | (hscale & 0x00ffffff)), &pregister->mlcvideolayer.mlchscale); writel((u32)(mlcvscale | (vscale & 0x00ffffff)), &pregister->mlcvideolayer.mlcvscale); } void nx_mlc_set_gamma_control_parameter(u32 module_index, int rgbgammaenb, int yuvgammaenb, int yuvalphaarray, int dither_enb) { u32 register_data; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; register_data = readl(&pregister->mlcgammacont); register_data = (register_data & 0xf0c) | ((yuvalphaarray << 5) | (yuvgammaenb << 4) | (rgbgammaenb << 1) | (dither_enb << 0)); writel(register_data, &pregister->mlcgammacont); } void nx_mlc_set_layer_alpha256(u32 module_index, u32 layer, u32 alpha) { u32 register_data; register struct nx_mlc_register_set *pregister; if (alpha < 0) alpha = 0; if (alpha > 255) alpha = 255; pregister = __g_module_variables[module_index].pregister; if (layer == 0) { register_data = readl(&pregister->mlcrgblayer[0].mlctpcolor) & 0x00ffffff; register_data = register_data | (alpha << 24); writel(register_data, &pregister->mlcrgblayer[0].mlctpcolor); } else if (layer == 1) { register_data = readl(&pregister->mlcrgblayer[1].mlctpcolor) & 0x00ffffff; register_data = register_data | (alpha << 24); writel(register_data, &pregister->mlcrgblayer[1].mlctpcolor); } else if (layer == 2) { register_data = readl(&pregister->mlcrgblayer[1].mlctpcolor) & 0x00ffffff; register_data = register_data | (alpha << 24); writel(register_data, &pregister->mlcrgblayer2.mlctpcolor); } else { register_data = readl(&pregister->mlcvideolayer.mlctpcolor) & 0x00ffffff; register_data = register_data | (alpha << 24); writel(register_data, &pregister->mlcvideolayer.mlctpcolor); } } int nx_mlc_is_under_flow(u32 module_index) { const u32 underflow_pend_pos = 31; const u32 underflow_pend_mask = 1ul << underflow_pend_pos; return (int)((__g_module_variables[module_index].pregister->mlccontrolt & underflow_pend_mask) >> underflow_pend_pos); } void nx_mlc_set_gamma_table(u32 module_index, int enb, struct nx_mlc_gamma_table_parameter *p_gammatable) { register struct nx_mlc_register_set *pregister; u32 i, regval = 0; pregister = __g_module_variables[module_index].pregister; if (enb == 1) { regval = readl(&pregister->mlcgammacont); regval = (1 << 11) | (1 << 9) | (1 << 3); writel(regval, &pregister->mlcgammacont); regval = regval | (1 << 10) | (1 << 8) | (1 << 2); writel(regval, &pregister->mlcgammacont); for (i = 0; i < 256; i++) { nx_mlc_set_rgblayer_rgamma_table(module_index, i, p_gammatable->r_table[i]); nx_mlc_set_rgblayer_ggamma_table(module_index, i, p_gammatable->g_table[i]); nx_mlc_set_rgblayer_bgamma_table(module_index, i, p_gammatable->b_table[i]); } regval = regval | (p_gammatable->alphaselect << 5) | (p_gammatable->yuvgammaenb << 4 | p_gammatable->allgammaenb << 4) | (p_gammatable->rgbgammaenb << 1 | p_gammatable->allgammaenb << 1) | (p_gammatable->ditherenb << 1); writel(regval, &pregister->mlcgammacont); } else { regval = regval & ~(1 << 10) & ~(1 << 8) & ~(1 << 2); writel(regval, &pregister->mlcgammacont); regval = regval & ~(1 << 11) & ~(1 << 9) & ~(1 << 3); writel(regval, &pregister->mlcgammacont); } } void nx_mlc_get_rgblayer_stride(u32 module_index, u32 layer, s32 *hstride, s32 *vstride) { unsigned int hs, vs; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; hs = readl(&pregister->mlcrgblayer[layer].mlchstride); vs = readl(&pregister->mlcrgblayer[layer].mlcvstride); if (hstride) *(s32 *)hstride = hs; if (vstride) *(s32 *)vstride = vs; } void nx_mlc_get_rgblayer_address(u32 module_index, u32 layer, u32 *phys_address) { u32 pa; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; pa = readl(&pregister->mlcrgblayer[layer].mlcaddress); if (phys_address) *(u32 *)phys_address = pa; } void nx_mlc_get_position(u32 module_index, u32 layer, int *left, int *top, int *right, int *bottom) { int lr, tb; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; lr = readl(&pregister->mlcrgblayer[layer].mlcleftright); tb = readl(&pregister->mlcrgblayer[layer].mlctopbottom); if (left) *(int *)left = ((lr >> 16) & 0xFFUL); if (top) *(int *)top = ((tb >> 16) & 0xFFUL); if (right) *(int *)right = ((lr >> 0) & 0xFFUL); if (bottom) *(int *)bottom = ((tb >> 0) & 0xFFUL); } void nx_mlc_get_video_layer_address_yuyv(u32 module_index, u32 *address, u32 *stride) { u32 a, s; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; a = readl(&pregister->mlcvideolayer.mlcaddress); s = readl(&pregister->mlcvideolayer.mlcvstride); if (address) *(u32 *)address = a; if (stride) *(u32 *)stride = s; } void nx_mlc_get_video_layer_address(u32 module_index, u32 *lu_address, u32 *cb_address, u32 *cr_address) { u32 lua, cba, cra; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; lua = readl(&pregister->mlcvideolayer.mlcaddress); cba = readl(&pregister->mlcvideolayer.mlcaddresscb); cra = readl(&pregister->mlcvideolayer.mlcaddresscr); if (lu_address) *(u32 *)lu_address = lua; if (cb_address) *(u32 *)cb_address = cba; if (cr_address) *(u32 *)cr_address = cra; } void nx_mlc_get_video_layer_stride(u32 module_index, u32 *lu_stride, u32 *cb_stride, u32 *cr_stride) { u32 lus, cbs, crs; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; lus = readl(&pregister->mlcvideolayer.mlcvstride); cbs = readl(&pregister->mlcvideolayer.mlcvstridecb); crs = readl(&pregister->mlcvideolayer.mlcvstridecr); if (lu_stride) *(u32 *)lu_stride = lus; if (cb_stride) *(u32 *)cb_stride = cbs; if (cr_stride) *(u32 *)cr_stride = crs; } void nx_mlc_get_video_position(u32 module_index, int *left, int *top, int *right, int *bottom) { int lr, tb; register struct nx_mlc_register_set *pregister; pregister = __g_module_variables[module_index].pregister; lr = readl(&pregister->mlcvideolayer.mlcleftright); tb = readl(&pregister->mlcvideolayer.mlctopbottom); if (left) *(int *)left = ((lr >> 16) & 0xFFUL); if (top) *(int *)top = ((tb >> 16) & 0xFFUL); if (right) *(int *)right = ((lr >> 0) & 0xFFUL); if (bottom) *(int *)bottom = ((tb >> 0) & 0xFFUL); }