aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i2c
diff options
context:
space:
mode:
authorJean-Francois Moine <moinejf@free.fr>2014-01-25 12:14:42 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2014-02-13 14:41:48 -0500
commit81b53a166f5cdf4e5bec47fc8884c994de82dc6b (patch)
treee368105a435205e09107e7830912c9a0643bfa66 /drivers/gpu/drm/i2c
parent73d5e253ac641bf95f5836c064128be78f43cd0b (diff)
drm/i2c: tda998x: don't read write-only registers
This patch takes care of the write-only registers of the tda998x. The registers SOFTRESET, TBG_CNTRL_0 and TBG_CNTRL_1 have all bits cleared after reset, so, they may be fully re-written. The register MAT_CONTRL is set to MAT_CONTRL_MAT_BP | MAT_CONTRL_MAT_SC(1) after reset, so, it may be fully set again to this value. Tested-by: Russell King <rmk+kernel@arm.linux.org.uk> Acked-by: Russell King <rmk+kernel@arm.linux.org.uk> Signed-off-by: Jean-Francois Moine <moinejf@free.fr> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/gpu/drm/i2c')
-rw-r--r--drivers/gpu/drm/i2c/tda998x_drv.c46
1 files changed, 24 insertions, 22 deletions
diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c
index 80b94b51e060..d31e1c170bb6 100644
--- a/drivers/gpu/drm/i2c/tda998x_drv.c
+++ b/drivers/gpu/drm/i2c/tda998x_drv.c
@@ -496,9 +496,9 @@ static void
496tda998x_reset(struct tda998x_priv *priv) 496tda998x_reset(struct tda998x_priv *priv)
497{ 497{
498 /* reset audio and i2c master: */ 498 /* reset audio and i2c master: */
499 reg_set(priv, REG_SOFTRESET, SOFTRESET_AUDIO | SOFTRESET_I2C_MASTER); 499 reg_write(priv, REG_SOFTRESET, SOFTRESET_AUDIO | SOFTRESET_I2C_MASTER);
500 msleep(50); 500 msleep(50);
501 reg_clear(priv, REG_SOFTRESET, SOFTRESET_AUDIO | SOFTRESET_I2C_MASTER); 501 reg_write(priv, REG_SOFTRESET, 0);
502 msleep(50); 502 msleep(50);
503 503
504 /* reset transmitter: */ 504 /* reset transmitter: */
@@ -860,7 +860,7 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder,
860 reg_set(priv, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_FIFO); 860 reg_set(priv, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_FIFO);
861 861
862 /* set HDMI HDCP mode off: */ 862 /* set HDMI HDCP mode off: */
863 reg_set(priv, REG_TBG_CNTRL_1, TBG_CNTRL_1_DWIN_DIS); 863 reg_write(priv, REG_TBG_CNTRL_1, TBG_CNTRL_1_DWIN_DIS);
864 reg_clear(priv, REG_TX33, TX33_HDMI); 864 reg_clear(priv, REG_TX33, TX33_HDMI);
865 reg_write(priv, REG_ENC_CNTRL, ENC_CNTRL_CTL_CODE(0)); 865 reg_write(priv, REG_ENC_CNTRL, ENC_CNTRL_CTL_CODE(0));
866 866
@@ -887,38 +887,28 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder,
887 PLL_SERIAL_2_SRL_PR(rep)); 887 PLL_SERIAL_2_SRL_PR(rep));
888 888
889 /* set color matrix bypass flag: */ 889 /* set color matrix bypass flag: */
890 reg_set(priv, REG_MAT_CONTRL, MAT_CONTRL_MAT_BP); 890 reg_write(priv, REG_MAT_CONTRL, MAT_CONTRL_MAT_BP |
891 MAT_CONTRL_MAT_SC(1));
891 892
892 /* set BIAS tmds value: */ 893 /* set BIAS tmds value: */
893 reg_write(priv, REG_ANA_GENERAL, 0x09); 894 reg_write(priv, REG_ANA_GENERAL, 0x09);
894 895
895 reg_clear(priv, REG_TBG_CNTRL_0, TBG_CNTRL_0_SYNC_MTHD); 896 reg_write(priv, REG_TBG_CNTRL_0, 0);
896 897
897 /* 898 /*
898 * Sync on rising HSYNC/VSYNC 899 * Sync on rising HSYNC/VSYNC
899 */ 900 */
900 reg_write(priv, REG_VIP_CNTRL_3, 0); 901 reg = VIP_CNTRL_3_SYNC_HS;
901 reg_set(priv, REG_VIP_CNTRL_3, VIP_CNTRL_3_SYNC_HS);
902 902
903 /* 903 /*
904 * TDA19988 requires high-active sync at input stage, 904 * TDA19988 requires high-active sync at input stage,
905 * so invert low-active sync provided by master encoder here 905 * so invert low-active sync provided by master encoder here
906 */ 906 */
907 if (mode->flags & DRM_MODE_FLAG_NHSYNC) 907 if (mode->flags & DRM_MODE_FLAG_NHSYNC)
908 reg_set(priv, REG_VIP_CNTRL_3, VIP_CNTRL_3_H_TGL); 908 reg |= VIP_CNTRL_3_H_TGL;
909 if (mode->flags & DRM_MODE_FLAG_NVSYNC) 909 if (mode->flags & DRM_MODE_FLAG_NVSYNC)
910 reg_set(priv, REG_VIP_CNTRL_3, VIP_CNTRL_3_V_TGL); 910 reg |= VIP_CNTRL_3_V_TGL;
911 911 reg_write(priv, REG_VIP_CNTRL_3, reg);
912 /*
913 * Always generate sync polarity relative to input sync and
914 * revert input stage toggled sync at output stage
915 */
916 reg = TBG_CNTRL_1_TGL_EN;
917 if (mode->flags & DRM_MODE_FLAG_NHSYNC)
918 reg |= TBG_CNTRL_1_H_TGL;
919 if (mode->flags & DRM_MODE_FLAG_NVSYNC)
920 reg |= TBG_CNTRL_1_V_TGL;
921 reg_write(priv, REG_TBG_CNTRL_1, reg);
922 912
923 reg_write(priv, REG_VIDFORMAT, 0x00); 913 reg_write(priv, REG_VIDFORMAT, 0x00);
924 reg_write16(priv, REG_REFPIX_MSB, ref_pix); 914 reg_write16(priv, REG_REFPIX_MSB, ref_pix);
@@ -947,13 +937,25 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder,
947 reg_write(priv, REG_ENABLE_SPACE, 0x00); 937 reg_write(priv, REG_ENABLE_SPACE, 0x00);
948 } 938 }
949 939
940 /*
941 * Always generate sync polarity relative to input sync and
942 * revert input stage toggled sync at output stage
943 */
944 reg = TBG_CNTRL_1_DWIN_DIS | TBG_CNTRL_1_TGL_EN;
945 if (mode->flags & DRM_MODE_FLAG_NHSYNC)
946 reg |= TBG_CNTRL_1_H_TGL;
947 if (mode->flags & DRM_MODE_FLAG_NVSYNC)
948 reg |= TBG_CNTRL_1_V_TGL;
949 reg_write(priv, REG_TBG_CNTRL_1, reg);
950
950 /* must be last register set: */ 951 /* must be last register set: */
951 reg_clear(priv, REG_TBG_CNTRL_0, TBG_CNTRL_0_SYNC_ONCE); 952 reg_write(priv, REG_TBG_CNTRL_0, 0);
952 953
953 /* Only setup the info frames if the sink is HDMI */ 954 /* Only setup the info frames if the sink is HDMI */
954 if (priv->is_hdmi_sink) { 955 if (priv->is_hdmi_sink) {
955 /* We need to turn HDMI HDCP stuff on to get audio through */ 956 /* We need to turn HDMI HDCP stuff on to get audio through */
956 reg_clear(priv, REG_TBG_CNTRL_1, TBG_CNTRL_1_DWIN_DIS); 957 reg &= ~TBG_CNTRL_1_DWIN_DIS;
958 reg_write(priv, REG_TBG_CNTRL_1, reg);
957 reg_write(priv, REG_ENC_CNTRL, ENC_CNTRL_CTL_CODE(1)); 959 reg_write(priv, REG_ENC_CNTRL, ENC_CNTRL_CTL_CODE(1));
958 reg_set(priv, REG_TX33, TX33_HDMI); 960 reg_set(priv, REG_TX33, TX33_HDMI);
959 961