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

Commit e259a3ae authored by Russell King's avatar Russell King Committed by Russell King
Browse files

[ARM] pxa: convert PXA serial drivers to use platform resources

parent 08197f6e
Loading
Loading
Loading
Loading
+59 −0
Original line number Diff line number Diff line
@@ -267,21 +267,80 @@ void __init set_pxa_fb_parent(struct device *parent_dev)
	pxa_device_fb.dev.parent = parent_dev;
}

static struct resource pxa_resource_ffuart[] = {
	{
		.start	= __PREG(FFUART),
		.end	= __PREG(FFUART) + 35,
		.flags	= IORESOURCE_MEM,
	}, {
		.start	= IRQ_FFUART,
		.end	= IRQ_FFUART,
		.flags	= IORESOURCE_IRQ,
	}
};

struct platform_device pxa_device_ffuart= {
	.name		= "pxa2xx-uart",
	.id		= 0,
	.resource	= pxa_resource_ffuart,
	.num_resources	= ARRAY_SIZE(pxa_resource_ffuart),
};

static struct resource pxa_resource_btuart[] = {
	{
		.start	= __PREG(BTUART),
		.end	= __PREG(BTUART) + 35,
		.flags	= IORESOURCE_MEM,
	}, {
		.start	= IRQ_BTUART,
		.end	= IRQ_BTUART,
		.flags	= IORESOURCE_IRQ,
	}
};

struct platform_device pxa_device_btuart = {
	.name		= "pxa2xx-uart",
	.id		= 1,
	.resource	= pxa_resource_btuart,
	.num_resources	= ARRAY_SIZE(pxa_resource_btuart),
};

static struct resource pxa_resource_stuart[] = {
	{
		.start	= __PREG(STUART),
		.end	= __PREG(STUART) + 35,
		.flags	= IORESOURCE_MEM,
	}, {
		.start	= IRQ_STUART,
		.end	= IRQ_STUART,
		.flags	= IORESOURCE_IRQ,
	}
};

struct platform_device pxa_device_stuart = {
	.name		= "pxa2xx-uart",
	.id		= 2,
	.resource	= pxa_resource_stuart,
	.num_resources	= ARRAY_SIZE(pxa_resource_stuart),
};

static struct resource pxa_resource_hwuart[] = {
	{
		.start	= __PREG(HWUART),
		.end	= __PREG(HWUART) + 47,
		.flags	= IORESOURCE_MEM,
	}, {
		.start	= IRQ_HWUART,
		.end	= IRQ_HWUART,
		.flags	= IORESOURCE_IRQ,
	}
};

struct platform_device pxa_device_hwuart = {
	.name		= "pxa2xx-uart",
	.id		= 3,
	.resource	= pxa_resource_hwuart,
	.num_resources	= ARRAY_SIZE(pxa_resource_hwuart),
};

static struct resource pxai2c_resources[] = {
+61 −78
Original line number Diff line number Diff line
@@ -582,7 +582,7 @@ serial_pxa_type(struct uart_port *port)

#ifdef CONFIG_SERIAL_PXA_CONSOLE

static struct uart_pxa_port serial_pxa_ports[];
static struct uart_pxa_port *serial_pxa_ports[4];
static struct uart_driver serial_pxa_reg;

#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
@@ -632,7 +632,7 @@ static void serial_pxa_console_putchar(struct uart_port *port, int ch)
static void
serial_pxa_console_write(struct console *co, const char *s, unsigned int count)
{
	struct uart_pxa_port *up = &serial_pxa_ports[co->index];
	struct uart_pxa_port *up = serial_pxa_ports[co->index];
	unsigned int ier;

	/*
@@ -662,7 +662,9 @@ serial_pxa_console_setup(struct console *co, char *options)

	if (co->index == -1 || co->index >= serial_pxa_reg.nr)
		co->index = 0;
       	up = &serial_pxa_ports[co->index];
	up = serial_pxa_ports[co->index];
	if (!up)
		return -ENODEV;

	if (options)
		uart_parse_options(options, &baud, &parity, &bits, &flow);
@@ -680,15 +682,6 @@ static struct console serial_pxa_console = {
	.data		= &serial_pxa_reg,
};

static int __init
serial_pxa_console_init(void)
{
	register_console(&serial_pxa_console);
	return 0;
}

console_initcall(serial_pxa_console_init);

#define PXA_CONSOLE	&serial_pxa_console
#else
#define PXA_CONSOLE	NULL
@@ -714,73 +707,13 @@ struct uart_ops serial_pxa_pops = {
	.verify_port	= serial_pxa_verify_port,
};

static struct uart_pxa_port serial_pxa_ports[] = {
     {	/* FFUART */
	.name	= "FFUART",
	.cken	= CKEN_FFUART,
	.port	= {
		.type		= PORT_PXA,
		.iotype		= UPIO_MEM,
		.membase	= (void *)&FFUART,
		.mapbase	= __PREG(FFUART),
		.irq		= IRQ_FFUART,
		.uartclk	= 921600 * 16,
		.fifosize	= 64,
		.ops		= &serial_pxa_pops,
		.line		= 0,
	},
  }, {	/* BTUART */
	.name	= "BTUART",
	.cken	= CKEN_BTUART,
	.port	= {
		.type		= PORT_PXA,
		.iotype		= UPIO_MEM,
		.membase	= (void *)&BTUART,
		.mapbase	= __PREG(BTUART),
		.irq		= IRQ_BTUART,
		.uartclk	= 921600 * 16,
		.fifosize	= 64,
		.ops		= &serial_pxa_pops,
		.line		= 1,
	},
  }, {	/* STUART */
	.name	= "STUART",
	.cken	= CKEN_STUART,
	.port	= {
		.type		= PORT_PXA,
		.iotype		= UPIO_MEM,
		.membase	= (void *)&STUART,
		.mapbase	= __PREG(STUART),
		.irq		= IRQ_STUART,
		.uartclk	= 921600 * 16,
		.fifosize	= 64,
		.ops		= &serial_pxa_pops,
		.line		= 2,
	},
  }, {  /* HWUART */
	.name	= "HWUART",
	.cken	= CKEN_HWUART,
	.port = {
		.type		= PORT_PXA,
		.iotype		= UPIO_MEM,
		.membase	= (void *)&HWUART,
		.mapbase	= __PREG(HWUART),
		.irq		= IRQ_HWUART,
		.uartclk	= 921600 * 16,
		.fifosize	= 64,
		.ops		= &serial_pxa_pops,
		.line		= 3,
	},
  }
};

static struct uart_driver serial_pxa_reg = {
	.owner		= THIS_MODULE,
	.driver_name	= "PXA serial",
	.dev_name	= "ttyS",
	.major		= TTY_MAJOR,
	.minor		= 64,
	.nr		= ARRAY_SIZE(serial_pxa_ports),
	.nr		= 4,
	.cons		= PXA_CONSOLE,
};

@@ -806,10 +739,60 @@ static int serial_pxa_resume(struct platform_device *dev)

static int serial_pxa_probe(struct platform_device *dev)
{
	serial_pxa_ports[dev->id].port.dev = &dev->dev;
	uart_add_one_port(&serial_pxa_reg, &serial_pxa_ports[dev->id].port);
	platform_set_drvdata(dev, &serial_pxa_ports[dev->id]);
	struct uart_pxa_port *sport;
	struct resource *mmres, *irqres;
	int ret;

	mmres = platform_get_resource(dev, IORESOURCE_MEM, 0);
	irqres = platform_get_resource(dev, IORESOURCE_IRQ, 0);
	if (!mmres || !irqres)
		return -ENODEV;

	sport = kzalloc(sizeof(struct uart_pxa_port), GFP_KERNEL);
	if (!sport)
		return -ENOMEM;

	sport->port.type = PORT_PXA;
	sport->port.iotype = UPIO_MEM;
	sport->port.mapbase = mmres->start;
	sport->port.irq = irqres->start;
	sport->port.fifosize = 64;
	sport->port.ops = &serial_pxa_pops;
	sport->port.line = dev->id;
	sport->port.dev = &dev->dev;
	sport->port.flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF;
	sport->port.uartclk = 921600 * 16;

	/*
	 * Is it worth keeping this?
	 */
	if (mmres->start == __PREG(FFUART))
		sport->name = "FFUART";
	else if (mmres->start == __PREG(BTUART))
		sport->name = "BTUART";
	else if (mmres->start == __PREG(STUART))
		sport->name = "STUART";
	else if (mmres->start == __PREG(HWUART))
		sport->name = "HWUART";
	else
		sport->name = "???";

	sport->port.membase = ioremap(mmres->start, mmres->end - mmres->start + 1);
	if (!sport->port.membase) {
		ret = -ENOMEM;
		goto err_free;
	}

	serial_pxa_ports[dev->id] = sport;

	uart_add_one_port(&serial_pxa_reg, &sport->port);
	platform_set_drvdata(dev, sport);

	return 0;

 err_free:
	kfree(sport);
	return ret;
}

static int serial_pxa_remove(struct platform_device *dev)
@@ -818,8 +801,8 @@ static int serial_pxa_remove(struct platform_device *dev)

	platform_set_drvdata(dev, NULL);

	if (sport)
	uart_remove_one_port(&serial_pxa_reg, &sport->port);
	kfree(sport);

	return 0;
}