Version:  2.0.40 2.2.26 2.4.37 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18

Linux/sound/soc/cirrus/edb93xx.c

  1 /*
  2  * SoC audio for EDB93xx
  3  *
  4  * Copyright (c) 2010 Alexander Sverdlin <subaparts@yandex.ru>
  5  *
  6  * This program is free software; you can redistribute it and/or
  7  * modify it under the terms of the GNU General Public License
  8  * as published by the Free Software Foundation; either version 2
  9  * of the License, or (at your option) any later version.
 10  *
 11  * This program is distributed in the hope that it will be useful,
 12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 14  * GNU General Public License for more details.
 15  *
 16  * This driver support CS4271 codec being master or slave, working
 17  * in control port mode, connected either via SPI or I2C.
 18  * The data format accepted is I2S or left-justified.
 19  * DAPM support not implemented.
 20  */
 21 
 22 #include <linux/platform_device.h>
 23 #include <linux/gpio.h>
 24 #include <linux/module.h>
 25 #include <sound/core.h>
 26 #include <sound/pcm.h>
 27 #include <sound/soc.h>
 28 #include <asm/mach-types.h>
 29 #include <mach/hardware.h>
 30 
 31 static int edb93xx_hw_params(struct snd_pcm_substream *substream,
 32                              struct snd_pcm_hw_params *params)
 33 {
 34         struct snd_soc_pcm_runtime *rtd = substream->private_data;
 35         struct snd_soc_dai *codec_dai = rtd->codec_dai;
 36         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
 37         int err;
 38         unsigned int mclk_rate;
 39         unsigned int rate = params_rate(params);
 40 
 41         /*
 42          * According to CS4271 datasheet we use MCLK/LRCK=256 for
 43          * rates below 50kHz and 128 for higher sample rates
 44          */
 45         if (rate < 50000)
 46                 mclk_rate = rate * 64 * 4;
 47         else
 48                 mclk_rate = rate * 64 * 2;
 49 
 50         err = snd_soc_dai_set_sysclk(codec_dai, 0, mclk_rate,
 51                                      SND_SOC_CLOCK_IN);
 52         if (err)
 53                 return err;
 54 
 55         return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_rate,
 56                                       SND_SOC_CLOCK_OUT);
 57 }
 58 
 59 static struct snd_soc_ops edb93xx_ops = {
 60         .hw_params      = edb93xx_hw_params,
 61 };
 62 
 63 static struct snd_soc_dai_link edb93xx_dai = {
 64         .name           = "CS4271",
 65         .stream_name    = "CS4271 HiFi",
 66         .platform_name  = "ep93xx-i2s",
 67         .cpu_dai_name   = "ep93xx-i2s",
 68         .codec_name     = "spi0.0",
 69         .codec_dai_name = "cs4271-hifi",
 70         .dai_fmt        = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_IF |
 71                           SND_SOC_DAIFMT_CBS_CFS,
 72         .ops            = &edb93xx_ops,
 73 };
 74 
 75 static struct snd_soc_card snd_soc_edb93xx = {
 76         .name           = "EDB93XX",
 77         .owner          = THIS_MODULE,
 78         .dai_link       = &edb93xx_dai,
 79         .num_links      = 1,
 80 };
 81 
 82 static int edb93xx_probe(struct platform_device *pdev)
 83 {
 84         struct snd_soc_card *card = &snd_soc_edb93xx;
 85         int ret;
 86 
 87         ret = ep93xx_i2s_acquire();
 88         if (ret)
 89                 return ret;
 90 
 91         card->dev = &pdev->dev;
 92 
 93         ret = snd_soc_register_card(card);
 94         if (ret) {
 95                 dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
 96                         ret);
 97                 ep93xx_i2s_release();
 98         }
 99 
100         return ret;
101 }
102 
103 static int edb93xx_remove(struct platform_device *pdev)
104 {
105         struct snd_soc_card *card = platform_get_drvdata(pdev);
106 
107         snd_soc_unregister_card(card);
108         ep93xx_i2s_release();
109 
110         return 0;
111 }
112 
113 static struct platform_driver edb93xx_driver = {
114         .driver         = {
115                 .name   = "edb93xx-audio",
116                 .owner  = THIS_MODULE,
117         },
118         .probe          = edb93xx_probe,
119         .remove         = edb93xx_remove,
120 };
121 
122 module_platform_driver(edb93xx_driver);
123 
124 MODULE_AUTHOR("Alexander Sverdlin <subaparts@yandex.ru>");
125 MODULE_DESCRIPTION("ALSA SoC EDB93xx");
126 MODULE_LICENSE("GPL");
127 MODULE_ALIAS("platform:edb93xx-audio");
128 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us