Commit c455ea4f authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://github.com/tiwai/sound

* 'for-linus' of git://github.com/tiwai/sound:
  ALSA: pcm - fix race condition in wait_for_avail()
  ALSA: HDA: Cirrus - fix "Surround Speaker" volume control name
  ALSA: hda - Terminate the recursive connection search properly
  ASoC: Fix trivial build regression in Kirkwood I2S
  ASoC: Blackfin: bf5xx-ad193x: Fix codec device name
  ASoC: Fix reporting of partial jack updates
  ASoC: imx: Fix build warning of unused 'card' variable
  ASoC: Fix register cache sync register_writable WARN_ONs
  ASoC: snd_soc_codec_{readable,writable}_register change default to true
  ASoC: soc-dapm: Fix parameter comment for snd_soc_dapm_free
  MAINTAINERS: Add some missed Wolfson files
  ASoC: MPC5200: replace of_device with platform_device
parents a7f934d4 763437a9
...@@ -7211,6 +7211,9 @@ W: http://opensource.wolfsonmicro.com/content/linux-drivers-wolfson-devices ...@@ -7211,6 +7211,9 @@ W: http://opensource.wolfsonmicro.com/content/linux-drivers-wolfson-devices
S: Supported S: Supported
F: Documentation/hwmon/wm83?? F: Documentation/hwmon/wm83??
F: drivers/leds/leds-wm83*.c F: drivers/leds/leds-wm83*.c
F: drivers/input/misc/wm831x-on.c
F: drivers/input/touchscreen/wm831x-ts.c
F: drivers/input/touchscreen/wm97*.c
F: drivers/mfd/wm8*.c F: drivers/mfd/wm8*.c
F: drivers/power/wm83*.c F: drivers/power/wm83*.c
F: drivers/rtc/rtc-wm83*.c F: drivers/rtc/rtc-wm83*.c
...@@ -7220,6 +7223,7 @@ F: drivers/watchdog/wm83*_wdt.c ...@@ -7220,6 +7223,7 @@ F: drivers/watchdog/wm83*_wdt.c
F: include/linux/mfd/wm831x/ F: include/linux/mfd/wm831x/
F: include/linux/mfd/wm8350/ F: include/linux/mfd/wm8350/
F: include/linux/mfd/wm8400* F: include/linux/mfd/wm8400*
F: include/linux/wm97xx.h
F: include/sound/wm????.h F: include/sound/wm????.h
F: sound/soc/codecs/wm* F: sound/soc/codecs/wm*
......
...@@ -1761,6 +1761,10 @@ static int wait_for_avail(struct snd_pcm_substream *substream, ...@@ -1761,6 +1761,10 @@ static int wait_for_avail(struct snd_pcm_substream *substream,
snd_pcm_uframes_t avail = 0; snd_pcm_uframes_t avail = 0;
long wait_time, tout; long wait_time, tout;
init_waitqueue_entry(&wait, current);
set_current_state(TASK_INTERRUPTIBLE);
add_wait_queue(&runtime->tsleep, &wait);
if (runtime->no_period_wakeup) if (runtime->no_period_wakeup)
wait_time = MAX_SCHEDULE_TIMEOUT; wait_time = MAX_SCHEDULE_TIMEOUT;
else { else {
...@@ -1771,16 +1775,32 @@ static int wait_for_avail(struct snd_pcm_substream *substream, ...@@ -1771,16 +1775,32 @@ static int wait_for_avail(struct snd_pcm_substream *substream,
} }
wait_time = msecs_to_jiffies(wait_time * 1000); wait_time = msecs_to_jiffies(wait_time * 1000);
} }
init_waitqueue_entry(&wait, current);
add_wait_queue(&runtime->tsleep, &wait);
for (;;) { for (;;) {
if (signal_pending(current)) { if (signal_pending(current)) {
err = -ERESTARTSYS; err = -ERESTARTSYS;
break; break;
} }
/*
* We need to check if space became available already
* (and thus the wakeup happened already) first to close
* the race of space already having become available.
* This check must happen after been added to the waitqueue
* and having current state be INTERRUPTIBLE.
*/
if (is_playback)
avail = snd_pcm_playback_avail(runtime);
else
avail = snd_pcm_capture_avail(runtime);
if (avail >= runtime->twake)
break;
snd_pcm_stream_unlock_irq(substream); snd_pcm_stream_unlock_irq(substream);
tout = schedule_timeout_interruptible(wait_time);
tout = schedule_timeout(wait_time);
snd_pcm_stream_lock_irq(substream); snd_pcm_stream_lock_irq(substream);
set_current_state(TASK_INTERRUPTIBLE);
switch (runtime->status->state) { switch (runtime->status->state) {
case SNDRV_PCM_STATE_SUSPENDED: case SNDRV_PCM_STATE_SUSPENDED:
err = -ESTRPIPE; err = -ESTRPIPE;
...@@ -1806,14 +1826,9 @@ static int wait_for_avail(struct snd_pcm_substream *substream, ...@@ -1806,14 +1826,9 @@ static int wait_for_avail(struct snd_pcm_substream *substream,
err = -EIO; err = -EIO;
break; break;
} }
if (is_playback)
avail = snd_pcm_playback_avail(runtime);
else
avail = snd_pcm_capture_avail(runtime);
if (avail >= runtime->twake)
break;
} }
_endloop: _endloop:
set_current_state(TASK_RUNNING);
remove_wait_queue(&runtime->tsleep, &wait); remove_wait_queue(&runtime->tsleep, &wait);
*availp = avail; *availp = avail;
return err; return err;
......
...@@ -579,9 +579,13 @@ int snd_hda_get_conn_index(struct hda_codec *codec, hda_nid_t mux, ...@@ -579,9 +579,13 @@ int snd_hda_get_conn_index(struct hda_codec *codec, hda_nid_t mux,
return -1; return -1;
} }
recursive++; recursive++;
for (i = 0; i < nums; i++) for (i = 0; i < nums; i++) {
unsigned int type = get_wcaps_type(get_wcaps(codec, conn[i]));
if (type == AC_WID_PIN || type == AC_WID_AUD_OUT)
continue;
if (snd_hda_get_conn_index(codec, conn[i], nid, recursive) >= 0) if (snd_hda_get_conn_index(codec, conn[i], nid, recursive) >= 0)
return i; return i;
}
return -1; return -1;
} }
EXPORT_SYMBOL_HDA(snd_hda_get_conn_index); EXPORT_SYMBOL_HDA(snd_hda_get_conn_index);
......
...@@ -535,7 +535,7 @@ static int add_volume(struct hda_codec *codec, const char *name, ...@@ -535,7 +535,7 @@ static int add_volume(struct hda_codec *codec, const char *name,
int index, unsigned int pval, int dir, int index, unsigned int pval, int dir,
struct snd_kcontrol **kctlp) struct snd_kcontrol **kctlp)
{ {
char tmp[32]; char tmp[44];
struct snd_kcontrol_new knew = struct snd_kcontrol_new knew =
HDA_CODEC_VOLUME_IDX(tmp, index, 0, 0, HDA_OUTPUT); HDA_CODEC_VOLUME_IDX(tmp, index, 0, 0, HDA_OUTPUT);
knew.private_value = pval; knew.private_value = pval;
......
...@@ -103,7 +103,7 @@ static struct snd_soc_dai_link bf5xx_ad193x_dai[] = { ...@@ -103,7 +103,7 @@ static struct snd_soc_dai_link bf5xx_ad193x_dai[] = {
.cpu_dai_name = "bfin-tdm.0", .cpu_dai_name = "bfin-tdm.0",
.codec_dai_name ="ad193x-hifi", .codec_dai_name ="ad193x-hifi",
.platform_name = "bfin-tdm-pcm-audio", .platform_name = "bfin-tdm-pcm-audio",
.codec_name = "ad193x.5", .codec_name = "spi0.5",
.ops = &bf5xx_ad193x_ops, .ops = &bf5xx_ad193x_ops,
}, },
{ {
...@@ -112,7 +112,7 @@ static struct snd_soc_dai_link bf5xx_ad193x_dai[] = { ...@@ -112,7 +112,7 @@ static struct snd_soc_dai_link bf5xx_ad193x_dai[] = {
.cpu_dai_name = "bfin-tdm.1", .cpu_dai_name = "bfin-tdm.1",
.codec_dai_name ="ad193x-hifi", .codec_dai_name ="ad193x-hifi",
.platform_name = "bfin-tdm-pcm-audio", .platform_name = "bfin-tdm-pcm-audio",
.codec_name = "ad193x.5", .codec_name = "spi0.5",
.ops = &bf5xx_ad193x_ops, .ops = &bf5xx_ad193x_ops,
}, },
}; };
......
...@@ -369,7 +369,7 @@ static struct snd_soc_platform_driver mpc5200_audio_dma_platform = { ...@@ -369,7 +369,7 @@ static struct snd_soc_platform_driver mpc5200_audio_dma_platform = {
.pcm_free = &psc_dma_free, .pcm_free = &psc_dma_free,
}; };
static int mpc5200_hpcd_probe(struct of_device *op) static int mpc5200_hpcd_probe(struct platform_device *op)
{ {
phys_addr_t fifo; phys_addr_t fifo;
struct psc_dma *psc_dma; struct psc_dma *psc_dma;
...@@ -487,7 +487,7 @@ static int mpc5200_hpcd_probe(struct of_device *op) ...@@ -487,7 +487,7 @@ static int mpc5200_hpcd_probe(struct of_device *op)
return ret; return ret;
} }
static int mpc5200_hpcd_remove(struct of_device *op) static int mpc5200_hpcd_remove(struct platform_device *op)
{ {
struct psc_dma *psc_dma = dev_get_drvdata(&op->dev); struct psc_dma *psc_dma = dev_get_drvdata(&op->dev);
...@@ -519,7 +519,7 @@ MODULE_DEVICE_TABLE(of, mpc5200_hpcd_match); ...@@ -519,7 +519,7 @@ MODULE_DEVICE_TABLE(of, mpc5200_hpcd_match);
static struct platform_driver mpc5200_hpcd_of_driver = { static struct platform_driver mpc5200_hpcd_of_driver = {
.probe = mpc5200_hpcd_probe, .probe = mpc5200_hpcd_probe,
.remove = mpc5200_hpcd_remove, .remove = mpc5200_hpcd_remove,
.dev = { .driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = "mpc5200-pcm-audio", .name = "mpc5200-pcm-audio",
.of_match_table = mpc5200_hpcd_match, .of_match_table = mpc5200_hpcd_match,
......
...@@ -240,7 +240,6 @@ static int ssi_irq = 0; ...@@ -240,7 +240,6 @@ static int ssi_irq = 0;
static int imx_pcm_fiq_new(struct snd_soc_pcm_runtime *rtd) static int imx_pcm_fiq_new(struct snd_soc_pcm_runtime *rtd)
{ {
struct snd_card *card = rtd->card->snd_card;
struct snd_soc_dai *dai = rtd->cpu_dai; struct snd_soc_dai *dai = rtd->cpu_dai;
struct snd_pcm *pcm = rtd->pcm; struct snd_pcm *pcm = rtd->pcm;
int ret; int ret;
......
...@@ -424,7 +424,7 @@ static __devinit int kirkwood_i2s_dev_probe(struct platform_device *pdev) ...@@ -424,7 +424,7 @@ static __devinit int kirkwood_i2s_dev_probe(struct platform_device *pdev)
if (!priv->mem) { if (!priv->mem) {
dev_err(&pdev->dev, "request_mem_region failed\n"); dev_err(&pdev->dev, "request_mem_region failed\n");
err = -EBUSY; err = -EBUSY;
goto error_alloc; goto err_alloc;
} }
priv->io = ioremap(priv->mem->start, SZ_16K); priv->io = ioremap(priv->mem->start, SZ_16K);
......
...@@ -203,14 +203,14 @@ static int snd_soc_rbtree_cache_sync(struct snd_soc_codec *codec) ...@@ -203,14 +203,14 @@ static int snd_soc_rbtree_cache_sync(struct snd_soc_codec *codec)
rbnode = rb_entry(node, struct snd_soc_rbtree_node, node); rbnode = rb_entry(node, struct snd_soc_rbtree_node, node);
for (i = 0; i < rbnode->blklen; ++i) { for (i = 0; i < rbnode->blklen; ++i) {
regtmp = rbnode->base_reg + i; regtmp = rbnode->base_reg + i;
WARN_ON(codec->writable_register &&
codec->writable_register(codec, regtmp));
val = snd_soc_rbtree_get_register(rbnode, i); val = snd_soc_rbtree_get_register(rbnode, i);
def = snd_soc_get_cache_val(codec->reg_def_copy, i, def = snd_soc_get_cache_val(codec->reg_def_copy, i,
rbnode->word_size); rbnode->word_size);
if (val == def) if (val == def)
continue; continue;
WARN_ON(!snd_soc_codec_writable_register(codec, regtmp));
codec->cache_bypass = 1; codec->cache_bypass = 1;
ret = snd_soc_write(codec, regtmp, val); ret = snd_soc_write(codec, regtmp, val);
codec->cache_bypass = 0; codec->cache_bypass = 0;
...@@ -563,8 +563,7 @@ static int snd_soc_lzo_cache_sync(struct snd_soc_codec *codec) ...@@ -563,8 +563,7 @@ static int snd_soc_lzo_cache_sync(struct snd_soc_codec *codec)
lzo_blocks = codec->reg_cache; lzo_blocks = codec->reg_cache;
for_each_set_bit(i, lzo_blocks[0]->sync_bmp, lzo_blocks[0]->sync_bmp_nbits) { for_each_set_bit(i, lzo_blocks[0]->sync_bmp, lzo_blocks[0]->sync_bmp_nbits) {
WARN_ON(codec->writable_register && WARN_ON(!snd_soc_codec_writable_register(codec, i));
codec->writable_register(codec, i));
ret = snd_soc_cache_read(codec, i, &val); ret = snd_soc_cache_read(codec, i, &val);
if (ret) if (ret)
return ret; return ret;
...@@ -823,8 +822,6 @@ static int snd_soc_flat_cache_sync(struct snd_soc_codec *codec) ...@@ -823,8 +822,6 @@ static int snd_soc_flat_cache_sync(struct snd_soc_codec *codec)
codec_drv = codec->driver; codec_drv = codec->driver;
for (i = 0; i < codec_drv->reg_cache_size; ++i) { for (i = 0; i < codec_drv->reg_cache_size; ++i) {
WARN_ON(codec->writable_register &&
codec->writable_register(codec, i));
ret = snd_soc_cache_read(codec, i, &val); ret = snd_soc_cache_read(codec, i, &val);
if (ret) if (ret)
return ret; return ret;
...@@ -832,6 +829,9 @@ static int snd_soc_flat_cache_sync(struct snd_soc_codec *codec) ...@@ -832,6 +829,9 @@ static int snd_soc_flat_cache_sync(struct snd_soc_codec *codec)
if (snd_soc_get_cache_val(codec->reg_def_copy, if (snd_soc_get_cache_val(codec->reg_def_copy,
i, codec_drv->reg_word_size) == val) i, codec_drv->reg_word_size) == val)
continue; continue;
WARN_ON(!snd_soc_codec_writable_register(codec, i));
ret = snd_soc_write(codec, i, val); ret = snd_soc_write(codec, i, val);
if (ret) if (ret)
return ret; return ret;
......
...@@ -1633,7 +1633,7 @@ int snd_soc_codec_readable_register(struct snd_soc_codec *codec, ...@@ -1633,7 +1633,7 @@ int snd_soc_codec_readable_register(struct snd_soc_codec *codec,
if (codec->readable_register) if (codec->readable_register)
return codec->readable_register(codec, reg); return codec->readable_register(codec, reg);
else else
return 0; return 1;
} }
EXPORT_SYMBOL_GPL(snd_soc_codec_readable_register); EXPORT_SYMBOL_GPL(snd_soc_codec_readable_register);
...@@ -1651,7 +1651,7 @@ int snd_soc_codec_writable_register(struct snd_soc_codec *codec, ...@@ -1651,7 +1651,7 @@ int snd_soc_codec_writable_register(struct snd_soc_codec *codec,
if (codec->writable_register) if (codec->writable_register)
return codec->writable_register(codec, reg); return codec->writable_register(codec, reg);
else else
return 0; return 1;
} }
EXPORT_SYMBOL_GPL(snd_soc_codec_writable_register); EXPORT_SYMBOL_GPL(snd_soc_codec_writable_register);
......
...@@ -2763,7 +2763,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend); ...@@ -2763,7 +2763,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend);
/** /**
* snd_soc_dapm_free - free dapm resources * snd_soc_dapm_free - free dapm resources
* @card: SoC device * @dapm: DAPM context
* *
* Free all dapm widgets and resources. * Free all dapm widgets and resources.
*/ */
......
...@@ -105,7 +105,7 @@ void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask) ...@@ -105,7 +105,7 @@ void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask)
snd_soc_dapm_sync(dapm); snd_soc_dapm_sync(dapm);
snd_jack_report(jack->jack, status); snd_jack_report(jack->jack, jack->status);
out: out:
mutex_unlock(&codec->mutex); mutex_unlock(&codec->mutex);
......
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