diff options
author | Jean-Francois Moine <moinejf@free.fr> | 2014-01-25 12:14:42 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2014-02-13 14:41:48 -0500 |
commit | 81b53a166f5cdf4e5bec47fc8884c994de82dc6b (patch) | |
tree | e368105a435205e09107e7830912c9a0643bfa66 /drivers/gpu/drm/i2c | |
parent | 73d5e253ac641bf95f5836c064128be78f43cd0b (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.c | 46 |
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 | |||
496 | tda998x_reset(struct tda998x_priv *priv) | 496 | tda998x_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 | ||