int tv_phy_power(bool on) { if (on) { __s5p_tv_poweron(); /* on */ clk_enable(s5ptv_status.i2c_phy_clk); __s5p_hdmi_phy_power(true); } else { /* * for preventing hdmi hang up when restart * switch to internal clk - SCLK_DAC, SCLK_PIXEL */ clk_set_parent(s5ptv_status.sclk_mixer, s5ptv_status.sclk_dac); clk_set_parent(s5ptv_status.sclk_hdmi, s5ptv_status.sclk_pixel); __s5p_hdmi_phy_power(false); clk_disable(s5ptv_status.i2c_phy_clk); __s5p_tv_poweroff(); } return 0; }
/* * TV cut off sequence * VP stop -> Mixer stop -> HDMI stop -> HDMI TG stop * Above sequence should be satisfied. */ bool _s5p_tv_if_stop(void) { struct s5p_tv_status *st = &s5ptv_status; bool t_corr_en = st->hdmi_tg_cmd.timing_correction_en; bool sync_en = st->hdmi_tg_cmd.bt656_sync_en; enum s5p_tv_o_mode out_mode = st->tvout_param.out_mode; TVOUTIFPRINTK("tvout sub sys. stopped!!\n"); __s5p_vm_stop(); switch (out_mode) { case TVOUT_OUTPUT_COMPOSITE: case TVOUT_OUTPUT_SVIDEO: case TVOUT_OUTPUT_COMPONENT_YPBPR_INERLACED: case TVOUT_OUTPUT_COMPONENT_YPBPR_PROGRESSIVE: case TVOUT_OUTPUT_COMPONENT_RGB_PROGRESSIVE: if (st->tvout_output_enable) __s5p_sdout_stop(); break; case TVOUT_OUTPUT_HDMI: case TVOUT_OUTPUT_HDMI_RGB: case TVOUT_OUTPUT_DVI: if (st->tvout_output_enable) { __s5p_hdmi_stop(); __s5p_hdmi_video_init_tg_cmd(t_corr_en, sync_en, false); } break; default: TVOUTIFPRINTK("invalid out_mode parameter(%d)\n\r", out_mode); return false; break; } #ifdef CONFIG_CPU_S5PC100 if (__s5p_tv_power_get_power_status()) { __s5p_tv_clk_stop(); __s5p_tv_poweroff(); } #endif st->tvout_output_enable = false; st->tvout_param_available = false; return true; }
bool _s5p_tv_if_start(void) { s5p_tv_status *st = &s5ptv_status; s5p_tv_clk_err cerr = HDMI_NO_ERROR; s5p_tv_o_mode out_mode = st->tvout_param.out_mode; __s5p_vm_set_underflow_interrupt_enable(VM_VIDEO_LAYER, false); __s5p_vm_set_underflow_interrupt_enable(VM_GPR0_LAYER, false); __s5p_vm_set_underflow_interrupt_enable(VM_GPR1_LAYER, false); _s5p_tv_if_stop(); if (st->vp_layer_enable) { _s5p_vlayer_stop(); // In order to start video layer on the s5p_tv_resume() or handle_calbe() function st->vp_layer_enable = true; } // Clear All Interrupt Pending __s5p_vm_clear_pend_all(); /* * have not to call * another request function simultaneously */ #ifdef CONFIG_CPU_S5PC100 s5p_tv_disp_mode disp_mode = st->tvout_param.disp_mode; if (!__s5p_tv_power_get_power_status()) { __s5p_tv_poweron(); } #endif #ifdef CONFIG_CPU_S5PV210 // move to tv_phy_power() //__s5p_tv_poweron(); #endif __s5p_tv_clk_set_vmixer_hclk_onoff(true); __s5p_tv_clk_set_vmixer_sclk_onoff(true); switch (out_mode) { case TVOUT_OUTPUT_COMPOSITE: case TVOUT_OUTPUT_SVIDEO: case TVOUT_OUTPUT_COMPONENT_YPBPR_INERLACED: case TVOUT_OUTPUT_COMPONENT_YPBPR_PROGRESSIVE: case TVOUT_OUTPUT_COMPONENT_RGB_PROGRESSIVE: __s5p_tv_clk_init_video_mixer(TVOUT_CLK_VMIXER_SRCCLK_VCLK_54); __s5p_tv_clk_set_sdout_hclk_onoff(true); __s5p_tv_clk_set_sdout_sclk_onoff(true); __s5p_tv_clk_set_hdmi_hclk_onoff(false); __s5p_tv_clk_set_hdmi_sclk_onoff(false); #ifdef CONFIG_CPU_S5PC100 __s5p_tv_clk_init_hpll(0xffff, 96, 6, 3); #endif #ifdef CONFIG_CPU_S5PV210 __s5p_tv_clk_init_hpll(0, 0xffff, 108, 6, 3); #endif break; case TVOUT_OUTPUT_HDMI: case TVOUT_OUTPUT_HDMI_RGB: case TVOUT_OUTPUT_DVI: __s5p_tv_clk_init_video_mixer(TVOUT_CLK_VMIXER_SRCCLK_MOUT_HPLL); __s5p_tv_clk_set_sdout_hclk_onoff(false); __s5p_tv_clk_set_sdout_sclk_onoff(false); __s5p_tv_clk_set_hdmi_hclk_onoff(true); __s5p_tv_clk_set_hdmi_sclk_onoff(true); cerr = __s5p_tv_clk_init_href(S5P_TV_CLK_HPLL_REF_27M); if (cerr != S5P_TV_CLK_ERR_NO_ERROR) { return false; } cerr = __s5p_tv_clk_init_mout_hpll(S5P_TV_CLK_MOUT_HPLL_FOUT_HPLL); if (cerr != S5P_TV_CLK_ERR_NO_ERROR) { return false; } #ifdef CONFIG_CPU_S5PC100 __s5p_tv_clk_init_hdmi_ratio(2); switch (disp_mode) { case TVOUT_480P_60_16_9: case TVOUT_480P_60_4_3: case TVOUT_576P_50_16_9: case TVOUT_576P_50_4_3: __s5p_tv_clk_init_hpll(0xffff, 96, 6, 3); break; case TVOUT_720P_50: case TVOUT_720P_60: __s5p_tv_clk_init_hpll(0xffff, 132, 6, 2); break; default: _s5p_tv_if_stop(); TVOUTIFPRINTK("invalid out_mode parameter(%d)\n\r", out_mode); st->tvout_param_available = false; return false; break; } #endif #ifdef CONFIG_CPU_S5PV210 __s5p_tv_clk_init_hdmi_ratio(0); #endif __s5p_tv_clk_hpll_onoff(true); #ifdef CONFIG_CPU_S5PC100 __s5p_tv_poweroff(); __s5p_tv_poweron(); #endif break; default: _s5p_tv_if_stop(); TVOUTIFPRINTK("invalid out_mode parameter(%d)\n\r", st->tvout_param.out_mode); st->tvout_param_available = false; return false; break; } if (!_s5p_tv_if_init_vm_reg()) { return false; } switch (out_mode) { case TVOUT_OUTPUT_COMPOSITE: case TVOUT_OUTPUT_SVIDEO: case TVOUT_OUTPUT_COMPONENT_YPBPR_INERLACED: case TVOUT_OUTPUT_COMPONENT_YPBPR_PROGRESSIVE: case TVOUT_OUTPUT_COMPONENT_RGB_PROGRESSIVE: if (!_s5p_tv_if_init_sd_reg()) { return false; } break; case TVOUT_OUTPUT_DVI: st->hdmi_audio_type = HDMI_AUDIO_NO; case TVOUT_OUTPUT_HDMI: case TVOUT_OUTPUT_HDMI_RGB: if (!_s5p_tv_if_init_hd_reg()) { return false; } break; default: _s5p_tv_if_stop(); TVOUTIFPRINTK("invalid out_mode parameter(%d)\n\r", out_mode); return false; break; } st->tvout_output_enable = true; __s5p_vm_set_underflow_interrupt_enable(VM_VIDEO_LAYER, true); __s5p_vm_set_underflow_interrupt_enable(VM_GPR0_LAYER, true); __s5p_vm_set_underflow_interrupt_enable(VM_GPR1_LAYER, true); // Clear All Interrupt Pending __s5p_vm_clear_pend_all(); TVOUTIFPRINTK("()\n\r"); return true; }