OLD | NEW |
(Empty) | |
| 1 /* linux/drivers/media/video/samsung/tv20/sdout_s5pv210.c |
| 2 * |
| 3 * Copyright (c) 2010 Samsung Electronics Co., Ltd. |
| 4 * http://www.samsung.com/ |
| 5 * |
| 6 * S5PV210 - tv encoder raw ftn file for Samsung TVOut driver |
| 7 * |
| 8 * This program is free software; you can redistribute it and/or modify |
| 9 * it under the terms of the GNU General Public License version 2 as |
| 10 * published by the Free Software Foundation. |
| 11 */ |
| 12 |
| 13 #include <linux/module.h> |
| 14 #include <linux/kernel.h> |
| 15 #include <linux/platform_device.h> |
| 16 #include <linux/clk.h> |
| 17 #include <linux/delay.h> |
| 18 |
| 19 #include <plat/clock.h> |
| 20 #include <linux/io.h> |
| 21 #include <linux/uaccess.h> |
| 22 #include <asm/sizes.h> |
| 23 #include <linux/memory.h> |
| 24 |
| 25 #include "tv_out_s5pv210.h" |
| 26 |
| 27 #include <mach/regs-sdaout.h> |
| 28 |
| 29 #ifdef CONFIG_TVOUT_RAW_DBG |
| 30 #define S5P_SDAOUT_DEBUG 1 |
| 31 #endif |
| 32 |
| 33 #ifdef S5P_SDAOUT_DEBUG |
| 34 #define SDPRINTK(fmt, args...) \ |
| 35 printk(KERN_INFO "\t\t[SDOUT] %s: " fmt, __func__ , ## args) |
| 36 #else |
| 37 #define SDPRINTK(fmt, args...) |
| 38 #endif |
| 39 |
| 40 static struct resource *sdout_mem; |
| 41 void __iomem *sdout_base; |
| 42 |
| 43 /* |
| 44 * initialization - iniization functions are only called under stopping SDOUT |
| 45 */ |
| 46 enum s5p_tv_sd_err tv_sdout_init_video_scale_cfg( |
| 47 enum s5p_sd_level component_level, |
| 48 enum s5p_sd_vsync_ratio component_ratio, |
| 49 enum s5p_sd_level composite_level, |
| 50 enum s5p_sd_vsync_ratio composite_ratio) |
| 51 { |
| 52 u32 temp_reg = 0; |
| 53 |
| 54 SDPRINTK("%d,%d,%d,%d\n\r", component_level, component_ratio, |
| 55 composite_level, composite_ratio); |
| 56 |
| 57 switch (component_level) { |
| 58 |
| 59 case S5P_TV_SD_LEVEL_0IRE: |
| 60 temp_reg = SDO_COMPONENT_LEVEL_SEL_0IRE; |
| 61 break; |
| 62 |
| 63 case S5P_TV_SD_LEVEL_75IRE: |
| 64 temp_reg = SDO_COMPONENT_LEVEL_SEL_75IRE; |
| 65 break; |
| 66 |
| 67 default: |
| 68 SDPRINTK("invalid component_level parameter(%d)\n\r", |
| 69 component_level); |
| 70 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 71 } |
| 72 |
| 73 switch (composite_level) { |
| 74 |
| 75 case SDOUT_VTOS_RATIO_10_4: |
| 76 temp_reg |= SDO_COMPONENT_VTOS_RATIO_10_4; |
| 77 break; |
| 78 |
| 79 case SDOUT_VTOS_RATIO_7_3: |
| 80 temp_reg |= SDO_COMPONENT_VTOS_RATIO_7_3; |
| 81 break; |
| 82 |
| 83 default: |
| 84 SDPRINTK(" invalid composite_level parameter(%d)\n\r", |
| 85 composite_level); |
| 86 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 87 } |
| 88 |
| 89 switch (composite_level) { |
| 90 |
| 91 case S5P_TV_SD_LEVEL_0IRE: |
| 92 temp_reg |= SDO_COMPOSITE_LEVEL_SEL_0IRE; |
| 93 break; |
| 94 |
| 95 case S5P_TV_SD_LEVEL_75IRE: |
| 96 temp_reg |= SDO_COMPOSITE_LEVEL_SEL_75IRE; |
| 97 break; |
| 98 |
| 99 default: |
| 100 SDPRINTK("invalid composite_ratio parameter(%d)\n\r", |
| 101 composite_ratio); |
| 102 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 103 } |
| 104 |
| 105 switch (composite_ratio) { |
| 106 |
| 107 case SDOUT_VTOS_RATIO_10_4: |
| 108 temp_reg |= SDO_COMPOSITE_VTOS_RATIO_10_4; |
| 109 break; |
| 110 |
| 111 case SDOUT_VTOS_RATIO_7_3: |
| 112 temp_reg |= SDO_COMPOSITE_VTOS_RATIO_7_3; |
| 113 break; |
| 114 |
| 115 default: |
| 116 SDPRINTK("invalid component_ratio parameter(%d)\n\r", |
| 117 component_ratio); |
| 118 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 119 } |
| 120 |
| 121 writel(temp_reg, sdout_base + S5P_SDO_SCALE); |
| 122 |
| 123 SDPRINTK("0x%08x)\n\r", readl(sdout_base + S5P_SDO_SCALE)); |
| 124 |
| 125 return SDOUT_NO_ERROR; |
| 126 } |
| 127 |
| 128 enum s5p_tv_sd_err tv_sdout_init_sync_signal_pin(enum s5p_sd_sync_sig_pin pin) |
| 129 { |
| 130 SDPRINTK("%d\n\r", pin); |
| 131 |
| 132 switch (pin) { |
| 133 |
| 134 case SDOUT_SYNC_SIG_NO: |
| 135 writel(SDO_COMPONENT_SYNC_ABSENT, sdout_base + S5P_SDO_SYNC); |
| 136 break; |
| 137 |
| 138 case SDOUT_SYNC_SIG_YG: |
| 139 writel(SDO_COMPONENT_SYNC_YG, sdout_base + S5P_SDO_SYNC); |
| 140 break; |
| 141 |
| 142 case SDOUT_SYNC_SIG_ALL: |
| 143 writel(SDO_COMPONENT_SYNC_ALL, sdout_base + S5P_SDO_SYNC); |
| 144 break; |
| 145 |
| 146 default: |
| 147 SDPRINTK("invalid pin parameter(%d)\n\r", pin); |
| 148 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 149 } |
| 150 |
| 151 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_SYNC)); |
| 152 |
| 153 return SDOUT_NO_ERROR; |
| 154 } |
| 155 |
| 156 enum s5p_tv_sd_err tv_sdout_init_vbi(bool wss_cvbs, |
| 157 enum s5p_sd_closed_caption_type caption_cvbs, |
| 158 bool wss_y_sideo, |
| 159 enum s5p_sd_closed_caption_type caption_y_sideo, |
| 160 bool cgmsa_rgb, |
| 161 bool wss_rgb, |
| 162 enum s5p_sd_closed_caption_type caption_rgb, |
| 163 bool cgmsa_y_ppr, |
| 164 bool wss_y_ppr, |
| 165 enum s5p_sd_closed_caption_type caption_y_ppr) |
| 166 { |
| 167 u32 temp_reg = 0; |
| 168 |
| 169 SDPRINTK(" %d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n\r", |
| 170 wss_cvbs, caption_cvbs, wss_y_sideo, |
| 171 caption_y_sideo, cgmsa_rgb, wss_rgb, |
| 172 caption_rgb, cgmsa_y_ppr, wss_y_ppr, caption_y_ppr); |
| 173 |
| 174 if (wss_cvbs) |
| 175 temp_reg = SDO_CVBS_WSS_INS; |
| 176 else |
| 177 temp_reg = SDO_CVBS_NO_WSS; |
| 178 |
| 179 switch (caption_cvbs) { |
| 180 |
| 181 case SDOUT_NO_INS: |
| 182 temp_reg |= SDO_CVBS_NO_CLOSED_CAPTION; |
| 183 break; |
| 184 |
| 185 case SDOUT_INS_1: |
| 186 temp_reg |= SDO_CVBS_21H_CLOSED_CAPTION; |
| 187 break; |
| 188 |
| 189 case SDOUT_INS_2: |
| 190 temp_reg |= SDO_CVBS_21H_284H_CLOSED_CAPTION; |
| 191 break; |
| 192 |
| 193 case SDOUT_INS_OTHERS: |
| 194 temp_reg |= SDO_CVBS_USE_OTHERS; |
| 195 break; |
| 196 |
| 197 default: |
| 198 SDPRINTK(" invalid caption_cvbs parameter(%d)\n\r", |
| 199 caption_cvbs); |
| 200 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 201 } |
| 202 |
| 203 if (wss_y_sideo) |
| 204 temp_reg |= SDO_SVIDEO_WSS_INS; |
| 205 else |
| 206 temp_reg |= SDO_SVIDEO_NO_WSS; |
| 207 |
| 208 switch (caption_y_sideo) { |
| 209 |
| 210 case SDOUT_NO_INS: |
| 211 temp_reg |= SDO_SVIDEO_NO_CLOSED_CAPTION; |
| 212 break; |
| 213 |
| 214 case SDOUT_INS_1: |
| 215 temp_reg |= SDO_SVIDEO_21H_CLOSED_CAPTION; |
| 216 break; |
| 217 |
| 218 case SDOUT_INS_2: |
| 219 temp_reg |= SDO_SVIDEO_21H_284H_CLOSED_CAPTION; |
| 220 break; |
| 221 |
| 222 case SDOUT_INS_OTHERS: |
| 223 temp_reg |= SDO_SVIDEO_USE_OTHERS; |
| 224 break; |
| 225 |
| 226 default: |
| 227 SDPRINTK("invalid caption_y_sideo parameter(%d)\n\r", |
| 228 caption_y_sideo); |
| 229 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 230 } |
| 231 |
| 232 if (cgmsa_rgb) |
| 233 temp_reg |= SDO_RGB_CGMSA_INS; |
| 234 else |
| 235 temp_reg |= SDO_RGB_NO_CGMSA; |
| 236 |
| 237 if (wss_rgb) |
| 238 temp_reg |= SDO_RGB_WSS_INS; |
| 239 else |
| 240 temp_reg |= SDO_RGB_NO_WSS; |
| 241 |
| 242 switch (caption_rgb) { |
| 243 |
| 244 case SDOUT_NO_INS: |
| 245 temp_reg |= SDO_RGB_NO_CLOSED_CAPTION; |
| 246 break; |
| 247 |
| 248 case SDOUT_INS_1: |
| 249 temp_reg |= SDO_RGB_21H_CLOSED_CAPTION; |
| 250 break; |
| 251 |
| 252 case SDOUT_INS_2: |
| 253 temp_reg |= SDO_RGB_21H_284H_CLOSED_CAPTION; |
| 254 break; |
| 255 |
| 256 case SDOUT_INS_OTHERS: |
| 257 temp_reg |= SDO_RGB_USE_OTHERS; |
| 258 break; |
| 259 |
| 260 default: |
| 261 SDPRINTK(" invalid caption_rgb parameter(%d)\n\r", |
| 262 caption_rgb); |
| 263 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 264 } |
| 265 |
| 266 if (cgmsa_y_ppr) |
| 267 temp_reg |= SDO_YPBPR_CGMSA_INS; |
| 268 else |
| 269 temp_reg |= SDO_YPBPR_NO_CGMSA; |
| 270 |
| 271 if (wss_y_ppr) |
| 272 temp_reg |= SDO_YPBPR_WSS_INS; |
| 273 else |
| 274 temp_reg |= SDO_YPBPR_NO_WSS; |
| 275 |
| 276 switch (caption_y_ppr) { |
| 277 |
| 278 case SDOUT_NO_INS: |
| 279 temp_reg |= SDO_YPBPR_NO_CLOSED_CAPTION; |
| 280 break; |
| 281 |
| 282 case SDOUT_INS_1: |
| 283 temp_reg |= SDO_YPBPR_21H_CLOSED_CAPTION; |
| 284 break; |
| 285 |
| 286 case SDOUT_INS_2: |
| 287 temp_reg |= SDO_YPBPR_21H_284H_CLOSED_CAPTION; |
| 288 break; |
| 289 |
| 290 case SDOUT_INS_OTHERS: |
| 291 temp_reg |= SDO_YPBPR_USE_OTHERS; |
| 292 break; |
| 293 |
| 294 default: |
| 295 SDPRINTK("invalid caption_y_ppr parameter(%d)\n\r", |
| 296 caption_y_ppr); |
| 297 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 298 } |
| 299 |
| 300 writel(temp_reg, sdout_base + S5P_SDO_VBI); |
| 301 |
| 302 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_VBI)); |
| 303 |
| 304 return SDOUT_NO_ERROR; |
| 305 } |
| 306 |
| 307 enum s5p_tv_sd_err tv_sdout_init_offset_gain(enum s5p_sd_channel_sel channel, |
| 308 u32 offset, |
| 309 u32 gain) |
| 310 { |
| 311 SDPRINTK("%d,%d,%d\n\r", channel, offset, gain); |
| 312 |
| 313 switch (channel) { |
| 314 |
| 315 case SDOUT_CHANNEL_0: |
| 316 writel(SDO_SCALE_CONV_OFFSET(offset) | |
| 317 SDO_SCALE_CONV_GAIN(gain), |
| 318 sdout_base + S5P_SDO_SCALE_CH0); |
| 319 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_SCALE_CH0)); |
| 320 break; |
| 321 |
| 322 case SDOUT_CHANNEL_1: |
| 323 writel(SDO_SCALE_CONV_OFFSET(offset) | |
| 324 SDO_SCALE_CONV_GAIN(gain), |
| 325 sdout_base + S5P_SDO_SCALE_CH1); |
| 326 SDPRINTK(" 0x%08x\n\r", readl(sdout_base + S5P_SDO_SCALE_CH1)); |
| 327 break; |
| 328 |
| 329 case SDOUT_CHANNEL_2: |
| 330 writel(SDO_SCALE_CONV_OFFSET(offset) | |
| 331 SDO_SCALE_CONV_GAIN(gain), |
| 332 sdout_base + S5P_SDO_SCALE_CH2); |
| 333 SDPRINTK(" 0x%08x\n\r", readl(sdout_base + S5P_SDO_SCALE_CH2)); |
| 334 break; |
| 335 |
| 336 default: |
| 337 SDPRINTK(" invalid channel parameter(%d)\n\r", channel); |
| 338 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 339 } |
| 340 |
| 341 return SDOUT_NO_ERROR; |
| 342 } |
| 343 |
| 344 void tv_sdout_init_delay(u32 delay_y, |
| 345 u32 offset_video_start, |
| 346 u32 offset_video_end) |
| 347 { |
| 348 SDPRINTK("%d,%d,%d\n\r", delay_y, offset_video_start, offset_video_end); |
| 349 |
| 350 writel(SDO_DELAY_YTOC( |
| 351 delay_y) | SDO_ACTIVE_START_OFFSET(offset_video_start) | |
| 352 SDO_ACTIVE_END_OFFSET(offset_video_end), |
| 353 sdout_base + S5P_SDO_YCDELAY); |
| 354 |
| 355 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_YCDELAY)); |
| 356 } |
| 357 |
| 358 void tv_sdout_init_schlock(bool color_sucarrier_pha_adj) |
| 359 { |
| 360 SDPRINTK("%d\n\r", color_sucarrier_pha_adj); |
| 361 |
| 362 if (color_sucarrier_pha_adj) |
| 363 writel(SDO_COLOR_SC_PHASE_ADJ, sdout_base + S5P_SDO_SCHLOCK); |
| 364 else |
| 365 writel(SDO_COLOR_SC_PHASE_NOADJ, sdout_base + S5P_SDO_SCHLOCK); |
| 366 |
| 367 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_SCHLOCK)); |
| 368 } |
| 369 |
| 370 enum s5p_tv_sd_err tv_sdout_init_dac_power_onoff( |
| 371 enum s5p_sd_channel_sel channel, bool dac_on) |
| 372 { |
| 373 u32 temp_on_off; |
| 374 |
| 375 SDPRINTK("%d,%d)\n\r", channel, dac_on); |
| 376 |
| 377 switch (channel) { |
| 378 |
| 379 case SDOUT_CHANNEL_0: |
| 380 temp_on_off = SDO_POWER_ON_DAC0; |
| 381 break; |
| 382 |
| 383 case SDOUT_CHANNEL_1: |
| 384 temp_on_off = SDO_POWER_ON_DAC1; |
| 385 break; |
| 386 |
| 387 case SDOUT_CHANNEL_2: |
| 388 temp_on_off = SDO_POWER_ON_DAC2; |
| 389 break; |
| 390 |
| 391 default: |
| 392 SDPRINTK("invalid channel parameter(%d)\n\r", channel); |
| 393 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 394 } |
| 395 |
| 396 if (dac_on) { |
| 397 writel(readl(sdout_base + S5P_SDO_DAC) | temp_on_off, |
| 398 sdout_base + S5P_SDO_DAC); |
| 399 } else { |
| 400 writel(readl(sdout_base + S5P_SDO_DAC) & ~temp_on_off, |
| 401 sdout_base + S5P_SDO_DAC); |
| 402 } |
| 403 |
| 404 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_DAC)); |
| 405 |
| 406 return SDOUT_NO_ERROR; |
| 407 } |
| 408 |
| 409 void tv_sdout_init_color_compensaton_onoff(bool bright_hue_saturation_adj, |
| 410 bool y_ppr_color_compensation, |
| 411 bool rgcolor_compensation, |
| 412 bool y_c_color_compensation, |
| 413 bool y_cvbs_color_compensation) |
| 414 { |
| 415 u32 temp_reg = 0; |
| 416 |
| 417 SDPRINTK("%d,%d,%d,%d,%d)\n\r", bright_hue_saturation_adj, |
| 418 y_ppr_color_compensation, rgcolor_compensation, |
| 419 y_c_color_compensation, y_cvbs_color_compensation); |
| 420 |
| 421 if (bright_hue_saturation_adj) |
| 422 temp_reg &= ~SDO_COMPONENT_BHS_ADJ_OFF; |
| 423 else |
| 424 temp_reg |= SDO_COMPONENT_BHS_ADJ_OFF; |
| 425 |
| 426 if (y_ppr_color_compensation) |
| 427 temp_reg &= ~SDO_COMPONENT_YPBPR_COMP_OFF; |
| 428 else |
| 429 temp_reg |= SDO_COMPONENT_YPBPR_COMP_OFF; |
| 430 |
| 431 if (rgcolor_compensation) |
| 432 temp_reg &= ~SDO_COMPONENT_RGB_COMP_OFF; |
| 433 else |
| 434 temp_reg |= SDO_COMPONENT_RGB_COMP_OFF; |
| 435 |
| 436 if (y_c_color_compensation) |
| 437 temp_reg &= ~SDO_COMPONENT_YC_COMP_OFF; |
| 438 else |
| 439 temp_reg |= SDO_COMPONENT_YC_COMP_OFF; |
| 440 |
| 441 if (y_cvbs_color_compensation) |
| 442 temp_reg &= ~SDO_COMPONENT_CVBS_COMP_OFF; |
| 443 else |
| 444 temp_reg |= SDO_COMPONENT_CVBS_COMP_OFF; |
| 445 |
| 446 writel(temp_reg, sdout_base + S5P_SDO_CCCON); |
| 447 |
| 448 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_CCCON)); |
| 449 } |
| 450 |
| 451 void tv_sdout_init_brightness_hue_saturation(u32 gain_brightness, |
| 452 u32 offset_brightness, |
| 453 u32 gain0_cb_hue_saturation, |
| 454 u32 gain1_cb_hue_saturation, |
| 455 u32 gain0_cr_hue_saturation, |
| 456 u32 gain1_cr_hue_saturation, |
| 457 u32 offset_cb_hue_saturation, |
| 458 u32 offset_cr_hue_saturation) |
| 459 { |
| 460 SDPRINTK(" %d,%d,%d,%d,%d,%d,%d,%d)\n\r", gain_brightness, |
| 461 offset_brightness, gain0_cb_hue_saturation, |
| 462 gain1_cb_hue_saturation, gain0_cr_hue_saturation, |
| 463 gain1_cr_hue_saturation, offset_cb_hue_saturation, |
| 464 offset_cr_hue_saturation); |
| 465 |
| 466 writel(SDO_BRIGHTNESS_GAIN(gain_brightness) | |
| 467 SDO_BRIGHTNESS_OFFSET(offset_brightness), |
| 468 sdout_base + S5P_SDO_YSCALE); |
| 469 |
| 470 writel(SDO_HS_CB_GAIN0(gain0_cb_hue_saturation) | |
| 471 SDO_HS_CB_GAIN1(gain1_cb_hue_saturation), |
| 472 sdout_base + S5P_SDO_CBSCALE); |
| 473 |
| 474 writel(SDO_HS_CR_GAIN0(gain0_cr_hue_saturation) | |
| 475 SDO_HS_CR_GAIN1(gain1_cr_hue_saturation), |
| 476 sdout_base + S5P_SDO_CRSCALE); |
| 477 |
| 478 writel(SDO_HS_CR_OFFSET(offset_cr_hue_saturation) | |
| 479 SDO_HS_CB_OFFSET(offset_cb_hue_saturation), |
| 480 sdout_base + S5P_SDO_CB_CR_OFFSET); |
| 481 |
| 482 SDPRINTK("0x%08x,0x%08x,0x%08x,0x%08x)\n\r", |
| 483 readl(sdout_base + S5P_SDO_YSCALE), |
| 484 readl(sdout_base + S5P_SDO_CBSCALE), |
| 485 readl(sdout_base + S5P_SDO_CRSCALE), |
| 486 readl(sdout_base + S5P_SDO_CB_CR_OFFSET)); |
| 487 } |
| 488 |
| 489 void tv_sdout_init_rgb_color_compensation(u32 max_rgbcube, |
| 490 u32 min_rgbcube) |
| 491 { |
| 492 SDPRINTK("0x%08x,0x%08x\n\r", max_rgbcube, min_rgbcube); |
| 493 |
| 494 writel(SDO_MAX_RGB_CUBE(max_rgbcube) | SDO_MIN_RGB_CUBE(min_rgbcube), |
| 495 sdout_base + S5P_SDO_RGB_CC); |
| 496 |
| 497 SDPRINTK("0x%08x)\n\r", readl(sdout_base + S5P_SDO_RGB_CC)); |
| 498 } |
| 499 |
| 500 void tv_sdout_init_cvbs_color_compensation(u32 y_lower_mid, |
| 501 u32 y_bottom, |
| 502 u32 y_top, |
| 503 u32 y_upper_mid, |
| 504 u32 radius) |
| 505 { |
| 506 SDPRINTK("%d,%d,%d,%d,%d\n\r", y_lower_mid, y_bottom, |
| 507 y_top, y_upper_mid, radius); |
| 508 |
| 509 writel(SDO_Y_LOWER_MID_CVBS_CORN(y_lower_mid) | |
| 510 SDO_Y_BOTTOM_CVBS_CORN(y_bottom), |
| 511 sdout_base + S5P_SDO_CVBS_CC_Y1); |
| 512 writel(SDO_Y_TOP_CVBS_CORN(y_top) | |
| 513 SDO_Y_UPPER_MID_CVBS_CORN(y_upper_mid), |
| 514 sdout_base + S5P_SDO_CVBS_CC_Y2); |
| 515 writel(SDO_RADIUS_CVBS_CORN(radius), sdout_base + S5P_SDO_CVBS_CC_C); |
| 516 |
| 517 SDPRINTK("0x%08x,0x%08x,0x%08x)\n\r", |
| 518 readl(sdout_base + S5P_SDO_CVBS_CC_Y1), |
| 519 readl(sdout_base + S5P_SDO_CVBS_CC_Y2), |
| 520 readl(sdout_base + S5P_SDO_CVBS_CC_C)); |
| 521 } |
| 522 |
| 523 void tv_sdout_init_svideo_color_compensation(u32 y_top, |
| 524 u32 y_bottom, |
| 525 u32 y_c_cylinder) |
| 526 { |
| 527 SDPRINTK(" %d,%d,%d)\n\r", y_top, y_bottom, y_c_cylinder); |
| 528 |
| 529 writel(SDO_Y_TOP_YC_CYLINDER(y_top) | |
| 530 SDO_Y_BOTOM_YC_CYLINDER(y_bottom), |
| 531 sdout_base + S5P_SDO_YC_CC_Y); |
| 532 writel(SDO_RADIUS_YC_CYLINDER(y_c_cylinder), |
| 533 sdout_base + S5P_SDO_YC_CC_C); |
| 534 |
| 535 SDPRINTK("0x%08x,0x%08x)\n\r", readl(sdout_base + S5P_SDO_YC_CC_Y), |
| 536 readl(sdout_base + S5P_SDO_YC_CC_C)); |
| 537 } |
| 538 |
| 539 void tv_sdout_init_component_porch(u32 back_525, |
| 540 u32 front_525, |
| 541 u32 back_625, |
| 542 u32 front_625) |
| 543 { |
| 544 SDPRINTK(" %d,%d,%d,%d)\n\r", back_525, front_525, back_625, front_625); |
| 545 |
| 546 writel(SDO_COMPONENT_525_BP(back_525) | |
| 547 SDO_COMPONENT_525_FP(front_525), |
| 548 sdout_base + S5P_SDO_CSC_525_PORCH); |
| 549 writel(SDO_COMPONENT_625_BP(back_625) | |
| 550 SDO_COMPONENT_625_FP(front_625), |
| 551 sdout_base + S5P_SDO_CSC_625_PORCH); |
| 552 |
| 553 SDPRINTK(" 0x%08x,0x%08x)\n\r", |
| 554 readl(sdout_base + S5P_SDO_CSC_525_PORCH), |
| 555 readl(sdout_base + S5P_SDO_CSC_625_PORCH)); |
| 556 } |
| 557 |
| 558 enum s5p_tv_sd_err tv_sdout_init_vesa_rgb_sync( |
| 559 enum s5p_sd_vesa_rgb_sync_type sync_type, |
| 560 enum s5p_tv_active_polarity v_sync_active, |
| 561 enum s5p_tv_active_polarity h_sync_active) |
| 562 { |
| 563 u32 temp_reg = 0; |
| 564 |
| 565 SDPRINTK("%d,%d,%d\n\r", sync_type, v_sync_active, h_sync_active); |
| 566 |
| 567 switch (sync_type) { |
| 568 |
| 569 case SDOUT_VESA_RGB_SYNC_COMPOSITE: |
| 570 temp_reg |= SDO_RGB_SYNC_COMPOSITE; |
| 571 break; |
| 572 |
| 573 case SDOUT_VESA_RGB_SYNC_SEPARATE: |
| 574 temp_reg |= SDO_RGB_SYNC_SEPERATE; |
| 575 break; |
| 576 |
| 577 default: |
| 578 SDPRINTK(" invalid sync_type parameter(%d)\n\r", |
| 579 sync_type); |
| 580 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 581 } |
| 582 |
| 583 switch (v_sync_active) { |
| 584 |
| 585 case TVOUT_POL_ACTIVE_LOW: |
| 586 temp_reg |= SDO_RGB_VSYNC_LOW_ACT; |
| 587 break; |
| 588 |
| 589 case TVOUT_POL_ACTIVE_HIGH: |
| 590 temp_reg |= SDO_RGB_VSYNC_HIGH_ACT; |
| 591 break; |
| 592 |
| 593 default: |
| 594 SDPRINTK(" invalid v_sync_active parameter(%d)\n\r", |
| 595 v_sync_active); |
| 596 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 597 } |
| 598 |
| 599 switch (h_sync_active) { |
| 600 |
| 601 case TVOUT_POL_ACTIVE_LOW: |
| 602 temp_reg |= SDO_RGB_HSYNC_LOW_ACT; |
| 603 break; |
| 604 |
| 605 case TVOUT_POL_ACTIVE_HIGH: |
| 606 temp_reg |= SDO_RGB_HSYNC_HIGH_ACT; |
| 607 break; |
| 608 |
| 609 default: |
| 610 SDPRINTK(" invalid h_sync_active parameter(%d)\n\r", |
| 611 h_sync_active); |
| 612 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 613 } |
| 614 |
| 615 writel(temp_reg, sdout_base + S5P_SDO_RGBSYNC); |
| 616 |
| 617 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_RGBSYNC)); |
| 618 |
| 619 return SDOUT_NO_ERROR; |
| 620 } |
| 621 |
| 622 void tv_sdout_init_oversampling_filter_coeff(u32 size, |
| 623 u32 *coeff, |
| 624 u32 *coeff1, |
| 625 u32 *coeff2) |
| 626 { |
| 627 u32 *temp_reg = 0; |
| 628 |
| 629 SDPRINTK(" %d,0x%x,0x%x,0x%x\n\r", (u32)size, (u32)coeff, (u32)coeff1, |
| 630 (u32)coeff2); |
| 631 |
| 632 if (coeff != NULL) { |
| 633 temp_reg = (u32 *)readl(sdout_base + S5P_SDO_OSFC00_0); |
| 634 memcpy((void *)temp_reg, (const void *)coeff, size*4); |
| 635 } |
| 636 |
| 637 if (coeff1 != NULL) { |
| 638 temp_reg = (u32 *)readl(sdout_base + S5P_SDO_OSFC00_1); |
| 639 memcpy((void *)temp_reg, (const void *)coeff1, size*4); |
| 640 } |
| 641 |
| 642 if (coeff2 != NULL) { |
| 643 temp_reg = (u32 *)readl(sdout_base + S5P_SDO_OSFC00_2); |
| 644 memcpy((void *)temp_reg, (const void *)coeff2, size*4); |
| 645 } |
| 646 |
| 647 SDPRINTK(" ()\n\r"); |
| 648 } |
| 649 |
| 650 enum s5p_tv_sd_err tv_sdout_init_ch_xtalk_cancel_coef( |
| 651 enum s5p_sd_channel_sel channel, |
| 652 u32 coeff2, |
| 653 u32 coeff1) |
| 654 { |
| 655 SDPRINTK(" %d,%d,%d\n\r", channel, coeff2, coeff1); |
| 656 |
| 657 switch (channel) { |
| 658 |
| 659 case SDOUT_CHANNEL_0: |
| 660 writel(SDO_XTALK_COEF02(coeff2) | SDO_XTALK_COEF01(coeff1), |
| 661 sdout_base + S5P_SDO_XTALK0); |
| 662 SDPRINTK(" 0x%08x)\n\r", readl(sdout_base + S5P_SDO_XTALK0)); |
| 663 break; |
| 664 |
| 665 case SDOUT_CHANNEL_1: |
| 666 writel(SDO_XTALK_COEF02(coeff2) | SDO_XTALK_COEF01(coeff1), |
| 667 sdout_base + S5P_SDO_XTALK1); |
| 668 SDPRINTK(" 0x%08x)\n\r", readl(sdout_base + S5P_SDO_XTALK1)); |
| 669 break; |
| 670 |
| 671 case SDOUT_CHANNEL_2: |
| 672 writel(SDO_XTALK_COEF02(coeff2) | SDO_XTALK_COEF01(coeff1), |
| 673 sdout_base + S5P_SDO_XTALK2); |
| 674 SDPRINTK("0x%08x)\n\r", readl(sdout_base + S5P_SDO_XTALK2)); |
| 675 break; |
| 676 |
| 677 default: |
| 678 SDPRINTK(" invalid channel parameter(%d)\n\r", channel); |
| 679 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 680 } |
| 681 |
| 682 return SDOUT_NO_ERROR; |
| 683 } |
| 684 |
| 685 void tv_sdout_init_closed_caption(u32 display_cc, u32 non_display_cc) |
| 686 { |
| 687 SDPRINTK("%d,%d\n\r", display_cc, non_display_cc); |
| 688 |
| 689 writel(SDO_DISPLAY_CC_CAPTION(display_cc) | |
| 690 SDO_NON_DISPLAY_CC_CAPTION(non_display_cc), |
| 691 sdout_base + S5P_SDO_ARMCC); |
| 692 |
| 693 SDPRINTK("0x%x\n\r", readl(sdout_base + S5P_SDO_ARMCC)); |
| 694 } |
| 695 |
| 696 /* static functions */ |
| 697 static u32 tv_sdout_init_wss_cgms_crc(u32 value) |
| 698 { |
| 699 u8 i; |
| 700 u8 CGMS[14], CRC[6], OLD_CRC; |
| 701 u32 temp_in; |
| 702 |
| 703 temp_in = value; |
| 704 |
| 705 for (i = 0; i < 14; i++) |
| 706 CGMS[i] = (u8)(temp_in >> i) & 0x1 ; |
| 707 |
| 708 /* initialize state */ |
| 709 for (i = 0; i < 6; i++) |
| 710 CRC[i] = 0x1; |
| 711 |
| 712 /* round 20 */ |
| 713 for (i = 0; i < 14; i++) { |
| 714 OLD_CRC = CRC[0]; |
| 715 CRC[0] = CRC[1]; |
| 716 CRC[1] = CRC[2]; |
| 717 CRC[2] = CRC[3]; |
| 718 CRC[3] = CRC[4]; |
| 719 CRC[4] = OLD_CRC ^ CGMS[i] ^ CRC[5]; |
| 720 CRC[5] = OLD_CRC ^ CGMS[i]; |
| 721 } |
| 722 |
| 723 /* recompose to return crc */ |
| 724 temp_in &= 0x3fff; |
| 725 |
| 726 for (i = 0; i < 6; i++) |
| 727 temp_in |= ((u32)(CRC[i] & 0x1) << i); |
| 728 |
| 729 return temp_in; |
| 730 } |
| 731 |
| 732 |
| 733 enum s5p_tv_sd_err tv_sdout_init_wss525_data( |
| 734 enum s5p_sd_525_copy_permit copy_permit, |
| 735 enum s5p_sd_525_mv_psp mv_psp, |
| 736 enum s5p_sd_525_copy_info copy_info, |
| 737 bool analog_on, |
| 738 enum s5p_sd_525_aspect_ratio display_ratio) |
| 739 { |
| 740 u32 temp_reg = 0; |
| 741 |
| 742 SDPRINTK("%d,%d,%d,%d\n\r", copy_permit, mv_psp, copy_info, |
| 743 display_ratio); |
| 744 |
| 745 switch (copy_permit) { |
| 746 |
| 747 case SDO_525_COPY_PERMIT: |
| 748 temp_reg = SDO_WORD2_WSS525_COPY_PERMIT; |
| 749 break; |
| 750 |
| 751 case SDO_525_ONECOPY_PERMIT: |
| 752 temp_reg = SDO_WORD2_WSS525_ONECOPY_PERMIT; |
| 753 break; |
| 754 |
| 755 case SDO_525_NOCOPY_PERMIT: |
| 756 temp_reg = SDO_WORD2_WSS525_NOCOPY_PERMIT; |
| 757 break; |
| 758 |
| 759 default: |
| 760 SDPRINTK(" invalid copy_permit parameter(%d)\n\r", |
| 761 copy_permit); |
| 762 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 763 } |
| 764 |
| 765 switch (mv_psp) { |
| 766 |
| 767 case SDO_525_MV_PSP_OFF: |
| 768 temp_reg |= SDO_WORD2_WSS525_MV_PSP_OFF; |
| 769 break; |
| 770 |
| 771 case SDO_525_MV_PSP_ON_2LINE_BURST: |
| 772 temp_reg |= SDO_WORD2_WSS525_MV_PSP_ON_2LINE_BURST; |
| 773 break; |
| 774 |
| 775 case SDO_525_MV_PSP_ON_BURST_OFF: |
| 776 temp_reg |= SDO_WORD2_WSS525_MV_PSP_ON_BURST_OFF; |
| 777 break; |
| 778 |
| 779 case SDO_525_MV_PSP_ON_4LINE_BURST: |
| 780 temp_reg |= SDO_WORD2_WSS525_MV_PSP_ON_4LINE_BURST; |
| 781 break; |
| 782 |
| 783 default: |
| 784 SDPRINTK(" invalid mv_psp parameter(%d)\n\r", mv_psp); |
| 785 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 786 } |
| 787 |
| 788 switch (copy_info) { |
| 789 |
| 790 case SDO_525_COPY_INFO: |
| 791 temp_reg |= SDO_WORD1_WSS525_COPY_INFO; |
| 792 break; |
| 793 |
| 794 case SDO_525_DEFAULT: |
| 795 temp_reg |= SDO_WORD1_WSS525_DEFAULT; |
| 796 break; |
| 797 |
| 798 default: |
| 799 SDPRINTK(" invalid copy_info parameter(%d)\n\r", copy_info); |
| 800 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 801 } |
| 802 |
| 803 if (analog_on) |
| 804 temp_reg |= SDO_WORD2_WSS525_ANALOG_ON; |
| 805 else |
| 806 temp_reg |= SDO_WORD2_WSS525_ANALOG_OFF; |
| 807 |
| 808 switch (display_ratio) { |
| 809 |
| 810 case SDO_525_COPY_PERMIT: |
| 811 temp_reg |= SDO_WORD0_WSS525_4_3_NORMAL; |
| 812 break; |
| 813 |
| 814 case SDO_525_ONECOPY_PERMIT: |
| 815 temp_reg |= SDO_WORD0_WSS525_16_9_ANAMORPIC; |
| 816 break; |
| 817 |
| 818 case SDO_525_NOCOPY_PERMIT: |
| 819 temp_reg |= SDO_WORD0_WSS525_4_3_LETTERBOX; |
| 820 break; |
| 821 |
| 822 default: |
| 823 SDPRINTK(" invalid display_ratio parameter(%d)\n\r", |
| 824 display_ratio); |
| 825 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 826 } |
| 827 |
| 828 writel(temp_reg | |
| 829 SDO_CRC_WSS525(tv_sdout_init_wss_cgms_crc(temp_reg)), |
| 830 sdout_base + S5P_SDO_WSS525); |
| 831 |
| 832 SDPRINTK("0x%08x)\n\r", readl(sdout_base + S5P_SDO_WSS525)); |
| 833 |
| 834 return SDOUT_NO_ERROR; |
| 835 } |
| 836 |
| 837 enum s5p_tv_sd_err tv_sdout_init_wss625_data(bool surround_sound, |
| 838 bool copyright, |
| 839 bool copy_protection, |
| 840 bool text_subtitles, |
| 841 enum s5p_sd_625_subtitles open_subtitles, |
| 842 enum s5p_sd_625_camera_film camera_film, |
| 843 enum s5p_sd_625_color_encoding color_encoding, |
| 844 bool helper_signal, |
| 845 enum s5p_sd_625_aspect_ratio display_ratio) |
| 846 { |
| 847 u32 temp_reg = 0; |
| 848 |
| 849 SDPRINTK("%d,%d,%d,%d,%d,%d,%d,%d,%d\n\r", |
| 850 surround_sound, copyright, copy_protection, |
| 851 text_subtitles, open_subtitles, camera_film, |
| 852 color_encoding, helper_signal, display_ratio); |
| 853 |
| 854 if (surround_sound) |
| 855 temp_reg = SDO_WSS625_SURROUND_SOUND_ENABLE; |
| 856 else |
| 857 temp_reg = SDO_WSS625_SURROUND_SOUND_DISABLE; |
| 858 |
| 859 if (copyright) |
| 860 temp_reg |= SDO_WSS625_COPYRIGHT; |
| 861 else |
| 862 temp_reg |= SDO_WSS625_NO_COPYRIGHT; |
| 863 |
| 864 if (copy_protection) |
| 865 temp_reg |= SDO_WSS625_COPY_RESTRICTED; |
| 866 else |
| 867 temp_reg |= SDO_WSS625_COPY_NOT_RESTRICTED; |
| 868 |
| 869 if (text_subtitles) |
| 870 temp_reg |= SDO_WSS625_TELETEXT_SUBTITLES; |
| 871 else |
| 872 temp_reg |= SDO_WSS625_TELETEXT_NO_SUBTITLES; |
| 873 |
| 874 switch (open_subtitles) { |
| 875 |
| 876 case SDO_625_NO_OPEN_SUBTITLES: |
| 877 temp_reg |= SDO_WSS625_NO_OPEN_SUBTITLES; |
| 878 break; |
| 879 |
| 880 case SDO_625_INACT_OPEN_SUBTITLES: |
| 881 temp_reg |= SDO_WSS625_INACT_OPEN_SUBTITLES; |
| 882 break; |
| 883 |
| 884 case SDO_625_OUTACT_OPEN_SUBTITLES: |
| 885 temp_reg |= SDO_WSS625_OUTACT_OPEN_SUBTITLES; |
| 886 break; |
| 887 |
| 888 default: |
| 889 SDPRINTK(" invalid open_subtitles parameter(%d)\n\r", |
| 890 open_subtitles); |
| 891 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 892 } |
| 893 |
| 894 switch (camera_film) { |
| 895 |
| 896 case SDO_625_CAMERA: |
| 897 temp_reg |= SDO_WSS625_CAMERA; |
| 898 break; |
| 899 |
| 900 case SDO_625_FILM: |
| 901 temp_reg |= SDO_WSS625_FILM; |
| 902 break; |
| 903 |
| 904 default: |
| 905 SDPRINTK("invalid camera_film parameter(%d)\n\r", |
| 906 camera_film); |
| 907 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 908 } |
| 909 |
| 910 switch (color_encoding) { |
| 911 |
| 912 case SDO_625_NORMAL_PAL: |
| 913 temp_reg |= SDO_WSS625_NORMAL_PAL; |
| 914 break; |
| 915 |
| 916 case SDO_625_MOTION_ADAPTIVE_COLORPLUS: |
| 917 temp_reg |= SDO_WSS625_MOTION_ADAPTIVE_COLORPLUS; |
| 918 break; |
| 919 |
| 920 default: |
| 921 SDPRINTK("invalid color_encoding parameter(%d)\n\r", |
| 922 color_encoding); |
| 923 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 924 } |
| 925 |
| 926 if (helper_signal) |
| 927 temp_reg |= SDO_WSS625_HELPER_SIG; |
| 928 else |
| 929 temp_reg |= SDO_WSS625_HELPER_NO_SIG; |
| 930 |
| 931 switch (display_ratio) { |
| 932 |
| 933 case SDO_625_4_3_FULL_576: |
| 934 temp_reg |= SDO_WSS625_4_3_FULL_576; |
| 935 break; |
| 936 |
| 937 case SDO_625_14_9_LETTERBOX_CENTER_504: |
| 938 temp_reg |= SDO_WSS625_14_9_LETTERBOX_CENTER_504; |
| 939 break; |
| 940 |
| 941 case SDO_625_14_9_LETTERBOX_TOP_504: |
| 942 temp_reg |= SDO_WSS625_14_9_LETTERBOX_TOP_504; |
| 943 break; |
| 944 |
| 945 case SDO_625_16_9_LETTERBOX_CENTER_430: |
| 946 temp_reg |= SDO_WSS625_16_9_LETTERBOX_CENTER_430; |
| 947 break; |
| 948 |
| 949 case SDO_625_16_9_LETTERBOX_TOP_430: |
| 950 temp_reg |= SDO_WSS625_16_9_LETTERBOX_TOP_430; |
| 951 break; |
| 952 |
| 953 case SDO_625_16_9_LETTERBOX_CENTER: |
| 954 temp_reg |= SDO_WSS625_16_9_LETTERBOX_CENTER; |
| 955 break; |
| 956 |
| 957 case SDO_625_14_9_FULL_CENTER_576: |
| 958 temp_reg |= SDO_WSS625_14_9_FULL_CENTER_576; |
| 959 break; |
| 960 |
| 961 case SDO_625_16_9_ANAMORPIC_576: |
| 962 temp_reg |= SDO_WSS625_16_9_ANAMORPIC_576; |
| 963 break; |
| 964 |
| 965 default: |
| 966 SDPRINTK("invalid display_ratio parameter(%d)\n\r", |
| 967 display_ratio); |
| 968 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 969 } |
| 970 |
| 971 writel(temp_reg, sdout_base + S5P_SDO_WSS625); |
| 972 |
| 973 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_WSS625)); |
| 974 |
| 975 return SDOUT_NO_ERROR; |
| 976 } |
| 977 |
| 978 enum s5p_tv_sd_err tv_sdout_init_cgmsa525_data( |
| 979 enum s5p_sd_525_copy_permit copy_permit, |
| 980 enum s5p_sd_525_mv_psp mv_psp, |
| 981 enum s5p_sd_525_copy_info copy_info, |
| 982 bool analog_on, |
| 983 enum s5p_sd_525_aspect_ratio display_ratio) |
| 984 { |
| 985 u32 temp_reg = 0; |
| 986 |
| 987 SDPRINTK("%d,%d,%d,%d)\n\r", copy_permit, mv_psp, |
| 988 copy_info, display_ratio); |
| 989 |
| 990 switch (copy_permit) { |
| 991 |
| 992 case SDO_525_COPY_PERMIT: |
| 993 temp_reg = SDO_WORD2_CGMS525_COPY_PERMIT; |
| 994 break; |
| 995 |
| 996 case SDO_525_ONECOPY_PERMIT: |
| 997 temp_reg = SDO_WORD2_CGMS525_ONECOPY_PERMIT; |
| 998 break; |
| 999 |
| 1000 case SDO_525_NOCOPY_PERMIT: |
| 1001 temp_reg = SDO_WORD2_CGMS525_NOCOPY_PERMIT; |
| 1002 break; |
| 1003 |
| 1004 default: |
| 1005 SDPRINTK("invalid copy_permit parameter(%d)\n\r", copy_permit); |
| 1006 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1007 } |
| 1008 |
| 1009 switch (mv_psp) { |
| 1010 |
| 1011 case SDO_525_MV_PSP_OFF: |
| 1012 temp_reg |= SDO_WORD2_CGMS525_MV_PSP_OFF; |
| 1013 break; |
| 1014 |
| 1015 case SDO_525_MV_PSP_ON_2LINE_BURST: |
| 1016 temp_reg |= SDO_WORD2_CGMS525_MV_PSP_ON_2LINE_BURST; |
| 1017 break; |
| 1018 |
| 1019 case SDO_525_MV_PSP_ON_BURST_OFF: |
| 1020 temp_reg |= SDO_WORD2_CGMS525_MV_PSP_ON_BURST_OFF; |
| 1021 break; |
| 1022 |
| 1023 case SDO_525_MV_PSP_ON_4LINE_BURST: |
| 1024 temp_reg |= SDO_WORD2_CGMS525_MV_PSP_ON_4LINE_BURST; |
| 1025 break; |
| 1026 |
| 1027 default: |
| 1028 SDPRINTK(" invalid mv_psp parameter(%d)\n\r", mv_psp); |
| 1029 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1030 } |
| 1031 |
| 1032 switch (copy_info) { |
| 1033 |
| 1034 case SDO_525_COPY_INFO: |
| 1035 temp_reg |= SDO_WORD1_CGMS525_COPY_INFO; |
| 1036 break; |
| 1037 |
| 1038 case SDO_525_DEFAULT: |
| 1039 temp_reg |= SDO_WORD1_CGMS525_DEFAULT; |
| 1040 break; |
| 1041 |
| 1042 default: |
| 1043 SDPRINTK("invalid copy_info parameter(%d)\n\r", copy_info); |
| 1044 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1045 } |
| 1046 |
| 1047 if (analog_on) |
| 1048 temp_reg |= SDO_WORD2_CGMS525_ANALOG_ON; |
| 1049 else |
| 1050 temp_reg |= SDO_WORD2_CGMS525_ANALOG_OFF; |
| 1051 |
| 1052 switch (display_ratio) { |
| 1053 |
| 1054 case SDO_525_COPY_PERMIT: |
| 1055 temp_reg |= SDO_WORD0_CGMS525_4_3_NORMAL; |
| 1056 break; |
| 1057 |
| 1058 case SDO_525_ONECOPY_PERMIT: |
| 1059 temp_reg |= SDO_WORD0_CGMS525_16_9_ANAMORPIC; |
| 1060 break; |
| 1061 |
| 1062 case SDO_525_NOCOPY_PERMIT: |
| 1063 temp_reg |= SDO_WORD0_CGMS525_4_3_LETTERBOX; |
| 1064 break; |
| 1065 |
| 1066 default: |
| 1067 SDPRINTK(" invalid display_ratio parameter(%d)\n\r", |
| 1068 display_ratio); |
| 1069 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1070 } |
| 1071 |
| 1072 writel(temp_reg | |
| 1073 SDO_CRC_CGMS525(tv_sdout_init_wss_cgms_crc(temp_reg)), |
| 1074 sdout_base + S5P_SDO_CGMS525); |
| 1075 |
| 1076 SDPRINTK(" 0x%08x)\n\r", readl(sdout_base + S5P_SDO_CGMS525)); |
| 1077 |
| 1078 return SDOUT_NO_ERROR; |
| 1079 } |
| 1080 |
| 1081 enum s5p_tv_sd_err tv_sdout_init_cgmsa625_data(bool surround_sound, |
| 1082 bool copyright, |
| 1083 bool copy_protection, |
| 1084 bool text_subtitles, |
| 1085 enum s5p_sd_625_subtitles open_subtitles, |
| 1086 enum s5p_sd_625_camera_film camera_film, |
| 1087 enum s5p_sd_625_color_encoding color_encoding, |
| 1088 bool helper_signal, |
| 1089 enum s5p_sd_625_aspect_ratio display_ratio) |
| 1090 { |
| 1091 u32 temp_reg = 0; |
| 1092 |
| 1093 SDPRINTK("%d,%d,%d,%d,%d,%d,%d,%d,%d)\n\r", surround_sound, |
| 1094 copyright, copy_protection, |
| 1095 text_subtitles, open_subtitles, camera_film, |
| 1096 color_encoding, helper_signal, display_ratio); |
| 1097 |
| 1098 if (surround_sound) |
| 1099 temp_reg = SDO_CGMS625_SURROUND_SOUND_ENABLE; |
| 1100 else |
| 1101 temp_reg = SDO_CGMS625_SURROUND_SOUND_DISABLE; |
| 1102 |
| 1103 if (copyright) |
| 1104 temp_reg |= SDO_CGMS625_COPYRIGHT; |
| 1105 else |
| 1106 temp_reg |= SDO_CGMS625_NO_COPYRIGHT; |
| 1107 |
| 1108 if (copy_protection) |
| 1109 temp_reg |= SDO_CGMS625_COPY_RESTRICTED; |
| 1110 else |
| 1111 temp_reg |= SDO_CGMS625_COPY_NOT_RESTRICTED; |
| 1112 |
| 1113 if (text_subtitles) |
| 1114 temp_reg |= SDO_CGMS625_TELETEXT_SUBTITLES; |
| 1115 else |
| 1116 temp_reg |= SDO_CGMS625_TELETEXT_NO_SUBTITLES; |
| 1117 |
| 1118 switch (open_subtitles) { |
| 1119 |
| 1120 case SDO_625_NO_OPEN_SUBTITLES: |
| 1121 temp_reg |= SDO_CGMS625_NO_OPEN_SUBTITLES; |
| 1122 break; |
| 1123 |
| 1124 case SDO_625_INACT_OPEN_SUBTITLES: |
| 1125 temp_reg |= SDO_CGMS625_INACT_OPEN_SUBTITLES; |
| 1126 break; |
| 1127 |
| 1128 case SDO_625_OUTACT_OPEN_SUBTITLES: |
| 1129 temp_reg |= SDO_CGMS625_OUTACT_OPEN_SUBTITLES; |
| 1130 break; |
| 1131 |
| 1132 default: |
| 1133 SDPRINTK("invalid open_subtitles parameter(%d)\n\r", |
| 1134 open_subtitles); |
| 1135 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1136 } |
| 1137 |
| 1138 switch (camera_film) { |
| 1139 |
| 1140 case SDO_625_CAMERA: |
| 1141 temp_reg |= SDO_CGMS625_CAMERA; |
| 1142 break; |
| 1143 |
| 1144 case SDO_625_FILM: |
| 1145 temp_reg |= SDO_CGMS625_FILM; |
| 1146 break; |
| 1147 |
| 1148 default: |
| 1149 SDPRINTK(" invalid camera_film parameter(%d)\n\r", |
| 1150 camera_film); |
| 1151 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1152 } |
| 1153 |
| 1154 switch (color_encoding) { |
| 1155 |
| 1156 case SDO_625_NORMAL_PAL: |
| 1157 temp_reg |= SDO_CGMS625_NORMAL_PAL; |
| 1158 break; |
| 1159 |
| 1160 case SDO_625_MOTION_ADAPTIVE_COLORPLUS: |
| 1161 temp_reg |= SDO_CGMS625_MOTION_ADAPTIVE_COLORPLUS; |
| 1162 break; |
| 1163 |
| 1164 default: |
| 1165 SDPRINTK(" invalid color_encoding parameter(%d)\n\r", |
| 1166 color_encoding); |
| 1167 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1168 } |
| 1169 |
| 1170 if (helper_signal) |
| 1171 temp_reg |= SDO_CGMS625_HELPER_SIG; |
| 1172 else |
| 1173 temp_reg |= SDO_CGMS625_HELPER_NO_SIG; |
| 1174 |
| 1175 |
| 1176 switch (display_ratio) { |
| 1177 |
| 1178 case SDO_625_4_3_FULL_576: |
| 1179 temp_reg |= SDO_CGMS625_4_3_FULL_576; |
| 1180 break; |
| 1181 |
| 1182 case SDO_625_14_9_LETTERBOX_CENTER_504: |
| 1183 temp_reg |= SDO_CGMS625_14_9_LETTERBOX_CENTER_504; |
| 1184 break; |
| 1185 |
| 1186 case SDO_625_14_9_LETTERBOX_TOP_504: |
| 1187 temp_reg |= SDO_CGMS625_14_9_LETTERBOX_TOP_504; |
| 1188 break; |
| 1189 |
| 1190 case SDO_625_16_9_LETTERBOX_CENTER_430: |
| 1191 temp_reg |= SDO_CGMS625_16_9_LETTERBOX_CENTER_430; |
| 1192 break; |
| 1193 |
| 1194 case SDO_625_16_9_LETTERBOX_TOP_430: |
| 1195 temp_reg |= SDO_CGMS625_16_9_LETTERBOX_TOP_430; |
| 1196 break; |
| 1197 |
| 1198 case SDO_625_16_9_LETTERBOX_CENTER: |
| 1199 temp_reg |= SDO_CGMS625_16_9_LETTERBOX_CENTER; |
| 1200 break; |
| 1201 |
| 1202 case SDO_625_14_9_FULL_CENTER_576: |
| 1203 temp_reg |= SDO_CGMS625_14_9_FULL_CENTER_576; |
| 1204 break; |
| 1205 |
| 1206 case SDO_625_16_9_ANAMORPIC_576: |
| 1207 temp_reg |= SDO_CGMS625_16_9_ANAMORPIC_576; |
| 1208 break; |
| 1209 |
| 1210 default: |
| 1211 SDPRINTK("invalid display_ratio parameter(%d)\n\r", |
| 1212 display_ratio); |
| 1213 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1214 } |
| 1215 |
| 1216 writel(temp_reg, sdout_base + S5P_SDO_CGMS625); |
| 1217 |
| 1218 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_CGMS625)); |
| 1219 |
| 1220 return SDOUT_NO_ERROR; |
| 1221 } |
| 1222 |
| 1223 |
| 1224 static enum s5p_tv_sd_err tv_sdout_init_antialias_filter_coeff_default( |
| 1225 enum s5p_sd_level composite_level, |
| 1226 enum s5p_sd_vsync_ratio composite_ratio, |
| 1227 enum s5p_tv_o_mode out_mode) |
| 1228 { |
| 1229 SDPRINTK("%d,%d,%d\n\r", composite_level, composite_ratio, out_mode); |
| 1230 |
| 1231 switch (composite_level) { |
| 1232 |
| 1233 case S5P_TV_SD_LEVEL_0IRE: |
| 1234 |
| 1235 switch (composite_ratio) { |
| 1236 |
| 1237 case SDOUT_VTOS_RATIO_10_4: |
| 1238 |
| 1239 switch (out_mode) { |
| 1240 |
| 1241 case TVOUT_OUTPUT_COMPOSITE: |
| 1242 case TVOUT_OUTPUT_SVIDEO: |
| 1243 writel(0x00000000 , sdout_base + S5P_SDO_Y3); |
| 1244 writel(0x00000000 , sdout_base + S5P_SDO_Y4); |
| 1245 writel(0x00000000 , sdout_base + S5P_SDO_Y5); |
| 1246 writel(0x00000000 , sdout_base + S5P_SDO_Y6); |
| 1247 writel(0x00000000 , sdout_base + S5P_SDO_Y7); |
| 1248 writel(0x00000000 , sdout_base + S5P_SDO_Y8); |
| 1249 writel(0x00000000 , sdout_base + S5P_SDO_Y9); |
| 1250 writel(0x00000000 , sdout_base + S5P_SDO_Y10); |
| 1251 writel(0x0000029a , sdout_base + S5P_SDO_Y11); |
| 1252 writel(0x00000000 , sdout_base + S5P_SDO_CB0); |
| 1253 writel(0x00000000 , sdout_base + S5P_SDO_CB1); |
| 1254 writel(0x00000000 , sdout_base + S5P_SDO_CB2); |
| 1255 writel(0x00000000 , sdout_base + S5P_SDO_CB3); |
| 1256 writel(0x00000000 , sdout_base + S5P_SDO_CB4); |
| 1257 writel(0x00000001 , sdout_base + S5P_SDO_CB5); |
| 1258 writel(0x00000007 , sdout_base + S5P_SDO_CB6); |
| 1259 writel(0x00000015 , sdout_base + S5P_SDO_CB7); |
| 1260 writel(0x0000002b , sdout_base + S5P_SDO_CB8); |
| 1261 writel(0x00000045 , sdout_base + S5P_SDO_CB9); |
| 1262 writel(0x00000059 , sdout_base + S5P_SDO_CB10); |
| 1263 writel(0x00000061 , sdout_base + S5P_SDO_CB11); |
| 1264 writel(0x00000000 , sdout_base + S5P_SDO_CR1); |
| 1265 writel(0x00000000 , sdout_base + S5P_SDO_CR2); |
| 1266 writel(0x00000000 , sdout_base + S5P_SDO_CR3); |
| 1267 writel(0x00000000 , sdout_base + S5P_SDO_CR4); |
| 1268 writel(0x00000002 , sdout_base + S5P_SDO_CR5); |
| 1269 writel(0x0000000a , sdout_base + S5P_SDO_CR6); |
| 1270 writel(0x0000001e , sdout_base + S5P_SDO_CR7); |
| 1271 writel(0x0000003d , sdout_base + S5P_SDO_CR8); |
| 1272 writel(0x00000061 , sdout_base + S5P_SDO_CR9); |
| 1273 writel(0x0000007a , sdout_base + S5P_SDO_CR10); |
| 1274 writel(0x0000008f , sdout_base + S5P_SDO_CR11); |
| 1275 break; |
| 1276 |
| 1277 case TVOUT_OUTPUT_COMPONENT_YPBPR_INERLACED: |
| 1278 case TVOUT_OUTPUT_COMPONENT_YPBPR_PROGRESSIVE: |
| 1279 case TVOUT_OUTPUT_COMPONENT_RGB_PROGRESSIVE: |
| 1280 writel(0x00000000, sdout_base + S5P_SDO_Y0); |
| 1281 writel(0x00000000, sdout_base + S5P_SDO_Y1); |
| 1282 writel(0x00000000, sdout_base + S5P_SDO_Y2); |
| 1283 writel(0x00000000, sdout_base + S5P_SDO_Y3); |
| 1284 writel(0x00000000, sdout_base + S5P_SDO_Y4); |
| 1285 writel(0x00000000, sdout_base + S5P_SDO_Y5); |
| 1286 writel(0x00000000, sdout_base + S5P_SDO_Y6); |
| 1287 writel(0x00000000, sdout_base + S5P_SDO_Y7); |
| 1288 writel(0x00000000, sdout_base + S5P_SDO_Y8); |
| 1289 writel(0x00000000, sdout_base + S5P_SDO_Y9); |
| 1290 writel(0x00000000, sdout_base + S5P_SDO_Y10); |
| 1291 writel(0x0000029a, sdout_base + S5P_SDO_Y11); |
| 1292 writel(0x00000000, sdout_base + S5P_SDO_CB0); |
| 1293 writel(0x00000000, sdout_base + S5P_SDO_CB1); |
| 1294 writel(0x00000000, sdout_base + S5P_SDO_CB2); |
| 1295 writel(0x00000000, sdout_base + S5P_SDO_CB3); |
| 1296 writel(0x00000000, sdout_base + S5P_SDO_CB4); |
| 1297 writel(0x00000001, sdout_base + S5P_SDO_CB5); |
| 1298 writel(0x00000007, sdout_base + S5P_SDO_CB6); |
| 1299 writel(0x00000015, sdout_base + S5P_SDO_CB7); |
| 1300 writel(0x0000002b, sdout_base + S5P_SDO_CB8); |
| 1301 writel(0x00000045, sdout_base + S5P_SDO_CB9); |
| 1302 writel(0x00000059, sdout_base + S5P_SDO_CB10); |
| 1303 writel(0x00000061, sdout_base + S5P_SDO_CB11); |
| 1304 writel(0x00000000, sdout_base + S5P_SDO_CR1); |
| 1305 writel(0x00000000, sdout_base + S5P_SDO_CR2); |
| 1306 writel(0x00000000, sdout_base + S5P_SDO_CR3); |
| 1307 writel(0x00000000, sdout_base + S5P_SDO_CR4); |
| 1308 writel(0x00000002, sdout_base + S5P_SDO_CR5); |
| 1309 writel(0x0000000a, sdout_base + S5P_SDO_CR6); |
| 1310 writel(0x0000001e, sdout_base + S5P_SDO_CR7); |
| 1311 writel(0x0000003d, sdout_base + S5P_SDO_CR8); |
| 1312 writel(0x00000061, sdout_base + S5P_SDO_CR9); |
| 1313 writel(0x0000007a, sdout_base + S5P_SDO_CR10); |
| 1314 writel(0x0000008f, sdout_base + S5P_SDO_CR11); |
| 1315 break; |
| 1316 |
| 1317 default: |
| 1318 SDPRINTK("invalid out_mode parameter(%d)\n\r", |
| 1319 out_mode); |
| 1320 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1321 } |
| 1322 |
| 1323 break; |
| 1324 |
| 1325 case SDOUT_VTOS_RATIO_7_3: |
| 1326 writel(0x00000000, sdout_base + S5P_SDO_Y0); |
| 1327 writel(0x00000000, sdout_base + S5P_SDO_Y1); |
| 1328 writel(0x00000000, sdout_base + S5P_SDO_Y2); |
| 1329 writel(0x00000000, sdout_base + S5P_SDO_Y3); |
| 1330 writel(0x00000000, sdout_base + S5P_SDO_Y4); |
| 1331 writel(0x00000000, sdout_base + S5P_SDO_Y5); |
| 1332 writel(0x00000000, sdout_base + S5P_SDO_Y6); |
| 1333 writel(0x00000000, sdout_base + S5P_SDO_Y7); |
| 1334 writel(0x00000000, sdout_base + S5P_SDO_Y8); |
| 1335 writel(0x00000000, sdout_base + S5P_SDO_Y9); |
| 1336 writel(0x00000000, sdout_base + S5P_SDO_Y10); |
| 1337 writel(0x00000281, sdout_base + S5P_SDO_Y11); |
| 1338 writel(0x00000000, sdout_base + S5P_SDO_CB0); |
| 1339 writel(0x00000000, sdout_base + S5P_SDO_CB1); |
| 1340 writel(0x00000000, sdout_base + S5P_SDO_CB2); |
| 1341 writel(0x00000000, sdout_base + S5P_SDO_CB3); |
| 1342 writel(0x00000000, sdout_base + S5P_SDO_CB4); |
| 1343 writel(0x00000001, sdout_base + S5P_SDO_CB5); |
| 1344 writel(0x00000007, sdout_base + S5P_SDO_CB6); |
| 1345 writel(0x00000015, sdout_base + S5P_SDO_CB7); |
| 1346 writel(0x0000002a, sdout_base + S5P_SDO_CB8); |
| 1347 writel(0x00000044, sdout_base + S5P_SDO_CB9); |
| 1348 writel(0x00000057, sdout_base + S5P_SDO_CB10); |
| 1349 writel(0x0000005f, sdout_base + S5P_SDO_CB11); |
| 1350 writel(0x00000000, sdout_base + S5P_SDO_CR1); |
| 1351 writel(0x00000000, sdout_base + S5P_SDO_CR2); |
| 1352 writel(0x00000000, sdout_base + S5P_SDO_CR3); |
| 1353 writel(0x00000000, sdout_base + S5P_SDO_CR4); |
| 1354 writel(0x00000002, sdout_base + S5P_SDO_CR5); |
| 1355 writel(0x0000000a, sdout_base + S5P_SDO_CR6); |
| 1356 writel(0x0000001d, sdout_base + S5P_SDO_CR7); |
| 1357 writel(0x0000003c, sdout_base + S5P_SDO_CR8); |
| 1358 writel(0x0000005f, sdout_base + S5P_SDO_CR9); |
| 1359 writel(0x0000007b, sdout_base + S5P_SDO_CR10); |
| 1360 writel(0x00000086, sdout_base + S5P_SDO_CR11); |
| 1361 break; |
| 1362 |
| 1363 default: |
| 1364 SDPRINTK("invalid composite_ratio parameter(%d)\n\r", |
| 1365 composite_ratio); |
| 1366 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1367 } |
| 1368 |
| 1369 break; |
| 1370 |
| 1371 case S5P_TV_SD_LEVEL_75IRE: |
| 1372 |
| 1373 switch (composite_ratio) { |
| 1374 |
| 1375 case SDOUT_VTOS_RATIO_10_4: |
| 1376 writel(0x00000000, sdout_base + S5P_SDO_Y0); |
| 1377 writel(0x00000000, sdout_base + S5P_SDO_Y1); |
| 1378 writel(0x00000000, sdout_base + S5P_SDO_Y2); |
| 1379 writel(0x00000000, sdout_base + S5P_SDO_Y3); |
| 1380 writel(0x00000000, sdout_base + S5P_SDO_Y4); |
| 1381 writel(0x00000000, sdout_base + S5P_SDO_Y5); |
| 1382 writel(0x00000000, sdout_base + S5P_SDO_Y6); |
| 1383 writel(0x00000000, sdout_base + S5P_SDO_Y7); |
| 1384 writel(0x00000000, sdout_base + S5P_SDO_Y8); |
| 1385 writel(0x00000000, sdout_base + S5P_SDO_Y9); |
| 1386 writel(0x00000000, sdout_base + S5P_SDO_Y10); |
| 1387 writel(0x0000025d, sdout_base + S5P_SDO_Y11); |
| 1388 writel(0x00000000, sdout_base + S5P_SDO_CB0); |
| 1389 writel(0x00000000, sdout_base + S5P_SDO_CB1); |
| 1390 writel(0x00000000, sdout_base + S5P_SDO_CB2); |
| 1391 writel(0x00000000, sdout_base + S5P_SDO_CB3); |
| 1392 writel(0x00000000, sdout_base + S5P_SDO_CB4); |
| 1393 writel(0x00000001, sdout_base + S5P_SDO_CB5); |
| 1394 writel(0x00000007, sdout_base + S5P_SDO_CB6); |
| 1395 writel(0x00000014, sdout_base + S5P_SDO_CB7); |
| 1396 writel(0x00000028, sdout_base + S5P_SDO_CB8); |
| 1397 writel(0x0000003f, sdout_base + S5P_SDO_CB9); |
| 1398 writel(0x00000052, sdout_base + S5P_SDO_CB10); |
| 1399 writel(0x0000005a, sdout_base + S5P_SDO_CB11); |
| 1400 writel(0x00000000, sdout_base + S5P_SDO_CR1); |
| 1401 writel(0x00000000, sdout_base + S5P_SDO_CR2); |
| 1402 writel(0x00000000, sdout_base + S5P_SDO_CR3); |
| 1403 writel(0x00000000, sdout_base + S5P_SDO_CR4); |
| 1404 writel(0x00000001, sdout_base + S5P_SDO_CR5); |
| 1405 writel(0x00000009, sdout_base + S5P_SDO_CR6); |
| 1406 writel(0x0000001c, sdout_base + S5P_SDO_CR7); |
| 1407 writel(0x00000039, sdout_base + S5P_SDO_CR8); |
| 1408 writel(0x0000005a, sdout_base + S5P_SDO_CR9); |
| 1409 writel(0x00000074, sdout_base + S5P_SDO_CR10); |
| 1410 writel(0x0000007e, sdout_base + S5P_SDO_CR11); |
| 1411 break; |
| 1412 |
| 1413 case SDOUT_VTOS_RATIO_7_3: |
| 1414 writel(0x00000000, sdout_base + S5P_SDO_Y0); |
| 1415 writel(0x00000000, sdout_base + S5P_SDO_Y1); |
| 1416 writel(0x00000000, sdout_base + S5P_SDO_Y2); |
| 1417 writel(0x00000000, sdout_base + S5P_SDO_Y3); |
| 1418 writel(0x00000000, sdout_base + S5P_SDO_Y4); |
| 1419 writel(0x00000000, sdout_base + S5P_SDO_Y5); |
| 1420 writel(0x00000000, sdout_base + S5P_SDO_Y6); |
| 1421 writel(0x00000000, sdout_base + S5P_SDO_Y7); |
| 1422 writel(0x00000000, sdout_base + S5P_SDO_Y8); |
| 1423 writel(0x00000000, sdout_base + S5P_SDO_Y9); |
| 1424 writel(0x00000000, sdout_base + S5P_SDO_Y10); |
| 1425 writel(0x00000251, sdout_base + S5P_SDO_Y11); |
| 1426 writel(0x00000000, sdout_base + S5P_SDO_CB0); |
| 1427 writel(0x00000000, sdout_base + S5P_SDO_CB1); |
| 1428 writel(0x00000000, sdout_base + S5P_SDO_CB2); |
| 1429 writel(0x00000000, sdout_base + S5P_SDO_CB3); |
| 1430 writel(0x00000000, sdout_base + S5P_SDO_CB4); |
| 1431 writel(0x00000001, sdout_base + S5P_SDO_CB5); |
| 1432 writel(0x00000006, sdout_base + S5P_SDO_CB6); |
| 1433 writel(0x00000013, sdout_base + S5P_SDO_CB7); |
| 1434 writel(0x00000028, sdout_base + S5P_SDO_CB8); |
| 1435 writel(0x0000003f, sdout_base + S5P_SDO_CB9); |
| 1436 writel(0x00000051, sdout_base + S5P_SDO_CB10); |
| 1437 writel(0x00000056, sdout_base + S5P_SDO_CB11); |
| 1438 writel(0x00000000, sdout_base + S5P_SDO_CR1); |
| 1439 writel(0x00000000, sdout_base + S5P_SDO_CR2); |
| 1440 writel(0x00000000, sdout_base + S5P_SDO_CR3); |
| 1441 writel(0x00000000, sdout_base + S5P_SDO_CR4); |
| 1442 writel(0x00000002, sdout_base + S5P_SDO_CR5); |
| 1443 writel(0x00000005, sdout_base + S5P_SDO_CR6); |
| 1444 writel(0x00000018, sdout_base + S5P_SDO_CR7); |
| 1445 writel(0x00000037, sdout_base + S5P_SDO_CR8); |
| 1446 writel(0x0000005A, sdout_base + S5P_SDO_CR9); |
| 1447 writel(0x00000076, sdout_base + S5P_SDO_CR10); |
| 1448 writel(0x0000007e, sdout_base + S5P_SDO_CR11); |
| 1449 break; |
| 1450 |
| 1451 default: |
| 1452 SDPRINTK("invalid composite_ratio parameter(%d)\n\r", |
| 1453 composite_ratio); |
| 1454 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1455 } |
| 1456 |
| 1457 break; |
| 1458 |
| 1459 default: |
| 1460 SDPRINTK(" invalid composite_level parameter(%d)\n\r", |
| 1461 composite_level); |
| 1462 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1463 } |
| 1464 |
| 1465 SDPRINTK("()\n\r"); |
| 1466 |
| 1467 return SDOUT_NO_ERROR; |
| 1468 |
| 1469 } |
| 1470 |
| 1471 |
| 1472 static enum s5p_tv_sd_err tv_sdout_init_oversampling_filter_coeff_default( |
| 1473 enum s5p_tv_o_mode out_mode) |
| 1474 { |
| 1475 SDPRINTK("%d\n\r", out_mode); |
| 1476 |
| 1477 switch (out_mode) { |
| 1478 |
| 1479 case TVOUT_OUTPUT_COMPOSITE: |
| 1480 case TVOUT_OUTPUT_SVIDEO: |
| 1481 case TVOUT_OUTPUT_COMPONENT_YPBPR_INERLACED: |
| 1482 break; |
| 1483 |
| 1484 default: |
| 1485 SDPRINTK("invalid out_mode parameter(%d)\n\r", out_mode); |
| 1486 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1487 } |
| 1488 |
| 1489 return SDOUT_NO_ERROR; |
| 1490 } |
| 1491 |
| 1492 /* |
| 1493 * initialization |
| 1494 * - iniization functions are only called under stopping sdout |
| 1495 */ |
| 1496 enum s5p_tv_sd_err tv_sdout_init_display_mode(enum s5p_tv_disp_mode disp_mode, |
| 1497 enum s5p_tv_o_mode out_mode, |
| 1498 enum s5p_sd_order order) |
| 1499 { |
| 1500 u32 temp_reg = 0; |
| 1501 |
| 1502 SDPRINTK(" %d,%d,%d\n\r", disp_mode, out_mode, order); |
| 1503 |
| 1504 switch (disp_mode) { |
| 1505 |
| 1506 case TVOUT_NTSC_M: |
| 1507 temp_reg |= SDO_NTSC_M; |
| 1508 tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE, |
| 1509 SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_75IRE, |
| 1510 SDOUT_VTOS_RATIO_10_4); |
| 1511 |
| 1512 tv_sdout_init_antialias_filter_coeff_default( |
| 1513 S5P_TV_SD_LEVEL_75IRE, |
| 1514 SDOUT_VTOS_RATIO_10_4, |
| 1515 out_mode); |
| 1516 break; |
| 1517 |
| 1518 case TVOUT_PAL_BDGHI: |
| 1519 temp_reg |= SDO_PAL_BGHID; |
| 1520 tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE, |
| 1521 SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_0IRE, |
| 1522 SDOUT_VTOS_RATIO_7_3); |
| 1523 |
| 1524 tv_sdout_init_antialias_filter_coeff_default( |
| 1525 S5P_TV_SD_LEVEL_0IRE, |
| 1526 SDOUT_VTOS_RATIO_7_3, |
| 1527 out_mode); |
| 1528 break; |
| 1529 |
| 1530 case TVOUT_PAL_M: |
| 1531 temp_reg |= SDO_PAL_M; |
| 1532 tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE, |
| 1533 SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_0IRE, |
| 1534 SDOUT_VTOS_RATIO_7_3); |
| 1535 |
| 1536 tv_sdout_init_antialias_filter_coeff_default( |
| 1537 S5P_TV_SD_LEVEL_0IRE, |
| 1538 SDOUT_VTOS_RATIO_7_3, |
| 1539 out_mode); |
| 1540 break; |
| 1541 |
| 1542 case TVOUT_PAL_N: |
| 1543 temp_reg |= SDO_PAL_N; |
| 1544 tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE, |
| 1545 SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_0IRE, |
| 1546 SDOUT_VTOS_RATIO_7_3); |
| 1547 |
| 1548 tv_sdout_init_antialias_filter_coeff_default( |
| 1549 S5P_TV_SD_LEVEL_75IRE, |
| 1550 SDOUT_VTOS_RATIO_10_4, |
| 1551 out_mode); |
| 1552 break; |
| 1553 |
| 1554 case TVOUT_PAL_NC: |
| 1555 temp_reg |= SDO_PAL_NC; |
| 1556 tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE, |
| 1557 SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_0IRE, |
| 1558 SDOUT_VTOS_RATIO_7_3); |
| 1559 |
| 1560 tv_sdout_init_antialias_filter_coeff_default( |
| 1561 S5P_TV_SD_LEVEL_0IRE, |
| 1562 SDOUT_VTOS_RATIO_7_3, |
| 1563 out_mode); |
| 1564 break; |
| 1565 |
| 1566 case TVOUT_PAL_60: |
| 1567 temp_reg |= SDO_PAL_60; |
| 1568 tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE, |
| 1569 SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_0IRE, |
| 1570 SDOUT_VTOS_RATIO_7_3); |
| 1571 tv_sdout_init_antialias_filter_coeff_default( |
| 1572 S5P_TV_SD_LEVEL_0IRE, |
| 1573 SDOUT_VTOS_RATIO_7_3, |
| 1574 out_mode); |
| 1575 break; |
| 1576 |
| 1577 case TVOUT_NTSC_443: |
| 1578 temp_reg |= SDO_NTSC_443; |
| 1579 tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE, |
| 1580 SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_75IRE, |
| 1581 SDOUT_VTOS_RATIO_10_4); |
| 1582 tv_sdout_init_antialias_filter_coeff_default( |
| 1583 S5P_TV_SD_LEVEL_75IRE, |
| 1584 SDOUT_VTOS_RATIO_10_4, |
| 1585 out_mode); |
| 1586 break; |
| 1587 |
| 1588 default: |
| 1589 SDPRINTK("invalid disp_mode parameter(%d)\n\r", disp_mode); |
| 1590 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1591 } |
| 1592 |
| 1593 switch (out_mode) { |
| 1594 |
| 1595 case TVOUT_OUTPUT_COMPOSITE: |
| 1596 case TVOUT_OUTPUT_SVIDEO: |
| 1597 temp_reg |= SDO_COMPOSITE | SDO_INTERLACED; |
| 1598 |
| 1599 switch (order) { |
| 1600 |
| 1601 case S5P_TV_SD_O_ORDER_COMPOSITE_CVBS_Y_C: |
| 1602 temp_reg |= SDO_DAC2_CVBS | SDO_DAC1_Y | SDO_DAC0_C; |
| 1603 break; |
| 1604 |
| 1605 case S5P_TV_SD_O_ORDER_COMPOSITE_CVBS_C_Y: |
| 1606 temp_reg |= SDO_DAC2_CVBS | SDO_DAC1_C | SDO_DAC0_Y; |
| 1607 break; |
| 1608 |
| 1609 case S5P_TV_SD_O_ORDER_COMPOSITE_Y_C_CVBS: |
| 1610 temp_reg |= SDO_DAC2_Y | SDO_DAC1_C | SDO_DAC0_CVBS; |
| 1611 break; |
| 1612 |
| 1613 case S5P_TV_SD_O_ORDER_COMPOSITE_Y_CVBS_C: |
| 1614 temp_reg |= SDO_DAC2_Y | SDO_DAC1_CVBS | SDO_DAC0_C; |
| 1615 break; |
| 1616 |
| 1617 case S5P_TV_SD_O_ORDER_COMPOSITE_C_CVBS_Y: |
| 1618 temp_reg |= SDO_DAC2_C | SDO_DAC1_CVBS | SDO_DAC0_Y; |
| 1619 break; |
| 1620 |
| 1621 case S5P_TV_SD_O_ORDER_COMPOSITE_C_Y_CVBS: |
| 1622 temp_reg |= SDO_DAC2_C | SDO_DAC1_Y | SDO_DAC0_CVBS; |
| 1623 break; |
| 1624 |
| 1625 default: |
| 1626 SDPRINTK(" invalid order parameter(%d)\n\r", order); |
| 1627 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1628 break; |
| 1629 } |
| 1630 |
| 1631 break; |
| 1632 |
| 1633 case TVOUT_OUTPUT_COMPONENT_YPBPR_INERLACED: |
| 1634 temp_reg |= SDO_COMPONENT | SDO_YPBPR | SDO_INTERLACED; |
| 1635 |
| 1636 switch (order) { |
| 1637 |
| 1638 case S5P_TV_SD_O_ORDER_COMPONENT_RGB_PRYPB: |
| 1639 temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_Y_G | |
| 1640 SDO_DAC0_PB_B; |
| 1641 break; |
| 1642 |
| 1643 case S5P_TV_SD_O_ORDER_COMPONENT_RBG_PRPBY: |
| 1644 temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_PB_B | |
| 1645 SDO_DAC0_Y_G; |
| 1646 break; |
| 1647 |
| 1648 case S5P_TV_SD_O_ORDER_COMPONENT_BGR_PBYPR: |
| 1649 temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_Y_G | |
| 1650 SDO_DAC0_PR_R; |
| 1651 break; |
| 1652 |
| 1653 case S5P_TV_SD_O_ORDER_COMPONENT_BRG_PBPRY: |
| 1654 temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_PR_R | |
| 1655 SDO_DAC0_Y_G; |
| 1656 break; |
| 1657 |
| 1658 case S5P_TV_SD_O_ORDER_COMPONENT_GRB_YPRPB: |
| 1659 temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PR_R | |
| 1660 SDO_DAC0_PB_B; |
| 1661 break; |
| 1662 |
| 1663 case S5P_TV_SD_O_ORDER_COMPONENT_GBR_YPBPR: |
| 1664 temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PB_B | |
| 1665 SDO_DAC0_PR_R; |
| 1666 break; |
| 1667 |
| 1668 default: |
| 1669 SDPRINTK(" invalid order parameter(%d)\n\r", order); |
| 1670 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1671 break; |
| 1672 } |
| 1673 |
| 1674 break; |
| 1675 |
| 1676 case TVOUT_OUTPUT_COMPONENT_YPBPR_PROGRESSIVE: |
| 1677 temp_reg |= SDO_COMPONENT | SDO_YPBPR | SDO_PROGRESSIVE; |
| 1678 |
| 1679 switch (order) { |
| 1680 |
| 1681 case S5P_TV_SD_O_ORDER_COMPONENT_RGB_PRYPB: |
| 1682 temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_Y_G | |
| 1683 SDO_DAC0_PB_B; |
| 1684 break; |
| 1685 |
| 1686 case S5P_TV_SD_O_ORDER_COMPONENT_RBG_PRPBY: |
| 1687 temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_PB_B | |
| 1688 SDO_DAC0_Y_G; |
| 1689 break; |
| 1690 |
| 1691 case S5P_TV_SD_O_ORDER_COMPONENT_BGR_PBYPR: |
| 1692 temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_Y_G | |
| 1693 SDO_DAC0_PR_R; |
| 1694 break; |
| 1695 |
| 1696 case S5P_TV_SD_O_ORDER_COMPONENT_BRG_PBPRY: |
| 1697 temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_PR_R | |
| 1698 SDO_DAC0_Y_G; |
| 1699 break; |
| 1700 |
| 1701 case S5P_TV_SD_O_ORDER_COMPONENT_GRB_YPRPB: |
| 1702 temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PR_R | |
| 1703 SDO_DAC0_PB_B; |
| 1704 break; |
| 1705 |
| 1706 case S5P_TV_SD_O_ORDER_COMPONENT_GBR_YPBPR: |
| 1707 temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PB_B | |
| 1708 SDO_DAC0_PR_R; |
| 1709 break; |
| 1710 |
| 1711 default: |
| 1712 SDPRINTK(" invalid order parameter(%d)\n\r", order); |
| 1713 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1714 } |
| 1715 |
| 1716 break; |
| 1717 |
| 1718 case TVOUT_OUTPUT_COMPONENT_RGB_PROGRESSIVE: |
| 1719 temp_reg |= SDO_COMPONENT | SDO_RGB | SDO_PROGRESSIVE; |
| 1720 |
| 1721 switch (order) { |
| 1722 |
| 1723 case S5P_TV_SD_O_ORDER_COMPONENT_RGB_PRYPB: |
| 1724 temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_Y_G | |
| 1725 SDO_DAC0_PB_B; |
| 1726 break; |
| 1727 |
| 1728 case S5P_TV_SD_O_ORDER_COMPONENT_RBG_PRPBY: |
| 1729 temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_PB_B | |
| 1730 SDO_DAC0_Y_G; |
| 1731 break; |
| 1732 |
| 1733 case S5P_TV_SD_O_ORDER_COMPONENT_BGR_PBYPR: |
| 1734 temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_Y_G | |
| 1735 SDO_DAC0_PR_R; |
| 1736 break; |
| 1737 |
| 1738 case S5P_TV_SD_O_ORDER_COMPONENT_BRG_PBPRY: |
| 1739 temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_PR_R | |
| 1740 SDO_DAC0_Y_G; |
| 1741 break; |
| 1742 |
| 1743 case S5P_TV_SD_O_ORDER_COMPONENT_GRB_YPRPB: |
| 1744 temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PR_R | |
| 1745 SDO_DAC0_PB_B; |
| 1746 break; |
| 1747 |
| 1748 case S5P_TV_SD_O_ORDER_COMPONENT_GBR_YPBPR: |
| 1749 temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PB_B | |
| 1750 SDO_DAC0_PR_R; |
| 1751 break; |
| 1752 |
| 1753 default: |
| 1754 SDPRINTK("invalid order parameter(%d)\n\r", order); |
| 1755 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1756 } |
| 1757 |
| 1758 break; |
| 1759 |
| 1760 default: |
| 1761 SDPRINTK(" invalid out_mode parameter(%d)\n\r", out_mode); |
| 1762 return S5P_TV_SD_ERR_INVALID_PARAM; |
| 1763 } |
| 1764 |
| 1765 tv_sdout_init_oversampling_filter_coeff_default(out_mode); |
| 1766 |
| 1767 writel(temp_reg, sdout_base + S5P_SDO_CONFIG); |
| 1768 |
| 1769 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_CONFIG)); |
| 1770 |
| 1771 return SDOUT_NO_ERROR; |
| 1772 } |
| 1773 |
| 1774 /* |
| 1775 * start - start functions are only called under stopping SDOUT |
| 1776 */ |
| 1777 void tv_sdout_start(void) |
| 1778 { |
| 1779 SDPRINTK("()\n\r"); |
| 1780 |
| 1781 writel(SDO_TVOUT_CLOCK_ON, sdout_base + S5P_SDO_CLKCON); |
| 1782 |
| 1783 SDPRINTK("0x%x\n\r", readl(sdout_base + S5P_SDO_CLKCON)); |
| 1784 } |
| 1785 |
| 1786 /* |
| 1787 / stop - stop functions are only called under running SDOUT |
| 1788 */ |
| 1789 void tv_sdout_stop(void) |
| 1790 { |
| 1791 SDPRINTK("()\n\r"); |
| 1792 |
| 1793 mdelay(100); |
| 1794 |
| 1795 writel(SDO_TVOUT_CLOCK_OFF, sdout_base + S5P_SDO_CLKCON); |
| 1796 |
| 1797 SDPRINTK(" 0x%x)\n\r", readl(sdout_base + S5P_SDO_CLKCON)); |
| 1798 } |
| 1799 |
| 1800 /* |
| 1801 * reset |
| 1802 * - reset function |
| 1803 */ |
| 1804 void tv_sdout_sw_reset(bool active) |
| 1805 { |
| 1806 SDPRINTK("%d\n\r", active); |
| 1807 |
| 1808 if (active) |
| 1809 writel(readl(sdout_base + S5P_SDO_CLKCON) | |
| 1810 SDO_TVOUT_SW_RESET, |
| 1811 sdout_base + S5P_SDO_CLKCON); |
| 1812 else |
| 1813 writel(readl(sdout_base + S5P_SDO_CLKCON) & |
| 1814 ~SDO_TVOUT_SW_RESET, |
| 1815 sdout_base + S5P_SDO_CLKCON); |
| 1816 |
| 1817 SDPRINTK(" 0x%x\n\r", readl(sdout_base + S5P_SDO_CLKCON)); |
| 1818 } |
| 1819 |
| 1820 |
| 1821 void tv_sdout_set_interrupt_enable(bool vsync_intr_en) |
| 1822 { |
| 1823 SDPRINTK("%d)\n\r", vsync_intr_en); |
| 1824 |
| 1825 if (vsync_intr_en) |
| 1826 writel(readl(sdout_base + S5P_SDO_IRQMASK) & |
| 1827 ~SDO_VSYNC_IRQ_DISABLE, |
| 1828 sdout_base + S5P_SDO_IRQMASK); |
| 1829 else |
| 1830 writel(readl(sdout_base + S5P_SDO_IRQMASK) | |
| 1831 SDO_VSYNC_IRQ_DISABLE, |
| 1832 sdout_base + S5P_SDO_IRQMASK); |
| 1833 |
| 1834 SDPRINTK("0x%x)\n\r", readl(sdout_base + S5P_SDO_IRQMASK)); |
| 1835 } |
| 1836 |
| 1837 void tv_sdout_clear_interrupt_pending(void) |
| 1838 { |
| 1839 SDPRINTK("0x%x\n\r", readl(sdout_base + S5P_SDO_IRQ)); |
| 1840 |
| 1841 writel(readl(sdout_base + S5P_SDO_IRQ) | SDO_VSYNC_IRQ_PEND, |
| 1842 sdout_base + S5P_SDO_IRQ); |
| 1843 |
| 1844 SDPRINTK("0x%x\n\r", readl(sdout_base + S5P_SDO_IRQ)); |
| 1845 } |
| 1846 |
| 1847 bool tv_sdout_get_interrupt_pending(void) |
| 1848 { |
| 1849 SDPRINTK(" 0x%x\n\r", readl(sdout_base + S5P_SDO_IRQ)); |
| 1850 |
| 1851 return (readl(sdout_base + S5P_SDO_IRQ) | SDO_VSYNC_IRQ_PEND) ? |
| 1852 1 : 0; |
| 1853 } |
| 1854 |
| 1855 int __init tv_sdout_probe(struct platform_device *pdev, u32 res_num) |
| 1856 { |
| 1857 struct resource *res; |
| 1858 size_t size; |
| 1859 |
| 1860 res = platform_get_resource(pdev, IORESOURCE_MEM, res_num); |
| 1861 |
| 1862 if (res == NULL) { |
| 1863 dev_err(&pdev->dev, |
| 1864 "failed to get memory region resource\n"); |
| 1865 goto error; |
| 1866 } |
| 1867 |
| 1868 size = (res->end - res->start) + 1; |
| 1869 |
| 1870 sdout_mem = request_mem_region(res->start, size, pdev->name); |
| 1871 |
| 1872 if (sdout_mem == NULL) { |
| 1873 dev_err(&pdev->dev, |
| 1874 "failed to get memory region\n"); |
| 1875 goto error; |
| 1876 } |
| 1877 |
| 1878 sdout_base = ioremap(res->start, size); |
| 1879 |
| 1880 if (sdout_base == NULL) { |
| 1881 dev_err(&pdev->dev, |
| 1882 "failed to ioremap address region\n"); |
| 1883 goto error; |
| 1884 |
| 1885 } |
| 1886 |
| 1887 return 0; |
| 1888 error: |
| 1889 return -ENOENT; |
| 1890 |
| 1891 } |
| 1892 |
| 1893 int __init tv_sdout_release(struct platform_device *pdev) |
| 1894 { |
| 1895 iounmap(sdout_base); |
| 1896 |
| 1897 /* remove memory region */ |
| 1898 if (sdout_mem != NULL) { |
| 1899 if (release_resource(sdout_mem)) |
| 1900 dev_err(&pdev->dev, |
| 1901 "Can't remove tvout drv !!\n"); |
| 1902 |
| 1903 kfree(sdout_mem); |
| 1904 |
| 1905 sdout_mem = NULL; |
| 1906 } |
| 1907 |
| 1908 return 0; |
| 1909 } |
OLD | NEW |