]> Git Repo - linux.git/commitdiff
Merge tag 'asoc-fix-v5.5-rc2' of https://git.kernel.org/pub/scm/linux/kernel/git...
authorTakashi Iwai <[email protected]>
Tue, 17 Dec 2019 13:18:32 +0000 (14:18 +0100)
committerTakashi Iwai <[email protected]>
Tue, 17 Dec 2019 13:18:32 +0000 (14:18 +0100)
ASoC: Fixes for v5.5

A collection of fixes since the merge window, mostly driver specific but
there's a few in the core that clean up fallout from the refactorings
done in the last cycle.

1  2 
sound/soc/codecs/rt5682.c
sound/soc/codecs/wm8904.c
sound/soc/intel/boards/bytcr_rt5640.c
sound/soc/soc-pcm.c

index b1713fffa3eb925f3d79f6d23b2c2bbb2bd38ddd,9feba9a24501fdec894224bfc6519a4e8d46f819..ae6f6121bc1b0ffadef6f57828b46b0fe89da958
@@@ -73,6 -73,7 +73,7 @@@ struct rt5682_priv 
  static const struct reg_sequence patch_list[] = {
        {RT5682_HP_IMP_SENS_CTRL_19, 0x1000},
        {RT5682_DAC_ADC_DIG_VOL1, 0xa020},
+       {RT5682_I2C_CTRL, 0x000f},
  };
  
  static const struct reg_default rt5682_reg[] = {
@@@ -1003,7 -1004,6 +1004,7 @@@ static int rt5682_set_jack_detect(struc
                                   RT5682_JD1_EN_MASK, RT5682_JD1_DIS);
                regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL,
                                   RT5682_POW_JDH | RT5682_POW_JDL, 0);
 +              cancel_delayed_work_sync(&rt5682->jack_detect_work);
                return 0;
        }
  
@@@ -1464,6 -1464,28 +1465,6 @@@ static const struct snd_kcontrol_new hp
        SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5682_HP_CTRL_1,
                                        RT5682_R_MUTE_SFT, 1, 1);
  
 -static int rt5682_charge_pump_event(struct snd_soc_dapm_widget *w,
 -      struct snd_kcontrol *kcontrol, int event)
 -{
 -      struct snd_soc_component *component =
 -              snd_soc_dapm_to_component(w->dapm);
 -
 -      switch (event) {
 -      case SND_SOC_DAPM_PRE_PMU:
 -              snd_soc_component_update_bits(component,
 -                      RT5682_HP_CHARGE_PUMP_1, RT5682_PM_HP_MASK, RT5682_PM_HP_HV);
 -              break;
 -      case SND_SOC_DAPM_POST_PMD:
 -              snd_soc_component_update_bits(component,
 -                      RT5682_HP_CHARGE_PUMP_1, RT5682_PM_HP_MASK, RT5682_PM_HP_LV);
 -              break;
 -      default:
 -              return 0;
 -      }
 -
 -      return 0;
 -}
 -
  static int rt5682_hp_event(struct snd_soc_dapm_widget *w,
        struct snd_kcontrol *kcontrol, int event)
  {
@@@ -1747,7 -1769,8 +1748,7 @@@ static const struct snd_soc_dapm_widge
        SND_SOC_DAPM_SUPPLY("HP Amp R", RT5682_PWR_ANLG_1,
                RT5682_PWR_HA_R_BIT, 0, NULL, 0),
        SND_SOC_DAPM_SUPPLY_S("Charge Pump", 1, RT5682_DEPOP_1,
 -              RT5682_PUMP_EN_SFT, 0, rt5682_charge_pump_event,
 -              SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
 +              RT5682_PUMP_EN_SFT, 0, NULL, 0),
        SND_SOC_DAPM_SUPPLY_S("Capless", 2, RT5682_DEPOP_1,
                RT5682_CAPLESS_EN_SFT, 0, NULL, 0),
  
@@@ -2474,6 -2497,7 +2475,7 @@@ static void rt5682_calibrate(struct rt5
        mutex_lock(&rt5682->calibrate_mutex);
  
        rt5682_reset(rt5682->regmap);
+       regmap_write(rt5682->regmap, RT5682_I2C_CTRL, 0x000f);
        regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0xa2af);
        usleep_range(15000, 20000);
        regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0xf2af);
@@@ -2647,8 -2671,6 +2649,8 @@@ static int rt5682_i2c_probe(struct i2c_
                        RT5682_HPA_CP_BIAS_CTRL_MASK, RT5682_HPA_CP_BIAS_3UA);
        regmap_update_bits(rt5682->regmap, RT5682_CHARGE_PUMP_1,
                        RT5682_CP_CLK_HP_MASK, RT5682_CP_CLK_HP_300KHZ);
 +      regmap_update_bits(rt5682->regmap, RT5682_HP_CHARGE_PUMP_1,
 +                      RT5682_PM_HP_MASK, RT5682_PM_HP_HV);
  
        INIT_DELAYED_WORK(&rt5682->jack_detect_work,
                                rt5682_jack_detect_handler);
index 7d7ea15d73e0a677c61b094fe1e91b592378a7f7,d191d81850ee89d8d6a4031557c9f48bd9325ecd..5ffbaddd6e499579ef98d3c35b146ab645fc2c4b
@@@ -1806,6 -1806,12 +1806,12 @@@ static int wm8904_set_sysclk(struct snd
  
        switch (clk_id) {
        case WM8904_CLK_AUTO:
+               /* We don't have any rate constraints, so just ignore the
+                * request to disable constraining.
+                */
+               if (!freq)
+                       return 0;
                mclk_freq = clk_get_rate(priv->mclk);
                /* enable FLL if a different sysclk is desired */
                if (mclk_freq != freq) {
@@@ -1933,7 -1939,6 +1939,7 @@@ static int wm8904_set_bias_level(struc
                snd_soc_component_update_bits(component, WM8904_BIAS_CONTROL_0,
                                    WM8904_BIAS_ENA, 0);
  
 +              snd_soc_component_write(component, WM8904_SW_RESET_AND_ID, 0);
                regcache_cache_only(wm8904->regmap, true);
                regcache_mark_dirty(wm8904->regmap);
  
index dd2b5ad08659107f41184234086eb81b10608554,cb511ea3b77105c4f68f1e85c217b6d0977ba345..243f683bc02a7361fb89ff2eaa7ab1f6e1ab751c
@@@ -405,12 -405,10 +405,12 @@@ static const struct dmi_system_id byt_r
                        DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW5-012"),
                },
 -              .driver_data = (void *)(BYT_RT5640_IN1_MAP |
 -                                               BYT_RT5640_MCLK_EN |
 -                                               BYT_RT5640_SSP0_AIF1),
 -
 +              .driver_data = (void *)(BYT_RT5640_DMIC1_MAP |
 +                                      BYT_RT5640_JD_SRC_JD2_IN4N |
 +                                      BYT_RT5640_OVCD_TH_2000UA |
 +                                      BYT_RT5640_OVCD_SF_0P75 |
 +                                      BYT_RT5640_SSP0_AIF1 |
 +                                      BYT_RT5640_MCLK_EN),
        },
        {
                .matches = {
                                        BYT_RT5640_MCLK_EN),
        },
        {
+               /* Teclast X89 */
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "TECLAST"),
                        DMI_MATCH(DMI_BOARD_NAME, "tPAD"),
                },
                .driver_data = (void *)(BYT_RT5640_IN3_MAP |
-                                       BYT_RT5640_MCLK_EN |
-                                       BYT_RT5640_SSP0_AIF1),
+                                       BYT_RT5640_JD_SRC_JD1_IN4P |
+                                       BYT_RT5640_OVCD_TH_2000UA |
+                                       BYT_RT5640_OVCD_SF_1P0 |
+                                       BYT_RT5640_SSP0_AIF1 |
+                                       BYT_RT5640_MCLK_EN),
        },
        {       /* Toshiba Satellite Click Mini L9W-B */
                .matches = {
diff --combined sound/soc/soc-pcm.c
index 76b7ee637e869780dce61b0f887309692a08849d,b78f6ff2b1d3f5815bf489a5e05887512e1bfdb9..01e7bc03d92f96e9e6b9fc0a16453cd48fdfb8b7
@@@ -637,10 -637,8 +637,8 @@@ out
   * This is to ensure there are no pops or clicks in between any music tracks
   * due to DAPM power cycling.
   */
- static void close_delayed_work(struct work_struct *work)
+ static void close_delayed_work(struct snd_soc_pcm_runtime *rtd)
  {
-       struct snd_soc_pcm_runtime *rtd =
-                       container_of(work, struct snd_soc_pcm_runtime, delayed_work.work);
        struct snd_soc_dai *codec_dai = rtd->codec_dais[0];
  
        mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
        mutex_unlock(&rtd->card->pcm_mutex);
  }
  
- static void codec2codec_close_delayed_work(struct work_struct *work)
+ static void codec2codec_close_delayed_work(struct snd_soc_pcm_runtime *rtd)
  {
        /*
         * Currently nothing to do for c2c links
@@@ -2974,10 -2972,9 +2972,9 @@@ int soc_new_pcm(struct snd_soc_pcm_runt
  
        /* DAPM dai link stream work */
        if (rtd->dai_link->params)
-               INIT_DELAYED_WORK(&rtd->delayed_work,
-                                 codec2codec_close_delayed_work);
+               rtd->close_delayed_work_func = codec2codec_close_delayed_work;
        else
-               INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work);
+               rtd->close_delayed_work_func = close_delayed_work;
  
        pcm->nonatomic = rtd->dai_link->nonatomic;
        rtd->pcm = pcm;
                rtd->ops.hw_free        = dpcm_fe_dai_hw_free;
                rtd->ops.close          = dpcm_fe_dai_close;
                rtd->ops.pointer        = soc_pcm_pointer;
 -              rtd->ops.ioctl          = snd_soc_pcm_component_ioctl;
        } else {
                rtd->ops.open           = soc_pcm_open;
                rtd->ops.hw_params      = soc_pcm_hw_params;
                rtd->ops.hw_free        = soc_pcm_hw_free;
                rtd->ops.close          = soc_pcm_close;
                rtd->ops.pointer        = soc_pcm_pointer;
 -              rtd->ops.ioctl          = snd_soc_pcm_component_ioctl;
        }
  
        for_each_rtd_components(rtd, rtdcom, component) {
                const struct snd_soc_component_driver *drv = component->driver;
  
 +              if (drv->ioctl)
 +                      rtd->ops.ioctl          = snd_soc_pcm_component_ioctl;
 +              if (drv->sync_stop)
 +                      rtd->ops.sync_stop      = snd_soc_pcm_component_sync_stop;
                if (drv->copy_user)
                        rtd->ops.copy_user      = snd_soc_pcm_component_copy_user;
                if (drv->page)
This page took 0.084971 seconds and 4 git commands to generate.