1// SPDX-License-Identifier: GPL-2.0-only 2 3#include <linux/module.h> 4#include <sound/soc.h> 5 6#include <asm/mach-types.h> 7 8#include "../codecs/wm8940.h" 9#include "pxa2xx-i2s.h" 10 11static int imote2_asoc_hw_params(struct snd_pcm_substream *substream, 12 struct snd_pcm_hw_params *params) 13{ 14 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 15 struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0); 16 struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0); 17 unsigned int clk = 0; 18 int ret; 19 20 switch (params_rate(params)) { 21 case 8000: 22 case 16000: 23 case 48000: 24 case 96000: 25 clk = 12288000; 26 break; 27 case 11025: 28 case 22050: 29 case 44100: 30 clk = 11289600; 31 break; 32 } 33 34 ret = snd_soc_dai_set_sysclk(codec_dai, 0, clk, 35 SND_SOC_CLOCK_IN); 36 if (ret < 0) 37 return ret; 38 39 /* set the I2S system clock as input (unused) */ 40 ret = snd_soc_dai_set_sysclk(cpu_dai, PXA2XX_I2S_SYSCLK, clk, 41 SND_SOC_CLOCK_OUT); 42 43 return ret; 44} 45 46static const struct snd_soc_ops imote2_asoc_ops = { 47 .hw_params = imote2_asoc_hw_params, 48}; 49 50SND_SOC_DAILINK_DEFS(wm8940, 51 DAILINK_COMP_ARRAY(COMP_CPU("pxa2xx-i2s")), 52 DAILINK_COMP_ARRAY(COMP_CODEC("wm8940-codec.0-0034", 53 "wm8940-hifi")), 54 DAILINK_COMP_ARRAY(COMP_PLATFORM("pxa-pcm-audio"))); 55 56static struct snd_soc_dai_link imote2_dai = { 57 .name = "WM8940", 58 .stream_name = "WM8940", 59 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | 60 SND_SOC_DAIFMT_CBS_CFS, 61 .ops = &imote2_asoc_ops, 62 SND_SOC_DAILINK_REG(wm8940), 63}; 64 65static struct snd_soc_card imote2 = { 66 .name = "Imote2", 67 .owner = THIS_MODULE, 68 .dai_link = &imote2_dai, 69 .num_links = 1, 70}; 71 72static int imote2_probe(struct platform_device *pdev) 73{ 74 struct snd_soc_card *card = &imote2; 75 int ret; 76 77 card->dev = &pdev->dev; 78 79 ret = devm_snd_soc_register_card(&pdev->dev, card); 80 if (ret) 81 dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", 82 ret); 83 return ret; 84} 85 86static struct platform_driver imote2_driver = { 87 .driver = { 88 .name = "imote2-audio", 89 .pm = &snd_soc_pm_ops, 90 }, 91 .probe = imote2_probe, 92}; 93 94module_platform_driver(imote2_driver); 95 96MODULE_AUTHOR("Jonathan Cameron"); 97MODULE_DESCRIPTION("ALSA SoC Imote 2"); 98MODULE_LICENSE("GPL"); 99MODULE_ALIAS("platform:imote2-audio"); 100