Commit 6074fffb authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'sound-3.9' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
 "This contains a few small ASoC fixes (wm8903, wm5102, samsung-i2s,
  tegra, and soc-compress) and an endian fix for NI USB-audio devices,
  update for Mark's e-mail address.

  No scary changes, AFAIS."

* tag 'sound-3.9' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  MAINTAINERS: Update e-mail address
  ASoC: wm5102: Correct lookup of arizona struct in SYSCLK event
  ASoC: wm8903: Fix the bypass to HP/LINEOUT when no DAC or ADC is running
  ALSA: usb-audio: fix endianness bug in snd_nativeinstruments_*
  ASoC: tegra: Don't claim to support PCM pause and resume
  ASoC: Samsung: set drvdata before adding secondary device
  ASoC: Samsung: return error if drvdata is not set
  ASoC: compress: Cancel delayed power down if needed
  ASoC: core: Fix to check return value of snd_soc_update_bits_locked()
parents cfb63baf c5a4698d
...@@ -6631,7 +6631,7 @@ S: Supported ...@@ -6631,7 +6631,7 @@ S: Supported
F: fs/reiserfs/ F: fs/reiserfs/
REGISTER MAP ABSTRACTION REGISTER MAP ABSTRACTION
M: Mark Brown <broonie@opensource.wolfsonmicro.com> M: Mark Brown <broonie@kernel.org>
T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git
S: Supported S: Supported
F: drivers/base/regmap/ F: drivers/base/regmap/
...@@ -7379,7 +7379,7 @@ F: sound/ ...@@ -7379,7 +7379,7 @@ F: sound/
SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC) SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
M: Liam Girdwood <lgirdwood@gmail.com> M: Liam Girdwood <lgirdwood@gmail.com>
M: Mark Brown <broonie@opensource.wolfsonmicro.com> M: Mark Brown <broonie@kernel.org>
T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
L: alsa-devel@alsa-project.org (moderated for non-subscribers) L: alsa-devel@alsa-project.org (moderated for non-subscribers)
W: http://alsa-project.org/main/index.php/ASoC W: http://alsa-project.org/main/index.php/ASoC
...@@ -7468,7 +7468,7 @@ F: drivers/clk/spear/ ...@@ -7468,7 +7468,7 @@ F: drivers/clk/spear/
SPI SUBSYSTEM SPI SUBSYSTEM
M: Grant Likely <grant.likely@secretlab.ca> M: Grant Likely <grant.likely@secretlab.ca>
M: Mark Brown <broonie@opensource.wolfsonmicro.com> M: Mark Brown <broonie@kernel.org>
L: spi-devel-general@lists.sourceforge.net L: spi-devel-general@lists.sourceforge.net
Q: http://patchwork.kernel.org/project/spi-devel-general/list/ Q: http://patchwork.kernel.org/project/spi-devel-general/list/
T: git git://git.secretlab.ca/git/linux-2.6.git T: git git://git.secretlab.ca/git/linux-2.6.git
...@@ -8713,7 +8713,7 @@ F: drivers/scsi/vmw_pvscsi.h ...@@ -8713,7 +8713,7 @@ F: drivers/scsi/vmw_pvscsi.h
VOLTAGE AND CURRENT REGULATOR FRAMEWORK VOLTAGE AND CURRENT REGULATOR FRAMEWORK
M: Liam Girdwood <lrg@ti.com> M: Liam Girdwood <lrg@ti.com>
M: Mark Brown <broonie@opensource.wolfsonmicro.com> M: Mark Brown <broonie@kernel.org>
W: http://opensource.wolfsonmicro.com/node/15 W: http://opensource.wolfsonmicro.com/node/15
W: http://www.slimlogic.co.uk/?p=48 W: http://www.slimlogic.co.uk/?p=48
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lrg/regulator.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/lrg/regulator.git
......
...@@ -584,7 +584,7 @@ static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w, ...@@ -584,7 +584,7 @@ static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event) struct snd_kcontrol *kcontrol, int event)
{ {
struct snd_soc_codec *codec = w->codec; struct snd_soc_codec *codec = w->codec;
struct arizona *arizona = dev_get_drvdata(codec->dev); struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
struct regmap *regmap = codec->control_data; struct regmap *regmap = codec->control_data;
const struct reg_default *patch = NULL; const struct reg_default *patch = NULL;
int i, patch_size; int i, patch_size;
......
...@@ -1083,6 +1083,8 @@ static const struct snd_soc_dapm_route wm8903_intercon[] = { ...@@ -1083,6 +1083,8 @@ static const struct snd_soc_dapm_route wm8903_intercon[] = {
{ "ROP", NULL, "Right Speaker PGA" }, { "ROP", NULL, "Right Speaker PGA" },
{ "RON", NULL, "Right Speaker PGA" }, { "RON", NULL, "Right Speaker PGA" },
{ "Charge Pump", NULL, "CLK_DSP" },
{ "Left Headphone Output PGA", NULL, "Charge Pump" }, { "Left Headphone Output PGA", NULL, "Charge Pump" },
{ "Right Headphone Output PGA", NULL, "Charge Pump" }, { "Right Headphone Output PGA", NULL, "Charge Pump" },
{ "Left Line Output PGA", NULL, "Charge Pump" }, { "Left Line Output PGA", NULL, "Charge Pump" },
......
...@@ -972,6 +972,7 @@ static const struct snd_soc_dai_ops samsung_i2s_dai_ops = { ...@@ -972,6 +972,7 @@ static const struct snd_soc_dai_ops samsung_i2s_dai_ops = {
static struct i2s_dai *i2s_alloc_dai(struct platform_device *pdev, bool sec) static struct i2s_dai *i2s_alloc_dai(struct platform_device *pdev, bool sec)
{ {
struct i2s_dai *i2s; struct i2s_dai *i2s;
int ret;
i2s = devm_kzalloc(&pdev->dev, sizeof(struct i2s_dai), GFP_KERNEL); i2s = devm_kzalloc(&pdev->dev, sizeof(struct i2s_dai), GFP_KERNEL);
if (i2s == NULL) if (i2s == NULL)
...@@ -996,15 +997,17 @@ static struct i2s_dai *i2s_alloc_dai(struct platform_device *pdev, bool sec) ...@@ -996,15 +997,17 @@ static struct i2s_dai *i2s_alloc_dai(struct platform_device *pdev, bool sec)
i2s->i2s_dai_drv.capture.channels_max = 2; i2s->i2s_dai_drv.capture.channels_max = 2;
i2s->i2s_dai_drv.capture.rates = SAMSUNG_I2S_RATES; i2s->i2s_dai_drv.capture.rates = SAMSUNG_I2S_RATES;
i2s->i2s_dai_drv.capture.formats = SAMSUNG_I2S_FMTS; i2s->i2s_dai_drv.capture.formats = SAMSUNG_I2S_FMTS;
dev_set_drvdata(&i2s->pdev->dev, i2s);
} else { /* Create a new platform_device for Secondary */ } else { /* Create a new platform_device for Secondary */
i2s->pdev = platform_device_register_resndata(NULL, i2s->pdev = platform_device_alloc("samsung-i2s-sec", -1);
"samsung-i2s-sec", -1, NULL, 0, NULL, 0);
if (IS_ERR(i2s->pdev)) if (IS_ERR(i2s->pdev))
return NULL; return NULL;
}
/* Pre-assign snd_soc_dai_set_drvdata */ platform_set_drvdata(i2s->pdev, i2s);
dev_set_drvdata(&i2s->pdev->dev, i2s); ret = platform_device_add(i2s->pdev);
if (ret < 0)
return NULL;
}
return i2s; return i2s;
} }
...@@ -1107,6 +1110,10 @@ static int samsung_i2s_probe(struct platform_device *pdev) ...@@ -1107,6 +1110,10 @@ static int samsung_i2s_probe(struct platform_device *pdev)
if (samsung_dai_type == TYPE_SEC) { if (samsung_dai_type == TYPE_SEC) {
sec_dai = dev_get_drvdata(&pdev->dev); sec_dai = dev_get_drvdata(&pdev->dev);
if (!sec_dai) {
dev_err(&pdev->dev, "Unable to get drvdata\n");
return -EFAULT;
}
snd_soc_register_dai(&sec_dai->pdev->dev, snd_soc_register_dai(&sec_dai->pdev->dev,
&sec_dai->i2s_dai_drv); &sec_dai->i2s_dai_drv);
asoc_dma_platform_register(&pdev->dev); asoc_dma_platform_register(&pdev->dev);
......
...@@ -211,19 +211,27 @@ static int soc_compr_set_params(struct snd_compr_stream *cstream, ...@@ -211,19 +211,27 @@ static int soc_compr_set_params(struct snd_compr_stream *cstream,
if (platform->driver->compr_ops && platform->driver->compr_ops->set_params) { if (platform->driver->compr_ops && platform->driver->compr_ops->set_params) {
ret = platform->driver->compr_ops->set_params(cstream, params); ret = platform->driver->compr_ops->set_params(cstream, params);
if (ret < 0) if (ret < 0)
goto out; goto err;
} }
if (rtd->dai_link->compr_ops && rtd->dai_link->compr_ops->set_params) { if (rtd->dai_link->compr_ops && rtd->dai_link->compr_ops->set_params) {
ret = rtd->dai_link->compr_ops->set_params(cstream); ret = rtd->dai_link->compr_ops->set_params(cstream);
if (ret < 0) if (ret < 0)
goto out; goto err;
} }
snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_PLAYBACK, snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_PLAYBACK,
SND_SOC_DAPM_STREAM_START); SND_SOC_DAPM_STREAM_START);
out: /* cancel any delayed stream shutdown that is pending */
rtd->pop_wait = 0;
mutex_unlock(&rtd->pcm_mutex);
cancel_delayed_work_sync(&rtd->delayed_work);
return ret;
err:
mutex_unlock(&rtd->pcm_mutex); mutex_unlock(&rtd->pcm_mutex);
return ret; return ret;
} }
......
...@@ -2963,7 +2963,7 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, ...@@ -2963,7 +2963,7 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
val = val << shift; val = val << shift;
ret = snd_soc_update_bits_locked(codec, reg, val_mask, val); ret = snd_soc_update_bits_locked(codec, reg, val_mask, val);
if (ret != 0) if (ret < 0)
return ret; return ret;
if (snd_soc_volsw_is_stereo(mc)) { if (snd_soc_volsw_is_stereo(mc)) {
......
...@@ -43,8 +43,6 @@ ...@@ -43,8 +43,6 @@
static const struct snd_pcm_hardware tegra_pcm_hardware = { static const struct snd_pcm_hardware tegra_pcm_hardware = {
.info = SNDRV_PCM_INFO_MMAP | .info = SNDRV_PCM_INFO_MMAP |
SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_MMAP_VALID |
SNDRV_PCM_INFO_PAUSE |
SNDRV_PCM_INFO_RESUME |
SNDRV_PCM_INFO_INTERLEAVED, SNDRV_PCM_INFO_INTERLEAVED,
.formats = SNDRV_PCM_FMTBIT_S16_LE, .formats = SNDRV_PCM_FMTBIT_S16_LE,
.channels_min = 2, .channels_min = 2,
...@@ -127,26 +125,6 @@ static int tegra_pcm_hw_free(struct snd_pcm_substream *substream) ...@@ -127,26 +125,6 @@ static int tegra_pcm_hw_free(struct snd_pcm_substream *substream)
return 0; return 0;
} }
static int tegra_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
{
switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
return snd_dmaengine_pcm_trigger(substream,
SNDRV_PCM_TRIGGER_START);
case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
return snd_dmaengine_pcm_trigger(substream,
SNDRV_PCM_TRIGGER_STOP);
default:
return -EINVAL;
}
return 0;
}
static int tegra_pcm_mmap(struct snd_pcm_substream *substream, static int tegra_pcm_mmap(struct snd_pcm_substream *substream,
struct vm_area_struct *vma) struct vm_area_struct *vma)
{ {
...@@ -164,7 +142,7 @@ static struct snd_pcm_ops tegra_pcm_ops = { ...@@ -164,7 +142,7 @@ static struct snd_pcm_ops tegra_pcm_ops = {
.ioctl = snd_pcm_lib_ioctl, .ioctl = snd_pcm_lib_ioctl,
.hw_params = tegra_pcm_hw_params, .hw_params = tegra_pcm_hw_params,
.hw_free = tegra_pcm_hw_free, .hw_free = tegra_pcm_hw_free,
.trigger = tegra_pcm_trigger, .trigger = snd_dmaengine_pcm_trigger,
.pointer = snd_dmaengine_pcm_pointer, .pointer = snd_dmaengine_pcm_pointer,
.mmap = tegra_pcm_mmap, .mmap = tegra_pcm_mmap,
}; };
......
...@@ -509,7 +509,7 @@ static int snd_nativeinstruments_control_get(struct snd_kcontrol *kcontrol, ...@@ -509,7 +509,7 @@ static int snd_nativeinstruments_control_get(struct snd_kcontrol *kcontrol,
else else
ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), bRequest, ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), bRequest,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
0, cpu_to_le16(wIndex), 0, wIndex,
&tmp, sizeof(tmp), 1000); &tmp, sizeof(tmp), 1000);
up_read(&mixer->chip->shutdown_rwsem); up_read(&mixer->chip->shutdown_rwsem);
...@@ -540,7 +540,7 @@ static int snd_nativeinstruments_control_put(struct snd_kcontrol *kcontrol, ...@@ -540,7 +540,7 @@ static int snd_nativeinstruments_control_put(struct snd_kcontrol *kcontrol,
else else
ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), bRequest, ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), bRequest,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
cpu_to_le16(wValue), cpu_to_le16(wIndex), wValue, wIndex,
NULL, 0, 1000); NULL, 0, 1000);
up_read(&mixer->chip->shutdown_rwsem); up_read(&mixer->chip->shutdown_rwsem);
......
...@@ -486,7 +486,7 @@ static int snd_usb_nativeinstruments_boot_quirk(struct usb_device *dev) ...@@ -486,7 +486,7 @@ static int snd_usb_nativeinstruments_boot_quirk(struct usb_device *dev)
{ {
int ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), int ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
0xaf, USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0xaf, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
cpu_to_le16(1), 0, NULL, 0, 1000); 1, 0, NULL, 0, 1000);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
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