]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - sound/soc/davinci/davinci-mcasp.c
Merge tag 'v2.6.37' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / sound / soc / davinci / davinci-mcasp.c
index b24720894af64a183a68aec1925a77419b5d0ad5..fb55d2c5d704ff25983fd5ef4d16dfc461e60a76 100644 (file)
@@ -422,7 +422,7 @@ static void davinci_mcasp_stop(struct davinci_audio_dev *dev, int stream)
 static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
                                         unsigned int fmt)
 {
-       struct davinci_audio_dev *dev = cpu_dai->private_data;
+       struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
        void __iomem *base = dev->base;
 
        switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
@@ -709,7 +709,7 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
                                        struct snd_pcm_hw_params *params,
                                        struct snd_soc_dai *cpu_dai)
 {
-       struct davinci_audio_dev *dev = cpu_dai->private_data;
+       struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
        struct davinci_pcm_dma_params *dma_params =
                                        &dev->dma_params[substream->stream];
        int word_length;
@@ -761,8 +761,7 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
 static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
                                     int cmd, struct snd_soc_dai *cpu_dai)
 {
-       struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct davinci_audio_dev *dev = rtd->dai->cpu_dai->private_data;
+       struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
        int ret = 0;
 
        switch (cmd) {
@@ -797,17 +796,26 @@ static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
        return ret;
 }
 
+static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
+                                struct snd_soc_dai *dai)
+{
+       struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(dai);
+
+       snd_soc_dai_set_dma_data(dai, substream, dev->dma_params);
+       return 0;
+}
+
 static struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
+       .startup        = davinci_mcasp_startup,
        .trigger        = davinci_mcasp_trigger,
        .hw_params      = davinci_mcasp_hw_params,
        .set_fmt        = davinci_mcasp_set_dai_fmt,
 
 };
 
-struct snd_soc_dai davinci_mcasp_dai[] = {
+static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
        {
-               .name           = "davinci-i2s",
-               .id             = 0,
+               .name           = "davinci-mcasp.0",
                .playback       = {
                        .channels_min   = 2,
                        .channels_max   = 2,
@@ -828,8 +836,7 @@ struct snd_soc_dai davinci_mcasp_dai[] = {
 
        },
        {
-               .name           = "davinci-dit",
-               .id             = 1,
+               "davinci-mcasp.1",
                .playback       = {
                        .channels_min   = 1,
                        .channels_max   = 384,
@@ -840,7 +847,6 @@ struct snd_soc_dai davinci_mcasp_dai[] = {
        },
 
 };
-EXPORT_SYMBOL_GPL(davinci_mcasp_dai);
 
 static int davinci_mcasp_probe(struct platform_device *pdev)
 {
@@ -899,6 +905,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
        res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
        if (!res) {
                dev_err(&pdev->dev, "no DMA resource\n");
+               ret = -ENODEV;
                goto err_release_region;
        }
 
@@ -913,15 +920,13 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
        res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
        if (!res) {
                dev_err(&pdev->dev, "no DMA resource\n");
+               ret = -ENODEV;
                goto err_release_region;
        }
 
        dma_data->channel = res->start;
-       davinci_mcasp_dai[pdata->op_mode].private_data = dev;
-       davinci_mcasp_dai[pdata->op_mode].capture.dma_data = dev->dma_params;
-       davinci_mcasp_dai[pdata->op_mode].playback.dma_data = dev->dma_params;
-       davinci_mcasp_dai[pdata->op_mode].dev = &pdev->dev;
-       ret = snd_soc_register_dai(&davinci_mcasp_dai[pdata->op_mode]);
+       dev_set_drvdata(&pdev->dev, dev);
+       ret = snd_soc_register_dai(&pdev->dev, &davinci_mcasp_dai[pdata->op_mode]);
 
        if (ret != 0)
                goto err_release_region;
@@ -937,12 +942,10 @@ err_release_data:
 
 static int davinci_mcasp_remove(struct platform_device *pdev)
 {
-       struct snd_platform_data *pdata = pdev->dev.platform_data;
-       struct davinci_audio_dev *dev;
+       struct davinci_audio_dev *dev = dev_get_drvdata(&pdev->dev);
        struct resource *mem;
 
-       snd_soc_unregister_dai(&davinci_mcasp_dai[pdata->op_mode]);
-       dev = davinci_mcasp_dai[pdata->op_mode].private_data;
+       snd_soc_unregister_dai(&pdev->dev);
        clk_disable(dev->clk);
        clk_put(dev->clk);
        dev->clk = NULL;