/* 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;
}
Example #2
0
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;
}