diff options
Diffstat (limited to 'sound/soc/codecs/rt5514.c')
-rw-r--r-- | sound/soc/codecs/rt5514.c | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/sound/soc/codecs/rt5514.c b/sound/soc/codecs/rt5514.c index f91221b1ddf0..1b6796c4c471 100644 --- a/sound/soc/codecs/rt5514.c +++ b/sound/soc/codecs/rt5514.c | |||
@@ -9,6 +9,7 @@ | |||
9 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/acpi.h> | ||
12 | #include <linux/fs.h> | 13 | #include <linux/fs.h> |
13 | #include <linux/module.h> | 14 | #include <linux/module.h> |
14 | #include <linux/moduleparam.h> | 15 | #include <linux/moduleparam.h> |
@@ -395,14 +396,14 @@ static const char * const rt5514_dmic_src[] = { | |||
395 | "DMIC1", "DMIC2" | 396 | "DMIC1", "DMIC2" |
396 | }; | 397 | }; |
397 | 398 | ||
398 | static const SOC_ENUM_SINGLE_DECL( | 399 | static SOC_ENUM_SINGLE_DECL( |
399 | rt5514_stereo1_dmic_enum, RT5514_DIG_SOURCE_CTRL, | 400 | rt5514_stereo1_dmic_enum, RT5514_DIG_SOURCE_CTRL, |
400 | RT5514_AD0_DMIC_INPUT_SEL_SFT, rt5514_dmic_src); | 401 | RT5514_AD0_DMIC_INPUT_SEL_SFT, rt5514_dmic_src); |
401 | 402 | ||
402 | static const struct snd_kcontrol_new rt5514_sto1_dmic_mux = | 403 | static const struct snd_kcontrol_new rt5514_sto1_dmic_mux = |
403 | SOC_DAPM_ENUM("Stereo1 DMIC Source", rt5514_stereo1_dmic_enum); | 404 | SOC_DAPM_ENUM("Stereo1 DMIC Source", rt5514_stereo1_dmic_enum); |
404 | 405 | ||
405 | static const SOC_ENUM_SINGLE_DECL( | 406 | static SOC_ENUM_SINGLE_DECL( |
406 | rt5514_stereo2_dmic_enum, RT5514_DIG_SOURCE_CTRL, | 407 | rt5514_stereo2_dmic_enum, RT5514_DIG_SOURCE_CTRL, |
407 | RT5514_AD1_DMIC_INPUT_SEL_SFT, rt5514_dmic_src); | 408 | RT5514_AD1_DMIC_INPUT_SEL_SFT, rt5514_dmic_src); |
408 | 409 | ||
@@ -906,9 +907,23 @@ static int rt5514_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, | |||
906 | if (rx_mask || tx_mask) | 907 | if (rx_mask || tx_mask) |
907 | val |= RT5514_TDM_MODE; | 908 | val |= RT5514_TDM_MODE; |
908 | 909 | ||
909 | if (slots == 4) | 910 | switch (slots) { |
911 | case 4: | ||
910 | val |= RT5514_TDMSLOT_SEL_RX_4CH | RT5514_TDMSLOT_SEL_TX_4CH; | 912 | val |= RT5514_TDMSLOT_SEL_RX_4CH | RT5514_TDMSLOT_SEL_TX_4CH; |
913 | break; | ||
914 | |||
915 | case 6: | ||
916 | val |= RT5514_TDMSLOT_SEL_RX_6CH | RT5514_TDMSLOT_SEL_TX_6CH; | ||
917 | break; | ||
911 | 918 | ||
919 | case 8: | ||
920 | val |= RT5514_TDMSLOT_SEL_RX_8CH | RT5514_TDMSLOT_SEL_TX_8CH; | ||
921 | break; | ||
922 | |||
923 | case 2: | ||
924 | default: | ||
925 | break; | ||
926 | } | ||
912 | 927 | ||
913 | switch (slot_width) { | 928 | switch (slot_width) { |
914 | case 20: | 929 | case 20: |
@@ -919,6 +934,10 @@ static int rt5514_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, | |||
919 | val |= RT5514_CH_LEN_RX_24 | RT5514_CH_LEN_TX_24; | 934 | val |= RT5514_CH_LEN_RX_24 | RT5514_CH_LEN_TX_24; |
920 | break; | 935 | break; |
921 | 936 | ||
937 | case 25: | ||
938 | val |= RT5514_TDM_MODE2; | ||
939 | break; | ||
940 | |||
922 | case 32: | 941 | case 32: |
923 | val |= RT5514_CH_LEN_RX_32 | RT5514_CH_LEN_TX_32; | 942 | val |= RT5514_CH_LEN_RX_32 | RT5514_CH_LEN_TX_32; |
924 | break; | 943 | break; |
@@ -930,7 +949,8 @@ static int rt5514_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, | |||
930 | 949 | ||
931 | regmap_update_bits(rt5514->regmap, RT5514_I2S_CTRL1, RT5514_TDM_MODE | | 950 | regmap_update_bits(rt5514->regmap, RT5514_I2S_CTRL1, RT5514_TDM_MODE | |
932 | RT5514_TDMSLOT_SEL_RX_MASK | RT5514_TDMSLOT_SEL_TX_MASK | | 951 | RT5514_TDMSLOT_SEL_RX_MASK | RT5514_TDMSLOT_SEL_TX_MASK | |
933 | RT5514_CH_LEN_RX_MASK | RT5514_CH_LEN_TX_MASK, val); | 952 | RT5514_CH_LEN_RX_MASK | RT5514_CH_LEN_TX_MASK | |
953 | RT5514_TDM_MODE2, val); | ||
934 | 954 | ||
935 | return 0; | 955 | return 0; |
936 | } | 956 | } |
@@ -1076,6 +1096,14 @@ static const struct of_device_id rt5514_of_match[] = { | |||
1076 | MODULE_DEVICE_TABLE(of, rt5514_of_match); | 1096 | MODULE_DEVICE_TABLE(of, rt5514_of_match); |
1077 | #endif | 1097 | #endif |
1078 | 1098 | ||
1099 | #ifdef CONFIG_ACPI | ||
1100 | static struct acpi_device_id rt5514_acpi_match[] = { | ||
1101 | { "10EC5514", 0}, | ||
1102 | {}, | ||
1103 | }; | ||
1104 | MODULE_DEVICE_TABLE(acpi, rt5514_acpi_match); | ||
1105 | #endif | ||
1106 | |||
1079 | static int rt5514_parse_dt(struct rt5514_priv *rt5514, struct device *dev) | 1107 | static int rt5514_parse_dt(struct rt5514_priv *rt5514, struct device *dev) |
1080 | { | 1108 | { |
1081 | device_property_read_u32(dev, "realtek,dmic-init-delay-ms", | 1109 | device_property_read_u32(dev, "realtek,dmic-init-delay-ms", |
@@ -1179,6 +1207,7 @@ static const struct dev_pm_ops rt5514_i2_pm_ops = { | |||
1179 | static struct i2c_driver rt5514_i2c_driver = { | 1207 | static struct i2c_driver rt5514_i2c_driver = { |
1180 | .driver = { | 1208 | .driver = { |
1181 | .name = "rt5514", | 1209 | .name = "rt5514", |
1210 | .acpi_match_table = ACPI_PTR(rt5514_acpi_match), | ||
1182 | .of_match_table = of_match_ptr(rt5514_of_match), | 1211 | .of_match_table = of_match_ptr(rt5514_of_match), |
1183 | .pm = &rt5514_i2_pm_ops, | 1212 | .pm = &rt5514_i2_pm_ops, |
1184 | }, | 1213 | }, |