diff options
author | Lennert Buytenhek <buytenh@wantstofly.org> | 2006-03-26 17:16:39 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2006-03-26 17:16:39 -0500 |
commit | aee85fe8e8143d3f54d9e6d3c6cdd40ead563267 (patch) | |
tree | 09f6422b78bebb6783b1590339a0c72a30319d50 /arch/arm | |
parent | fbb18a277a6f192404aa20ece49529acb1e1e76d (diff) |
[SERIAL] Provide Cirrus EP93xx AMBA PL010 serial support.
Signed-off-by: Lennert Buytenhek <buytenh@wantstofly.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-ep93xx/core.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c index 865427bfad7e..2d892e4daa07 100644 --- a/arch/arm/mach-ep93xx/core.c +++ b/arch/arm/mach-ep93xx/core.c | |||
@@ -30,7 +30,9 @@ | |||
30 | #include <linux/time.h> | 30 | #include <linux/time.h> |
31 | #include <linux/timex.h> | 31 | #include <linux/timex.h> |
32 | #include <linux/delay.h> | 32 | #include <linux/delay.h> |
33 | #include <linux/termios.h> | ||
33 | #include <linux/amba/bus.h> | 34 | #include <linux/amba/bus.h> |
35 | #include <linux/amba/serial.h> | ||
34 | 36 | ||
35 | #include <asm/types.h> | 37 | #include <asm/types.h> |
36 | #include <asm/setup.h> | 38 | #include <asm/setup.h> |
@@ -360,6 +362,68 @@ void __init ep93xx_init_irq(void) | |||
360 | /************************************************************************* | 362 | /************************************************************************* |
361 | * EP93xx peripheral handling | 363 | * EP93xx peripheral handling |
362 | *************************************************************************/ | 364 | *************************************************************************/ |
365 | #define EP93XX_UART_MCR_OFFSET (0x0100) | ||
366 | |||
367 | static void ep93xx_uart_set_mctrl(struct amba_device *dev, | ||
368 | void __iomem *base, unsigned int mctrl) | ||
369 | { | ||
370 | unsigned int mcr; | ||
371 | |||
372 | mcr = 0; | ||
373 | if (!(mctrl & TIOCM_RTS)) | ||
374 | mcr |= 2; | ||
375 | if (!(mctrl & TIOCM_DTR)) | ||
376 | mcr |= 1; | ||
377 | |||
378 | __raw_writel(mcr, base + EP93XX_UART_MCR_OFFSET); | ||
379 | } | ||
380 | |||
381 | static struct amba_pl010_data ep93xx_uart_data = { | ||
382 | .set_mctrl = ep93xx_uart_set_mctrl, | ||
383 | }; | ||
384 | |||
385 | static struct amba_device uart1_device = { | ||
386 | .dev = { | ||
387 | .bus_id = "apb:uart1", | ||
388 | .platform_data = &ep93xx_uart_data, | ||
389 | }, | ||
390 | .res = { | ||
391 | .start = EP93XX_UART1_PHYS_BASE, | ||
392 | .end = EP93XX_UART1_PHYS_BASE + 0x0fff, | ||
393 | .flags = IORESOURCE_MEM, | ||
394 | }, | ||
395 | .irq = { IRQ_EP93XX_UART1, NO_IRQ }, | ||
396 | .periphid = 0x00041010, | ||
397 | }; | ||
398 | |||
399 | static struct amba_device uart2_device = { | ||
400 | .dev = { | ||
401 | .bus_id = "apb:uart2", | ||
402 | .platform_data = &ep93xx_uart_data, | ||
403 | }, | ||
404 | .res = { | ||
405 | .start = EP93XX_UART2_PHYS_BASE, | ||
406 | .end = EP93XX_UART2_PHYS_BASE + 0x0fff, | ||
407 | .flags = IORESOURCE_MEM, | ||
408 | }, | ||
409 | .irq = { IRQ_EP93XX_UART2, NO_IRQ }, | ||
410 | .periphid = 0x00041010, | ||
411 | }; | ||
412 | |||
413 | static struct amba_device uart3_device = { | ||
414 | .dev = { | ||
415 | .bus_id = "apb:uart3", | ||
416 | .platform_data = &ep93xx_uart_data, | ||
417 | }, | ||
418 | .res = { | ||
419 | .start = EP93XX_UART3_PHYS_BASE, | ||
420 | .end = EP93XX_UART3_PHYS_BASE + 0x0fff, | ||
421 | .flags = IORESOURCE_MEM, | ||
422 | }, | ||
423 | .irq = { IRQ_EP93XX_UART3, NO_IRQ }, | ||
424 | .periphid = 0x00041010, | ||
425 | }; | ||
426 | |||
363 | void __init ep93xx_init_devices(void) | 427 | void __init ep93xx_init_devices(void) |
364 | { | 428 | { |
365 | unsigned int v; | 429 | unsigned int v; |
@@ -371,4 +435,8 @@ void __init ep93xx_init_devices(void) | |||
371 | v &= ~EP93XX_SYSCON_DEVICE_CONFIG_CRUNCH_ENABLE; | 435 | v &= ~EP93XX_SYSCON_DEVICE_CONFIG_CRUNCH_ENABLE; |
372 | __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK); | 436 | __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK); |
373 | __raw_writel(v, EP93XX_SYSCON_DEVICE_CONFIG); | 437 | __raw_writel(v, EP93XX_SYSCON_DEVICE_CONFIG); |
438 | |||
439 | amba_device_register(&uart1_device, &iomem_resource); | ||
440 | amba_device_register(&uart2_device, &iomem_resource); | ||
441 | amba_device_register(&uart3_device, &iomem_resource); | ||
374 | } | 442 | } |