From 22049ebd104af134fce3cdf39c813fb993d869e9 Mon Sep 17 00:00:00 2001 From: Nitin Pai Date: Wed, 30 May 2012 16:26:25 +0530 Subject: arm: tegra: p1852: Add i2s/tdm mode selection Added code to select i2s vs tdm mode. Added tdm-pcm-audio device defination. Changed the pcm driver to use tdm-pcm-audio device. Added fields to pass the pcm driver name to ASoC. Added P1852_TDM config to KConfig and Linux defconfig Bug 948478 Change-Id: I82fa03ab947cc615089e0a3107fb53901a1c00cd Signed-off-by: Bob Johnston Reviewed-on: http://git-master/r/105383 Reviewed-by: Simone Willett Tested-by: Simone Willett --- arch/arm/configs/tegra_p1852_gnu_linux_defconfig | 1 + arch/arm/mach-tegra/Kconfig | 8 +++++ arch/arm/mach-tegra/board-p1852.c | 36 +++++++++++++++++++--- arch/arm/mach-tegra/devices.c | 5 +++ arch/arm/mach-tegra/devices.h | 1 + .../mach-tegra/include/mach/tegra_p1852_pdata.h | 1 + 6 files changed, 48 insertions(+), 4 deletions(-) diff --git a/arch/arm/configs/tegra_p1852_gnu_linux_defconfig b/arch/arm/configs/tegra_p1852_gnu_linux_defconfig index 6a98b5b8fb49..243eaffccec3 100644 --- a/arch/arm/configs/tegra_p1852_gnu_linux_defconfig +++ b/arch/arm/configs/tegra_p1852_gnu_linux_defconfig @@ -31,6 +31,7 @@ CONFIG_ARCH_TEGRA_3x_SOC=y CONFIG_TEGRA_PCI=y CONFIG_MACH_P1852=y CONFIG_TEGRA_PWM=y +CONFIG_TEGRA_P1852_TDM=y # CONFIG_TEGRA_CPU_DVFS is not set CONFIG_TEGRA_CLOCK_DEBUG_WRITE=y # CONFIG_TEGRA_MC_EARLY_ACK is not set diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index 441ce0964db1..c11ea97941a2 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig @@ -256,6 +256,14 @@ config TEGRA_FIQ_DEBUGGER help Enables the FIQ serial debugger on Tegra +config TEGRA_P1852_TDM + bool "Enable TDM mode for P1852 SKUs" + default n + depends on MACH_P1852 + help + Enables TDM mode driver for P1852 SKUs. If this + is not defined then I2S mode is selected by default. + config TEGRA_CARDHU_DSI bool "Support DSI panel on Cardhu" depends on MACH_CARDHU diff --git a/arch/arm/mach-tegra/board-p1852.c b/arch/arm/mach-tegra/board-p1852.c index 71c12756539d..eebbb24a9871 100644 --- a/arch/arm/mach-tegra/board-p1852.c +++ b/arch/arm/mach-tegra/board-p1852.c @@ -200,12 +200,14 @@ static void __init p1852_uart_init(void) ARRAY_SIZE(p1852_uart_devices)); } -static struct tegra_p1852_platform_data p1852_audio_pdata = { +#if defined(CONFIG_TEGRA_P1852_TDM) +static struct tegra_p1852_platform_data p1852_audio_tdm_pdata = { .codec_info[0] = { .codec_dai_name = "dit-hifi", .cpu_dai_name = "tegra30-i2s.0", .codec_name = "spdif-dit.0", .name = "tegra-i2s-1", + .pcm_driver = "tegra-tdm-pcm-audio", .i2s_format = format_tdm, .master = 1, .num_slots = 4, @@ -218,6 +220,7 @@ static struct tegra_p1852_platform_data p1852_audio_pdata = { .cpu_dai_name = "tegra30-i2s.4", .codec_name = "spdif-dit.1", .name = "tegra-i2s-2", + .pcm_driver = "tegra-tdm-pcm-audio", .i2s_format = format_tdm, .master = 1, .num_slots = 8, @@ -225,9 +228,29 @@ static struct tegra_p1852_platform_data p1852_audio_pdata = { .tx_mask = 0xff, .rx_mask = 0xff, }, - }; - +#else +static struct tegra_p1852_platform_data p1852_audio_i2s_pdata = { + .codec_info[0] = { + .codec_dai_name = "dit-hifi", + .cpu_dai_name = "tegra30-i2s.0", + .codec_name = "spdif-dit.0", + .name = "tegra-i2s-1", + .pcm_driver = "tegra-pcm-audio", + .i2s_format = format_i2s, + .master = 1, + }, + .codec_info[1] = { + .codec_dai_name = "dit-hifi", + .cpu_dai_name = "tegra30-i2s.4", + .codec_name = "spdif-dit.1", + .name = "tegra-i2s-2", + .pcm_driver = "tegra-pcm-audio", + .i2s_format = format_i2s, + .master = 0, + }, +}; +#endif static struct platform_device generic_codec_1 = { .name = "spdif-dit", .id = 0, @@ -241,13 +264,18 @@ static struct platform_device tegra_snd_p1852 = { .name = "tegra-snd-p1852", .id = 0, .dev = { - .platform_data = &p1852_audio_pdata, +#if defined(CONFIG_TEGRA_P1852_TDM) + .platform_data = &p1852_audio_tdm_pdata, +#else + .platform_data = &p1852_audio_i2s_pdata, +#endif }, }; static void p1852_i2s_audio_init(void) { platform_device_register(&tegra_pcm_device); + platform_device_register(&tegra_tdm_pcm_device); platform_device_register(&generic_codec_1); platform_device_register(&generic_codec_2); platform_device_register(&tegra_i2s_device0); diff --git a/arch/arm/mach-tegra/devices.c b/arch/arm/mach-tegra/devices.c index 377772ff4291..44afd0e63fe4 100644 --- a/arch/arm/mach-tegra/devices.c +++ b/arch/arm/mach-tegra/devices.c @@ -1166,6 +1166,11 @@ struct platform_device tegra_pcm_device = { .id = -1, }; +struct platform_device tegra_tdm_pcm_device = { + .name = "tegra-tdm-pcm-audio", + .id = -1, +}; + static struct resource w1_resources[] = { [0] = { .start = INT_OWR, diff --git a/arch/arm/mach-tegra/devices.h b/arch/arm/mach-tegra/devices.h index 97a0c53ccfce..3d0734d1c688 100644 --- a/arch/arm/mach-tegra/devices.h +++ b/arch/arm/mach-tegra/devices.h @@ -69,6 +69,7 @@ extern struct platform_device spdif_dit_device; extern struct platform_device bluetooth_dit_device; extern struct platform_device baseband_dit_device; extern struct platform_device tegra_pcm_device; +extern struct platform_device tegra_tdm_pcm_device; extern struct platform_device tegra_w1_device; extern struct platform_device tegra_udc_device; extern struct platform_device tegra_ehci1_device; diff --git a/arch/arm/mach-tegra/include/mach/tegra_p1852_pdata.h b/arch/arm/mach-tegra/include/mach/tegra_p1852_pdata.h index 6bea4e50b915..501d815b881b 100644 --- a/arch/arm/mach-tegra/include/mach/tegra_p1852_pdata.h +++ b/arch/arm/mach-tegra/include/mach/tegra_p1852_pdata.h @@ -35,6 +35,7 @@ struct codec_info_s { char *cpu_dai_name; char *codec_name; /* Name of the Codec Driver */ char *name; /* Name of the Codec-Dai-Link */ + char *pcm_driver; /* Name of the PCM driver */ enum i2s_data_format i2s_format; int master; /* Codec is Master or Slave */ /* TDM format setttings */ -- cgit v1.2.3