diff options
Diffstat (limited to 'drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c')
-rw-r--r-- | drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c | 480 |
1 files changed, 321 insertions, 159 deletions
diff --git a/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c b/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c index bfe6fe65c8b..4dae1b29107 100644 --- a/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c +++ b/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c | |||
@@ -29,9 +29,14 @@ | |||
29 | #include <linux/string.h> | 29 | #include <linux/string.h> |
30 | #include <linux/seq_file.h> | 30 | #include <linux/seq_file.h> |
31 | #include <linux/gpio.h> | 31 | #include <linux/gpio.h> |
32 | #if defined(CONFIG_OMAP4_DSS_HDMI_AUDIO) | ||
33 | #include <sound/asound.h> | ||
34 | #include <sound/asoundef.h> | ||
35 | #endif | ||
32 | 36 | ||
33 | #include "ti_hdmi_4xxx_ip.h" | 37 | #include "ti_hdmi_4xxx_ip.h" |
34 | #include "dss.h" | 38 | #include "dss.h" |
39 | #include "dss_features.h" | ||
35 | 40 | ||
36 | static inline void hdmi_write_reg(void __iomem *base_addr, | 41 | static inline void hdmi_write_reg(void __iomem *base_addr, |
37 | const u16 idx, u32 val) | 42 | const u16 idx, u32 val) |
@@ -298,9 +303,9 @@ int ti_hdmi_4xxx_phy_enable(struct hdmi_ip_data *ip_data) | |||
298 | REG_FLD_MOD(phy_base, HDMI_TXPHY_PAD_CFG_CTRL, 0x1, 27, 27); | 303 | REG_FLD_MOD(phy_base, HDMI_TXPHY_PAD_CFG_CTRL, 0x1, 27, 27); |
299 | 304 | ||
300 | r = request_threaded_irq(gpio_to_irq(ip_data->hpd_gpio), | 305 | r = request_threaded_irq(gpio_to_irq(ip_data->hpd_gpio), |
301 | NULL, hpd_irq_handler, | 306 | NULL, hpd_irq_handler, |
302 | IRQF_DISABLED | IRQF_TRIGGER_RISING | | 307 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | |
303 | IRQF_TRIGGER_FALLING, "hpd", ip_data); | 308 | IRQF_ONESHOT, "hpd", ip_data); |
304 | if (r) { | 309 | if (r) { |
305 | DSSERR("HPD IRQ request failed\n"); | 310 | DSSERR("HPD IRQ request failed\n"); |
306 | hdmi_set_phy_pwr(ip_data, HDMI_PHYPWRCMD_OFF); | 311 | hdmi_set_phy_pwr(ip_data, HDMI_PHYPWRCMD_OFF); |
@@ -699,9 +704,15 @@ static void hdmi_wp_init(struct omap_video_timings *timings, | |||
699 | 704 | ||
700 | } | 705 | } |
701 | 706 | ||
702 | void ti_hdmi_4xxx_wp_video_start(struct hdmi_ip_data *ip_data, bool start) | 707 | int ti_hdmi_4xxx_wp_video_start(struct hdmi_ip_data *ip_data) |
708 | { | ||
709 | REG_FLD_MOD(hdmi_wp_base(ip_data), HDMI_WP_VIDEO_CFG, true, 31, 31); | ||
710 | return 0; | ||
711 | } | ||
712 | |||
713 | void ti_hdmi_4xxx_wp_video_stop(struct hdmi_ip_data *ip_data) | ||
703 | { | 714 | { |
704 | REG_FLD_MOD(hdmi_wp_base(ip_data), HDMI_WP_VIDEO_CFG, start, 31, 31); | 715 | REG_FLD_MOD(hdmi_wp_base(ip_data), HDMI_WP_VIDEO_CFG, false, 31, 31); |
705 | } | 716 | } |
706 | 717 | ||
707 | static void hdmi_wp_video_init_format(struct hdmi_video_format *video_fmt, | 718 | static void hdmi_wp_video_init_format(struct hdmi_video_format *video_fmt, |
@@ -886,10 +897,12 @@ void ti_hdmi_4xxx_core_dump(struct hdmi_ip_data *ip_data, struct seq_file *s) | |||
886 | 897 | ||
887 | #define CORE_REG(i, name) name(i) | 898 | #define CORE_REG(i, name) name(i) |
888 | #define DUMPCORE(r) seq_printf(s, "%-35s %08x\n", #r,\ | 899 | #define DUMPCORE(r) seq_printf(s, "%-35s %08x\n", #r,\ |
889 | hdmi_read_reg(hdmi_pll_base(ip_data), r)) | 900 | hdmi_read_reg(hdmi_core_sys_base(ip_data), r)) |
890 | #define DUMPCOREAV(i, r) seq_printf(s, "%s[%d]%*s %08x\n", #r, i, \ | 901 | #define DUMPCOREAV(r) seq_printf(s, "%-35s %08x\n", #r,\ |
902 | hdmi_read_reg(hdmi_av_base(ip_data), r)) | ||
903 | #define DUMPCOREAV2(i, r) seq_printf(s, "%s[%d]%*s %08x\n", #r, i, \ | ||
891 | (i < 10) ? 32 - strlen(#r) : 31 - strlen(#r), " ", \ | 904 | (i < 10) ? 32 - strlen(#r) : 31 - strlen(#r), " ", \ |
892 | hdmi_read_reg(hdmi_pll_base(ip_data), CORE_REG(i, r))) | 905 | hdmi_read_reg(hdmi_av_base(ip_data), CORE_REG(i, r))) |
893 | 906 | ||
894 | DUMPCORE(HDMI_CORE_SYS_VND_IDL); | 907 | DUMPCORE(HDMI_CORE_SYS_VND_IDL); |
895 | DUMPCORE(HDMI_CORE_SYS_DEV_IDL); | 908 | DUMPCORE(HDMI_CORE_SYS_DEV_IDL); |
@@ -898,6 +911,13 @@ void ti_hdmi_4xxx_core_dump(struct hdmi_ip_data *ip_data, struct seq_file *s) | |||
898 | DUMPCORE(HDMI_CORE_SYS_SRST); | 911 | DUMPCORE(HDMI_CORE_SYS_SRST); |
899 | DUMPCORE(HDMI_CORE_CTRL1); | 912 | DUMPCORE(HDMI_CORE_CTRL1); |
900 | DUMPCORE(HDMI_CORE_SYS_SYS_STAT); | 913 | DUMPCORE(HDMI_CORE_SYS_SYS_STAT); |
914 | DUMPCORE(HDMI_CORE_SYS_DE_DLY); | ||
915 | DUMPCORE(HDMI_CORE_SYS_DE_CTRL); | ||
916 | DUMPCORE(HDMI_CORE_SYS_DE_TOP); | ||
917 | DUMPCORE(HDMI_CORE_SYS_DE_CNTL); | ||
918 | DUMPCORE(HDMI_CORE_SYS_DE_CNTH); | ||
919 | DUMPCORE(HDMI_CORE_SYS_DE_LINL); | ||
920 | DUMPCORE(HDMI_CORE_SYS_DE_LINH_1); | ||
901 | DUMPCORE(HDMI_CORE_SYS_VID_ACEN); | 921 | DUMPCORE(HDMI_CORE_SYS_VID_ACEN); |
902 | DUMPCORE(HDMI_CORE_SYS_VID_MODE); | 922 | DUMPCORE(HDMI_CORE_SYS_VID_MODE); |
903 | DUMPCORE(HDMI_CORE_SYS_INTR_STATE); | 923 | DUMPCORE(HDMI_CORE_SYS_INTR_STATE); |
@@ -907,102 +927,91 @@ void ti_hdmi_4xxx_core_dump(struct hdmi_ip_data *ip_data, struct seq_file *s) | |||
907 | DUMPCORE(HDMI_CORE_SYS_INTR4); | 927 | DUMPCORE(HDMI_CORE_SYS_INTR4); |
908 | DUMPCORE(HDMI_CORE_SYS_UMASK1); | 928 | DUMPCORE(HDMI_CORE_SYS_UMASK1); |
909 | DUMPCORE(HDMI_CORE_SYS_TMDS_CTRL); | 929 | DUMPCORE(HDMI_CORE_SYS_TMDS_CTRL); |
910 | DUMPCORE(HDMI_CORE_SYS_DE_DLY); | ||
911 | DUMPCORE(HDMI_CORE_SYS_DE_CTRL); | ||
912 | DUMPCORE(HDMI_CORE_SYS_DE_TOP); | ||
913 | DUMPCORE(HDMI_CORE_SYS_DE_CNTL); | ||
914 | DUMPCORE(HDMI_CORE_SYS_DE_CNTH); | ||
915 | DUMPCORE(HDMI_CORE_SYS_DE_LINL); | ||
916 | DUMPCORE(HDMI_CORE_SYS_DE_LINH_1); | ||
917 | 930 | ||
918 | DUMPCORE(HDMI_CORE_DDC_CMD); | ||
919 | DUMPCORE(HDMI_CORE_DDC_STATUS); | ||
920 | DUMPCORE(HDMI_CORE_DDC_ADDR); | 931 | DUMPCORE(HDMI_CORE_DDC_ADDR); |
932 | DUMPCORE(HDMI_CORE_DDC_SEGM); | ||
921 | DUMPCORE(HDMI_CORE_DDC_OFFSET); | 933 | DUMPCORE(HDMI_CORE_DDC_OFFSET); |
922 | DUMPCORE(HDMI_CORE_DDC_COUNT1); | 934 | DUMPCORE(HDMI_CORE_DDC_COUNT1); |
923 | DUMPCORE(HDMI_CORE_DDC_COUNT2); | 935 | DUMPCORE(HDMI_CORE_DDC_COUNT2); |
936 | DUMPCORE(HDMI_CORE_DDC_STATUS); | ||
937 | DUMPCORE(HDMI_CORE_DDC_CMD); | ||
924 | DUMPCORE(HDMI_CORE_DDC_DATA); | 938 | DUMPCORE(HDMI_CORE_DDC_DATA); |
925 | DUMPCORE(HDMI_CORE_DDC_SEGM); | ||
926 | 939 | ||
927 | DUMPCORE(HDMI_CORE_AV_HDMI_CTRL); | 940 | DUMPCOREAV(HDMI_CORE_AV_ACR_CTRL); |
928 | DUMPCORE(HDMI_CORE_AV_DPD); | 941 | DUMPCOREAV(HDMI_CORE_AV_FREQ_SVAL); |
929 | DUMPCORE(HDMI_CORE_AV_PB_CTRL1); | 942 | DUMPCOREAV(HDMI_CORE_AV_N_SVAL1); |
930 | DUMPCORE(HDMI_CORE_AV_PB_CTRL2); | 943 | DUMPCOREAV(HDMI_CORE_AV_N_SVAL2); |
931 | DUMPCORE(HDMI_CORE_AV_AVI_TYPE); | 944 | DUMPCOREAV(HDMI_CORE_AV_N_SVAL3); |
932 | DUMPCORE(HDMI_CORE_AV_AVI_VERS); | 945 | DUMPCOREAV(HDMI_CORE_AV_CTS_SVAL1); |
933 | DUMPCORE(HDMI_CORE_AV_AVI_LEN); | 946 | DUMPCOREAV(HDMI_CORE_AV_CTS_SVAL2); |
934 | DUMPCORE(HDMI_CORE_AV_AVI_CHSUM); | 947 | DUMPCOREAV(HDMI_CORE_AV_CTS_SVAL3); |
948 | DUMPCOREAV(HDMI_CORE_AV_CTS_HVAL1); | ||
949 | DUMPCOREAV(HDMI_CORE_AV_CTS_HVAL2); | ||
950 | DUMPCOREAV(HDMI_CORE_AV_CTS_HVAL3); | ||
951 | DUMPCOREAV(HDMI_CORE_AV_AUD_MODE); | ||
952 | DUMPCOREAV(HDMI_CORE_AV_SPDIF_CTRL); | ||
953 | DUMPCOREAV(HDMI_CORE_AV_HW_SPDIF_FS); | ||
954 | DUMPCOREAV(HDMI_CORE_AV_SWAP_I2S); | ||
955 | DUMPCOREAV(HDMI_CORE_AV_SPDIF_ERTH); | ||
956 | DUMPCOREAV(HDMI_CORE_AV_I2S_IN_MAP); | ||
957 | DUMPCOREAV(HDMI_CORE_AV_I2S_IN_CTRL); | ||
958 | DUMPCOREAV(HDMI_CORE_AV_I2S_CHST0); | ||
959 | DUMPCOREAV(HDMI_CORE_AV_I2S_CHST1); | ||
960 | DUMPCOREAV(HDMI_CORE_AV_I2S_CHST2); | ||
961 | DUMPCOREAV(HDMI_CORE_AV_I2S_CHST4); | ||
962 | DUMPCOREAV(HDMI_CORE_AV_I2S_CHST5); | ||
963 | DUMPCOREAV(HDMI_CORE_AV_ASRC); | ||
964 | DUMPCOREAV(HDMI_CORE_AV_I2S_IN_LEN); | ||
965 | DUMPCOREAV(HDMI_CORE_AV_HDMI_CTRL); | ||
966 | DUMPCOREAV(HDMI_CORE_AV_AUDO_TXSTAT); | ||
967 | DUMPCOREAV(HDMI_CORE_AV_AUD_PAR_BUSCLK_1); | ||
968 | DUMPCOREAV(HDMI_CORE_AV_AUD_PAR_BUSCLK_2); | ||
969 | DUMPCOREAV(HDMI_CORE_AV_AUD_PAR_BUSCLK_3); | ||
970 | DUMPCOREAV(HDMI_CORE_AV_TEST_TXCTRL); | ||
971 | DUMPCOREAV(HDMI_CORE_AV_DPD); | ||
972 | DUMPCOREAV(HDMI_CORE_AV_PB_CTRL1); | ||
973 | DUMPCOREAV(HDMI_CORE_AV_PB_CTRL2); | ||
974 | DUMPCOREAV(HDMI_CORE_AV_AVI_TYPE); | ||
975 | DUMPCOREAV(HDMI_CORE_AV_AVI_VERS); | ||
976 | DUMPCOREAV(HDMI_CORE_AV_AVI_LEN); | ||
977 | DUMPCOREAV(HDMI_CORE_AV_AVI_CHSUM); | ||
935 | 978 | ||
936 | for (i = 0; i < HDMI_CORE_AV_AVI_DBYTE_NELEMS; i++) | 979 | for (i = 0; i < HDMI_CORE_AV_AVI_DBYTE_NELEMS; i++) |
937 | DUMPCOREAV(i, HDMI_CORE_AV_AVI_DBYTE); | 980 | DUMPCOREAV2(i, HDMI_CORE_AV_AVI_DBYTE); |
981 | |||
982 | DUMPCOREAV(HDMI_CORE_AV_SPD_TYPE); | ||
983 | DUMPCOREAV(HDMI_CORE_AV_SPD_VERS); | ||
984 | DUMPCOREAV(HDMI_CORE_AV_SPD_LEN); | ||
985 | DUMPCOREAV(HDMI_CORE_AV_SPD_CHSUM); | ||
938 | 986 | ||
939 | for (i = 0; i < HDMI_CORE_AV_SPD_DBYTE_NELEMS; i++) | 987 | for (i = 0; i < HDMI_CORE_AV_SPD_DBYTE_NELEMS; i++) |
940 | DUMPCOREAV(i, HDMI_CORE_AV_SPD_DBYTE); | 988 | DUMPCOREAV2(i, HDMI_CORE_AV_SPD_DBYTE); |
989 | |||
990 | DUMPCOREAV(HDMI_CORE_AV_AUDIO_TYPE); | ||
991 | DUMPCOREAV(HDMI_CORE_AV_AUDIO_VERS); | ||
992 | DUMPCOREAV(HDMI_CORE_AV_AUDIO_LEN); | ||
993 | DUMPCOREAV(HDMI_CORE_AV_AUDIO_CHSUM); | ||
941 | 994 | ||
942 | for (i = 0; i < HDMI_CORE_AV_AUD_DBYTE_NELEMS; i++) | 995 | for (i = 0; i < HDMI_CORE_AV_AUD_DBYTE_NELEMS; i++) |
943 | DUMPCOREAV(i, HDMI_CORE_AV_AUD_DBYTE); | 996 | DUMPCOREAV2(i, HDMI_CORE_AV_AUD_DBYTE); |
997 | |||
998 | DUMPCOREAV(HDMI_CORE_AV_MPEG_TYPE); | ||
999 | DUMPCOREAV(HDMI_CORE_AV_MPEG_VERS); | ||
1000 | DUMPCOREAV(HDMI_CORE_AV_MPEG_LEN); | ||
1001 | DUMPCOREAV(HDMI_CORE_AV_MPEG_CHSUM); | ||
944 | 1002 | ||
945 | for (i = 0; i < HDMI_CORE_AV_MPEG_DBYTE_NELEMS; i++) | 1003 | for (i = 0; i < HDMI_CORE_AV_MPEG_DBYTE_NELEMS; i++) |
946 | DUMPCOREAV(i, HDMI_CORE_AV_MPEG_DBYTE); | 1004 | DUMPCOREAV2(i, HDMI_CORE_AV_MPEG_DBYTE); |
947 | 1005 | ||
948 | for (i = 0; i < HDMI_CORE_AV_GEN_DBYTE_NELEMS; i++) | 1006 | for (i = 0; i < HDMI_CORE_AV_GEN_DBYTE_NELEMS; i++) |
949 | DUMPCOREAV(i, HDMI_CORE_AV_GEN_DBYTE); | 1007 | DUMPCOREAV2(i, HDMI_CORE_AV_GEN_DBYTE); |
1008 | |||
1009 | DUMPCOREAV(HDMI_CORE_AV_CP_BYTE1); | ||
950 | 1010 | ||
951 | for (i = 0; i < HDMI_CORE_AV_GEN2_DBYTE_NELEMS; i++) | 1011 | for (i = 0; i < HDMI_CORE_AV_GEN2_DBYTE_NELEMS; i++) |
952 | DUMPCOREAV(i, HDMI_CORE_AV_GEN2_DBYTE); | 1012 | DUMPCOREAV2(i, HDMI_CORE_AV_GEN2_DBYTE); |
953 | 1013 | ||
954 | DUMPCORE(HDMI_CORE_AV_ACR_CTRL); | 1014 | DUMPCOREAV(HDMI_CORE_AV_CEC_ADDR_ID); |
955 | DUMPCORE(HDMI_CORE_AV_FREQ_SVAL); | ||
956 | DUMPCORE(HDMI_CORE_AV_N_SVAL1); | ||
957 | DUMPCORE(HDMI_CORE_AV_N_SVAL2); | ||
958 | DUMPCORE(HDMI_CORE_AV_N_SVAL3); | ||
959 | DUMPCORE(HDMI_CORE_AV_CTS_SVAL1); | ||
960 | DUMPCORE(HDMI_CORE_AV_CTS_SVAL2); | ||
961 | DUMPCORE(HDMI_CORE_AV_CTS_SVAL3); | ||
962 | DUMPCORE(HDMI_CORE_AV_CTS_HVAL1); | ||
963 | DUMPCORE(HDMI_CORE_AV_CTS_HVAL2); | ||
964 | DUMPCORE(HDMI_CORE_AV_CTS_HVAL3); | ||
965 | DUMPCORE(HDMI_CORE_AV_AUD_MODE); | ||
966 | DUMPCORE(HDMI_CORE_AV_SPDIF_CTRL); | ||
967 | DUMPCORE(HDMI_CORE_AV_HW_SPDIF_FS); | ||
968 | DUMPCORE(HDMI_CORE_AV_SWAP_I2S); | ||
969 | DUMPCORE(HDMI_CORE_AV_SPDIF_ERTH); | ||
970 | DUMPCORE(HDMI_CORE_AV_I2S_IN_MAP); | ||
971 | DUMPCORE(HDMI_CORE_AV_I2S_IN_CTRL); | ||
972 | DUMPCORE(HDMI_CORE_AV_I2S_CHST0); | ||
973 | DUMPCORE(HDMI_CORE_AV_I2S_CHST1); | ||
974 | DUMPCORE(HDMI_CORE_AV_I2S_CHST2); | ||
975 | DUMPCORE(HDMI_CORE_AV_I2S_CHST4); | ||
976 | DUMPCORE(HDMI_CORE_AV_I2S_CHST5); | ||
977 | DUMPCORE(HDMI_CORE_AV_ASRC); | ||
978 | DUMPCORE(HDMI_CORE_AV_I2S_IN_LEN); | ||
979 | DUMPCORE(HDMI_CORE_AV_HDMI_CTRL); | ||
980 | DUMPCORE(HDMI_CORE_AV_AUDO_TXSTAT); | ||
981 | DUMPCORE(HDMI_CORE_AV_AUD_PAR_BUSCLK_1); | ||
982 | DUMPCORE(HDMI_CORE_AV_AUD_PAR_BUSCLK_2); | ||
983 | DUMPCORE(HDMI_CORE_AV_AUD_PAR_BUSCLK_3); | ||
984 | DUMPCORE(HDMI_CORE_AV_TEST_TXCTRL); | ||
985 | DUMPCORE(HDMI_CORE_AV_DPD); | ||
986 | DUMPCORE(HDMI_CORE_AV_PB_CTRL1); | ||
987 | DUMPCORE(HDMI_CORE_AV_PB_CTRL2); | ||
988 | DUMPCORE(HDMI_CORE_AV_AVI_TYPE); | ||
989 | DUMPCORE(HDMI_CORE_AV_AVI_VERS); | ||
990 | DUMPCORE(HDMI_CORE_AV_AVI_LEN); | ||
991 | DUMPCORE(HDMI_CORE_AV_AVI_CHSUM); | ||
992 | DUMPCORE(HDMI_CORE_AV_SPD_TYPE); | ||
993 | DUMPCORE(HDMI_CORE_AV_SPD_VERS); | ||
994 | DUMPCORE(HDMI_CORE_AV_SPD_LEN); | ||
995 | DUMPCORE(HDMI_CORE_AV_SPD_CHSUM); | ||
996 | DUMPCORE(HDMI_CORE_AV_AUDIO_TYPE); | ||
997 | DUMPCORE(HDMI_CORE_AV_AUDIO_VERS); | ||
998 | DUMPCORE(HDMI_CORE_AV_AUDIO_LEN); | ||
999 | DUMPCORE(HDMI_CORE_AV_AUDIO_CHSUM); | ||
1000 | DUMPCORE(HDMI_CORE_AV_MPEG_TYPE); | ||
1001 | DUMPCORE(HDMI_CORE_AV_MPEG_VERS); | ||
1002 | DUMPCORE(HDMI_CORE_AV_MPEG_LEN); | ||
1003 | DUMPCORE(HDMI_CORE_AV_MPEG_CHSUM); | ||
1004 | DUMPCORE(HDMI_CORE_AV_CP_BYTE1); | ||
1005 | DUMPCORE(HDMI_CORE_AV_CEC_ADDR_ID); | ||
1006 | } | 1015 | } |
1007 | 1016 | ||
1008 | void ti_hdmi_4xxx_phy_dump(struct hdmi_ip_data *ip_data, struct seq_file *s) | 1017 | void ti_hdmi_4xxx_phy_dump(struct hdmi_ip_data *ip_data, struct seq_file *s) |
@@ -1016,9 +1025,8 @@ void ti_hdmi_4xxx_phy_dump(struct hdmi_ip_data *ip_data, struct seq_file *s) | |||
1016 | DUMPPHY(HDMI_TXPHY_PAD_CFG_CTRL); | 1025 | DUMPPHY(HDMI_TXPHY_PAD_CFG_CTRL); |
1017 | } | 1026 | } |
1018 | 1027 | ||
1019 | #if defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI) || \ | 1028 | #if defined(CONFIG_OMAP4_DSS_HDMI_AUDIO) |
1020 | defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI_MODULE) | 1029 | static void ti_hdmi_4xxx_wp_audio_config_format(struct hdmi_ip_data *ip_data, |
1021 | void hdmi_wp_audio_config_format(struct hdmi_ip_data *ip_data, | ||
1022 | struct hdmi_audio_format *aud_fmt) | 1030 | struct hdmi_audio_format *aud_fmt) |
1023 | { | 1031 | { |
1024 | u32 r; | 1032 | u32 r; |
@@ -1037,7 +1045,7 @@ void hdmi_wp_audio_config_format(struct hdmi_ip_data *ip_data, | |||
1037 | hdmi_write_reg(hdmi_wp_base(ip_data), HDMI_WP_AUDIO_CFG, r); | 1045 | hdmi_write_reg(hdmi_wp_base(ip_data), HDMI_WP_AUDIO_CFG, r); |
1038 | } | 1046 | } |
1039 | 1047 | ||
1040 | void hdmi_wp_audio_config_dma(struct hdmi_ip_data *ip_data, | 1048 | static void ti_hdmi_4xxx_wp_audio_config_dma(struct hdmi_ip_data *ip_data, |
1041 | struct hdmi_audio_dma *aud_dma) | 1049 | struct hdmi_audio_dma *aud_dma) |
1042 | { | 1050 | { |
1043 | u32 r; | 1051 | u32 r; |
@@ -1055,7 +1063,7 @@ void hdmi_wp_audio_config_dma(struct hdmi_ip_data *ip_data, | |||
1055 | hdmi_write_reg(hdmi_wp_base(ip_data), HDMI_WP_AUDIO_CTRL, r); | 1063 | hdmi_write_reg(hdmi_wp_base(ip_data), HDMI_WP_AUDIO_CTRL, r); |
1056 | } | 1064 | } |
1057 | 1065 | ||
1058 | void hdmi_core_audio_config(struct hdmi_ip_data *ip_data, | 1066 | static void ti_hdmi_4xxx_core_audio_config(struct hdmi_ip_data *ip_data, |
1059 | struct hdmi_core_audio_config *cfg) | 1067 | struct hdmi_core_audio_config *cfg) |
1060 | { | 1068 | { |
1061 | u32 r; | 1069 | u32 r; |
@@ -1106,27 +1114,33 @@ void hdmi_core_audio_config(struct hdmi_ip_data *ip_data, | |||
1106 | REG_FLD_MOD(av_base, HDMI_CORE_AV_SPDIF_CTRL, | 1114 | REG_FLD_MOD(av_base, HDMI_CORE_AV_SPDIF_CTRL, |
1107 | cfg->fs_override, 1, 1); | 1115 | cfg->fs_override, 1, 1); |
1108 | 1116 | ||
1109 | /* I2S parameters */ | 1117 | /* |
1110 | REG_FLD_MOD(av_base, HDMI_CORE_AV_I2S_CHST4, | 1118 | * Set IEC-60958-3 channel status word. It is passed to the IP |
1111 | cfg->freq_sample, 3, 0); | 1119 | * just as it is received. The user of the driver is responsible |
1112 | 1120 | * for its contents. | |
1121 | */ | ||
1122 | hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST0, | ||
1123 | cfg->iec60958_cfg->status[0]); | ||
1124 | hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST1, | ||
1125 | cfg->iec60958_cfg->status[1]); | ||
1126 | hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST2, | ||
1127 | cfg->iec60958_cfg->status[2]); | ||
1128 | /* yes, this is correct: status[3] goes to CHST4 register */ | ||
1129 | hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST4, | ||
1130 | cfg->iec60958_cfg->status[3]); | ||
1131 | /* yes, this is correct: status[4] goes to CHST5 register */ | ||
1132 | hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST5, | ||
1133 | cfg->iec60958_cfg->status[4]); | ||
1134 | |||
1135 | /* set I2S parameters */ | ||
1113 | r = hdmi_read_reg(av_base, HDMI_CORE_AV_I2S_IN_CTRL); | 1136 | r = hdmi_read_reg(av_base, HDMI_CORE_AV_I2S_IN_CTRL); |
1114 | r = FLD_MOD(r, cfg->i2s_cfg.en_high_bitrate_aud, 7, 7); | ||
1115 | r = FLD_MOD(r, cfg->i2s_cfg.sck_edge_mode, 6, 6); | 1137 | r = FLD_MOD(r, cfg->i2s_cfg.sck_edge_mode, 6, 6); |
1116 | r = FLD_MOD(r, cfg->i2s_cfg.cbit_order, 5, 5); | ||
1117 | r = FLD_MOD(r, cfg->i2s_cfg.vbit, 4, 4); | 1138 | r = FLD_MOD(r, cfg->i2s_cfg.vbit, 4, 4); |
1118 | r = FLD_MOD(r, cfg->i2s_cfg.ws_polarity, 3, 3); | ||
1119 | r = FLD_MOD(r, cfg->i2s_cfg.justification, 2, 2); | 1139 | r = FLD_MOD(r, cfg->i2s_cfg.justification, 2, 2); |
1120 | r = FLD_MOD(r, cfg->i2s_cfg.direction, 1, 1); | 1140 | r = FLD_MOD(r, cfg->i2s_cfg.direction, 1, 1); |
1121 | r = FLD_MOD(r, cfg->i2s_cfg.shift, 0, 0); | 1141 | r = FLD_MOD(r, cfg->i2s_cfg.shift, 0, 0); |
1122 | hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_IN_CTRL, r); | 1142 | hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_IN_CTRL, r); |
1123 | 1143 | ||
1124 | r = hdmi_read_reg(av_base, HDMI_CORE_AV_I2S_CHST5); | ||
1125 | r = FLD_MOD(r, cfg->freq_sample, 7, 4); | ||
1126 | r = FLD_MOD(r, cfg->i2s_cfg.word_length, 3, 1); | ||
1127 | r = FLD_MOD(r, cfg->i2s_cfg.word_max_length, 0, 0); | ||
1128 | hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST5, r); | ||
1129 | |||
1130 | REG_FLD_MOD(av_base, HDMI_CORE_AV_I2S_IN_LEN, | 1144 | REG_FLD_MOD(av_base, HDMI_CORE_AV_I2S_IN_LEN, |
1131 | cfg->i2s_cfg.in_length_bits, 3, 0); | 1145 | cfg->i2s_cfg.in_length_bits, 3, 0); |
1132 | 1146 | ||
@@ -1138,12 +1152,19 @@ void hdmi_core_audio_config(struct hdmi_ip_data *ip_data, | |||
1138 | r = FLD_MOD(r, cfg->en_parallel_aud_input, 2, 2); | 1152 | r = FLD_MOD(r, cfg->en_parallel_aud_input, 2, 2); |
1139 | r = FLD_MOD(r, cfg->en_spdif, 1, 1); | 1153 | r = FLD_MOD(r, cfg->en_spdif, 1, 1); |
1140 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_MODE, r); | 1154 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_MODE, r); |
1155 | |||
1156 | /* Audio channel mappings */ | ||
1157 | /* TODO: Make channel mapping dynamic. For now, map channels | ||
1158 | * in the ALSA order: FL/FR/RL/RR/C/LFE/SL/SR. Remapping is needed as | ||
1159 | * HDMI speaker order is different. See CEA-861 Section 6.6.2. | ||
1160 | */ | ||
1161 | hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_IN_MAP, 0x78); | ||
1162 | REG_FLD_MOD(av_base, HDMI_CORE_AV_SWAP_I2S, 1, 5, 5); | ||
1141 | } | 1163 | } |
1142 | 1164 | ||
1143 | void hdmi_core_audio_infoframe_config(struct hdmi_ip_data *ip_data, | 1165 | static void ti_hdmi_4xxx_core_audio_infoframe_cfg(struct hdmi_ip_data *ip_data, |
1144 | struct hdmi_core_infoframe_audio *info_aud) | 1166 | struct snd_cea_861_aud_if *info_aud) |
1145 | { | 1167 | { |
1146 | u8 val; | ||
1147 | u8 sum = 0, checksum = 0; | 1168 | u8 sum = 0, checksum = 0; |
1148 | void __iomem *av_base = hdmi_av_base(ip_data); | 1169 | void __iomem *av_base = hdmi_av_base(ip_data); |
1149 | 1170 | ||
@@ -1157,24 +1178,23 @@ void hdmi_core_audio_infoframe_config(struct hdmi_ip_data *ip_data, | |||
1157 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUDIO_LEN, 0x0a); | 1178 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUDIO_LEN, 0x0a); |
1158 | sum += 0x84 + 0x001 + 0x00a; | 1179 | sum += 0x84 + 0x001 + 0x00a; |
1159 | 1180 | ||
1160 | val = (info_aud->db1_coding_type << 4) | 1181 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(0), |
1161 | | (info_aud->db1_channel_count - 1); | 1182 | info_aud->db1_ct_cc); |
1162 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(0), val); | 1183 | sum += info_aud->db1_ct_cc; |
1163 | sum += val; | ||
1164 | 1184 | ||
1165 | val = (info_aud->db2_sample_freq << 2) | info_aud->db2_sample_size; | 1185 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(1), |
1166 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(1), val); | 1186 | info_aud->db2_sf_ss); |
1167 | sum += val; | 1187 | sum += info_aud->db2_sf_ss; |
1168 | 1188 | ||
1169 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(2), 0x00); | 1189 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(2), info_aud->db3); |
1190 | sum += info_aud->db3; | ||
1170 | 1191 | ||
1171 | val = info_aud->db4_channel_alloc; | 1192 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(3), info_aud->db4_ca); |
1172 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(3), val); | 1193 | sum += info_aud->db4_ca; |
1173 | sum += val; | ||
1174 | 1194 | ||
1175 | val = (info_aud->db5_downmix_inh << 7) | (info_aud->db5_lsv << 3); | 1195 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(4), |
1176 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(4), val); | 1196 | info_aud->db5_dminh_lsv); |
1177 | sum += val; | 1197 | sum += info_aud->db5_dminh_lsv; |
1178 | 1198 | ||
1179 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(5), 0x00); | 1199 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(5), 0x00); |
1180 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(6), 0x00); | 1200 | hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(6), 0x00); |
@@ -1192,70 +1212,212 @@ void hdmi_core_audio_infoframe_config(struct hdmi_ip_data *ip_data, | |||
1192 | */ | 1212 | */ |
1193 | } | 1213 | } |
1194 | 1214 | ||
1195 | int hdmi_config_audio_acr(struct hdmi_ip_data *ip_data, | 1215 | int ti_hdmi_4xxx_audio_config(struct hdmi_ip_data *ip_data, |
1196 | u32 sample_freq, u32 *n, u32 *cts) | 1216 | struct omap_dss_audio *audio) |
1197 | { | 1217 | { |
1198 | u32 r; | 1218 | struct hdmi_audio_format audio_format; |
1199 | u32 deep_color = 0; | 1219 | struct hdmi_audio_dma audio_dma; |
1200 | u32 pclk = ip_data->cfg.timings.pixel_clock; | 1220 | struct hdmi_core_audio_config core; |
1201 | 1221 | int err, n, cts, channel_count; | |
1202 | if (n == NULL || cts == NULL) | 1222 | unsigned int fs_nr; |
1223 | bool word_length_16b = false; | ||
1224 | |||
1225 | if (!audio || !audio->iec || !audio->cea || !ip_data) | ||
1203 | return -EINVAL; | 1226 | return -EINVAL; |
1227 | |||
1228 | core.iec60958_cfg = audio->iec; | ||
1204 | /* | 1229 | /* |
1205 | * Obtain current deep color configuration. This needed | 1230 | * In the IEC-60958 status word, check if the audio sample word length |
1206 | * to calculate the TMDS clock based on the pixel clock. | 1231 | * is 16-bit as several optimizations can be performed in such case. |
1207 | */ | 1232 | */ |
1208 | r = REG_GET(hdmi_wp_base(ip_data), HDMI_WP_VIDEO_CFG, 1, 0); | 1233 | if (!(audio->iec->status[4] & IEC958_AES4_CON_MAX_WORDLEN_24)) |
1209 | switch (r) { | 1234 | if (audio->iec->status[4] & IEC958_AES4_CON_WORDLEN_20_16) |
1210 | case 1: /* No deep color selected */ | 1235 | word_length_16b = true; |
1211 | deep_color = 100; | 1236 | |
1237 | /* I2S configuration. See Phillips' specification */ | ||
1238 | if (word_length_16b) | ||
1239 | core.i2s_cfg.justification = HDMI_AUDIO_JUSTIFY_LEFT; | ||
1240 | else | ||
1241 | core.i2s_cfg.justification = HDMI_AUDIO_JUSTIFY_RIGHT; | ||
1242 | /* | ||
1243 | * The I2S input word length is twice the lenght given in the IEC-60958 | ||
1244 | * status word. If the word size is greater than | ||
1245 | * 20 bits, increment by one. | ||
1246 | */ | ||
1247 | core.i2s_cfg.in_length_bits = audio->iec->status[4] | ||
1248 | & IEC958_AES4_CON_WORDLEN; | ||
1249 | if (audio->iec->status[4] & IEC958_AES4_CON_MAX_WORDLEN_24) | ||
1250 | core.i2s_cfg.in_length_bits++; | ||
1251 | core.i2s_cfg.sck_edge_mode = HDMI_AUDIO_I2S_SCK_EDGE_RISING; | ||
1252 | core.i2s_cfg.vbit = HDMI_AUDIO_I2S_VBIT_FOR_PCM; | ||
1253 | core.i2s_cfg.direction = HDMI_AUDIO_I2S_MSB_SHIFTED_FIRST; | ||
1254 | core.i2s_cfg.shift = HDMI_AUDIO_I2S_FIRST_BIT_SHIFT; | ||
1255 | |||
1256 | /* convert sample frequency to a number */ | ||
1257 | switch (audio->iec->status[3] & IEC958_AES3_CON_FS) { | ||
1258 | case IEC958_AES3_CON_FS_32000: | ||
1259 | fs_nr = 32000; | ||
1260 | break; | ||
1261 | case IEC958_AES3_CON_FS_44100: | ||
1262 | fs_nr = 44100; | ||
1263 | break; | ||
1264 | case IEC958_AES3_CON_FS_48000: | ||
1265 | fs_nr = 48000; | ||
1212 | break; | 1266 | break; |
1213 | case 2: /* 10-bit deep color selected */ | 1267 | case IEC958_AES3_CON_FS_88200: |
1214 | deep_color = 125; | 1268 | fs_nr = 88200; |
1215 | break; | 1269 | break; |
1216 | case 3: /* 12-bit deep color selected */ | 1270 | case IEC958_AES3_CON_FS_96000: |
1217 | deep_color = 150; | 1271 | fs_nr = 96000; |
1272 | break; | ||
1273 | case IEC958_AES3_CON_FS_176400: | ||
1274 | fs_nr = 176400; | ||
1275 | break; | ||
1276 | case IEC958_AES3_CON_FS_192000: | ||
1277 | fs_nr = 192000; | ||
1218 | break; | 1278 | break; |
1219 | default: | 1279 | default: |
1220 | return -EINVAL; | 1280 | return -EINVAL; |
1221 | } | 1281 | } |
1222 | 1282 | ||
1223 | switch (sample_freq) { | 1283 | err = hdmi_compute_acr(fs_nr, &n, &cts); |
1224 | case 32000: | 1284 | |
1225 | if ((deep_color == 125) && ((pclk == 54054) | 1285 | /* Audio clock regeneration settings */ |
1226 | || (pclk == 74250))) | 1286 | core.n = n; |
1227 | *n = 8192; | 1287 | core.cts = cts; |
1228 | else | 1288 | if (dss_has_feature(FEAT_HDMI_CTS_SWMODE)) { |
1229 | *n = 4096; | 1289 | core.aud_par_busclk = 0; |
1290 | core.cts_mode = HDMI_AUDIO_CTS_MODE_SW; | ||
1291 | core.use_mclk = dss_has_feature(FEAT_HDMI_AUDIO_USE_MCLK); | ||
1292 | } else { | ||
1293 | core.aud_par_busclk = (((128 * 31) - 1) << 8); | ||
1294 | core.cts_mode = HDMI_AUDIO_CTS_MODE_HW; | ||
1295 | core.use_mclk = true; | ||
1296 | } | ||
1297 | |||
1298 | if (core.use_mclk) | ||
1299 | core.mclk_mode = HDMI_AUDIO_MCLK_128FS; | ||
1300 | |||
1301 | /* Audio channels settings */ | ||
1302 | channel_count = (audio->cea->db1_ct_cc & | ||
1303 | CEA861_AUDIO_INFOFRAME_DB1CC) + 1; | ||
1304 | |||
1305 | switch (channel_count) { | ||
1306 | case 2: | ||
1307 | audio_format.active_chnnls_msk = 0x03; | ||
1308 | break; | ||
1309 | case 3: | ||
1310 | audio_format.active_chnnls_msk = 0x07; | ||
1311 | break; | ||
1312 | case 4: | ||
1313 | audio_format.active_chnnls_msk = 0x0f; | ||
1314 | break; | ||
1315 | case 5: | ||
1316 | audio_format.active_chnnls_msk = 0x1f; | ||
1230 | break; | 1317 | break; |
1231 | case 44100: | 1318 | case 6: |
1232 | *n = 6272; | 1319 | audio_format.active_chnnls_msk = 0x3f; |
1233 | break; | 1320 | break; |
1234 | case 48000: | 1321 | case 7: |
1235 | if ((deep_color == 125) && ((pclk == 54054) | 1322 | audio_format.active_chnnls_msk = 0x7f; |
1236 | || (pclk == 74250))) | 1323 | break; |
1237 | *n = 8192; | 1324 | case 8: |
1238 | else | 1325 | audio_format.active_chnnls_msk = 0xff; |
1239 | *n = 6144; | ||
1240 | break; | 1326 | break; |
1241 | default: | 1327 | default: |
1242 | *n = 0; | ||
1243 | return -EINVAL; | 1328 | return -EINVAL; |
1244 | } | 1329 | } |
1245 | 1330 | ||
1246 | /* Calculate CTS. See HDMI 1.3a or 1.4a specifications */ | 1331 | /* |
1247 | *cts = pclk * (*n / 128) * deep_color / (sample_freq / 10); | 1332 | * the HDMI IP needs to enable four stereo channels when transmitting |
1333 | * more than 2 audio channels | ||
1334 | */ | ||
1335 | if (channel_count == 2) { | ||
1336 | audio_format.stereo_channels = HDMI_AUDIO_STEREO_ONECHANNEL; | ||
1337 | core.i2s_cfg.active_sds = HDMI_AUDIO_I2S_SD0_EN; | ||
1338 | core.layout = HDMI_AUDIO_LAYOUT_2CH; | ||
1339 | } else { | ||
1340 | audio_format.stereo_channels = HDMI_AUDIO_STEREO_FOURCHANNELS; | ||
1341 | core.i2s_cfg.active_sds = HDMI_AUDIO_I2S_SD0_EN | | ||
1342 | HDMI_AUDIO_I2S_SD1_EN | HDMI_AUDIO_I2S_SD2_EN | | ||
1343 | HDMI_AUDIO_I2S_SD3_EN; | ||
1344 | core.layout = HDMI_AUDIO_LAYOUT_8CH; | ||
1345 | } | ||
1346 | |||
1347 | core.en_spdif = false; | ||
1348 | /* use sample frequency from channel status word */ | ||
1349 | core.fs_override = true; | ||
1350 | /* enable ACR packets */ | ||
1351 | core.en_acr_pkt = true; | ||
1352 | /* disable direct streaming digital audio */ | ||
1353 | core.en_dsd_audio = false; | ||
1354 | /* use parallel audio interface */ | ||
1355 | core.en_parallel_aud_input = true; | ||
1356 | |||
1357 | /* DMA settings */ | ||
1358 | if (word_length_16b) | ||
1359 | audio_dma.transfer_size = 0x10; | ||
1360 | else | ||
1361 | audio_dma.transfer_size = 0x20; | ||
1362 | audio_dma.block_size = 0xC0; | ||
1363 | audio_dma.mode = HDMI_AUDIO_TRANSF_DMA; | ||
1364 | audio_dma.fifo_threshold = 0x20; /* in number of samples */ | ||
1365 | |||
1366 | /* audio FIFO format settings */ | ||
1367 | if (word_length_16b) { | ||
1368 | audio_format.samples_per_word = HDMI_AUDIO_ONEWORD_TWOSAMPLES; | ||
1369 | audio_format.sample_size = HDMI_AUDIO_SAMPLE_16BITS; | ||
1370 | audio_format.justification = HDMI_AUDIO_JUSTIFY_LEFT; | ||
1371 | } else { | ||
1372 | audio_format.samples_per_word = HDMI_AUDIO_ONEWORD_ONESAMPLE; | ||
1373 | audio_format.sample_size = HDMI_AUDIO_SAMPLE_24BITS; | ||
1374 | audio_format.justification = HDMI_AUDIO_JUSTIFY_RIGHT; | ||
1375 | } | ||
1376 | audio_format.type = HDMI_AUDIO_TYPE_LPCM; | ||
1377 | audio_format.sample_order = HDMI_AUDIO_SAMPLE_LEFT_FIRST; | ||
1378 | /* disable start/stop signals of IEC 60958 blocks */ | ||
1379 | audio_format.en_sig_blk_strt_end = HDMI_AUDIO_BLOCK_SIG_STARTEND_ON; | ||
1380 | |||
1381 | /* configure DMA and audio FIFO format*/ | ||
1382 | ti_hdmi_4xxx_wp_audio_config_dma(ip_data, &audio_dma); | ||
1383 | ti_hdmi_4xxx_wp_audio_config_format(ip_data, &audio_format); | ||
1384 | |||
1385 | /* configure the core*/ | ||
1386 | ti_hdmi_4xxx_core_audio_config(ip_data, &core); | ||
1387 | |||
1388 | /* configure CEA 861 audio infoframe*/ | ||
1389 | ti_hdmi_4xxx_core_audio_infoframe_cfg(ip_data, audio->cea); | ||
1248 | 1390 | ||
1249 | return 0; | 1391 | return 0; |
1250 | } | 1392 | } |
1251 | 1393 | ||
1252 | void ti_hdmi_4xxx_wp_audio_enable(struct hdmi_ip_data *ip_data, bool enable) | 1394 | int ti_hdmi_4xxx_wp_audio_enable(struct hdmi_ip_data *ip_data) |
1395 | { | ||
1396 | REG_FLD_MOD(hdmi_wp_base(ip_data), | ||
1397 | HDMI_WP_AUDIO_CTRL, true, 31, 31); | ||
1398 | return 0; | ||
1399 | } | ||
1400 | |||
1401 | void ti_hdmi_4xxx_wp_audio_disable(struct hdmi_ip_data *ip_data) | ||
1402 | { | ||
1403 | REG_FLD_MOD(hdmi_wp_base(ip_data), | ||
1404 | HDMI_WP_AUDIO_CTRL, false, 31, 31); | ||
1405 | } | ||
1406 | |||
1407 | int ti_hdmi_4xxx_audio_start(struct hdmi_ip_data *ip_data) | ||
1253 | { | 1408 | { |
1254 | REG_FLD_MOD(hdmi_av_base(ip_data), | 1409 | REG_FLD_MOD(hdmi_av_base(ip_data), |
1255 | HDMI_CORE_AV_AUD_MODE, enable, 0, 0); | 1410 | HDMI_CORE_AV_AUD_MODE, true, 0, 0); |
1256 | REG_FLD_MOD(hdmi_wp_base(ip_data), | 1411 | REG_FLD_MOD(hdmi_wp_base(ip_data), |
1257 | HDMI_WP_AUDIO_CTRL, enable, 31, 31); | 1412 | HDMI_WP_AUDIO_CTRL, true, 30, 30); |
1413 | return 0; | ||
1414 | } | ||
1415 | |||
1416 | void ti_hdmi_4xxx_audio_stop(struct hdmi_ip_data *ip_data) | ||
1417 | { | ||
1418 | REG_FLD_MOD(hdmi_av_base(ip_data), | ||
1419 | HDMI_CORE_AV_AUD_MODE, false, 0, 0); | ||
1258 | REG_FLD_MOD(hdmi_wp_base(ip_data), | 1420 | REG_FLD_MOD(hdmi_wp_base(ip_data), |
1259 | HDMI_WP_AUDIO_CTRL, enable, 30, 30); | 1421 | HDMI_WP_AUDIO_CTRL, false, 30, 30); |
1260 | } | 1422 | } |
1261 | #endif | 1423 | #endif |