]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge branch 'for-3.7' into asoc-next
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 11 Sep 2012 03:27:08 +0000 (11:27 +0800)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 11 Sep 2012 03:27:08 +0000 (11:27 +0800)
Conflicts:
sound/soc/omap/am3517evm.c

1  2 
sound/soc/codecs/arizona.c
sound/soc/codecs/mc13783.c
sound/soc/soc-dapm.c
sound/soc/ux500/ux500_msp_i2s.c

index 1cf7a32d1b211e779cb7705746c32b07c11afa82,5e96a0a1669cb46c8b8d7a55101be1c3f3ea8146..815e8e37b5894e8e8889712d97f5eb240aebcce9
@@@ -229,6 -229,69 +229,69 @@@ int arizona_out_ev(struct snd_soc_dapm_
  }
  EXPORT_SYMBOL_GPL(arizona_out_ev);
  
+ static unsigned int arizona_sysclk_48k_rates[] = {
+       6144000,
+       12288000,
+       22579200,
+       49152000,
+ };
+ static unsigned int arizona_sysclk_44k1_rates[] = {
+       5644800,
+       11289600,
+       24576000,
+       45158400,
+ };
+ static int arizona_set_opclk(struct snd_soc_codec *codec, unsigned int clk,
+                            unsigned int freq)
+ {
+       struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
+       unsigned int reg;
+       unsigned int *rates;
+       int ref, div, refclk;
+       switch (clk) {
+       case ARIZONA_CLK_OPCLK:
+               reg = ARIZONA_OUTPUT_SYSTEM_CLOCK;
+               refclk = priv->sysclk;
+               break;
+       case ARIZONA_CLK_ASYNC_OPCLK:
+               reg = ARIZONA_OUTPUT_ASYNC_CLOCK;
+               refclk = priv->asyncclk;
+               break;
+       default:
+               return -EINVAL;
+       }
+       if (refclk % 8000)
+               rates = arizona_sysclk_44k1_rates;
+       else
+               rates = arizona_sysclk_48k_rates;
+       for (ref = 0; ref < ARRAY_SIZE(arizona_sysclk_48k_rates) &&
+                    rates[ref] <= refclk; ref++) {
+               div = 1;
+               while (rates[ref] / div >= freq && div < 32) {
+                       if (rates[ref] / div == freq) {
+                               dev_dbg(codec->dev, "Configured %dHz OPCLK\n",
+                                       freq);
+                               snd_soc_update_bits(codec, reg,
+                                                   ARIZONA_OPCLK_DIV_MASK |
+                                                   ARIZONA_OPCLK_SEL_MASK,
+                                                   (div <<
+                                                    ARIZONA_OPCLK_DIV_SHIFT) |
+                                                   ref);
+                               return 0;
+                       }
+                       div++;
+               }
+       }
+       dev_err(codec->dev, "Unable to generate %dHz OPCLK\n", freq);
+       return -EINVAL;
+ }
  int arizona_set_sysclk(struct snd_soc_codec *codec, int clk_id,
                       int source, unsigned int freq, int dir)
  {
                reg = ARIZONA_ASYNC_CLOCK_1;
                clk = &priv->asyncclk;
                break;
+       case ARIZONA_CLK_OPCLK:
+       case ARIZONA_CLK_ASYNC_OPCLK:
+               return arizona_set_opclk(codec, clk_id, freq);
        default:
                return -EINVAL;
        }
@@@ -426,7 -492,7 +492,7 @@@ static const int arizona_44k1_bclk_rate
        940800,
        1411200,
        1881600,
 -      2882400,
 +      2822400,
        3763200,
        5644800,
        7526400,
index 115a403018105b0eaa2fb64abee56a47b5d32cc4,d89e343ff10853ca82e6cafd951242b7dcac6428..bc955999c8aa56c15fb30e99bbc8a7eecb930a67
@@@ -426,16 -426,16 +426,16 @@@ static int mc13783_set_tdm_slot_sync(st
  }
  
  static const struct snd_kcontrol_new mc1l_amp_ctl =
-       SOC_DAPM_SINGLE("Switch", 38, 7, 1, 0);
+       SOC_DAPM_SINGLE("Switch", MC13783_AUDIO_TX, 7, 1, 0);
  
  static const struct snd_kcontrol_new mc1r_amp_ctl =
-       SOC_DAPM_SINGLE("Switch", 38, 5, 1, 0);
+       SOC_DAPM_SINGLE("Switch", MC13783_AUDIO_TX, 5, 1, 0);
  
  static const struct snd_kcontrol_new mc2_amp_ctl =
-       SOC_DAPM_SINGLE("Switch", 38, 9, 1, 0);
+       SOC_DAPM_SINGLE("Switch", MC13783_AUDIO_TX, 9, 1, 0);
  
  static const struct snd_kcontrol_new atx_amp_ctl =
-       SOC_DAPM_SINGLE("Switch", 38, 11, 1, 0);
+       SOC_DAPM_SINGLE("Switch", MC13783_AUDIO_TX, 11, 1, 0);
  
  
  /* Virtual mux. The chip does the input selection automatically
@@@ -461,22 -461,22 +461,22 @@@ static const struct snd_kcontrol_new ri
        SOC_DAPM_ENUM_VIRT("Route", adcr_enum);
  
  static const struct snd_kcontrol_new samp_ctl =
-       SOC_DAPM_SINGLE("Switch", 36, 3, 1, 0);
+       SOC_DAPM_SINGLE("Switch", MC13783_AUDIO_RX0, 3, 1, 0);
  
  static const struct snd_kcontrol_new lamp_ctl =
-       SOC_DAPM_SINGLE("Switch", 36, 5, 1, 0);
+       SOC_DAPM_SINGLE("Switch", MC13783_AUDIO_RX0, 5, 1, 0);
  
  static const struct snd_kcontrol_new hlamp_ctl =
-       SOC_DAPM_SINGLE("Switch", 36, 10, 1, 0);
+       SOC_DAPM_SINGLE("Switch", MC13783_AUDIO_RX0, 10, 1, 0);
  
  static const struct snd_kcontrol_new hramp_ctl =
-       SOC_DAPM_SINGLE("Switch", 36, 9, 1, 0);
+       SOC_DAPM_SINGLE("Switch", MC13783_AUDIO_RX0, 9, 1, 0);
  
  static const struct snd_kcontrol_new llamp_ctl =
-       SOC_DAPM_SINGLE("Switch", 36, 16, 1, 0);
+       SOC_DAPM_SINGLE("Switch", MC13783_AUDIO_RX0, 16, 1, 0);
  
  static const struct snd_kcontrol_new lramp_ctl =
-       SOC_DAPM_SINGLE("Switch", 36, 15, 1, 0);
+       SOC_DAPM_SINGLE("Switch", MC13783_AUDIO_RX0, 15, 1, 0);
  
  static const struct snd_soc_dapm_widget mc13783_dapm_widgets[] = {
  /* Input */
        SND_SOC_DAPM_INPUT("RXINL"),
        SND_SOC_DAPM_INPUT("TXIN"),
  
-       SND_SOC_DAPM_SUPPLY("MC1 Bias", 38, 0, 0, NULL, 0),
-       SND_SOC_DAPM_SUPPLY("MC2 Bias", 38, 1, 0, NULL, 0),
+       SND_SOC_DAPM_SUPPLY("MC1 Bias", MC13783_AUDIO_TX, 0, 0, NULL, 0),
+       SND_SOC_DAPM_SUPPLY("MC2 Bias", MC13783_AUDIO_TX, 1, 0, NULL, 0),
  
-       SND_SOC_DAPM_SWITCH("MC1L Amp", 38, 7, 0, &mc1l_amp_ctl),
-       SND_SOC_DAPM_SWITCH("MC1R Amp", 38, 5, 0, &mc1r_amp_ctl),
-       SND_SOC_DAPM_SWITCH("MC2 Amp", 38, 9, 0, &mc2_amp_ctl),
-       SND_SOC_DAPM_SWITCH("TXIN Amp", 38, 11, 0, &atx_amp_ctl),
+       SND_SOC_DAPM_SWITCH("MC1L Amp", MC13783_AUDIO_TX, 7, 0, &mc1l_amp_ctl),
+       SND_SOC_DAPM_SWITCH("MC1R Amp", MC13783_AUDIO_TX, 5, 0, &mc1r_amp_ctl),
+       SND_SOC_DAPM_SWITCH("MC2 Amp", MC13783_AUDIO_TX, 9, 0, &mc2_amp_ctl),
+       SND_SOC_DAPM_SWITCH("TXIN Amp", MC13783_AUDIO_TX, 11, 0, &atx_amp_ctl),
  
        SND_SOC_DAPM_VIRT_MUX("PGA Left Input Mux", SND_SOC_NOPM, 0, 0,
                              &left_input_mux),
        SND_SOC_DAPM_PGA("PGA Left Input", SND_SOC_NOPM, 0, 0, NULL, 0),
        SND_SOC_DAPM_PGA("PGA Right Input", SND_SOC_NOPM, 0, 0, NULL, 0),
  
-       SND_SOC_DAPM_ADC("ADC", "Capture", 40, 11, 0),
-       SND_SOC_DAPM_SUPPLY("ADC_Reset", 40, 15, 0, NULL, 0),
+       SND_SOC_DAPM_ADC("ADC", "Capture", MC13783_AUDIO_CODEC, 11, 0),
+       SND_SOC_DAPM_SUPPLY("ADC_Reset", MC13783_AUDIO_CODEC, 15, 0, NULL, 0),
  
  /* Output */
-       SND_SOC_DAPM_SUPPLY("DAC_E", 41, 11, 0, NULL, 0),
-       SND_SOC_DAPM_SUPPLY("DAC_Reset", 41, 15, 0, NULL, 0),
+       SND_SOC_DAPM_SUPPLY("DAC_E", MC13783_AUDIO_DAC, 11, 0, NULL, 0),
+       SND_SOC_DAPM_SUPPLY("DAC_Reset", MC13783_AUDIO_DAC, 15, 0, NULL, 0),
        SND_SOC_DAPM_OUTPUT("RXOUTL"),
        SND_SOC_DAPM_OUTPUT("RXOUTR"),
        SND_SOC_DAPM_OUTPUT("HSL"),
        SND_SOC_DAPM_OUTPUT("LSP"),
        SND_SOC_DAPM_OUTPUT("SP"),
  
-       SND_SOC_DAPM_SWITCH("Speaker Amp", 36, 3, 0, &samp_ctl),
+       SND_SOC_DAPM_SWITCH("Speaker Amp", MC13783_AUDIO_RX0, 3, 0, &samp_ctl),
        SND_SOC_DAPM_SWITCH("Loudspeaker Amp", SND_SOC_NOPM, 0, 0, &lamp_ctl),
-       SND_SOC_DAPM_SWITCH("Headset Amp Left", 36, 10, 0, &hlamp_ctl),
-       SND_SOC_DAPM_SWITCH("Headset Amp Right", 36, 9, 0, &hramp_ctl),
-       SND_SOC_DAPM_SWITCH("Line out Amp Left", 36, 16, 0, &llamp_ctl),
-       SND_SOC_DAPM_SWITCH("Line out Amp Right", 36, 15, 0, &lramp_ctl),
-       SND_SOC_DAPM_DAC("DAC", "Playback", 36, 22, 0),
-       SND_SOC_DAPM_PGA("DAC PGA", 37, 5, 0, NULL, 0),
+       SND_SOC_DAPM_SWITCH("Headset Amp Left", MC13783_AUDIO_RX0, 10, 0,
+                       &hlamp_ctl),
+       SND_SOC_DAPM_SWITCH("Headset Amp Right", MC13783_AUDIO_RX0, 9, 0,
+                       &hramp_ctl),
+       SND_SOC_DAPM_SWITCH("Line out Amp Left", MC13783_AUDIO_RX0, 16, 0,
+                       &llamp_ctl),
+       SND_SOC_DAPM_SWITCH("Line out Amp Right", MC13783_AUDIO_RX0, 15, 0,
+                       &lramp_ctl),
+       SND_SOC_DAPM_DAC("DAC", "Playback", MC13783_AUDIO_RX0, 22, 0),
+       SND_SOC_DAPM_PGA("DAC PGA", MC13783_AUDIO_RX1, 5, 0, NULL, 0),
  };
  
  static struct snd_soc_dapm_route mc13783_routes[] = {
@@@ -581,8 -585,6 +585,6 @@@ static int mc13783_probe(struct snd_soc
  {
        struct mc13783_priv *priv = snd_soc_codec_get_drvdata(codec);
  
-       codec->control_data = priv->mc13xxx;
        mc13xxx_lock(priv->mc13xxx);
  
        /* these are the reset values */
@@@ -659,7 -661,7 +661,7 @@@ static struct snd_soc_dai_driver mc1378
                .id = MC13783_ID_STEREO_DAC,
                .playback = {
                        .stream_name = "Playback",
 -                      .channels_min = 1,
 +                      .channels_min = 2,
                        .channels_max = 2,
                        .rates = SNDRV_PCM_RATE_8000_96000,
                        .formats = MC13783_FORMATS,
                .id = MC13783_ID_STEREO_CODEC,
                .capture = {
                        .stream_name = "Capture",
 -                      .channels_min = 1,
 +                      .channels_min = 2,
                        .channels_max = 2,
                        .rates = MC13783_RATES_RECORD,
                        .formats = MC13783_FORMATS,
@@@ -692,14 -694,14 +694,14 @@@ static struct snd_soc_dai_driver mc1378
                .id = MC13783_ID_SYNC,
                .playback = {
                        .stream_name = "Playback",
 -                      .channels_min = 1,
 +                      .channels_min = 2,
                        .channels_max = 2,
                        .rates = SNDRV_PCM_RATE_8000_96000,
                        .formats = MC13783_FORMATS,
                },
                .capture = {
                        .stream_name = "Capture",
 -                      .channels_min = 1,
 +                      .channels_min = 2,
                        .channels_max = 2,
                        .rates = MC13783_RATES_RECORD,
                        .formats = MC13783_FORMATS,
diff --combined sound/soc/soc-dapm.c
index f90139b5f50d74089dc98fd0d19de42cb3732a84,f7999e949acb1b7d804432878b815317246b144c..3b8ddb47d620bce71b80fbef24f537d9c7673849
@@@ -141,6 -141,28 +141,28 @@@ void dapm_mark_dirty(struct snd_soc_dap
  }
  EXPORT_SYMBOL_GPL(dapm_mark_dirty);
  
+ void dapm_mark_io_dirty(struct snd_soc_dapm_context *dapm)
+ {
+       struct snd_soc_card *card = dapm->card;
+       struct snd_soc_dapm_widget *w;
+       mutex_lock(&card->dapm_mutex);
+       list_for_each_entry(w, &card->widgets, list) {
+               switch (w->id) {
+               case snd_soc_dapm_input:
+               case snd_soc_dapm_output:
+                       dapm_mark_dirty(w, "Rechecking inputs and outputs");
+                       break;
+               default:
+                       break;
+               }
+       }
+       mutex_unlock(&card->dapm_mutex);
+ }
+ EXPORT_SYMBOL_GPL(dapm_mark_io_dirty);
  /* create a new dapm widget */
  static inline struct snd_soc_dapm_widget *dapm_cnew_widget(
        const struct snd_soc_dapm_widget *_widget)
@@@ -291,11 -313,8 +313,11 @@@ static int snd_soc_dapm_set_bias_level(
                if (dapm->codec->driver->set_bias_level)
                        ret = dapm->codec->driver->set_bias_level(dapm->codec,
                                                                  level);
 -      } else
 +              else
 +                      dapm->bias_level = level;
 +      } else if (!card || dapm != &card->dapm) {
                dapm->bias_level = level;
 +      }
  
        if (ret != 0)
                goto out;
index eb85113d472a22503aceb1939d5191d9d2c856de,36be11e47ad60b7eb0f8fe909e24d45393baee13..1b7c2f58ce1366bcb2f5505e0085b76424aa4bbf
@@@ -663,6 -663,7 +663,6 @@@ int ux500_msp_i2s_init_msp(struct platf
                        struct ux500_msp **msp_p,
                        struct msp_i2s_platform_data *platform_data)
  {
 -      int ret = 0;
        struct resource *res = NULL;
        struct i2s_controller *i2s_cont;
        struct ux500_msp *msp;
  
        *msp_p = devm_kzalloc(&pdev->dev, sizeof(struct ux500_msp), GFP_KERNEL);
        msp = *msp_p;
+       if (!msp)
+               return -ENOMEM;
  
        msp->id = platform_data->id;
        msp->dev = &pdev->dev;
        if (res == NULL) {
                dev_err(&pdev->dev, "%s: ERROR: Unable to get resource!\n",
                        __func__);
 -              ret = -ENOMEM;
 -              goto err_res;
 +              return -ENOMEM;
        }
  
 -      msp->registers = ioremap(res->start, (res->end - res->start + 1));
 +      msp->registers = devm_ioremap(&pdev->dev, res->start,
 +                                    resource_size(res));
        if (msp->registers == NULL) {
                dev_err(&pdev->dev, "%s: ERROR: ioremap failed!\n", __func__);
 -              ret = -ENOMEM;
 -              goto err_res;
 +              return -ENOMEM;
        }
  
        msp->msp_state = MSP_STATE_IDLE;
                dev_err(&pdev->dev,
                        "%s: ERROR: Failed to allocate I2S-controller!\n",
                        __func__);
 -              goto err_i2s_cont;
 +              return -ENOMEM;
        }
        i2s_cont->dev.parent = &pdev->dev;
        i2s_cont->data = (void *)msp;
        msp->i2s_cont = i2s_cont;
  
        return 0;
 -
 -err_i2s_cont:
 -      iounmap(msp->registers);
 -
 -err_res:
 -      devm_kfree(&pdev->dev, msp);
 -
 -      return ret;
  }
  
  void ux500_msp_i2s_cleanup_msp(struct platform_device *pdev,
        dev_dbg(msp->dev, "%s: Enter (id = %d).\n", __func__, msp->id);
  
        device_unregister(&msp->i2s_cont->dev);
 -      devm_kfree(&pdev->dev, msp->i2s_cont);
 -
 -      iounmap(msp->registers);
 -
 -      devm_kfree(&pdev->dev, msp);
  }
  
  MODULE_LICENSE("GPL v2");