| OLD | NEW |
| (Empty) | |
| 1 /* |
| 2 * smdk_wm8994.c |
| 3 * |
| 4 * This program is free software; you can redistribute it and/or modify it |
| 5 * under the terms of the GNU General Public License as published by the |
| 6 * Free Software Foundation; either version 2 of the License, or (at your |
| 7 * option) any later version. |
| 8 */ |
| 9 |
| 10 #include "../codecs/wm8994.h" |
| 11 |
| 12 /* |
| 13 * Default CFG switch settings to use this driver: |
| 14 * SMDKV310: CFG5-1000, CFG7-111111 |
| 15 */ |
| 16 |
| 17 /* |
| 18 * Configure audio route as :- |
| 19 * $ amixer sset 'DAC1' on,on |
| 20 * $ amixer sset 'Right Headphone Mux' 'DAC' |
| 21 * $ amixer sset 'Left Headphone Mux' 'DAC' |
| 22 * $ amixer sset 'DAC1R Mixer AIF1.1' on |
| 23 * $ amixer sset 'DAC1L Mixer AIF1.1' on |
| 24 * $ amixer sset 'IN2L' on |
| 25 * $ amixer sset 'IN2L PGA IN2LN' on |
| 26 * $ amixer sset 'MIXINL IN2L' on |
| 27 * $ amixer sset 'AIF1ADC1L Mixer ADC/DMIC' on |
| 28 * $ amixer sset 'IN2R' on |
| 29 * $ amixer sset 'IN2R PGA IN2RN' on |
| 30 * $ amixer sset 'MIXINR IN2R' on |
| 31 * $ amixer sset 'AIF1ADC1R Mixer ADC/DMIC' on |
| 32 */ |
| 33 |
| 34 /* SMDK has a 16.934MHZ crystal attached to WM8994 */ |
| 35 #define SMDK_WM8994_FREQ 16934000 |
| 36 |
| 37 static int smdk_hw_params(struct snd_pcm_substream *substream, |
| 38 struct snd_pcm_hw_params *params) |
| 39 { |
| 40 struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 41 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; |
| 42 struct snd_soc_dai *codec_dai = rtd->codec_dai; |
| 43 unsigned int pll_out; |
| 44 int ret; |
| 45 |
| 46 /* AIF1CLK should be >=3MHz for optimal performance */ |
| 47 if (params_rate(params) == 8000 || params_rate(params) == 11025) |
| 48 pll_out = params_rate(params) * 512; |
| 49 else |
| 50 pll_out = params_rate(params) * 256; |
| 51 |
| 52 ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
| 53 | SND_SOC_DAIFMT_NB_NF |
| 54 | SND_SOC_DAIFMT_CBM_CFM); |
| 55 if (ret < 0) |
| 56 return ret; |
| 57 |
| 58 ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
| 59 | SND_SOC_DAIFMT_NB_NF |
| 60 | SND_SOC_DAIFMT_CBM_CFM); |
| 61 if (ret < 0) |
| 62 return ret; |
| 63 |
| 64 ret = snd_soc_dai_set_pll(codec_dai, WM8994_FLL1, WM8994_FLL_SRC_MCLK1, |
| 65 SMDK_WM8994_FREQ, pll_out); |
| 66 if (ret < 0) |
| 67 return ret; |
| 68 |
| 69 ret = snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_FLL1, |
| 70 pll_out, SND_SOC_CLOCK_IN); |
| 71 if (ret < 0) |
| 72 return ret; |
| 73 |
| 74 return 0; |
| 75 } |
| 76 |
| 77 /* |
| 78 * SMDK WM8994 DAI operations. |
| 79 */ |
| 80 static struct snd_soc_ops smdk_ops = { |
| 81 .hw_params = smdk_hw_params, |
| 82 }; |
| 83 |
| 84 static int smdk_wm8994_init_paiftx(struct snd_soc_pcm_runtime *rtd) |
| 85 { |
| 86 struct snd_soc_codec *codec = rtd->codec; |
| 87 struct snd_soc_dapm_context *dapm = &codec->dapm; |
| 88 |
| 89 /* HeadPhone */ |
| 90 snd_soc_dapm_enable_pin(dapm, "HPOUT1R"); |
| 91 snd_soc_dapm_enable_pin(dapm, "HPOUT1L"); |
| 92 |
| 93 /* MicIn */ |
| 94 snd_soc_dapm_enable_pin(dapm, "IN1LN"); |
| 95 snd_soc_dapm_enable_pin(dapm, "IN1RN"); |
| 96 |
| 97 /* LineIn */ |
| 98 snd_soc_dapm_enable_pin(dapm, "IN2LN"); |
| 99 snd_soc_dapm_enable_pin(dapm, "IN2RN"); |
| 100 |
| 101 /* Other pins NC */ |
| 102 snd_soc_dapm_nc_pin(dapm, "HPOUT2P"); |
| 103 snd_soc_dapm_nc_pin(dapm, "HPOUT2N"); |
| 104 snd_soc_dapm_nc_pin(dapm, "SPKOUTLN"); |
| 105 snd_soc_dapm_nc_pin(dapm, "SPKOUTLP"); |
| 106 snd_soc_dapm_nc_pin(dapm, "SPKOUTRP"); |
| 107 snd_soc_dapm_nc_pin(dapm, "SPKOUTRN"); |
| 108 snd_soc_dapm_nc_pin(dapm, "LINEOUT1N"); |
| 109 snd_soc_dapm_nc_pin(dapm, "LINEOUT1P"); |
| 110 snd_soc_dapm_nc_pin(dapm, "LINEOUT2N"); |
| 111 snd_soc_dapm_nc_pin(dapm, "LINEOUT2P"); |
| 112 snd_soc_dapm_nc_pin(dapm, "IN1LP"); |
| 113 snd_soc_dapm_nc_pin(dapm, "IN2LP:VXRN"); |
| 114 snd_soc_dapm_nc_pin(dapm, "IN1RP"); |
| 115 snd_soc_dapm_nc_pin(dapm, "IN2RP:VXRP"); |
| 116 |
| 117 snd_soc_dapm_sync(dapm); |
| 118 |
| 119 return 0; |
| 120 } |
| 121 |
| 122 static struct snd_soc_dai_link smdk_dai[] = { |
| 123 { /* Primary DAI i/f */ |
| 124 .name = "WM8994 AIF1", |
| 125 .stream_name = "Pri_Dai", |
| 126 .cpu_dai_name = "samsung-i2s.0", |
| 127 .codec_dai_name = "wm8994-aif1", |
| 128 .platform_name = "samsung-audio", |
| 129 .codec_name = "wm8994-codec", |
| 130 .init = smdk_wm8994_init_paiftx, |
| 131 .ops = &smdk_ops, |
| 132 }, { /* Sec_Fifo Playback i/f */ |
| 133 .name = "Sec_FIFO TX", |
| 134 .stream_name = "Sec_Dai", |
| 135 .cpu_dai_name = "samsung-i2s.4", |
| 136 .codec_dai_name = "wm8994-aif1", |
| 137 .platform_name = "samsung-audio", |
| 138 .codec_name = "wm8994-codec", |
| 139 .ops = &smdk_ops, |
| 140 }, |
| 141 }; |
| 142 |
| 143 static struct snd_soc_card smdk = { |
| 144 .name = "SMDK-I2S", |
| 145 .dai_link = smdk_dai, |
| 146 .num_links = ARRAY_SIZE(smdk_dai), |
| 147 }; |
| 148 |
| 149 static struct platform_device *smdk_snd_device; |
| 150 |
| 151 static int __init smdk_audio_init(void) |
| 152 { |
| 153 int ret; |
| 154 |
| 155 smdk_snd_device = platform_device_alloc("soc-audio", -1); |
| 156 if (!smdk_snd_device) |
| 157 return -ENOMEM; |
| 158 |
| 159 platform_set_drvdata(smdk_snd_device, &smdk); |
| 160 |
| 161 ret = platform_device_add(smdk_snd_device); |
| 162 if (ret) |
| 163 platform_device_put(smdk_snd_device); |
| 164 |
| 165 return ret; |
| 166 } |
| 167 module_init(smdk_audio_init); |
| 168 |
| 169 static void __exit smdk_audio_exit(void) |
| 170 { |
| 171 platform_device_unregister(smdk_snd_device); |
| 172 } |
| 173 module_exit(smdk_audio_exit); |
| 174 |
| 175 MODULE_DESCRIPTION("ALSA SoC SMDK WM8994"); |
| 176 MODULE_LICENSE("GPL"); |
| OLD | NEW |