db1200.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /*
  2. * DB1200 ASoC audio fabric support code.
  3. *
  4. * (c) 2008-9 Manuel Lauss <manuel.lauss@gmail.com>
  5. *
  6. */
  7. #include <linux/module.h>
  8. #include <linux/moduleparam.h>
  9. #include <linux/timer.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/platform_device.h>
  12. #include <sound/core.h>
  13. #include <sound/pcm.h>
  14. #include <sound/soc.h>
  15. #include <sound/soc-dapm.h>
  16. #include <asm/mach-au1x00/au1000.h>
  17. #include <asm/mach-au1x00/au1xxx_psc.h>
  18. #include <asm/mach-au1x00/au1xxx_dbdma.h>
  19. #include <asm/mach-db1x00/bcsr.h>
  20. #include "../codecs/wm8731.h"
  21. #include "psc.h"
  22. /*------------------------- AC97 PART ---------------------------*/
  23. static struct snd_soc_dai_link db1200_ac97_dai = {
  24. .name = "AC97",
  25. .stream_name = "AC97 HiFi",
  26. .codec_dai_name = "ac97-hifi",
  27. .cpu_dai_name = "au1xpsc_ac97.1",
  28. .platform_name = "au1xpsc-pcm.1",
  29. .codec_name = "ac97-codec.1",
  30. };
  31. static struct snd_soc_card db1200_ac97_machine = {
  32. .name = "DB1200_AC97",
  33. .dai_link = &db1200_ac97_dai,
  34. .num_links = 1,
  35. };
  36. /*------------------------- I2S PART ---------------------------*/
  37. static int db1200_i2s_startup(struct snd_pcm_substream *substream)
  38. {
  39. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  40. struct snd_soc_dai *codec_dai = rtd->codec_dai;
  41. struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
  42. int ret;
  43. /* WM8731 has its own 12MHz crystal */
  44. snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_XTAL,
  45. 12000000, SND_SOC_CLOCK_IN);
  46. /* codec is bitclock and lrclk master */
  47. ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_LEFT_J |
  48. SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM);
  49. if (ret < 0)
  50. goto out;
  51. ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_LEFT_J |
  52. SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM);
  53. if (ret < 0)
  54. goto out;
  55. ret = 0;
  56. out:
  57. return ret;
  58. }
  59. static struct snd_soc_ops db1200_i2s_wm8731_ops = {
  60. .startup = db1200_i2s_startup,
  61. };
  62. static struct snd_soc_dai_link db1200_i2s_dai = {
  63. .name = "WM8731",
  64. .stream_name = "WM8731 PCM",
  65. .codec_dai_name = "wm8731-hifi",
  66. .cpu_dai_name = "au1xpsc_i2s.1",
  67. .platform_name = "au1xpsc-pcm.1",
  68. .codec_name = "wm8731-codec.0-001b",
  69. .ops = &db1200_i2s_wm8731_ops,
  70. };
  71. static struct snd_soc_card db1200_i2s_machine = {
  72. .name = "DB1200_I2S",
  73. .dai_link = &db1200_i2s_dai,
  74. .num_links = 1,
  75. };
  76. /*------------------------- COMMON PART ---------------------------*/
  77. static struct platform_device *db1200_asoc_dev;
  78. static int __init db1200_audio_load(void)
  79. {
  80. int ret;
  81. ret = -ENOMEM;
  82. db1200_asoc_dev = platform_device_alloc("soc-audio", 1); /* PSC1 */
  83. if (!db1200_asoc_dev)
  84. goto out;
  85. /* DB1200 board setup set PSC1MUX to preferred audio device */
  86. if (bcsr_read(BCSR_RESETS) & BCSR_RESETS_PSC1MUX)
  87. platform_set_drvdata(db1200_asoc_dev, &db1200_i2s_machine);
  88. else
  89. platform_set_drvdata(db1200_asoc_dev, &db1200_ac97_machine);
  90. ret = platform_device_add(db1200_asoc_dev);
  91. if (ret) {
  92. platform_device_put(db1200_asoc_dev);
  93. db1200_asoc_dev = NULL;
  94. }
  95. out:
  96. return ret;
  97. }
  98. static void __exit db1200_audio_unload(void)
  99. {
  100. platform_device_unregister(db1200_asoc_dev);
  101. }
  102. module_init(db1200_audio_load);
  103. module_exit(db1200_audio_unload);
  104. MODULE_LICENSE("GPL");
  105. MODULE_DESCRIPTION("DB1200 ASoC audio support");
  106. MODULE_AUTHOR("Manuel Lauss");