ASoC: S3C64XX: Compress and generalize the CPU driver

The driver can be 'generalized' a bit by not hardcoding '2'(the number of
I2Sv3 controllers that the driver can handle) at many places, instead we
define a macro for it. That makes it easier to increase number of controllers
by changing the parameter at just one place, this will be useful when there is
support for newer SoCs, which have the same controller, only more in number.

Signed-off-by: Jassi Brar <jassi.brar@samsung.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
Jassi Brar 2009-12-09 13:29:25 +09:00 committed by Mark Brown
parent 168db50d96
commit 0fe692292a
1 changed files with 41 additions and 73 deletions

View File

@ -32,6 +32,11 @@
#include "s3c-dma.h" #include "s3c-dma.h"
#include "s3c64xx-i2s.h" #include "s3c64xx-i2s.h"
/* The value should be set to maximum of the total number
* of I2Sv3 controllers that any supported SoC has.
*/
#define MAX_I2SV3 2
static struct s3c2410_dma_client s3c64xx_dma_client_out = { static struct s3c2410_dma_client s3c64xx_dma_client_out = {
.name = "I2S PCM Stereo out" .name = "I2S PCM Stereo out"
}; };
@ -40,37 +45,12 @@ static struct s3c2410_dma_client s3c64xx_dma_client_in = {
.name = "I2S PCM Stereo in" .name = "I2S PCM Stereo in"
}; };
static struct s3c_dma_params s3c64xx_i2s_pcm_stereo_out[2] = { static struct s3c_dma_params s3c64xx_i2s_pcm_stereo_out[MAX_I2SV3];
[0] = { static struct s3c_dma_params s3c64xx_i2s_pcm_stereo_in[MAX_I2SV3];
.channel = DMACH_I2S0_OUT, static struct s3c_i2sv2_info s3c64xx_i2s[MAX_I2SV3];
.client = &s3c64xx_dma_client_out,
.dma_addr = S3C64XX_PA_IIS0 + S3C2412_IISTXD,
.dma_size = 4,
},
[1] = {
.channel = DMACH_I2S1_OUT,
.client = &s3c64xx_dma_client_out,
.dma_addr = S3C64XX_PA_IIS1 + S3C2412_IISTXD,
.dma_size = 4,
},
};
static struct s3c_dma_params s3c64xx_i2s_pcm_stereo_in[2] = { struct snd_soc_dai s3c64xx_i2s_dai[MAX_I2SV3];
[0] = { EXPORT_SYMBOL_GPL(s3c64xx_i2s_dai);
.channel = DMACH_I2S0_IN,
.client = &s3c64xx_dma_client_in,
.dma_addr = S3C64XX_PA_IIS0 + S3C2412_IISRXD,
.dma_size = 4,
},
[1] = {
.channel = DMACH_I2S1_IN,
.client = &s3c64xx_dma_client_in,
.dma_addr = S3C64XX_PA_IIS1 + S3C2412_IISRXD,
.dma_size = 4,
},
};
static struct s3c_i2sv2_info s3c64xx_i2s[2];
static inline struct s3c_i2sv2_info *to_info(struct snd_soc_dai *cpu_dai) static inline struct s3c_i2sv2_info *to_info(struct snd_soc_dai *cpu_dai)
{ {
@ -163,55 +143,13 @@ static struct snd_soc_dai_ops s3c64xx_i2s_dai_ops = {
.set_sysclk = s3c64xx_i2s_set_sysclk, .set_sysclk = s3c64xx_i2s_set_sysclk,
}; };
struct snd_soc_dai s3c64xx_i2s_dai[] = {
{
.name = "s3c64xx-i2s",
.id = 0,
.probe = s3c64xx_i2s_probe,
.playback = {
.channels_min = 2,
.channels_max = 2,
.rates = S3C64XX_I2S_RATES,
.formats = S3C64XX_I2S_FMTS,
},
.capture = {
.channels_min = 2,
.channels_max = 2,
.rates = S3C64XX_I2S_RATES,
.formats = S3C64XX_I2S_FMTS,
},
.ops = &s3c64xx_i2s_dai_ops,
.symmetric_rates = 1,
},
{
.name = "s3c64xx-i2s",
.id = 1,
.probe = s3c64xx_i2s_probe,
.playback = {
.channels_min = 2,
.channels_max = 2,
.rates = S3C64XX_I2S_RATES,
.formats = S3C64XX_I2S_FMTS,
},
.capture = {
.channels_min = 2,
.channels_max = 2,
.rates = S3C64XX_I2S_RATES,
.formats = S3C64XX_I2S_FMTS,
},
.ops = &s3c64xx_i2s_dai_ops,
.symmetric_rates = 1,
},
};
EXPORT_SYMBOL_GPL(s3c64xx_i2s_dai);
static __devinit int s3c64xx_iis_dev_probe(struct platform_device *pdev) static __devinit int s3c64xx_iis_dev_probe(struct platform_device *pdev)
{ {
struct s3c_i2sv2_info *i2s; struct s3c_i2sv2_info *i2s;
struct snd_soc_dai *dai; struct snd_soc_dai *dai;
int ret; int ret;
if (pdev->id >= ARRAY_SIZE(s3c64xx_i2s)) { if (pdev->id >= MAX_I2SV3) {
dev_err(&pdev->dev, "id %d out of range\n", pdev->id); dev_err(&pdev->dev, "id %d out of range\n", pdev->id);
return -EINVAL; return -EINVAL;
} }
@ -219,10 +157,40 @@ static __devinit int s3c64xx_iis_dev_probe(struct platform_device *pdev)
i2s = &s3c64xx_i2s[pdev->id]; i2s = &s3c64xx_i2s[pdev->id];
dai = &s3c64xx_i2s_dai[pdev->id]; dai = &s3c64xx_i2s_dai[pdev->id];
dai->dev = &pdev->dev; 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->dma_capture = &s3c64xx_i2s_pcm_stereo_in[pdev->id]; i2s->dma_capture = &s3c64xx_i2s_pcm_stereo_in[pdev->id];
i2s->dma_playback = &s3c64xx_i2s_pcm_stereo_out[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"); i2s->iis_cclk = clk_get(&pdev->dev, "audio-bus");
if (IS_ERR(i2s->iis_cclk)) { if (IS_ERR(i2s->iis_cclk)) {
dev_err(&pdev->dev, "failed to get audio-bus\n"); dev_err(&pdev->dev, "failed to get audio-bus\n");