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_DPC_H_ 9 #define _S5PXX18_SOC_DPC_H_ 10 11 #include "s5pxx18_soc_disptype.h" 12 13 #define IRQ_OFFSET 32 14 #define IRQ_DPC_P (IRQ_OFFSET + 33) 15 #define IRQ_DPC_S (IRQ_OFFSET + 34) 16 17 #define NUMBER_OF_DPC_MODULE 2 18 #define PHY_BASEADDR_DPC0 0xC0102800 19 #define PHY_BASEADDR_DPC1 0xC0102C00 20 21 #define PHY_BASEADDR_DPC_LIST \ 22 { PHY_BASEADDR_DPC0, PHY_BASEADDR_DPC1 } 23 24 struct nx_dpc_register_set { 25 u32 ntsc_stata; 26 u32 ntsc_ecmda; 27 u32 ntsc_ecmdb; 28 u32 ntsc_glk; 29 u32 ntsc_sch; 30 u32 ntsc_hue; 31 u32 ntsc_sat; 32 u32 ntsc_cont; 33 u32 ntsc_bright; 34 u32 ntsc_fsc_adjh; 35 u32 ntsc_fsc_adjl; 36 u32 ntsc_ecmdc; 37 u32 ntsc_csdly; 38 u32 __ntsc_reserved_0_[3]; 39 u32 ntsc_dacsel10; 40 u32 ntsc_dacsel32; 41 u32 ntsc_dacsel54; 42 u32 ntsc_daclp; 43 u32 ntsc_dacpd; 44 u32 __ntsc_reserved_1_[(0x20 - 0x15)]; 45 u32 ntsc_icntl; 46 u32 ntsc_hvoffst; 47 u32 ntsc_hoffst; 48 u32 ntsc_voffset; 49 u32 ntsc_hsvso; 50 u32 ntsc_hsob; 51 u32 ntsc_hsoe; 52 u32 ntsc_vsob; 53 u32 ntsc_vsoe; 54 u32 __reserved[(0xf8 / 4) - 0x29]; 55 u32 dpchtotal; 56 u32 dpchswidth; 57 u32 dpchastart; 58 u32 dpchaend; 59 u32 dpcvtotal; 60 u32 dpcvswidth; 61 u32 dpcvastart; 62 u32 dpcvaend; 63 u32 dpcctrl0; 64 u32 dpcctrl1; 65 u32 dpcevtotal; 66 u32 dpcevswidth; 67 u32 dpcevastart; 68 u32 dpcevaend; 69 u32 dpcctrl2; 70 u32 dpcvseoffset; 71 u32 dpcvssoffset; 72 u32 dpcevseoffset; 73 u32 dpcevssoffset; 74 u32 dpcdelay0; 75 u32 dpcupscalecon0; 76 u32 dpcupscalecon1; 77 u32 dpcupscalecon2; 78 79 u32 dpcrnumgencon0; 80 u32 dpcrnumgencon1; 81 u32 dpcrnumgencon2; 82 u32 dpcrndconformula_l; 83 u32 dpcrndconformula_h; 84 u32 dpcfdtaddr; 85 u32 dpcfrdithervalue; 86 u32 dpcfgdithervalue; 87 u32 dpcfbdithervalue; 88 u32 dpcdelay1; 89 u32 dpcmputime0; 90 u32 dpcmputime1; 91 u32 dpcmpuwrdatal; 92 u32 dpcmpuindex; 93 u32 dpcmpustatus; 94 u32 dpcmpudatah; 95 u32 dpcmpurdatal; 96 u32 dpcdummy12; 97 u32 dpccmdbufferdatal; 98 u32 dpccmdbufferdatah; 99 u32 dpcpolctrl; 100 u32 dpcpadposition[8]; 101 u32 dpcrgbmask[2]; 102 u32 dpcrgbshift; 103 u32 dpcdataflush; 104 u32 __reserved06[((0x3c0) - (2 * 0x0ec)) / 4]; 105 106 u32 dpcclkenb; 107 u32 dpcclkgen[2][2]; 108 }; 109 110 enum { 111 nx_dpc_int_vsync = 0 112 }; 113 114 enum nx_dpc_format { 115 nx_dpc_format_rgb555 = 0ul, 116 nx_dpc_format_rgb565 = 1ul, 117 nx_dpc_format_rgb666 = 2ul, 118 nx_dpc_format_rgb666b = 18ul, 119 nx_dpc_format_rgb888 = 3ul, 120 nx_dpc_format_mrgb555a = 4ul, 121 nx_dpc_format_mrgb555b = 5ul, 122 nx_dpc_format_mrgb565 = 6ul, 123 nx_dpc_format_mrgb666 = 7ul, 124 nx_dpc_format_mrgb888a = 8ul, 125 nx_dpc_format_mrgb888b = 9ul, 126 nx_dpc_format_ccir656 = 10ul, 127 nx_dpc_format_ccir601a = 12ul, 128 nx_dpc_format_ccir601b = 13ul, 129 nx_dpc_format_srgb888 = 14ul, 130 nx_dpc_format_srgbd8888 = 15ul, 131 nx_dpc_format_4096color = 1ul, 132 nx_dpc_format_16gray = 3ul 133 }; 134 135 enum nx_dpc_ycorder { 136 nx_dpc_ycorder_cb_ycr_y = 0ul, 137 nx_dpc_ycorder_cr_ycb_y = 1ul, 138 nx_dpc_ycorder_ycbycr = 2ul, 139 nx_dpc_ycorder_ycrycb = 3ul 140 }; 141 142 enum nx_dpc_padclk { 143 nx_dpc_padclk_vclk = 0ul, 144 nx_dpc_padclk_vclk2 = 1ul, 145 nx_dpc_padclk_vclk3 = 2ul 146 }; 147 148 enum nx_dpc_dither { 149 nx_dpc_dither_bypass = 0ul, 150 nx_dpc_dither_4bit = 1ul, 151 nx_dpc_dither_5bit = 2ul, 152 nx_dpc_dither_6bit = 3ul 153 }; 154 155 enum nx_dpc_vbs { 156 nx_dpc_vbs_ntsc_m = 0ul, 157 nx_dpc_vbs_ntsc_n = 1ul, 158 nx_dpc_vbs_ntsc_443 = 2ul, 159 nx_dpc_vbs_pal_m = 3ul, 160 nx_dpc_vbs_pal_n = 4ul, 161 nx_dpc_vbs_pal_bghi = 5ul, 162 nx_dpc_vbs_pseudo_pal = 6ul, 163 nx_dpc_vbs_pseudo_ntsc = 7ul 164 }; 165 166 enum nx_dpc_bandwidth { 167 nx_dpc_bandwidth_low = 0ul, 168 nx_dpc_bandwidth_medium = 1ul, 169 nx_dpc_bandwidth_high = 2ul 170 }; 171 172 int nx_dpc_initialize(void); 173 u32 nx_dpc_get_number_of_module(void); 174 u32 nx_dpc_get_physical_address(u32 module_index); 175 u32 nx_dpc_get_size_of_register_set(void); 176 void nx_dpc_set_base_address(u32 module_index, void *base_address); 177 void *nx_dpc_get_base_address(u32 module_index); 178 int nx_dpc_open_module(u32 module_index); 179 int nx_dpc_close_module(u32 module_index); 180 int nx_dpc_check_busy(u32 module_index); 181 int nx_dpc_can_power_down(u32 module_index); 182 int32_t nx_dpc_get_interrupt_number(u32 module_index); 183 void nx_dpc_set_interrupt_enable(u32 module_index, int32_t int_num, 184 int enable); 185 int nx_dpc_get_interrupt_enable(u32 module_index, int32_t int_num); 186 int nx_dpc_get_interrupt_pending(u32 module_index, int32_t int_num); 187 void nx_dpc_clear_interrupt_pending(u32 module_index, int32_t int_num); 188 void nx_dpc_set_interrupt_enable_all(u32 module_index, int enable); 189 int nx_dpc_get_interrupt_enable_all(u32 module_index); 190 int nx_dpc_get_interrupt_pending_all(u32 module_index); 191 void nx_dpc_clear_interrupt_pending_all(u32 module_index); 192 void nx_dpc_set_interrupt_enable32(u32 module_index, u32 enable_flag); 193 u32 nx_dpc_get_interrupt_enable32(u32 module_index); 194 u32 nx_dpc_get_interrupt_pending32(u32 module_index); 195 void nx_dpc_clear_interrupt_pending32(u32 module_index, 196 u32 pending_flag); 197 int32_t nx_dpc_get_interrupt_pending_number(u32 module_index); 198 void nx_dpc_set_clock_pclk_mode(u32 module_index, enum nx_pclkmode mode); 199 enum nx_pclkmode nx_dpc_get_clock_pclk_mode(u32 module_index); 200 void nx_dpc_set_clock_source(u32 module_index, u32 index, u32 clk_src); 201 u32 nx_dpc_get_clock_source(u32 module_index, u32 index); 202 void nx_dpc_set_clock_divisor(u32 module_index, u32 index, u32 divisor); 203 u32 nx_dpc_get_clock_divisor(u32 module_index, u32 index); 204 void nx_dpc_set_clock_out_inv(u32 module_index, u32 index, 205 int out_clk_inv); 206 int nx_dpc_get_clock_out_inv(u32 module_index, u32 index); 207 void nx_dpc_set_clock_out_select(u32 module_index, u32 index, 208 int bbypass); 209 int nx_dpc_get_clock_out_select(u32 module_index, u32 index); 210 void nx_dpc_set_clock_polarity(u32 module_index, int bpolarity); 211 int nx_dpc_get_clock_polarity(u32 module_index); 212 void nx_dpc_set_clock_out_enb(u32 module_index, u32 index, 213 int out_clk_enb); 214 int nx_dpc_get_clock_out_enb(u32 module_index, u32 index); 215 void nx_dpc_set_clock_out_delay(u32 module_index, u32 index, u32 delay); 216 u32 nx_dpc_get_clock_out_delay(u32 module_index, u32 index); 217 void nx_dpc_set_clock_divisor_enable(u32 module_index, int enable); 218 int nx_dpc_get_clock_divisor_enable(u32 module_index); 219 220 void nx_dpc_set_dpc_enable(u32 module_index, int benb); 221 int nx_dpc_get_dpc_enable(u32 module_index); 222 void nx_dpc_set_delay(u32 module_index, u32 delay_rgb_pvd, 223 u32 delay_hs_cp1, u32 delay_vs_fram, 224 u32 delay_de_cp2); 225 void nx_dpc_get_delay(u32 module_index, u32 *pdelayrgb_pvd, 226 u32 *pdelayhs_cp1, u32 *pdelayvs_fram, 227 u32 *pdelayde_cp2); 228 void nx_dpc_set_dither(u32 module_index, enum nx_dpc_dither dither_r, 229 enum nx_dpc_dither dither_g, 230 enum nx_dpc_dither dither_b); 231 void nx_dpc_get_dither(u32 module_index, enum nx_dpc_dither *pditherr, 232 enum nx_dpc_dither *pditherg, 233 enum nx_dpc_dither *pditherb); 234 void nx_dpc_set_horizontal_up_scaler(u32 module_index, int benb, 235 u32 sourcewidth, u32 destwidth); 236 void nx_dpc_get_horizontal_up_scaler(u32 module_index, int *pbenb, 237 u32 *psourcewidth, 238 u32 *pdestwidth); 239 240 void nx_dpc_set_mode(u32 module_index, enum nx_dpc_format format, 241 int binterlace, int binvertfield, int brgbmode, 242 int bswaprb, enum nx_dpc_ycorder ycorder, 243 int bclipyc, int bembeddedsync, 244 enum nx_dpc_padclk clock, int binvertclock, 245 int bdualview); 246 void nx_dpc_get_mode(u32 module_index, enum nx_dpc_format *pformat, 247 int *pbinterlace, int *pbinvertfield, 248 int *pbrgbmode, int *pbswaprb, 249 enum nx_dpc_ycorder *pycorder, int *pbclipyc, 250 int *pbembeddedsync, enum nx_dpc_padclk *pclock, 251 int *pbinvertclock, int *pbdualview); 252 void nx_dpc_set_hsync(u32 module_index, u32 avwidth, u32 hsw, u32 hfp, 253 u32 hbp, int binvhsync); 254 void nx_dpc_get_hsync(u32 module_index, u32 *pavwidth, u32 *phsw, 255 u32 *phfp, u32 *phbp, int *pbinvhsync); 256 void nx_dpc_set_vsync(u32 module_index, u32 avheight, u32 vsw, u32 vfp, 257 u32 vbp, int binvvsync, u32 eavheight, u32 evsw, 258 u32 evfp, u32 evbp); 259 void nx_dpc_get_vsync(u32 module_index, u32 *pavheight, u32 *pvsw, 260 u32 *pvfp, u32 *pvbp, int *pbinvvsync, 261 u32 *peavheight, u32 *pevsw, u32 *pevfp, 262 u32 *pevbp); 263 void nx_dpc_set_vsync_offset(u32 module_index, u32 vssoffset, 264 u32 vseoffset, u32 evssoffset, 265 u32 evseoffset); 266 void nx_dpc_get_vsync_offset(u32 module_index, u32 *pvssoffset, 267 u32 *pvseoffset, u32 *pevssoffset, 268 u32 *pevseoffset); 269 270 u32 nx_dpc_enable_pad_tft(u32 module_index, u32 mode_index); 271 u32 nx_dpc_enable_pad_i80(u32 module_index, u32 mode_index); 272 273 enum syncgenmode { 274 progressive = 0, 275 interlace = 1 276 }; 277 278 enum polarity { 279 polarity_activehigh = 0, 280 polarity_activelow = 1 281 }; 282 283 enum outputformat { 284 outputformat_rgb555 = 0, 285 outputformat_rgb565 = 1, 286 outputformat_rgb666 = 2, 287 outputformat_rgb888 = 3, 288 outputformat_mrgb555a = 4, 289 outputformat_mrgb555b = 5, 290 outputformat_mrgb565 = 6, 291 outputformat_mrgb666 = 7, 292 outputformat_mrgb888a = 8, 293 outputformat_mrgb888b = 9, 294 outputformat_bgr555 = 10, 295 outputformat_bgr565 = 11, 296 outputformat_bgr666 = 12, 297 outputformat_bgr888 = 13, 298 outputformat_mbgr555a = 14, 299 outputformat_mbgr555b = 15, 300 outputformat_mbgr565 = 16, 301 outputformat_mbgr666 = 17, 302 outputformat_mbgr888a = 18, 303 outputformat_mbgr888b = 19, 304 outputformat_ccir656 = 20, 305 outputformat_ccir601_8 = 21, 306 outputformat_ccir601_16a = 22, 307 outputformat_ccir601_16b = 23, 308 outputformat_srgb888 = 24, 309 outputformat_srgbd8888 = 25 310 }; 311 312 enum outpadclksel { 313 padvclk = 0, 314 padvclk2 = 1, 315 padvclk3 = 2 316 }; 317 318 enum qmode { 319 qmode_220 = 0, 320 qmode_256 = 1 321 }; 322 323 void nx_dpc_set_sync(u32 module_index, enum syncgenmode sync_gen_mode, 324 u32 avwidth, u32 avheight, u32 hsw, u32 hfp, 325 u32 hbp, u32 vsw, u32 vfp, u32 vbp, 326 enum polarity field_polarity, 327 enum polarity hsyncpolarity, 328 enum polarity vsyncpolarity, u32 even_vsw, 329 u32 even_vfp, u32 even_vbp, u32 vsetpixel, 330 u32 vsclrpixel, u32 evenvsetpixel, 331 u32 evenvsclrpixel); 332 void nx_dpc_set_output_format(u32 module_index, 333 enum outputformat output_format, 334 u8 output_video_config); 335 void nx_dpc_set_quantization_mode(u32 module_index, enum qmode rgb2yc, 336 enum qmode yc2rgb); 337 void nx_dpc_set_enable(u32 module_index, int enable, int rgbmode, 338 int use_ntscsync, int use_analog_output, 339 int seavenable); 340 void nx_dpc_set_enable_with_interlace(u32 module_index, int enable, 341 int rgbmode, int use_ntscsync, 342 int use_analog_output, 343 int seavenable); 344 void nx_dpc_set_enable_with_interlace(u32 module_index, int enable, 345 int rgbmode, int use_ntscsync, 346 int use_analog_output, 347 int seavenable); 348 void nx_dpc_set_out_video_clk_select(u32 module_index, 349 enum outpadclksel out_pad_vclk_sel); 350 void nx_dpc_set_reg_flush(u32 module_index); 351 void nx_dpc_set_sramon(u32 module_index); 352 void nx_dpc_set_sync_lcdtype(u32 module_index, int stnlcd, 353 int dual_view_enb, int bit_widh, 354 u8 cpcycle); 355 void nx_dpc_set_up_scale_control(u32 module_index, int up_scale_enb, 356 int filter_enb, u32 hscale, 357 u16 source_width); 358 359 void nx_dpc_set_mputime(u32 module_index, u8 setup, u8 hold, u8 acc); 360 void nx_dpc_set_index(u32 module_index, u32 index); 361 void nx_dpc_set_data(u32 module_index, u32 data); 362 void nx_dpc_set_cmd_buffer_flush(u32 module_index); 363 void nx_dpc_set_cmd_buffer_clear(u32 module_index); 364 void nx_dpc_set_cmd_buffer_write(u32 module_index, u32 cmd_data); 365 void nx_dpc_set(u32 module_index); 366 u32 nx_dpc_get_data(u32 module_index); 367 u32 nx_dpc_get_status(u32 module_index); 368 void nx_dpc_rgbmask(u32 module_index, u32 rgbmask); 369 void nx_dpc_set_pad_location(u32 module_index, u32 index, u32 regvalue); 370 u32 nx_dpc_get_field_flag(u32 module_index); 371 372 void nx_dpc_set_sync_v(u32 module_index, u32 avheight, u32 vsw, u32 vfp, 373 u32 vbp); 374 375 int nx_dpc_init_reg_test(u32 module_index); 376 void nx_dpc_set_encoder_control_reg(u32 module_index, u32 param_a, 377 u32 param_b, u32 param_c); 378 void nx_dpc_set_encoder_shcphase_control(u32 module_index, 379 u32 chroma_param); 380 void nx_dpc_set_encoder_timing_config_reg(u32 module_index, u32 inctl); 381 void nx_dpc_set_encoder_dacoutput_select(u32 module_index, u8 dacsel0, 382 u8 dacsel1, u8 dacsel2, 383 u8 dacsel3, u8 dacsel4, 384 u8 dacsel5); 385 void nx_dpc_set_encoder_sync_location(u32 module_index, u16 hsoe, 386 u16 hsob, u16 vsob, u16 vsoe, 387 u8 vsost, int novrst); 388 void nx_dpc_set_encoder_dacpower_enable(u32 module_index, u8 dacpd); 389 void nx_dpc_set_ycorder(u32 module_index, enum nx_dpc_ycorder ycorder); 390 void nx_dpc_set_luma_gain(u32 module_index, u32 luma_gain); 391 392 void nx_dpc_set_secondary_dpcsync(u32 module_index, int benb); 393 int nx_dpc_get_secondary_dpcsync(u32 module_index); 394 void nx_dpc_set_encenable(u32 module_index, int benb); 395 int nx_dpc_get_encenable(u32 module_index); 396 void nx_dpc_set_video_encoder_power_down(u32 module_index, int benb); 397 int nx_dpc_get_video_encoder_power_down(u32 module_index); 398 void nx_dpc_set_video_encoder_mode(u32 module_index, enum nx_dpc_vbs vbs, 399 int bpedestal); 400 void nx_dpc_set_video_encoder_schlock_control(u32 module_index, 401 int bfreerun); 402 int nx_dpc_get_video_encoder_schlock_control(u32 module_index); 403 void nx_dpc_set_video_encoder_bandwidth(u32 module_index, 404 enum nx_dpc_bandwidth luma, 405 enum nx_dpc_bandwidth chroma); 406 void nx_dpc_get_video_encoder_bandwidth(u32 module_index, 407 enum nx_dpc_bandwidth *pluma, 408 enum nx_dpc_bandwidth *pchroma); 409 void nx_dpc_set_video_encoder_color_control(u32 module_index, s8 sch, 410 s8 hue, s8 sat, 411 s8 crt, s8 brt); 412 void nx_dpc_get_video_encoder_color_control(u32 module_index, 413 s8 *psch, s8 *phue, 414 s8 *psat, s8 *pcrt, 415 s8 *pbrt); 416 void nx_dpc_set_video_encoder_fscadjust(u32 module_index, 417 int16_t adjust); 418 u16 nx_dpc_get_video_encoder_fscadjust(u32 module_index); 419 void nx_dpc_set_video_encoder_timing(u32 module_index, u32 hsos, 420 u32 hsoe, u32 vsos, u32 vsoe); 421 void nx_dpc_get_video_encoder_timing(u32 module_index, u32 *phsos, 422 u32 *phsoe, u32 *pvsos, 423 u32 *pvsoe); 424 void nx_dpc_set_sync_v(u32 module_index, u32 avheight, u32 vsw, u32 vfp, 425 u32 vbp); 426 427 int nx_dpc_init_reg_test(u32 module_index); 428 void nx_dpc_set_encoder_control_reg(u32 module_index, u32 param_a, 429 u32 param_b, u32 param_c); 430 void nx_dpc_set_encoder_shcphase_control(u32 module_index, 431 u32 chroma_param); 432 void nx_dpc_set_encoder_timing_config_reg(u32 module_index, u32 inctl); 433 void nx_dpc_set_encoder_dacoutput_select(u32 module_index, u8 dacsel0, 434 u8 dacsel1, u8 dacsel2, 435 u8 dacsel3, u8 dacsel4, 436 u8 dacsel5); 437 void nx_dpc_set_encoder_sync_location(u32 module_index, u16 hsoe, 438 u16 hsob, u16 vsob, u16 vsoe, 439 u8 vsost, int novrst); 440 void nx_dpc_set_encoder_dacpower_enable(u32 module_index, u8 dacpd); 441 void nx_dpc_set_ycorder(u32 module_index, enum nx_dpc_ycorder ycorder); 442 void nx_dpc_set_luma_gain(u32 module_index, u32 luma_gain); 443 444 #endif 445