diff options
Diffstat (limited to 'recipes/linux/linux-kirkwood/0004-ARM-Kirkwood-OpenRD-SD-UART1-selection.patch')
-rw-r--r-- | recipes/linux/linux-kirkwood/0004-ARM-Kirkwood-OpenRD-SD-UART1-selection.patch | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/recipes/linux/linux-kirkwood/0004-ARM-Kirkwood-OpenRD-SD-UART1-selection.patch b/recipes/linux/linux-kirkwood/0004-ARM-Kirkwood-OpenRD-SD-UART1-selection.patch new file mode 100644 index 0000000000..1cb93047a0 --- /dev/null +++ b/recipes/linux/linux-kirkwood/0004-ARM-Kirkwood-OpenRD-SD-UART1-selection.patch @@ -0,0 +1,207 @@ +From 3423306f9b0aa3f9f4b41338565e18d9c3bf0bb2 Mon Sep 17 00:00:00 2001 +From: Tanmay Upadhyay <tanmay.upadhyay@einfochips.com> +Date: Fri, 25 Dec 2009 15:02:12 +0530 +Subject: [PATCH] ARM: Kirkwood: OpenRD: SD/UART1 selection + +To select UART1, pass "uart=232" (for RS232) OR "uart=485" (for RS485) in the +boot argument. To select SDIO lines pass "uart=no". SDIO lines will be selected +by default in absence of this parameter. + +Signed-off-by: Tanmay Upadhyay <tanmay.upadhyay@einfochips.com> +--- + arch/arm/mach-kirkwood/openrd_base-setup.c | 61 +++++++++++++++++++++++++- + arch/arm/mach-kirkwood/openrd_client-setup.c | 59 ++++++++++++++++++++++++- + 2 files changed, 117 insertions(+), 3 deletions(-) + +Index: git/arch/arm/mach-kirkwood/openrd_base-setup.c +=================================================================== +--- git.orig/arch/arm/mach-kirkwood/openrd_base-setup.c ++++ git/arch/arm/mach-kirkwood/openrd_base-setup.c +@@ -15,6 +15,7 @@ + #include <linux/ata_platform.h> + #include <linux/mv643xx_eth.h> + #include <linux/gpio.h> ++#include <linux/io.h> + #include <asm/mach-types.h> + #include <asm/mach/arch.h> + #include <mach/kirkwood.h> +@@ -51,16 +52,53 @@ static struct mvsdio_platform_data openr + }; + + static unsigned int openrd_base_mpp_config[] __initdata = { +- MPP29_GPIO, ++ MPP12_SD_CLK, ++ MPP13_SD_CMD, ++ MPP14_SD_D0, ++ MPP15_SD_D1, ++ MPP16_SD_D2, ++ MPP17_SD_D3, ++ MPP29_GPIO, + 0 + }; + ++static int uart1; ++ ++static void sd_uart_selection(void) ++{ ++ char *ptr = NULL; ++ ++ /* Parse boot_command_line string uart=no/232/485 */ ++ ptr = strstr(boot_command_line, "uart="); ++ ++ /* Default is SD. Change if required, for UART */ ++ if (ptr != NULL) { ++ if (!strncmp(ptr + 5, "232", 3)) { ++ /* Configure MPP for UART */ ++ openrd_base_mpp_config[1] = MPP13_UART1_TXD; ++ openrd_base_mpp_config[2] = MPP14_UART1_RXD; ++ ++ uart1 = 232; ++ } else if (!strncmp(ptr + 5, "485", 3)) { ++ /* Configure MPP for UART */ ++ openrd_base_mpp_config[1] = MPP13_UART1_TXD; ++ openrd_base_mpp_config[2] = MPP14_UART1_RXD; ++ ++ uart1 = 485; ++ } ++ } ++} ++ + static void __init openrd_base_init(void) + { + /* + * Basic setup. Needs to be called early. + */ + kirkwood_init(); ++ ++ /* This function modifies MPP config according to boot argument */ ++ sd_uart_selection(); ++ + kirkwood_mpp_conf(openrd_base_mpp_config); + + kirkwood_uart0_init(); +@@ -70,7 +108,26 @@ static void __init openrd_base_init(void + + kirkwood_ge00_init(&openrd_base_ge00_data); + kirkwood_sata_init(&openrd_base_sata_data); +- kirkwood_sdio_init(&openrd_base_mvsdio_data); ++ ++ if (!uart1) { ++ /* Select SD ++ * Pin # 34: 0 => UART1, 1 => SD */ ++ writel(readl(GPIO_OUT(34)) | 4, GPIO_OUT(34)); ++ ++ kirkwood_sdio_init(&openrd_base_mvsdio_data); ++ } else { ++ /* Select UART1 ++ * Pin # 34: 0 => UART1, 1 => SD */ ++ writel(readl(GPIO_OUT(34)) & ~(4), GPIO_OUT(34)); ++ ++ /* Select RS232 OR RS485 ++ * Pin # 28: 0 => RS232, 1 => RS485 */ ++ if (uart1 == 232) ++ writel(readl(GPIO_OUT(28)) & ~(0x10000000), ++ GPIO_OUT(28)); ++ else ++ writel(readl(GPIO_OUT(28)) | 0x10000000, GPIO_OUT(28)); ++ } + + kirkwood_i2c_init(); + } +Index: git/arch/arm/mach-kirkwood/openrd_client-setup.c +=================================================================== +--- git.orig/arch/arm/mach-kirkwood/openrd_client-setup.c ++++ git/arch/arm/mach-kirkwood/openrd_client-setup.c +@@ -16,6 +16,7 @@ + #include <linux/mv643xx_eth.h> + #include <linux/mv88fx_audio.h> + #include <linux/gpio.h> ++#include <linux/io.h> + #include <asm/mach-types.h> + #include <asm/mach/arch.h> + #include <mach/kirkwood.h> +@@ -56,6 +57,12 @@ static struct mvsdio_platform_data openr + }; + + static unsigned int openrd_client_mpp_config[] __initdata = { ++ MPP12_SD_CLK, ++ MPP13_SD_CMD, ++ MPP14_SD_D0, ++ MPP15_SD_D1, ++ MPP16_SD_D2, ++ MPP17_SD_D3, + MPP29_GPIO, + 0 + }; +@@ -77,12 +84,43 @@ static struct mv88fx_snd_platform_data o + }; + #endif + ++static int uart1; ++ ++static void sd_uart_selection(void) ++{ ++ char *ptr = NULL; ++ ++ /* Parse boot_command_line string uart=no/232/485 */ ++ ptr = strstr(boot_command_line, "uart="); ++ ++ /* Default is SD. Change if required, for UART */ ++ if (ptr != NULL) { ++ if (!strncmp(ptr + 5, "232", 3)) { ++ /* Configure MPP for UART */ ++ openrd_client_mpp_config[1] = MPP13_UART1_TXD; ++ openrd_client_mpp_config[2] = MPP14_UART1_RXD; ++ ++ uart1 = 232; ++ } else if (!strncmp(ptr + 5, "485", 3)) { ++ /* Configure MPP for UART */ ++ openrd_client_mpp_config[1] = MPP13_UART1_TXD; ++ openrd_client_mpp_config[2] = MPP14_UART1_RXD; ++ ++ uart1 = 485; ++ } ++ } ++} ++ + static void __init openrd_client_init(void) + { + /* + * Basic setup. Needs to be called early. + */ + kirkwood_init(); ++ ++ /* This function modifies MPP config according to boot argument */ ++ sd_uart_selection(); ++ + kirkwood_mpp_conf(openrd_client_mpp_config); + + kirkwood_uart0_init(); +@@ -95,7 +133,26 @@ static void __init openrd_client_init(vo + kirkwood_ge01_init(&openrd_client_ge01_data); + + kirkwood_sata_init(&openrd_client_sata_data); +- kirkwood_sdio_init(&openrd_client_mvsdio_data); ++ ++ if (!uart1) { ++ /* Select SD ++ * Pin # 34: 0 => UART1, 1 => SD */ ++ writel(readl(GPIO_OUT(34)) | 4, GPIO_OUT(34)); ++ ++ kirkwood_sdio_init(&openrd_client_mvsdio_data); ++ } else { ++ /* Select UART1 ++ * Pin # 34: 0 => UART1, 1 => SD */ ++ writel(readl(GPIO_OUT(34)) & ~(4), GPIO_OUT(34)); ++ ++ /* Select RS232 OR RS485 ++ * Pin # 28: 0 => RS232, 1 => RS485 */ ++ if (uart1 == 232) ++ writel(readl(GPIO_OUT(28)) & ~(0x10000000), ++ GPIO_OUT(28)); ++ else ++ writel(readl(GPIO_OUT(28)) | 0x10000000, GPIO_OUT(28)); ++ } + + kirkwood_i2c_init(); + #if defined(CONFIG_SND_MV88FX_SOC) || defined(CONFIG_SND_MV88FX_SOC_MODULE) |