|
@@ -1110,13 +1110,14 @@ static int omap8250_no_handle_irq(struct uart_port *port)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static const u8 omap4_habit = UART_ERRATA_CLOCK_DISABLE;
|
|
static const u8 am3352_habit = OMAP_DMA_TX_KICK | UART_ERRATA_CLOCK_DISABLE;
|
|
static const u8 am3352_habit = OMAP_DMA_TX_KICK | UART_ERRATA_CLOCK_DISABLE;
|
|
static const u8 dra742_habit = UART_ERRATA_CLOCK_DISABLE;
|
|
static const u8 dra742_habit = UART_ERRATA_CLOCK_DISABLE;
|
|
|
|
|
|
static const struct of_device_id omap8250_dt_ids[] = {
|
|
static const struct of_device_id omap8250_dt_ids[] = {
|
|
{ .compatible = "ti,omap2-uart" },
|
|
{ .compatible = "ti,omap2-uart" },
|
|
{ .compatible = "ti,omap3-uart" },
|
|
{ .compatible = "ti,omap3-uart" },
|
|
- { .compatible = "ti,omap4-uart" },
|
|
|
|
|
|
+ { .compatible = "ti,omap4-uart", .data = &omap4_habit, },
|
|
{ .compatible = "ti,am3352-uart", .data = &am3352_habit, },
|
|
{ .compatible = "ti,am3352-uart", .data = &am3352_habit, },
|
|
{ .compatible = "ti,am4372-uart", .data = &am3352_habit, },
|
|
{ .compatible = "ti,am4372-uart", .data = &am3352_habit, },
|
|
{ .compatible = "ti,dra742-uart", .data = &dra742_habit, },
|
|
{ .compatible = "ti,dra742-uart", .data = &dra742_habit, },
|
|
@@ -1362,6 +1363,19 @@ static int omap8250_soft_reset(struct device *dev)
|
|
int sysc;
|
|
int sysc;
|
|
int syss;
|
|
int syss;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * At least on omap4, unused uarts may not idle after reset without
|
|
|
|
+ * a basic scr dma configuration even with no dma in use. The
|
|
|
|
+ * module clkctrl status bits will be 1 instead of 3 blocking idle
|
|
|
|
+ * for the whole clockdomain. The softreset below will clear scr,
|
|
|
|
+ * and we restore it on resume so this is safe to do on all SoCs
|
|
|
|
+ * needing omap8250_soft_reset() quirk. Do it in two writes as
|
|
|
|
+ * recommended in the comment for omap8250_update_scr().
|
|
|
|
+ */
|
|
|
|
+ serial_out(up, UART_OMAP_SCR, OMAP_UART_SCR_DMAMODE_1);
|
|
|
|
+ serial_out(up, UART_OMAP_SCR,
|
|
|
|
+ OMAP_UART_SCR_DMAMODE_1 | OMAP_UART_SCR_DMAMODE_CTL);
|
|
|
|
+
|
|
sysc = serial_in(up, UART_OMAP_SYSC);
|
|
sysc = serial_in(up, UART_OMAP_SYSC);
|
|
|
|
|
|
/* softreset the UART */
|
|
/* softreset the UART */
|