]> Git Repo - linux.git/commitdiff
Merge remote-tracking branch 'asoc/fix/fsl' into asoc-linus
authorMark Brown <[email protected]>
Wed, 20 Nov 2013 15:20:31 +0000 (15:20 +0000)
committerMark Brown <[email protected]>
Wed, 20 Nov 2013 15:20:31 +0000 (15:20 +0000)
1  2 
sound/soc/codecs/ab8500-codec.c
sound/soc/codecs/cs42l52.h
sound/soc/codecs/wm5110.c

index 79902179c65738b88c390e4668445f573b93a9d2,21ae8d4fdbfb3a0242502197386577232048d509..1ad92cbf0b24dfba1f97ecad1a8eca1b56940fad
@@@ -126,6 -126,8 +126,6 @@@ struct ab8500_codec_drvdata_dbg 
  
  /* Private data for AB8500 device-driver */
  struct ab8500_codec_drvdata {
 -      struct regmap *regmap;
 -
        /* Sidetone */
        long *sid_fir_values;
        enum sid_state sid_status;
@@@ -166,48 -168,34 +166,48 @@@ static inline const char *amic_type_str
   */
  
  /* Read a register from the audio-bank of AB8500 */
 -static int ab8500_codec_read_reg(void *context, unsigned int reg,
 -                               unsigned int *value)
 +static unsigned int ab8500_codec_read_reg(struct snd_soc_codec *codec,
 +                                      unsigned int reg)
  {
 -      struct device *dev = context;
        int status;
 +      unsigned int value = 0;
  
        u8 value8;
 -      status = abx500_get_register_interruptible(dev, AB8500_AUDIO,
 -                                                 reg, &value8);
 -      *value = (unsigned int)value8;
 +      status = abx500_get_register_interruptible(codec->dev, AB8500_AUDIO,
 +                                              reg, &value8);
 +      if (status < 0) {
 +              dev_err(codec->dev,
 +                      "%s: ERROR: Register (0x%02x:0x%02x) read failed (%d).\n",
 +                      __func__, (u8)AB8500_AUDIO, (u8)reg, status);
 +      } else {
 +              dev_dbg(codec->dev,
 +                      "%s: Read 0x%02x from register 0x%02x:0x%02x\n",
 +                      __func__, value8, (u8)AB8500_AUDIO, (u8)reg);
 +              value = (unsigned int)value8;
 +      }
  
 -      return status;
 +      return value;
  }
  
  /* Write to a register in the audio-bank of AB8500 */
 -static int ab8500_codec_write_reg(void *context, unsigned int reg,
 -                                unsigned int value)
 +static int ab8500_codec_write_reg(struct snd_soc_codec *codec,
 +                              unsigned int reg, unsigned int value)
  {
 -      struct device *dev = context;
 +      int status;
  
 -      return abx500_set_register_interruptible(dev, AB8500_AUDIO,
 -                                               reg, value);
 -}
 +      status = abx500_set_register_interruptible(codec->dev, AB8500_AUDIO,
 +                                              reg, value);
 +      if (status < 0)
 +              dev_err(codec->dev,
 +                      "%s: ERROR: Register (%02x:%02x) write failed (%d).\n",
 +                      __func__, (u8)AB8500_AUDIO, (u8)reg, status);
 +      else
 +              dev_dbg(codec->dev,
 +                      "%s: Wrote 0x%02x into register %02x:%02x\n",
 +                      __func__, (u8)value, (u8)AB8500_AUDIO, (u8)reg);
  
 -static const struct regmap_config ab8500_codec_regmap = {
 -      .reg_read = ab8500_codec_read_reg,
 -      .reg_write = ab8500_codec_write_reg,
 -};
 +      return status;
 +}
  
  /*
   * Controls - DAPM
@@@ -2312,17 -2300,17 +2312,17 @@@ static int ab8500_codec_set_dai_tdm_slo
        case 0:
                break;
        case 1:
-               slot = find_first_bit((unsigned long *)&tx_mask, 32);
+               slot = ffs(tx_mask);
                snd_soc_update_bits(codec, AB8500_DASLOTCONF1, mask, slot);
                snd_soc_update_bits(codec, AB8500_DASLOTCONF3, mask, slot);
                snd_soc_update_bits(codec, AB8500_DASLOTCONF2, mask, slot);
                snd_soc_update_bits(codec, AB8500_DASLOTCONF4, mask, slot);
                break;
        case 2:
-               slot = find_first_bit((unsigned long *)&tx_mask, 32);
+               slot = ffs(tx_mask);
                snd_soc_update_bits(codec, AB8500_DASLOTCONF1, mask, slot);
                snd_soc_update_bits(codec, AB8500_DASLOTCONF3, mask, slot);
-               slot = find_next_bit((unsigned long *)&tx_mask, 32, slot + 1);
+               slot = fls(tx_mask);
                snd_soc_update_bits(codec, AB8500_DASLOTCONF2, mask, slot);
                snd_soc_update_bits(codec, AB8500_DASLOTCONF4, mask, slot);
                break;
        case 0:
                break;
        case 1:
-               slot = find_first_bit((unsigned long *)&rx_mask, 32);
+               slot = ffs(rx_mask);
                snd_soc_update_bits(codec, AB8500_ADSLOTSEL(slot),
                                AB8500_MASK_SLOT(slot),
                                AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT3, slot));
                break;
        case 2:
-               slot = find_first_bit((unsigned long *)&rx_mask, 32);
+               slot = ffs(rx_mask);
                snd_soc_update_bits(codec,
                                AB8500_ADSLOTSEL(slot),
                                AB8500_MASK_SLOT(slot),
                                AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT3, slot));
-               slot = find_next_bit((unsigned long *)&rx_mask, 32, slot + 1);
+               slot = fls(rx_mask);
                snd_soc_update_bits(codec,
                                AB8500_ADSLOTSEL(slot),
                                AB8500_MASK_SLOT(slot),
@@@ -2485,9 -2473,13 +2485,9 @@@ static int ab8500_codec_probe(struct sn
  
        dev_dbg(dev, "%s: Enter.\n", __func__);
  
 -      snd_soc_codec_set_cache_io(codec, 0, 0, SND_SOC_REGMAP);
 -
        /* Setup AB8500 according to board-settings */
        pdata = dev_get_platdata(dev->parent);
  
 -      codec->control_data = drvdata->regmap;
 -
        if (np) {
                if (!pdata)
                        pdata = devm_kzalloc(dev,
  
  static struct snd_soc_codec_driver ab8500_codec_driver = {
        .probe =                ab8500_codec_probe,
 +      .read =                 ab8500_codec_read_reg,
 +      .write =                ab8500_codec_write_reg,
 +      .reg_word_size =        sizeof(u8),
        .controls =             ab8500_ctrls,
        .num_controls =         ARRAY_SIZE(ab8500_ctrls),
        .dapm_widgets =         ab8500_dapm_widgets,
@@@ -2586,10 -2575,21 +2586,12 @@@ static int ab8500_codec_driver_probe(st
        /* Create driver private-data struct */
        drvdata = devm_kzalloc(&pdev->dev, sizeof(struct ab8500_codec_drvdata),
                        GFP_KERNEL);
+       if (!drvdata)
+               return -ENOMEM;
        drvdata->sid_status = SID_UNCONFIGURED;
        drvdata->anc_status = ANC_UNCONFIGURED;
        dev_set_drvdata(&pdev->dev, drvdata);
  
 -      drvdata->regmap = devm_regmap_init(&pdev->dev, NULL, &pdev->dev,
 -                                         &ab8500_codec_regmap);
 -      if (IS_ERR(drvdata->regmap)) {
 -              status = PTR_ERR(drvdata->regmap);
 -              dev_err(&pdev->dev, "%s: Failed to allocate regmap: %d\n",
 -                      __func__, status);
 -              return status;
 -      }
 -
        dev_dbg(&pdev->dev, "%s: Register codec.\n", __func__);
        status = snd_soc_register_codec(&pdev->dev, &ab8500_codec_driver,
                                ab8500_codec_dai,
index a935d7381af6b2ce22ce2e59007afb7faed007ad,1a9412d86d172a81f058294f331bbaa549dcf654..6fb8f00f4191a7ad890f387c40dc4711dbbfddab
  #define CS42L52_MICB_CTL                      0x11
  #define       CS42L52_MIC_CTL_MIC_SEL_MASK            0xBF
  #define       CS42L52_MIC_CTL_MIC_SEL_SHIFT           6
 -#define CS42L52_MIC_CTL_TYPE_MASK             0xDF
 +#define CS42L52_MIC_CTL_TYPE_MASK             0x20
  #define CS42L52_MIC_CTL_TYPE_SHIFT            5
  
  
  #define CS42L52_FIX_BITS1                     0x3E
  #define CS42L52_FIX_BITS2                     0x47
  
- #define CS42L52_MAX_REGISTER                  0x34
+ #define CS42L52_MAX_REGISTER                  0x47
  
  #endif
index 0048ce5bfa2f3db87ea0a7f0df1c52236451328e,8c91be5d67e3c51d87166c03c6b2855c4e22ad16..9cef204278a614c5b41ad75395a1b264c3d43435
@@@ -37,47 -37,6 +37,47 @@@ struct wm5110_priv 
        struct arizona_fll fll[2];
  };
  
 +static const struct reg_default wm5110_sysclk_revd_patch[] = {
 +      { 0x3093, 0x1001 },
 +      { 0x30E3, 0x1301 },
 +      { 0x3133, 0x1201 },
 +      { 0x3183, 0x1501 },
 +      { 0x31D3, 0x1401 },
 +};
 +
 +static int wm5110_sysclk_ev(struct snd_soc_dapm_widget *w,
 +                          struct snd_kcontrol *kcontrol, int event)
 +{
 +      struct snd_soc_codec *codec = w->codec;
 +      struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
 +      struct regmap *regmap = codec->control_data;
 +      const struct reg_default *patch = NULL;
 +      int i, patch_size;
 +
 +      switch (arizona->rev) {
 +      case 3:
 +              patch = wm5110_sysclk_revd_patch;
 +              patch_size = ARRAY_SIZE(wm5110_sysclk_revd_patch);
 +              break;
 +      default:
 +              return 0;
 +      }
 +
 +      switch (event) {
 +      case SND_SOC_DAPM_POST_PMU:
 +              if (patch)
 +                      for (i = 0; i < patch_size; i++)
 +                              regmap_write(regmap, patch[i].reg,
 +                                           patch[i].def);
 +              break;
 +
 +      default:
 +              break;
 +      }
 +
 +      return 0;
 +}
 +
  static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0);
  static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
  static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0);
@@@ -441,7 -400,7 +441,7 @@@ static const struct snd_kcontrol_new wm
  
  static const struct snd_soc_dapm_widget wm5110_dapm_widgets[] = {
  SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT,
 -                  0, NULL, 0),
 +                  0, wm5110_sysclk_ev, SND_SOC_DAPM_POST_PMU),
  SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1,
                    ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0),
  SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK,
@@@ -1024,24 -983,36 +1024,36 @@@ static const struct snd_soc_dapm_route 
        ARIZONA_MUX_ROUTES("ASRC2L", "ASRC2L"),
        ARIZONA_MUX_ROUTES("ASRC2R", "ASRC2R"),
  
+       { "AEC Loopback", "HPOUT1L", "OUT1L" },
+       { "AEC Loopback", "HPOUT1R", "OUT1R" },
        { "HPOUT1L", NULL, "OUT1L" },
        { "HPOUT1R", NULL, "OUT1R" },
  
+       { "AEC Loopback", "HPOUT2L", "OUT2L" },
+       { "AEC Loopback", "HPOUT2R", "OUT2R" },
        { "HPOUT2L", NULL, "OUT2L" },
        { "HPOUT2R", NULL, "OUT2R" },
  
+       { "AEC Loopback", "HPOUT3L", "OUT3L" },
+       { "AEC Loopback", "HPOUT3R", "OUT3R" },
        { "HPOUT3L", NULL, "OUT3L" },
        { "HPOUT3R", NULL, "OUT3L" },
  
+       { "AEC Loopback", "SPKOUTL", "OUT4L" },
        { "SPKOUTLN", NULL, "OUT4L" },
        { "SPKOUTLP", NULL, "OUT4L" },
  
+       { "AEC Loopback", "SPKOUTR", "OUT4R" },
        { "SPKOUTRN", NULL, "OUT4R" },
        { "SPKOUTRP", NULL, "OUT4R" },
  
+       { "AEC Loopback", "SPKDAT1L", "OUT5L" },
+       { "AEC Loopback", "SPKDAT1R", "OUT5R" },
        { "SPKDAT1L", NULL, "OUT5L" },
        { "SPKDAT1R", NULL, "OUT5R" },
  
+       { "AEC Loopback", "SPKDAT2L", "OUT6L" },
+       { "AEC Loopback", "SPKDAT2R", "OUT6R" },
        { "SPKDAT2L", NULL, "OUT6L" },
        { "SPKDAT2R", NULL, "OUT6R" },
  
This page took 0.074901 seconds and 4 git commands to generate.