serial.c 10.4 KB
Newer Older
1
/*
2
 * arch/arm/mach-omap2/serial.c
3 4 5
 *
 * OMAP2 serial support.
 *
6
 * Copyright (C) 2005-2008 Nokia Corporation
7 8
 * Author: Paul Mundt <paul.mundt@nokia.com>
 *
9 10
 * Major rework for PM support by Kevin Hilman
 *
11 12
 * Based off of arch/arm/mach-omap/omap1/serial.c
 *
13 14 15
 * Copyright (C) 2009 Texas Instruments
 * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com
 *
16 17 18 19 20 21
 * This file is subject to the terms and conditions of the GNU General Public
 * License. See the file "COPYING" in the main directory of this archive
 * for more details.
 */
#include <linux/kernel.h>
#include <linux/init.h>
22
#include <linux/clk.h>
23
#include <linux/io.h>
24
#include <linux/delay.h>
25 26
#include <linux/platform_device.h>
#include <linux/slab.h>
27
#include <linux/pm_runtime.h>
28
#include <linux/console.h>
29 30

#include <plat/omap-serial.h>
31
#include <plat-omap/dma-omap.h>
32

33 34 35
#include "common.h"
#include "omap_hwmod.h"
#include "omap_device.h"
36
#include "omap-pm.h"
37
#include "soc.h"
38
#include "prm2xxx_3xxx.h"
39
#include "pm.h"
40
#include "cm2xxx_3xxx.h"
41
#include "prm-regbits-34xx.h"
42
#include "control.h"
43
#include "mux.h"
44
#include "serial.h"
45

46
/*
47 48 49 50
 * 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.
51
 */
52
#define DEFAULT_AUTOSUSPEND_DELAY	-1
53

54 55
#define MAX_UART_HWMOD_NAME_LEN		16

56 57 58 59
struct omap_uart_state {
	int num;

	struct list_head node;
60
	struct omap_hwmod *oh;
61
	struct omap_device_pad default_omap_uart_pads[2];
62 63 64
};

static LIST_HEAD(uart_list);
65
static u8 num_uarts;
66
static u8 console_uart_id = -1;
67
static u8 no_console_suspend;
68
static u8 uart_debug;
69

70
#define DEFAULT_RXDMA_POLLRATE		1	/* RX DMA polling rate (us) */
71
#define DEFAULT_RXDMA_BUFSIZE		4096	/* RX DMA buffer size */
72
#define DEFAULT_RXDMA_TIMEOUT		(3 * HZ)/* RX DMA timeout (jiffies) */
73 74 75 76 77

static struct omap_uart_port_info omap_serial_default_info[] __initdata = {
	{
		.dma_enabled	= false,
		.dma_rx_buf_size = DEFAULT_RXDMA_BUFSIZE,
78
		.dma_rx_poll_rate = DEFAULT_RXDMA_POLLRATE,
79 80 81 82 83
		.dma_rx_timeout = DEFAULT_RXDMA_TIMEOUT,
		.autosuspend_timeout = DEFAULT_AUTOSUSPEND_DELAY,
	},
};

84
#ifdef CONFIG_PM
85
static void omap_uart_enable_wakeup(struct device *dev, bool enable)
86
{
87
	struct platform_device *pdev = to_platform_device(dev);
88
	struct omap_device *od = to_omap_device(pdev);
89

90 91
	if (!od)
		return;
92

93 94 95 96
	if (enable)
		omap_hwmod_enable_wakeup(od->hwmods[0]);
	else
		omap_hwmod_disable_wakeup(od->hwmods[0]);
97 98
}

99 100 101 102 103
/*
 * Errata i291: [UART]:Cannot Acknowledge Idle Requests
 * in Smartidle Mode When Configured for DMA Operations.
 * WA: configure uart in force idle mode.
 */
104
static void omap_uart_set_noidle(struct device *dev)
105
{
106
	struct platform_device *pdev = to_platform_device(dev);
107 108 109 110 111
	struct omap_device *od = to_omap_device(pdev);

	omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_NO);
}

112
static void omap_uart_set_smartidle(struct device *dev)
113
{
114
	struct platform_device *pdev = to_platform_device(dev);
115
	struct omap_device *od = to_omap_device(pdev);
116
	u8 idlemode;
117

118 119 120 121 122 123
	if (od->hwmods[0]->class->sysc->idlemodes & SIDLE_SMART_WKUP)
		idlemode = HWMOD_IDLEMODE_SMART_WKUP;
	else
		idlemode = HWMOD_IDLEMODE_SMART;

	omap_hwmod_set_slave_idlemode(od->hwmods[0], idlemode);
124 125
}

126
#else
127
static void omap_uart_enable_wakeup(struct device *dev, bool enable)
128
{}
129 130
static void omap_uart_set_noidle(struct device *dev) {}
static void omap_uart_set_smartidle(struct device *dev) {}
131 132
#endif /* CONFIG_PM */

133
#ifdef CONFIG_OMAP_MUX
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157

#define OMAP_UART_DEFAULT_PAD_NAME_LEN	28
static char rx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN],
		tx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN] __initdata;

static void  __init
omap_serial_fill_uart_tx_rx_pads(struct omap_board_data *bdata,
				struct omap_uart_state *uart)
{
	uart->default_omap_uart_pads[0].name = rx_pad_name;
	uart->default_omap_uart_pads[0].flags = OMAP_DEVICE_PAD_REMUX |
							OMAP_DEVICE_PAD_WAKEUP;
	uart->default_omap_uart_pads[0].enable = OMAP_PIN_INPUT |
							OMAP_MUX_MODE0;
	uart->default_omap_uart_pads[0].idle = OMAP_PIN_INPUT | OMAP_MUX_MODE0;
	uart->default_omap_uart_pads[1].name = tx_pad_name;
	uart->default_omap_uart_pads[1].enable = OMAP_PIN_OUTPUT |
							OMAP_MUX_MODE0;
	bdata->pads = uart->default_omap_uart_pads;
	bdata->pads_cnt = ARRAY_SIZE(uart->default_omap_uart_pads);
}

static void  __init omap_serial_check_wakeup(struct omap_board_data *bdata,
						struct omap_uart_state *uart)
158
{
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
	struct omap_mux_partition *tx_partition = NULL, *rx_partition = NULL;
	struct omap_mux *rx_mux = NULL, *tx_mux = NULL;
	char *rx_fmt, *tx_fmt;
	int uart_nr = bdata->id + 1;

	if (bdata->id != 2) {
		rx_fmt = "uart%d_rx.uart%d_rx";
		tx_fmt = "uart%d_tx.uart%d_tx";
	} else {
		rx_fmt = "uart%d_rx_irrx.uart%d_rx_irrx";
		tx_fmt = "uart%d_tx_irtx.uart%d_tx_irtx";
	}

	snprintf(rx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN, rx_fmt,
			uart_nr, uart_nr);
	snprintf(tx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN, tx_fmt,
			uart_nr, uart_nr);

	if (omap_mux_get_by_name(rx_pad_name, &rx_partition, &rx_mux) >= 0 &&
			omap_mux_get_by_name
				(tx_pad_name, &tx_partition, &tx_mux) >= 0) {
		u16 tx_mode, rx_mode;

		tx_mode = omap_mux_read(tx_partition, tx_mux->reg_offset);
		rx_mode = omap_mux_read(rx_partition, rx_mux->reg_offset);

		/*
		 * Check if uart is used in default tx/rx mode i.e. in mux mode0
		 * if yes then configure rx pin for wake up capability
		 */
		if (OMAP_MODE_UART(rx_mode) && OMAP_MODE_UART(tx_mode))
			omap_serial_fill_uart_tx_rx_pads(bdata, uart);
	}
192 193
}
#else
194 195 196 197
static void __init omap_serial_check_wakeup(struct omap_board_data *bdata,
		struct omap_uart_state *uart)
{
}
198 199
#endif

200
static char *cmdline_find_option(char *str)
201 202 203 204 205 206
{
	extern char *saved_command_line;

	return strstr(saved_command_line, str);
}

207
static int __init omap_serial_early_init(void)
208
{
209 210 211 212
	do {
		char oh_name[MAX_UART_HWMOD_NAME_LEN];
		struct omap_hwmod *oh;
		struct omap_uart_state *uart;
213
		char uart_name[MAX_UART_HWMOD_NAME_LEN];
214

215
		snprintf(oh_name, MAX_UART_HWMOD_NAME_LEN,
216
			 "uart%d", num_uarts + 1);
217 218 219 220 221 222
		oh = omap_hwmod_lookup(oh_name);
		if (!oh)
			break;

		uart = kzalloc(sizeof(struct omap_uart_state), GFP_KERNEL);
		if (WARN_ON(!uart))
223
			return -ENODEV;
224

225
		uart->oh = oh;
226
		uart->num = num_uarts++;
227
		list_add_tail(&uart->node, &uart_list);
228 229 230 231 232
		snprintf(uart_name, MAX_UART_HWMOD_NAME_LEN,
				"%s%d", OMAP_SERIAL_NAME, uart->num);

		if (cmdline_find_option(uart_name)) {
			console_uart_id = uart->num;
233

234 235
			if (console_loglevel >= 10) {
				uart_debug = true;
P
Paul Walmsley 已提交
236 237
				pr_info("%s used as console in debug mode: uart%d clocks will not be gated",
					uart_name, uart->num);
238 239
			}

240 241 242
			if (cmdline_find_option("no_console_suspend"))
				no_console_suspend = true;

243 244 245 246 247 248 249 250 251 252 253
			/*
			 * omap-uart can be used for earlyprintk logs
			 * So if omap-uart is used as console then prevent
			 * uart reset and idle to get logs from omap-uart
			 * until uart console driver is available to take
			 * care for console messages.
			 * Idling or resetting omap-uart while printing logs
			 * early boot logs can stall the boot-up.
			 */
			oh->flags |= HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET;
		}
254
	} while (1);
255 256

	return 0;
257
}
258
core_initcall(omap_serial_early_init);
259

260 261
/**
 * omap_serial_init_port() - initialize single serial port
262
 * @bdata: port specific board data pointer
263
 * @info: platform specific data pointer
264
 *
265
 * This function initialies serial driver for given port only.
266 267 268 269 270 271
 * Platforms can call this function instead of omap_serial_init()
 * if they don't plan to use all available UARTs as serial ports.
 *
 * Don't mix calls to omap_serial_init_port() and omap_serial_init(),
 * use only one of the two.
 */
272 273
void __init omap_serial_init_port(struct omap_board_data *bdata,
			struct omap_uart_port_info *info)
274
{
275
	struct omap_uart_state *uart;
276
	struct omap_hwmod *oh;
277
	struct platform_device *pdev;
278 279 280 281
	void *pdata = NULL;
	u32 pdata_size = 0;
	char *name;
	struct omap_uart_port_info omap_up;
282

283
	if (WARN_ON(!bdata))
284
		return;
285 286 287
	if (WARN_ON(bdata->id < 0))
		return;
	if (WARN_ON(bdata->id >= num_uarts))
288
		return;
289

290
	list_for_each_entry(uart, &uart_list, node)
291
		if (bdata->id == uart->num)
292
			break;
293 294
	if (!info)
		info = omap_serial_default_info;
295

296 297 298
	oh = uart->oh;
	name = DRIVER_NAME;

299
	omap_up.dma_enabled = info->dma_enabled;
300
	omap_up.uartclk = OMAP24XX_BASE_BAUD * 16;
301
	omap_up.flags = UPF_BOOT_AUTOCONF;
302
	omap_up.get_context_loss_count = omap_pm_get_dev_context_loss_count;
303
	omap_up.set_forceidle = omap_uart_set_smartidle;
304
	omap_up.set_noidle = omap_uart_set_noidle;
305
	omap_up.enable_wakeup = omap_uart_enable_wakeup;
306 307
	omap_up.dma_rx_buf_size = info->dma_rx_buf_size;
	omap_up.dma_rx_timeout = info->dma_rx_timeout;
308
	omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate;
309
	omap_up.autosuspend_timeout = info->autosuspend_timeout;
310 311 312
	omap_up.DTR_gpio = info->DTR_gpio;
	omap_up.DTR_inverted = info->DTR_inverted;
	omap_up.DTR_present = info->DTR_present;
313

314 315 316 317 318 319
	pdata = &omap_up;
	pdata_size = sizeof(struct omap_uart_port_info);

	if (WARN_ON(!oh))
		return;

320
	pdev = omap_device_build(name, uart->num, oh, pdata, pdata_size,
321
				 NULL, 0, false);
322 323 324 325 326
	if (IS_ERR(pdev)) {
		WARN(1, "Could not build omap_device for %s: %s.\n", name,
		     oh->name);
		return;
	}
327

328 329 330
	if ((console_uart_id == bdata->id) && no_console_suspend)
		omap_device_disable_idle_on_suspend(pdev);

331 332
	oh->mux = omap_hwmod_mux_init(bdata->pads, bdata->pads_cnt);

333 334
	oh->dev_attr = uart;

335 336
	if (((cpu_is_omap34xx() || cpu_is_omap44xx()) && bdata->pads)
			&& !uart_debug)
337
		device_init_wakeup(&pdev->dev, true);
338 339 340
}

/**
341 342
 * omap_serial_board_init() - initialize all supported serial ports
 * @info: platform specific data pointer
343 344 345 346 347
 *
 * 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).
 */
348
void __init omap_serial_board_init(struct omap_uart_port_info *info)
349
{
350
	struct omap_uart_state *uart;
351
	struct omap_board_data bdata;
352

353 354 355 356 357
	list_for_each_entry(uart, &uart_list, node) {
		bdata.id = uart->num;
		bdata.flags = 0;
		bdata.pads = NULL;
		bdata.pads_cnt = 0;
358

359
		omap_serial_check_wakeup(&bdata, uart);
360

361 362 363 364
		if (!info)
			omap_serial_init_port(&bdata, NULL);
		else
			omap_serial_init_port(&bdata, &info[uart->num]);
365
	}
366
}
367 368 369 370 371 372 373 374 375 376 377 378

/**
 * 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);
}