@@ -30,6 +30,9 @@
#include <plat/clock.h>
#include <plat/control.h>
+#include <plat/dma.h>
+#include <plat/omap-serial.h>
+
#include "prm.h"
#include "pm.h"
#include "prm-regbits-34xx.h"
@@ -60,11 +63,13 @@ struct omap_uart_state {
struct clk *fck;
int clocked;
+ int dma_enabled;
int irq;
int regshift;
int irqflags;
void __iomem *membase;
resource_size_t mapbase;
+
struct list_head node;
struct platform_device pdev;
@@ -83,6 +88,7 @@ struct omap_uart_state {
static LIST_HEAD(uart_list);
+#ifndef CONFIG_SERIAL_OMAP
static struct plat_serial8250_port serial_platform_data0[] = {
{
.irq = 72,
@@ -169,7 +175,107 @@ static struct omap_uart_state omap_uart[] = {
},
#endif
};
+#else
+static struct omap_uart_port_info uart1_port_info = {
+ .dma_enabled = 0,
+};
+
+static struct omap_uart_port_info uart2_port_info = {
+ .dma_enabled = 1,
+};
+
+static struct omap_uart_port_info uart3_port_info = {
+ .dma_enabled = 0,
+};
+
+static struct resource omap_uart1_resources[] = {
+ {
+ .start = OMAP2_UART1_BASE,
+ .end = OMAP2_UART1_BASE + 0x3ff,
+ .flags = IORESOURCE_MEM,
+ }, {
+ /* UART1 IRQ - 72*/
+ .start = INT_24XX_UART1_IRQ,
+ .flags = IORESOURCE_IRQ,
+ }, {
+ /* UART1 RX DMA CHANNEL -S_DMA_49- */
+ .start = OMAP24XX_DMA_UART1_RX,
+ .flags = IORESOURCE_DMA,
+ }, {
+ /* UART1 TX DMA CHANNEL -S_DMA_48- */
+ .start = OMAP24XX_DMA_UART1_TX,
+ .flags = IORESOURCE_DMA,
+ }
+};
+
+static struct resource omap_uart2_resources[] = {
+ {
+ .start = OMAP2_UART2_BASE,
+ .end = OMAP2_UART2_BASE + 0x3ff,
+ .flags = IORESOURCE_MEM,
+ }, {
+ /* UART2 IRQ - 73*/
+ .start = INT_24XX_UART2_IRQ,
+ .flags = IORESOURCE_IRQ,
+ }, {
+ /* UART2 RX DMA CHANNEL -S_DMA_51- */
+ .start = OMAP24XX_DMA_UART2_RX,
+ .flags = IORESOURCE_DMA,
+ }, {
+ /* UART2 TX DMA CHANNEL -S_DMA_50- */
+ .start = OMAP24XX_DMA_UART2_TX,
+ .flags = IORESOURCE_DMA,
+ }
+};
+
+static struct resource omap_uart3_resources[] = {
+ {
+ .start = OMAP2_UART3_BASE,
+ .end = OMAP2_UART3_BASE + 0x3ff,
+ .flags = IORESOURCE_MEM,
+ }, {
+ /* UART3 IRQ - 74*/
+ .start = INT_24XX_UART3_IRQ,
+ .flags = IORESOURCE_IRQ,
+ }, {
+ /* UART3 RX DMA CHANNEL -S_DMA_53- */
+ .start = OMAP24XX_DMA_UART3_RX,
+ .flags = IORESOURCE_DMA,
+ }, {
+ /* UART3 TX DMA CHANNEL -S_DMA_52- */
+ .start = OMAP24XX_DMA_UART3_TX,
+ .flags = IORESOURCE_DMA,
+ }
+};
+static struct omap_uart_state omap_uart[OMAP_MAX_HSUART_PORTS] = {
+ {
+ .pdev = {
+ .num_resources = ARRAY_SIZE(omap_uart1_resources),
+ .resource = omap_uart1_resources,
+ .dev = {
+ .platform_data = &uart1_port_info
+ },
+ }
+ }, {
+ .pdev = {
+ .num_resources = ARRAY_SIZE(omap_uart2_resources),
+ .resource = omap_uart2_resources,
+ .dev = {
+ .platform_data = &uart2_port_info,
+ },
+ }
+ }, {
+ .pdev = {
+ .num_resources = ARRAY_SIZE(omap_uart3_resources),
+ .resource = omap_uart3_resources,
+ .dev = {
+ .platform_data = &uart3_port_info,
+ },
+ }
+ }
+};
+#endif
void __init omap2_set_globals_uart(struct omap_globals *omap2_globals)
{
@@ -613,6 +719,8 @@ DEVICE_ATTR(sleep_timeout, 0644, sleep_timeout_show, sleep_timeout_store);
static inline void omap_uart_idle_init(struct omap_uart_state *uart) {}
#define DEV_CREATE_FILE(dev, attr)
#endif /* CONFIG_PM */
+
+#ifndef CONFIG_SERIAL_OMAP
/*
* Override the default 8250 read handler: mem_serial_in()
* Empty RX fifo read causes an abort on omap3630 and omap4
@@ -645,6 +753,7 @@ static void serial_out_override(struct uart_port *up, int offset, int value)
}
__serial_write_reg(up, offset, value);
}
+#endif
void __init omap_serial_early_init(void)
{
@@ -666,7 +775,6 @@ void __init omap_serial_early_init(void)
struct omap_uart_state *uart = &omap_uart[i];
struct platform_device *pdev = &uart->pdev;
struct device *dev = &pdev->dev;
- struct plat_serial8250_port *p = dev->platform_data;
uart->num = i;
/*
@@ -713,10 +821,6 @@ void __init omap_serial_early_init(void)
continue;
}
- p->private_data = uart;
- p->membase = uart->membase;
- p->mapbase = uart->mapbase;
-
if (cpu_is_omap44xx())
uart->irq += 32;
}
@@ -738,7 +842,12 @@ void __init omap_serial_init_port(int port)
struct omap_uart_state *uart;
struct platform_device *pdev;
struct device *dev;
+#ifndef CONFIG_SERIAL_OMAP
struct plat_serial8250_port *p;
+#else
+ struct omap_uart_port_info *omap_up;
+#endif
+
BUG_ON(port < 0);
BUG_ON(port >= ARRAY_SIZE(omap_uart));
@@ -746,6 +855,22 @@ void __init omap_serial_init_port(int port)
pdev = &uart->pdev;
dev = &pdev->dev;
+#ifndef CONFIG_SERIAL_OMAP
+ p = dev->platform_data;
+ p->private_data = uart;
+ p->membase = uart->membase;
+ p->mapbase = uart->mapbase;
+#else
+ omap_up = dev->platform_data;
+ uart->dma_enabled = omap_up->dma_enabled;
+ omap_up->uartclk = OMAP24XX_BASE_BAUD * 16;
+ omap_up->membase = uart->membase;
+ omap_up->mapbase = uart->mapbase;
+ omap_up->irqflags |= IRQF_SHARED;
+ omap_up->flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
+ pdev->name = DRIVER_NAME;
+ pdev->id = port;
+#endif
/* Don't proceed if there's no clocks available */
if (unlikely(!uart->ick || !uart->fck)) {
WARN(1, "%s: can't init uart%d, no clocks available\n",
@@ -758,7 +883,7 @@ void __init omap_serial_init_port(int port)
omap_uart_reset(uart);
omap_uart_idle_init(uart);
- p = dev->platform_data;
+#ifndef CONFIG_SERIAL_OMAP
/*
* omap44xx: Never read empty UART fifo
* omap3xxx: Never read empty UART fifo on UARTs
@@ -772,7 +897,7 @@ void __init omap_serial_init_port(int port)
p->serial_in = serial_in_override;
p->serial_out = serial_out_override;
}
-
+#endif
list_add_tail(&uart->node, &uart_list);
if (WARN_ON(platform_device_register(pdev)))