diff options
Diffstat (limited to 'recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0004-AFEB9260-ASoC-driver.patch')
-rw-r--r-- | recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0004-AFEB9260-ASoC-driver.patch | 288 |
1 files changed, 288 insertions, 0 deletions
diff --git a/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0004-AFEB9260-ASoC-driver.patch b/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0004-AFEB9260-ASoC-driver.patch new file mode 100644 index 0000000000..14d5b4c194 --- /dev/null +++ b/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0004-AFEB9260-ASoC-driver.patch @@ -0,0 +1,288 @@ +From 3c3cda9dad06e4fd30b3ed794881bdcc95131df8 Mon Sep 17 00:00:00 2001 +From: Sergey Lapin <slapin@ossfans.org> +Date: Sat, 18 Oct 2008 08:50:13 +0400 +Subject: [PATCH] AFEB9260 ASoC driver + + +Signed-off-by: Sergey Lapin <slapin@ossfans.org> +--- + arch/arm/mach-at91/board-afeb-9260v1.c | 4 + + sound/soc/atmel/Kconfig | 8 ++ + sound/soc/atmel/Makefile | 1 + + sound/soc/atmel/afeb9260.c | 217 ++++++++++++++++++++++++++++++++ + 4 files changed, 230 insertions(+), 0 deletions(-) + create mode 100644 sound/soc/atmel/afeb9260.c + +diff --git a/arch/arm/mach-at91/board-afeb-9260v1.c b/arch/arm/mach-at91/board-afeb-9260v1.c +index e263fda..e3f1c56 100644 +--- a/arch/arm/mach-at91/board-afeb-9260v1.c ++++ b/arch/arm/mach-at91/board-afeb-9260v1.c +@@ -164,6 +164,8 @@ static struct at91_mmc_data __initdata afeb9260_mmc_data = { + + static struct i2c_board_info __initdata afeb9260_i2c_devices[] = { + { ++ I2C_BOARD_INFO("tlv320aic23", 0x1a), ++ }, { + I2C_BOARD_INFO("fm3130", 0x68), + }, { + I2C_BOARD_INFO("24c64", 0x50), +@@ -196,6 +198,8 @@ static void __init afeb9260_board_init(void) + /* I2C */ + at91_add_device_i2c(afeb9260_i2c_devices, + ARRAY_SIZE(afeb9260_i2c_devices)); ++ /* Audio */ ++ at91_add_device_ssc(AT91SAM9260_ID_SSC, ATMEL_SSC_TX); + } + + MACHINE_START(AFEB9260, "Custom afeb9260 board") +diff --git a/sound/soc/atmel/Kconfig b/sound/soc/atmel/Kconfig +index a608d70..e720d5e 100644 +--- a/sound/soc/atmel/Kconfig ++++ b/sound/soc/atmel/Kconfig +@@ -41,3 +41,11 @@ config SND_AT32_SOC_PLAYPAQ_SLAVE + and FRAME signals on the PlayPaq. Unless you want to play + with the AT32 as the SSC master, you probably want to say N here, + as this will give you better sound quality. ++ ++config SND_AT91_SOC_AFEB9260 ++ tristate "SoC Audio support for AFEB9260 board" ++ depends on ARCH_AT91 && MACH_AFEB9260 && SND_ATMEL_SOC ++ select SND_ATMEL_SOC_SSC ++ select SND_SOC_TLV320AIC23 ++ help ++ Say Y here to support sound on AFEB9260 board. +diff --git a/sound/soc/atmel/Makefile b/sound/soc/atmel/Makefile +index f54a7cc..ac2df98 100644 +--- a/sound/soc/atmel/Makefile ++++ b/sound/soc/atmel/Makefile +@@ -13,3 +13,4 @@ snd-soc-playpaq-objs := playpaq_wm8510.o + + obj-$(CONFIG_SND_AT91_SOC_SAM9G20_WM8731) += snd-soc-sam9g20-wm8731.o + obj-$(CONFIG_SND_AT32_SOC_PLAYPAQ) += snd-soc-playpaq.o ++obj-$(CONFIG_SND_AT91_SOC_AFEB9260) += afeb9260.o +diff --git a/sound/soc/atmel/afeb9260.c b/sound/soc/atmel/afeb9260.c +new file mode 100644 +index 0000000..1514d8d +--- /dev/null ++++ b/sound/soc/atmel/afeb9260.c +@@ -0,0 +1,217 @@ ++/* ++ * afeb9260.c -- SoC audio for AFEB9260 ++ * ++ * Copyright (C) 2008 Sergey Lapin <slapin@ossfans.org> ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * version 2 as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA ++ * 02110-1301 USA ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/kernel.h> ++#include <linux/clk.h> ++#include <linux/platform_device.h> ++ ++#include <linux/atmel-ssc.h> ++#include <sound/core.h> ++#include <sound/pcm.h> ++#include <sound/pcm_params.h> ++#include <sound/soc.h> ++#include <sound/soc-dapm.h> ++ ++#include <asm/mach-types.h> ++#include <mach/hardware.h> ++#include <linux/gpio.h> ++ ++#include "../codecs/tlv320aic23.h" ++#include "atmel-pcm.h" ++#include "atmel_ssc_dai.h" ++ ++#define CODEC_CLOCK 12000000 ++ ++static int afeb9260_startup(struct snd_pcm_substream *substream) ++{ ++ return 1; ++} ++ ++static void afeb9260_shutdown(struct snd_pcm_substream *substream) ++{ ++ struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); ++ ++ dev_dbg(rtd->socdev->dev, "shutdown"); ++} ++ ++static int afeb9260_hw_params(struct snd_pcm_substream *substream, ++ struct snd_pcm_hw_params *params) ++{ ++ struct snd_soc_pcm_runtime *rtd = substream->private_data; ++ struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; ++ struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; ++ int err; ++ ++ /* Set codec DAI configuration */ ++ err = snd_soc_dai_set_fmt(codec_dai, ++ SND_SOC_DAIFMT_I2S| ++ SND_SOC_DAIFMT_NB_IF | ++ SND_SOC_DAIFMT_CBM_CFM); ++ if (err < 0) { ++ printk(KERN_ERR "can't set codec DAI configuration\n"); ++ return err; ++ } ++ ++ /* Set cpu DAI configuration */ ++ err = snd_soc_dai_set_fmt(cpu_dai, ++ SND_SOC_DAIFMT_I2S | ++ SND_SOC_DAIFMT_NB_IF | ++ SND_SOC_DAIFMT_CBM_CFM); ++ if (err < 0) { ++ printk(KERN_ERR "can't set cpu DAI configuration\n"); ++ return err; ++ } ++ ++ /* Set the codec system clock for DAC and ADC */ ++ err = ++ snd_soc_dai_set_sysclk(codec_dai, 0, CODEC_CLOCK, SND_SOC_CLOCK_IN); ++ ++ if (err < 0) { ++ printk(KERN_ERR "can't set codec system clock\n"); ++ return err; ++ } ++ ++ return err; ++} ++ ++static struct snd_soc_ops afeb9260_ops = { ++ .startup = afeb9260_startup, ++ .hw_params = afeb9260_hw_params, ++ .shutdown = afeb9260_shutdown, ++}; ++ ++static const struct snd_soc_dapm_widget tlv320aic23_dapm_widgets[] = { ++ SND_SOC_DAPM_HP("Headphone Jack", NULL), ++ SND_SOC_DAPM_LINE("Line In", NULL), ++ SND_SOC_DAPM_MIC("Mic Jack", NULL), ++}; ++ ++static const struct snd_soc_dapm_route audio_map[] = { ++ {"Headphone Jack", NULL, "LHPOUT"}, ++ {"Headphone Jack", NULL, "RHPOUT"}, ++ ++ {"LLINEIN", NULL, "Line In"}, ++ {"RLINEIN", NULL, "Line In"}, ++ ++ {"MICIN", NULL, "Mic Jack"}, ++}; ++ ++static int afeb9260_tlv320aic23_init(struct snd_soc_codec *codec) ++{ ++ ++ /* Add osk5912 specific widgets */ ++ snd_soc_dapm_new_controls(codec, tlv320aic23_dapm_widgets, ++ ARRAY_SIZE(tlv320aic23_dapm_widgets)); ++ ++ /* Set up osk5912 specific audio path audio_map */ ++ snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map)); ++ ++ snd_soc_dapm_enable_pin(codec, "Headphone Jack"); ++ snd_soc_dapm_enable_pin(codec, "Line In"); ++ snd_soc_dapm_enable_pin(codec, "Mic Jack"); ++ ++ snd_soc_dapm_sync(codec); ++ ++ return 0; ++} ++ ++/* Digital audio interface glue - connects codec <--> CPU */ ++static struct snd_soc_dai_link afeb9260_dai = { ++ .name = "TLV320AIC23", ++ .stream_name = "AIC23", ++ .cpu_dai = &atmel_ssc_dai[0], ++ .codec_dai = &tlv320aic23_dai, ++ .init = afeb9260_tlv320aic23_init, ++ .ops = &afeb9260_ops, ++}; ++ ++/* Audio machine driver */ ++static struct snd_soc_card snd_soc_machine_afeb9260 = { ++ .name = "AFEB9260", ++ .platform = &atmel_soc_platform, ++ .dai_link = &afeb9260_dai, ++ .num_links = 1, ++}; ++ ++/* Audio subsystem */ ++static struct snd_soc_device afeb9260_snd_devdata = { ++ .card = &snd_soc_machine_afeb9260, ++ .codec_dev = &soc_codec_dev_tlv320aic23, ++}; ++ ++static struct platform_device *afeb9260_snd_device; ++ ++static int __init afeb9260_soc_init(void) ++{ ++ int err; ++ struct device *dev; ++ struct atmel_ssc_info *ssc_p = afeb9260_dai.cpu_dai->private_data; ++ struct ssc_device *ssc = NULL; ++ ++ if (!(machine_is_afeb9260())) ++ return -ENODEV; ++ ++ ssc = ssc_request(0); ++ if (IS_ERR(ssc)) { ++ printk(KERN_ERR "ASoC: Failed to request SSC 0\n"); ++ err = PTR_ERR(ssc); ++ ssc = NULL; ++ goto err_ssc; ++ } ++ ssc_p->ssc = ssc; ++ ++ afeb9260_snd_device = platform_device_alloc("soc-audio", -1); ++ if (!afeb9260_snd_device) { ++ printk(KERN_ERR "ASoC: Platform device allocation failed\n"); ++ return -ENOMEM; ++ } ++ ++ platform_set_drvdata(afeb9260_snd_device, &afeb9260_snd_devdata); ++ afeb9260_snd_devdata.dev = &afeb9260_snd_device->dev; ++ err = platform_device_add(afeb9260_snd_device); ++ if (err) ++ goto err1; ++ ++ dev = &afeb9260_snd_device->dev; ++ ++ return 0; ++err1: ++ platform_device_del(afeb9260_snd_device); ++ platform_device_put(afeb9260_snd_device); ++err_ssc: ++ return err; ++ ++} ++ ++static void __exit afeb9260_soc_exit(void) ++{ ++ platform_device_unregister(afeb9260_snd_device); ++} ++ ++module_init(afeb9260_soc_init); ++module_exit(afeb9260_soc_exit); ++ ++MODULE_AUTHOR("Sergey Lapin <slapin@ossfans.org>"); ++MODULE_DESCRIPTION("ALSA SoC for AFEB9260"); ++MODULE_LICENSE("GPL"); ++ +-- +1.5.6.5 + |