/* trb: extra param dai added in function prototype as per v 2.6.29 */ static int s3c_i2s_v50_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { int ret = 0; s3cdbg("Entered %s: cmd = %d\n", __FUNCTION__, cmd); switch (cmd) { case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: if (!s3c24xx_snd_is_clkmaster()) { ret = s3c24xx_snd_lrsync(); if (ret) goto exit_err; } if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) s5pc1xx_snd_rxctrl(1); else s5pc1xx_snd_txctrl(1); break; case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) s5pc1xx_snd_rxctrl(0); else s5pc1xx_snd_txctrl(0); break; default: ret = -EINVAL; break; } exit_err: return ret; }
int s5pc1xx_12s1_probe(struct platform_device *pdev, struct snd_soc_dai *dai, struct s3c_i2sv2_info *i2s, unsigned long base) { int ret; unsigned int gpio; struct device *dev = &pdev->dev; s3cdbg("Entered %s\n", __FUNCTION__); // Configure the I2S pins : GPC[n] -> I2S1 for (gpio = S5PC1XX_GPC(0); gpio <= S5PC1XX_GPC(4); gpio++) { s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP); } i2s->dev = dev; /* record our i2s structure for later use in the callbacks */ dai->private_data = i2s; if (!base) { struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(dev, "Unable to get register resource\n"); return -ENXIO; } if (!request_mem_region(res->start, resource_size(res), "s3c64xx-i2s-v4")) { dev_err(dev, "Unable to request register region\n"); return -EBUSY; } base = res->start; // i2s->dma_capture->dma_addr = (dma_addr_t)res->start + S5PC1XX_IISFIFORX; // i2s->dma_playback->dma_addr = (dma_addr_t)res->start + S5PC1XX_IISFIFO; } i2s->regs = ioremap(S5PC1XX_PA_IIS1, 0x100); if (i2s->regs == NULL) return -ENXIO; i2s->iis_clk=clk_get(&pdev->dev, "iis"); if (i2s->iis_clk == NULL) { printk("failed to get iis_clock\n"); iounmap(i2s->regs); return -ENODEV; } clk_enable(i2s->iis_clk); ret = request_irq(IRQ_I2S1, s5pc1xx_iis1_irq, 0,"s5p-i2s1", NULL); if (ret < 0){ printk("fail to claim i2s irq , ret = %d\n", ret); iounmap(i2s->regs); return -ENODEV; } s5pc1xx_spdif_probe( pdev, dai); s5pc1xx_snd_txctrl(i2s, 0); s5pc1xx_snd_rxctrl(i2s, 0); s5pc1xx_spdif_txctrl(0); return 0; }