ASoC: rt5640: Add RT5642 ACPI ID for Intel Baytrail
[linux-2.6-block.git] / sound / soc / codecs / rt5640.c
index f1ec6e6bd08aced4be7c38d868ccba94a655c5f7..1ff726c292491eaf14f09ad235e779b65bca0041 100644 (file)
@@ -1906,6 +1906,32 @@ static int rt5640_set_bias_level(struct snd_soc_codec *codec,
        return 0;
 }
 
+int rt5640_dmic_enable(struct snd_soc_codec *codec,
+                      bool dmic1_data_pin, bool dmic2_data_pin)
+{
+       struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
+
+       regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1,
+               RT5640_GP2_PIN_MASK, RT5640_GP2_PIN_DMIC1_SCL);
+
+       if (dmic1_data_pin) {
+               regmap_update_bits(rt5640->regmap, RT5640_DMIC,
+                       RT5640_DMIC_1_DP_MASK, RT5640_DMIC_1_DP_GPIO3);
+               regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1,
+                       RT5640_GP3_PIN_MASK, RT5640_GP3_PIN_DMIC1_SDA);
+       }
+
+       if (dmic2_data_pin) {
+               regmap_update_bits(rt5640->regmap, RT5640_DMIC,
+                       RT5640_DMIC_2_DP_MASK, RT5640_DMIC_2_DP_GPIO4);
+               regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1,
+                       RT5640_GP4_PIN_MASK, RT5640_GP4_PIN_DMIC2_SDA);
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(rt5640_dmic_enable);
+
 static int rt5640_probe(struct snd_soc_codec *codec)
 {
        struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
@@ -1945,6 +1971,10 @@ static int rt5640_probe(struct snd_soc_codec *codec)
                return -ENODEV;
        }
 
+       if (rt5640->pdata.dmic_en)
+               rt5640_dmic_enable(codec, rt5640->pdata.dmic1_data_pin,
+                                         rt5640->pdata.dmic2_data_pin);
+
        return 0;
 }
 
@@ -2094,6 +2124,7 @@ MODULE_DEVICE_TABLE(of, rt5640_of_match);
 static struct acpi_device_id rt5640_acpi_match[] = {
        { "INT33CA", 0 },
        { "10EC5640", 0 },
+       { "10EC5642", 0 },
        { },
 };
 MODULE_DEVICE_TABLE(acpi, rt5640_acpi_match);
@@ -2195,25 +2226,6 @@ static int rt5640_i2c_probe(struct i2c_client *i2c,
                regmap_update_bits(rt5640->regmap, RT5640_IN3_IN4,
                                        RT5640_IN_DF2, RT5640_IN_DF2);
 
-       if (rt5640->pdata.dmic_en) {
-               regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1,
-                       RT5640_GP2_PIN_MASK, RT5640_GP2_PIN_DMIC1_SCL);
-
-               if (rt5640->pdata.dmic1_data_pin) {
-                       regmap_update_bits(rt5640->regmap, RT5640_DMIC,
-                               RT5640_DMIC_1_DP_MASK, RT5640_DMIC_1_DP_GPIO3);
-                       regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1,
-                               RT5640_GP3_PIN_MASK, RT5640_GP3_PIN_DMIC1_SDA);
-               }
-
-               if (rt5640->pdata.dmic2_data_pin) {
-                       regmap_update_bits(rt5640->regmap, RT5640_DMIC,
-                               RT5640_DMIC_2_DP_MASK, RT5640_DMIC_2_DP_GPIO4);
-                       regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1,
-                               RT5640_GP4_PIN_MASK, RT5640_GP4_PIN_DMIC2_SDA);
-               }
-       }
-
        rt5640->hp_mute = 1;
 
        return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5640,