serial.c 11.3 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
#include <plat/board.h>
33 34 35
#include <plat/dma.h>
#include <plat/omap_hwmod.h>
#include <plat/omap_device.h>
36
#include <plat/omap-pm.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 61 62
};

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

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) */
71 72 73 74 75

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

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

87 88
	if (!od)
		return;
89

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

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

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

108
static void omap_uart_set_smartidle(struct platform_device *pdev)
109 110 111
{
	struct omap_device *od = to_omap_device(pdev);

112
	omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_SMART);
113 114
}

115
#else
116 117
static void omap_uart_enable_wakeup(struct platform_device *pdev, bool enable)
{}
118
static void omap_uart_set_noidle(struct platform_device *pdev) {}
119
static void omap_uart_set_smartidle(struct platform_device *pdev) {}
120 121
#endif /* CONFIG_PM */

122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 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 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
#ifdef CONFIG_OMAP_MUX
static struct omap_device_pad default_uart1_pads[] __initdata = {
	{
		.name	= "uart1_cts.uart1_cts",
		.enable	= OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
	},
	{
		.name	= "uart1_rts.uart1_rts",
		.enable	= OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
	},
	{
		.name	= "uart1_tx.uart1_tx",
		.enable	= OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
	},
	{
		.name	= "uart1_rx.uart1_rx",
		.flags	= OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP,
		.enable	= OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
		.idle	= OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
	},
};

static struct omap_device_pad default_uart2_pads[] __initdata = {
	{
		.name	= "uart2_cts.uart2_cts",
		.enable	= OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
	},
	{
		.name	= "uart2_rts.uart2_rts",
		.enable	= OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
	},
	{
		.name	= "uart2_tx.uart2_tx",
		.enable	= OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
	},
	{
		.name	= "uart2_rx.uart2_rx",
		.flags	= OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP,
		.enable	= OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
		.idle	= OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
	},
};

static struct omap_device_pad default_uart3_pads[] __initdata = {
	{
		.name	= "uart3_cts_rctx.uart3_cts_rctx",
		.enable	= OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
	},
	{
		.name	= "uart3_rts_sd.uart3_rts_sd",
		.enable	= OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
	},
	{
		.name	= "uart3_tx_irtx.uart3_tx_irtx",
		.enable	= OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
	},
	{
		.name	= "uart3_rx_irrx.uart3_rx_irrx",
		.flags	= OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP,
		.enable	= OMAP_PIN_INPUT | OMAP_MUX_MODE0,
		.idle	= OMAP_PIN_INPUT | OMAP_MUX_MODE0,
	},
};

static struct omap_device_pad default_omap36xx_uart4_pads[] __initdata = {
	{
		.name   = "gpmc_wait2.uart4_tx",
		.enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
	},
	{
		.name	= "gpmc_wait3.uart4_rx",
		.flags	= OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP,
		.enable	= OMAP_PIN_INPUT | OMAP_MUX_MODE2,
		.idle	= OMAP_PIN_INPUT | OMAP_MUX_MODE2,
	},
};

static struct omap_device_pad default_omap4_uart4_pads[] __initdata = {
	{
		.name	= "uart4_tx.uart4_tx",
		.enable	= OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
	},
	{
		.name	= "uart4_rx.uart4_rx",
		.flags	= OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP,
		.enable	= OMAP_PIN_INPUT | OMAP_MUX_MODE0,
		.idle	= OMAP_PIN_INPUT | OMAP_MUX_MODE0,
	},
};

static void omap_serial_fill_default_pads(struct omap_board_data *bdata)
{
	switch (bdata->id) {
	case 0:
		bdata->pads = default_uart1_pads;
		bdata->pads_cnt = ARRAY_SIZE(default_uart1_pads);
		break;
	case 1:
		bdata->pads = default_uart2_pads;
		bdata->pads_cnt = ARRAY_SIZE(default_uart2_pads);
		break;
	case 2:
		bdata->pads = default_uart3_pads;
		bdata->pads_cnt = ARRAY_SIZE(default_uart3_pads);
		break;
	case 3:
		if (cpu_is_omap44xx()) {
			bdata->pads = default_omap4_uart4_pads;
			bdata->pads_cnt =
				ARRAY_SIZE(default_omap4_uart4_pads);
		} else if (cpu_is_omap3630()) {
			bdata->pads = default_omap36xx_uart4_pads;
			bdata->pads_cnt =
				ARRAY_SIZE(default_omap36xx_uart4_pads);
		}
		break;
	default:
		break;
	}
}
#else
static void omap_serial_fill_default_pads(struct omap_board_data *bdata) {}
#endif

246 247 248 249 250 251 252
char *cmdline_find_option(char *str)
{
	extern char *saved_command_line;

	return strstr(saved_command_line, str);
}

253
static int __init omap_serial_early_init(void)
254
{
255 256 257 258
	do {
		char oh_name[MAX_UART_HWMOD_NAME_LEN];
		struct omap_hwmod *oh;
		struct omap_uart_state *uart;
259
		char uart_name[MAX_UART_HWMOD_NAME_LEN];
260

261
		snprintf(oh_name, MAX_UART_HWMOD_NAME_LEN,
262
			 "uart%d", num_uarts + 1);
263 264 265 266 267 268
		oh = omap_hwmod_lookup(oh_name);
		if (!oh)
			break;

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

271
		uart->oh = oh;
272
		uart->num = num_uarts++;
273
		list_add_tail(&uart->node, &uart_list);
274 275 276 277 278
		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;
279

280 281 282 283 284 285 286
			if (console_loglevel >= 10) {
				uart_debug = true;
				pr_info("%s used as console in debug mode"
						" uart%d clocks will not be"
						" gated", uart_name, uart->num);
			}

287 288 289
			if (cmdline_find_option("no_console_suspend"))
				no_console_suspend = true;

290 291 292 293 294 295 296 297 298 299 300
			/*
			 * 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;
		}
301
	} while (1);
302 303

	return 0;
304
}
305
core_initcall(omap_serial_early_init);
306

307 308
/**
 * omap_serial_init_port() - initialize single serial port
309
 * @bdata: port specific board data pointer
310
 * @info: platform specific data pointer
311
 *
312
 * This function initialies serial driver for given port only.
313 314 315 316 317 318
 * 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.
 */
319 320
void __init omap_serial_init_port(struct omap_board_data *bdata,
			struct omap_uart_port_info *info)
321
{
322
	struct omap_uart_state *uart;
323
	struct omap_hwmod *oh;
324
	struct platform_device *pdev;
325 326 327 328
	void *pdata = NULL;
	u32 pdata_size = 0;
	char *name;
	struct omap_uart_port_info omap_up;
329

330
	if (WARN_ON(!bdata))
331
		return;
332 333 334
	if (WARN_ON(bdata->id < 0))
		return;
	if (WARN_ON(bdata->id >= num_uarts))
335
		return;
336

337
	list_for_each_entry(uart, &uart_list, node)
338
		if (bdata->id == uart->num)
339
			break;
340 341
	if (!info)
		info = omap_serial_default_info;
342

343 344 345
	oh = uart->oh;
	name = DRIVER_NAME;

346
	omap_up.dma_enabled = info->dma_enabled;
347
	omap_up.uartclk = OMAP24XX_BASE_BAUD * 16;
348
	omap_up.flags = UPF_BOOT_AUTOCONF;
349
	omap_up.get_context_loss_count = omap_pm_get_dev_context_loss_count;
350
	omap_up.set_forceidle = omap_uart_set_smartidle;
351
	omap_up.set_noidle = omap_uart_set_noidle;
352
	omap_up.enable_wakeup = omap_uart_enable_wakeup;
353 354
	omap_up.dma_rx_buf_size = info->dma_rx_buf_size;
	omap_up.dma_rx_timeout = info->dma_rx_timeout;
355
	omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate;
356
	omap_up.autosuspend_timeout = info->autosuspend_timeout;
357 358 359 360 361 362 363 364

	/* Enable the MDR1 Errata i202 for OMAP2430/3xxx/44xx */
	if (!cpu_is_omap2420() && !cpu_is_ti816x())
		omap_up.errata |= UART_ERRATA_i202_MDR1_ACCESS;

	/* Enable DMA Mode Force Idle Errata i291 for omap34xx/3630 */
	if (cpu_is_omap34xx() || cpu_is_omap3630())
		omap_up.errata |= UART_ERRATA_i291_DMA_FORCEIDLE;
365 366 367 368 369 370 371

	pdata = &omap_up;
	pdata_size = sizeof(struct omap_uart_port_info);

	if (WARN_ON(!oh))
		return;

372
	pdev = omap_device_build(name, uart->num, oh, pdata, pdata_size,
373
				 NULL, 0, false);
374
	WARN(IS_ERR(pdev), "Could not build omap_device for %s: %s.\n",
375 376
	     name, oh->name);

377 378 379
	if ((console_uart_id == bdata->id) && no_console_suspend)
		omap_device_disable_idle_on_suspend(pdev);

380 381
	oh->mux = omap_hwmod_mux_init(bdata->pads, bdata->pads_cnt);

382 383
	oh->dev_attr = uart;

384 385
	if (((cpu_is_omap34xx() || cpu_is_omap44xx()) && bdata->pads)
			&& !uart_debug)
386
		device_init_wakeup(&pdev->dev, true);
387 388 389
}

/**
390 391
 * omap_serial_board_init() - initialize all supported serial ports
 * @info: platform specific data pointer
392 393 394 395 396
 *
 * 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).
 */
397
void __init omap_serial_board_init(struct omap_uart_port_info *info)
398
{
399
	struct omap_uart_state *uart;
400
	struct omap_board_data bdata;
401

402 403 404 405 406
	list_for_each_entry(uart, &uart_list, node) {
		bdata.id = uart->num;
		bdata.flags = 0;
		bdata.pads = NULL;
		bdata.pads_cnt = 0;
407 408 409 410

		if (cpu_is_omap44xx() || cpu_is_omap34xx())
			omap_serial_fill_default_pads(&bdata);

411 412 413 414
		if (!info)
			omap_serial_init_port(&bdata, NULL);
		else
			omap_serial_init_port(&bdata, &info[uart->num]);
415
	}
416
}
417 418 419 420 421 422 423 424 425 426 427 428

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