Commit ac190c76 authored by Takashi Iwai's avatar Takashi Iwai

Merge tag 'asoc-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus

ASoC: Additional updates for 3.6

A few updates for issues discovered during the merge window, the main
one being the fix for the issues with defaulting to use of regmap
without properly checking if there was I/O in place already.
parents 707fba3f 98d3088e
...@@ -2406,6 +2406,10 @@ static int ab8500_codec_probe(struct snd_soc_codec *codec) ...@@ -2406,6 +2406,10 @@ static int ab8500_codec_probe(struct snd_soc_codec *codec)
/* Setup AB8500 according to board-settings */ /* Setup AB8500 according to board-settings */
pdata = (struct ab8500_platform_data *)dev_get_platdata(dev->parent); pdata = (struct ab8500_platform_data *)dev_get_platdata(dev->parent);
/* Inform SoC Core that we have our own I/O arrangements. */
codec->control_data = (void *)true;
status = ab8500_audio_setup_mics(codec, &pdata->codec->amics); status = ab8500_audio_setup_mics(codec, &pdata->codec->amics);
if (status < 0) { if (status < 0) {
pr_err("%s: Failed to setup mics (%d)!\n", __func__, status); pr_err("%s: Failed to setup mics (%d)!\n", __func__, status);
......
...@@ -186,6 +186,7 @@ static int ad1980_soc_probe(struct snd_soc_codec *codec) ...@@ -186,6 +186,7 @@ static int ad1980_soc_probe(struct snd_soc_codec *codec)
printk(KERN_INFO "AD1980 SoC Audio Codec\n"); printk(KERN_INFO "AD1980 SoC Audio Codec\n");
codec->control_data = codec; /* we don't use regmap! */
ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0);
if (ret < 0) { if (ret < 0) {
printk(KERN_ERR "ad1980: failed to register AC97 codec\n"); printk(KERN_ERR "ad1980: failed to register AC97 codec\n");
......
...@@ -581,6 +581,8 @@ static int mc13783_probe(struct snd_soc_codec *codec) ...@@ -581,6 +581,8 @@ static int mc13783_probe(struct snd_soc_codec *codec)
{ {
struct mc13783_priv *priv = snd_soc_codec_get_drvdata(codec); struct mc13783_priv *priv = snd_soc_codec_get_drvdata(codec);
codec->control_data = priv->mc13xxx;
mc13xxx_lock(priv->mc13xxx); mc13xxx_lock(priv->mc13xxx);
/* these are the reset values */ /* these are the reset values */
......
...@@ -239,6 +239,7 @@ static const struct snd_soc_dapm_route sgtl5000_dapm_routes[] = { ...@@ -239,6 +239,7 @@ static const struct snd_soc_dapm_route sgtl5000_dapm_routes[] = {
{"Headphone Mux", "DAC", "DAC"}, /* dac --> hp_mux */ {"Headphone Mux", "DAC", "DAC"}, /* dac --> hp_mux */
{"LO", NULL, "DAC"}, /* dac --> line_out */ {"LO", NULL, "DAC"}, /* dac --> line_out */
{"LINE_IN", NULL, "VAG_POWER"},
{"Headphone Mux", "LINE_IN", "LINE_IN"},/* line_in --> hp_mux */ {"Headphone Mux", "LINE_IN", "LINE_IN"},/* line_in --> hp_mux */
{"HP", NULL, "Headphone Mux"}, /* hp_mux --> hp */ {"HP", NULL, "Headphone Mux"}, /* hp_mux --> hp */
...@@ -1357,8 +1358,6 @@ static int sgtl5000_probe(struct snd_soc_codec *codec) ...@@ -1357,8 +1358,6 @@ static int sgtl5000_probe(struct snd_soc_codec *codec)
if (ret) if (ret)
goto err; goto err;
snd_soc_dapm_new_widgets(&codec->dapm);
return 0; return 0;
err: err:
......
...@@ -340,6 +340,7 @@ static int stac9766_codec_probe(struct snd_soc_codec *codec) ...@@ -340,6 +340,7 @@ static int stac9766_codec_probe(struct snd_soc_codec *codec)
printk(KERN_INFO "STAC9766 SoC Audio Codec %s\n", STAC9766_VERSION); printk(KERN_INFO "STAC9766 SoC Audio Codec %s\n", STAC9766_VERSION);
codec->control_data = codec; /* we don't use regmap! */
ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0);
if (ret < 0) if (ret < 0)
goto codec_err; goto codec_err;
......
...@@ -2501,6 +2501,9 @@ static int wm8962_set_bias_level(struct snd_soc_codec *codec, ...@@ -2501,6 +2501,9 @@ static int wm8962_set_bias_level(struct snd_soc_codec *codec,
/* VMID 2*250k */ /* VMID 2*250k */
snd_soc_update_bits(codec, WM8962_PWR_MGMT_1, snd_soc_update_bits(codec, WM8962_PWR_MGMT_1,
WM8962_VMID_SEL_MASK, 0x100); WM8962_VMID_SEL_MASK, 0x100);
if (codec->dapm.bias_level == SND_SOC_BIAS_OFF)
msleep(100);
break; break;
case SND_SOC_BIAS_OFF: case SND_SOC_BIAS_OFF:
......
...@@ -2649,7 +2649,7 @@ static int wm8994_hw_params(struct snd_pcm_substream *substream, ...@@ -2649,7 +2649,7 @@ static int wm8994_hw_params(struct snd_pcm_substream *substream,
return -EINVAL; return -EINVAL;
} }
bclk_rate = params_rate(params) * 2; bclk_rate = params_rate(params) * 4;
switch (params_format(params)) { switch (params_format(params)) {
case SNDRV_PCM_FORMAT_S16_LE: case SNDRV_PCM_FORMAT_S16_LE:
bclk_rate *= 16; bclk_rate *= 16;
...@@ -3253,10 +3253,13 @@ static void wm8994_mic_work(struct work_struct *work) ...@@ -3253,10 +3253,13 @@ static void wm8994_mic_work(struct work_struct *work)
int ret; int ret;
int report; int report;
pm_runtime_get_sync(dev);
ret = regmap_read(regmap, WM8994_INTERRUPT_RAW_STATUS_2, &reg); ret = regmap_read(regmap, WM8994_INTERRUPT_RAW_STATUS_2, &reg);
if (ret < 0) { if (ret < 0) {
dev_err(dev, "Failed to read microphone status: %d\n", dev_err(dev, "Failed to read microphone status: %d\n",
ret); ret);
pm_runtime_put(dev);
return; return;
} }
...@@ -3299,6 +3302,8 @@ static void wm8994_mic_work(struct work_struct *work) ...@@ -3299,6 +3302,8 @@ static void wm8994_mic_work(struct work_struct *work)
snd_soc_jack_report(priv->micdet[1].jack, report, snd_soc_jack_report(priv->micdet[1].jack, report,
SND_JACK_HEADSET | SND_JACK_BTN_0); SND_JACK_HEADSET | SND_JACK_BTN_0);
pm_runtime_put(dev);
} }
static irqreturn_t wm8994_mic_irq(int irq, void *data) static irqreturn_t wm8994_mic_irq(int irq, void *data)
...@@ -3421,12 +3426,15 @@ static irqreturn_t wm1811_jackdet_irq(int irq, void *data) ...@@ -3421,12 +3426,15 @@ static irqreturn_t wm1811_jackdet_irq(int irq, void *data)
int reg; int reg;
bool present; bool present;
pm_runtime_get_sync(codec->dev);
mutex_lock(&wm8994->accdet_lock); mutex_lock(&wm8994->accdet_lock);
reg = snd_soc_read(codec, WM1811_JACKDET_CTRL); reg = snd_soc_read(codec, WM1811_JACKDET_CTRL);
if (reg < 0) { if (reg < 0) {
dev_err(codec->dev, "Failed to read jack status: %d\n", reg); dev_err(codec->dev, "Failed to read jack status: %d\n", reg);
mutex_unlock(&wm8994->accdet_lock); mutex_unlock(&wm8994->accdet_lock);
pm_runtime_put(codec->dev);
return IRQ_NONE; return IRQ_NONE;
} }
...@@ -3491,6 +3499,7 @@ static irqreturn_t wm1811_jackdet_irq(int irq, void *data) ...@@ -3491,6 +3499,7 @@ static irqreturn_t wm1811_jackdet_irq(int irq, void *data)
SND_JACK_MECHANICAL | SND_JACK_HEADSET | SND_JACK_MECHANICAL | SND_JACK_HEADSET |
wm8994->btn_mask); wm8994->btn_mask);
pm_runtime_put(codec->dev);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -3602,6 +3611,8 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data) ...@@ -3602,6 +3611,8 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data)
if (!(snd_soc_read(codec, WM8958_MIC_DETECT_1) & WM8958_MICD_ENA)) if (!(snd_soc_read(codec, WM8958_MIC_DETECT_1) & WM8958_MICD_ENA))
return IRQ_HANDLED; return IRQ_HANDLED;
pm_runtime_get_sync(codec->dev);
/* We may occasionally read a detection without an impedence /* We may occasionally read a detection without an impedence
* range being provided - if that happens loop again. * range being provided - if that happens loop again.
*/ */
...@@ -3612,6 +3623,7 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data) ...@@ -3612,6 +3623,7 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data)
dev_err(codec->dev, dev_err(codec->dev,
"Failed to read mic detect status: %d\n", "Failed to read mic detect status: %d\n",
reg); reg);
pm_runtime_put(codec->dev);
return IRQ_NONE; return IRQ_NONE;
} }
...@@ -3639,6 +3651,7 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data) ...@@ -3639,6 +3651,7 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data)
dev_warn(codec->dev, "Accessory detection with no callback\n"); dev_warn(codec->dev, "Accessory detection with no callback\n");
out: out:
pm_runtime_put(codec->dev);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
...@@ -619,6 +619,7 @@ static int wm9712_soc_probe(struct snd_soc_codec *codec) ...@@ -619,6 +619,7 @@ static int wm9712_soc_probe(struct snd_soc_codec *codec)
{ {
int ret = 0; int ret = 0;
codec->control_data = codec; /* we don't use regmap! */
ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0);
if (ret < 0) { if (ret < 0) {
printk(KERN_ERR "wm9712: failed to register AC97 codec\n"); printk(KERN_ERR "wm9712: failed to register AC97 codec\n");
......
...@@ -1196,6 +1196,7 @@ static int wm9713_soc_probe(struct snd_soc_codec *codec) ...@@ -1196,6 +1196,7 @@ static int wm9713_soc_probe(struct snd_soc_codec *codec)
if (wm9713 == NULL) if (wm9713 == NULL)
return -ENOMEM; return -ENOMEM;
snd_soc_codec_set_drvdata(codec, wm9713); snd_soc_codec_set_drvdata(codec, wm9713);
codec->control_data = wm9713; /* we don't use regmap! */
ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0);
if (ret < 0) if (ret < 0)
......
...@@ -394,9 +394,14 @@ static int mxs_saif_hw_params(struct snd_pcm_substream *substream, ...@@ -394,9 +394,14 @@ static int mxs_saif_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *cpu_dai) struct snd_soc_dai *cpu_dai)
{ {
struct mxs_saif *saif = snd_soc_dai_get_drvdata(cpu_dai); struct mxs_saif *saif = snd_soc_dai_get_drvdata(cpu_dai);
struct mxs_saif *master_saif;
u32 scr, stat; u32 scr, stat;
int ret; int ret;
master_saif = mxs_saif_get_master(saif);
if (!master_saif)
return -EINVAL;
/* mclk should already be set */ /* mclk should already be set */
if (!saif->mclk && saif->mclk_in_use) { if (!saif->mclk && saif->mclk_in_use) {
dev_err(cpu_dai->dev, "set mclk first\n"); dev_err(cpu_dai->dev, "set mclk first\n");
...@@ -420,6 +425,25 @@ static int mxs_saif_hw_params(struct snd_pcm_substream *substream, ...@@ -420,6 +425,25 @@ static int mxs_saif_hw_params(struct snd_pcm_substream *substream,
return ret; return ret;
} }
/* prepare clk in hw_param, enable in trigger */
clk_prepare(saif->clk);
if (saif != master_saif) {
/*
* Set an initial clock rate for the saif internal logic to work
* properly. This is important when working in EXTMASTER mode
* that uses the other saif's BITCLK&LRCLK but it still needs a
* basic clock which should be fast enough for the internal
* logic.
*/
clk_enable(saif->clk);
ret = clk_set_rate(saif->clk, 24000000);
clk_disable(saif->clk);
if (ret)
return ret;
clk_prepare(master_saif->clk);
}
scr = __raw_readl(saif->base + SAIF_CTRL); scr = __raw_readl(saif->base + SAIF_CTRL);
scr &= ~BM_SAIF_CTRL_WORD_LENGTH; scr &= ~BM_SAIF_CTRL_WORD_LENGTH;
......
...@@ -820,3 +820,4 @@ module_platform_driver(asoc_mcbsp_driver); ...@@ -820,3 +820,4 @@ module_platform_driver(asoc_mcbsp_driver);
MODULE_AUTHOR("Jarkko Nikula <jarkko.nikula@bitmer.com>"); MODULE_AUTHOR("Jarkko Nikula <jarkko.nikula@bitmer.com>");
MODULE_DESCRIPTION("OMAP I2S SoC Interface"); MODULE_DESCRIPTION("OMAP I2S SoC Interface");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:omap-mcbsp");
...@@ -441,3 +441,4 @@ module_platform_driver(omap_pcm_driver); ...@@ -441,3 +441,4 @@ module_platform_driver(omap_pcm_driver);
MODULE_AUTHOR("Jarkko Nikula <jarkko.nikula@bitmer.com>"); MODULE_AUTHOR("Jarkko Nikula <jarkko.nikula@bitmer.com>");
MODULE_DESCRIPTION("OMAP PCM DMA module"); MODULE_DESCRIPTION("OMAP PCM DMA module");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:omap-pcm-audio");
...@@ -1096,7 +1096,7 @@ static int soc_probe_codec(struct snd_soc_card *card, ...@@ -1096,7 +1096,7 @@ static int soc_probe_codec(struct snd_soc_card *card,
} }
/* If the driver didn't set I/O up try regmap */ /* If the driver didn't set I/O up try regmap */
if (!codec->control_data) if (!codec->write && dev_get_regmap(codec->dev, NULL))
snd_soc_codec_set_cache_io(codec, 0, 0, SND_SOC_REGMAP); snd_soc_codec_set_cache_io(codec, 0, 0, SND_SOC_REGMAP);
if (driver->controls) if (driver->controls)
......
...@@ -177,7 +177,7 @@ static __devinit int tegra_alc5632_probe(struct platform_device *pdev) ...@@ -177,7 +177,7 @@ static __devinit int tegra_alc5632_probe(struct platform_device *pdev)
} }
alc5632->gpio_hp_det = of_get_named_gpio(np, "nvidia,hp-det-gpios", 0); alc5632->gpio_hp_det = of_get_named_gpio(np, "nvidia,hp-det-gpios", 0);
if (alc5632->gpio_hp_det == -ENODEV) if (alc5632->gpio_hp_det == -EPROBE_DEFER)
return -EPROBE_DEFER; return -EPROBE_DEFER;
ret = snd_soc_of_parse_card_name(card, "nvidia,model"); ret = snd_soc_of_parse_card_name(card, "nvidia,model");
......
...@@ -284,27 +284,27 @@ static __devinit int tegra_wm8903_driver_probe(struct platform_device *pdev) ...@@ -284,27 +284,27 @@ static __devinit int tegra_wm8903_driver_probe(struct platform_device *pdev)
} else if (np) { } else if (np) {
pdata->gpio_spkr_en = of_get_named_gpio(np, pdata->gpio_spkr_en = of_get_named_gpio(np,
"nvidia,spkr-en-gpios", 0); "nvidia,spkr-en-gpios", 0);
if (pdata->gpio_spkr_en == -ENODEV) if (pdata->gpio_spkr_en == -EPROBE_DEFER)
return -EPROBE_DEFER; return -EPROBE_DEFER;
pdata->gpio_hp_mute = of_get_named_gpio(np, pdata->gpio_hp_mute = of_get_named_gpio(np,
"nvidia,hp-mute-gpios", 0); "nvidia,hp-mute-gpios", 0);
if (pdata->gpio_hp_mute == -ENODEV) if (pdata->gpio_hp_mute == -EPROBE_DEFER)
return -EPROBE_DEFER; return -EPROBE_DEFER;
pdata->gpio_hp_det = of_get_named_gpio(np, pdata->gpio_hp_det = of_get_named_gpio(np,
"nvidia,hp-det-gpios", 0); "nvidia,hp-det-gpios", 0);
if (pdata->gpio_hp_det == -ENODEV) if (pdata->gpio_hp_det == -EPROBE_DEFER)
return -EPROBE_DEFER; return -EPROBE_DEFER;
pdata->gpio_int_mic_en = of_get_named_gpio(np, pdata->gpio_int_mic_en = of_get_named_gpio(np,
"nvidia,int-mic-en-gpios", 0); "nvidia,int-mic-en-gpios", 0);
if (pdata->gpio_int_mic_en == -ENODEV) if (pdata->gpio_int_mic_en == -EPROBE_DEFER)
return -EPROBE_DEFER; return -EPROBE_DEFER;
pdata->gpio_ext_mic_en = of_get_named_gpio(np, pdata->gpio_ext_mic_en = of_get_named_gpio(np,
"nvidia,ext-mic-en-gpios", 0); "nvidia,ext-mic-en-gpios", 0);
if (pdata->gpio_ext_mic_en == -ENODEV) if (pdata->gpio_ext_mic_en == -EPROBE_DEFER)
return -EPROBE_DEFER; return -EPROBE_DEFER;
} }
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#include <linux/mfd/dbx500-prcmu.h> #include <linux/mfd/dbx500-prcmu.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/board-mop500-msp.h> #include <mach/msp.h>
#include <sound/soc.h> #include <sound/soc.h>
#include <sound/soc-dai.h> #include <sound/soc-dai.h>
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/board-mop500-msp.h> #include <mach/msp.h>
#include <sound/soc.h> #include <sound/soc.h>
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <mach/board-mop500-msp.h> #include <mach/msp.h>
#define MSP_INPUT_FREQ_APB 48000000 #define MSP_INPUT_FREQ_APB 48000000
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment