Merge remote-tracking branch 'asoc/topic/rt298' into asoc-next
authorMark Brown <broonie@kernel.org>
Fri, 27 May 2016 12:45:50 +0000 (13:45 +0100)
committerMark Brown <broonie@kernel.org>
Fri, 27 May 2016 12:45:50 +0000 (13:45 +0100)
1  2 
sound/soc/codecs/rt298.c

diff --combined sound/soc/codecs/rt298.c
index a1aaffc2086272afa932d8137522c383f4ac1377,68cf8d5a174f49cdb8db644cc3c675c002ecfc90..f80cfe4d2ef2f050e1b3d43103fcadc789144ce1
@@@ -17,7 -17,6 +17,7 @@@
  #include <linux/i2c.h>
  #include <linux/platform_device.h>
  #include <linux/spi/spi.h>
 +#include <linux/dmi.h>
  #include <linux/acpi.h>
  #include <sound/core.h>
  #include <sound/pcm.h>
@@@ -276,6 -275,8 +276,8 @@@ static int rt298_jack_detect(struct rt2
                } else {
                        *mic = false;
                        regmap_write(rt298->regmap, RT298_SET_MIC1, 0x20);
+                       regmap_update_bits(rt298->regmap,
+                               RT298_CBJ_CTRL1, 0x0400, 0x0000);
                }
        } else {
                regmap_read(rt298->regmap, RT298_GET_HP_SENSE, &buf);
@@@ -482,6 -483,26 +484,26 @@@ static int rt298_adc_event(struct snd_s
                snd_soc_update_bits(codec,
                        VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, nid, 0),
                        0x7080, 0x7000);
+                /* If MCLK doesn't exist, reset AD filter */
+               if (!(snd_soc_read(codec, RT298_VAD_CTRL) & 0x200)) {
+                       pr_info("NO MCLK\n");
+                       switch (nid) {
+                       case RT298_ADC_IN1:
+                               snd_soc_update_bits(codec,
+                                       RT298_D_FILTER_CTRL, 0x2, 0x2);
+                               mdelay(10);
+                               snd_soc_update_bits(codec,
+                                       RT298_D_FILTER_CTRL, 0x2, 0x0);
+                               break;
+                       case RT298_ADC_IN2:
+                               snd_soc_update_bits(codec,
+                                       RT298_D_FILTER_CTRL, 0x4, 0x4);
+                               mdelay(10);
+                               snd_soc_update_bits(codec,
+                                       RT298_D_FILTER_CTRL, 0x4, 0x0);
+                               break;
+                       }
+               }
                break;
        case SND_SOC_DAPM_PRE_PMD:
                snd_soc_update_bits(codec,
@@@ -520,30 -541,12 +542,12 @@@ static int rt298_mic1_event(struct snd_
        return 0;
  }
  
- static int rt298_vref_event(struct snd_soc_dapm_widget *w,
-                            struct snd_kcontrol *kcontrol, int event)
- {
-       struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
-       switch (event) {
-       case SND_SOC_DAPM_PRE_PMU:
-               snd_soc_update_bits(codec,
-                       RT298_CBJ_CTRL1, 0x0400, 0x0000);
-               mdelay(50);
-               break;
-       default:
-               return 0;
-       }
-       return 0;
- }
  static const struct snd_soc_dapm_widget rt298_dapm_widgets[] = {
  
        SND_SOC_DAPM_SUPPLY_S("HV", 1, RT298_POWER_CTRL1,
                12, 1, NULL, 0),
        SND_SOC_DAPM_SUPPLY("VREF", RT298_POWER_CTRL1,
-               0, 1, rt298_vref_event, SND_SOC_DAPM_PRE_PMU),
+               0, 1, NULL, 0),
        SND_SOC_DAPM_SUPPLY_S("BG_MBIAS", 1, RT298_POWER_CTRL2,
                1, 0, NULL, 0),
        SND_SOC_DAPM_SUPPLY_S("LDO1", 1, RT298_POWER_CTRL2,
@@@ -934,18 -937,9 +938,9 @@@ static int rt298_set_bias_level(struct 
                }
                break;
  
-       case SND_SOC_BIAS_ON:
-               mdelay(30);
-               snd_soc_update_bits(codec,
-                       RT298_CBJ_CTRL1, 0x0400, 0x0400);
-               break;
        case SND_SOC_BIAS_STANDBY:
                snd_soc_write(codec,
                        RT298_SET_AUDIO_POWER, AC_PWRST_D3);
-               snd_soc_update_bits(codec,
-                       RT298_CBJ_CTRL1, 0x0400, 0x0000);
                break;
  
        default:
@@@ -1133,17 -1127,6 +1128,17 @@@ static const struct acpi_device_id rt29
  };
  MODULE_DEVICE_TABLE(acpi, rt298_acpi_match);
  
 +static const struct dmi_system_id force_combo_jack_table[] = {
 +      {
 +              .ident = "Intel Broxton P",
 +              .matches = {
 +                      DMI_MATCH(DMI_SYS_VENDOR, "Intel Corp"),
 +                      DMI_MATCH(DMI_PRODUCT_NAME, "Broxton P")
 +              }
 +      },
 +      { }
 +};
 +
  static int rt298_i2c_probe(struct i2c_client *i2c,
                           const struct i2c_device_id *id)
  {
  
        /* enable jack combo mode on supported devices */
        acpiid = acpi_match_device(dev->driver->acpi_match_table, dev);
 -      if (acpiid) {
 +      if (acpiid && acpiid->driver_data) {
                rt298->pdata = *(struct rt298_platform_data *)
                                acpiid->driver_data;
        }
  
 +      if (dmi_check_system(force_combo_jack_table)) {
 +              rt298->pdata.cbj_en = true;
 +              rt298->pdata.gpio2_en = false;
 +      }
 +
        /* VREF Charging */
        regmap_update_bits(rt298->regmap, 0x04, 0x80, 0x80);
        regmap_update_bits(rt298->regmap, 0x1b, 0x860, 0x860);
This page took 0.028316 seconds and 5 git commands to generate.