Index: drivers/media/video/samsung/tv20/sdout_s5pv210.c |
diff --git a/drivers/media/video/samsung/tv20/sdout_s5pv210.c b/drivers/media/video/samsung/tv20/sdout_s5pv210.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..073b69058c5fc13b62aac69394618bb7327398c3 |
--- /dev/null |
+++ b/drivers/media/video/samsung/tv20/sdout_s5pv210.c |
@@ -0,0 +1,1909 @@ |
+/* linux/drivers/media/video/samsung/tv20/sdout_s5pv210.c |
+* |
+* Copyright (c) 2010 Samsung Electronics Co., Ltd. |
+* http://www.samsung.com/ |
+* |
+* S5PV210 - tv encoder raw ftn file for Samsung TVOut driver |
+* |
+* This program is free software; you can redistribute it and/or modify |
+* it under the terms of the GNU General Public License version 2 as |
+* published by the Free Software Foundation. |
+*/ |
+ |
+#include <linux/module.h> |
+#include <linux/kernel.h> |
+#include <linux/platform_device.h> |
+#include <linux/clk.h> |
+#include <linux/delay.h> |
+ |
+#include <plat/clock.h> |
+#include <linux/io.h> |
+#include <linux/uaccess.h> |
+#include <asm/sizes.h> |
+#include <linux/memory.h> |
+ |
+#include "tv_out_s5pv210.h" |
+ |
+#include <mach/regs-sdaout.h> |
+ |
+#ifdef CONFIG_TVOUT_RAW_DBG |
+#define S5P_SDAOUT_DEBUG 1 |
+#endif |
+ |
+#ifdef S5P_SDAOUT_DEBUG |
+#define SDPRINTK(fmt, args...) \ |
+ printk(KERN_INFO "\t\t[SDOUT] %s: " fmt, __func__ , ## args) |
+#else |
+#define SDPRINTK(fmt, args...) |
+#endif |
+ |
+static struct resource *sdout_mem; |
+void __iomem *sdout_base; |
+ |
+/* |
+* initialization - iniization functions are only called under stopping SDOUT |
+*/ |
+enum s5p_tv_sd_err tv_sdout_init_video_scale_cfg( |
+ enum s5p_sd_level component_level, |
+ enum s5p_sd_vsync_ratio component_ratio, |
+ enum s5p_sd_level composite_level, |
+ enum s5p_sd_vsync_ratio composite_ratio) |
+{ |
+ u32 temp_reg = 0; |
+ |
+ SDPRINTK("%d,%d,%d,%d\n\r", component_level, component_ratio, |
+ composite_level, composite_ratio); |
+ |
+ switch (component_level) { |
+ |
+ case S5P_TV_SD_LEVEL_0IRE: |
+ temp_reg = SDO_COMPONENT_LEVEL_SEL_0IRE; |
+ break; |
+ |
+ case S5P_TV_SD_LEVEL_75IRE: |
+ temp_reg = SDO_COMPONENT_LEVEL_SEL_75IRE; |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid component_level parameter(%d)\n\r", |
+ component_level); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ switch (composite_level) { |
+ |
+ case SDOUT_VTOS_RATIO_10_4: |
+ temp_reg |= SDO_COMPONENT_VTOS_RATIO_10_4; |
+ break; |
+ |
+ case SDOUT_VTOS_RATIO_7_3: |
+ temp_reg |= SDO_COMPONENT_VTOS_RATIO_7_3; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid composite_level parameter(%d)\n\r", |
+ composite_level); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ switch (composite_level) { |
+ |
+ case S5P_TV_SD_LEVEL_0IRE: |
+ temp_reg |= SDO_COMPOSITE_LEVEL_SEL_0IRE; |
+ break; |
+ |
+ case S5P_TV_SD_LEVEL_75IRE: |
+ temp_reg |= SDO_COMPOSITE_LEVEL_SEL_75IRE; |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid composite_ratio parameter(%d)\n\r", |
+ composite_ratio); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ switch (composite_ratio) { |
+ |
+ case SDOUT_VTOS_RATIO_10_4: |
+ temp_reg |= SDO_COMPOSITE_VTOS_RATIO_10_4; |
+ break; |
+ |
+ case SDOUT_VTOS_RATIO_7_3: |
+ temp_reg |= SDO_COMPOSITE_VTOS_RATIO_7_3; |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid component_ratio parameter(%d)\n\r", |
+ component_ratio); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ writel(temp_reg, sdout_base + S5P_SDO_SCALE); |
+ |
+ SDPRINTK("0x%08x)\n\r", readl(sdout_base + S5P_SDO_SCALE)); |
+ |
+ return SDOUT_NO_ERROR; |
+} |
+ |
+enum s5p_tv_sd_err tv_sdout_init_sync_signal_pin(enum s5p_sd_sync_sig_pin pin) |
+{ |
+ SDPRINTK("%d\n\r", pin); |
+ |
+ switch (pin) { |
+ |
+ case SDOUT_SYNC_SIG_NO: |
+ writel(SDO_COMPONENT_SYNC_ABSENT, sdout_base + S5P_SDO_SYNC); |
+ break; |
+ |
+ case SDOUT_SYNC_SIG_YG: |
+ writel(SDO_COMPONENT_SYNC_YG, sdout_base + S5P_SDO_SYNC); |
+ break; |
+ |
+ case SDOUT_SYNC_SIG_ALL: |
+ writel(SDO_COMPONENT_SYNC_ALL, sdout_base + S5P_SDO_SYNC); |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid pin parameter(%d)\n\r", pin); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_SYNC)); |
+ |
+ return SDOUT_NO_ERROR; |
+} |
+ |
+enum s5p_tv_sd_err tv_sdout_init_vbi(bool wss_cvbs, |
+ enum s5p_sd_closed_caption_type caption_cvbs, |
+ bool wss_y_sideo, |
+ enum s5p_sd_closed_caption_type caption_y_sideo, |
+ bool cgmsa_rgb, |
+ bool wss_rgb, |
+ enum s5p_sd_closed_caption_type caption_rgb, |
+ bool cgmsa_y_ppr, |
+ bool wss_y_ppr, |
+ enum s5p_sd_closed_caption_type caption_y_ppr) |
+{ |
+ u32 temp_reg = 0; |
+ |
+ SDPRINTK(" %d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n\r", |
+ wss_cvbs, caption_cvbs, wss_y_sideo, |
+ caption_y_sideo, cgmsa_rgb, wss_rgb, |
+ caption_rgb, cgmsa_y_ppr, wss_y_ppr, caption_y_ppr); |
+ |
+ if (wss_cvbs) |
+ temp_reg = SDO_CVBS_WSS_INS; |
+ else |
+ temp_reg = SDO_CVBS_NO_WSS; |
+ |
+ switch (caption_cvbs) { |
+ |
+ case SDOUT_NO_INS: |
+ temp_reg |= SDO_CVBS_NO_CLOSED_CAPTION; |
+ break; |
+ |
+ case SDOUT_INS_1: |
+ temp_reg |= SDO_CVBS_21H_CLOSED_CAPTION; |
+ break; |
+ |
+ case SDOUT_INS_2: |
+ temp_reg |= SDO_CVBS_21H_284H_CLOSED_CAPTION; |
+ break; |
+ |
+ case SDOUT_INS_OTHERS: |
+ temp_reg |= SDO_CVBS_USE_OTHERS; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid caption_cvbs parameter(%d)\n\r", |
+ caption_cvbs); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ if (wss_y_sideo) |
+ temp_reg |= SDO_SVIDEO_WSS_INS; |
+ else |
+ temp_reg |= SDO_SVIDEO_NO_WSS; |
+ |
+ switch (caption_y_sideo) { |
+ |
+ case SDOUT_NO_INS: |
+ temp_reg |= SDO_SVIDEO_NO_CLOSED_CAPTION; |
+ break; |
+ |
+ case SDOUT_INS_1: |
+ temp_reg |= SDO_SVIDEO_21H_CLOSED_CAPTION; |
+ break; |
+ |
+ case SDOUT_INS_2: |
+ temp_reg |= SDO_SVIDEO_21H_284H_CLOSED_CAPTION; |
+ break; |
+ |
+ case SDOUT_INS_OTHERS: |
+ temp_reg |= SDO_SVIDEO_USE_OTHERS; |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid caption_y_sideo parameter(%d)\n\r", |
+ caption_y_sideo); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ if (cgmsa_rgb) |
+ temp_reg |= SDO_RGB_CGMSA_INS; |
+ else |
+ temp_reg |= SDO_RGB_NO_CGMSA; |
+ |
+ if (wss_rgb) |
+ temp_reg |= SDO_RGB_WSS_INS; |
+ else |
+ temp_reg |= SDO_RGB_NO_WSS; |
+ |
+ switch (caption_rgb) { |
+ |
+ case SDOUT_NO_INS: |
+ temp_reg |= SDO_RGB_NO_CLOSED_CAPTION; |
+ break; |
+ |
+ case SDOUT_INS_1: |
+ temp_reg |= SDO_RGB_21H_CLOSED_CAPTION; |
+ break; |
+ |
+ case SDOUT_INS_2: |
+ temp_reg |= SDO_RGB_21H_284H_CLOSED_CAPTION; |
+ break; |
+ |
+ case SDOUT_INS_OTHERS: |
+ temp_reg |= SDO_RGB_USE_OTHERS; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid caption_rgb parameter(%d)\n\r", |
+ caption_rgb); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ if (cgmsa_y_ppr) |
+ temp_reg |= SDO_YPBPR_CGMSA_INS; |
+ else |
+ temp_reg |= SDO_YPBPR_NO_CGMSA; |
+ |
+ if (wss_y_ppr) |
+ temp_reg |= SDO_YPBPR_WSS_INS; |
+ else |
+ temp_reg |= SDO_YPBPR_NO_WSS; |
+ |
+ switch (caption_y_ppr) { |
+ |
+ case SDOUT_NO_INS: |
+ temp_reg |= SDO_YPBPR_NO_CLOSED_CAPTION; |
+ break; |
+ |
+ case SDOUT_INS_1: |
+ temp_reg |= SDO_YPBPR_21H_CLOSED_CAPTION; |
+ break; |
+ |
+ case SDOUT_INS_2: |
+ temp_reg |= SDO_YPBPR_21H_284H_CLOSED_CAPTION; |
+ break; |
+ |
+ case SDOUT_INS_OTHERS: |
+ temp_reg |= SDO_YPBPR_USE_OTHERS; |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid caption_y_ppr parameter(%d)\n\r", |
+ caption_y_ppr); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ writel(temp_reg, sdout_base + S5P_SDO_VBI); |
+ |
+ SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_VBI)); |
+ |
+ return SDOUT_NO_ERROR; |
+} |
+ |
+enum s5p_tv_sd_err tv_sdout_init_offset_gain(enum s5p_sd_channel_sel channel, |
+ u32 offset, |
+ u32 gain) |
+{ |
+ SDPRINTK("%d,%d,%d\n\r", channel, offset, gain); |
+ |
+ switch (channel) { |
+ |
+ case SDOUT_CHANNEL_0: |
+ writel(SDO_SCALE_CONV_OFFSET(offset) | |
+ SDO_SCALE_CONV_GAIN(gain), |
+ sdout_base + S5P_SDO_SCALE_CH0); |
+ SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_SCALE_CH0)); |
+ break; |
+ |
+ case SDOUT_CHANNEL_1: |
+ writel(SDO_SCALE_CONV_OFFSET(offset) | |
+ SDO_SCALE_CONV_GAIN(gain), |
+ sdout_base + S5P_SDO_SCALE_CH1); |
+ SDPRINTK(" 0x%08x\n\r", readl(sdout_base + S5P_SDO_SCALE_CH1)); |
+ break; |
+ |
+ case SDOUT_CHANNEL_2: |
+ writel(SDO_SCALE_CONV_OFFSET(offset) | |
+ SDO_SCALE_CONV_GAIN(gain), |
+ sdout_base + S5P_SDO_SCALE_CH2); |
+ SDPRINTK(" 0x%08x\n\r", readl(sdout_base + S5P_SDO_SCALE_CH2)); |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid channel parameter(%d)\n\r", channel); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ return SDOUT_NO_ERROR; |
+} |
+ |
+void tv_sdout_init_delay(u32 delay_y, |
+ u32 offset_video_start, |
+ u32 offset_video_end) |
+{ |
+ SDPRINTK("%d,%d,%d\n\r", delay_y, offset_video_start, offset_video_end); |
+ |
+ writel(SDO_DELAY_YTOC( |
+ delay_y) | SDO_ACTIVE_START_OFFSET(offset_video_start) | |
+ SDO_ACTIVE_END_OFFSET(offset_video_end), |
+ sdout_base + S5P_SDO_YCDELAY); |
+ |
+ SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_YCDELAY)); |
+} |
+ |
+void tv_sdout_init_schlock(bool color_sucarrier_pha_adj) |
+{ |
+ SDPRINTK("%d\n\r", color_sucarrier_pha_adj); |
+ |
+ if (color_sucarrier_pha_adj) |
+ writel(SDO_COLOR_SC_PHASE_ADJ, sdout_base + S5P_SDO_SCHLOCK); |
+ else |
+ writel(SDO_COLOR_SC_PHASE_NOADJ, sdout_base + S5P_SDO_SCHLOCK); |
+ |
+ SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_SCHLOCK)); |
+} |
+ |
+enum s5p_tv_sd_err tv_sdout_init_dac_power_onoff( |
+ enum s5p_sd_channel_sel channel, bool dac_on) |
+{ |
+ u32 temp_on_off; |
+ |
+ SDPRINTK("%d,%d)\n\r", channel, dac_on); |
+ |
+ switch (channel) { |
+ |
+ case SDOUT_CHANNEL_0: |
+ temp_on_off = SDO_POWER_ON_DAC0; |
+ break; |
+ |
+ case SDOUT_CHANNEL_1: |
+ temp_on_off = SDO_POWER_ON_DAC1; |
+ break; |
+ |
+ case SDOUT_CHANNEL_2: |
+ temp_on_off = SDO_POWER_ON_DAC2; |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid channel parameter(%d)\n\r", channel); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ if (dac_on) { |
+ writel(readl(sdout_base + S5P_SDO_DAC) | temp_on_off, |
+ sdout_base + S5P_SDO_DAC); |
+ } else { |
+ writel(readl(sdout_base + S5P_SDO_DAC) & ~temp_on_off, |
+ sdout_base + S5P_SDO_DAC); |
+ } |
+ |
+ SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_DAC)); |
+ |
+ return SDOUT_NO_ERROR; |
+} |
+ |
+void tv_sdout_init_color_compensaton_onoff(bool bright_hue_saturation_adj, |
+ bool y_ppr_color_compensation, |
+ bool rgcolor_compensation, |
+ bool y_c_color_compensation, |
+ bool y_cvbs_color_compensation) |
+{ |
+ u32 temp_reg = 0; |
+ |
+ SDPRINTK("%d,%d,%d,%d,%d)\n\r", bright_hue_saturation_adj, |
+ y_ppr_color_compensation, rgcolor_compensation, |
+ y_c_color_compensation, y_cvbs_color_compensation); |
+ |
+ if (bright_hue_saturation_adj) |
+ temp_reg &= ~SDO_COMPONENT_BHS_ADJ_OFF; |
+ else |
+ temp_reg |= SDO_COMPONENT_BHS_ADJ_OFF; |
+ |
+ if (y_ppr_color_compensation) |
+ temp_reg &= ~SDO_COMPONENT_YPBPR_COMP_OFF; |
+ else |
+ temp_reg |= SDO_COMPONENT_YPBPR_COMP_OFF; |
+ |
+ if (rgcolor_compensation) |
+ temp_reg &= ~SDO_COMPONENT_RGB_COMP_OFF; |
+ else |
+ temp_reg |= SDO_COMPONENT_RGB_COMP_OFF; |
+ |
+ if (y_c_color_compensation) |
+ temp_reg &= ~SDO_COMPONENT_YC_COMP_OFF; |
+ else |
+ temp_reg |= SDO_COMPONENT_YC_COMP_OFF; |
+ |
+ if (y_cvbs_color_compensation) |
+ temp_reg &= ~SDO_COMPONENT_CVBS_COMP_OFF; |
+ else |
+ temp_reg |= SDO_COMPONENT_CVBS_COMP_OFF; |
+ |
+ writel(temp_reg, sdout_base + S5P_SDO_CCCON); |
+ |
+ SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_CCCON)); |
+} |
+ |
+void tv_sdout_init_brightness_hue_saturation(u32 gain_brightness, |
+ u32 offset_brightness, |
+ u32 gain0_cb_hue_saturation, |
+ u32 gain1_cb_hue_saturation, |
+ u32 gain0_cr_hue_saturation, |
+ u32 gain1_cr_hue_saturation, |
+ u32 offset_cb_hue_saturation, |
+ u32 offset_cr_hue_saturation) |
+{ |
+ SDPRINTK(" %d,%d,%d,%d,%d,%d,%d,%d)\n\r", gain_brightness, |
+ offset_brightness, gain0_cb_hue_saturation, |
+ gain1_cb_hue_saturation, gain0_cr_hue_saturation, |
+ gain1_cr_hue_saturation, offset_cb_hue_saturation, |
+ offset_cr_hue_saturation); |
+ |
+ writel(SDO_BRIGHTNESS_GAIN(gain_brightness) | |
+ SDO_BRIGHTNESS_OFFSET(offset_brightness), |
+ sdout_base + S5P_SDO_YSCALE); |
+ |
+ writel(SDO_HS_CB_GAIN0(gain0_cb_hue_saturation) | |
+ SDO_HS_CB_GAIN1(gain1_cb_hue_saturation), |
+ sdout_base + S5P_SDO_CBSCALE); |
+ |
+ writel(SDO_HS_CR_GAIN0(gain0_cr_hue_saturation) | |
+ SDO_HS_CR_GAIN1(gain1_cr_hue_saturation), |
+ sdout_base + S5P_SDO_CRSCALE); |
+ |
+ writel(SDO_HS_CR_OFFSET(offset_cr_hue_saturation) | |
+ SDO_HS_CB_OFFSET(offset_cb_hue_saturation), |
+ sdout_base + S5P_SDO_CB_CR_OFFSET); |
+ |
+ SDPRINTK("0x%08x,0x%08x,0x%08x,0x%08x)\n\r", |
+ readl(sdout_base + S5P_SDO_YSCALE), |
+ readl(sdout_base + S5P_SDO_CBSCALE), |
+ readl(sdout_base + S5P_SDO_CRSCALE), |
+ readl(sdout_base + S5P_SDO_CB_CR_OFFSET)); |
+} |
+ |
+void tv_sdout_init_rgb_color_compensation(u32 max_rgbcube, |
+ u32 min_rgbcube) |
+{ |
+ SDPRINTK("0x%08x,0x%08x\n\r", max_rgbcube, min_rgbcube); |
+ |
+ writel(SDO_MAX_RGB_CUBE(max_rgbcube) | SDO_MIN_RGB_CUBE(min_rgbcube), |
+ sdout_base + S5P_SDO_RGB_CC); |
+ |
+ SDPRINTK("0x%08x)\n\r", readl(sdout_base + S5P_SDO_RGB_CC)); |
+} |
+ |
+void tv_sdout_init_cvbs_color_compensation(u32 y_lower_mid, |
+ u32 y_bottom, |
+ u32 y_top, |
+ u32 y_upper_mid, |
+ u32 radius) |
+{ |
+ SDPRINTK("%d,%d,%d,%d,%d\n\r", y_lower_mid, y_bottom, |
+ y_top, y_upper_mid, radius); |
+ |
+ writel(SDO_Y_LOWER_MID_CVBS_CORN(y_lower_mid) | |
+ SDO_Y_BOTTOM_CVBS_CORN(y_bottom), |
+ sdout_base + S5P_SDO_CVBS_CC_Y1); |
+ writel(SDO_Y_TOP_CVBS_CORN(y_top) | |
+ SDO_Y_UPPER_MID_CVBS_CORN(y_upper_mid), |
+ sdout_base + S5P_SDO_CVBS_CC_Y2); |
+ writel(SDO_RADIUS_CVBS_CORN(radius), sdout_base + S5P_SDO_CVBS_CC_C); |
+ |
+ SDPRINTK("0x%08x,0x%08x,0x%08x)\n\r", |
+ readl(sdout_base + S5P_SDO_CVBS_CC_Y1), |
+ readl(sdout_base + S5P_SDO_CVBS_CC_Y2), |
+ readl(sdout_base + S5P_SDO_CVBS_CC_C)); |
+} |
+ |
+void tv_sdout_init_svideo_color_compensation(u32 y_top, |
+ u32 y_bottom, |
+ u32 y_c_cylinder) |
+{ |
+ SDPRINTK(" %d,%d,%d)\n\r", y_top, y_bottom, y_c_cylinder); |
+ |
+ writel(SDO_Y_TOP_YC_CYLINDER(y_top) | |
+ SDO_Y_BOTOM_YC_CYLINDER(y_bottom), |
+ sdout_base + S5P_SDO_YC_CC_Y); |
+ writel(SDO_RADIUS_YC_CYLINDER(y_c_cylinder), |
+ sdout_base + S5P_SDO_YC_CC_C); |
+ |
+ SDPRINTK("0x%08x,0x%08x)\n\r", readl(sdout_base + S5P_SDO_YC_CC_Y), |
+ readl(sdout_base + S5P_SDO_YC_CC_C)); |
+} |
+ |
+void tv_sdout_init_component_porch(u32 back_525, |
+ u32 front_525, |
+ u32 back_625, |
+ u32 front_625) |
+{ |
+ SDPRINTK(" %d,%d,%d,%d)\n\r", back_525, front_525, back_625, front_625); |
+ |
+ writel(SDO_COMPONENT_525_BP(back_525) | |
+ SDO_COMPONENT_525_FP(front_525), |
+ sdout_base + S5P_SDO_CSC_525_PORCH); |
+ writel(SDO_COMPONENT_625_BP(back_625) | |
+ SDO_COMPONENT_625_FP(front_625), |
+ sdout_base + S5P_SDO_CSC_625_PORCH); |
+ |
+ SDPRINTK(" 0x%08x,0x%08x)\n\r", |
+ readl(sdout_base + S5P_SDO_CSC_525_PORCH), |
+ readl(sdout_base + S5P_SDO_CSC_625_PORCH)); |
+} |
+ |
+enum s5p_tv_sd_err tv_sdout_init_vesa_rgb_sync( |
+ enum s5p_sd_vesa_rgb_sync_type sync_type, |
+ enum s5p_tv_active_polarity v_sync_active, |
+ enum s5p_tv_active_polarity h_sync_active) |
+{ |
+ u32 temp_reg = 0; |
+ |
+ SDPRINTK("%d,%d,%d\n\r", sync_type, v_sync_active, h_sync_active); |
+ |
+ switch (sync_type) { |
+ |
+ case SDOUT_VESA_RGB_SYNC_COMPOSITE: |
+ temp_reg |= SDO_RGB_SYNC_COMPOSITE; |
+ break; |
+ |
+ case SDOUT_VESA_RGB_SYNC_SEPARATE: |
+ temp_reg |= SDO_RGB_SYNC_SEPERATE; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid sync_type parameter(%d)\n\r", |
+ sync_type); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ switch (v_sync_active) { |
+ |
+ case TVOUT_POL_ACTIVE_LOW: |
+ temp_reg |= SDO_RGB_VSYNC_LOW_ACT; |
+ break; |
+ |
+ case TVOUT_POL_ACTIVE_HIGH: |
+ temp_reg |= SDO_RGB_VSYNC_HIGH_ACT; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid v_sync_active parameter(%d)\n\r", |
+ v_sync_active); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ switch (h_sync_active) { |
+ |
+ case TVOUT_POL_ACTIVE_LOW: |
+ temp_reg |= SDO_RGB_HSYNC_LOW_ACT; |
+ break; |
+ |
+ case TVOUT_POL_ACTIVE_HIGH: |
+ temp_reg |= SDO_RGB_HSYNC_HIGH_ACT; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid h_sync_active parameter(%d)\n\r", |
+ h_sync_active); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ writel(temp_reg, sdout_base + S5P_SDO_RGBSYNC); |
+ |
+ SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_RGBSYNC)); |
+ |
+ return SDOUT_NO_ERROR; |
+} |
+ |
+void tv_sdout_init_oversampling_filter_coeff(u32 size, |
+ u32 *coeff, |
+ u32 *coeff1, |
+ u32 *coeff2) |
+{ |
+ u32 *temp_reg = 0; |
+ |
+ SDPRINTK(" %d,0x%x,0x%x,0x%x\n\r", (u32)size, (u32)coeff, (u32)coeff1, |
+ (u32)coeff2); |
+ |
+ if (coeff != NULL) { |
+ temp_reg = (u32 *)readl(sdout_base + S5P_SDO_OSFC00_0); |
+ memcpy((void *)temp_reg, (const void *)coeff, size*4); |
+ } |
+ |
+ if (coeff1 != NULL) { |
+ temp_reg = (u32 *)readl(sdout_base + S5P_SDO_OSFC00_1); |
+ memcpy((void *)temp_reg, (const void *)coeff1, size*4); |
+ } |
+ |
+ if (coeff2 != NULL) { |
+ temp_reg = (u32 *)readl(sdout_base + S5P_SDO_OSFC00_2); |
+ memcpy((void *)temp_reg, (const void *)coeff2, size*4); |
+ } |
+ |
+ SDPRINTK(" ()\n\r"); |
+} |
+ |
+enum s5p_tv_sd_err tv_sdout_init_ch_xtalk_cancel_coef( |
+ enum s5p_sd_channel_sel channel, |
+ u32 coeff2, |
+ u32 coeff1) |
+{ |
+ SDPRINTK(" %d,%d,%d\n\r", channel, coeff2, coeff1); |
+ |
+ switch (channel) { |
+ |
+ case SDOUT_CHANNEL_0: |
+ writel(SDO_XTALK_COEF02(coeff2) | SDO_XTALK_COEF01(coeff1), |
+ sdout_base + S5P_SDO_XTALK0); |
+ SDPRINTK(" 0x%08x)\n\r", readl(sdout_base + S5P_SDO_XTALK0)); |
+ break; |
+ |
+ case SDOUT_CHANNEL_1: |
+ writel(SDO_XTALK_COEF02(coeff2) | SDO_XTALK_COEF01(coeff1), |
+ sdout_base + S5P_SDO_XTALK1); |
+ SDPRINTK(" 0x%08x)\n\r", readl(sdout_base + S5P_SDO_XTALK1)); |
+ break; |
+ |
+ case SDOUT_CHANNEL_2: |
+ writel(SDO_XTALK_COEF02(coeff2) | SDO_XTALK_COEF01(coeff1), |
+ sdout_base + S5P_SDO_XTALK2); |
+ SDPRINTK("0x%08x)\n\r", readl(sdout_base + S5P_SDO_XTALK2)); |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid channel parameter(%d)\n\r", channel); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ return SDOUT_NO_ERROR; |
+} |
+ |
+void tv_sdout_init_closed_caption(u32 display_cc, u32 non_display_cc) |
+{ |
+ SDPRINTK("%d,%d\n\r", display_cc, non_display_cc); |
+ |
+ writel(SDO_DISPLAY_CC_CAPTION(display_cc) | |
+ SDO_NON_DISPLAY_CC_CAPTION(non_display_cc), |
+ sdout_base + S5P_SDO_ARMCC); |
+ |
+ SDPRINTK("0x%x\n\r", readl(sdout_base + S5P_SDO_ARMCC)); |
+} |
+ |
+/* static functions */ |
+static u32 tv_sdout_init_wss_cgms_crc(u32 value) |
+{ |
+ u8 i; |
+ u8 CGMS[14], CRC[6], OLD_CRC; |
+ u32 temp_in; |
+ |
+ temp_in = value; |
+ |
+ for (i = 0; i < 14; i++) |
+ CGMS[i] = (u8)(temp_in >> i) & 0x1 ; |
+ |
+ /* initialize state */ |
+ for (i = 0; i < 6; i++) |
+ CRC[i] = 0x1; |
+ |
+ /* round 20 */ |
+ for (i = 0; i < 14; i++) { |
+ OLD_CRC = CRC[0]; |
+ CRC[0] = CRC[1]; |
+ CRC[1] = CRC[2]; |
+ CRC[2] = CRC[3]; |
+ CRC[3] = CRC[4]; |
+ CRC[4] = OLD_CRC ^ CGMS[i] ^ CRC[5]; |
+ CRC[5] = OLD_CRC ^ CGMS[i]; |
+ } |
+ |
+ /* recompose to return crc */ |
+ temp_in &= 0x3fff; |
+ |
+ for (i = 0; i < 6; i++) |
+ temp_in |= ((u32)(CRC[i] & 0x1) << i); |
+ |
+ return temp_in; |
+} |
+ |
+ |
+enum s5p_tv_sd_err tv_sdout_init_wss525_data( |
+ enum s5p_sd_525_copy_permit copy_permit, |
+ enum s5p_sd_525_mv_psp mv_psp, |
+ enum s5p_sd_525_copy_info copy_info, |
+ bool analog_on, |
+ enum s5p_sd_525_aspect_ratio display_ratio) |
+{ |
+ u32 temp_reg = 0; |
+ |
+ SDPRINTK("%d,%d,%d,%d\n\r", copy_permit, mv_psp, copy_info, |
+ display_ratio); |
+ |
+ switch (copy_permit) { |
+ |
+ case SDO_525_COPY_PERMIT: |
+ temp_reg = SDO_WORD2_WSS525_COPY_PERMIT; |
+ break; |
+ |
+ case SDO_525_ONECOPY_PERMIT: |
+ temp_reg = SDO_WORD2_WSS525_ONECOPY_PERMIT; |
+ break; |
+ |
+ case SDO_525_NOCOPY_PERMIT: |
+ temp_reg = SDO_WORD2_WSS525_NOCOPY_PERMIT; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid copy_permit parameter(%d)\n\r", |
+ copy_permit); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ switch (mv_psp) { |
+ |
+ case SDO_525_MV_PSP_OFF: |
+ temp_reg |= SDO_WORD2_WSS525_MV_PSP_OFF; |
+ break; |
+ |
+ case SDO_525_MV_PSP_ON_2LINE_BURST: |
+ temp_reg |= SDO_WORD2_WSS525_MV_PSP_ON_2LINE_BURST; |
+ break; |
+ |
+ case SDO_525_MV_PSP_ON_BURST_OFF: |
+ temp_reg |= SDO_WORD2_WSS525_MV_PSP_ON_BURST_OFF; |
+ break; |
+ |
+ case SDO_525_MV_PSP_ON_4LINE_BURST: |
+ temp_reg |= SDO_WORD2_WSS525_MV_PSP_ON_4LINE_BURST; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid mv_psp parameter(%d)\n\r", mv_psp); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ switch (copy_info) { |
+ |
+ case SDO_525_COPY_INFO: |
+ temp_reg |= SDO_WORD1_WSS525_COPY_INFO; |
+ break; |
+ |
+ case SDO_525_DEFAULT: |
+ temp_reg |= SDO_WORD1_WSS525_DEFAULT; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid copy_info parameter(%d)\n\r", copy_info); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ if (analog_on) |
+ temp_reg |= SDO_WORD2_WSS525_ANALOG_ON; |
+ else |
+ temp_reg |= SDO_WORD2_WSS525_ANALOG_OFF; |
+ |
+ switch (display_ratio) { |
+ |
+ case SDO_525_COPY_PERMIT: |
+ temp_reg |= SDO_WORD0_WSS525_4_3_NORMAL; |
+ break; |
+ |
+ case SDO_525_ONECOPY_PERMIT: |
+ temp_reg |= SDO_WORD0_WSS525_16_9_ANAMORPIC; |
+ break; |
+ |
+ case SDO_525_NOCOPY_PERMIT: |
+ temp_reg |= SDO_WORD0_WSS525_4_3_LETTERBOX; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid display_ratio parameter(%d)\n\r", |
+ display_ratio); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ writel(temp_reg | |
+ SDO_CRC_WSS525(tv_sdout_init_wss_cgms_crc(temp_reg)), |
+ sdout_base + S5P_SDO_WSS525); |
+ |
+ SDPRINTK("0x%08x)\n\r", readl(sdout_base + S5P_SDO_WSS525)); |
+ |
+ return SDOUT_NO_ERROR; |
+} |
+ |
+enum s5p_tv_sd_err tv_sdout_init_wss625_data(bool surround_sound, |
+ bool copyright, |
+ bool copy_protection, |
+ bool text_subtitles, |
+ enum s5p_sd_625_subtitles open_subtitles, |
+ enum s5p_sd_625_camera_film camera_film, |
+ enum s5p_sd_625_color_encoding color_encoding, |
+ bool helper_signal, |
+ enum s5p_sd_625_aspect_ratio display_ratio) |
+{ |
+ u32 temp_reg = 0; |
+ |
+ SDPRINTK("%d,%d,%d,%d,%d,%d,%d,%d,%d\n\r", |
+ surround_sound, copyright, copy_protection, |
+ text_subtitles, open_subtitles, camera_film, |
+ color_encoding, helper_signal, display_ratio); |
+ |
+ if (surround_sound) |
+ temp_reg = SDO_WSS625_SURROUND_SOUND_ENABLE; |
+ else |
+ temp_reg = SDO_WSS625_SURROUND_SOUND_DISABLE; |
+ |
+ if (copyright) |
+ temp_reg |= SDO_WSS625_COPYRIGHT; |
+ else |
+ temp_reg |= SDO_WSS625_NO_COPYRIGHT; |
+ |
+ if (copy_protection) |
+ temp_reg |= SDO_WSS625_COPY_RESTRICTED; |
+ else |
+ temp_reg |= SDO_WSS625_COPY_NOT_RESTRICTED; |
+ |
+ if (text_subtitles) |
+ temp_reg |= SDO_WSS625_TELETEXT_SUBTITLES; |
+ else |
+ temp_reg |= SDO_WSS625_TELETEXT_NO_SUBTITLES; |
+ |
+ switch (open_subtitles) { |
+ |
+ case SDO_625_NO_OPEN_SUBTITLES: |
+ temp_reg |= SDO_WSS625_NO_OPEN_SUBTITLES; |
+ break; |
+ |
+ case SDO_625_INACT_OPEN_SUBTITLES: |
+ temp_reg |= SDO_WSS625_INACT_OPEN_SUBTITLES; |
+ break; |
+ |
+ case SDO_625_OUTACT_OPEN_SUBTITLES: |
+ temp_reg |= SDO_WSS625_OUTACT_OPEN_SUBTITLES; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid open_subtitles parameter(%d)\n\r", |
+ open_subtitles); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ switch (camera_film) { |
+ |
+ case SDO_625_CAMERA: |
+ temp_reg |= SDO_WSS625_CAMERA; |
+ break; |
+ |
+ case SDO_625_FILM: |
+ temp_reg |= SDO_WSS625_FILM; |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid camera_film parameter(%d)\n\r", |
+ camera_film); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ switch (color_encoding) { |
+ |
+ case SDO_625_NORMAL_PAL: |
+ temp_reg |= SDO_WSS625_NORMAL_PAL; |
+ break; |
+ |
+ case SDO_625_MOTION_ADAPTIVE_COLORPLUS: |
+ temp_reg |= SDO_WSS625_MOTION_ADAPTIVE_COLORPLUS; |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid color_encoding parameter(%d)\n\r", |
+ color_encoding); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ if (helper_signal) |
+ temp_reg |= SDO_WSS625_HELPER_SIG; |
+ else |
+ temp_reg |= SDO_WSS625_HELPER_NO_SIG; |
+ |
+ switch (display_ratio) { |
+ |
+ case SDO_625_4_3_FULL_576: |
+ temp_reg |= SDO_WSS625_4_3_FULL_576; |
+ break; |
+ |
+ case SDO_625_14_9_LETTERBOX_CENTER_504: |
+ temp_reg |= SDO_WSS625_14_9_LETTERBOX_CENTER_504; |
+ break; |
+ |
+ case SDO_625_14_9_LETTERBOX_TOP_504: |
+ temp_reg |= SDO_WSS625_14_9_LETTERBOX_TOP_504; |
+ break; |
+ |
+ case SDO_625_16_9_LETTERBOX_CENTER_430: |
+ temp_reg |= SDO_WSS625_16_9_LETTERBOX_CENTER_430; |
+ break; |
+ |
+ case SDO_625_16_9_LETTERBOX_TOP_430: |
+ temp_reg |= SDO_WSS625_16_9_LETTERBOX_TOP_430; |
+ break; |
+ |
+ case SDO_625_16_9_LETTERBOX_CENTER: |
+ temp_reg |= SDO_WSS625_16_9_LETTERBOX_CENTER; |
+ break; |
+ |
+ case SDO_625_14_9_FULL_CENTER_576: |
+ temp_reg |= SDO_WSS625_14_9_FULL_CENTER_576; |
+ break; |
+ |
+ case SDO_625_16_9_ANAMORPIC_576: |
+ temp_reg |= SDO_WSS625_16_9_ANAMORPIC_576; |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid display_ratio parameter(%d)\n\r", |
+ display_ratio); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ writel(temp_reg, sdout_base + S5P_SDO_WSS625); |
+ |
+ SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_WSS625)); |
+ |
+ return SDOUT_NO_ERROR; |
+} |
+ |
+enum s5p_tv_sd_err tv_sdout_init_cgmsa525_data( |
+ enum s5p_sd_525_copy_permit copy_permit, |
+ enum s5p_sd_525_mv_psp mv_psp, |
+ enum s5p_sd_525_copy_info copy_info, |
+ bool analog_on, |
+ enum s5p_sd_525_aspect_ratio display_ratio) |
+{ |
+ u32 temp_reg = 0; |
+ |
+ SDPRINTK("%d,%d,%d,%d)\n\r", copy_permit, mv_psp, |
+ copy_info, display_ratio); |
+ |
+ switch (copy_permit) { |
+ |
+ case SDO_525_COPY_PERMIT: |
+ temp_reg = SDO_WORD2_CGMS525_COPY_PERMIT; |
+ break; |
+ |
+ case SDO_525_ONECOPY_PERMIT: |
+ temp_reg = SDO_WORD2_CGMS525_ONECOPY_PERMIT; |
+ break; |
+ |
+ case SDO_525_NOCOPY_PERMIT: |
+ temp_reg = SDO_WORD2_CGMS525_NOCOPY_PERMIT; |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid copy_permit parameter(%d)\n\r", copy_permit); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ switch (mv_psp) { |
+ |
+ case SDO_525_MV_PSP_OFF: |
+ temp_reg |= SDO_WORD2_CGMS525_MV_PSP_OFF; |
+ break; |
+ |
+ case SDO_525_MV_PSP_ON_2LINE_BURST: |
+ temp_reg |= SDO_WORD2_CGMS525_MV_PSP_ON_2LINE_BURST; |
+ break; |
+ |
+ case SDO_525_MV_PSP_ON_BURST_OFF: |
+ temp_reg |= SDO_WORD2_CGMS525_MV_PSP_ON_BURST_OFF; |
+ break; |
+ |
+ case SDO_525_MV_PSP_ON_4LINE_BURST: |
+ temp_reg |= SDO_WORD2_CGMS525_MV_PSP_ON_4LINE_BURST; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid mv_psp parameter(%d)\n\r", mv_psp); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ switch (copy_info) { |
+ |
+ case SDO_525_COPY_INFO: |
+ temp_reg |= SDO_WORD1_CGMS525_COPY_INFO; |
+ break; |
+ |
+ case SDO_525_DEFAULT: |
+ temp_reg |= SDO_WORD1_CGMS525_DEFAULT; |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid copy_info parameter(%d)\n\r", copy_info); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ if (analog_on) |
+ temp_reg |= SDO_WORD2_CGMS525_ANALOG_ON; |
+ else |
+ temp_reg |= SDO_WORD2_CGMS525_ANALOG_OFF; |
+ |
+ switch (display_ratio) { |
+ |
+ case SDO_525_COPY_PERMIT: |
+ temp_reg |= SDO_WORD0_CGMS525_4_3_NORMAL; |
+ break; |
+ |
+ case SDO_525_ONECOPY_PERMIT: |
+ temp_reg |= SDO_WORD0_CGMS525_16_9_ANAMORPIC; |
+ break; |
+ |
+ case SDO_525_NOCOPY_PERMIT: |
+ temp_reg |= SDO_WORD0_CGMS525_4_3_LETTERBOX; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid display_ratio parameter(%d)\n\r", |
+ display_ratio); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ writel(temp_reg | |
+ SDO_CRC_CGMS525(tv_sdout_init_wss_cgms_crc(temp_reg)), |
+ sdout_base + S5P_SDO_CGMS525); |
+ |
+ SDPRINTK(" 0x%08x)\n\r", readl(sdout_base + S5P_SDO_CGMS525)); |
+ |
+ return SDOUT_NO_ERROR; |
+} |
+ |
+enum s5p_tv_sd_err tv_sdout_init_cgmsa625_data(bool surround_sound, |
+ bool copyright, |
+ bool copy_protection, |
+ bool text_subtitles, |
+ enum s5p_sd_625_subtitles open_subtitles, |
+ enum s5p_sd_625_camera_film camera_film, |
+ enum s5p_sd_625_color_encoding color_encoding, |
+ bool helper_signal, |
+ enum s5p_sd_625_aspect_ratio display_ratio) |
+{ |
+ u32 temp_reg = 0; |
+ |
+ SDPRINTK("%d,%d,%d,%d,%d,%d,%d,%d,%d)\n\r", surround_sound, |
+ copyright, copy_protection, |
+ text_subtitles, open_subtitles, camera_film, |
+ color_encoding, helper_signal, display_ratio); |
+ |
+ if (surround_sound) |
+ temp_reg = SDO_CGMS625_SURROUND_SOUND_ENABLE; |
+ else |
+ temp_reg = SDO_CGMS625_SURROUND_SOUND_DISABLE; |
+ |
+ if (copyright) |
+ temp_reg |= SDO_CGMS625_COPYRIGHT; |
+ else |
+ temp_reg |= SDO_CGMS625_NO_COPYRIGHT; |
+ |
+ if (copy_protection) |
+ temp_reg |= SDO_CGMS625_COPY_RESTRICTED; |
+ else |
+ temp_reg |= SDO_CGMS625_COPY_NOT_RESTRICTED; |
+ |
+ if (text_subtitles) |
+ temp_reg |= SDO_CGMS625_TELETEXT_SUBTITLES; |
+ else |
+ temp_reg |= SDO_CGMS625_TELETEXT_NO_SUBTITLES; |
+ |
+ switch (open_subtitles) { |
+ |
+ case SDO_625_NO_OPEN_SUBTITLES: |
+ temp_reg |= SDO_CGMS625_NO_OPEN_SUBTITLES; |
+ break; |
+ |
+ case SDO_625_INACT_OPEN_SUBTITLES: |
+ temp_reg |= SDO_CGMS625_INACT_OPEN_SUBTITLES; |
+ break; |
+ |
+ case SDO_625_OUTACT_OPEN_SUBTITLES: |
+ temp_reg |= SDO_CGMS625_OUTACT_OPEN_SUBTITLES; |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid open_subtitles parameter(%d)\n\r", |
+ open_subtitles); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ switch (camera_film) { |
+ |
+ case SDO_625_CAMERA: |
+ temp_reg |= SDO_CGMS625_CAMERA; |
+ break; |
+ |
+ case SDO_625_FILM: |
+ temp_reg |= SDO_CGMS625_FILM; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid camera_film parameter(%d)\n\r", |
+ camera_film); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ switch (color_encoding) { |
+ |
+ case SDO_625_NORMAL_PAL: |
+ temp_reg |= SDO_CGMS625_NORMAL_PAL; |
+ break; |
+ |
+ case SDO_625_MOTION_ADAPTIVE_COLORPLUS: |
+ temp_reg |= SDO_CGMS625_MOTION_ADAPTIVE_COLORPLUS; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid color_encoding parameter(%d)\n\r", |
+ color_encoding); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ if (helper_signal) |
+ temp_reg |= SDO_CGMS625_HELPER_SIG; |
+ else |
+ temp_reg |= SDO_CGMS625_HELPER_NO_SIG; |
+ |
+ |
+ switch (display_ratio) { |
+ |
+ case SDO_625_4_3_FULL_576: |
+ temp_reg |= SDO_CGMS625_4_3_FULL_576; |
+ break; |
+ |
+ case SDO_625_14_9_LETTERBOX_CENTER_504: |
+ temp_reg |= SDO_CGMS625_14_9_LETTERBOX_CENTER_504; |
+ break; |
+ |
+ case SDO_625_14_9_LETTERBOX_TOP_504: |
+ temp_reg |= SDO_CGMS625_14_9_LETTERBOX_TOP_504; |
+ break; |
+ |
+ case SDO_625_16_9_LETTERBOX_CENTER_430: |
+ temp_reg |= SDO_CGMS625_16_9_LETTERBOX_CENTER_430; |
+ break; |
+ |
+ case SDO_625_16_9_LETTERBOX_TOP_430: |
+ temp_reg |= SDO_CGMS625_16_9_LETTERBOX_TOP_430; |
+ break; |
+ |
+ case SDO_625_16_9_LETTERBOX_CENTER: |
+ temp_reg |= SDO_CGMS625_16_9_LETTERBOX_CENTER; |
+ break; |
+ |
+ case SDO_625_14_9_FULL_CENTER_576: |
+ temp_reg |= SDO_CGMS625_14_9_FULL_CENTER_576; |
+ break; |
+ |
+ case SDO_625_16_9_ANAMORPIC_576: |
+ temp_reg |= SDO_CGMS625_16_9_ANAMORPIC_576; |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid display_ratio parameter(%d)\n\r", |
+ display_ratio); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ writel(temp_reg, sdout_base + S5P_SDO_CGMS625); |
+ |
+ SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_CGMS625)); |
+ |
+ return SDOUT_NO_ERROR; |
+} |
+ |
+ |
+static enum s5p_tv_sd_err tv_sdout_init_antialias_filter_coeff_default( |
+ enum s5p_sd_level composite_level, |
+ enum s5p_sd_vsync_ratio composite_ratio, |
+ enum s5p_tv_o_mode out_mode) |
+{ |
+ SDPRINTK("%d,%d,%d\n\r", composite_level, composite_ratio, out_mode); |
+ |
+ switch (composite_level) { |
+ |
+ case S5P_TV_SD_LEVEL_0IRE: |
+ |
+ switch (composite_ratio) { |
+ |
+ case SDOUT_VTOS_RATIO_10_4: |
+ |
+ switch (out_mode) { |
+ |
+ case TVOUT_OUTPUT_COMPOSITE: |
+ case TVOUT_OUTPUT_SVIDEO: |
+ writel(0x00000000 , sdout_base + S5P_SDO_Y3); |
+ writel(0x00000000 , sdout_base + S5P_SDO_Y4); |
+ writel(0x00000000 , sdout_base + S5P_SDO_Y5); |
+ writel(0x00000000 , sdout_base + S5P_SDO_Y6); |
+ writel(0x00000000 , sdout_base + S5P_SDO_Y7); |
+ writel(0x00000000 , sdout_base + S5P_SDO_Y8); |
+ writel(0x00000000 , sdout_base + S5P_SDO_Y9); |
+ writel(0x00000000 , sdout_base + S5P_SDO_Y10); |
+ writel(0x0000029a , sdout_base + S5P_SDO_Y11); |
+ writel(0x00000000 , sdout_base + S5P_SDO_CB0); |
+ writel(0x00000000 , sdout_base + S5P_SDO_CB1); |
+ writel(0x00000000 , sdout_base + S5P_SDO_CB2); |
+ writel(0x00000000 , sdout_base + S5P_SDO_CB3); |
+ writel(0x00000000 , sdout_base + S5P_SDO_CB4); |
+ writel(0x00000001 , sdout_base + S5P_SDO_CB5); |
+ writel(0x00000007 , sdout_base + S5P_SDO_CB6); |
+ writel(0x00000015 , sdout_base + S5P_SDO_CB7); |
+ writel(0x0000002b , sdout_base + S5P_SDO_CB8); |
+ writel(0x00000045 , sdout_base + S5P_SDO_CB9); |
+ writel(0x00000059 , sdout_base + S5P_SDO_CB10); |
+ writel(0x00000061 , sdout_base + S5P_SDO_CB11); |
+ writel(0x00000000 , sdout_base + S5P_SDO_CR1); |
+ writel(0x00000000 , sdout_base + S5P_SDO_CR2); |
+ writel(0x00000000 , sdout_base + S5P_SDO_CR3); |
+ writel(0x00000000 , sdout_base + S5P_SDO_CR4); |
+ writel(0x00000002 , sdout_base + S5P_SDO_CR5); |
+ writel(0x0000000a , sdout_base + S5P_SDO_CR6); |
+ writel(0x0000001e , sdout_base + S5P_SDO_CR7); |
+ writel(0x0000003d , sdout_base + S5P_SDO_CR8); |
+ writel(0x00000061 , sdout_base + S5P_SDO_CR9); |
+ writel(0x0000007a , sdout_base + S5P_SDO_CR10); |
+ writel(0x0000008f , sdout_base + S5P_SDO_CR11); |
+ break; |
+ |
+ case TVOUT_OUTPUT_COMPONENT_YPBPR_INERLACED: |
+ case TVOUT_OUTPUT_COMPONENT_YPBPR_PROGRESSIVE: |
+ case TVOUT_OUTPUT_COMPONENT_RGB_PROGRESSIVE: |
+ writel(0x00000000, sdout_base + S5P_SDO_Y0); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y1); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y2); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y3); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y4); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y5); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y6); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y7); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y8); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y9); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y10); |
+ writel(0x0000029a, sdout_base + S5P_SDO_Y11); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB0); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB1); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB2); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB3); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB4); |
+ writel(0x00000001, sdout_base + S5P_SDO_CB5); |
+ writel(0x00000007, sdout_base + S5P_SDO_CB6); |
+ writel(0x00000015, sdout_base + S5P_SDO_CB7); |
+ writel(0x0000002b, sdout_base + S5P_SDO_CB8); |
+ writel(0x00000045, sdout_base + S5P_SDO_CB9); |
+ writel(0x00000059, sdout_base + S5P_SDO_CB10); |
+ writel(0x00000061, sdout_base + S5P_SDO_CB11); |
+ writel(0x00000000, sdout_base + S5P_SDO_CR1); |
+ writel(0x00000000, sdout_base + S5P_SDO_CR2); |
+ writel(0x00000000, sdout_base + S5P_SDO_CR3); |
+ writel(0x00000000, sdout_base + S5P_SDO_CR4); |
+ writel(0x00000002, sdout_base + S5P_SDO_CR5); |
+ writel(0x0000000a, sdout_base + S5P_SDO_CR6); |
+ writel(0x0000001e, sdout_base + S5P_SDO_CR7); |
+ writel(0x0000003d, sdout_base + S5P_SDO_CR8); |
+ writel(0x00000061, sdout_base + S5P_SDO_CR9); |
+ writel(0x0000007a, sdout_base + S5P_SDO_CR10); |
+ writel(0x0000008f, sdout_base + S5P_SDO_CR11); |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid out_mode parameter(%d)\n\r", |
+ out_mode); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ break; |
+ |
+ case SDOUT_VTOS_RATIO_7_3: |
+ writel(0x00000000, sdout_base + S5P_SDO_Y0); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y1); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y2); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y3); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y4); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y5); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y6); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y7); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y8); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y9); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y10); |
+ writel(0x00000281, sdout_base + S5P_SDO_Y11); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB0); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB1); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB2); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB3); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB4); |
+ writel(0x00000001, sdout_base + S5P_SDO_CB5); |
+ writel(0x00000007, sdout_base + S5P_SDO_CB6); |
+ writel(0x00000015, sdout_base + S5P_SDO_CB7); |
+ writel(0x0000002a, sdout_base + S5P_SDO_CB8); |
+ writel(0x00000044, sdout_base + S5P_SDO_CB9); |
+ writel(0x00000057, sdout_base + S5P_SDO_CB10); |
+ writel(0x0000005f, sdout_base + S5P_SDO_CB11); |
+ writel(0x00000000, sdout_base + S5P_SDO_CR1); |
+ writel(0x00000000, sdout_base + S5P_SDO_CR2); |
+ writel(0x00000000, sdout_base + S5P_SDO_CR3); |
+ writel(0x00000000, sdout_base + S5P_SDO_CR4); |
+ writel(0x00000002, sdout_base + S5P_SDO_CR5); |
+ writel(0x0000000a, sdout_base + S5P_SDO_CR6); |
+ writel(0x0000001d, sdout_base + S5P_SDO_CR7); |
+ writel(0x0000003c, sdout_base + S5P_SDO_CR8); |
+ writel(0x0000005f, sdout_base + S5P_SDO_CR9); |
+ writel(0x0000007b, sdout_base + S5P_SDO_CR10); |
+ writel(0x00000086, sdout_base + S5P_SDO_CR11); |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid composite_ratio parameter(%d)\n\r", |
+ composite_ratio); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ break; |
+ |
+ case S5P_TV_SD_LEVEL_75IRE: |
+ |
+ switch (composite_ratio) { |
+ |
+ case SDOUT_VTOS_RATIO_10_4: |
+ writel(0x00000000, sdout_base + S5P_SDO_Y0); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y1); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y2); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y3); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y4); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y5); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y6); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y7); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y8); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y9); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y10); |
+ writel(0x0000025d, sdout_base + S5P_SDO_Y11); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB0); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB1); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB2); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB3); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB4); |
+ writel(0x00000001, sdout_base + S5P_SDO_CB5); |
+ writel(0x00000007, sdout_base + S5P_SDO_CB6); |
+ writel(0x00000014, sdout_base + S5P_SDO_CB7); |
+ writel(0x00000028, sdout_base + S5P_SDO_CB8); |
+ writel(0x0000003f, sdout_base + S5P_SDO_CB9); |
+ writel(0x00000052, sdout_base + S5P_SDO_CB10); |
+ writel(0x0000005a, sdout_base + S5P_SDO_CB11); |
+ writel(0x00000000, sdout_base + S5P_SDO_CR1); |
+ writel(0x00000000, sdout_base + S5P_SDO_CR2); |
+ writel(0x00000000, sdout_base + S5P_SDO_CR3); |
+ writel(0x00000000, sdout_base + S5P_SDO_CR4); |
+ writel(0x00000001, sdout_base + S5P_SDO_CR5); |
+ writel(0x00000009, sdout_base + S5P_SDO_CR6); |
+ writel(0x0000001c, sdout_base + S5P_SDO_CR7); |
+ writel(0x00000039, sdout_base + S5P_SDO_CR8); |
+ writel(0x0000005a, sdout_base + S5P_SDO_CR9); |
+ writel(0x00000074, sdout_base + S5P_SDO_CR10); |
+ writel(0x0000007e, sdout_base + S5P_SDO_CR11); |
+ break; |
+ |
+ case SDOUT_VTOS_RATIO_7_3: |
+ writel(0x00000000, sdout_base + S5P_SDO_Y0); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y1); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y2); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y3); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y4); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y5); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y6); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y7); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y8); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y9); |
+ writel(0x00000000, sdout_base + S5P_SDO_Y10); |
+ writel(0x00000251, sdout_base + S5P_SDO_Y11); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB0); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB1); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB2); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB3); |
+ writel(0x00000000, sdout_base + S5P_SDO_CB4); |
+ writel(0x00000001, sdout_base + S5P_SDO_CB5); |
+ writel(0x00000006, sdout_base + S5P_SDO_CB6); |
+ writel(0x00000013, sdout_base + S5P_SDO_CB7); |
+ writel(0x00000028, sdout_base + S5P_SDO_CB8); |
+ writel(0x0000003f, sdout_base + S5P_SDO_CB9); |
+ writel(0x00000051, sdout_base + S5P_SDO_CB10); |
+ writel(0x00000056, sdout_base + S5P_SDO_CB11); |
+ writel(0x00000000, sdout_base + S5P_SDO_CR1); |
+ writel(0x00000000, sdout_base + S5P_SDO_CR2); |
+ writel(0x00000000, sdout_base + S5P_SDO_CR3); |
+ writel(0x00000000, sdout_base + S5P_SDO_CR4); |
+ writel(0x00000002, sdout_base + S5P_SDO_CR5); |
+ writel(0x00000005, sdout_base + S5P_SDO_CR6); |
+ writel(0x00000018, sdout_base + S5P_SDO_CR7); |
+ writel(0x00000037, sdout_base + S5P_SDO_CR8); |
+ writel(0x0000005A, sdout_base + S5P_SDO_CR9); |
+ writel(0x00000076, sdout_base + S5P_SDO_CR10); |
+ writel(0x0000007e, sdout_base + S5P_SDO_CR11); |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid composite_ratio parameter(%d)\n\r", |
+ composite_ratio); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid composite_level parameter(%d)\n\r", |
+ composite_level); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ SDPRINTK("()\n\r"); |
+ |
+ return SDOUT_NO_ERROR; |
+ |
+} |
+ |
+ |
+static enum s5p_tv_sd_err tv_sdout_init_oversampling_filter_coeff_default( |
+ enum s5p_tv_o_mode out_mode) |
+{ |
+ SDPRINTK("%d\n\r", out_mode); |
+ |
+ switch (out_mode) { |
+ |
+ case TVOUT_OUTPUT_COMPOSITE: |
+ case TVOUT_OUTPUT_SVIDEO: |
+ case TVOUT_OUTPUT_COMPONENT_YPBPR_INERLACED: |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid out_mode parameter(%d)\n\r", out_mode); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ return SDOUT_NO_ERROR; |
+} |
+ |
+/* |
+* initialization |
+* - iniization functions are only called under stopping sdout |
+*/ |
+enum s5p_tv_sd_err tv_sdout_init_display_mode(enum s5p_tv_disp_mode disp_mode, |
+ enum s5p_tv_o_mode out_mode, |
+ enum s5p_sd_order order) |
+{ |
+ u32 temp_reg = 0; |
+ |
+ SDPRINTK(" %d,%d,%d\n\r", disp_mode, out_mode, order); |
+ |
+ switch (disp_mode) { |
+ |
+ case TVOUT_NTSC_M: |
+ temp_reg |= SDO_NTSC_M; |
+ tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE, |
+ SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_75IRE, |
+ SDOUT_VTOS_RATIO_10_4); |
+ |
+ tv_sdout_init_antialias_filter_coeff_default( |
+ S5P_TV_SD_LEVEL_75IRE, |
+ SDOUT_VTOS_RATIO_10_4, |
+ out_mode); |
+ break; |
+ |
+ case TVOUT_PAL_BDGHI: |
+ temp_reg |= SDO_PAL_BGHID; |
+ tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE, |
+ SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_0IRE, |
+ SDOUT_VTOS_RATIO_7_3); |
+ |
+ tv_sdout_init_antialias_filter_coeff_default( |
+ S5P_TV_SD_LEVEL_0IRE, |
+ SDOUT_VTOS_RATIO_7_3, |
+ out_mode); |
+ break; |
+ |
+ case TVOUT_PAL_M: |
+ temp_reg |= SDO_PAL_M; |
+ tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE, |
+ SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_0IRE, |
+ SDOUT_VTOS_RATIO_7_3); |
+ |
+ tv_sdout_init_antialias_filter_coeff_default( |
+ S5P_TV_SD_LEVEL_0IRE, |
+ SDOUT_VTOS_RATIO_7_3, |
+ out_mode); |
+ break; |
+ |
+ case TVOUT_PAL_N: |
+ temp_reg |= SDO_PAL_N; |
+ tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE, |
+ SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_0IRE, |
+ SDOUT_VTOS_RATIO_7_3); |
+ |
+ tv_sdout_init_antialias_filter_coeff_default( |
+ S5P_TV_SD_LEVEL_75IRE, |
+ SDOUT_VTOS_RATIO_10_4, |
+ out_mode); |
+ break; |
+ |
+ case TVOUT_PAL_NC: |
+ temp_reg |= SDO_PAL_NC; |
+ tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE, |
+ SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_0IRE, |
+ SDOUT_VTOS_RATIO_7_3); |
+ |
+ tv_sdout_init_antialias_filter_coeff_default( |
+ S5P_TV_SD_LEVEL_0IRE, |
+ SDOUT_VTOS_RATIO_7_3, |
+ out_mode); |
+ break; |
+ |
+ case TVOUT_PAL_60: |
+ temp_reg |= SDO_PAL_60; |
+ tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE, |
+ SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_0IRE, |
+ SDOUT_VTOS_RATIO_7_3); |
+ tv_sdout_init_antialias_filter_coeff_default( |
+ S5P_TV_SD_LEVEL_0IRE, |
+ SDOUT_VTOS_RATIO_7_3, |
+ out_mode); |
+ break; |
+ |
+ case TVOUT_NTSC_443: |
+ temp_reg |= SDO_NTSC_443; |
+ tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE, |
+ SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_75IRE, |
+ SDOUT_VTOS_RATIO_10_4); |
+ tv_sdout_init_antialias_filter_coeff_default( |
+ S5P_TV_SD_LEVEL_75IRE, |
+ SDOUT_VTOS_RATIO_10_4, |
+ out_mode); |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid disp_mode parameter(%d)\n\r", disp_mode); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ switch (out_mode) { |
+ |
+ case TVOUT_OUTPUT_COMPOSITE: |
+ case TVOUT_OUTPUT_SVIDEO: |
+ temp_reg |= SDO_COMPOSITE | SDO_INTERLACED; |
+ |
+ switch (order) { |
+ |
+ case S5P_TV_SD_O_ORDER_COMPOSITE_CVBS_Y_C: |
+ temp_reg |= SDO_DAC2_CVBS | SDO_DAC1_Y | SDO_DAC0_C; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPOSITE_CVBS_C_Y: |
+ temp_reg |= SDO_DAC2_CVBS | SDO_DAC1_C | SDO_DAC0_Y; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPOSITE_Y_C_CVBS: |
+ temp_reg |= SDO_DAC2_Y | SDO_DAC1_C | SDO_DAC0_CVBS; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPOSITE_Y_CVBS_C: |
+ temp_reg |= SDO_DAC2_Y | SDO_DAC1_CVBS | SDO_DAC0_C; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPOSITE_C_CVBS_Y: |
+ temp_reg |= SDO_DAC2_C | SDO_DAC1_CVBS | SDO_DAC0_Y; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPOSITE_C_Y_CVBS: |
+ temp_reg |= SDO_DAC2_C | SDO_DAC1_Y | SDO_DAC0_CVBS; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid order parameter(%d)\n\r", order); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ break; |
+ } |
+ |
+ break; |
+ |
+ case TVOUT_OUTPUT_COMPONENT_YPBPR_INERLACED: |
+ temp_reg |= SDO_COMPONENT | SDO_YPBPR | SDO_INTERLACED; |
+ |
+ switch (order) { |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_RGB_PRYPB: |
+ temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_Y_G | |
+ SDO_DAC0_PB_B; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_RBG_PRPBY: |
+ temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_PB_B | |
+ SDO_DAC0_Y_G; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_BGR_PBYPR: |
+ temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_Y_G | |
+ SDO_DAC0_PR_R; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_BRG_PBPRY: |
+ temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_PR_R | |
+ SDO_DAC0_Y_G; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_GRB_YPRPB: |
+ temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PR_R | |
+ SDO_DAC0_PB_B; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_GBR_YPBPR: |
+ temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PB_B | |
+ SDO_DAC0_PR_R; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid order parameter(%d)\n\r", order); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ break; |
+ } |
+ |
+ break; |
+ |
+ case TVOUT_OUTPUT_COMPONENT_YPBPR_PROGRESSIVE: |
+ temp_reg |= SDO_COMPONENT | SDO_YPBPR | SDO_PROGRESSIVE; |
+ |
+ switch (order) { |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_RGB_PRYPB: |
+ temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_Y_G | |
+ SDO_DAC0_PB_B; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_RBG_PRPBY: |
+ temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_PB_B | |
+ SDO_DAC0_Y_G; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_BGR_PBYPR: |
+ temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_Y_G | |
+ SDO_DAC0_PR_R; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_BRG_PBPRY: |
+ temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_PR_R | |
+ SDO_DAC0_Y_G; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_GRB_YPRPB: |
+ temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PR_R | |
+ SDO_DAC0_PB_B; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_GBR_YPBPR: |
+ temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PB_B | |
+ SDO_DAC0_PR_R; |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid order parameter(%d)\n\r", order); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ break; |
+ |
+ case TVOUT_OUTPUT_COMPONENT_RGB_PROGRESSIVE: |
+ temp_reg |= SDO_COMPONENT | SDO_RGB | SDO_PROGRESSIVE; |
+ |
+ switch (order) { |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_RGB_PRYPB: |
+ temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_Y_G | |
+ SDO_DAC0_PB_B; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_RBG_PRPBY: |
+ temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_PB_B | |
+ SDO_DAC0_Y_G; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_BGR_PBYPR: |
+ temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_Y_G | |
+ SDO_DAC0_PR_R; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_BRG_PBPRY: |
+ temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_PR_R | |
+ SDO_DAC0_Y_G; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_GRB_YPRPB: |
+ temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PR_R | |
+ SDO_DAC0_PB_B; |
+ break; |
+ |
+ case S5P_TV_SD_O_ORDER_COMPONENT_GBR_YPBPR: |
+ temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PB_B | |
+ SDO_DAC0_PR_R; |
+ break; |
+ |
+ default: |
+ SDPRINTK("invalid order parameter(%d)\n\r", order); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ break; |
+ |
+ default: |
+ SDPRINTK(" invalid out_mode parameter(%d)\n\r", out_mode); |
+ return S5P_TV_SD_ERR_INVALID_PARAM; |
+ } |
+ |
+ tv_sdout_init_oversampling_filter_coeff_default(out_mode); |
+ |
+ writel(temp_reg, sdout_base + S5P_SDO_CONFIG); |
+ |
+ SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_CONFIG)); |
+ |
+ return SDOUT_NO_ERROR; |
+} |
+ |
+/* |
+* start - start functions are only called under stopping SDOUT |
+*/ |
+void tv_sdout_start(void) |
+{ |
+ SDPRINTK("()\n\r"); |
+ |
+ writel(SDO_TVOUT_CLOCK_ON, sdout_base + S5P_SDO_CLKCON); |
+ |
+ SDPRINTK("0x%x\n\r", readl(sdout_base + S5P_SDO_CLKCON)); |
+} |
+ |
+/* |
+/ stop - stop functions are only called under running SDOUT |
+*/ |
+void tv_sdout_stop(void) |
+{ |
+ SDPRINTK("()\n\r"); |
+ |
+ mdelay(100); |
+ |
+ writel(SDO_TVOUT_CLOCK_OFF, sdout_base + S5P_SDO_CLKCON); |
+ |
+ SDPRINTK(" 0x%x)\n\r", readl(sdout_base + S5P_SDO_CLKCON)); |
+} |
+ |
+/* |
+* reset |
+* - reset function |
+*/ |
+void tv_sdout_sw_reset(bool active) |
+{ |
+ SDPRINTK("%d\n\r", active); |
+ |
+ if (active) |
+ writel(readl(sdout_base + S5P_SDO_CLKCON) | |
+ SDO_TVOUT_SW_RESET, |
+ sdout_base + S5P_SDO_CLKCON); |
+ else |
+ writel(readl(sdout_base + S5P_SDO_CLKCON) & |
+ ~SDO_TVOUT_SW_RESET, |
+ sdout_base + S5P_SDO_CLKCON); |
+ |
+ SDPRINTK(" 0x%x\n\r", readl(sdout_base + S5P_SDO_CLKCON)); |
+} |
+ |
+ |
+void tv_sdout_set_interrupt_enable(bool vsync_intr_en) |
+{ |
+ SDPRINTK("%d)\n\r", vsync_intr_en); |
+ |
+ if (vsync_intr_en) |
+ writel(readl(sdout_base + S5P_SDO_IRQMASK) & |
+ ~SDO_VSYNC_IRQ_DISABLE, |
+ sdout_base + S5P_SDO_IRQMASK); |
+ else |
+ writel(readl(sdout_base + S5P_SDO_IRQMASK) | |
+ SDO_VSYNC_IRQ_DISABLE, |
+ sdout_base + S5P_SDO_IRQMASK); |
+ |
+ SDPRINTK("0x%x)\n\r", readl(sdout_base + S5P_SDO_IRQMASK)); |
+} |
+ |
+void tv_sdout_clear_interrupt_pending(void) |
+{ |
+ SDPRINTK("0x%x\n\r", readl(sdout_base + S5P_SDO_IRQ)); |
+ |
+ writel(readl(sdout_base + S5P_SDO_IRQ) | SDO_VSYNC_IRQ_PEND, |
+ sdout_base + S5P_SDO_IRQ); |
+ |
+ SDPRINTK("0x%x\n\r", readl(sdout_base + S5P_SDO_IRQ)); |
+} |
+ |
+bool tv_sdout_get_interrupt_pending(void) |
+{ |
+ SDPRINTK(" 0x%x\n\r", readl(sdout_base + S5P_SDO_IRQ)); |
+ |
+ return (readl(sdout_base + S5P_SDO_IRQ) | SDO_VSYNC_IRQ_PEND) ? |
+ 1 : 0; |
+} |
+ |
+int __init tv_sdout_probe(struct platform_device *pdev, u32 res_num) |
+{ |
+ struct resource *res; |
+ size_t size; |
+ |
+ res = platform_get_resource(pdev, IORESOURCE_MEM, res_num); |
+ |
+ if (res == NULL) { |
+ dev_err(&pdev->dev, |
+ "failed to get memory region resource\n"); |
+ goto error; |
+ } |
+ |
+ size = (res->end - res->start) + 1; |
+ |
+ sdout_mem = request_mem_region(res->start, size, pdev->name); |
+ |
+ if (sdout_mem == NULL) { |
+ dev_err(&pdev->dev, |
+ "failed to get memory region\n"); |
+ goto error; |
+ } |
+ |
+ sdout_base = ioremap(res->start, size); |
+ |
+ if (sdout_base == NULL) { |
+ dev_err(&pdev->dev, |
+ "failed to ioremap address region\n"); |
+ goto error; |
+ |
+ } |
+ |
+ return 0; |
+error: |
+ return -ENOENT; |
+ |
+} |
+ |
+int __init tv_sdout_release(struct platform_device *pdev) |
+{ |
+ iounmap(sdout_base); |
+ |
+ /* remove memory region */ |
+ if (sdout_mem != NULL) { |
+ if (release_resource(sdout_mem)) |
+ dev_err(&pdev->dev, |
+ "Can't remove tvout drv !!\n"); |
+ |
+ kfree(sdout_mem); |
+ |
+ sdout_mem = NULL; |
+ } |
+ |
+ return 0; |
+} |