Path: blob/master/sound/soc/kirkwood/kirkwood-openrd.c
10817 views
/*1* kirkwood-openrd.c2*3* (c) 2010 Arnaud Patard <[email protected]>4* (c) 2010 Arnaud Patard <[email protected]>5*6* This program is free software; you can redistribute it and/or modify it7* under the terms of the GNU General Public License as published by the8* Free Software Foundation; either version 2 of the License, or (at your9* option) any later version.10*/1112#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 "../codecs/cs42l51.h"2223static int openrd_client_hw_params(struct snd_pcm_substream *substream,24struct snd_pcm_hw_params *params)25{26struct snd_soc_pcm_runtime *rtd = substream->private_data;27struct snd_soc_dai *codec_dai = rtd->codec_dai;28struct snd_soc_dai *cpu_dai = rtd->cpu_dai;29int ret;30unsigned int freq, fmt;3132fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS;33ret = snd_soc_dai_set_fmt(cpu_dai, fmt);34if (ret < 0)35return ret;3637ret = snd_soc_dai_set_fmt(codec_dai, fmt);38if (ret < 0)39return ret;4041switch (params_rate(params)) {42default:43case 44100:44freq = 11289600;45break;46case 48000:47freq = 12288000;48break;49case 96000:50freq = 24576000;51break;52}5354return snd_soc_dai_set_sysclk(codec_dai, 0, freq, SND_SOC_CLOCK_IN);5556}5758static struct snd_soc_ops openrd_client_ops = {59.hw_params = openrd_client_hw_params,60};616263static struct snd_soc_dai_link openrd_client_dai[] = {64{65.name = "CS42L51",66.stream_name = "CS42L51 HiFi",67.cpu_dai_name = "kirkwood-i2s",68.platform_name = "kirkwood-pcm-audio",69.codec_dai_name = "cs42l51-hifi",70.codec_name = "cs42l51-codec.0-004a",71.ops = &openrd_client_ops,72},73};747576static struct snd_soc_card openrd_client = {77.name = "OpenRD Client",78.dai_link = openrd_client_dai,79.num_links = ARRAY_SIZE(openrd_client_dai),80};8182static struct platform_device *openrd_client_snd_device;8384static int __init openrd_client_init(void)85{86int ret;8788if (!machine_is_openrd_client() && !machine_is_openrd_ultimate())89return 0;9091openrd_client_snd_device = platform_device_alloc("soc-audio", -1);92if (!openrd_client_snd_device)93return -ENOMEM;9495platform_set_drvdata(openrd_client_snd_device,96&openrd_client);9798ret = platform_device_add(openrd_client_snd_device);99if (ret) {100printk(KERN_ERR "%s: platform_device_add failed\n", __func__);101platform_device_put(openrd_client_snd_device);102}103104return ret;105}106107static void __exit openrd_client_exit(void)108{109platform_device_unregister(openrd_client_snd_device);110}111112module_init(openrd_client_init);113module_exit(openrd_client_exit);114115/* Module information */116MODULE_AUTHOR("Arnaud Patard <[email protected]>");117MODULE_DESCRIPTION("ALSA SoC OpenRD Client");118MODULE_LICENSE("GPL");119MODULE_ALIAS("platform:soc-audio");120121122