2 * arch/arm/mach-omap2/serial.c
4 * OMAP2 serial support.
6 * Copyright (C) 2005-2008 Nokia Corporation
7 * Author: Paul Mundt <paul.mundt@nokia.com>
9 * Major rework for PM support by Kevin Hilman
11 * Based off of arch/arm/mach-omap/omap1/serial.c
13 * Copyright (C) 2009 Texas Instruments
14 * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com
16 * This file is subject to the terms and conditions of the GNU General Public
17 * License. See the file "COPYING" in the main directory of this archive
20 #include <linux/kernel.h>
21 #include <linux/init.h>
22 #include <linux/clk.h>
24 #include <linux/delay.h>
25 #include <linux/platform_device.h>
26 #include <linux/slab.h>
27 #include <linux/pm_runtime.h>
28 #include <linux/console.h>
30 #include <plat/omap-serial.h>
32 #include <plat/board.h>
34 #include <plat/omap_hwmod.h>
35 #include <plat/omap_device.h>
36 #include <plat/omap-pm.h>
38 #include "prm2xxx_3xxx.h"
40 #include "cm2xxx_3xxx.h"
41 #include "prm-regbits-34xx.h"
46 * NOTE: By default the serial auto_suspend timeout is disabled as it causes
47 * lost characters over the serial ports. This means that the UART clocks will
48 * stay on until power/autosuspend_delay is set for the uart from sysfs.
49 * This also causes that any deeper omap sleep states are blocked.
51 #define DEFAULT_AUTOSUSPEND_DELAY -1
53 #define MAX_UART_HWMOD_NAME_LEN 16
55 struct omap_uart_state
{
58 struct list_head node
;
59 struct omap_hwmod
*oh
;
62 static LIST_HEAD(uart_list
);
64 static u8 console_uart_id
= -1;
65 static u8 no_console_suspend
;
68 #define DEFAULT_RXDMA_POLLRATE 1 /* RX DMA polling rate (us) */
69 #define DEFAULT_RXDMA_BUFSIZE 4096 /* RX DMA buffer size */
70 #define DEFAULT_RXDMA_TIMEOUT (3 * HZ)/* RX DMA timeout (jiffies) */
72 static struct omap_uart_port_info omap_serial_default_info
[] __initdata
= {
75 .dma_rx_buf_size
= DEFAULT_RXDMA_BUFSIZE
,
76 .dma_rx_poll_rate
= DEFAULT_RXDMA_POLLRATE
,
77 .dma_rx_timeout
= DEFAULT_RXDMA_TIMEOUT
,
78 .autosuspend_timeout
= DEFAULT_AUTOSUSPEND_DELAY
,
83 static void omap_uart_enable_wakeup(struct platform_device
*pdev
, bool enable
)
85 struct omap_device
*od
= to_omap_device(pdev
);
91 omap_hwmod_enable_wakeup(od
->hwmods
[0]);
93 omap_hwmod_disable_wakeup(od
->hwmods
[0]);
97 * Errata i291: [UART]:Cannot Acknowledge Idle Requests
98 * in Smartidle Mode When Configured for DMA Operations.
99 * WA: configure uart in force idle mode.
101 static void omap_uart_set_noidle(struct platform_device
*pdev
)
103 struct omap_device
*od
= to_omap_device(pdev
);
105 omap_hwmod_set_slave_idlemode(od
->hwmods
[0], HWMOD_IDLEMODE_NO
);
108 static void omap_uart_set_smartidle(struct platform_device
*pdev
)
110 struct omap_device
*od
= to_omap_device(pdev
);
113 if (od
->hwmods
[0]->class->sysc
->idlemodes
& SIDLE_SMART_WKUP
)
114 idlemode
= HWMOD_IDLEMODE_SMART_WKUP
;
116 idlemode
= HWMOD_IDLEMODE_SMART
;
118 omap_hwmod_set_slave_idlemode(od
->hwmods
[0], idlemode
);
122 static void omap_uart_enable_wakeup(struct platform_device
*pdev
, bool enable
)
124 static void omap_uart_set_noidle(struct platform_device
*pdev
) {}
125 static void omap_uart_set_smartidle(struct platform_device
*pdev
) {}
126 #endif /* CONFIG_PM */
128 #ifdef CONFIG_OMAP_MUX
129 static void omap_serial_fill_default_pads(struct omap_board_data
*bdata
)
133 static void omap_serial_fill_default_pads(struct omap_board_data
*bdata
) {}
136 static char *cmdline_find_option(char *str
)
138 extern char *saved_command_line
;
140 return strstr(saved_command_line
, str
);
143 static int __init
omap_serial_early_init(void)
146 char oh_name
[MAX_UART_HWMOD_NAME_LEN
];
147 struct omap_hwmod
*oh
;
148 struct omap_uart_state
*uart
;
149 char uart_name
[MAX_UART_HWMOD_NAME_LEN
];
151 snprintf(oh_name
, MAX_UART_HWMOD_NAME_LEN
,
152 "uart%d", num_uarts
+ 1);
153 oh
= omap_hwmod_lookup(oh_name
);
157 uart
= kzalloc(sizeof(struct omap_uart_state
), GFP_KERNEL
);
162 uart
->num
= num_uarts
++;
163 list_add_tail(&uart
->node
, &uart_list
);
164 snprintf(uart_name
, MAX_UART_HWMOD_NAME_LEN
,
165 "%s%d", OMAP_SERIAL_NAME
, uart
->num
);
167 if (cmdline_find_option(uart_name
)) {
168 console_uart_id
= uart
->num
;
170 if (console_loglevel
>= 10) {
172 pr_info("%s used as console in debug mode"
173 " uart%d clocks will not be"
174 " gated", uart_name
, uart
->num
);
177 if (cmdline_find_option("no_console_suspend"))
178 no_console_suspend
= true;
181 * omap-uart can be used for earlyprintk logs
182 * So if omap-uart is used as console then prevent
183 * uart reset and idle to get logs from omap-uart
184 * until uart console driver is available to take
185 * care for console messages.
186 * Idling or resetting omap-uart while printing logs
187 * early boot logs can stall the boot-up.
189 oh
->flags
|= HWMOD_INIT_NO_IDLE
| HWMOD_INIT_NO_RESET
;
195 core_initcall(omap_serial_early_init
);
198 * omap_serial_init_port() - initialize single serial port
199 * @bdata: port specific board data pointer
200 * @info: platform specific data pointer
202 * This function initialies serial driver for given port only.
203 * Platforms can call this function instead of omap_serial_init()
204 * if they don't plan to use all available UARTs as serial ports.
206 * Don't mix calls to omap_serial_init_port() and omap_serial_init(),
207 * use only one of the two.
209 void __init
omap_serial_init_port(struct omap_board_data
*bdata
,
210 struct omap_uart_port_info
*info
)
212 struct omap_uart_state
*uart
;
213 struct omap_hwmod
*oh
;
214 struct platform_device
*pdev
;
218 struct omap_uart_port_info omap_up
;
222 if (WARN_ON(bdata
->id
< 0))
224 if (WARN_ON(bdata
->id
>= num_uarts
))
227 list_for_each_entry(uart
, &uart_list
, node
)
228 if (bdata
->id
== uart
->num
)
231 info
= omap_serial_default_info
;
236 omap_up
.dma_enabled
= info
->dma_enabled
;
237 omap_up
.uartclk
= OMAP24XX_BASE_BAUD
* 16;
238 omap_up
.flags
= UPF_BOOT_AUTOCONF
;
239 omap_up
.get_context_loss_count
= omap_pm_get_dev_context_loss_count
;
240 omap_up
.set_forceidle
= omap_uart_set_smartidle
;
241 omap_up
.set_noidle
= omap_uart_set_noidle
;
242 omap_up
.enable_wakeup
= omap_uart_enable_wakeup
;
243 omap_up
.dma_rx_buf_size
= info
->dma_rx_buf_size
;
244 omap_up
.dma_rx_timeout
= info
->dma_rx_timeout
;
245 omap_up
.dma_rx_poll_rate
= info
->dma_rx_poll_rate
;
246 omap_up
.autosuspend_timeout
= info
->autosuspend_timeout
;
249 pdata_size
= sizeof(struct omap_uart_port_info
);
254 pdev
= omap_device_build(name
, uart
->num
, oh
, pdata
, pdata_size
,
256 WARN(IS_ERR(pdev
), "Could not build omap_device for %s: %s.\n",
259 if ((console_uart_id
== bdata
->id
) && no_console_suspend
)
260 omap_device_disable_idle_on_suspend(pdev
);
262 oh
->mux
= omap_hwmod_mux_init(bdata
->pads
, bdata
->pads_cnt
);
266 if (((cpu_is_omap34xx() || cpu_is_omap44xx()) && bdata
->pads
)
268 device_init_wakeup(&pdev
->dev
, true);
272 * omap_serial_board_init() - initialize all supported serial ports
273 * @info: platform specific data pointer
275 * Initializes all available UARTs as serial ports. Platforms
276 * can call this function when they want to have default behaviour
277 * for serial ports (e.g initialize them all as serial ports).
279 void __init
omap_serial_board_init(struct omap_uart_port_info
*info
)
281 struct omap_uart_state
*uart
;
282 struct omap_board_data bdata
;
284 list_for_each_entry(uart
, &uart_list
, node
) {
285 bdata
.id
= uart
->num
;
290 if (cpu_is_omap44xx() || cpu_is_omap34xx())
291 omap_serial_fill_default_pads(&bdata
);
294 omap_serial_init_port(&bdata
, NULL
);
296 omap_serial_init_port(&bdata
, &info
[uart
->num
]);
301 * omap_serial_init() - initialize all supported serial ports
303 * Initializes all available UARTs.
304 * Platforms can call this function when they want to have default behaviour
305 * for serial ports (e.g initialize them all as serial ports).
307 void __init
omap_serial_init(void)
309 omap_serial_board_init(NULL
);