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

Commit 17198f2d authored by wanzongshun's avatar wanzongshun Committed by Russell King
Browse files

[ARM] 5374/1: The w90p910 uart0 driver patch



Add W90P910 UART0 support,the W90P910 UART0 is 8250 series.

Signed-off-by: default avatarWan ZongShun <mcuos.com@gmail.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent b74788d8
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ extern void w90p910_init_io(struct map_desc *mach_desc, int size);
extern void w90p910_init_uarts(struct w90x900_uartcfg *cfg, int no);
extern void w90p910_init_clocks(int xtal);
extern void w90p910_map_io(struct map_desc *mach_desc, int size);
extern struct platform_device w90p910_serial_device;
extern struct sys_timer w90x900_timer;

#define W90X900_RES(name)				\
@@ -67,11 +68,13 @@ struct platform_device w90x900_##devname = { \
	.resource 	= w90x900_##regname##_resource,			\
}

#define W90X900_UARTCFG(port, flag, uc, ulc, ufc)	\
#define W90X900_8250PORT(name)					\
{								\
		.hwport	= port,				\
		.flags	= flag,				\
		.ucon	= uc,				\
		.ulcon	= ulc,				\
		.ufcon	= ufc,				\
	.membase	= name##_BA,				\
	.mapbase	= name##_PA,				\
	.irq		= IRQ_##name,				\
	.uartclk	= 11313600,				\
	.regshift	= 2,					\
	.iotype		= UPIO_MEM,				\
	.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,	\
}
+1 −9
Original line number Diff line number Diff line
@@ -36,24 +36,16 @@
static struct map_desc w90p910_iodesc[] __initdata = {
};

static struct w90x900_uartcfg w90p910_uartcfgs[] = {
	W90X900_UARTCFG(0, 0, 0, 0, 0),
	W90X900_UARTCFG(1, 0, 0, 0, 0),
	W90X900_UARTCFG(2, 0, 0, 0, 0),
	W90X900_UARTCFG(3, 0, 0, 0, 0),
	W90X900_UARTCFG(4, 0, 0, 0, 0),
};

/*Here should be your evb resourse,such as LCD*/

static struct platform_device *w90p910evb_dev[] __initdata = {
	&w90p910_serial_device,
};

static void __init w90p910evb_map_io(void)
{
	w90p910_map_io(w90p910_iodesc, ARRAY_SIZE(w90p910_iodesc));
	w90p910_init_clocks(0);
	w90p910_init_uarts(w90p910_uartcfgs, ARRAY_SIZE(w90p910_uartcfgs));
}

static void __init w90p910evb_init(void)
+13 −54
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/serial_8250.h>

#include <asm/mach/arch.h>
#include <asm/mach/map.h>
@@ -36,12 +37,6 @@

#include "cpu.h"

/*W90P910 has five uarts*/

#define MAX_UART_COUNT 5
static int uart_count;
static struct platform_device *uart_devs[MAX_UART_COUNT-1];

/* Initial IO mappings */

static struct map_desc w90p910_iodesc[] __initdata = {
@@ -53,48 +48,19 @@ static struct map_desc w90p910_iodesc[] __initdata = {
	/*IODESC_ENT(LCD),*/
};

/*Init the dev resource*/

static W90X900_RES(UART0);
static W90X900_RES(UART1);
static W90X900_RES(UART2);
static W90X900_RES(UART3);
static W90X900_RES(UART4);
static W90X900_DEVICE(uart0, UART0, 0, "w90x900-uart");
static W90X900_DEVICE(uart1, UART1, 1, "w90x900-uart");
static W90X900_DEVICE(uart2, UART2, 2, "w90x900-uart");
static W90X900_DEVICE(uart3, UART3, 3, "w90x900-uart");
static W90X900_DEVICE(uart4, UART4, 4, "w90x900-uart");

static struct platform_device *uart_devices[] __initdata = {
	&w90x900_uart0,
	&w90x900_uart1,
	&w90x900_uart2,
	&w90x900_uart3,
	&w90x900_uart4
};

/*Init W90P910 uart device*/

void __init w90p910_init_uarts(struct w90x900_uartcfg *cfg, int no)
{
	struct platform_device *platdev;
	int uart, uartdev;

	/*By min() to judge count of uart be used indeed*/
/* Initial serial platform data */

	uartdev = ARRAY_SIZE(uart_devices);
	no = min(uartdev, no);
struct plat_serial8250_port w90p910_uart_data[] = {
	W90X900_8250PORT(UART0),
};

	for (uart = 0; uart < no; uart++, cfg++) {
		if (cfg->hwport != uart)
			printk(KERN_ERR "w90x900_uartcfg[%d] error\n", uart);
		platdev = uart_devices[cfg->hwport];
		uart_devs[uart] = platdev;
		platdev->dev.platform_data = cfg;
	}
	uart_count = uart;
}
struct platform_device w90p910_serial_device = {
	.name			= "serial8250",
	.id			= PLAT8250_DEV_PLATFORM,
	.dev			= {
		.platform_data	= w90p910_uart_data,
	},
};

/*Init W90P910 evb io*/

@@ -122,13 +88,6 @@ static int __init w90p910_init_cpu(void)

static int __init w90x900_arch_init(void)
{
	int ret;

	ret = w90p910_init_cpu();
	if (ret != 0)
		return ret;

	return platform_add_devices(uart_devs, uart_count);

	return w90p910_init_cpu();
}
arch_initcall(w90x900_arch_init);