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 "common.h"
32 33 34
#include <plat/dma.h>
#include <plat/omap_hwmod.h>
#include <plat/omap_device.h>
35
#include <plat/omap-pm.h>
36
#include <plat/serial.h>
37

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

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

53 54
#define MAX_UART_HWMOD_NAME_LEN		16

55 56 57 58
struct omap_uart_state {
	int num;

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

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

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

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

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

89 90
	if (!od)
		return;
91

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

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

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

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

117 118 119 120 121 122
	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);
123 124
}

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

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

#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)
157
{
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
	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);
	}
191 192
}
#else
193 194 195 196
static void __init omap_serial_check_wakeup(struct omap_board_data *bdata,
		struct omap_uart_state *uart)
{
}
197 198
#endif

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

	return strstr(saved_command_line, str);
}

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

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

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

224
		uart->oh = oh;
225
		uart->num = num_uarts++;
226
		list_add_tail(&uart->node, &uart_list);
227 228 229 230 231
		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;
232

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

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

242 243 244 245 246 247 248 249 250 251 252
			/*
			 * 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;
		}
253
	} while (1);
254 255

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

259 260
/**
 * omap_serial_init_port() - initialize single serial port
261
 * @bdata: port specific board data pointer
262
 * @info: platform specific data pointer
263
 *
264
 * This function initialies serial driver for given port only.
265 266 267 268 269 270
 * 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.
 */
271 272
void __init omap_serial_init_port(struct omap_board_data *bdata,
			struct omap_uart_port_info *info)
273
{
274
	struct omap_uart_state *uart;
275
	struct omap_hwmod *oh;
276
	struct platform_device *pdev;
277 278 279 280
	void *pdata = NULL;
	u32 pdata_size = 0;
	char *name;
	struct omap_uart_port_info omap_up;
281

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

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

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

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

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

	if (WARN_ON(!oh))
		return;

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

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

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

332 333
	oh->dev_attr = uart;

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

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

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

358
		omap_serial_check_wakeup(&bdata, uart);
359

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

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