ARM: OMAP2+: UART: Allow UART parameters to be configured from board file.
authorDeepak K <deepak.k@ti.com>
Wed, 9 Nov 2011 12:03:38 +0000 (17:33 +0530)
committerKevin Hilman <khilman@ti.com>
Thu, 15 Dec 2011 00:05:24 +0000 (16:05 -0800)
The following UART parameters are defined within the UART driver:

1). Whether the UART uses DMA (dma_enabled), by default set to 0
2). The size of dma buffer (set to 4096 bytes)
3). The time after which the dma should stop if no more data is received.
4). The auto suspend delay that will be passed for pm_runtime_autosuspend
    where uart will be disabled after timeout

Different UARTs may be used for different purpose such as the console,
for interfacing bluetooth chip, for interfacing to a modem chip, etc.
Therefore, it is necessary to be able to customize the above settings
for a given board on a per UART basis.

This change allows these parameters to be configured from the board file
and allows the parameters to be configured for each UART independently.

If a board does not define its own custom parameters for the UARTs, then
use the default parameters in the structure "omap_serial_default_info".
The default parameters are defined to be the same as the current settings
in the UART driver to avoid breaking the UART for any cuurnelty supported
boards. By default, make all boards use the default UART parameters.

Signed-off-by: Deepak K <deepak.k@ti.com>
Signed-off-by: Jon Hunter <jon-hunter@ti.com>
Signed-off-by: Govindraj.R <govindraj.raja@ti.com>
Acked-by: Greg Kroah-Hartman <gregkh@suse.de> (for drivers/tty changes)
Signed-off-by: Kevin Hilman <khilman@ti.com>
arch/arm/mach-omap2/board-n8x0.c
arch/arm/mach-omap2/serial.c
arch/arm/plat-omap/include/plat/omap-serial.h
arch/arm/plat-omap/include/plat/serial.h
drivers/tty/serial/omap-serial.c

index bebd3d84365eec43e34eb5f786b1956c27e0a15b..118f38c4b37d1be9cf7dbc58722c2c560fdfd032 100644 (file)
@@ -644,15 +644,15 @@ static inline void board_serial_init(void)
        bdata.pads_cnt = 0;
 
        bdata.id = 0;
-       omap_serial_init_port(&bdata);
+       omap_serial_init_port(&bdata, NULL);
 
        bdata.id = 1;
-       omap_serial_init_port(&bdata);
+       omap_serial_init_port(&bdata, NULL);
 
        bdata.id = 2;
        bdata.pads = serial2_pads;
        bdata.pads_cnt = ARRAY_SIZE(serial2_pads);
-       omap_serial_init_port(&bdata);
+       omap_serial_init_port(&bdata, NULL);
 }
 
 #else
index f94394fe5b1683a8b155828a96bf0cabf609882b..5b1b36a45e9c82a0f25038d6dcfc81dc806a5b01 100644 (file)
 #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
 
@@ -64,6 +64,18 @@ struct omap_uart_state {
 static LIST_HEAD(uart_list);
 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
 
 int omap_uart_can_sleep(void)
@@ -294,6 +306,7 @@ core_initcall(omap_serial_early_init);
 /**
  * omap_serial_init_port() - initialize single serial port
  * @bdata: port specific board data pointer
+ * @info: platform specific data pointer
  *
  * This function initialies serial driver for given port only.
  * 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(),
  * 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_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)
                if (bdata->id == uart->num)
                        break;
+       if (!info)
+               info = omap_serial_default_info;
 
        oh = uart->oh;
        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.flags = UPF_BOOT_AUTOCONF;
        omap_up.get_context_loss_count = omap_pm_get_dev_context_loss_count;
        omap_up.set_forceidle = omap_uart_set_forceidle;
        omap_up.set_noidle = omap_uart_set_noidle;
        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 */
        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
  * 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)
+void __init omap_serial_board_init(struct omap_uart_port_info *info)
 {
        struct omap_uart_state *uart;
        struct omap_board_data bdata;
@@ -399,7 +419,21 @@ void __init omap_serial_init(void)
                if (cpu_is_omap44xx() || cpu_is_omap34xx())
                        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);
+}
index 39709ecfd58fec2e239694a4b766c4d7fa01594b..a740a6c0e104edd221fc8bdd6f13cf724bd883b5 100644 (file)
@@ -66,6 +66,9 @@ struct omap_uart_port_info {
        unsigned int            uartclk;        /* UART clock rate */
        upf_t                   flags;          /* UPF_* flags */
        u32                     errata;
+       unsigned int            dma_rx_buf_size;
+       unsigned int            dma_rx_timeout;
+       unsigned int            autosuspend_timeout;
 
        int (*get_context_loss_count)(struct device *);
        void (*set_forceidle)(struct platform_device *);
@@ -94,8 +97,8 @@ struct uart_omap_dma {
        spinlock_t              rx_lock;
        /* timer to poll activity on rx dma */
        struct timer_list       rx_timer;
-       int                     rx_buf_size;
-       int                     rx_timeout;
+       unsigned int            rx_buf_size;
+       unsigned int            rx_timeout;
 };
 
 struct uart_omap_port {
index 152500b558a2232ecdae18623ac1d1e725c019c1..38b3e38df2a059edee7b0a7a34a52d0b020cc5fb 100644 (file)
 #ifndef __ASSEMBLER__
 
 struct omap_board_data;
+struct omap_uart_port_info;
 
 extern void omap_serial_init(void);
-extern void omap_serial_init_port(struct omap_board_data *bdata);
 extern int omap_uart_can_sleep(void);
+extern void omap_serial_board_init(struct omap_uart_port_info *platform_data);
+extern void omap_serial_init_port(struct omap_board_data *bdata,
+               struct omap_uart_port_info *platform_data);
 #endif
 
 #endif
index 45a25a01c44d619ab4fb0e58304aebda8c95a565..d60e001cf60f98ec6ce99bcfa04db8e27f15568e 100644 (file)
@@ -43,8 +43,6 @@
 #include <plat/dmtimer.h>
 #include <plat/omap-serial.h>
 
-#define OMAP_UART_AUTOSUSPEND_DELAY -1
-
 static struct uart_omap_port *ui[OMAP_MAX_HSUART_PORTS];
 
 /* Forward declaration of functions */
@@ -1376,8 +1374,8 @@ static int serial_omap_probe(struct platform_device *pdev)
                up->uart_dma.uart_dma_tx = dma_tx->start;
                up->uart_dma.uart_dma_rx = dma_rx->start;
                up->use_dma = 1;
-               up->uart_dma.rx_buf_size = 4096;
-               up->uart_dma.rx_timeout = 2;
+               up->uart_dma.rx_buf_size = omap_up_info->dma_rx_buf_size;
+               up->uart_dma.rx_timeout = omap_up_info->dma_rx_timeout;
                spin_lock_init(&(up->uart_dma.tx_lock));
                spin_lock_init(&(up->uart_dma.rx_lock));
                up->uart_dma.tx_dma_channel = OMAP_UART_DMA_CH_FREE;
@@ -1386,7 +1384,7 @@ static int serial_omap_probe(struct platform_device *pdev)
 
        pm_runtime_use_autosuspend(&pdev->dev);
        pm_runtime_set_autosuspend_delay(&pdev->dev,
-                       OMAP_UART_AUTOSUSPEND_DELAY);
+                       omap_up_info->autosuspend_timeout);
 
        pm_runtime_irq_safe(&pdev->dev);
        pm_runtime_enable(&pdev->dev);