1/* 2 * kirkwood-openrd.c 3 * 4 * (c) 2010 Arnaud Patard <apatard@mandriva.com> 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License as published by the 8 * Free Software Foundation; either version 2 of the License, or (at your 9 * option) any later version. 10 */ 11 12#include <linux/module.h> 13#include <linux/moduleparam.h> 14#include <linux/interrupt.h> 15#include <linux/platform_device.h> 16#include <linux/slab.h> 17#include <sound/soc.h> 18#include <mach/kirkwood.h> 19#include <plat/audio.h> 20#include <asm/mach-types.h> 21#include "kirkwood-i2s.h" 22#include "kirkwood-dma.h" 23#include "../codecs/cs42l51.h" 24 25static int openrd_client_hw_params(struct snd_pcm_substream *substream, 26 struct snd_pcm_hw_params *params) 27{ 28 struct snd_soc_pcm_runtime *rtd = substream->private_data; 29 struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; 30 struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; 31 int ret; 32 unsigned int freq, fmt; 33 34 fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS; 35 ret = snd_soc_dai_set_fmt(cpu_dai, fmt); 36 if (ret < 0) 37 return ret; 38 39 ret = snd_soc_dai_set_fmt(codec_dai, fmt); 40 if (ret < 0) 41 return ret; 42 43 switch (params_rate(params)) { 44 default: 45 case 44100: 46 freq = 11289600; 47 break; 48 case 48000: 49 freq = 12288000; 50 break; 51 case 96000: 52 freq = 24576000; 53 break; 54 } 55 56 return snd_soc_dai_set_sysclk(codec_dai, 0, freq, SND_SOC_CLOCK_IN); 57 58} 59 60static struct snd_soc_ops openrd_client_ops = { 61 .hw_params = openrd_client_hw_params, 62}; 63 64 65static struct snd_soc_dai_link openrd_client_dai[] = { 66{ 67 .name = "CS42L51", 68 .stream_name = "CS42L51 HiFi", 69 .cpu_dai = &kirkwood_i2s_dai, 70 .codec_dai = &cs42l51_dai, 71 .ops = &openrd_client_ops, 72}, 73}; 74 75 76static struct snd_soc_card openrd_client = { 77 .name = "OpenRD Client", 78 .platform = &kirkwood_soc_platform, 79 .dai_link = openrd_client_dai, 80 .num_links = ARRAY_SIZE(openrd_client_dai), 81}; 82 83static struct snd_soc_device openrd_client_snd_devdata = { 84 .card = &openrd_client, 85 .codec_dev = &soc_codec_device_cs42l51, 86}; 87 88static struct platform_device *openrd_client_snd_device; 89 90static int __init openrd_client_init(void) 91{ 92 int ret; 93 94 if (!machine_is_openrd_client()) 95 return 0; 96 97 openrd_client_snd_device = platform_device_alloc("soc-audio", -1); 98 if (!openrd_client_snd_device) 99 return -ENOMEM; 100 101 platform_set_drvdata(openrd_client_snd_device, 102 &openrd_client_snd_devdata); 103 openrd_client_snd_devdata.dev = &openrd_client_snd_device->dev; 104 105 ret = platform_device_add(openrd_client_snd_device); 106 if (ret) { 107 printk(KERN_ERR "%s: platform_device_add failed\n", __func__); 108 platform_device_put(openrd_client_snd_device); 109 } 110 111 return ret; 112} 113 114static void __exit openrd_client_exit(void) 115{ 116 platform_device_unregister(openrd_client_snd_device); 117} 118 119module_init(openrd_client_init); 120module_exit(openrd_client_exit); 121 122/* Module information */ 123MODULE_AUTHOR("Arnaud Patard <apatard@mandriva.com>"); 124MODULE_DESCRIPTION("ALSA SoC OpenRD Client"); 125MODULE_LICENSE("GPL"); 126MODULE_ALIAS("platform:soc-audio"); 127