]> Git Repo - linux.git/commitdiff
Merge remote-tracking branch 'asoc/topic/component' into asoc-next
authorMark Brown <[email protected]>
Wed, 21 May 2014 23:23:41 +0000 (00:23 +0100)
committerMark Brown <[email protected]>
Wed, 21 May 2014 23:23:41 +0000 (00:23 +0100)
1  2 
sound/soc/codecs/max98090.c
sound/soc/codecs/wm8962.c
sound/soc/intel/sst-haswell-pcm.c
sound/soc/soc-dapm.c

index c58dce473e55c0cec9968df6c5b444275ec254c5,49d12387ac2fcac80b06dd37cc6c45fe2a464d89..57fc4c315033740e717e6d37acec42b039c98709
@@@ -255,7 -255,6 +255,7 @@@ static struct reg_default max98090_reg[
  static bool max98090_volatile_register(struct device *dev, unsigned int reg)
  {
        switch (reg) {
 +      case M98090_REG_SOFTWARE_RESET:
        case M98090_REG_DEVICE_STATUS:
        case M98090_REG_JACK_STATUS:
        case M98090_REG_REVISION_ID:
@@@ -390,7 -389,6 +390,7 @@@ static const DECLARE_TLV_DB_SCALE(max98
  static const DECLARE_TLV_DB_SCALE(max98090_alcmakeup_tlv, 0, 100, 0);
  static const DECLARE_TLV_DB_SCALE(max98090_alccomp_tlv, -3100, 100, 0);
  static const DECLARE_TLV_DB_SCALE(max98090_drcexp_tlv, -6600, 100, 0);
 +static const DECLARE_TLV_DB_SCALE(max98090_sdg_tlv, 50, 200, 0);
  
  static const unsigned int max98090_mixout_tlv[] = {
        TLV_DB_RANGE_HEAD(2),
@@@ -428,7 -426,7 +428,7 @@@ static const unsigned int max98090_rcv_
  static int max98090_get_enab_tlv(struct snd_kcontrol *kcontrol,
                                struct snd_ctl_elem_value *ucontrol)
  {
-       struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
+       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
        struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec);
        struct soc_mixer_control *mc =
                (struct soc_mixer_control *)kcontrol->private_value;
  static int max98090_put_enab_tlv(struct snd_kcontrol *kcontrol,
                                struct snd_ctl_elem_value *ucontrol)
  {
-       struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
+       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
        struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec);
        struct soc_mixer_control *mc =
                (struct soc_mixer_control *)kcontrol->private_value;
@@@ -667,7 -665,7 +667,7 @@@ static const struct snd_kcontrol_new ma
        SOC_SINGLE_EXT_TLV("Digital Sidetone Volume",
                M98090_REG_ADC_SIDETONE, M98090_DVST_SHIFT,
                M98090_DVST_NUM - 1, 1, max98090_get_enab_tlv,
 -              max98090_put_enab_tlv, max98090_micboost_tlv),
 +              max98090_put_enab_tlv, max98090_sdg_tlv),
        SOC_SINGLE_TLV("Digital Coarse Volume", M98090_REG_DAI_PLAYBACK_LEVEL,
                M98090_DVG_SHIFT, M98090_DVG_NUM - 1, 0,
                max98090_dvg_tlv),
@@@ -2375,8 -2373,6 +2375,8 @@@ static int max98090_runtime_resume(stru
  
        regcache_cache_only(max98090->regmap, false);
  
 +      max98090_reset(max98090);
 +
        regcache_sync(max98090->regmap);
  
        return 0;
@@@ -2392,34 -2388,9 +2392,34 @@@ static int max98090_runtime_suspend(str
  }
  #endif
  
 +#ifdef CONFIG_PM
 +static int max98090_resume(struct device *dev)
 +{
 +      struct max98090_priv *max98090 = dev_get_drvdata(dev);
 +      unsigned int status;
 +
 +      regcache_mark_dirty(max98090->regmap);
 +
 +      max98090_reset(max98090);
 +
 +      /* clear IRQ status */
 +      regmap_read(max98090->regmap, M98090_REG_DEVICE_STATUS, &status);
 +
 +      regcache_sync(max98090->regmap);
 +
 +      return 0;
 +}
 +
 +static int max98090_suspend(struct device *dev)
 +{
 +      return 0;
 +}
 +#endif
 +
  static const struct dev_pm_ops max98090_pm = {
        SET_RUNTIME_PM_OPS(max98090_runtime_suspend,
                max98090_runtime_resume, NULL)
 +      SET_SYSTEM_SLEEP_PM_OPS(max98090_suspend, max98090_resume)
  };
  
  static const struct i2c_device_id max98090_i2c_id[] = {
index ecd26dd2e442fb2e4019eca0238fdb9edba4a73e,37986c84cbffe011f0e8a484754eb2db03a714b0..4823dffbdc95078f6f1cdffcb63b4a40017e7887
@@@ -154,7 -154,6 +154,7 @@@ static struct reg_default wm8962_reg[] 
        { 40, 0x0000 },   /* R40    - SPKOUTL volume */
        { 41, 0x0000 },   /* R41    - SPKOUTR volume */
  
 +      { 49, 0x0010 },   /* R49    - Class D Control 1 */
        { 51, 0x0003 },   /* R51    - Class D Control 2 */
  
        { 56, 0x0506 },   /* R56    - Clocking 4 */
@@@ -796,6 -795,7 +796,6 @@@ static bool wm8962_volatile_register(st
        case WM8962_ALC2:
        case WM8962_THERMAL_SHUTDOWN_STATUS:
        case WM8962_ADDITIONAL_CONTROL_4:
 -      case WM8962_CLASS_D_CONTROL_1:
        case WM8962_DC_SERVO_6:
        case WM8962_INTERRUPT_STATUS_1:
        case WM8962_INTERRUPT_STATUS_2:
@@@ -1552,7 -1552,7 +1552,7 @@@ static int wm8962_dsp2_ena_get(struct s
                               struct snd_ctl_elem_value *ucontrol)
  {
        int shift = kcontrol->private_value;
-       struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
+       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
        struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
  
        ucontrol->value.integer.value[0] = !!(wm8962->dsp2_ena & 1 << shift);
@@@ -1564,7 -1564,7 +1564,7 @@@ static int wm8962_dsp2_ena_put(struct s
                               struct snd_ctl_elem_value *ucontrol)
  {
        int shift = kcontrol->private_value;
-       struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
+       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
        struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
        int old = wm8962->dsp2_ena;
        int ret = 0;
@@@ -1602,7 -1602,7 +1602,7 @@@ out
  static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol,
                            struct snd_ctl_elem_value *ucontrol)
  {
-       struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
+       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
        int ret;
  
        /* Apply the update (if any) */
  static int wm8962_put_spk_sw(struct snd_kcontrol *kcontrol,
                            struct snd_ctl_elem_value *ucontrol)
  {
-       struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
+       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
        int ret;
  
        /* Apply the update (if any) */
@@@ -2929,22 -2929,13 +2929,22 @@@ static int wm8962_set_fll(struct snd_so
  static int wm8962_mute(struct snd_soc_dai *dai, int mute)
  {
        struct snd_soc_codec *codec = dai->codec;
 -      int val;
 +      int val, ret;
  
        if (mute)
 -              val = WM8962_DAC_MUTE;
 +              val = WM8962_DAC_MUTE | WM8962_DAC_MUTE_ALT;
        else
                val = 0;
  
 +      /**
 +       * The DAC mute bit is mirrored in two registers, update both to keep
 +       * the register cache consistent.
 +       */
 +      ret = snd_soc_update_bits(codec, WM8962_CLASS_D_CONTROL_1,
 +                                WM8962_DAC_MUTE_ALT, val);
 +      if (ret < 0)
 +              return ret;
 +
        return snd_soc_update_bits(codec, WM8962_ADC_DAC_CONTROL_1,
                                   WM8962_DAC_MUTE, val);
  }
index 9d5f64a583a388bd501973c32ae3d5d086d6acc6,67a5eb3c6196e22ed142fa276651e0945b53c022..ce27b507d5ef1d50a2a63822dcc75b0666de1d6e
@@@ -99,7 -99,6 +99,7 @@@ struct hsw_pcm_data 
        struct snd_compr_stream *cstream;
        unsigned int wpos;
        struct mutex mutex;
 +      bool allocated;
  };
  
  /* private data for the driver */
@@@ -108,14 -107,12 +108,14 @@@ struct hsw_priv_data 
        struct sst_hsw *hsw;
  
        /* page tables */
 -      unsigned char *pcm_pg[HSW_PCM_COUNT][2];
 +      struct snd_dma_buffer dmab[HSW_PCM_COUNT][2];
  
        /* DAI data */
        struct hsw_pcm_data pcm[HSW_PCM_COUNT];
  };
  
 +static u32 hsw_notify_pointer(struct sst_hsw_stream *stream, void *data);
 +
  static inline u32 hsw_mixer_to_ipc(unsigned int value)
  {
        if (value >= ARRAY_SIZE(volume_map))
@@@ -139,7 -136,7 +139,7 @@@ static inline unsigned int hsw_ipc_to_m
  static int hsw_stream_volume_put(struct snd_kcontrol *kcontrol,
                                struct snd_ctl_elem_value *ucontrol)
  {
-       struct snd_soc_platform *platform = snd_kcontrol_chip(kcontrol);
+       struct snd_soc_platform *platform = snd_soc_kcontrol_platform(kcontrol);
        struct soc_mixer_control *mc =
                (struct soc_mixer_control *)kcontrol->private_value;
        struct hsw_priv_data *pdata =
  static int hsw_stream_volume_get(struct snd_kcontrol *kcontrol,
                                struct snd_ctl_elem_value *ucontrol)
  {
-       struct snd_soc_platform *platform = snd_kcontrol_chip(kcontrol);
+       struct snd_soc_platform *platform = snd_soc_kcontrol_platform(kcontrol);
        struct soc_mixer_control *mc =
                (struct soc_mixer_control *)kcontrol->private_value;
        struct hsw_priv_data *pdata =
  static int hsw_volume_put(struct snd_kcontrol *kcontrol,
                                struct snd_ctl_elem_value *ucontrol)
  {
-       struct snd_soc_platform *platform = snd_kcontrol_chip(kcontrol);
+       struct snd_soc_platform *platform = snd_soc_kcontrol_platform(kcontrol);
        struct hsw_priv_data *pdata = snd_soc_platform_get_drvdata(platform);
        struct sst_hsw *hsw = pdata->hsw;
        u32 volume;
  static int hsw_volume_get(struct snd_kcontrol *kcontrol,
                                struct snd_ctl_elem_value *ucontrol)
  {
-       struct snd_soc_platform *platform = snd_kcontrol_chip(kcontrol);
+       struct snd_soc_platform *platform = snd_soc_kcontrol_platform(kcontrol);
        struct hsw_priv_data *pdata = snd_soc_platform_get_drvdata(platform);
        struct sst_hsw *hsw = pdata->hsw;
        unsigned int volume = 0;
@@@ -276,26 -273,28 +276,26 @@@ static const struct snd_kcontrol_new hs
  };
  
  /* Create DMA buffer page table for DSP */
 -static int create_adsp_page_table(struct hsw_priv_data *pdata,
 -      struct snd_soc_pcm_runtime *rtd,
 -      unsigned char *dma_area, size_t size, int pcm, int stream)
 +static int create_adsp_page_table(struct snd_pcm_substream *substream,
 +      struct hsw_priv_data *pdata, struct snd_soc_pcm_runtime *rtd,
 +      unsigned char *dma_area, size_t size, int pcm)
  {
 -      int i, pages;
 +      struct snd_dma_buffer *dmab = snd_pcm_get_dma_buf(substream);
 +      int i, pages, stream = substream->stream;
  
 -      if (size % PAGE_SIZE)
 -              pages = (size / PAGE_SIZE) + 1;
 -      else
 -              pages = size / PAGE_SIZE;
 +      pages = snd_sgbuf_aligned_pages(size);
  
        dev_dbg(rtd->dev, "generating page table for %p size 0x%zu pages %d\n",
                dma_area, size, pages);
  
        for (i = 0; i < pages; i++) {
                u32 idx = (((i << 2) + i)) >> 1;
 -              u32 pfn = (virt_to_phys(dma_area + i * PAGE_SIZE)) >> PAGE_SHIFT;
 +              u32 pfn = snd_sgbuf_get_addr(dmab, i * PAGE_SIZE) >> PAGE_SHIFT;
                u32 *pg_table;
  
                dev_dbg(rtd->dev, "pfn i %i idx %d pfn %x\n", i, idx, pfn);
  
 -              pg_table = (u32*)(pdata->pcm_pg[pcm][stream] + idx);
 +              pg_table = (u32 *)(pdata->dmab[pcm][stream].area + idx);
  
                if (i & 1)
                        *pg_table |= (pfn << 4);
@@@ -318,36 -317,12 +318,36 @@@ static int hsw_pcm_hw_params(struct snd
        struct sst_hsw *hsw = pdata->hsw;
        struct sst_module *module_data;
        struct sst_dsp *dsp;
 +      struct snd_dma_buffer *dmab;
        enum sst_hsw_stream_type stream_type;
        enum sst_hsw_stream_path_id path_id;
        u32 rate, bits, map, pages, module_id;
        u8 channels;
        int ret;
  
 +      /* check if we are being called a subsequent time */
 +      if (pcm_data->allocated) {
 +              ret = sst_hsw_stream_reset(hsw, pcm_data->stream);
 +              if (ret < 0)
 +                      dev_dbg(rtd->dev, "error: reset stream failed %d\n",
 +                              ret);
 +
 +              ret = sst_hsw_stream_free(hsw, pcm_data->stream);
 +              if (ret < 0) {
 +                      dev_dbg(rtd->dev, "error: free stream failed %d\n",
 +                              ret);
 +                      return ret;
 +              }
 +              pcm_data->allocated = false;
 +
 +              pcm_data->stream = sst_hsw_stream_new(hsw, rtd->cpu_dai->id,
 +                      hsw_notify_pointer, pcm_data);
 +              if (pcm_data->stream == NULL) {
 +                      dev_err(rtd->dev, "error: failed to create stream\n");
 +                      return -EINVAL;
 +              }
 +      }
 +
        /* stream direction */
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
                path_id = SST_HSW_STREAM_PATH_SSP0_OUT;
                return ret;
        }
  
 -      ret = create_adsp_page_table(pdata, rtd, runtime->dma_area,
 -              runtime->dma_bytes, rtd->cpu_dai->id, substream->stream);
 +      dmab = snd_pcm_get_dma_buf(substream);
 +
 +      ret = create_adsp_page_table(substream, pdata, rtd, runtime->dma_area,
 +              runtime->dma_bytes, rtd->cpu_dai->id);
        if (ret < 0)
                return ret;
  
                pages = runtime->dma_bytes / PAGE_SIZE;
  
        ret = sst_hsw_stream_buffer(hsw, pcm_data->stream,
 -              virt_to_phys(pdata->pcm_pg[rtd->cpu_dai->id][substream->stream]),
 +              pdata->dmab[rtd->cpu_dai->id][substream->stream].addr,
                pages, runtime->dma_bytes, 0,
 -              (u32)(virt_to_phys(runtime->dma_area) >> PAGE_SHIFT));
 +              snd_sgbuf_get_addr(dmab, 0) >> PAGE_SHIFT);
        if (ret < 0) {
                dev_err(rtd->dev, "error: failed to set DMA buffer %d\n", ret);
                return ret;
                dev_err(rtd->dev, "error: failed to commit stream %d\n", ret);
                return ret;
        }
 +      pcm_data->allocated = true;
  
        ret = sst_hsw_stream_pause(hsw, pcm_data->stream, 1);
        if (ret < 0)
@@@ -569,14 -541,12 +569,14 @@@ static snd_pcm_uframes_t hsw_pcm_pointe
        struct hsw_pcm_data *pcm_data = snd_soc_pcm_get_drvdata(rtd);
        struct sst_hsw *hsw = pdata->hsw;
        snd_pcm_uframes_t offset;
 +      uint64_t ppos;
 +      u32 position = sst_hsw_get_dsp_position(hsw, pcm_data->stream);
  
 -      offset = bytes_to_frames(runtime,
 -              sst_hsw_get_dsp_position(hsw, pcm_data->stream));
 +      offset = bytes_to_frames(runtime, position);
 +      ppos = sst_hsw_get_dsp_presentation_position(hsw, pcm_data->stream);
  
 -      dev_dbg(rtd->dev, "PCM: DMA pointer %zu bytes\n",
 -              frames_to_bytes(runtime, (u32)offset));
 +      dev_dbg(rtd->dev, "PCM: DMA pointer %du bytes, pos %llu\n",
 +              position, ppos);
        return offset;
  }
  
@@@ -636,7 -606,6 +636,7 @@@ static int hsw_pcm_close(struct snd_pcm
                dev_dbg(rtd->dev, "error: free stream failed %d\n", ret);
                goto out;
        }
 +      pcm_data->allocated = 0;
        pcm_data->stream = NULL;
  
  out:
@@@ -652,7 -621,7 +652,7 @@@ static struct snd_pcm_ops hsw_pcm_ops 
        .hw_free        = hsw_pcm_hw_free,
        .trigger        = hsw_pcm_trigger,
        .pointer        = hsw_pcm_pointer,
 -      .mmap           = snd_pcm_lib_default_mmap,
 +      .page           = snd_pcm_sgbuf_ops_page,
  };
  
  static void hsw_pcm_free(struct snd_pcm *pcm)
  static int hsw_pcm_new(struct snd_soc_pcm_runtime *rtd)
  {
        struct snd_pcm *pcm = rtd->pcm;
 +      struct snd_soc_platform *platform = rtd->platform;
 +      struct sst_pdata *pdata = dev_get_platdata(platform->dev);
 +      struct device *dev = pdata->dma_dev;
        int ret = 0;
  
 -      ret = dma_coerce_mask_and_coherent(rtd->card->dev, DMA_BIT_MASK(32));
 -      if (ret)
 -              return ret;
 -
        if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream ||
                        pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) {
                ret = snd_pcm_lib_preallocate_pages_for_all(pcm,
 -                      SNDRV_DMA_TYPE_DEV,
 -                      rtd->card->dev,
 +                      SNDRV_DMA_TYPE_DEV_SG,
 +                      dev,
                        hsw_pcm_hardware.buffer_bytes_max,
                        hsw_pcm_hardware.buffer_bytes_max);
                if (ret) {
@@@ -772,14 -742,11 +772,14 @@@ static int hsw_pcm_probe(struct snd_soc
  {
        struct sst_pdata *pdata = dev_get_platdata(platform->dev);
        struct hsw_priv_data *priv_data;
 -      int i;
 +      struct device *dma_dev;
 +      int i, ret = 0;
  
        if (!pdata)
                return -ENODEV;
  
 +      dma_dev = pdata->dma_dev;
 +
        priv_data = devm_kzalloc(platform->dev, sizeof(*priv_data), GFP_KERNEL);
        priv_data->hsw = pdata->dsp;
        snd_soc_platform_set_drvdata(platform, priv_data);
  
                /* playback */
                if (hsw_dais[i].playback.channels_min) {
 -                      priv_data->pcm_pg[i][0] = kzalloc(PAGE_SIZE, GFP_DMA);
 -                      if (priv_data->pcm_pg[i][0] == NULL)
 +                      ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, dma_dev,
 +                              PAGE_SIZE, &priv_data->dmab[i][0]);
 +                      if (ret < 0)
                                goto err;
                }
  
                /* capture */
                if (hsw_dais[i].capture.channels_min) {
 -                      priv_data->pcm_pg[i][1] = kzalloc(PAGE_SIZE, GFP_DMA);
 -                      if (priv_data->pcm_pg[i][1] == NULL)
 +                      ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, dma_dev,
 +                              PAGE_SIZE, &priv_data->dmab[i][1]);
 +                      if (ret < 0)
                                goto err;
                }
        }
  err:
        for (;i >= 0; i--) {
                if (hsw_dais[i].playback.channels_min)
 -                      kfree(priv_data->pcm_pg[i][0]);
 +                      snd_dma_free_pages(&priv_data->dmab[i][0]);
                if (hsw_dais[i].capture.channels_min)
 -                      kfree(priv_data->pcm_pg[i][1]);
 +                      snd_dma_free_pages(&priv_data->dmab[i][1]);
        }
 -      return -ENOMEM;
 +      return ret;
  }
  
  static int hsw_pcm_remove(struct snd_soc_platform *platform)
  
        for (i = 0; i < ARRAY_SIZE(hsw_dais); i++) {
                if (hsw_dais[i].playback.channels_min)
 -                      kfree(priv_data->pcm_pg[i][0]);
 +                      snd_dma_free_pages(&priv_data->dmab[i][0]);
                if (hsw_dais[i].capture.channels_min)
 -                      kfree(priv_data->pcm_pg[i][1]);
 +                      snd_dma_free_pages(&priv_data->dmab[i][1]);
        }
  
        return 0;
diff --combined sound/soc/soc-dapm.c
index 6d6ceee447d559e711ba8eccc2e734953585d9ad,98c1dc6e1152ead7308665867a9c769624bac1c4..cd0a19fcbec98800643da990b758cece1457fe53
@@@ -254,6 -254,7 +254,6 @@@ static int dapm_kcontrol_data_alloc(str
  static void dapm_kcontrol_free(struct snd_kcontrol *kctl)
  {
        struct dapm_kcontrol_data *data = snd_kcontrol_chip(kctl);
 -      kfree(data->widget);
        kfree(data->wlist);
        kfree(data);
  }
@@@ -378,86 -379,24 +378,24 @@@ static void dapm_reset(struct snd_soc_c
  static int soc_widget_read(struct snd_soc_dapm_widget *w, int reg,
        unsigned int *value)
  {
-       if (w->codec) {
-               *value = snd_soc_read(w->codec, reg);
-               return 0;
-       } else if (w->platform) {
-               *value = snd_soc_platform_read(w->platform, reg);
-               return 0;
-       }
-       dev_err(w->dapm->dev, "ASoC: no valid widget read method\n");
-       return -1;
- }
- static int soc_widget_write(struct snd_soc_dapm_widget *w, int reg,
-       unsigned int val)
- {
-       if (w->codec)
-               return snd_soc_write(w->codec, reg, val);
-       else if (w->platform)
-               return snd_soc_platform_write(w->platform, reg, val);
-       dev_err(w->dapm->dev, "ASoC: no valid widget write method\n");
-       return -1;
- }
- static inline void soc_widget_lock(struct snd_soc_dapm_widget *w)
- {
-       if (w->codec && !w->codec->using_regmap)
-               mutex_lock(&w->codec->mutex);
-       else if (w->platform)
-               mutex_lock(&w->platform->mutex);
+       if (!w->dapm->component)
+               return -EIO;
+       return snd_soc_component_read(w->dapm->component, reg, value);
  }
  
- static inline void soc_widget_unlock(struct snd_soc_dapm_widget *w)
+ static int soc_widget_update_bits(struct snd_soc_dapm_widget *w,
+       int reg, unsigned int mask, unsigned int value)
  {
-       if (w->codec && !w->codec->using_regmap)
-               mutex_unlock(&w->codec->mutex);
-       else if (w->platform)
-               mutex_unlock(&w->platform->mutex);
+       if (!w->dapm->component)
+               return -EIO;
+       return snd_soc_component_update_bits_async(w->dapm->component, reg,
+               mask, value);
  }
  
  static void soc_dapm_async_complete(struct snd_soc_dapm_context *dapm)
  {
-       if (dapm->codec && dapm->codec->using_regmap)
-               regmap_async_complete(dapm->codec->control_data);
- }
- static int soc_widget_update_bits_locked(struct snd_soc_dapm_widget *w,
-       unsigned short reg, unsigned int mask, unsigned int value)
- {
-       bool change;
-       unsigned int old, new;
-       int ret;
-       if (w->codec && w->codec->using_regmap) {
-               ret = regmap_update_bits_check_async(w->codec->control_data,
-                                                    reg, mask, value,
-                                                    &change);
-               if (ret != 0)
-                       return ret;
-       } else {
-               soc_widget_lock(w);
-               ret = soc_widget_read(w, reg, &old);
-               if (ret < 0) {
-                       soc_widget_unlock(w);
-                       return ret;
-               }
-               new = (old & ~mask) | (value & mask);
-               change = old != new;
-               if (change) {
-                       ret = soc_widget_write(w, reg, new);
-                       if (ret < 0) {
-                               soc_widget_unlock(w);
-                               return ret;
-                       }
-               }
-               soc_widget_unlock(w);
-       }
-       return change;
+       if (dapm->component)
+               snd_soc_component_async_complete(dapm->component);
  }
  
  /**
@@@ -1132,7 -1071,7 +1070,7 @@@ int dapm_reg_event(struct snd_soc_dapm_
        else
                val = w->off_val;
  
-       soc_widget_update_bits_locked(w, -(w->reg + 1),
+       soc_widget_update_bits(w, -(w->reg + 1),
                            w->mask << w->shift, val << w->shift);
  
        return 0;
@@@ -1428,7 -1367,7 +1366,7 @@@ static void dapm_seq_run_coalesced(stru
                        "pop test : Applying 0x%x/0x%x to %x in %dms\n",
                        value, mask, reg, card->pop_time);
                pop_wait(card->pop_time);
-               soc_widget_update_bits_locked(w, reg, mask, value);
+               soc_widget_update_bits(w, reg, mask, value);
        }
  
        list_for_each_entry(w, pending, power_list) {
@@@ -1574,8 -1513,7 +1512,7 @@@ static void dapm_widget_update(struct s
        if (!w)
                return;
  
-       ret = soc_widget_update_bits_locked(w, update->reg, update->mask,
-                                 update->val);
+       ret = soc_widget_update_bits(w, update->reg, update->mask, update->val);
        if (ret < 0)
                dev_err(w->dapm->dev, "ASoC: %s DAPM update failed: %d\n",
                        w->name, ret);
@@@ -1612,11 -1550,8 +1549,11 @@@ static void dapm_pre_sequence_async(voi
                                "ASoC: Failed to turn on bias: %d\n", ret);
        }
  
 -      /* Prepare for a STADDBY->ON or ON->STANDBY transition */
 -      if (d->bias_level != d->target_bias_level) {
 +      /* Prepare for a transition to ON or away from ON */
 +      if ((d->target_bias_level == SND_SOC_BIAS_ON &&
 +           d->bias_level != SND_SOC_BIAS_ON) ||
 +          (d->target_bias_level != SND_SOC_BIAS_ON &&
 +           d->bias_level == SND_SOC_BIAS_ON)) {
                ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_PREPARE);
                if (ret != 0)
                        dev_err(d->dev,
@@@ -3478,11 -3413,8 +3415,11 @@@ void snd_soc_dapm_connect_dai_link_widg
                cpu_dai = rtd->cpu_dai;
                codec_dai = rtd->codec_dai;
  
 -              /* dynamic FE links have no fixed DAI mapping */
 -              if (rtd->dai_link->dynamic)
 +              /*
 +               * dynamic FE links have no fixed DAI mapping.
 +               * CODEC<->CODEC links have no direct connection.
 +               */
 +              if (rtd->dai_link->dynamic || rtd->dai_link->params)
                        continue;
  
                /* there is no point in connecting BE DAI links with dummies */
This page took 0.148487 seconds and 4 git commands to generate.