Stefan Bosch | 8708814 | 2020-07-10 19:07:33 +0200 | [diff] [blame] | 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 | #ifndef _S5PXX18_SOC_MLC_H_ |
| 9 | #define _S5PXX18_SOC_MLC_H_ |
| 10 | |
| 11 | #include "s5pxx18_soc_disptype.h" |
| 12 | |
| 13 | #define NUMBER_OF_MLC_MODULE 2 |
| 14 | #define PHY_BASEADDR_MLC0 0xC0102000 |
| 15 | #define PHY_BASEADDR_MLC1 0xC0102400 |
| 16 | |
| 17 | #define PHY_BASEADDR_MLC_LIST \ |
| 18 | { PHY_BASEADDR_MLC0, PHY_BASEADDR_MLC1 } |
| 19 | |
| 20 | struct nx_mlc_register_set { |
| 21 | u32 mlccontrolt; |
| 22 | u32 mlcscreensize; |
| 23 | u32 mlcbgcolor; |
| 24 | struct { |
| 25 | u32 mlcleftright; |
| 26 | u32 mlctopbottom; |
| 27 | u32 mlcinvalidleftright0; |
| 28 | u32 mlcinvalidtopbottom0; |
| 29 | u32 mlcinvalidleftright1; |
| 30 | u32 mlcinvalidtopbottom1; |
| 31 | u32 mlccontrol; |
| 32 | s32 mlchstride; |
| 33 | s32 mlcvstride; |
| 34 | u32 mlctpcolor; |
| 35 | u32 mlcinvcolor; |
| 36 | u32 mlcaddress; |
| 37 | u32 __reserved0; |
| 38 | } mlcrgblayer[2]; |
| 39 | struct { |
| 40 | u32 mlcleftright; |
| 41 | u32 mlctopbottom; |
| 42 | u32 mlccontrol; |
| 43 | u32 mlcvstride; |
| 44 | u32 mlctpcolor; |
| 45 | |
| 46 | u32 mlcinvcolor; |
| 47 | u32 mlcaddress; |
| 48 | u32 mlcaddresscb; |
| 49 | u32 mlcaddresscr; |
| 50 | s32 mlcvstridecb; |
| 51 | s32 mlcvstridecr; |
| 52 | u32 mlchscale; |
| 53 | u32 mlcvscale; |
| 54 | u32 mlcluenh; |
| 55 | u32 mlcchenh[4]; |
| 56 | } mlcvideolayer; |
| 57 | struct { |
| 58 | u32 mlcleftright; |
| 59 | u32 mlctopbottom; |
| 60 | u32 mlcinvalidleftright0; |
| 61 | u32 mlcinvalidtopbottom0; |
| 62 | u32 mlcinvalidleftright1; |
| 63 | u32 mlcinvalidtopbottom1; |
| 64 | u32 mlccontrol; |
| 65 | s32 mlchstride; |
| 66 | s32 mlcvstride; |
| 67 | u32 mlctpcolor; |
| 68 | u32 mlcinvcolor; |
| 69 | u32 mlcaddress; |
| 70 | } mlcrgblayer2; |
| 71 | u32 mlcpaletetable2; |
| 72 | u32 mlcgammacont; |
| 73 | u32 mlcrgammatablewrite; |
| 74 | u32 mlcggammatablewrite; |
| 75 | u32 mlcbgammatablewrite; |
| 76 | u32 yuvlayergammatable_red; |
| 77 | u32 yuvlayergammatable_green; |
| 78 | u32 yuvlayergammatable_blue; |
| 79 | |
| 80 | u32 dimctrl; |
| 81 | u32 dimlut0; |
| 82 | u32 dimlut1; |
| 83 | u32 dimbusyflag; |
| 84 | u32 dimprdarrr0; |
| 85 | u32 dimprdarrr1; |
| 86 | u32 dimram0rddata; |
| 87 | u32 dimram1rddata; |
| 88 | u32 __reserved2[(0x3c0 - 0x12c) / 4]; |
| 89 | u32 mlcclkenb; |
| 90 | }; |
| 91 | |
| 92 | enum nx_mlc_priority { |
| 93 | nx_mlc_priority_videofirst = 0ul, |
| 94 | nx_mlc_priority_videosecond = 1ul, |
| 95 | nx_mlc_priority_videothird = 2ul, |
| 96 | nx_mlc_priority_videofourth = 3ul |
| 97 | }; |
| 98 | |
| 99 | enum nx_mlc_rgbfmt { |
| 100 | nx_mlc_rgbfmt_r5g6b5 = 0x44320000ul, |
| 101 | nx_mlc_rgbfmt_b5g6r5 = 0xc4320000ul, |
| 102 | nx_mlc_rgbfmt_x1r5g5b5 = 0x43420000ul, |
| 103 | nx_mlc_rgbfmt_x1b5g5r5 = 0xc3420000ul, |
| 104 | nx_mlc_rgbfmt_x4r4g4b4 = 0x42110000ul, |
| 105 | nx_mlc_rgbfmt_x4b4g4r4 = 0xc2110000ul, |
| 106 | nx_mlc_rgbfmt_x8r3g3b2 = 0x41200000ul, |
| 107 | nx_mlc_rgbfmt_x8b3g3r2 = 0xc1200000ul, |
| 108 | nx_mlc_rgbfmt_a1r5g5b5 = 0x33420000ul, |
| 109 | nx_mlc_rgbfmt_a1b5g5r5 = 0xb3420000ul, |
| 110 | nx_mlc_rgbfmt_a4r4g4b4 = 0x22110000ul, |
| 111 | nx_mlc_rgbfmt_a4b4g4r4 = 0xa2110000ul, |
| 112 | nx_mlc_rgbfmt_a8r3g3b2 = 0x11200000ul, |
| 113 | nx_mlc_rgbfmt_a8b3g3r2 = 0x91200000ul, |
| 114 | nx_mlc_rgbfmt_r8g8b8 = 0x46530000ul, |
| 115 | nx_mlc_rgbfmt_b8g8r8 = 0xc6530000ul, |
| 116 | nx_mlc_rgbfmt_x8r8g8b8 = 0x46530000ul, |
| 117 | nx_mlc_rgbfmt_x8b8g8r8 = 0xc6530000ul, |
| 118 | nx_mlc_rgbfmt_a8r8g8b8 = 0x06530000ul, |
| 119 | nx_mlc_rgbfmt_a8b8g8r8 = 0x86530000ul |
| 120 | }; |
| 121 | |
| 122 | enum nx_mlc_yuvfmt { |
| 123 | nx_mlc_yuvfmt_420 = 0ul << 16, |
| 124 | nx_mlc_yuvfmt_422 = 1ul << 16, |
| 125 | nx_mlc_yuvfmt_444 = 3ul << 16, |
| 126 | nx_mlc_yuvfmt_yuyv = 2ul << 16, |
| 127 | nx_mlc_yuvfmt_422_cbcr = 4ul << 16, |
| 128 | nx_mlc_yuvfmt_420_cbcr = 5ul << 16, |
| 129 | }; |
| 130 | |
| 131 | #ifdef __arm |
| 132 | #pragma diag_default 66 |
| 133 | #endif |
| 134 | |
| 135 | int nx_mlc_initialize(void); |
| 136 | u32 nx_mlc_get_number_of_module(void); |
| 137 | u32 nx_mlc_get_physical_address(u32 module_index); |
| 138 | u32 nx_mlc_get_size_of_register_set(void); |
| 139 | void nx_mlc_set_base_address(u32 module_index, void *base_address); |
| 140 | void *nx_mlc_get_base_address(u32 module_index); |
| 141 | int nx_mlc_open_module(u32 module_index); |
| 142 | int nx_mlc_close_module(u32 module_index); |
| 143 | int nx_mlc_check_busy(u32 module_index); |
| 144 | int nx_mlc_can_power_down(u32 module_index); |
| 145 | void nx_mlc_set_clock_pclk_mode(u32 module_index, enum nx_pclkmode mode); |
| 146 | enum nx_pclkmode nx_mlc_get_clock_pclk_mode(u32 module_index); |
| 147 | void nx_mlc_set_clock_bclk_mode(u32 module_index, enum nx_bclkmode mode); |
| 148 | enum nx_bclkmode nx_mlc_get_clock_bclk_mode(u32 module_index); |
| 149 | |
| 150 | void nx_mlc_set_top_power_mode(u32 module_index, int bpower); |
| 151 | int nx_mlc_get_top_power_mode(u32 module_index); |
| 152 | void nx_mlc_set_top_sleep_mode(u32 module_index, int bsleep); |
| 153 | int nx_mlc_get_top_sleep_mode(u32 module_index); |
| 154 | void nx_mlc_set_top_dirty_flag(u32 module_index); |
| 155 | int nx_mlc_get_top_dirty_flag(u32 module_index); |
| 156 | void nx_mlc_set_mlc_enable(u32 module_index, int benb); |
| 157 | int nx_mlc_get_mlc_enable(u32 module_index); |
| 158 | void nx_mlc_set_field_enable(u32 module_index, int benb); |
| 159 | int nx_mlc_get_field_enable(u32 module_index); |
| 160 | void nx_mlc_set_layer_priority(u32 module_index, |
| 161 | enum nx_mlc_priority priority); |
| 162 | void nx_mlc_set_screen_size(u32 module_index, u32 width, u32 height); |
| 163 | void nx_mlc_get_screen_size(u32 module_index, u32 *pwidth, |
| 164 | u32 *pheight); |
| 165 | void nx_mlc_set_background(u32 module_index, u32 color); |
| 166 | |
| 167 | void nx_mlc_set_dirty_flag(u32 module_index, u32 layer); |
| 168 | int nx_mlc_get_dirty_flag(u32 module_index, u32 layer); |
| 169 | void nx_mlc_set_layer_enable(u32 module_index, u32 layer, int benb); |
| 170 | int nx_mlc_get_layer_enable(u32 module_index, u32 layer); |
| 171 | void nx_mlc_set_lock_size(u32 module_index, u32 layer, u32 locksize); |
| 172 | void nx_mlc_set_alpha_blending(u32 module_index, u32 layer, int benb, |
| 173 | u32 alpha); |
| 174 | void nx_mlc_set_transparency(u32 module_index, u32 layer, int benb, |
| 175 | u32 color); |
| 176 | void nx_mlc_set_color_inversion(u32 module_index, u32 layer, int benb, |
| 177 | u32 color); |
| 178 | u32 nx_mlc_get_extended_color(u32 module_index, u32 color, |
| 179 | enum nx_mlc_rgbfmt format); |
| 180 | void nx_mlc_set_format_rgb(u32 module_index, u32 layer, |
| 181 | enum nx_mlc_rgbfmt format); |
| 182 | void nx_mlc_set_format_yuv(u32 module_index, enum nx_mlc_yuvfmt format); |
| 183 | void nx_mlc_set_position(u32 module_index, u32 layer, s32 sx, |
| 184 | s32 sy, s32 ex, s32 ey); |
| 185 | void nx_mlc_set_dither_enable_when_using_gamma(u32 module_index, |
| 186 | int benable); |
| 187 | int nx_mlc_get_dither_enable_when_using_gamma(u32 module_index); |
| 188 | void nx_mlc_set_gamma_priority(u32 module_index, int bvideolayer); |
| 189 | int nx_mlc_get_gamma_priority(u32 module_index); |
| 190 | |
| 191 | void nx_mlc_set_rgblayer_invalid_position(u32 module_index, u32 layer, |
| 192 | u32 region, s32 sx, |
| 193 | s32 sy, s32 ex, |
| 194 | s32 ey, int benb); |
| 195 | void nx_mlc_set_rgblayer_stride(u32 module_index, u32 layer, |
| 196 | s32 hstride, s32 vstride); |
| 197 | void nx_mlc_set_rgblayer_address(u32 module_index, u32 layer, u32 addr); |
| 198 | void nx_mlc_set_rgblayer_gama_table_power_mode(u32 module_index, |
| 199 | int bred, int bgreen, |
| 200 | int bblue); |
| 201 | void nx_mlc_get_rgblayer_gama_table_power_mode(u32 module_index, |
| 202 | int *pbred, int *pbgreen, |
| 203 | int *pbblue); |
| 204 | void nx_mlc_set_rgblayer_gama_table_sleep_mode(u32 module_index, |
| 205 | int bred, int bgreen, |
| 206 | int bblue); |
| 207 | void nx_mlc_get_rgblayer_gama_table_sleep_mode(u32 module_index, |
| 208 | int *pbred, int *pbgreen, |
| 209 | int *pbblue); |
| 210 | void nx_mlc_set_rgblayer_rgamma_table(u32 module_index, u32 dwaddress, |
| 211 | u32 dwdata); |
| 212 | void nx_mlc_set_rgblayer_ggamma_table(u32 module_index, u32 dwaddress, |
| 213 | u32 dwdata); |
| 214 | void nx_mlc_set_rgblayer_bgamma_table(u32 module_index, u32 dwaddress, |
| 215 | u32 dwdata); |
| 216 | void nx_mlc_set_rgblayer_gamma_enable(u32 module_index, int benable); |
| 217 | int nx_mlc_get_rgblayer_gamma_enable(u32 module_index); |
| 218 | |
| 219 | void nx_mlc_set_video_layer_stride(u32 module_index, s32 lu_stride, |
| 220 | s32 cb_stride, s32 cr_stride); |
| 221 | void nx_mlc_set_video_layer_address(u32 module_index, u32 lu_addr, |
| 222 | u32 cb_addr, u32 cr_addr); |
| 223 | void nx_mlc_set_video_layer_address_yuyv(u32 module_index, u32 addr, |
| 224 | s32 stride); |
| 225 | void nx_mlc_set_video_layer_scale_factor(u32 module_index, u32 hscale, |
| 226 | u32 vscale, int bhlumaenb, |
| 227 | int bhchromaenb, int bvlumaenb, |
| 228 | int bvchromaenb); |
| 229 | void nx_mlc_set_video_layer_scale_filter(u32 module_index, int bhlumaenb, |
| 230 | int bhchromaenb, int bvlumaenb, |
| 231 | int bvchromaenb); |
| 232 | void nx_mlc_get_video_layer_scale_filter(u32 module_index, |
| 233 | int *bhlumaenb, |
| 234 | int *bhchromaenb, |
| 235 | int *bvlumaenb, |
| 236 | int *bvchromaenb); |
| 237 | void nx_mlc_set_video_layer_scale(u32 module_index, u32 sw, u32 sh, |
| 238 | u32 dw, u32 dh, int bhlumaenb, |
| 239 | int bhchromaenb, int bvlumaenb, |
| 240 | int bvchromaenb); |
| 241 | void nx_mlc_set_video_layer_luma_enhance(u32 module_index, u32 contrast, |
| 242 | s32 brightness); |
| 243 | void nx_mlc_set_video_layer_chroma_enhance(u32 module_index, |
| 244 | u32 quadrant, s32 cb_a, |
| 245 | s32 cb_b, s32 cr_a, |
| 246 | s32 cr_b); |
| 247 | void nx_mlc_set_video_layer_line_buffer_power_mode(u32 module_index, |
| 248 | int benable); |
| 249 | int nx_mlc_get_video_layer_line_buffer_power_mode(u32 module_index); |
| 250 | void nx_mlc_set_video_layer_line_buffer_sleep_mode(u32 module_index, |
| 251 | int benable); |
| 252 | int nx_mlc_get_video_layer_line_buffer_sleep_mode(u32 module_index); |
| 253 | void nx_mlc_set_video_layer_gamma_enable(u32 module_index, int benable); |
| 254 | int nx_mlc_get_video_layer_gamma_enable(u32 module_index); |
| 255 | |
| 256 | void nx_mlc_set_gamma_table_poweroff(u32 module_index, int enb); |
| 257 | |
| 258 | enum mlc_rgbfmt { |
| 259 | rgbfmt_r5g6b5 = 0, |
| 260 | rgbfmt_x1r5g5b5 = 1, |
| 261 | rgbfmt_x4r4g4b4 = 2, |
| 262 | rgbfmt_x8r3g3b2 = 3, |
| 263 | rgbfmt_x8l8 = 4, |
| 264 | rgbfmt_l16 = 5, |
| 265 | rgbfmt_a1r5g5b5 = 6, |
| 266 | rgbfmt_a4r4g4b4 = 7, |
| 267 | rgbfmt_a8r3g3b2 = 8, |
| 268 | rgbfmt_a8l8 = 9, |
| 269 | rgbfmt_r8g8b8 = 10, |
| 270 | rgbfmt_x8r8g8b8 = 11, |
| 271 | rgbfmt_a8r8g8b8 = 12, |
| 272 | rgbfmt_g8r8_g8b8 = 13, |
| 273 | rgbfmt_r8g8_b8g8 = 14, |
| 274 | rgbfmt_b5g6r5 = 15, |
| 275 | rgbfmt_x1b5g5r5 = 16, |
| 276 | rgbfmt_x4b4g4r4 = 17, |
| 277 | rgbfmt_x8b3g3r2 = 18, |
| 278 | rgbfmt_a1b5g5r5 = 19, |
| 279 | rgbfmt_a4b4g4r4 = 20, |
| 280 | rgbfmt_a8b3g3r2 = 21, |
| 281 | rgbfmt_b8g8r8 = 22, |
| 282 | rgbfmt_x8b8g8r8 = 23, |
| 283 | rgbfmt_a8b8g8r8 = 24, |
| 284 | rgbfmt_g8b8_g8r8 = 25, |
| 285 | rgbfmt_b8g8_r8g8 = 26, |
| 286 | rgbfmt_pataletb = 27 |
| 287 | }; |
| 288 | |
| 289 | enum latyername { |
| 290 | topmlc = 0, |
| 291 | rgb0 = 1, |
| 292 | rgb1 = 2, |
| 293 | rgb2 = 3, |
| 294 | video = 4 |
| 295 | }; |
| 296 | |
| 297 | enum srammode { |
| 298 | poweroff = 0, |
| 299 | sleepmode = 2, |
| 300 | run = 3 |
| 301 | }; |
| 302 | |
| 303 | enum locksizesel { |
| 304 | locksize_4 = 0, |
| 305 | locksize_8 = 1, |
| 306 | locksize_16 = 2 |
| 307 | }; |
| 308 | |
| 309 | enum g3daddrchangeallowed { |
| 310 | prim = 0, |
| 311 | secon = 1, |
| 312 | primorsecon = 2, |
| 313 | primandsecon = 3 |
| 314 | }; |
| 315 | |
| 316 | void nx_mlc_set_mlctop_control_parameter(u32 module_index, |
| 317 | int field_enable, int mlcenable, |
| 318 | u8 priority, |
| 319 | enum g3daddrchangeallowed |
| 320 | g3daddr_change_allowed); |
| 321 | void nx_mlc_set_rgb0layer_control_parameter(u32 module_index, |
| 322 | int layer_enable, |
| 323 | int grp3denable, |
| 324 | int tp_enable, |
| 325 | u32 transparency_color, |
| 326 | int inv_enable, |
| 327 | u32 inverse_color, |
| 328 | int blend_enable, |
| 329 | u8 alpha_value, |
| 330 | enum mlc_rgbfmt rbgformat, |
| 331 | enum locksizesel |
| 332 | lock_size_select); |
| 333 | |
| 334 | u32 nx_mlc_get_rgbformat(enum mlc_rgbfmt rbgformat); |
| 335 | void nx_mlc_set_rgb1layer_control_parameter(u32 module_index, |
| 336 | int layer_enable, |
| 337 | int grp3denable, |
| 338 | int tp_enable, |
| 339 | u32 transparency_color, |
| 340 | int inv_enable, |
| 341 | u32 inverse_color, |
| 342 | int blend_enable, |
| 343 | u8 alpha_value, |
| 344 | enum mlc_rgbfmt rbgformat, |
| 345 | enum locksizesel |
| 346 | lock_size_select); |
| 347 | |
| 348 | void nx_mlc_set_rgb2layer_control_parameter(u32 module_index, |
| 349 | int layer_enable, |
| 350 | int grp3denable, |
| 351 | int tp_enable, |
| 352 | u32 transparency_color, |
| 353 | int inv_enable, |
| 354 | u32 inverse_color, |
| 355 | int blend_enable, |
| 356 | u8 alpha_value, |
| 357 | enum mlc_rgbfmt rbgformat, |
| 358 | enum locksizesel |
| 359 | lock_size_select); |
| 360 | |
| 361 | void nx_mlc_set_video_layer_control_parameter(u32 module_index, |
| 362 | int layer_enable, |
| 363 | int tp_enable, |
| 364 | u32 transparency_color, |
| 365 | int inv_enable, |
| 366 | u32 inverse_color, |
| 367 | int blend_enable, |
| 368 | u8 alpha_value, |
| 369 | enum nx_mlc_yuvfmt |
| 370 | yuvformat); |
| 371 | |
| 372 | void nx_mlc_set_srammode(u32 module_index, enum latyername layer_name, |
| 373 | enum srammode sram_mode); |
| 374 | |
| 375 | void nx_mlc_set_layer_reg_finish(u32 module_index, |
| 376 | enum latyername layer_name); |
| 377 | |
| 378 | void nx_mlc_set_video_layer_coordinate(u32 module_index, |
| 379 | int vfilterenable, |
| 380 | int hfilterenable, |
| 381 | int vfilterenable_c, |
| 382 | int hfilterenable_c, |
| 383 | u16 video_layer_with, |
| 384 | u16 video_layer_height, |
| 385 | s16 left, s16 right, |
| 386 | s16 top, s16 bottom); |
| 387 | |
| 388 | void nx_mlc_set_video_layer_filter_scale(u32 module_index, u32 hscale, |
| 389 | u32 vscale); |
| 390 | void nx_mlcsetgammasrammode(u32 module_index, enum srammode sram_mode); |
| 391 | void nx_mlc_set_gamma_control_parameter(u32 module_index, |
| 392 | int rgbgammaenb, int yuvgammaenb, |
| 393 | int yuvalphaarray, |
| 394 | int dither_enb); |
| 395 | |
| 396 | void nx_mlc_set_layer_alpha256(u32 module_index, u32 layer, u32 alpha); |
| 397 | int nx_mlc_is_under_flow(u32 module_index); |
| 398 | |
| 399 | struct nx_mlc_gamma_table_parameter { |
| 400 | u32 r_table[256]; |
| 401 | u32 g_table[256]; |
| 402 | u32 b_table[256]; |
| 403 | u32 ditherenb; |
| 404 | u32 alphaselect; |
| 405 | u32 yuvgammaenb; |
| 406 | u32 rgbgammaenb; |
| 407 | u32 allgammaenb; |
| 408 | }; |
| 409 | |
| 410 | void nx_mlc_set_gamma_table(u32 module_index, int enb, |
| 411 | struct nx_mlc_gamma_table_parameter *p_gammatable); |
| 412 | void nx_mlc_get_rgblayer_stride(u32 module_index, u32 layer, |
| 413 | s32 *hstride, s32 *vstride); |
| 414 | void nx_mlc_get_rgblayer_address(u32 module_index, u32 layer, |
| 415 | u32 *phys_address); |
| 416 | void nx_mlc_get_position(u32 module_index, u32 layer, int *left, |
| 417 | int *top, int *right, int *bottom); |
| 418 | void nx_mlc_get_video_layer_address_yuyv(u32 module_index, u32 *address, |
| 419 | u32 *stride); |
| 420 | void nx_mlc_get_video_layer_address(u32 module_index, u32 *lu_address, |
| 421 | u32 *cb_address, u32 *cr_address); |
| 422 | void nx_mlc_get_video_layer_stride(u32 module_index, u32 *lu_stride, |
| 423 | u32 *cb_stride, u32 *cr_stride); |
| 424 | void nx_mlc_get_video_layer_stride(u32 module_index, u32 *lu_stride, |
| 425 | u32 *cb_stride, u32 *cr_stride); |
| 426 | void nx_mlc_get_video_position(u32 module_index, int *left, int *top, |
| 427 | int *right, int *bottom); |
| 428 | |
| 429 | #endif |