Exemple #1
0
/*
* initialization
*  - iniization functions are only called under stopping sdout
*/
s5p_tv_sd_err __s5p_sdout_init_display_mode(s5p_tv_disp_mode disp_mode,
					  s5p_tv_o_mode out_mode,
					  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;
		__s5p_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);
		
		__s5p_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;
		__s5p_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);
		
		__s5p_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;
		__s5p_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);
		
		__s5p_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;
		__s5p_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);
		
		__s5p_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;
		__s5p_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);
		
		__s5p_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;
		__s5p_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);
		__s5p_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;
		__s5p_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);
		__s5p_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;
		break;
	}

	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;
		}

		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;
		}

		break;

	default:
		SDPRINTK(" invalid out_mode parameter(%d)\n\r", out_mode);
		return S5P_TV_SD_ERR_INVALID_PARAM;
		break;
	}

	__s5p_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;
}
bool _s5p_tv_if_init_sd_reg(void)
{
	u8 i = 0;
	s5p_tv_sd_err sderr = 0;
	s5p_tv_status *st = &s5ptv_status;
	s5p_tv_o_mode out_mode = st->tvout_param.out_mode;
	s5p_tv_disp_mode disp_mode = st->tvout_param.disp_mode;
	s5p_sd_order order = st->sdout_order;
	
	u32 delay = st->sdout_delay.delay_y;
	u32 off_v_start = st->sdout_delay.offset_video_start;
	u32 off_v_end = st->sdout_delay.offset_video_end;

	u32 g_bright = st->sdout_bri_hue_set.gain_brightness;
	u32 off_bright = st->sdout_bri_hue_set.offset_brightness;
	u32 g0_cb_h_sat = st->sdout_bri_hue_set.gain0_cb_hue_saturation;
	u32 g1_cb_h_sat = st->sdout_bri_hue_set.gain1_cb_hue_saturation;
	u32 g0_cr_h_sat = st->sdout_bri_hue_set.gain0_cr_hue_saturation;
	u32 g1_cr_h_sat = st->sdout_bri_hue_set.gain1_cr_hue_saturation;
	u32 off_cb_h_sat = st->sdout_bri_hue_set.offset_cb_hue_saturation;
	u32 off_cr_h_sat = st->sdout_bri_hue_set.offset_cr_hue_saturation;

	u32 max_rgb_cube = st->sdout_rgb_compen.max_rgb_cube;
	u32 min_rgb_cube = st->sdout_rgb_compen.min_rgb_cube;
	u32 y_l_m_c = st->sdout_cvbs_compen.y_lower_mid;
	u32 y_b_c = st->sdout_cvbs_compen.y_bottom;
	u32 y_t_c = st->sdout_cvbs_compen.y_top;
	u32 y_u_m_c = st->sdout_cvbs_compen.y_upper_mid;
	u32 rad_c = st->sdout_cvbs_compen.radius;
	u32 y_t_s = st->sdout_svideo_compen.y_top;
	u32 y_b_s = st->sdout_svideo_compen.y_bottom;
	u32 y_cylinder_s = st->sdout_svideo_compen.yc_cylinder;

	u32 back_525 = st->sdout_comp_porch.back_525;
	u32 front_525 = st->sdout_comp_porch.front_525;
	u32 back_625 = st->sdout_comp_porch.back_625;
	u32 front_625 = st->sdout_comp_porch.front_625;

	u32 display_cc = st->sdout_closed_capt.display_cc;
	u32 nondisplay_cc = st->sdout_closed_capt.nondisplay_cc;
	
	bool br_hue_sat_adj = st->sdout_bri_hue_set.bright_hue_sat_adj;
	bool wss_cvbs = st->sdout_vbi.wss_cvbs;
	bool wss_y_svideo = st->sdout_vbi.wss_y_svideo;
	bool cgmsa_rgb 	= st->sdout_vbi.cgmsa_rgb;
	bool wss_rgb = st->sdout_vbi.wss_rgb;
	bool cgmsa_y = st->sdout_vbi.cgmsa_y_pb_pr;
	bool wss_y = st->sdout_vbi.wss_y_pb_pr;
	bool phase_adj = st->sdout_color_sub_carrier_phase_adj;
	bool ypbpr_comp = st->sdout_y_pb_pr_comp;
	bool rgb_compen = st->sdout_rgb_compen.rgb_color_compensation;
	bool y_compen = st->sdout_svideo_compen.y_color_compensation;
	bool cvbs_compen = st->sdout_cvbs_compen.cvbs_color_compensation;
	
	bool w5_analog_on = st->sdout_wss_525.analog_on;	
	bool w6_surroun_f_sound = st->sdout_wss_625.surroun_f_sound;
	bool w6_copyright = st->sdout_wss_625.copyright;
	bool w6_copy_protection = st->sdout_wss_625.copy_protection;
	bool w6_text_subtitles = st->sdout_wss_625.text_subtitles;
	bool w6_helper_signal = st->sdout_wss_625.helper_signal;

	bool c5_analog_on = st->sdout_cgms_525.analog_on;	
	bool c6_surroun_f_sound = st->sdout_cgms_625.surroun_f_sound;
	bool c6_copyright = st->sdout_cgms_625.copyright;
	bool c6_copy_protection = st->sdout_cgms_625.copy_protection;
	bool c6_text_subtitles = st->sdout_cgms_625.text_subtitles;
	bool c6_helper_signal = st->sdout_cgms_625.helper_signal;

	s5p_sd_level cpn_lev = st->sdout_video_scale_cfg.component_level;
	s5p_sd_level cps_lev= st->sdout_video_scale_cfg.composite_level;	
	s5p_sd_vsync_ratio cpn_rat= st->sdout_video_scale_cfg.component_ratio;
	s5p_sd_vsync_ratio cps_rat= st->sdout_video_scale_cfg.composite_ratio;
	s5p_sd_closed_caption_type cap_cvbs = st->sdout_vbi.caption_cvbs;
	s5p_sd_closed_caption_type cap_y_svideo = st->sdout_vbi.caption_y_svideo;
	s5p_sd_closed_caption_type cap_rgb = st->sdout_vbi.caption_rgb;
	s5p_sd_closed_caption_type cap_y_pb_pr = st->sdout_vbi.caption_y_pb_pr;
	s5p_sd_sync_sig_pin sync_pin = st->sdout_sync_pin;
	s5p_sd_vesa_rgb_sync_type sync_type=st->sdout_rgb_sync.sync_type;
	s5p_tv_active_polarity vsync_active=st->sdout_rgb_sync.vsync_active;
	s5p_tv_active_polarity hsync_active=st->sdout_rgb_sync.hsync_active;
		
	s5p_sd_525_copy_permit w5_copy_permit = st->sdout_wss_525.copy_permit;
	s5p_sd_525_mv_psp w5_mv_psp = st->sdout_wss_525.mv_psp;
	s5p_sd_525_copy_info w5_copy_info = st->sdout_wss_525.copy_info;
	s5p_sd_525_aspect_ratio w5_display_ratio = st->sdout_wss_525.display_ratio;
	s5p_sd_625_subtitles w6_open_subtitles= st->sdout_wss_625.open_subtitles;
	s5p_sd_625_camera_film w6_camera_film = st->sdout_wss_625.camera_film;
	s5p_sd_625_color_encoding w6_color_encoding = st->sdout_wss_625.color_encoding;
	s5p_sd_625_aspect_ratio w6_display_ratio = st->sdout_wss_625.display_ratio;

	s5p_sd_525_copy_permit c5_copy_permit = st->sdout_cgms_525.copy_permit;
	s5p_sd_525_mv_psp c5_mv_psp = st->sdout_cgms_525.mv_psp;
	s5p_sd_525_copy_info c5_copy_info = st->sdout_cgms_525.copy_info;
	s5p_sd_525_aspect_ratio c5_display_ratio = st->sdout_cgms_525.display_ratio;
	s5p_sd_625_subtitles c6_open_subtitles= st->sdout_cgms_625.open_subtitles;
	s5p_sd_625_camera_film c6_camera_film = st->sdout_cgms_625.camera_film;
	s5p_sd_625_color_encoding c6_color_encoding = st->sdout_cgms_625.color_encoding;
	s5p_sd_625_aspect_ratio c6_display_ratio = st->sdout_cgms_625.display_ratio;

	__s5p_sdout_sw_reset(true);

	sderr = __s5p_sdout_init_display_mode(disp_mode,out_mode,order);

	if (sderr != SDOUT_NO_ERROR) {
		return false;
	}

	sderr = __s5p_sdout_init_video_scale_cfg(cpn_lev,cpn_rat,
						cps_lev,cps_rat);

	if (sderr != SDOUT_NO_ERROR) {
		return false;
	}

	sderr = __s5p_sdout_init_sync_signal_pin(sync_pin);

	if (sderr != SDOUT_NO_ERROR) {
		return false;
	}

	sderr = __s5p_sdout_init_vbi(wss_cvbs,cap_cvbs,wss_y_svideo,cap_y_svideo,
			cgmsa_rgb,wss_rgb,cap_rgb,cgmsa_y,wss_y,cap_y_pb_pr);

	if (sderr != SDOUT_NO_ERROR) {
		return false;
	}

	for(i = SDOUT_CHANNEL_0;i<=SDOUT_CHANNEL_2;i++){
		
		u32 offset = st->sdout_offset_gain[i].offset;
		u32 gain = st->sdout_offset_gain[i].gain;
		
		sderr = __s5p_sdout_init_offset_gain(i,offset,gain);

		if (sderr != SDOUT_NO_ERROR) 
			return false;
	}


	__s5p_sdout_init_delay(delay,off_v_start,off_v_end);

	__s5p_sdout_init_schlock(phase_adj);

	__s5p_sdout_init_color_compensaton_onoff(br_hue_sat_adj,ypbpr_comp,
					rgb_compen,y_compen,cvbs_compen);

	__s5p_sdout_init_brightness_hue_saturation(g_bright,off_bright,
					g0_cb_h_sat,g1_cb_h_sat,g0_cr_h_sat,
					g1_cr_h_sat,off_cb_h_sat,off_cr_h_sat);
	
	__s5p_sdout_init_rgb_color_compensation(max_rgb_cube,min_rgb_cube);

	__s5p_sdout_init_cvbs_color_compensation(y_l_m_c,y_b_c,y_t_c,
						y_u_m_c,rad_c);

	__s5p_sdout_init_svideo_color_compensation(y_t_s,y_b_s,y_cylinder_s);
	
	__s5p_sdout_init_component_porch(back_525,front_525,back_625,front_625);
	
	sderr = __s5p_sdout_init_vesa_rgb_sync(sync_type,vsync_active,hsync_active);

	if (sderr != SDOUT_NO_ERROR) {
		return false;
	}

	for(i = SDOUT_CHANNEL_0;i<=SDOUT_CHANNEL_2;i++) {
		s5p_sd_channel_sel channel = st->sdout_xtalk_cc[i].channel;
		u32 coeff1 = st->sdout_xtalk_cc[i].coeff1;
		u32 coeff2 = st->sdout_xtalk_cc[i].coeff2;
		
		sderr = __s5p_sdout_init_ch_xtalk_cancel_coef(channel,coeff2,coeff1);

		if (sderr != SDOUT_NO_ERROR)
			return false;
	}

	__s5p_sdout_init_closed_caption(display_cc,nondisplay_cc);

	sderr = __s5p_sdout_init_wss525_data(w5_copy_permit,w5_mv_psp,
				w5_copy_info,w5_analog_on,w5_display_ratio);

	if (sderr != SDOUT_NO_ERROR) {
		return false;
	}

	sderr = __s5p_sdout_init_wss625_data(w6_surroun_f_sound,w6_copyright,
					w6_copy_protection,w6_text_subtitles,
					w6_open_subtitles,w6_camera_film,
					w6_color_encoding,w6_helper_signal,
					w6_display_ratio);

	if (sderr != SDOUT_NO_ERROR) {
		return false;
	}

	sderr = __s5p_sdout_init_cgmsa525_data(c5_copy_permit,c5_mv_psp,
					c5_copy_info,c5_analog_on,
					c5_display_ratio);

	if (sderr != SDOUT_NO_ERROR) {
		return false;
	}

	sderr = __s5p_sdout_init_cgmsa625_data(c6_surroun_f_sound,c6_copyright,
					c6_copy_protection,c6_text_subtitles,
					c6_open_subtitles,c6_camera_film,
					c6_color_encoding,c6_helper_signal,
					c6_display_ratio);

	if (sderr != SDOUT_NO_ERROR) {
		return false;
	}

	// Disable All Interrupt
	__s5p_sdout_set_interrupt_enable(false);

	// Clear All Interrupt Pending
	__s5p_sdout_clear_interrupt_pending();

	__s5p_sdout_start();

	__s5p_tv_powerset_dac_onoff(true);

	for(i = SDOUT_CHANNEL_0;i<=SDOUT_CHANNEL_2;i++) {

		bool dac = st->sdout_dac_on[i];

		sderr = __s5p_sdout_init_dac_power_onoff(i,dac);

		if (sderr != SDOUT_NO_ERROR) 
			return false;
	}

	return true;
}