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
This commit is contained in:
commit
c455ea4f12
12 changed files with 50 additions and 28 deletions
|
@ -7211,6 +7211,9 @@ W: http://opensource.wolfsonmicro.com/content/linux-drivers-wolfson-devices
|
|||
S: Supported
|
||||
F: Documentation/hwmon/wm83??
|
||||
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/power/wm83*.c
|
||||
F: drivers/rtc/rtc-wm83*.c
|
||||
|
@ -7220,6 +7223,7 @@ F: drivers/watchdog/wm83*_wdt.c
|
|||
F: include/linux/mfd/wm831x/
|
||||
F: include/linux/mfd/wm8350/
|
||||
F: include/linux/mfd/wm8400*
|
||||
F: include/linux/wm97xx.h
|
||||
F: include/sound/wm????.h
|
||||
F: sound/soc/codecs/wm*
|
||||
|
||||
|
|
|
@ -1761,6 +1761,10 @@ static int wait_for_avail(struct snd_pcm_substream *substream,
|
|||
snd_pcm_uframes_t avail = 0;
|
||||
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)
|
||||
wait_time = MAX_SCHEDULE_TIMEOUT;
|
||||
else {
|
||||
|
@ -1771,16 +1775,32 @@ static int wait_for_avail(struct snd_pcm_substream *substream,
|
|||
}
|
||||
wait_time = msecs_to_jiffies(wait_time * 1000);
|
||||
}
|
||||
init_waitqueue_entry(&wait, current);
|
||||
add_wait_queue(&runtime->tsleep, &wait);
|
||||
|
||||
for (;;) {
|
||||
if (signal_pending(current)) {
|
||||
err = -ERESTARTSYS;
|
||||
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);
|
||||
tout = schedule_timeout_interruptible(wait_time);
|
||||
|
||||
tout = schedule_timeout(wait_time);
|
||||
|
||||
snd_pcm_stream_lock_irq(substream);
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
switch (runtime->status->state) {
|
||||
case SNDRV_PCM_STATE_SUSPENDED:
|
||||
err = -ESTRPIPE;
|
||||
|
@ -1806,14 +1826,9 @@ static int wait_for_avail(struct snd_pcm_substream *substream,
|
|||
err = -EIO;
|
||||
break;
|
||||
}
|
||||
if (is_playback)
|
||||
avail = snd_pcm_playback_avail(runtime);
|
||||
else
|
||||
avail = snd_pcm_capture_avail(runtime);
|
||||
if (avail >= runtime->twake)
|
||||
break;
|
||||
}
|
||||
_endloop:
|
||||
set_current_state(TASK_RUNNING);
|
||||
remove_wait_queue(&runtime->tsleep, &wait);
|
||||
*availp = avail;
|
||||
return err;
|
||||
|
|
|
@ -579,9 +579,13 @@ int snd_hda_get_conn_index(struct hda_codec *codec, hda_nid_t mux,
|
|||
return -1;
|
||||
}
|
||||
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)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
EXPORT_SYMBOL_HDA(snd_hda_get_conn_index);
|
||||
|
|
|
@ -535,7 +535,7 @@ static int add_volume(struct hda_codec *codec, const char *name,
|
|||
int index, unsigned int pval, int dir,
|
||||
struct snd_kcontrol **kctlp)
|
||||
{
|
||||
char tmp[32];
|
||||
char tmp[44];
|
||||
struct snd_kcontrol_new knew =
|
||||
HDA_CODEC_VOLUME_IDX(tmp, index, 0, 0, HDA_OUTPUT);
|
||||
knew.private_value = pval;
|
||||
|
|
|
@ -103,7 +103,7 @@ static struct snd_soc_dai_link bf5xx_ad193x_dai[] = {
|
|||
.cpu_dai_name = "bfin-tdm.0",
|
||||
.codec_dai_name ="ad193x-hifi",
|
||||
.platform_name = "bfin-tdm-pcm-audio",
|
||||
.codec_name = "ad193x.5",
|
||||
.codec_name = "spi0.5",
|
||||
.ops = &bf5xx_ad193x_ops,
|
||||
},
|
||||
{
|
||||
|
@ -112,7 +112,7 @@ static struct snd_soc_dai_link bf5xx_ad193x_dai[] = {
|
|||
.cpu_dai_name = "bfin-tdm.1",
|
||||
.codec_dai_name ="ad193x-hifi",
|
||||
.platform_name = "bfin-tdm-pcm-audio",
|
||||
.codec_name = "ad193x.5",
|
||||
.codec_name = "spi0.5",
|
||||
.ops = &bf5xx_ad193x_ops,
|
||||
},
|
||||
};
|
||||
|
|
|
@ -369,7 +369,7 @@ static struct snd_soc_platform_driver mpc5200_audio_dma_platform = {
|
|||
.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;
|
||||
struct psc_dma *psc_dma;
|
||||
|
@ -487,7 +487,7 @@ out_unmap:
|
|||
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);
|
||||
|
||||
|
@ -519,7 +519,7 @@ MODULE_DEVICE_TABLE(of, mpc5200_hpcd_match);
|
|||
static struct platform_driver mpc5200_hpcd_of_driver = {
|
||||
.probe = mpc5200_hpcd_probe,
|
||||
.remove = mpc5200_hpcd_remove,
|
||||
.dev = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "mpc5200-pcm-audio",
|
||||
.of_match_table = mpc5200_hpcd_match,
|
||||
|
|
|
@ -240,7 +240,6 @@ static int ssi_irq = 0;
|
|||
|
||||
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_pcm *pcm = rtd->pcm;
|
||||
int ret;
|
||||
|
|
|
@ -424,7 +424,7 @@ static __devinit int kirkwood_i2s_dev_probe(struct platform_device *pdev)
|
|||
if (!priv->mem) {
|
||||
dev_err(&pdev->dev, "request_mem_region failed\n");
|
||||
err = -EBUSY;
|
||||
goto error_alloc;
|
||||
goto err_alloc;
|
||||
}
|
||||
|
||||
priv->io = ioremap(priv->mem->start, SZ_16K);
|
||||
|
|
|
@ -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);
|
||||
for (i = 0; i < rbnode->blklen; ++i) {
|
||||
regtmp = rbnode->base_reg + i;
|
||||
WARN_ON(codec->writable_register &&
|
||||
codec->writable_register(codec, regtmp));
|
||||
val = snd_soc_rbtree_get_register(rbnode, i);
|
||||
def = snd_soc_get_cache_val(codec->reg_def_copy, i,
|
||||
rbnode->word_size);
|
||||
if (val == def)
|
||||
continue;
|
||||
|
||||
WARN_ON(!snd_soc_codec_writable_register(codec, regtmp));
|
||||
|
||||
codec->cache_bypass = 1;
|
||||
ret = snd_soc_write(codec, regtmp, val);
|
||||
codec->cache_bypass = 0;
|
||||
|
@ -563,8 +563,7 @@ static int snd_soc_lzo_cache_sync(struct snd_soc_codec *codec)
|
|||
|
||||
lzo_blocks = codec->reg_cache;
|
||||
for_each_set_bit(i, lzo_blocks[0]->sync_bmp, lzo_blocks[0]->sync_bmp_nbits) {
|
||||
WARN_ON(codec->writable_register &&
|
||||
codec->writable_register(codec, i));
|
||||
WARN_ON(!snd_soc_codec_writable_register(codec, i));
|
||||
ret = snd_soc_cache_read(codec, i, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -823,8 +822,6 @@ static int snd_soc_flat_cache_sync(struct snd_soc_codec *codec)
|
|||
|
||||
codec_drv = codec->driver;
|
||||
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);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -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,
|
||||
i, codec_drv->reg_word_size) == val)
|
||||
continue;
|
||||
|
||||
WARN_ON(!snd_soc_codec_writable_register(codec, i));
|
||||
|
||||
ret = snd_soc_write(codec, i, val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
|
@ -1633,7 +1633,7 @@ int snd_soc_codec_readable_register(struct snd_soc_codec *codec,
|
|||
if (codec->readable_register)
|
||||
return codec->readable_register(codec, reg);
|
||||
else
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_codec_readable_register);
|
||||
|
||||
|
@ -1651,7 +1651,7 @@ int snd_soc_codec_writable_register(struct snd_soc_codec *codec,
|
|||
if (codec->writable_register)
|
||||
return codec->writable_register(codec, reg);
|
||||
else
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_codec_writable_register);
|
||||
|
||||
|
|
|
@ -2763,7 +2763,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend);
|
|||
|
||||
/**
|
||||
* snd_soc_dapm_free - free dapm resources
|
||||
* @card: SoC device
|
||||
* @dapm: DAPM context
|
||||
*
|
||||
* Free all dapm widgets and resources.
|
||||
*/
|
||||
|
|
|
@ -105,7 +105,7 @@ void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask)
|
|||
|
||||
snd_soc_dapm_sync(dapm);
|
||||
|
||||
snd_jack_report(jack->jack, status);
|
||||
snd_jack_report(jack->jack, jack->status);
|
||||
|
||||
out:
|
||||
mutex_unlock(&codec->mutex);
|
||||
|
|
Loading…
Reference in a new issue