|
|
|
@ -68,6 +68,8 @@ static struct idma_info { |
|
|
|
|
dma_addr_t lp_tx_addr; |
|
|
|
|
} idma; |
|
|
|
|
|
|
|
|
|
static int idma_irq; |
|
|
|
|
|
|
|
|
|
static void idma_getpos(dma_addr_t *src) |
|
|
|
|
{ |
|
|
|
|
*src = idma.lp_tx_addr + |
|
|
|
@ -305,7 +307,7 @@ static int idma_open(struct snd_pcm_substream *substream) |
|
|
|
|
if (prtd == NULL) |
|
|
|
|
return -ENOMEM; |
|
|
|
|
|
|
|
|
|
ret = request_irq(IRQ_I2S0, iis_irq, 0, "i2s", prtd); |
|
|
|
|
ret = request_irq(idma_irq, iis_irq, 0, "i2s", prtd); |
|
|
|
|
if (ret < 0) { |
|
|
|
|
pr_err("fail to claim i2s irq , ret = %d\n", ret); |
|
|
|
|
kfree(prtd); |
|
|
|
@ -324,7 +326,7 @@ static int idma_close(struct snd_pcm_substream *substream) |
|
|
|
|
struct snd_pcm_runtime *runtime = substream->runtime; |
|
|
|
|
struct idma_ctrl *prtd = runtime->private_data; |
|
|
|
|
|
|
|
|
|
free_irq(IRQ_I2S0, prtd); |
|
|
|
|
free_irq(idma_irq, prtd); |
|
|
|
|
|
|
|
|
|
if (!prtd) |
|
|
|
|
pr_err("idma_close called with prtd == NULL\n"); |
|
|
|
@ -409,6 +411,7 @@ void idma_reg_addr_init(void __iomem *regs, dma_addr_t addr) |
|
|
|
|
idma.regs = regs; |
|
|
|
|
idma.lp_tx_addr = addr; |
|
|
|
|
} |
|
|
|
|
EXPORT_SYMBOL_GPL(idma_reg_addr_init); |
|
|
|
|
|
|
|
|
|
static struct snd_soc_platform_driver asoc_idma_platform = { |
|
|
|
|
.ops = &idma_ops, |
|
|
|
@ -418,6 +421,10 @@ static struct snd_soc_platform_driver asoc_idma_platform = { |
|
|
|
|
|
|
|
|
|
static int asoc_idma_platform_probe(struct platform_device *pdev) |
|
|
|
|
{ |
|
|
|
|
idma_irq = platform_get_irq(pdev, 0); |
|
|
|
|
if (idma_irq < 0) |
|
|
|
|
return idma_irq; |
|
|
|
|
|
|
|
|
|
return snd_soc_register_platform(&pdev->dev, &asoc_idma_platform); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|