1/* 2 * omap3evm.c -- ALSA SoC support for OMAP3 EVM 3 * 4 * Author: Anuj Aggarwal <anuj.aggarwal@ti.com> 5 * 6 * Based on sound/soc/omap/beagle.c by Steve Sakoman 7 * 8 * Copyright (C) 2008 Texas Instruments, Incorporated 9 * 10 * This program is free software; you can redistribute it and/or modify it 11 * under the terms of the GNU General Public License as published by the 12 * Free Software Foundation version 2. 13 * 14 * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind, 15 * whether express or implied; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * General Public License for more details. 18 */ 19 20#include <linux/clk.h> 21#include <linux/platform_device.h> 22#include <sound/core.h> 23#include <sound/pcm.h> 24#include <sound/soc.h> 25 26#include <asm/mach-types.h> 27#include <mach/hardware.h> 28#include <mach/gpio.h> 29#include <plat/mcbsp.h> 30 31#include "omap-mcbsp.h" 32#include "omap-pcm.h" 33 34static int omap3evm_hw_params(struct snd_pcm_substream *substream, 35 struct snd_pcm_hw_params *params) 36{ 37 struct snd_soc_pcm_runtime *rtd = substream->private_data; 38 struct snd_soc_dai *codec_dai = rtd->codec_dai; 39 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 40 int ret; 41 42 /* Set codec DAI configuration */ 43 ret = snd_soc_dai_set_fmt(codec_dai, 44 SND_SOC_DAIFMT_I2S | 45 SND_SOC_DAIFMT_NB_NF | 46 SND_SOC_DAIFMT_CBM_CFM); 47 if (ret < 0) { 48 printk(KERN_ERR "Can't set codec DAI configuration\n"); 49 return ret; 50 } 51 52 /* Set cpu DAI configuration */ 53 ret = snd_soc_dai_set_fmt(cpu_dai, 54 SND_SOC_DAIFMT_I2S | 55 SND_SOC_DAIFMT_NB_NF | 56 SND_SOC_DAIFMT_CBM_CFM); 57 if (ret < 0) { 58 printk(KERN_ERR "Can't set cpu DAI configuration\n"); 59 return ret; 60 } 61 62 /* Set the codec system clock for DAC and ADC */ 63 ret = snd_soc_dai_set_sysclk(codec_dai, 0, 26000000, 64 SND_SOC_CLOCK_IN); 65 if (ret < 0) { 66 printk(KERN_ERR "Can't set codec system clock\n"); 67 return ret; 68 } 69 70 return 0; 71} 72 73static struct snd_soc_ops omap3evm_ops = { 74 .hw_params = omap3evm_hw_params, 75}; 76 77/* Digital audio interface glue - connects codec <--> CPU */ 78static struct snd_soc_dai_link omap3evm_dai = { 79 .name = "TWL4030", 80 .stream_name = "TWL4030", 81 .cpu_dai_name = "omap-mcbsp-dai.1", 82 .codec_dai_name = "twl4030-hifi", 83 .platform_name = "omap-pcm-audio", 84 .codec_name = "twl4030-codec", 85 .ops = &omap3evm_ops, 86}; 87 88/* Audio machine driver */ 89static struct snd_soc_card snd_soc_omap3evm = { 90 .name = "omap3evm", 91 .dai_link = &omap3evm_dai, 92 .num_links = 1, 93}; 94 95static struct platform_device *omap3evm_snd_device; 96 97static int __init omap3evm_soc_init(void) 98{ 99 int ret; 100 101 if (!machine_is_omap3evm()) 102 return -ENODEV; 103 pr_info("OMAP3 EVM SoC init\n"); 104 105 omap3evm_snd_device = platform_device_alloc("soc-audio", -1); 106 if (!omap3evm_snd_device) { 107 printk(KERN_ERR "Platform device allocation failed\n"); 108 return -ENOMEM; 109 } 110 111 platform_set_drvdata(omap3evm_snd_device, &snd_soc_omap3evm); 112 ret = platform_device_add(omap3evm_snd_device); 113 if (ret) 114 goto err1; 115 116 return 0; 117 118err1: 119 printk(KERN_ERR "Unable to add platform device\n"); 120 platform_device_put(omap3evm_snd_device); 121 122 return ret; 123} 124 125static void __exit omap3evm_soc_exit(void) 126{ 127 platform_device_unregister(omap3evm_snd_device); 128} 129 130module_init(omap3evm_soc_init); 131module_exit(omap3evm_soc_exit); 132 133MODULE_AUTHOR("Anuj Aggarwal <anuj.aggarwal@ti.com>"); 134MODULE_DESCRIPTION("ALSA SoC OMAP3 EVM"); 135MODULE_LICENSE("GPL v2"); 136