static __devinit int s3c64xx_iis_dev_probe(struct platform_device *pdev) { struct s3c_i2sv2_info *i2s; struct snd_soc_dai *dai; int ret; if (pdev->id >= ARRAY_SIZE(s3c64xx_i2s)) { dev_err(&pdev->dev, "id %d out of range\n", pdev->id); return -EINVAL; } i2s = &s3c64xx_i2s[pdev->id]; dai = &s3c64xx_i2s_dai[pdev->id]; //dai->dev = &pdev->dev; i2s->dma_capture = &s3c64xx_i2s_pcm_stereo_in[pdev->id]; i2s->dma_playback = &s3c64xx_i2s_pcm_stereo_out[pdev->id]; i2s->iis_cclk = clk_get(&pdev->dev, "audio-bus"); if (IS_ERR(i2s->iis_cclk)) { dev_err(&pdev->dev, "failed to get audio-bus\n"); ret = PTR_ERR(i2s->iis_cclk); goto err; } clk_enable(i2s->iis_cclk); ret = s3c_i2sv2_probe(pdev, dai, i2s, 0); if (ret) { goto err_clk; } ret = s3c_i2sv2_register_dai(dai); if (ret != 0) { goto err_i2sv2; } return 0; err_i2sv2: /* Not implemented for I2Sv2 core yet */ err_clk: clk_put(i2s->iis_cclk); err: return ret; }
static __devinit int s3c64xx_iis_dev_probe(struct platform_device *pdev) { struct s3c_audio_pdata *i2s_pdata; struct s3c_i2sv2_info *i2s; struct resource *res; int i, ret; if (pdev->id >= MAX_I2SV3) { dev_err(&pdev->dev, "id %d out of range\n", pdev->id); return -EINVAL; } i2s = &s3c64xx_i2s[pdev->id]; i2s->dma_capture = &s3c64xx_i2s_pcm_stereo_in[pdev->id]; i2s->dma_playback = &s3c64xx_i2s_pcm_stereo_out[pdev->id]; res = platform_get_resource(pdev, IORESOURCE_DMA, 0); if (!res) { dev_err(&pdev->dev, "Unable to get I2S-TX dma resource\n"); return -ENXIO; } i2s->dma_playback->channel = res->start; res = platform_get_resource(pdev, IORESOURCE_DMA, 1); if (!res) { dev_err(&pdev->dev, "Unable to get I2S-RX dma resource\n"); return -ENXIO; } i2s->dma_capture->channel = res->start; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(&pdev->dev, "Unable to get I2S SFR address\n"); return -ENXIO; } if (!request_mem_region(res->start, resource_size(res), "s3c64xx-i2s")) { dev_err(&pdev->dev, "Unable to request SFR region\n"); return -EBUSY; } i2s->base = res->start; i2s_pdata = pdev->dev.platform_data; if (i2s_pdata && i2s_pdata->cfg_gpio && i2s_pdata->cfg_gpio(pdev)) { dev_err(&pdev->dev, "Unable to configure gpio\n"); return -EINVAL; } i2s->dma_capture->dma_addr = res->start + S3C2412_IISRXD; i2s->dma_playback->dma_addr = res->start + S3C2412_IISTXD; i2s->dma_capture->client = &s3c64xx_dma_client_in; i2s->dma_capture->dma_size = 4; i2s->dma_playback->client = &s3c64xx_dma_client_out; i2s->dma_playback->dma_size = 4; for (i = 0; i < ARRAY_SIZE(s3c64xx_i2s_dai); i++) { ret = s3c_i2sv2_register_dai(&pdev->dev, i, &s3c64xx_i2s_dai[i]); if (ret != 0) return ret; } return 0; }
static int __init s3c2412_i2s_init(void) { return s3c_i2sv2_register_dai(&s3c2412_i2s_dai); }
static __devinit int s3c64xx_iis_dev_probe(struct platform_device *pdev) { struct s3c_i2sv2_info *i2s; struct snd_soc_dai *dai; int ret; if (pdev->id >= MAX_I2SV3) { dev_err(&pdev->dev, "id %d out of range\n", pdev->id); return -EINVAL; } i2s = &s3c64xx_i2s[pdev->id]; dai = &s3c64xx_i2s_dai[pdev->id]; dai->dev = &pdev->dev; dai->name = "s3c64xx-i2s"; dai->id = pdev->id; dai->symmetric_rates = 1; dai->playback.channels_min = 2; dai->playback.channels_max = 2; dai->playback.rates = S3C64XX_I2S_RATES; dai->playback.formats = S3C64XX_I2S_FMTS; dai->capture.channels_min = 2; dai->capture.channels_max = 2; dai->capture.rates = S3C64XX_I2S_RATES; dai->capture.formats = S3C64XX_I2S_FMTS; dai->probe = s3c64xx_i2s_probe; dai->ops = &s3c64xx_i2s_dai_ops; i2s->feature |= S3C_FEATURE_CDCLKCON; i2s->dma_capture = &s3c64xx_i2s_pcm_stereo_in[pdev->id]; i2s->dma_playback = &s3c64xx_i2s_pcm_stereo_out[pdev->id]; if (pdev->id == 0) { i2s->dma_capture->channel = DMACH_I2S0_IN; i2s->dma_capture->dma_addr = S3C64XX_PA_IIS0 + S3C2412_IISRXD; i2s->dma_playback->channel = DMACH_I2S0_OUT; i2s->dma_playback->dma_addr = S3C64XX_PA_IIS0 + S3C2412_IISTXD; } else { i2s->dma_capture->channel = DMACH_I2S1_IN; i2s->dma_capture->dma_addr = S3C64XX_PA_IIS1 + S3C2412_IISRXD; i2s->dma_playback->channel = DMACH_I2S1_OUT; i2s->dma_playback->dma_addr = S3C64XX_PA_IIS1 + S3C2412_IISTXD; } i2s->dma_capture->client = &s3c64xx_dma_client_in; i2s->dma_capture->dma_size = 4; i2s->dma_playback->client = &s3c64xx_dma_client_out; i2s->dma_playback->dma_size = 4; i2s->iis_cclk = clk_get(&pdev->dev, "audio-bus"); if (IS_ERR(i2s->iis_cclk)) { dev_err(&pdev->dev, "failed to get audio-bus\n"); ret = PTR_ERR(i2s->iis_cclk); goto err; } clk_enable(i2s->iis_cclk); ret = s3c_i2sv2_probe(pdev, dai, i2s, 0); if (ret) goto err_clk; ret = s3c_i2sv2_register_dai(dai); if (ret != 0) goto err_i2sv2; return 0; err_i2sv2: /* Not implemented for I2Sv2 core yet */ err_clk: clk_put(i2s->iis_cclk); err: return ret; }
static __devinit int s3c2412_iis_dev_probe(struct platform_device *pdev) { return s3c_i2sv2_register_dai(&pdev->dev, -1, &s3c2412_i2s_dai); }
static __devinit int s3c64xx_i2sv4_dev_probe(struct platform_device *pdev) { struct s3c_audio_pdata *i2s_pdata; struct s3c_i2sv2_info *i2s; struct resource *res; int ret; i2s = &s3c64xx_i2sv4; i2s->feature |= S3C_FEATURE_CDCLKCON; i2s->dma_capture = &s3c64xx_i2sv4_pcm_stereo_in; i2s->dma_playback = &s3c64xx_i2sv4_pcm_stereo_out; res = platform_get_resource(pdev, IORESOURCE_DMA, 0); if (!res) { dev_err(&pdev->dev, "Unable to get I2S-TX dma resource\n"); return -ENXIO; } i2s->dma_playback->channel = res->start; res = platform_get_resource(pdev, IORESOURCE_DMA, 1); if (!res) { dev_err(&pdev->dev, "Unable to get I2S-RX dma resource\n"); return -ENXIO; } i2s->dma_capture->channel = res->start; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(&pdev->dev, "Unable to get I2S SFR address\n"); return -ENXIO; } if (!request_mem_region(res->start, resource_size(res), "s3c64xx-i2s-v4")) { dev_err(&pdev->dev, "Unable to request SFR region\n"); return -EBUSY; } i2s->dma_capture->dma_addr = res->start + S3C2412_IISRXD; i2s->dma_playback->dma_addr = res->start + S3C2412_IISTXD; i2s->dma_capture->client = &s3c64xx_dma_client_in; i2s->dma_capture->dma_size = 4; i2s->dma_playback->client = &s3c64xx_dma_client_out; i2s->dma_playback->dma_size = 4; i2s->base = res->start; i2s_pdata = pdev->dev.platform_data; if (i2s_pdata && i2s_pdata->cfg_gpio && i2s_pdata->cfg_gpio(pdev)) { dev_err(&pdev->dev, "Unable to configure gpio\n"); return -EINVAL; } i2s->iis_cclk = clk_get(&pdev->dev, "audio-bus"); if (IS_ERR(i2s->iis_cclk)) { dev_err(&pdev->dev, "failed to get audio-bus\n"); ret = PTR_ERR(i2s->iis_cclk); goto err; } clk_enable(i2s->iis_cclk); ret = s3c_i2sv2_register_dai(&pdev->dev, pdev->id, &s3c64xx_i2s_v4_dai); if (ret != 0) goto err_i2sv2; return 0; err_i2sv2: clk_put(i2s->iis_cclk); err: return ret; }