@@ -249,10 +249,18 @@ static inline void omap_uart_smart_idle_enable(struct omap_uart_state *p,
sysc = omap_hwmod_read_sysc(p->oh);
sysc &= ~SYSC_SIDLEMODE_MASK;
- if (enable)
- sysc |= 0x2 << SYSC_SIDLEMODE_SHIFT;
- else
+ if (enable) {
+ /**
+ * Errata 2.15: [UART]:Cannot Acknowledge Idle Requests
+ * in Smartidle Mode When Configured for DMA Operations.
+ */
+ if (p->dma_enabled)
+ sysc |= 0x0 << SYSC_SIDLEMODE_SHIFT;
+ else
+ sysc |= 0x2 << SYSC_SIDLEMODE_SHIFT;
+ } else {
sysc |= 0x1 << SYSC_SIDLEMODE_SHIFT;
+ }
omap_hwmod_write_sysc(sysc, p->oh);
}
@@ -540,14 +548,17 @@ void __init omap_serial_early_init(void)
void __init omap_serial_init(void)
{
struct omap_uart_state *uart;
+ char *name;
list_for_each_entry(uart, &uart_list, node) {
struct omap_hwmod *oh = uart->oh;
struct omap_device *od;
void *pdata = NULL;
u32 pdata_size = 0;
+
+ uart->dma_enabled = 0;
#ifdef CONFIG_SERIAL_8250_CONSOLE
- char *name = "serial8250";
+ name = "serial8250";
struct plat_serial8250_port ports[2] = {
{},
{.flags = 0},
@@ -578,14 +589,20 @@ void __init omap_serial_init(void)
pdata_size = 2 * sizeof(struct plat_serial8250_port);
#endif
#ifdef CONFIG_SERIAL_OMAP_CONSOLE
- struct uart_port_info p;
- char *name = "omap-hsuart";
+ struct omap_uart_port_info omap_up;
+ name = "omap-hsuart";
+
+ omap_up.dma_enabled = 0;
+ uart->dma_enabled = omap_up.dma_enabled;
- p.dma_enabled = 0;
- p.uartclk = OMAP24XX_BASE_BAUD * 16;
+ omap_up.uartclk = OMAP24XX_BASE_BAUD * 16;
+ omap_up.mapbase = oh->slaves[0]->addr->pa_start;
+ omap_up.membase = oh->_rt_va;
+ omap_up.irqflags = IRQF_SHARED;
+ omap_up.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
- pdata = &p;
- pdata_size = sizeof(struct uart_port_info);
+ pdata = &omap_up;
+ pdata_size = sizeof(struct omap_uart_port_info);
#endif
if (WARN_ON(!oh))