Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fd2ce9c5 authored by Tanmay Upadhyay's avatar Tanmay Upadhyay Committed by Nicolas Pitre
Browse files

[ARM] OpenRD: Enable SD/UART selection for serial port 1



This patch enables users to choose either the SDIO interface or UART1
(RS232/RS485). The selection can be done through kernel parameter.

By default the port would be used for SDIO interface. Passing the string
"kw_openrd_init_uart1=232" or "kw_openrd_init_uart1=485" enables either
the RS-232 or RS-485 port respectively; disabling the SDIO interface.
Anything else selects the default SDIO interface.

"kw_openrd_init_uart1=485" is ignored on OpenRD-Base as it doesn't
have RS485 port.

Signed-off-by: default avatarTanmay Upadhyay <tanmay.upadhyay@einfochips.com>
Acked-by: default avatarAlexander Clouter <alex@digriz.org.uk>
Signed-off-by: default avatarNicolas Pitre <nico@fluxnic.net>
parent f539dfed
Loading
Loading
Loading
Loading
+100 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
#include <linux/ata_platform.h>
#include <linux/mv643xx_eth.h>
#include <linux/i2c.h>
#include <linux/gpio.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <mach/kirkwood.h>
@@ -57,7 +58,22 @@ static struct mvsdio_platform_data openrd_mvsdio_data = {
};

static unsigned int openrd_mpp_config[] __initdata = {
	MPP12_SD_CLK,
	MPP13_SD_CMD,
	MPP14_SD_D0,
	MPP15_SD_D1,
	MPP16_SD_D2,
	MPP17_SD_D3,
	MPP28_GPIO,
	MPP29_GPIO,
	MPP34_GPIO,
	0
};

/* Configure MPP for UART1 */
static unsigned int openrd_uart1_mpp_config[] __initdata = {
	MPP13_UART1_TXD,
	MPP14_UART1_RXD,
	0
};

@@ -67,6 +83,68 @@ static struct i2c_board_info i2c_board_info[] __initdata = {
	},
};

static int __initdata uart1;

static int __init sd_uart_selection(char *str)
{
	uart1 = -EINVAL;

	/* Default is SD. Change if required, for UART */
	if (!str)
		return 0;

	if (!strncmp(str, "232", 3)) {
		uart1 = 232;
	} else if (!strncmp(str, "485", 3)) {
		/* OpenRD-Base doesn't have RS485. Treat is as an
		 * unknown argument & just have default setting -
		 * which is SD */
		if (machine_is_openrd_base()) {
			uart1 = -ENODEV;
			return 1;
		}

		uart1 = 485;
	}
	return 1;
}
/* Parse boot_command_line string kw_openrd_init_uart1=232/485 */
__setup("kw_openrd_init_uart1=", sd_uart_selection);

static int __init uart1_mpp_config(void)
{
	kirkwood_mpp_conf(openrd_uart1_mpp_config);

	if (gpio_request(34, "SD_UART1_SEL")) {
		printk(KERN_ERR "GPIO request failed for SD/UART1 selection"
				", gpio: 34\n");
		return -EIO;
	}

	if (gpio_request(28, "RS232_RS485_SEL")) {
		printk(KERN_ERR "GPIO request failed for RS232/RS485 selection"
				", gpio# 28\n");
		gpio_free(34);
		return -EIO;
	}

	/* Select UART1
	 * Pin # 34: 0 => UART1, 1 => SD */
	gpio_direction_output(34, 0);

	/* Select RS232 OR RS485
	 * Pin # 28: 0 => RS232, 1 => RS485 */
	if (uart1 == 232)
		gpio_direction_output(28, 0);
	else
		gpio_direction_output(28, 1);

	gpio_free(34);
	gpio_free(28);

	return 0;
}

static void __init openrd_init(void)
{
	/*
@@ -90,7 +168,6 @@ static void __init openrd_init(void)
		kirkwood_ge01_init(&openrd_ge01_data);

	kirkwood_sata_init(&openrd_sata_data);
	kirkwood_sdio_init(&openrd_mvsdio_data);

	kirkwood_i2c_init();

@@ -99,6 +176,28 @@ static void __init openrd_init(void)
			ARRAY_SIZE(i2c_board_info));
		kirkwood_audio_init();
	}

	if (uart1 <= 0) {
		if (uart1 < 0)
			printk(KERN_ERR "Invalid kernel parameter to select "
				"UART1. Defaulting to SD. ERROR CODE: %d\n",
				uart1);

		/* Select SD
		 * Pin # 34: 0 => UART1, 1 => SD */
		if (gpio_request(34, "SD_UART1_SEL")) {
			printk(KERN_ERR "GPIO request failed for SD/UART1 "
					"selection, gpio: 34\n");
		} else {

			gpio_direction_output(34, 1);
			gpio_free(34);
			kirkwood_sdio_init(&openrd_mvsdio_data);
		}
	} else {
		if (!uart1_mpp_config())
			kirkwood_uart1_init();
	}
}

static int __init openrd_pci_init(void)