Merge remote-tracking branches 'asoc/topic/rt5614', 'asoc/topic/rt5645', 'asoc/topic...
[sfrench/cifs-2.6.git] / sound / soc / codecs / rt5514.c
index 28ab9e2bb0518ce1e4ad4dbbf4553bdb2215511e..1b6796c4c471cc536e5d2dc6e3a10fb23d6bff66 100644 (file)
@@ -9,6 +9,7 @@
  * published by the Free Software Foundation.
  */
 
+#include <linux/acpi.h>
 #include <linux/fs.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
@@ -906,9 +907,23 @@ static int rt5514_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
        if (rx_mask || tx_mask)
                val |= RT5514_TDM_MODE;
 
-       if (slots == 4)
+       switch (slots) {
+       case 4:
                val |= RT5514_TDMSLOT_SEL_RX_4CH | RT5514_TDMSLOT_SEL_TX_4CH;
+               break;
+
+       case 6:
+               val |= RT5514_TDMSLOT_SEL_RX_6CH | RT5514_TDMSLOT_SEL_TX_6CH;
+               break;
 
+       case 8:
+               val |= RT5514_TDMSLOT_SEL_RX_8CH | RT5514_TDMSLOT_SEL_TX_8CH;
+               break;
+
+       case 2:
+       default:
+               break;
+       }
 
        switch (slot_width) {
        case 20:
@@ -919,6 +934,10 @@ static int rt5514_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
                val |= RT5514_CH_LEN_RX_24 | RT5514_CH_LEN_TX_24;
                break;
 
+       case 25:
+               val |= RT5514_TDM_MODE2;
+               break;
+
        case 32:
                val |= RT5514_CH_LEN_RX_32 | RT5514_CH_LEN_TX_32;
                break;
@@ -930,7 +949,8 @@ static int rt5514_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
 
        regmap_update_bits(rt5514->regmap, RT5514_I2S_CTRL1, RT5514_TDM_MODE |
                RT5514_TDMSLOT_SEL_RX_MASK | RT5514_TDMSLOT_SEL_TX_MASK |
-               RT5514_CH_LEN_RX_MASK | RT5514_CH_LEN_TX_MASK, val);
+               RT5514_CH_LEN_RX_MASK | RT5514_CH_LEN_TX_MASK |
+               RT5514_TDM_MODE2, val);
 
        return 0;
 }
@@ -1076,6 +1096,14 @@ static const struct of_device_id rt5514_of_match[] = {
 MODULE_DEVICE_TABLE(of, rt5514_of_match);
 #endif
 
+#ifdef CONFIG_ACPI
+static struct acpi_device_id rt5514_acpi_match[] = {
+       { "10EC5514", 0},
+       {},
+};
+MODULE_DEVICE_TABLE(acpi, rt5514_acpi_match);
+#endif
+
 static int rt5514_parse_dt(struct rt5514_priv *rt5514, struct device *dev)
 {
        device_property_read_u32(dev, "realtek,dmic-init-delay-ms",
@@ -1179,6 +1207,7 @@ static const struct dev_pm_ops rt5514_i2_pm_ops = {
 static struct i2c_driver rt5514_i2c_driver = {
        .driver = {
                .name = "rt5514",
+               .acpi_match_table = ACPI_PTR(rt5514_acpi_match),
                .of_match_table = of_match_ptr(rt5514_of_match),
                .pm = &rt5514_i2_pm_ops,
        },