[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>
This commit is contained in:
Родитель
fbb18a277a
Коммит
aee85fe8e8
|
@ -30,7 +30,9 @@
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <linux/timex.h>
|
#include <linux/timex.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
#include <linux/termios.h>
|
||||||
#include <linux/amba/bus.h>
|
#include <linux/amba/bus.h>
|
||||||
|
#include <linux/amba/serial.h>
|
||||||
|
|
||||||
#include <asm/types.h>
|
#include <asm/types.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
|
@ -360,6 +362,68 @@ void __init ep93xx_init_irq(void)
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* EP93xx peripheral handling
|
* EP93xx peripheral handling
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
#define EP93XX_UART_MCR_OFFSET (0x0100)
|
||||||
|
|
||||||
|
static void ep93xx_uart_set_mctrl(struct amba_device *dev,
|
||||||
|
void __iomem *base, unsigned int mctrl)
|
||||||
|
{
|
||||||
|
unsigned int mcr;
|
||||||
|
|
||||||
|
mcr = 0;
|
||||||
|
if (!(mctrl & TIOCM_RTS))
|
||||||
|
mcr |= 2;
|
||||||
|
if (!(mctrl & TIOCM_DTR))
|
||||||
|
mcr |= 1;
|
||||||
|
|
||||||
|
__raw_writel(mcr, base + EP93XX_UART_MCR_OFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct amba_pl010_data ep93xx_uart_data = {
|
||||||
|
.set_mctrl = ep93xx_uart_set_mctrl,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct amba_device uart1_device = {
|
||||||
|
.dev = {
|
||||||
|
.bus_id = "apb:uart1",
|
||||||
|
.platform_data = &ep93xx_uart_data,
|
||||||
|
},
|
||||||
|
.res = {
|
||||||
|
.start = EP93XX_UART1_PHYS_BASE,
|
||||||
|
.end = EP93XX_UART1_PHYS_BASE + 0x0fff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
.irq = { IRQ_EP93XX_UART1, NO_IRQ },
|
||||||
|
.periphid = 0x00041010,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct amba_device uart2_device = {
|
||||||
|
.dev = {
|
||||||
|
.bus_id = "apb:uart2",
|
||||||
|
.platform_data = &ep93xx_uart_data,
|
||||||
|
},
|
||||||
|
.res = {
|
||||||
|
.start = EP93XX_UART2_PHYS_BASE,
|
||||||
|
.end = EP93XX_UART2_PHYS_BASE + 0x0fff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
.irq = { IRQ_EP93XX_UART2, NO_IRQ },
|
||||||
|
.periphid = 0x00041010,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct amba_device uart3_device = {
|
||||||
|
.dev = {
|
||||||
|
.bus_id = "apb:uart3",
|
||||||
|
.platform_data = &ep93xx_uart_data,
|
||||||
|
},
|
||||||
|
.res = {
|
||||||
|
.start = EP93XX_UART3_PHYS_BASE,
|
||||||
|
.end = EP93XX_UART3_PHYS_BASE + 0x0fff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
.irq = { IRQ_EP93XX_UART3, NO_IRQ },
|
||||||
|
.periphid = 0x00041010,
|
||||||
|
};
|
||||||
|
|
||||||
void __init ep93xx_init_devices(void)
|
void __init ep93xx_init_devices(void)
|
||||||
{
|
{
|
||||||
unsigned int v;
|
unsigned int v;
|
||||||
|
@ -371,4 +435,8 @@ void __init ep93xx_init_devices(void)
|
||||||
v &= ~EP93XX_SYSCON_DEVICE_CONFIG_CRUNCH_ENABLE;
|
v &= ~EP93XX_SYSCON_DEVICE_CONFIG_CRUNCH_ENABLE;
|
||||||
__raw_writel(0xaa, EP93XX_SYSCON_SWLOCK);
|
__raw_writel(0xaa, EP93XX_SYSCON_SWLOCK);
|
||||||
__raw_writel(v, EP93XX_SYSCON_DEVICE_CONFIG);
|
__raw_writel(v, EP93XX_SYSCON_DEVICE_CONFIG);
|
||||||
|
|
||||||
|
amba_device_register(&uart1_device, &iomem_resource);
|
||||||
|
amba_device_register(&uart2_device, &iomem_resource);
|
||||||
|
amba_device_register(&uart3_device, &iomem_resource);
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче