Merge branches 'arm', 'at91', 'bcmring', 'ep93xx', 'mach-types', 'misc' and 'w90x900' into devel
此提交包含在:

提交者
Russell King

@@ -281,38 +281,6 @@ static struct snd_soc_card snd_soc_at91sam9g20ek = {
|
||||
.set_bias_level = at91sam9g20ek_set_bias_level,
|
||||
};
|
||||
|
||||
/*
|
||||
* FIXME: This is a temporary bodge to avoid cross-tree merge issues.
|
||||
* New drivers should register the wm8731 I2C device in the machine
|
||||
* setup code (under arch/arm for ARM systems).
|
||||
*/
|
||||
static int wm8731_i2c_register(void)
|
||||
{
|
||||
struct i2c_board_info info;
|
||||
struct i2c_adapter *adapter;
|
||||
struct i2c_client *client;
|
||||
|
||||
memset(&info, 0, sizeof(struct i2c_board_info));
|
||||
info.addr = 0x1b;
|
||||
strlcpy(info.type, "wm8731", I2C_NAME_SIZE);
|
||||
|
||||
adapter = i2c_get_adapter(0);
|
||||
if (!adapter) {
|
||||
printk(KERN_ERR "can't get i2c adapter 0\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
client = i2c_new_device(adapter, &info);
|
||||
i2c_put_adapter(adapter);
|
||||
if (!client) {
|
||||
printk(KERN_ERR "can't add i2c device at 0x%x\n",
|
||||
(unsigned int)info.addr);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct snd_soc_device at91sam9g20ek_snd_devdata = {
|
||||
.card = &snd_soc_at91sam9g20ek,
|
||||
.codec_dev = &soc_codec_dev_wm8731,
|
||||
@@ -367,10 +335,6 @@ static int __init at91sam9g20ek_init(void)
|
||||
}
|
||||
ssc_p->ssc = ssc;
|
||||
|
||||
ret = wm8731_i2c_register();
|
||||
if (ret != 0)
|
||||
goto err_ssc;
|
||||
|
||||
at91sam9g20ek_snd_device = platform_device_alloc("soc-audio", -1);
|
||||
if (!at91sam9g20ek_snd_device) {
|
||||
printk(KERN_ERR "ASoC: Platform device allocation failed\n");
|
||||
|
@@ -79,7 +79,7 @@ static const u16 wm8753_reg[] = {
|
||||
0x0097, 0x0097, 0x0000, 0x0004,
|
||||
0x0000, 0x0083, 0x0024, 0x01ba,
|
||||
0x0000, 0x0083, 0x0024, 0x01ba,
|
||||
0x0000, 0x0000
|
||||
0x0000, 0x0000, 0x0000
|
||||
};
|
||||
|
||||
/* codec private data */
|
||||
@@ -1660,11 +1660,11 @@ static int wm8753_register(struct wm8753_priv *wm8753)
|
||||
codec->set_bias_level = wm8753_set_bias_level;
|
||||
codec->dai = wm8753_dai;
|
||||
codec->num_dai = 2;
|
||||
codec->reg_cache_size = ARRAY_SIZE(wm8753->reg_cache);
|
||||
codec->reg_cache_size = ARRAY_SIZE(wm8753->reg_cache) + 1;
|
||||
codec->reg_cache = &wm8753->reg_cache;
|
||||
codec->private_data = wm8753;
|
||||
|
||||
memcpy(codec->reg_cache, wm8753_reg, sizeof(codec->reg_cache));
|
||||
memcpy(codec->reg_cache, wm8753_reg, sizeof(wm8753->reg_cache));
|
||||
INIT_DELAYED_WORK(&codec->delayed_work, wm8753_work);
|
||||
|
||||
ret = wm8753_reset(codec);
|
||||
|
@@ -33,7 +33,7 @@ config SND_SOC_MPC5200_I2S
|
||||
config SND_SOC_MPC5200_AC97
|
||||
tristate "Freescale MPC5200 PSC in AC97 mode driver"
|
||||
depends on PPC_MPC52xx && PPC_BESTCOMM
|
||||
select AC97_BUS
|
||||
select SND_SOC_AC97_BUS
|
||||
select SND_MPC52xx_DMA
|
||||
select PPC_BESTCOMM_GEN_BD
|
||||
help
|
||||
@@ -41,7 +41,7 @@ config SND_SOC_MPC5200_AC97
|
||||
|
||||
config SND_MPC52xx_SOC_PCM030
|
||||
tristate "SoC AC97 Audio support for Phytec pcm030 and WM9712"
|
||||
depends on PPC_MPC5200_SIMPLE && BROKEN
|
||||
depends on PPC_MPC5200_SIMPLE
|
||||
select SND_SOC_MPC5200_AC97
|
||||
select SND_SOC_WM9712
|
||||
help
|
||||
@@ -50,7 +50,7 @@ config SND_MPC52xx_SOC_PCM030
|
||||
|
||||
config SND_MPC52xx_SOC_EFIKA
|
||||
tristate "SoC AC97 Audio support for bbplan Efika and STAC9766"
|
||||
depends on PPC_EFIKA && BROKEN
|
||||
depends on PPC_EFIKA
|
||||
select SND_SOC_MPC5200_AC97
|
||||
select SND_SOC_STAC9766
|
||||
help
|
||||
|
@@ -456,6 +456,7 @@ int mpc5200_audio_dma_create(struct of_device *op)
|
||||
return -ENODEV;
|
||||
|
||||
spin_lock_init(&psc_dma->lock);
|
||||
mutex_init(&psc_dma->mutex);
|
||||
psc_dma->id = be32_to_cpu(*prop);
|
||||
psc_dma->irq = irq;
|
||||
psc_dma->psc_regs = regs;
|
||||
|
@@ -55,6 +55,7 @@ struct psc_dma {
|
||||
unsigned int irq;
|
||||
struct device *dev;
|
||||
spinlock_t lock;
|
||||
struct mutex mutex;
|
||||
u32 sicr;
|
||||
uint sysclk;
|
||||
int imr;
|
||||
|
@@ -34,13 +34,20 @@ static unsigned short psc_ac97_read(struct snd_ac97 *ac97, unsigned short reg)
|
||||
int status;
|
||||
unsigned int val;
|
||||
|
||||
mutex_lock(&psc_dma->mutex);
|
||||
|
||||
/* Wait for command send status zero = ready */
|
||||
status = spin_event_timeout(!(in_be16(&psc_dma->psc_regs->sr_csr.status) &
|
||||
MPC52xx_PSC_SR_CMDSEND), 100, 0);
|
||||
if (status == 0) {
|
||||
pr_err("timeout on ac97 bus (rdy)\n");
|
||||
mutex_unlock(&psc_dma->mutex);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Force clear the data valid bit */
|
||||
in_be32(&psc_dma->psc_regs->ac97_data);
|
||||
|
||||
/* Send the read */
|
||||
out_be32(&psc_dma->psc_regs->ac97_cmd, (1<<31) | ((reg & 0x7f) << 24));
|
||||
|
||||
@@ -50,16 +57,19 @@ static unsigned short psc_ac97_read(struct snd_ac97 *ac97, unsigned short reg)
|
||||
if (status == 0) {
|
||||
pr_err("timeout on ac97 read (val) %x\n",
|
||||
in_be16(&psc_dma->psc_regs->sr_csr.status));
|
||||
mutex_unlock(&psc_dma->mutex);
|
||||
return -ENODEV;
|
||||
}
|
||||
/* Get the data */
|
||||
val = in_be32(&psc_dma->psc_regs->ac97_data);
|
||||
if (((val >> 24) & 0x7f) != reg) {
|
||||
pr_err("reg echo error on ac97 read\n");
|
||||
mutex_unlock(&psc_dma->mutex);
|
||||
return -ENODEV;
|
||||
}
|
||||
val = (val >> 8) & 0xffff;
|
||||
|
||||
mutex_unlock(&psc_dma->mutex);
|
||||
return (unsigned short) val;
|
||||
}
|
||||
|
||||
@@ -68,16 +78,21 @@ static void psc_ac97_write(struct snd_ac97 *ac97,
|
||||
{
|
||||
int status;
|
||||
|
||||
mutex_lock(&psc_dma->mutex);
|
||||
|
||||
/* Wait for command status zero = ready */
|
||||
status = spin_event_timeout(!(in_be16(&psc_dma->psc_regs->sr_csr.status) &
|
||||
MPC52xx_PSC_SR_CMDSEND), 100, 0);
|
||||
if (status == 0) {
|
||||
pr_err("timeout on ac97 bus (write)\n");
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
/* Write data */
|
||||
out_be32(&psc_dma->psc_regs->ac97_cmd,
|
||||
((reg & 0x7f) << 24) | (val << 8));
|
||||
|
||||
out:
|
||||
mutex_unlock(&psc_dma->mutex);
|
||||
}
|
||||
|
||||
static void psc_ac97_warm_reset(struct snd_ac97 *ac97)
|
||||
|
@@ -216,12 +216,15 @@ static snd_pcm_uframes_t omap_pcm_pointer(struct snd_pcm_substream *substream)
|
||||
dma_addr_t ptr;
|
||||
snd_pcm_uframes_t offset;
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
ptr = omap_get_dma_src_pos(prtd->dma_ch);
|
||||
else
|
||||
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
|
||||
ptr = omap_get_dma_dst_pos(prtd->dma_ch);
|
||||
offset = bytes_to_frames(runtime, ptr - runtime->dma_addr);
|
||||
} else if (!(cpu_is_omap1510())) {
|
||||
ptr = omap_get_dma_src_pos(prtd->dma_ch);
|
||||
offset = bytes_to_frames(runtime, ptr - runtime->dma_addr);
|
||||
} else
|
||||
offset = prtd->period_index * runtime->period_size;
|
||||
|
||||
offset = bytes_to_frames(runtime, ptr - runtime->dma_addr);
|
||||
if (offset >= runtime->buffer_size)
|
||||
offset = 0;
|
||||
|
||||
|
@@ -167,6 +167,7 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream,
|
||||
|
||||
BUG_ON(IS_ERR(clk_i2s));
|
||||
clk_enable(clk_i2s);
|
||||
dai->private_data = dai;
|
||||
pxa_i2s_wait();
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
@@ -255,7 +256,10 @@ static void pxa2xx_i2s_shutdown(struct snd_pcm_substream *substream,
|
||||
if ((SACR1 & (SACR1_DREC | SACR1_DRPL)) == (SACR1_DREC | SACR1_DRPL)) {
|
||||
SACR0 &= ~SACR0_ENB;
|
||||
pxa_i2s_wait();
|
||||
clk_disable(clk_i2s);
|
||||
if (dai->private_data != NULL) {
|
||||
clk_disable(clk_i2s);
|
||||
dai->private_data = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -336,6 +340,7 @@ static int pxa2xx_i2s_probe(struct platform_device *dev)
|
||||
return PTR_ERR(clk_i2s);
|
||||
|
||||
pxa_i2s_dai.dev = &dev->dev;
|
||||
pxa_i2s_dai.private_data = NULL;
|
||||
ret = snd_soc_register_dai(&pxa_i2s_dai);
|
||||
if (ret != 0)
|
||||
clk_put(clk_i2s);
|
||||
|
新增問題並參考
封鎖使用者