aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/samsung/tvout/s5p_tvif_ctrl.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/samsung/tvout/s5p_tvif_ctrl.c')
-rw-r--r--drivers/media/video/samsung/tvout/s5p_tvif_ctrl.c89
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;