diff --git a/arch/arm/mach-pxa/colibri-pxa270.c b/arch/arm/mach-pxa/colibri-pxa270.c index 6fc5d32..6f55108 100644 --- a/arch/arm/mach-pxa/colibri-pxa270.c +++ b/arch/arm/mach-pxa/colibri-pxa270.c @@ -50,6 +50,10 @@ static mfp_cfg_t colibri_pxa270_evalboard_pin_config[] __initdata = { GPIO39_FFUART_TXD, GPIO34_FFUART_RXD, + /* STUART */ + GPIO46_STUART_RXD, + GPIO47_STUART_TXD, + /* UHC */ GPIO88_USBH1_PWR, GPIO89_USBH1_PEN, @@ -245,7 +249,7 @@ static inline void colibri_pxa270_eth_init(void) {} #if defined(CONFIG_TOUCHSCREEN_UCB1400) || \ defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE) static pxa2xx_audio_ops_t colibri_pxa270_ac97_pdata = { - .reset_gpio = 95, + .reset_gpio = -1, }; static struct ucb1400_pdata colibri_pxa270_ucb1400_pdata = { @@ -260,9 +264,15 @@ static struct platform_device colibri_pxa270_ucb1400_device = { }, }; +struct platform_device pxa_device_wm9712_audio = { + .name = "wm9712-codec", + .id = -1, +}; + static void __init colibri_pxa270_tsc_init(void) { pxa_set_ac97_info(&colibri_pxa270_ac97_pdata); + platform_device_register(&pxa_device_wm9712_audio); platform_device_register(&colibri_pxa270_ucb1400_device); } #else diff --git a/sound/soc/pxa/Kconfig b/sound/soc/pxa/Kconfig index 580f485..acb12b1 100644 --- a/sound/soc/pxa/Kconfig +++ b/sound/soc/pxa/Kconfig @@ -155,6 +155,15 @@ config SND_SOC_RAUMFELD help Say Y if you want to add support for SoC audio on Raumfeld devices +config SND_SOC_COLIBRI + tristate "SoC Audio support for Toradex Colibri" + depends on SND_PXA2XX_SOC && (MACH_COLIBRI || MACH_COLIBRI320) + select SND_PXA2XX_SOC_AC97 + select SND_SOC_WM9712 + help + Say Y if you want to add support for SoC audio on the + Toradex Colibri hardware. + config SND_PXA2XX_SOC_MAGICIAN tristate "SoC Audio support for HTC Magician" depends on SND_PXA2XX_SOC && MACH_MAGICIAN diff --git a/sound/soc/pxa/Makefile b/sound/soc/pxa/Makefile index 0766016..44524b9 100644 --- a/sound/soc/pxa/Makefile +++ b/sound/soc/pxa/Makefile @@ -27,6 +27,7 @@ snd-soc-mioa701-objs := mioa701_wm9713.o snd-soc-z2-objs := z2.o snd-soc-imote2-objs := imote2.o snd-soc-raumfeld-objs := raumfeld.o +snd-soc-colibri-objs := colibri.o obj-$(CONFIG_SND_PXA2XX_SOC_CORGI) += snd-soc-corgi.o obj-$(CONFIG_SND_PXA2XX_SOC_POODLE) += snd-soc-poodle.o @@ -45,3 +46,4 @@ obj-$(CONFIG_SND_SOC_TAVOREVB3) += snd-soc-tavorevb3.o obj-$(CONFIG_SND_SOC_ZYLONITE) += snd-soc-zylonite.o obj-$(CONFIG_SND_PXA2XX_SOC_IMOTE2) += snd-soc-imote2.o obj-$(CONFIG_SND_SOC_RAUMFELD) += snd-soc-raumfeld.o +obj-$(CONFIG_SND_SOC_COLIBRI) += snd-soc-colibri.o diff --git a/sound/soc/pxa/colibri.c b/sound/soc/pxa/colibri.c new file mode 100644 index 0000000..b575296 --- /dev/null +++ b/sound/soc/pxa/colibri.c @@ -0,0 +1,170 @@ +/* + * SoC audio driver for Toradex Colibri + * + * Copyright (C) 2010-2011 Noser Engineering + * + * 2010-11-19: Marcel Ziswiler + * initial version (note: WM9715L is fully WM9712 compatible) + * + * Copied from tosa.c: + * Copyright 2005 Wolfson Microelectronics PLC. + * Copyright 2005 Openedhand Ltd. + * + * Authors: Liam Girdwood + * Richard Purdie + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include "../codecs/wm9712.h" +#include "pxa2xx-ac97.h" + +static const struct snd_soc_dapm_widget colibri_dapm_widgets[] = { + SND_SOC_DAPM_HP("HEADPHONE", NULL), + SND_SOC_DAPM_LINE("LINEIN", NULL), + SND_SOC_DAPM_MIC("MIC_IN", NULL), +}; + +/* Currently supported audio map */ +static const struct snd_soc_dapm_route colibri_audio_map[] = { + /* Colibri SODIMM pin 1 (MIC_IN) + Colibri Evaluation Board: Audio jack X26 bottom pink + Orchid: Audio jack X11 bottom pink MIC in */ + { "MIC_IN", NULL, "MIC1" }, + + /* Colibri SODIMM pin 5 & 7 (LINEIN_L/R) + Colibri Evaluation Board: Audio jack X26 top blue + Orchid: Audio jack X11 top blue line in + MECS Tellurium: Audio jack X11 pin 1 & 2 */ + { "LINEIN", NULL, "LINEINL" }, + { "LINEIN", NULL, "LINEINR" }, + + /* Colibri SODIMM pin 15 & 17 (HEADPHONE_L/R) + Colibri Evaluation Board: Audio jack X26 middle green + Orchid: Audio jack X11 middle green line out + Protea: Audio jack X53 line out + MECS Tellurium: Audio jack X11 pin 4 & 5 (HEADPHONE_LF/RF) */ + { "HEADPHONE", NULL, "LOUT2" }, + { "HEADPHONE", NULL, "ROUT2" }, +}; + +static int colibri_wm9712l_init(struct snd_soc_pcm_runtime *rtd) +{ + int err; + + struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_dapm_context *dapm = &codec->dapm; + + /* add Colibri specific widgets */ + err = snd_soc_dapm_new_controls(dapm, colibri_dapm_widgets, + ARRAY_SIZE(colibri_dapm_widgets)); + if (err) + return err; + + /* set up Colibri specific audio path audio_map */ + err = snd_soc_dapm_add_routes(dapm, colibri_audio_map, ARRAY_SIZE(colibri_audio_map)); + if (err) + return err; + + /* connected pins */ + snd_soc_dapm_enable_pin(dapm, "MIC1"); + snd_soc_dapm_enable_pin(dapm, "LINEINL"); + snd_soc_dapm_enable_pin(dapm, "LINEINR"); + snd_soc_dapm_enable_pin(dapm, "LOUT2"); + snd_soc_dapm_enable_pin(dapm, "ROUT2"); + + /* not connected pins */ + snd_soc_dapm_nc_pin(dapm, "MIC2"); + snd_soc_dapm_nc_pin(dapm, "PHONE"); + snd_soc_dapm_nc_pin(dapm, "PCBEEP"); + snd_soc_dapm_nc_pin(dapm, "MONOOUT"); + snd_soc_dapm_nc_pin(dapm, "OUT3"); + snd_soc_dapm_nc_pin(dapm, "HPOUTL"); + snd_soc_dapm_nc_pin(dapm, "HPOUTR"); + + err = snd_soc_dapm_sync(dapm); + if (err) + return err; + + return 0; +} + +static struct snd_soc_dai_link colibri_dai[] = { + { + .name = "AC97 HiFi", + .stream_name = "AC97 HiFi", + .cpu_dai_name = "pxa2xx-ac97", + .codec_dai_name = "wm9712-hifi", + .codec_name = "wm9712-codec", + .platform_name = "pxa-pcm-audio", + .init = colibri_wm9712l_init, + }, + { + .name = "AC97 Aux", + .stream_name = "AC97 Aux", + .cpu_dai_name = "pxa2xx-ac97-aux", + .codec_dai_name = "wm9712-aux", + .codec_name = "wm9712-codec", + .platform_name = "pxa-pcm-audio", + }, +}; + +static struct snd_soc_card colibri = { + .name = "Toradex Colibri", + .dai_link = colibri_dai, + .num_links = ARRAY_SIZE(colibri_dai), +}; + +static struct platform_device *colibri_snd_device; + +static int __init colibri_init(void) +{ + int ret; + + if (!(machine_is_colibri() || machine_is_colibri320())) + return -ENODEV; + + colibri_snd_device = platform_device_alloc("soc-audio", -1); + if (!colibri_snd_device) + return -ENOMEM; + + platform_set_drvdata(colibri_snd_device, &colibri); + ret = platform_device_add(colibri_snd_device); + + if (!ret) + return 0; + +/* Fail gracefully */ + platform_device_put(colibri_snd_device); + + return ret; +} + +static void __exit colibri_exit(void) +{ + platform_device_unregister(colibri_snd_device); +} + +module_init(colibri_init); +module_exit(colibri_exit); + +/* Module information */ +MODULE_AUTHOR("Marcel Ziswiler"); +MODULE_DESCRIPTION("ALSA SoC WM9715L on Toradex Colibri"); +MODULE_LICENSE("GPL");