diff options
Diffstat (limited to 'drivers/media/video/samsung/tvout/s5p_tvif_ctrl.c')
-rw-r--r-- | drivers/media/video/samsung/tvout/s5p_tvif_ctrl.c | 89 |
1 files changed, 79 insertions, 10 deletions
diff --git a/drivers/media/video/samsung/tvout/s5p_tvif_ctrl.c b/drivers/media/video/samsung/tvout/s5p_tvif_ctrl.c index 93cb640..43e7a1f 100644 --- a/drivers/media/video/samsung/tvout/s5p_tvif_ctrl.c +++ b/drivers/media/video/samsung/tvout/s5p_tvif_ctrl.c @@ -49,6 +49,12 @@ #if defined(CONFIG_BUSFREQ_OPP) || defined(CONFIG_BUSFREQ_LOCK_WRAPPER) #include <mach/dev.h> #endif +#include <mach/regs-hdmi.h> + +#ifdef CONFIG_HDMI_TX_STRENGTH +#include <plat/tvout.h> +#endif + #include "s5p_tvout_common_lib.h" #include "hw_if/hw_if.h" @@ -1758,7 +1764,7 @@ static void s5p_sdo_ctrl_clock(bool on) #ifdef CONFIG_ARCH_EXYNOS4 s5p_tvout_pm_runtime_get(); #endif - // Restore sdo_base address + /* Restore sdo_base address */ s5p_sdo_init(s5p_sdo_ctrl_private.reg_mem.base); clk_enable(s5p_sdo_ctrl_private.clk[SDO_PCLK].ptr); @@ -1771,7 +1777,7 @@ static void s5p_sdo_ctrl_clock(bool on) clk_disable(s5p_sdo_ctrl_private.clk[SDO_MUX].ptr); - // Set sdo_base address to NULL + /* Set sdo_base address to NULL */ s5p_sdo_init(NULL); } @@ -2362,8 +2368,10 @@ static void s5p_hdmi_ctrl_internal_stop(void) #ifdef CONFIG_HDMI_HPD s5p_hpd_set_eint(); #endif - if (ctrl->hdcp_en) + if (ctrl->hdcp_en) { s5p_hdcp_stop(); + s5p_hdcp_flush_work(); + } s5p_hdmi_reg_enable(false); @@ -2376,10 +2384,16 @@ int s5p_hdmi_ctrl_phy_power(bool on) if (on) { /* on */ clk_enable(s5ptv_status.i2c_phy_clk); - // Restore i2c_hdmi_phy_base address + /* Restore i2c_hdmi_phy_base address */ s5p_hdmi_phy_init(s5p_hdmi_ctrl_private.reg_mem[HDMI_PHY].base); s5p_hdmi_phy_power(true); +#ifdef CONFIG_HDMI_TX_STRENGTH + if (s5p_tvif_ctrl_private.tx_val) + s5p_hdmi_phy_set_tx_strength( + s5p_tvif_ctrl_private.tx_ch, + s5p_tvif_ctrl_private.tx_val); +#endif } else { /* @@ -2398,7 +2412,7 @@ int s5p_hdmi_ctrl_phy_power(bool on) s5p_hdmi_phy_power(false); clk_disable(s5ptv_status.i2c_phy_clk); - // Set i2c_hdmi_phy_base to NULL + /* Set i2c_hdmi_phy_base to NULL */ s5p_hdmi_phy_init(NULL); } @@ -2419,7 +2433,7 @@ void s5p_hdmi_ctrl_clock(bool on) #endif clk_enable(clk[HDMI_PCLK].ptr); - // Restore hdmi_base address + /* Restore hdmi_base address */ s5p_hdmi_init(s5p_hdmi_ctrl_private.reg_mem[HDMI].base); } else { clk_disable(clk[HDMI_PCLK].ptr); @@ -2430,7 +2444,7 @@ void s5p_hdmi_ctrl_clock(bool on) clk_disable(clk[HDMI_MUX].ptr); - // Set hdmi_base to NULL + /* Set hdmi_base to NULL */ s5p_hdmi_init(NULL); } } @@ -2447,7 +2461,7 @@ void s5p_hdmi_ctrl_stop(void) tvout_dbg("running(%d)\n", ctrl->running); if (ctrl->running) { ctrl->running = false; -#ifdef CONFIG_HAS_EARLYSUSPEND +#ifdef CLOCK_GATING_ON_EARLY_SUSPEND if (suspend_status) { tvout_dbg("driver is suspend_status\n"); } else @@ -2681,7 +2695,7 @@ static int s5p_tvif_ctrl_internal_stop(void) case TVOUT_HDMI: case TVOUT_HDMI_RGB: s5p_hdmi_ctrl_stop(); -#ifdef CONFIG_HAS_EARLYSUSPEND +#ifdef CLOCK_GATING_ON_EARLY_SUSPEND if (suspend_status) { tvout_dbg("driver is suspend_status\n"); } else @@ -2705,6 +2719,10 @@ static void s5p_tvif_ctrl_internal_start( enum s5p_tvout_o_mode inf) { tvout_dbg("\n"); +#ifdef __CONFIG_HDMI_SUPPORT_FULL_RANGE__ + s5p_hdmi_output[inf].reg.pxl_limit = + S5P_HDMI_PX_LMT_CTRL_BYPASS; +#endif s5p_mixer_ctrl_set_int_enable(false); /* Clear All Interrupt Pending */ @@ -2724,6 +2742,47 @@ static void s5p_tvif_ctrl_internal_start( case TVOUT_HDMI: case TVOUT_HDMI_RGB: case TVOUT_DVI: +#ifdef __CONFIG_HDMI_SUPPORT_FULL_RANGE__ + switch (std) { + case TVOUT_480P_60_4_3: + if (inf == TVOUT_HDMI_RGB) /* full range */ + s5p_hdmi_output[inf].reg.pxl_limit = + S5P_HDMI_PX_LMT_CTRL_BYPASS; + else if (s5p_tvif_get_q_range()) /* full range */ + s5p_hdmi_output[inf].reg.pxl_limit = + S5P_HDMI_PX_LMT_CTRL_BYPASS; + else /* limited range */ + s5p_hdmi_output[inf].reg.pxl_limit = + S5P_HDMI_PX_LMT_CTRL_YPBPR; + break; + case TVOUT_480P_60_16_9: + case TVOUT_480P_59: + case TVOUT_576P_50_16_9: + case TVOUT_576P_50_4_3: + case TVOUT_720P_60: + case TVOUT_720P_50: + case TVOUT_720P_59: + case TVOUT_1080I_60: + case TVOUT_1080I_59: + case TVOUT_1080I_50: + case TVOUT_1080P_60: + case TVOUT_1080P_30: + case TVOUT_1080P_59: + case TVOUT_1080P_50: + if (inf == TVOUT_HDMI_RGB) /* limited range */ + s5p_hdmi_output[inf].reg.pxl_limit = + S5P_HDMI_PX_LMT_CTRL_RGB; + else if (s5p_tvif_get_q_range()) /* full range */ + s5p_hdmi_output[inf].reg.pxl_limit = + S5P_HDMI_PX_LMT_CTRL_BYPASS; + else /* limited range */ + s5p_hdmi_output[inf].reg.pxl_limit = + S5P_HDMI_PX_LMT_CTRL_YPBPR; + break; + default: + break; + } +#endif s5p_hdmi_ctrl_phy_power(1); if (s5p_mixer_ctrl_start(std, inf) < 0) @@ -2854,7 +2913,7 @@ int s5p_tvif_ctrl_start( goto cannot_change; } -#ifdef CONFIG_HAS_EARLYSUSPEND +#ifdef CLOCK_GATING_ON_EARLY_SUSPEND if (suspend_status) { tvout_dbg("driver is suspend_status\n"); } else @@ -2889,6 +2948,16 @@ void s5p_tvif_ctrl_stop(void) int s5p_tvif_ctrl_constructor(struct platform_device *pdev) { +#ifdef CONFIG_HDMI_TX_STRENGTH + struct s5p_platform_tvout *pdata = to_tvout_plat(&pdev->dev); + s5p_tvif_ctrl_private.tx_ch = 0x00; + s5p_tvif_ctrl_private.tx_val = NULL; + if ((pdata) && (pdata->tx_tune)) { + s5p_tvif_ctrl_private.tx_ch = pdata->tx_tune->tx_ch; + s5p_tvif_ctrl_private.tx_val = pdata->tx_tune->tx_val; + } +#endif + #ifdef CONFIG_ANALOG_TVENC if (s5p_sdo_ctrl_constructor(pdev)) goto err; |