serial.c 11.1 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 59
struct omap_uart_state {
	int num;
	int can_sleep;

	struct list_head node;
60 61
	struct omap_hwmod *oh;
	struct platform_device *pdev;
62 63 64
};

static LIST_HEAD(uart_list);
65
static u8 num_uarts;
66

67 68 69 70 71 72 73 74 75 76 77 78
#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,
	},
};

79 80 81 82 83 84 85 86 87 88 89 90 91 92
#ifdef CONFIG_PM

int omap_uart_can_sleep(void)
{
	struct omap_uart_state *uart;
	int can_sleep = 1;

	list_for_each_entry(uart, &uart_list, node) {
		if (!uart->clocked)
			continue;

		if (!uart->can_sleep) {
			can_sleep = 0;
			continue;
93
		}
94 95 96

		/* This UART can now safely sleep. */
		omap_uart_allow_sleep(uart);
97
	}
98 99

	return can_sleep;
100 101
}

102
static void omap_uart_enable_wakeup(struct platform_device *pdev, bool enable)
103
{
104
	struct omap_device *od = to_omap_device(pdev);
105

106 107
	if (!od)
		return;
108

109 110 111 112
	if (enable)
		omap_hwmod_enable_wakeup(od->hwmods[0]);
	else
		omap_hwmod_disable_wakeup(od->hwmods[0]);
113 114
}

115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
/*
 * 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);
}

static void omap_uart_set_forceidle(struct platform_device *pdev)
{
	struct omap_device *od = to_omap_device(pdev);

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

134
#else
135 136
static void omap_uart_enable_wakeup(struct platform_device *pdev, bool enable)
{}
137 138
static void omap_uart_set_noidle(struct platform_device *pdev) {}
static void omap_uart_set_forceidle(struct platform_device *pdev) {}
139 140
#endif /* CONFIG_PM */

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 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
#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

265
static int __init omap_serial_early_init(void)
266
{
267
	int i = 0;
268

269 270 271 272
	do {
		char oh_name[MAX_UART_HWMOD_NAME_LEN];
		struct omap_hwmod *oh;
		struct omap_uart_state *uart;
273

274 275 276 277 278 279 280 281
		snprintf(oh_name, MAX_UART_HWMOD_NAME_LEN,
			 "uart%d", i + 1);
		oh = omap_hwmod_lookup(oh_name);
		if (!oh)
			break;

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

284 285 286 287
		uart->oh = oh;
		uart->num = i++;
		list_add_tail(&uart->node, &uart_list);
		num_uarts++;
288

289
		/*
290
		 * NOTE: omap_hwmod_setup*() has not yet been called,
291
		 *       so no hwmod functions will work yet.
292
		 */
293

294 295 296 297 298 299 300
		/*
		 * During UART early init, device need to be probed
		 * to determine SoC specific init before omap_device
		 * is ready.  Therefore, don't allow idle here
		 */
		uart->oh->flags |= HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET;
	} while (1);
301 302

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

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

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

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

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

345
	omap_up.dma_enabled = info->dma_enabled;
346
	omap_up.uartclk = OMAP24XX_BASE_BAUD * 16;
347
	omap_up.flags = UPF_BOOT_AUTOCONF;
348
	omap_up.get_context_loss_count = omap_pm_get_dev_context_loss_count;
349 350
	omap_up.set_forceidle = omap_uart_set_forceidle;
	omap_up.set_noidle = omap_uart_set_noidle;
351
	omap_up.enable_wakeup = omap_uart_enable_wakeup;
352 353 354
	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;
355 356 357 358 359 360 361 362

	/* 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;
363 364 365 366 367 368 369

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

	if (WARN_ON(!oh))
		return;

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

375
	omap_device_disable_idle_on_suspend(pdev);
376 377
	oh->mux = omap_hwmod_mux_init(bdata->pads, bdata->pads_cnt);

378
	uart->pdev = pdev;
379 380 381

	oh->dev_attr = uart;

382
	console_lock(); /* in case the earlycon is on the UART */
383

384 385 386 387 388 389 390 391 392 393
	/*
	 * Because of early UART probing, UART did not get idled
	 * on init.  Now that omap_device is ready, ensure full idle
	 * before doing omap_device_enable().
	 */
	omap_hwmod_idle(uart->oh);

	omap_device_enable(uart->pdev);
	omap_device_idle(uart->pdev);

394
	console_unlock();
395

396
	if ((cpu_is_omap34xx() || cpu_is_omap44xx()) && bdata->pads)
397
		device_init_wakeup(&pdev->dev, true);
398 399 400
}

/**
401 402
 * omap_serial_board_init() - initialize all supported serial ports
 * @info: platform specific data pointer
403 404 405 406 407
 *
 * 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).
 */
408
void __init omap_serial_board_init(struct omap_uart_port_info *info)
409
{
410
	struct omap_uart_state *uart;
411
	struct omap_board_data bdata;
412

413 414 415 416 417
	list_for_each_entry(uart, &uart_list, node) {
		bdata.id = uart->num;
		bdata.flags = 0;
		bdata.pads = NULL;
		bdata.pads_cnt = 0;
418 419 420 421

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

422 423 424 425
		if (!info)
			omap_serial_init_port(&bdata, NULL);
		else
			omap_serial_init_port(&bdata, &info[uart->num]);
426
	}
427
}
428 429 430 431 432 433 434 435 436 437 438 439

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