|
@@ -43,12 +43,12 @@
|
|
#include "mux.h"
|
|
#include "mux.h"
|
|
|
|
|
|
/*
|
|
/*
|
|
- * NOTE: By default the serial timeout is disabled as it causes lost characters
|
|
|
|
- * over the serial ports. This means that the UART clocks will stay on until
|
|
|
|
- * disabled via sysfs. This also causes that any deeper omap sleep states are
|
|
|
|
- * blocked.
|
|
|
|
|
|
+ * NOTE: By default the serial auto_suspend timeout is disabled as it causes
|
|
|
|
+ * lost characters over the serial ports. This means that the UART clocks will
|
|
|
|
+ * stay on until power/autosuspend_delay is set for the uart from sysfs.
|
|
|
|
+ * This also causes that any deeper omap sleep states are blocked.
|
|
*/
|
|
*/
|
|
-#define DEFAULT_TIMEOUT 0
|
|
|
|
|
|
+#define DEFAULT_AUTOSUSPEND_DELAY -1
|
|
|
|
|
|
#define MAX_UART_HWMOD_NAME_LEN 16
|
|
#define MAX_UART_HWMOD_NAME_LEN 16
|
|
|
|
|
|
@@ -64,6 +64,18 @@ struct omap_uart_state {
|
|
static LIST_HEAD(uart_list);
|
|
static LIST_HEAD(uart_list);
|
|
static u8 num_uarts;
|
|
static u8 num_uarts;
|
|
|
|
|
|
|
|
+#define DEFAULT_RXDMA_TIMEOUT 1 /* RX DMA polling rate (us) */
|
|
|
|
+#define DEFAULT_RXDMA_BUFSIZE 4096 /* RX DMA buffer size */
|
|
|
|
+
|
|
|
|
+static struct omap_uart_port_info omap_serial_default_info[] __initdata = {
|
|
|
|
+ {
|
|
|
|
+ .dma_enabled = false,
|
|
|
|
+ .dma_rx_buf_size = DEFAULT_RXDMA_BUFSIZE,
|
|
|
|
+ .dma_rx_timeout = DEFAULT_RXDMA_TIMEOUT,
|
|
|
|
+ .autosuspend_timeout = DEFAULT_AUTOSUSPEND_DELAY,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
#ifdef CONFIG_PM
|
|
#ifdef CONFIG_PM
|
|
|
|
|
|
int omap_uart_can_sleep(void)
|
|
int omap_uart_can_sleep(void)
|
|
@@ -294,6 +306,7 @@ core_initcall(omap_serial_early_init);
|
|
/**
|
|
/**
|
|
* omap_serial_init_port() - initialize single serial port
|
|
* omap_serial_init_port() - initialize single serial port
|
|
* @bdata: port specific board data pointer
|
|
* @bdata: port specific board data pointer
|
|
|
|
+ * @info: platform specific data pointer
|
|
*
|
|
*
|
|
* This function initialies serial driver for given port only.
|
|
* This function initialies serial driver for given port only.
|
|
* Platforms can call this function instead of omap_serial_init()
|
|
* Platforms can call this function instead of omap_serial_init()
|
|
@@ -302,7 +315,8 @@ core_initcall(omap_serial_early_init);
|
|
* Don't mix calls to omap_serial_init_port() and omap_serial_init(),
|
|
* Don't mix calls to omap_serial_init_port() and omap_serial_init(),
|
|
* use only one of the two.
|
|
* use only one of the two.
|
|
*/
|
|
*/
|
|
-void __init omap_serial_init_port(struct omap_board_data *bdata)
|
|
|
|
|
|
+void __init omap_serial_init_port(struct omap_board_data *bdata,
|
|
|
|
+ struct omap_uart_port_info *info)
|
|
{
|
|
{
|
|
struct omap_uart_state *uart;
|
|
struct omap_uart_state *uart;
|
|
struct omap_hwmod *oh;
|
|
struct omap_hwmod *oh;
|
|
@@ -322,17 +336,22 @@ void __init omap_serial_init_port(struct omap_board_data *bdata)
|
|
list_for_each_entry(uart, &uart_list, node)
|
|
list_for_each_entry(uart, &uart_list, node)
|
|
if (bdata->id == uart->num)
|
|
if (bdata->id == uart->num)
|
|
break;
|
|
break;
|
|
|
|
+ if (!info)
|
|
|
|
+ info = omap_serial_default_info;
|
|
|
|
|
|
oh = uart->oh;
|
|
oh = uart->oh;
|
|
name = DRIVER_NAME;
|
|
name = DRIVER_NAME;
|
|
|
|
|
|
- omap_up.dma_enabled = uart->dma_enabled;
|
|
|
|
|
|
+ omap_up.dma_enabled = info->dma_enabled;
|
|
omap_up.uartclk = OMAP24XX_BASE_BAUD * 16;
|
|
omap_up.uartclk = OMAP24XX_BASE_BAUD * 16;
|
|
omap_up.flags = UPF_BOOT_AUTOCONF;
|
|
omap_up.flags = UPF_BOOT_AUTOCONF;
|
|
omap_up.get_context_loss_count = omap_pm_get_dev_context_loss_count;
|
|
omap_up.get_context_loss_count = omap_pm_get_dev_context_loss_count;
|
|
omap_up.set_forceidle = omap_uart_set_forceidle;
|
|
omap_up.set_forceidle = omap_uart_set_forceidle;
|
|
omap_up.set_noidle = omap_uart_set_noidle;
|
|
omap_up.set_noidle = omap_uart_set_noidle;
|
|
omap_up.enable_wakeup = omap_uart_enable_wakeup;
|
|
omap_up.enable_wakeup = omap_uart_enable_wakeup;
|
|
|
|
+ omap_up.dma_rx_buf_size = info->dma_rx_buf_size;
|
|
|
|
+ omap_up.dma_rx_timeout = info->dma_rx_timeout;
|
|
|
|
+ omap_up.autosuspend_timeout = info->autosuspend_timeout;
|
|
|
|
|
|
/* Enable the MDR1 Errata i202 for OMAP2430/3xxx/44xx */
|
|
/* Enable the MDR1 Errata i202 for OMAP2430/3xxx/44xx */
|
|
if (!cpu_is_omap2420() && !cpu_is_ti816x())
|
|
if (!cpu_is_omap2420() && !cpu_is_ti816x())
|
|
@@ -379,13 +398,14 @@ void __init omap_serial_init_port(struct omap_board_data *bdata)
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * omap_serial_init() - initialize all supported serial ports
|
|
|
|
|
|
+ * omap_serial_board_init() - initialize all supported serial ports
|
|
|
|
+ * @info: platform specific data pointer
|
|
*
|
|
*
|
|
* Initializes all available UARTs as serial ports. Platforms
|
|
* Initializes all available UARTs as serial ports. Platforms
|
|
* can call this function when they want to have default behaviour
|
|
* can call this function when they want to have default behaviour
|
|
* for serial ports (e.g initialize them all as serial ports).
|
|
* for serial ports (e.g initialize them all as serial ports).
|
|
*/
|
|
*/
|
|
-void __init omap_serial_init(void)
|
|
|
|
|
|
+void __init omap_serial_board_init(struct omap_uart_port_info *info)
|
|
{
|
|
{
|
|
struct omap_uart_state *uart;
|
|
struct omap_uart_state *uart;
|
|
struct omap_board_data bdata;
|
|
struct omap_board_data bdata;
|
|
@@ -399,7 +419,21 @@ void __init omap_serial_init(void)
|
|
if (cpu_is_omap44xx() || cpu_is_omap34xx())
|
|
if (cpu_is_omap44xx() || cpu_is_omap34xx())
|
|
omap_serial_fill_default_pads(&bdata);
|
|
omap_serial_fill_default_pads(&bdata);
|
|
|
|
|
|
- omap_serial_init_port(&bdata);
|
|
|
|
-
|
|
|
|
|
|
+ if (!info)
|
|
|
|
+ omap_serial_init_port(&bdata, NULL);
|
|
|
|
+ else
|
|
|
|
+ omap_serial_init_port(&bdata, &info[uart->num]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * omap_serial_init() - initialize all supported serial ports
|
|
|
|
+ *
|
|
|
|
+ * Initializes all available UARTs.
|
|
|
|
+ * Platforms can call this function when they want to have default behaviour
|
|
|
|
+ * for serial ports (e.g initialize them all as serial ports).
|
|
|
|
+ */
|
|
|
|
+void __init omap_serial_init(void)
|
|
|
|
+{
|
|
|
|
+ omap_serial_board_init(NULL);
|
|
|
|
+}
|