aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/rt5514.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/codecs/rt5514.c')
-rw-r--r--sound/soc/codecs/rt5514.c37
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
398static const SOC_ENUM_SINGLE_DECL( 399static 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
402static const struct snd_kcontrol_new rt5514_sto1_dmic_mux = 403static 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
405static const SOC_ENUM_SINGLE_DECL( 406static 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[] = {
1076MODULE_DEVICE_TABLE(of, rt5514_of_match); 1096MODULE_DEVICE_TABLE(of, rt5514_of_match);
1077#endif 1097#endif
1078 1098
1099#ifdef CONFIG_ACPI
1100static struct acpi_device_id rt5514_acpi_match[] = {
1101 { "10EC5514", 0},
1102 {},
1103};
1104MODULE_DEVICE_TABLE(acpi, rt5514_acpi_match);
1105#endif
1106
1079static int rt5514_parse_dt(struct rt5514_priv *rt5514, struct device *dev) 1107static 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 = {
1179static struct i2c_driver rt5514_i2c_driver = { 1207static 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 },