sh-sci.c 48.6 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
/*
 * SuperH on-chip serial module support.  (SCI with no FIFO / with FIFO)
 *
P
Paul Mundt 已提交
4
 *  Copyright (C) 2002 - 2011  Paul Mundt
M
Markus Brunner 已提交
5
 *  Modified to support SH7720 SCIF. Markus Brunner, Mark Jonas (Jul 2007).
L
Linus Torvalds 已提交
6 7 8 9 10 11 12 13
 *
 * based off of the old drivers/char/sh-sci.c by:
 *
 *   Copyright (C) 1999, 2000  Niibe Yutaka
 *   Copyright (C) 2000  Sugioka Toshinobu
 *   Modified to support multiple serial ports. Stuart Menefy (May 2000).
 *   Modified to support SecureEdge. David McCullough (2002)
 *   Modified to support SH7300 SCIF. Takashi Kusuda (Jun 2003).
14
 *   Removed SH7300 support (Jul 2007).
L
Linus Torvalds 已提交
15 16 17 18 19
 *
 * 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.
 */
20 21 22
#if defined(CONFIG_SERIAL_SH_SCI_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
#define SUPPORT_SYSRQ
#endif
L
Linus Torvalds 已提交
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

#undef DEBUG

#include <linux/module.h>
#include <linux/errno.h>
#include <linux/timer.h>
#include <linux/interrupt.h>
#include <linux/tty.h>
#include <linux/tty_flip.h>
#include <linux/serial.h>
#include <linux/major.h>
#include <linux/string.h>
#include <linux/sysrq.h>
#include <linux/ioport.h>
#include <linux/mm.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/console.h>
41
#include <linux/platform_device.h>
42
#include <linux/serial_sci.h>
L
Linus Torvalds 已提交
43
#include <linux/notifier.h>
M
Magnus Damm 已提交
44
#include <linux/pm_runtime.h>
L
Linus Torvalds 已提交
45
#include <linux/cpufreq.h>
46
#include <linux/clk.h>
P
Paul Mundt 已提交
47
#include <linux/ctype.h>
48
#include <linux/err.h>
49 50
#include <linux/dmaengine.h>
#include <linux/scatterlist.h>
51
#include <linux/slab.h>
52 53

#ifdef CONFIG_SUPERH
L
Linus Torvalds 已提交
54 55 56
#include <asm/sh_bios.h>
#endif

57 58 59 60
#ifdef CONFIG_H8300
#include <asm/gpio.h>
#endif

L
Linus Torvalds 已提交
61 62
#include "sh-sci.h"

63 64 65
struct sci_port {
	struct uart_port	port;

66 67
	/* Platform configuration */
	struct plat_sci_port	*cfg;
68 69 70 71 72 73 74 75 76 77

	/* Port enable callback */
	void			(*enable)(struct uart_port *port);

	/* Port disable callback */
	void			(*disable)(struct uart_port *port);

	/* Break timer */
	struct timer_list	break_timer;
	int			break_flag;
78

79 80
	/* Interface clock */
	struct clk		*iclk;
81 82
	/* Function clock */
	struct clk		*fclk;
83

84 85
	struct dma_chan			*chan_tx;
	struct dma_chan			*chan_rx;
P
Paul Mundt 已提交
86

87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
#ifdef CONFIG_SERIAL_SH_SCI_DMA
	struct dma_async_tx_descriptor	*desc_tx;
	struct dma_async_tx_descriptor	*desc_rx[2];
	dma_cookie_t			cookie_tx;
	dma_cookie_t			cookie_rx[2];
	dma_cookie_t			active_rx;
	struct scatterlist		sg_tx;
	unsigned int			sg_len_tx;
	struct scatterlist		sg_rx[2];
	size_t				buf_len_rx;
	struct sh_dmae_slave		param_tx;
	struct sh_dmae_slave		param_rx;
	struct work_struct		work_tx;
	struct work_struct		work_rx;
	struct timer_list		rx_timer;
102
	unsigned int			rx_timeout;
103
#endif
104

105
	struct notifier_block		freq_transition;
106 107
};

L
Linus Torvalds 已提交
108
/* Function prototypes */
109
static void sci_start_tx(struct uart_port *port);
110
static void sci_stop_tx(struct uart_port *port);
111
static void sci_start_rx(struct uart_port *port);
L
Linus Torvalds 已提交
112

113
#define SCI_NPORTS CONFIG_SERIAL_SH_SCI_NR_UARTS
114

115 116
static struct sci_port sci_ports[SCI_NPORTS];
static struct uart_driver sci_uart_driver;
L
Linus Torvalds 已提交
117

118 119 120 121 122 123
static inline struct sci_port *
to_sci_port(struct uart_port *uart)
{
	return container_of(uart, struct sci_port, port);
}

124
#if defined(CONFIG_CONSOLE_POLL) || defined(CONFIG_SERIAL_SH_SCI_CONSOLE)
125 126

#ifdef CONFIG_CONSOLE_POLL
127
static int sci_poll_get_char(struct uart_port *port)
L
Linus Torvalds 已提交
128 129 130 131
{
	unsigned short status;
	int c;

132
	do {
L
Linus Torvalds 已提交
133 134
		status = sci_in(port, SCxSR);
		if (status & SCxSR_ERRORS(port)) {
135
			sci_out(port, SCxSR, SCxSR_ERROR_CLEAR(port));
L
Linus Torvalds 已提交
136 137
			continue;
		}
138 139 140 141 142
		break;
	} while (1);

	if (!(status & SCxSR_RDxF(port)))
		return NO_POLL_CHAR;
143

L
Linus Torvalds 已提交
144
	c = sci_in(port, SCxRDR);
145

146 147
	/* Dummy read */
	sci_in(port, SCxSR);
L
Linus Torvalds 已提交
148 149 150 151
	sci_out(port, SCxSR, SCxSR_RDxF_CLEAR(port));

	return c;
}
152
#endif
L
Linus Torvalds 已提交
153

154
static void sci_poll_put_char(struct uart_port *port, unsigned char c)
L
Linus Torvalds 已提交
155 156 157 158 159 160 161
{
	unsigned short status;

	do {
		status = sci_in(port, SCxSR);
	} while (!(status & SCxSR_TDxE(port)));

162
	sci_out(port, SCxTDR, c);
163
	sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port) & ~SCxSR_TEND(port));
L
Linus Torvalds 已提交
164
}
165
#endif /* CONFIG_CONSOLE_POLL || CONFIG_SERIAL_SH_SCI_CONSOLE */
L
Linus Torvalds 已提交
166

167
#if defined(__H8300H__) || defined(__H8300S__)
168
static void sci_init_pins(struct uart_port *port, unsigned int cflag)
L
Linus Torvalds 已提交
169 170 171 172
{
	int ch = (port->mapbase - SMR0) >> 3;

	/* set DDR regs */
173 174 175 176 177 178 179
	H8300_GPIO_DDR(h8300_sci_pins[ch].port,
		       h8300_sci_pins[ch].rx,
		       H8300_GPIO_INPUT);
	H8300_GPIO_DDR(h8300_sci_pins[ch].port,
		       h8300_sci_pins[ch].tx,
		       H8300_GPIO_OUTPUT);

L
Linus Torvalds 已提交
180 181 182
	/* tx mark output*/
	H8300_SCI_DR(ch) |= h8300_sci_pins[ch].tx;
}
183 184
#elif defined(CONFIG_CPU_SUBTYPE_SH7710) || defined(CONFIG_CPU_SUBTYPE_SH7712)
static inline void sci_init_pins(struct uart_port *port, unsigned int cflag)
185
{
186 187 188 189 190
	if (port->mapbase == 0xA4400000) {
		__raw_writew(__raw_readw(PACR) & 0xffc0, PACR);
		__raw_writew(__raw_readw(PBCR) & 0x0fff, PBCR);
	} else if (port->mapbase == 0xA4410000)
		__raw_writew(__raw_readw(PBCR) & 0xf003, PBCR);
191
}
192
#elif defined(CONFIG_CPU_SUBTYPE_SH7720) || defined(CONFIG_CPU_SUBTYPE_SH7721)
193
static inline void sci_init_pins(struct uart_port *port, unsigned int cflag)
M
Markus Brunner 已提交
194 195 196 197 198 199 200
{
	unsigned short data;

	if (cflag & CRTSCTS) {
		/* enable RTS/CTS */
		if (port->mapbase == 0xa4430000) { /* SCIF0 */
			/* Clear PTCR bit 9-2; enable all scif pins but sck */
201 202
			data = __raw_readw(PORT_PTCR);
			__raw_writew((data & 0xfc03), PORT_PTCR);
M
Markus Brunner 已提交
203 204
		} else if (port->mapbase == 0xa4438000) { /* SCIF1 */
			/* Clear PVCR bit 9-2 */
205 206
			data = __raw_readw(PORT_PVCR);
			__raw_writew((data & 0xfc03), PORT_PVCR);
M
Markus Brunner 已提交
207 208 209 210
		}
	} else {
		if (port->mapbase == 0xa4430000) { /* SCIF0 */
			/* Clear PTCR bit 5-2; enable only tx and rx  */
211 212
			data = __raw_readw(PORT_PTCR);
			__raw_writew((data & 0xffc3), PORT_PTCR);
M
Markus Brunner 已提交
213 214
		} else if (port->mapbase == 0xa4438000) { /* SCIF1 */
			/* Clear PVCR bit 5-2 */
215 216
			data = __raw_readw(PORT_PVCR);
			__raw_writew((data & 0xffc3), PORT_PVCR);
M
Markus Brunner 已提交
217 218 219
		}
	}
}
220
#elif defined(CONFIG_CPU_SH3)
221
/* For SH7705, SH7706, SH7707, SH7709, SH7709A, SH7729 */
222
static inline void sci_init_pins(struct uart_port *port, unsigned int cflag)
L
Linus Torvalds 已提交
223
{
224 225 226
	unsigned short data;

	/* We need to set SCPCR to enable RTS/CTS */
227
	data = __raw_readw(SCPCR);
228
	/* Clear out SCP7MD1,0, SCP6MD1,0, SCP4MD1,0*/
229
	__raw_writew(data & 0x0fcf, SCPCR);
L
Linus Torvalds 已提交
230

231
	if (!(cflag & CRTSCTS)) {
L
Linus Torvalds 已提交
232
		/* We need to set SCPCR to enable RTS/CTS */
233
		data = __raw_readw(SCPCR);
L
Linus Torvalds 已提交
234 235
		/* Clear out SCP7MD1,0, SCP4MD1,0,
		   Set SCP6MD1,0 = {01} (output)  */
236
		__raw_writew((data & 0x0fcf) | 0x1000, SCPCR);
L
Linus Torvalds 已提交
237

238
		data = __raw_readb(SCPDR);
L
Linus Torvalds 已提交
239
		/* Set /RTS2 (bit6) = 0 */
240
		__raw_writeb(data & 0xbf, SCPDR);
L
Linus Torvalds 已提交
241 242
	}
}
P
Paul Mundt 已提交
243
#elif defined(CONFIG_CPU_SUBTYPE_SH7722)
244
static inline void sci_init_pins(struct uart_port *port, unsigned int cflag)
P
Paul Mundt 已提交
245
{
M
Magnus Damm 已提交
246
	unsigned short data;
P
Paul Mundt 已提交
247

M
Magnus Damm 已提交
248
	if (port->mapbase == 0xffe00000) {
249
		data = __raw_readw(PSCR);
M
Magnus Damm 已提交
250
		data &= ~0x03cf;
251
		if (!(cflag & CRTSCTS))
M
Magnus Damm 已提交
252
			data |= 0x0340;
P
Paul Mundt 已提交
253

254
		__raw_writew(data, PSCR);
P
Paul Mundt 已提交
255
	}
256
}
257 258
#elif defined(CONFIG_CPU_SUBTYPE_SH7757) || \
      defined(CONFIG_CPU_SUBTYPE_SH7763) || \
259
      defined(CONFIG_CPU_SUBTYPE_SH7780) || \
260
      defined(CONFIG_CPU_SUBTYPE_SH7785) || \
261
      defined(CONFIG_CPU_SUBTYPE_SH7786) || \
262
      defined(CONFIG_CPU_SUBTYPE_SHX3)
263 264 265 266 267
static inline void sci_init_pins(struct uart_port *port, unsigned int cflag)
{
	if (!(cflag & CRTSCTS))
		__raw_writew(0x0080, SCSPTR0); /* Set RTS = 1 */
}
268
#elif defined(CONFIG_CPU_SH4) && !defined(CONFIG_CPU_SH4A)
269 270 271 272 273
static inline void sci_init_pins(struct uart_port *port, unsigned int cflag)
{
	if (!(cflag & CRTSCTS))
		__raw_writew(0x0080, SCSPTR2); /* Set RTS = 1 */
}
274
#else
275 276 277
static inline void sci_init_pins(struct uart_port *port, unsigned int cflag)
{
	/* Nothing to do */
L
Linus Torvalds 已提交
278
}
279 280
#endif

281 282
#if defined(CONFIG_CPU_SUBTYPE_SH7760) || \
    defined(CONFIG_CPU_SUBTYPE_SH7780) || \
283 284
    defined(CONFIG_CPU_SUBTYPE_SH7785) || \
    defined(CONFIG_CPU_SUBTYPE_SH7786)
285
static int scif_txfill(struct uart_port *port)
286
{
287
	return sci_in(port, SCTFDR) & 0xff;
288 289
}

290
static int scif_txroom(struct uart_port *port)
291
{
292
	return SCIF_TXROOM_MAX - scif_txfill(port);
293 294
}

295
static int scif_rxfill(struct uart_port *port)
296
{
297
	return sci_in(port, SCRFDR) & 0xff;
298
}
299
#elif defined(CONFIG_CPU_SUBTYPE_SH7763)
300
static int scif_txfill(struct uart_port *port)
301
{
302 303
	if (port->mapbase == 0xffe00000 ||
	    port->mapbase == 0xffe08000)
304
		/* SCIF0/1*/
305 306
		return sci_in(port, SCTFDR) & 0xff;
	else
307
		/* SCIF2 */
308
		return sci_in(port, SCFDR) >> 8;
309 310
}

311 312 313 314 315 316 317 318 319
static int scif_txroom(struct uart_port *port)
{
	if (port->mapbase == 0xffe00000 ||
	    port->mapbase == 0xffe08000)
		/* SCIF0/1*/
		return SCIF_TXROOM_MAX - scif_txfill(port);
	else
		/* SCIF2 */
		return SCIF2_TXROOM_MAX - scif_txfill(port);
320 321
}

322
static int scif_rxfill(struct uart_port *port)
323
{
324 325 326
	if ((port->mapbase == 0xffe00000) ||
	    (port->mapbase == 0xffe08000)) {
		/* SCIF0/1*/
327
		return sci_in(port, SCRFDR) & 0xff;
328 329
	} else {
		/* SCIF2 */
330
		return sci_in(port, SCFDR) & SCIF2_RFDC_MASK;
331
	}
332
}
333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
#elif defined(CONFIG_ARCH_SH7372)
static int scif_txfill(struct uart_port *port)
{
	if (port->type == PORT_SCIFA)
		return sci_in(port, SCFDR) >> 8;
	else
		return sci_in(port, SCTFDR);
}

static int scif_txroom(struct uart_port *port)
{
	return port->fifosize - scif_txfill(port);
}

static int scif_rxfill(struct uart_port *port)
{
	if (port->type == PORT_SCIFA)
		return sci_in(port, SCFDR) & SCIF_RFDC_MASK;
	else
		return sci_in(port, SCRFDR);
}
354
#else
355
static int scif_txfill(struct uart_port *port)
356
{
357
	return sci_in(port, SCFDR) >> 8;
358
}
L
Linus Torvalds 已提交
359

360
static int scif_txroom(struct uart_port *port)
361
{
362
	return SCIF_TXROOM_MAX - scif_txfill(port);
363
}
L
Linus Torvalds 已提交
364

365
static int scif_rxfill(struct uart_port *port)
366 367 368
{
	return sci_in(port, SCFDR) & SCIF_RFDC_MASK;
}
L
Linus Torvalds 已提交
369 370
#endif

371
static int sci_txfill(struct uart_port *port)
372
{
373
	return !(sci_in(port, SCxSR) & SCI_TDRE);
374 375
}

376 377 378 379 380 381
static int sci_txroom(struct uart_port *port)
{
	return !sci_txfill(port);
}

static int sci_rxfill(struct uart_port *port)
382
{
383
	return (sci_in(port, SCxSR) & SCxSR_RDxF(port)) != 0;
384 385
}

L
Linus Torvalds 已提交
386 387 388 389 390 391
/* ********************************************************************** *
 *                   the interrupt related routines                       *
 * ********************************************************************** */

static void sci_transmit_chars(struct uart_port *port)
{
A
Alan Cox 已提交
392
	struct circ_buf *xmit = &port->state->xmit;
L
Linus Torvalds 已提交
393 394 395
	unsigned int stopped = uart_tx_stopped(port);
	unsigned short status;
	unsigned short ctrl;
396
	int count;
L
Linus Torvalds 已提交
397 398 399 400

	status = sci_in(port, SCxSR);
	if (!(status & SCxSR_TDxE(port))) {
		ctrl = sci_in(port, SCSCR);
401
		if (uart_circ_empty(xmit))
402
			ctrl &= ~SCSCR_TIE;
403
		else
404
			ctrl |= SCSCR_TIE;
L
Linus Torvalds 已提交
405 406 407 408
		sci_out(port, SCSCR, ctrl);
		return;
	}

409
	if (port->type == PORT_SCI)
410
		count = sci_txroom(port);
411 412
	else
		count = scif_txroom(port);
L
Linus Torvalds 已提交
413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436

	do {
		unsigned char c;

		if (port->x_char) {
			c = port->x_char;
			port->x_char = 0;
		} else if (!uart_circ_empty(xmit) && !stopped) {
			c = xmit->buf[xmit->tail];
			xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
		} else {
			break;
		}

		sci_out(port, SCxTDR, c);

		port->icount.tx++;
	} while (--count > 0);

	sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port));

	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
		uart_write_wakeup(port);
	if (uart_circ_empty(xmit)) {
437
		sci_stop_tx(port);
L
Linus Torvalds 已提交
438 439 440
	} else {
		ctrl = sci_in(port, SCSCR);

441
		if (port->type != PORT_SCI) {
L
Linus Torvalds 已提交
442 443 444 445
			sci_in(port, SCxSR); /* Dummy read */
			sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port));
		}

446
		ctrl |= SCSCR_TIE;
L
Linus Torvalds 已提交
447 448 449 450 451
		sci_out(port, SCSCR, ctrl);
	}
}

/* On SH3, SCIF may read end-of-break as a space->mark char */
452
#define STEPFN(c)  ({int __c = (c); (((__c-1)|(__c)) == -1); })
L
Linus Torvalds 已提交
453

454
static void sci_receive_chars(struct uart_port *port)
L
Linus Torvalds 已提交
455
{
456
	struct sci_port *sci_port = to_sci_port(port);
A
Alan Cox 已提交
457
	struct tty_struct *tty = port->state->port.tty;
L
Linus Torvalds 已提交
458 459
	int i, count, copied = 0;
	unsigned short status;
A
Alan Cox 已提交
460
	unsigned char flag;
L
Linus Torvalds 已提交
461 462 463 464 465 466

	status = sci_in(port, SCxSR);
	if (!(status & SCxSR_RDxF(port)))
		return;

	while (1) {
467
		if (port->type == PORT_SCI)
468
			count = sci_rxfill(port);
469
		else
470
			count = scif_rxfill(port);
L
Linus Torvalds 已提交
471 472

		/* Don't copy more bytes than there is room for in the buffer */
A
Alan Cox 已提交
473
		count = tty_buffer_request_room(tty, count);
L
Linus Torvalds 已提交
474 475 476 477 478 479 480

		/* If for any reason we can't copy more data, we're done! */
		if (count == 0)
			break;

		if (port->type == PORT_SCI) {
			char c = sci_in(port, SCxRDR);
481 482
			if (uart_handle_sysrq_char(port, c) ||
			    sci_port->break_flag)
L
Linus Torvalds 已提交
483
				count = 0;
484
			else
485
				tty_insert_flip_char(tty, c, TTY_NORMAL);
L
Linus Torvalds 已提交
486
		} else {
487
			for (i = 0; i < count; i++) {
L
Linus Torvalds 已提交
488 489 490 491
				char c = sci_in(port, SCxRDR);
				status = sci_in(port, SCxSR);
#if defined(CONFIG_CPU_SH3)
				/* Skip "chars" during break */
492
				if (sci_port->break_flag) {
L
Linus Torvalds 已提交
493 494 495 496 497
					if ((c == 0) &&
					    (status & SCxSR_FER(port))) {
						count--; i--;
						continue;
					}
498

L
Linus Torvalds 已提交
499
					/* Nonzero => end-of-break */
500
					dev_dbg(port->dev, "debounce<%02x>\n", c);
501 502
					sci_port->break_flag = 0;

L
Linus Torvalds 已提交
503 504 505 506 507 508
					if (STEPFN(c)) {
						count--; i--;
						continue;
					}
				}
#endif /* CONFIG_CPU_SH3 */
509
				if (uart_handle_sysrq_char(port, c)) {
L
Linus Torvalds 已提交
510 511 512 513 514
					count--; i--;
					continue;
				}

				/* Store data and status */
515
				if (status & SCxSR_FER(port)) {
A
Alan Cox 已提交
516
					flag = TTY_FRAME;
517
					dev_notice(port->dev, "frame error\n");
518
				} else if (status & SCxSR_PER(port)) {
A
Alan Cox 已提交
519
					flag = TTY_PARITY;
520
					dev_notice(port->dev, "parity error\n");
A
Alan Cox 已提交
521 522
				} else
					flag = TTY_NORMAL;
523

A
Alan Cox 已提交
524
				tty_insert_flip_char(tty, c, flag);
L
Linus Torvalds 已提交
525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544
			}
		}

		sci_in(port, SCxSR); /* dummy read */
		sci_out(port, SCxSR, SCxSR_RDxF_CLEAR(port));

		copied += count;
		port->icount.rx += count;
	}

	if (copied) {
		/* Tell the rest of the system the news. New characters! */
		tty_flip_buffer_push(tty);
	} else {
		sci_in(port, SCxSR); /* dummy read */
		sci_out(port, SCxSR, SCxSR_RDxF_CLEAR(port));
	}
}

#define SCI_BREAK_JIFFIES (HZ/20)
545 546 547

/*
 * The sci generates interrupts during the break,
L
Linus Torvalds 已提交
548 549 550 551 552 553
 * 1 per millisecond or so during the break period, for 9600 baud.
 * So dont bother disabling interrupts.
 * But dont want more than 1 break event.
 * Use a kernel timer to periodically poll the rx line until
 * the break is finished.
 */
554
static inline void sci_schedule_break_timer(struct sci_port *port)
L
Linus Torvalds 已提交
555
{
556
	mod_timer(&port->break_timer, jiffies + SCI_BREAK_JIFFIES);
L
Linus Torvalds 已提交
557
}
558

L
Linus Torvalds 已提交
559 560 561
/* Ensure that two consecutive samples find the break over. */
static void sci_break_timer(unsigned long data)
{
562 563
	struct sci_port *port = (struct sci_port *)data;

M
Magnus Damm 已提交
564 565 566
	if (port->enable)
		port->enable(&port->port);

567
	if (sci_rxd_in(&port->port) == 0) {
L
Linus Torvalds 已提交
568
		port->break_flag = 1;
569 570
		sci_schedule_break_timer(port);
	} else if (port->break_flag == 1) {
L
Linus Torvalds 已提交
571 572
		/* break is over. */
		port->break_flag = 2;
573 574 575
		sci_schedule_break_timer(port);
	} else
		port->break_flag = 0;
M
Magnus Damm 已提交
576 577 578

	if (port->disable)
		port->disable(&port->port);
L
Linus Torvalds 已提交
579 580
}

581
static int sci_handle_errors(struct uart_port *port)
L
Linus Torvalds 已提交
582 583 584
{
	int copied = 0;
	unsigned short status = sci_in(port, SCxSR);
A
Alan Cox 已提交
585
	struct tty_struct *tty = port->state->port.tty;
L
Linus Torvalds 已提交
586

587
	if (status & SCxSR_ORER(port)) {
L
Linus Torvalds 已提交
588
		/* overrun error */
589
		if (tty_insert_flip_char(tty, 0, TTY_OVERRUN))
A
Alan Cox 已提交
590
			copied++;
591 592

		dev_notice(port->dev, "overrun error");
L
Linus Torvalds 已提交
593 594
	}

595
	if (status & SCxSR_FER(port)) {
L
Linus Torvalds 已提交
596 597
		if (sci_rxd_in(port) == 0) {
			/* Notify of BREAK */
598
			struct sci_port *sci_port = to_sci_port(port);
599 600 601 602 603

			if (!sci_port->break_flag) {
				sci_port->break_flag = 1;
				sci_schedule_break_timer(sci_port);

L
Linus Torvalds 已提交
604
				/* Do sysrq handling. */
605
				if (uart_handle_break(port))
L
Linus Torvalds 已提交
606
					return 0;
607 608 609

				dev_dbg(port->dev, "BREAK detected\n");

610
				if (tty_insert_flip_char(tty, 0, TTY_BREAK))
611 612 613
					copied++;
			}

614
		} else {
L
Linus Torvalds 已提交
615
			/* frame error */
616
			if (tty_insert_flip_char(tty, 0, TTY_FRAME))
A
Alan Cox 已提交
617
				copied++;
618 619

			dev_notice(port->dev, "frame error\n");
L
Linus Torvalds 已提交
620 621 622
		}
	}

623
	if (status & SCxSR_PER(port)) {
L
Linus Torvalds 已提交
624
		/* parity error */
625 626
		if (tty_insert_flip_char(tty, 0, TTY_PARITY))
			copied++;
627 628

		dev_notice(port->dev, "parity error");
L
Linus Torvalds 已提交
629 630
	}

A
Alan Cox 已提交
631
	if (copied)
L
Linus Torvalds 已提交
632 633 634 635 636
		tty_flip_buffer_push(tty);

	return copied;
}

637
static int sci_handle_fifo_overrun(struct uart_port *port)
638
{
A
Alan Cox 已提交
639
	struct tty_struct *tty = port->state->port.tty;
640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657
	int copied = 0;

	if (port->type != PORT_SCIF)
		return 0;

	if ((sci_in(port, SCLSR) & SCIF_ORER) != 0) {
		sci_out(port, SCLSR, 0);

		tty_insert_flip_char(tty, 0, TTY_OVERRUN);
		tty_flip_buffer_push(tty);

		dev_notice(port->dev, "overrun error\n");
		copied++;
	}

	return copied;
}

658
static int sci_handle_breaks(struct uart_port *port)
L
Linus Torvalds 已提交
659 660 661
{
	int copied = 0;
	unsigned short status = sci_in(port, SCxSR);
A
Alan Cox 已提交
662
	struct tty_struct *tty = port->state->port.tty;
663
	struct sci_port *s = to_sci_port(port);
L
Linus Torvalds 已提交
664

665 666 667
	if (uart_handle_break(port))
		return 0;

668
	if (!s->break_flag && status & SCxSR_BRK(port)) {
L
Linus Torvalds 已提交
669 670 671 672 673
#if defined(CONFIG_CPU_SH3)
		/* Debounce break */
		s->break_flag = 1;
#endif
		/* Notify of BREAK */
674
		if (tty_insert_flip_char(tty, 0, TTY_BREAK))
A
Alan Cox 已提交
675
			copied++;
676 677

		dev_dbg(port->dev, "BREAK detected\n");
L
Linus Torvalds 已提交
678 679
	}

A
Alan Cox 已提交
680
	if (copied)
L
Linus Torvalds 已提交
681
		tty_flip_buffer_push(tty);
682

683 684
	copied += sci_handle_fifo_overrun(port);

L
Linus Torvalds 已提交
685 686 687
	return copied;
}

688
static irqreturn_t sci_rx_interrupt(int irq, void *ptr)
L
Linus Torvalds 已提交
689
{
690 691 692 693 694 695 696 697 698
#ifdef CONFIG_SERIAL_SH_SCI_DMA
	struct uart_port *port = ptr;
	struct sci_port *s = to_sci_port(port);

	if (s->chan_rx) {
		u16 scr = sci_in(port, SCSCR);
		u16 ssr = sci_in(port, SCxSR);

		/* Disable future Rx interrupts */
699
		if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
700 701 702
			disable_irq_nosync(irq);
			scr |= 0x4000;
		} else {
P
Paul Mundt 已提交
703
			scr &= ~SCSCR_RIE;
704 705
		}
		sci_out(port, SCSCR, scr);
706 707
		/* Clear current interrupt */
		sci_out(port, SCxSR, ssr & ~(1 | SCxSR_RDxF(port)));
708 709 710
		dev_dbg(port->dev, "Rx IRQ %lu: setup t-out in %u jiffies\n",
			jiffies, s->rx_timeout);
		mod_timer(&s->rx_timer, jiffies + s->rx_timeout);
711 712 713 714 715

		return IRQ_HANDLED;
	}
#endif

L
Linus Torvalds 已提交
716 717 718 719
	/* I think sci_receive_chars has to be called irrespective
	 * of whether the I_IXOFF is set, otherwise, how is the interrupt
	 * to be disabled?
	 */
720
	sci_receive_chars(ptr);
L
Linus Torvalds 已提交
721 722 723 724

	return IRQ_HANDLED;
}

725
static irqreturn_t sci_tx_interrupt(int irq, void *ptr)
L
Linus Torvalds 已提交
726 727
{
	struct uart_port *port = ptr;
728
	unsigned long flags;
L
Linus Torvalds 已提交
729

730
	spin_lock_irqsave(&port->lock, flags);
L
Linus Torvalds 已提交
731
	sci_transmit_chars(port);
732
	spin_unlock_irqrestore(&port->lock, flags);
L
Linus Torvalds 已提交
733 734 735 736

	return IRQ_HANDLED;
}

737
static irqreturn_t sci_er_interrupt(int irq, void *ptr)
L
Linus Torvalds 已提交
738 739 740 741 742 743 744 745 746 747 748
{
	struct uart_port *port = ptr;

	/* Handle errors */
	if (port->type == PORT_SCI) {
		if (sci_handle_errors(port)) {
			/* discard character in rx buffer */
			sci_in(port, SCxSR);
			sci_out(port, SCxSR, SCxSR_RDxF_CLEAR(port));
		}
	} else {
749
		sci_handle_fifo_overrun(port);
750
		sci_rx_interrupt(irq, ptr);
L
Linus Torvalds 已提交
751 752 753 754 755
	}

	sci_out(port, SCxSR, SCxSR_ERROR_CLEAR(port));

	/* Kick the transmission */
756
	sci_tx_interrupt(irq, ptr);
L
Linus Torvalds 已提交
757 758 759 760

	return IRQ_HANDLED;
}

761
static irqreturn_t sci_br_interrupt(int irq, void *ptr)
L
Linus Torvalds 已提交
762 763 764 765 766 767 768 769 770 771
{
	struct uart_port *port = ptr;

	/* Handle BREAKs */
	sci_handle_breaks(port);
	sci_out(port, SCxSR, SCxSR_BREAK_CLEAR(port));

	return IRQ_HANDLED;
}

P
Paul Mundt 已提交
772 773 774 775 776 777 778 779 780
static inline unsigned long port_rx_irq_mask(struct uart_port *port)
{
	/*
	 * Not all ports (such as SCIFA) will support REIE. Rather than
	 * special-casing the port type, we check the port initialization
	 * IRQ enable mask to see whether the IRQ is desired at all. If
	 * it's unset, it's logically inferred that there's no point in
	 * testing for it.
	 */
781
	return SCSCR_RIE | (to_sci_port(port)->cfg->scscr & SCSCR_REIE);
P
Paul Mundt 已提交
782 783
}

784
static irqreturn_t sci_mpxed_interrupt(int irq, void *ptr)
L
Linus Torvalds 已提交
785
{
786
	unsigned short ssr_status, scr_status, err_enabled;
787
	struct uart_port *port = ptr;
788
	struct sci_port *s = to_sci_port(port);
789
	irqreturn_t ret = IRQ_NONE;
L
Linus Torvalds 已提交
790

791 792
	ssr_status = sci_in(port, SCxSR);
	scr_status = sci_in(port, SCSCR);
P
Paul Mundt 已提交
793
	err_enabled = scr_status & port_rx_irq_mask(port);
L
Linus Torvalds 已提交
794 795

	/* Tx Interrupt */
P
Paul Mundt 已提交
796
	if ((ssr_status & SCxSR_TDxE(port)) && (scr_status & SCSCR_TIE) &&
797
	    !s->chan_tx)
798
		ret = sci_tx_interrupt(irq, ptr);
P
Paul Mundt 已提交
799

800 801 802 803 804
	/*
	 * Rx Interrupt: if we're using DMA, the DMA controller clears RDF /
	 * DR flags
	 */
	if (((ssr_status & SCxSR_RDxF(port)) || s->chan_rx) &&
P
Paul Mundt 已提交
805
	    (scr_status & SCSCR_RIE))
806
		ret = sci_rx_interrupt(irq, ptr);
P
Paul Mundt 已提交
807

L
Linus Torvalds 已提交
808
	/* Error Interrupt */
809
	if ((ssr_status & SCxSR_ERRORS(port)) && err_enabled)
810
		ret = sci_er_interrupt(irq, ptr);
P
Paul Mundt 已提交
811

L
Linus Torvalds 已提交
812
	/* Break Interrupt */
813
	if ((ssr_status & SCxSR_BRK(port)) && err_enabled)
814
		ret = sci_br_interrupt(irq, ptr);
L
Linus Torvalds 已提交
815

816
	return ret;
L
Linus Torvalds 已提交
817 818 819
}

/*
L
Lucas De Marchi 已提交
820
 * Here we define a transition notifier so that we can update all of our
L
Linus Torvalds 已提交
821 822
 * ports' baud rate when the peripheral clock changes.
 */
823 824
static int sci_notifier(struct notifier_block *self,
			unsigned long phase, void *p)
L
Linus Torvalds 已提交
825
{
826 827
	struct sci_port *sci_port;
	unsigned long flags;
L
Linus Torvalds 已提交
828

829 830
	sci_port = container_of(self, struct sci_port, freq_transition);

L
Linus Torvalds 已提交
831
	if ((phase == CPUFREQ_POSTCHANGE) ||
832
	    (phase == CPUFREQ_RESUMECHANGE)) {
833
		struct uart_port *port = &sci_port->port;
834

835 836 837
		spin_lock_irqsave(&port->lock, flags);
		port->uartclk = clk_get_rate(sci_port->iclk);
		spin_unlock_irqrestore(&port->lock, flags);
838
	}
L
Linus Torvalds 已提交
839 840 841

	return NOTIFY_OK;
}
842 843 844 845 846

static void sci_clk_enable(struct uart_port *port)
{
	struct sci_port *sci_port = to_sci_port(port);

M
Magnus Damm 已提交
847 848
	pm_runtime_get_sync(port->dev);

849 850 851
	clk_enable(sci_port->iclk);
	sci_port->port.uartclk = clk_get_rate(sci_port->iclk);
	clk_enable(sci_port->fclk);
852 853 854 855 856 857
}

static void sci_clk_disable(struct uart_port *port)
{
	struct sci_port *sci_port = to_sci_port(port);

858 859
	clk_disable(sci_port->fclk);
	clk_disable(sci_port->iclk);
M
Magnus Damm 已提交
860 861

	pm_runtime_put_sync(port->dev);
862
}
L
Linus Torvalds 已提交
863 864 865 866

static int sci_request_irq(struct sci_port *port)
{
	int i;
867
	irqreturn_t (*handlers[4])(int irq, void *ptr) = {
L
Linus Torvalds 已提交
868 869 870 871 872 873
		sci_er_interrupt, sci_rx_interrupt, sci_tx_interrupt,
		sci_br_interrupt,
	};
	const char *desc[] = { "SCI Receive Error", "SCI Receive Data Full",
			       "SCI Transmit Data Empty", "SCI Break" };

874 875
	if (port->cfg->irqs[0] == port->cfg->irqs[1]) {
		if (unlikely(!port->cfg->irqs[0]))
L
Linus Torvalds 已提交
876
			return -ENODEV;
877

878
		if (request_irq(port->cfg->irqs[0], sci_mpxed_interrupt,
P
Paul Mundt 已提交
879
				IRQF_DISABLED, "sci", port)) {
880
			dev_err(port->port.dev, "Can't allocate IRQ\n");
L
Linus Torvalds 已提交
881 882 883 884
			return -ENODEV;
		}
	} else {
		for (i = 0; i < ARRAY_SIZE(handlers); i++) {
885
			if (unlikely(!port->cfg->irqs[i]))
L
Linus Torvalds 已提交
886
				continue;
887

888
			if (request_irq(port->cfg->irqs[i], handlers[i],
P
Paul Mundt 已提交
889
					IRQF_DISABLED, desc[i], port)) {
890
				dev_err(port->port.dev, "Can't allocate IRQ\n");
L
Linus Torvalds 已提交
891 892 893 894 895 896 897 898 899 900 901 902
				return -ENODEV;
			}
		}
	}

	return 0;
}

static void sci_free_irq(struct sci_port *port)
{
	int i;

903 904
	if (port->cfg->irqs[0] == port->cfg->irqs[1])
		free_irq(port->cfg->irqs[0], port);
905
	else {
906 907
		for (i = 0; i < ARRAY_SIZE(port->cfg->irqs); i++) {
			if (!port->cfg->irqs[i])
L
Linus Torvalds 已提交
908 909
				continue;

910
			free_irq(port->cfg->irqs[i], port);
L
Linus Torvalds 已提交
911 912 913 914 915 916
		}
	}
}

static unsigned int sci_tx_empty(struct uart_port *port)
{
917
	unsigned short status = sci_in(port, SCxSR);
918 919 920
	unsigned short in_tx_fifo = scif_txfill(port);

	return (status & SCxSR_TEND(port)) && !in_tx_fifo ? TIOCSER_TEMT : 0;
L
Linus Torvalds 已提交
921 922 923 924 925 926 927 928 929 930 931
}

static void sci_set_mctrl(struct uart_port *port, unsigned int mctrl)
{
	/* This routine is used for seting signals of: DTR, DCD, CTS/RTS */
	/* We use SCIF's hardware for CTS/RTS, so don't need any for that. */
	/* If you have signals for DTR and DCD, please implement here. */
}

static unsigned int sci_get_mctrl(struct uart_port *port)
{
932
	/* This routine is used for getting signals of: DTR, DCD, DSR, RI,
L
Linus Torvalds 已提交
933 934 935 936 937
	   and CTS/RTS */

	return TIOCM_DTR | TIOCM_RTS | TIOCM_DSR;
}

938 939 940 941 942 943 944 945 946 947 948 949
#ifdef CONFIG_SERIAL_SH_SCI_DMA
static void sci_dma_tx_complete(void *arg)
{
	struct sci_port *s = arg;
	struct uart_port *port = &s->port;
	struct circ_buf *xmit = &port->state->xmit;
	unsigned long flags;

	dev_dbg(port->dev, "%s(%d)\n", __func__, port->line);

	spin_lock_irqsave(&port->lock, flags);

950
	xmit->tail += sg_dma_len(&s->sg_tx);
951 952
	xmit->tail &= UART_XMIT_SIZE - 1;

953
	port->icount.tx += sg_dma_len(&s->sg_tx);
954 955 956 957 958 959 960 961

	async_tx_ack(s->desc_tx);
	s->cookie_tx = -EINVAL;
	s->desc_tx = NULL;

	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
		uart_write_wakeup(port);

962
	if (!uart_circ_empty(xmit)) {
963
		schedule_work(&s->work_tx);
964
	} else if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
965
		u16 ctrl = sci_in(port, SCSCR);
P
Paul Mundt 已提交
966
		sci_out(port, SCSCR, ctrl & ~SCSCR_TIE);
967 968 969
	}

	spin_unlock_irqrestore(&port->lock, flags);
970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012
}

/* Locking: called with port lock held */
static int sci_dma_rx_push(struct sci_port *s, struct tty_struct *tty,
			   size_t count)
{
	struct uart_port *port = &s->port;
	int i, active, room;

	room = tty_buffer_request_room(tty, count);

	if (s->active_rx == s->cookie_rx[0]) {
		active = 0;
	} else if (s->active_rx == s->cookie_rx[1]) {
		active = 1;
	} else {
		dev_err(port->dev, "cookie %d not found!\n", s->active_rx);
		return 0;
	}

	if (room < count)
		dev_warn(port->dev, "Rx overrun: dropping %u bytes\n",
			 count - room);
	if (!room)
		return room;

	for (i = 0; i < room; i++)
		tty_insert_flip_char(tty, ((u8 *)sg_virt(&s->sg_rx[active]))[i],
				     TTY_NORMAL);

	port->icount.rx += room;

	return room;
}

static void sci_dma_rx_complete(void *arg)
{
	struct sci_port *s = arg;
	struct uart_port *port = &s->port;
	struct tty_struct *tty = port->state->port.tty;
	unsigned long flags;
	int count;

1013
	dev_dbg(port->dev, "%s(%d) active #%d\n", __func__, port->line, s->active_rx);
1014 1015 1016 1017 1018

	spin_lock_irqsave(&port->lock, flags);

	count = sci_dma_rx_push(s, tty, s->buf_len_rx);

1019
	mod_timer(&s->rx_timer, jiffies + s->rx_timeout);
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036

	spin_unlock_irqrestore(&port->lock, flags);

	if (count)
		tty_flip_buffer_push(tty);

	schedule_work(&s->work_rx);
}

static void sci_rx_dma_release(struct sci_port *s, bool enable_pio)
{
	struct dma_chan *chan = s->chan_rx;
	struct uart_port *port = &s->port;

	s->chan_rx = NULL;
	s->cookie_rx[0] = s->cookie_rx[1] = -EINVAL;
	dma_release_channel(chan);
1037 1038 1039
	if (sg_dma_address(&s->sg_rx[0]))
		dma_free_coherent(port->dev, s->buf_len_rx * 2,
				  sg_virt(&s->sg_rx[0]), sg_dma_address(&s->sg_rx[0]));
1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088
	if (enable_pio)
		sci_start_rx(port);
}

static void sci_tx_dma_release(struct sci_port *s, bool enable_pio)
{
	struct dma_chan *chan = s->chan_tx;
	struct uart_port *port = &s->port;

	s->chan_tx = NULL;
	s->cookie_tx = -EINVAL;
	dma_release_channel(chan);
	if (enable_pio)
		sci_start_tx(port);
}

static void sci_submit_rx(struct sci_port *s)
{
	struct dma_chan *chan = s->chan_rx;
	int i;

	for (i = 0; i < 2; i++) {
		struct scatterlist *sg = &s->sg_rx[i];
		struct dma_async_tx_descriptor *desc;

		desc = chan->device->device_prep_slave_sg(chan,
			sg, 1, DMA_FROM_DEVICE, DMA_PREP_INTERRUPT);

		if (desc) {
			s->desc_rx[i] = desc;
			desc->callback = sci_dma_rx_complete;
			desc->callback_param = s;
			s->cookie_rx[i] = desc->tx_submit(desc);
		}

		if (!desc || s->cookie_rx[i] < 0) {
			if (i) {
				async_tx_ack(s->desc_rx[0]);
				s->cookie_rx[0] = -EINVAL;
			}
			if (desc) {
				async_tx_ack(desc);
				s->cookie_rx[i] = -EINVAL;
			}
			dev_warn(s->port.dev,
				 "failed to re-start DMA, using PIO\n");
			sci_rx_dma_release(s, true);
			return;
		}
1089 1090
		dev_dbg(s->port.dev, "%s(): cookie %d to #%d\n", __func__,
			s->cookie_rx[i], i);
1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124
	}

	s->active_rx = s->cookie_rx[0];

	dma_async_issue_pending(chan);
}

static void work_fn_rx(struct work_struct *work)
{
	struct sci_port *s = container_of(work, struct sci_port, work_rx);
	struct uart_port *port = &s->port;
	struct dma_async_tx_descriptor *desc;
	int new;

	if (s->active_rx == s->cookie_rx[0]) {
		new = 0;
	} else if (s->active_rx == s->cookie_rx[1]) {
		new = 1;
	} else {
		dev_err(port->dev, "cookie %d not found!\n", s->active_rx);
		return;
	}
	desc = s->desc_rx[new];

	if (dma_async_is_tx_complete(s->chan_rx, s->active_rx, NULL, NULL) !=
	    DMA_SUCCESS) {
		/* Handle incomplete DMA receive */
		struct tty_struct *tty = port->state->port.tty;
		struct dma_chan *chan = s->chan_rx;
		struct sh_desc *sh_desc = container_of(desc, struct sh_desc,
						       async_tx);
		unsigned long flags;
		int count;

1125
		chan->device->device_control(chan, DMA_TERMINATE_ALL, 0);
1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148
		dev_dbg(port->dev, "Read %u bytes with cookie %d\n",
			sh_desc->partial, sh_desc->cookie);

		spin_lock_irqsave(&port->lock, flags);
		count = sci_dma_rx_push(s, tty, sh_desc->partial);
		spin_unlock_irqrestore(&port->lock, flags);

		if (count)
			tty_flip_buffer_push(tty);

		sci_submit_rx(s);

		return;
	}

	s->cookie_rx[new] = desc->tx_submit(desc);
	if (s->cookie_rx[new] < 0) {
		dev_warn(port->dev, "Failed submitting Rx DMA descriptor\n");
		sci_rx_dma_release(s, true);
		return;
	}

	s->active_rx = s->cookie_rx[!new];
1149 1150 1151

	dev_dbg(port->dev, "%s: cookie %d #%d, new active #%d\n", __func__,
		s->cookie_rx[new], new, s->active_rx);
1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171
}

static void work_fn_tx(struct work_struct *work)
{
	struct sci_port *s = container_of(work, struct sci_port, work_tx);
	struct dma_async_tx_descriptor *desc;
	struct dma_chan *chan = s->chan_tx;
	struct uart_port *port = &s->port;
	struct circ_buf *xmit = &port->state->xmit;
	struct scatterlist *sg = &s->sg_tx;

	/*
	 * DMA is idle now.
	 * Port xmit buffer is already mapped, and it is one page... Just adjust
	 * offsets and lengths. Since it is a circular buffer, we have to
	 * transmit till the end, and then the rest. Take the port lock to get a
	 * consistent xmit buffer state.
	 */
	spin_lock_irq(&port->lock);
	sg->offset = xmit->tail & (UART_XMIT_SIZE - 1);
1172
	sg_dma_address(sg) = (sg_dma_address(sg) & ~(UART_XMIT_SIZE - 1)) +
1173
		sg->offset;
1174
	sg_dma_len(sg) = min((int)CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE),
1175 1176 1177
		CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE));
	spin_unlock_irq(&port->lock);

1178
	BUG_ON(!sg_dma_len(sg));
1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210

	desc = chan->device->device_prep_slave_sg(chan,
			sg, s->sg_len_tx, DMA_TO_DEVICE,
			DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
	if (!desc) {
		/* switch to PIO */
		sci_tx_dma_release(s, true);
		return;
	}

	dma_sync_sg_for_device(port->dev, sg, 1, DMA_TO_DEVICE);

	spin_lock_irq(&port->lock);
	s->desc_tx = desc;
	desc->callback = sci_dma_tx_complete;
	desc->callback_param = s;
	spin_unlock_irq(&port->lock);
	s->cookie_tx = desc->tx_submit(desc);
	if (s->cookie_tx < 0) {
		dev_warn(port->dev, "Failed submitting Tx DMA descriptor\n");
		/* switch to PIO */
		sci_tx_dma_release(s, true);
		return;
	}

	dev_dbg(port->dev, "%s: %p: %d...%d, cookie %d\n", __func__,
		xmit->buf, xmit->tail, xmit->head, s->cookie_tx);

	dma_async_issue_pending(chan);
}
#endif

1211
static void sci_start_tx(struct uart_port *port)
L
Linus Torvalds 已提交
1212
{
1213
	struct sci_port *s = to_sci_port(port);
1214
	unsigned short ctrl;
L
Linus Torvalds 已提交
1215

1216
#ifdef CONFIG_SERIAL_SH_SCI_DMA
1217
	if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
1218 1219 1220 1221 1222 1223 1224
		u16 new, scr = sci_in(port, SCSCR);
		if (s->chan_tx)
			new = scr | 0x8000;
		else
			new = scr & ~0x8000;
		if (new != scr)
			sci_out(port, SCSCR, new);
1225
	}
P
Paul Mundt 已提交
1226

1227 1228 1229
	if (s->chan_tx && !uart_circ_empty(&s->port.state->xmit) &&
	    s->cookie_tx < 0)
		schedule_work(&s->work_tx);
1230
#endif
P
Paul Mundt 已提交
1231

1232
	if (!s->chan_tx || port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
1233 1234
		/* Set TIE (Transmit Interrupt Enable) bit in SCSCR */
		ctrl = sci_in(port, SCSCR);
P
Paul Mundt 已提交
1235
		sci_out(port, SCSCR, ctrl | SCSCR_TIE);
1236
	}
L
Linus Torvalds 已提交
1237 1238
}

1239
static void sci_stop_tx(struct uart_port *port)
L
Linus Torvalds 已提交
1240 1241 1242 1243 1244
{
	unsigned short ctrl;

	/* Clear TIE (Transmit Interrupt Enable) bit in SCSCR */
	ctrl = sci_in(port, SCSCR);
P
Paul Mundt 已提交
1245

1246
	if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
1247
		ctrl &= ~0x8000;
P
Paul Mundt 已提交
1248

1249
	ctrl &= ~SCSCR_TIE;
P
Paul Mundt 已提交
1250

L
Linus Torvalds 已提交
1251 1252 1253
	sci_out(port, SCSCR, ctrl);
}

1254
static void sci_start_rx(struct uart_port *port)
L
Linus Torvalds 已提交
1255 1256 1257
{
	unsigned short ctrl;

P
Paul Mundt 已提交
1258
	ctrl = sci_in(port, SCSCR) | port_rx_irq_mask(port);
L
Linus Torvalds 已提交
1259

1260
	if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
1261
		ctrl &= ~0x4000;
P
Paul Mundt 已提交
1262

L
Linus Torvalds 已提交
1263 1264 1265 1266 1267 1268 1269 1270
	sci_out(port, SCSCR, ctrl);
}

static void sci_stop_rx(struct uart_port *port)
{
	unsigned short ctrl;

	ctrl = sci_in(port, SCSCR);
P
Paul Mundt 已提交
1271

1272
	if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
1273
		ctrl &= ~0x4000;
P
Paul Mundt 已提交
1274 1275 1276

	ctrl &= ~port_rx_irq_mask(port);

L
Linus Torvalds 已提交
1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289
	sci_out(port, SCSCR, ctrl);
}

static void sci_enable_ms(struct uart_port *port)
{
	/* Nothing here yet .. */
}

static void sci_break_ctl(struct uart_port *port, int break_state)
{
	/* Nothing here yet .. */
}

1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310
#ifdef CONFIG_SERIAL_SH_SCI_DMA
static bool filter(struct dma_chan *chan, void *slave)
{
	struct sh_dmae_slave *param = slave;

	dev_dbg(chan->device->dev, "%s: slave ID %d\n", __func__,
		param->slave_id);

	if (param->dma_dev == chan->device->dev) {
		chan->private = param;
		return true;
	} else {
		return false;
	}
}

static void rx_timer_fn(unsigned long arg)
{
	struct sci_port *s = (struct sci_port *)arg;
	struct uart_port *port = &s->port;
	u16 scr = sci_in(port, SCSCR);
1311

1312
	if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
1313
		scr &= ~0x4000;
1314
		enable_irq(s->cfg->irqs[1]);
1315
	}
P
Paul Mundt 已提交
1316
	sci_out(port, SCSCR, scr | SCSCR_RIE);
1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329
	dev_dbg(port->dev, "DMA Rx timed out\n");
	schedule_work(&s->work_rx);
}

static void sci_request_dma(struct uart_port *port)
{
	struct sci_port *s = to_sci_port(port);
	struct sh_dmae_slave *param;
	struct dma_chan *chan;
	dma_cap_mask_t mask;
	int nent;

	dev_dbg(port->dev, "%s: port %d DMA %p\n", __func__,
1330
		port->line, s->cfg->dma_dev);
1331

1332
	if (!s->cfg->dma_dev)
1333 1334 1335 1336 1337 1338 1339 1340
		return;

	dma_cap_zero(mask);
	dma_cap_set(DMA_SLAVE, mask);

	param = &s->param_tx;

	/* Slave ID, e.g., SHDMA_SLAVE_SCIF0_TX */
1341 1342
	param->slave_id = s->cfg->dma_slave_tx;
	param->dma_dev = s->cfg->dma_dev;
1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369

	s->cookie_tx = -EINVAL;
	chan = dma_request_channel(mask, filter, param);
	dev_dbg(port->dev, "%s: TX: got channel %p\n", __func__, chan);
	if (chan) {
		s->chan_tx = chan;
		sg_init_table(&s->sg_tx, 1);
		/* UART circular tx buffer is an aligned page. */
		BUG_ON((int)port->state->xmit.buf & ~PAGE_MASK);
		sg_set_page(&s->sg_tx, virt_to_page(port->state->xmit.buf),
			    UART_XMIT_SIZE, (int)port->state->xmit.buf & ~PAGE_MASK);
		nent = dma_map_sg(port->dev, &s->sg_tx, 1, DMA_TO_DEVICE);
		if (!nent)
			sci_tx_dma_release(s, false);
		else
			dev_dbg(port->dev, "%s: mapped %d@%p to %x\n", __func__,
				sg_dma_len(&s->sg_tx),
				port->state->xmit.buf, sg_dma_address(&s->sg_tx));

		s->sg_len_tx = nent;

		INIT_WORK(&s->work_tx, work_fn_tx);
	}

	param = &s->param_rx;

	/* Slave ID, e.g., SHDMA_SLAVE_SCIF0_RX */
1370 1371
	param->slave_id = s->cfg->dma_slave_rx;
	param->dma_dev = s->cfg->dma_dev;
1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401

	chan = dma_request_channel(mask, filter, param);
	dev_dbg(port->dev, "%s: RX: got channel %p\n", __func__, chan);
	if (chan) {
		dma_addr_t dma[2];
		void *buf[2];
		int i;

		s->chan_rx = chan;

		s->buf_len_rx = 2 * max(16, (int)port->fifosize);
		buf[0] = dma_alloc_coherent(port->dev, s->buf_len_rx * 2,
					    &dma[0], GFP_KERNEL);

		if (!buf[0]) {
			dev_warn(port->dev,
				 "failed to allocate dma buffer, using PIO\n");
			sci_rx_dma_release(s, true);
			return;
		}

		buf[1] = buf[0] + s->buf_len_rx;
		dma[1] = dma[0] + s->buf_len_rx;

		for (i = 0; i < 2; i++) {
			struct scatterlist *sg = &s->sg_rx[i];

			sg_init_table(sg, 1);
			sg_set_page(sg, virt_to_page(buf[i]), s->buf_len_rx,
				    (int)buf[i] & ~PAGE_MASK);
1402
			sg_dma_address(sg) = dma[i];
1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415
		}

		INIT_WORK(&s->work_rx, work_fn_rx);
		setup_timer(&s->rx_timer, rx_timer_fn, (unsigned long)s);

		sci_submit_rx(s);
	}
}

static void sci_free_dma(struct uart_port *port)
{
	struct sci_port *s = to_sci_port(port);

1416
	if (!s->cfg->dma_dev)
1417 1418 1419 1420 1421 1422 1423
		return;

	if (s->chan_tx)
		sci_tx_dma_release(s, false);
	if (s->chan_rx)
		sci_rx_dma_release(s, false);
}
1424 1425 1426 1427 1428 1429 1430 1431
#else
static inline void sci_request_dma(struct uart_port *port)
{
}

static inline void sci_free_dma(struct uart_port *port)
{
}
1432 1433
#endif

L
Linus Torvalds 已提交
1434 1435
static int sci_startup(struct uart_port *port)
{
1436
	struct sci_port *s = to_sci_port(port);
1437
	int ret;
L
Linus Torvalds 已提交
1438

1439 1440
	dev_dbg(port->dev, "%s(%d)\n", __func__, port->line);

1441 1442
	if (s->enable)
		s->enable(port);
L
Linus Torvalds 已提交
1443

1444 1445 1446 1447
	ret = sci_request_irq(s);
	if (unlikely(ret < 0))
		return ret;

1448
	sci_request_dma(port);
1449

1450
	sci_start_tx(port);
1451
	sci_start_rx(port);
L
Linus Torvalds 已提交
1452 1453 1454 1455 1456 1457

	return 0;
}

static void sci_shutdown(struct uart_port *port)
{
1458
	struct sci_port *s = to_sci_port(port);
L
Linus Torvalds 已提交
1459

1460 1461
	dev_dbg(port->dev, "%s(%d)\n", __func__, port->line);

L
Linus Torvalds 已提交
1462
	sci_stop_rx(port);
1463
	sci_stop_tx(port);
1464

1465
	sci_free_dma(port);
L
Linus Torvalds 已提交
1466 1467
	sci_free_irq(s);

1468 1469
	if (s->disable)
		s->disable(port);
L
Linus Torvalds 已提交
1470 1471
}

1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489
static unsigned int sci_scbrr_calc(unsigned int algo_id, unsigned int bps,
				   unsigned long freq)
{
	switch (algo_id) {
	case SCBRR_ALGO_1:
		return ((freq + 16 * bps) / (16 * bps) - 1);
	case SCBRR_ALGO_2:
		return ((freq + 16 * bps) / (32 * bps) - 1);
	case SCBRR_ALGO_3:
		return (((freq * 2) + 16 * bps) / (16 * bps) - 1);
	case SCBRR_ALGO_4:
		return (((freq * 2) + 16 * bps) / (32 * bps) - 1);
	case SCBRR_ALGO_5:
		return (((freq * 1000 / 32) / bps) - 1);
	}

	/* Warn, but use a safe default */
	WARN_ON(1);
1490

1491 1492 1493
	return ((freq + 16 * bps) / (32 * bps) - 1);
}

A
Alan Cox 已提交
1494 1495
static void sci_set_termios(struct uart_port *port, struct ktermios *termios,
			    struct ktermios *old)
L
Linus Torvalds 已提交
1496
{
1497
	struct sci_port *s = to_sci_port(port);
1498
	unsigned int status, baud, smr_val, max_baud;
1499
	int t = -1;
1500
	u16 scfcr = 0;
L
Linus Torvalds 已提交
1501

1502 1503 1504 1505 1506 1507 1508 1509 1510
	/*
	 * earlyprintk comes here early on with port->uartclk set to zero.
	 * the clock framework is not up and running at this point so here
	 * we assume that 115200 is the maximum baud rate. please note that
	 * the baud rate is not programmed during earlyprintk - it is assumed
	 * that the previous boot loader has enabled required clocks and
	 * setup the baud rate generator hardware for us already.
	 */
	max_baud = port->uartclk ? port->uartclk / 16 : 115200;
L
Linus Torvalds 已提交
1511

1512 1513
	baud = uart_get_baud_rate(port, termios, old, 0, max_baud);
	if (likely(baud && port->uartclk))
1514
		t = sci_scbrr_calc(s->cfg->scbrr_algo_id, baud, port->uartclk);
1515

1516 1517 1518
	if (s->enable)
		s->enable(port);

L
Linus Torvalds 已提交
1519 1520 1521 1522 1523 1524
	do {
		status = sci_in(port, SCxSR);
	} while (!(status & SCxSR_TEND(port)));

	sci_out(port, SCSCR, 0x00);	/* TE=0, RE=0, CKE1=0 */

1525
	if (port->type != PORT_SCI)
1526
		sci_out(port, SCFCR, scfcr | SCFCR_RFRST | SCFCR_TFRST);
L
Linus Torvalds 已提交
1527 1528

	smr_val = sci_in(port, SCSMR) & 3;
1529

L
Linus Torvalds 已提交
1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542
	if ((termios->c_cflag & CSIZE) == CS7)
		smr_val |= 0x40;
	if (termios->c_cflag & PARENB)
		smr_val |= 0x20;
	if (termios->c_cflag & PARODD)
		smr_val |= 0x30;
	if (termios->c_cflag & CSTOPB)
		smr_val |= 0x08;

	uart_update_timeout(port, termios->c_cflag, baud);

	sci_out(port, SCSMR, smr_val);

1543
	dev_dbg(port->dev, "%s: SMR %x, t %x, SCSCR %x\n", __func__, smr_val, t,
1544
		s->cfg->scscr);
1545

L
Linus Torvalds 已提交
1546
	if (t > 0) {
1547
		if (t >= 256) {
L
Linus Torvalds 已提交
1548 1549
			sci_out(port, SCSMR, (sci_in(port, SCSMR) & ~3) | 1);
			t >>= 2;
1550
		} else
L
Linus Torvalds 已提交
1551
			sci_out(port, SCSMR, sci_in(port, SCSMR) & ~3);
1552

L
Linus Torvalds 已提交
1553 1554 1555 1556
		sci_out(port, SCBRR, t);
		udelay((1000000+(baud-1)) / baud); /* Wait one bit interval */
	}

1557
	sci_init_pins(port, termios->c_cflag);
1558
	sci_out(port, SCFCR, scfcr | ((termios->c_cflag & CRTSCTS) ? SCFCR_MCE : 0));
1559

1560
	sci_out(port, SCSCR, s->cfg->scscr);
L
Linus Torvalds 已提交
1561

1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583
#ifdef CONFIG_SERIAL_SH_SCI_DMA
	/*
	 * Calculate delay for 1.5 DMA buffers: see
	 * drivers/serial/serial_core.c::uart_update_timeout(). With 10 bits
	 * (CS8), 250Hz, 115200 baud and 64 bytes FIFO, the above function
	 * calculates 1 jiffie for the data plus 5 jiffies for the "slop(e)."
	 * Then below we calculate 3 jiffies (12ms) for 1.5 DMA buffers (3 FIFO
	 * sizes), but it has been found out experimentally, that this is not
	 * enough: the driver too often needlessly runs on a DMA timeout. 20ms
	 * as a minimum seem to work perfectly.
	 */
	if (s->chan_rx) {
		s->rx_timeout = (port->timeout - HZ / 50) * s->buf_len_rx * 3 /
			port->fifosize / 2;
		dev_dbg(port->dev,
			"DMA Rx t-out %ums, tty t-out %u jiffies\n",
			s->rx_timeout * 1000 / HZ, port->timeout);
		if (s->rx_timeout < msecs_to_jiffies(20))
			s->rx_timeout = msecs_to_jiffies(20);
	}
#endif

L
Linus Torvalds 已提交
1584
	if ((termios->c_cflag & CREAD) != 0)
1585
		sci_start_rx(port);
1586 1587 1588

	if (s->disable)
		s->disable(port);
L
Linus Torvalds 已提交
1589 1590 1591 1592 1593
}

static const char *sci_type(struct uart_port *port)
{
	switch (port->type) {
1594 1595 1596 1597 1598 1599 1600 1601
	case PORT_IRDA:
		return "irda";
	case PORT_SCI:
		return "sci";
	case PORT_SCIF:
		return "scif";
	case PORT_SCIFA:
		return "scifa";
1602 1603
	case PORT_SCIFB:
		return "scifb";
L
Linus Torvalds 已提交
1604 1605
	}

P
Paul Mundt 已提交
1606
	return NULL;
L
Linus Torvalds 已提交
1607 1608
}

1609
static inline unsigned long sci_port_size(struct uart_port *port)
L
Linus Torvalds 已提交
1610
{
1611 1612 1613 1614 1615 1616 1617
	/*
	 * Pick an arbitrary size that encapsulates all of the base
	 * registers by default. This can be optimized later, or derived
	 * from platform resource data at such a time that ports begin to
	 * behave more erratically.
	 */
	return 64;
L
Linus Torvalds 已提交
1618 1619
}

1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647
static int sci_remap_port(struct uart_port *port)
{
	unsigned long size = sci_port_size(port);

	/*
	 * Nothing to do if there's already an established membase.
	 */
	if (port->membase)
		return 0;

	if (port->flags & UPF_IOREMAP) {
		port->membase = ioremap_nocache(port->mapbase, size);
		if (unlikely(!port->membase)) {
			dev_err(port->dev, "can't remap port#%d\n", port->line);
			return -ENXIO;
		}
	} else {
		/*
		 * For the simple (and majority of) cases where we don't
		 * need to do any remapping, just cast the cookie
		 * directly.
		 */
		port->membase = (void __iomem *)port->mapbase;
	}

	return 0;
}

1648
static void sci_release_port(struct uart_port *port)
L
Linus Torvalds 已提交
1649
{
1650 1651 1652 1653 1654 1655
	if (port->flags & UPF_IOREMAP) {
		iounmap(port->membase);
		port->membase = NULL;
	}

	release_mem_region(port->mapbase, sci_port_size(port));
L
Linus Torvalds 已提交
1656 1657
}

1658
static int sci_request_port(struct uart_port *port)
L
Linus Torvalds 已提交
1659
{
1660 1661
	unsigned long size = sci_port_size(port);
	struct resource *res;
1662
	int ret;
L
Linus Torvalds 已提交
1663

1664
	res = request_mem_region(port->mapbase, size, dev_name(port->dev));
1665 1666
	if (unlikely(res == NULL))
		return -EBUSY;
L
Linus Torvalds 已提交
1667

1668 1669 1670 1671
	ret = sci_remap_port(port);
	if (unlikely(ret != 0)) {
		release_resource(res);
		return ret;
1672
	}
1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684

	return 0;
}

static void sci_config_port(struct uart_port *port, int flags)
{
	if (flags & UART_CONFIG_TYPE) {
		struct sci_port *sport = to_sci_port(port);

		port->type = sport->cfg->type;
		sci_request_port(port);
	}
L
Linus Torvalds 已提交
1685 1686 1687 1688
}

static int sci_verify_port(struct uart_port *port, struct serial_struct *ser)
{
1689
	struct sci_port *s = to_sci_port(port);
L
Linus Torvalds 已提交
1690

1691
	if (ser->irq != s->cfg->irqs[SCIx_TXI_IRQ] || ser->irq > nr_irqs)
L
Linus Torvalds 已提交
1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716
		return -EINVAL;
	if (ser->baud_base < 2400)
		/* No paper tape reader for Mitch.. */
		return -EINVAL;

	return 0;
}

static struct uart_ops sci_uart_ops = {
	.tx_empty	= sci_tx_empty,
	.set_mctrl	= sci_set_mctrl,
	.get_mctrl	= sci_get_mctrl,
	.start_tx	= sci_start_tx,
	.stop_tx	= sci_stop_tx,
	.stop_rx	= sci_stop_rx,
	.enable_ms	= sci_enable_ms,
	.break_ctl	= sci_break_ctl,
	.startup	= sci_startup,
	.shutdown	= sci_shutdown,
	.set_termios	= sci_set_termios,
	.type		= sci_type,
	.release_port	= sci_release_port,
	.request_port	= sci_request_port,
	.config_port	= sci_config_port,
	.verify_port	= sci_verify_port,
1717 1718 1719 1720
#ifdef CONFIG_CONSOLE_POLL
	.poll_get_char	= sci_poll_get_char,
	.poll_put_char	= sci_poll_put_char,
#endif
L
Linus Torvalds 已提交
1721 1722
};

1723 1724 1725 1726
static int __devinit sci_init_single(struct platform_device *dev,
				     struct sci_port *sci_port,
				     unsigned int index,
				     struct plat_sci_port *p)
1727
{
1728
	struct uart_port *port = &sci_port->port;
1729

1730 1731 1732
	port->ops	= &sci_uart_ops;
	port->iotype	= UPIO_MEM;
	port->line	= index;
1733 1734

	switch (p->type) {
1735 1736 1737
	case PORT_SCIFB:
		port->fifosize = 256;
		break;
1738
	case PORT_SCIFA:
1739
		port->fifosize = 64;
1740 1741
		break;
	case PORT_SCIF:
1742
		port->fifosize = 16;
1743 1744
		break;
	default:
1745
		port->fifosize = 1;
1746 1747
		break;
	}
1748 1749

	if (dev) {
1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766
		sci_port->iclk = clk_get(&dev->dev, "sci_ick");
		if (IS_ERR(sci_port->iclk)) {
			sci_port->iclk = clk_get(&dev->dev, "peripheral_clk");
			if (IS_ERR(sci_port->iclk)) {
				dev_err(&dev->dev, "can't get iclk\n");
				return PTR_ERR(sci_port->iclk);
			}
		}

		/*
		 * The function clock is optional, ignore it if we can't
		 * find it.
		 */
		sci_port->fclk = clk_get(&dev->dev, "sci_fck");
		if (IS_ERR(sci_port->fclk))
			sci_port->fclk = NULL;

1767 1768
		sci_port->enable = sci_clk_enable;
		sci_port->disable = sci_clk_disable;
1769
		port->dev = &dev->dev;
M
Magnus Damm 已提交
1770 1771

		pm_runtime_enable(&dev->dev);
1772
	}
1773

M
Magnus Damm 已提交
1774 1775 1776 1777
	sci_port->break_timer.data = (unsigned long)sci_port;
	sci_port->break_timer.function = sci_break_timer;
	init_timer(&sci_port->break_timer);

1778
	sci_port->cfg		= p;
M
Magnus Damm 已提交
1779

1780 1781
	port->mapbase		= p->mapbase;
	port->type		= p->type;
P
Paul Mundt 已提交
1782
	port->flags		= p->flags;
1783

1784 1785 1786 1787 1788 1789 1790
	/*
	 * The UART port needs an IRQ value, so we peg this to the TX IRQ
	 * for the multi-IRQ ports, which is where we are primarily
	 * concerned with the shutdown path synchronization.
	 *
	 * For the muxed case there's nothing more to do.
	 */
1791
	port->irq		= p->irqs[SCIx_RXI_IRQ];
1792

1793 1794 1795
	if (p->dma_dev)
		dev_dbg(port->dev, "DMA device %p, tx %d, rx %d\n",
			p->dma_dev, p->dma_slave_tx, p->dma_slave_rx);
M
Magnus Damm 已提交
1796

1797
	return 0;
1798 1799
}

L
Linus Torvalds 已提交
1800
#ifdef CONFIG_SERIAL_SH_SCI_CONSOLE
1801 1802 1803 1804 1805
static void serial_console_putchar(struct uart_port *port, int ch)
{
	sci_poll_put_char(port, ch);
}

L
Linus Torvalds 已提交
1806 1807 1808 1809 1810 1811 1812
/*
 *	Print a string to the serial port trying not to disturb
 *	any possible real use of the port...
 */
static void serial_console_write(struct console *co, const char *s,
				 unsigned count)
{
1813 1814
	struct sci_port *sci_port = &sci_ports[co->index];
	struct uart_port *port = &sci_port->port;
M
Magnus Damm 已提交
1815
	unsigned short bits;
1816

1817 1818 1819 1820
	if (sci_port->enable)
		sci_port->enable(port);

	uart_console_write(port, s, count, serial_console_putchar);
M
Magnus Damm 已提交
1821 1822 1823 1824 1825

	/* wait until fifo is empty and last bit has been transmitted */
	bits = SCxSR_TDxE(port) | SCxSR_TEND(port);
	while ((sci_in(port, SCxSR) & bits) != bits)
		cpu_relax();
1826

1827
	if (sci_port->disable)
1828
		sci_port->disable(port);
L
Linus Torvalds 已提交
1829 1830
}

1831
static int __devinit serial_console_setup(struct console *co, char *options)
L
Linus Torvalds 已提交
1832
{
1833
	struct sci_port *sci_port;
L
Linus Torvalds 已提交
1834 1835 1836 1837 1838 1839 1840
	struct uart_port *port;
	int baud = 115200;
	int bits = 8;
	int parity = 'n';
	int flow = 'n';
	int ret;

1841
	/*
1842
	 * Refuse to handle any bogus ports.
L
Linus Torvalds 已提交
1843
	 */
1844
	if (co->index < 0 || co->index >= SCI_NPORTS)
1845 1846
		return -ENODEV;

1847 1848 1849
	sci_port = &sci_ports[co->index];
	port = &sci_port->port;

1850 1851 1852 1853 1854 1855
	/*
	 * Refuse to handle uninitialized ports.
	 */
	if (!port->ops)
		return -ENODEV;

1856 1857 1858
	ret = sci_remap_port(port);
	if (unlikely(ret != 0))
		return ret;
1859

1860 1861
	if (sci_port->enable)
		sci_port->enable(port);
1862

L
Linus Torvalds 已提交
1863 1864 1865 1866 1867 1868 1869 1870 1871
	if (options)
		uart_parse_options(options, &baud, &parity, &bits, &flow);

	ret = uart_set_options(port, co, baud, parity, bits, flow);
#if defined(__H8300H__) || defined(__H8300S__)
	/* disable rx interrupt */
	if (ret == 0)
		sci_stop_rx(port);
#endif
1872
	/* TODO: disable clock */
L
Linus Torvalds 已提交
1873 1874 1875 1876 1877
	return ret;
}

static struct console serial_console = {
	.name		= "ttySC",
1878
	.device		= uart_console_device,
L
Linus Torvalds 已提交
1879 1880
	.write		= serial_console_write,
	.setup		= serial_console_setup,
P
Paul Mundt 已提交
1881
	.flags		= CON_PRINTBUFFER,
L
Linus Torvalds 已提交
1882
	.index		= -1,
1883
	.data		= &sci_uart_driver,
L
Linus Torvalds 已提交
1884 1885
};

1886 1887 1888 1889
static struct console early_serial_console = {
	.name           = "early_ttySC",
	.write          = serial_console_write,
	.flags          = CON_PRINTBUFFER,
1890
	.index		= -1,
1891
};
1892

1893 1894
static char early_serial_buf[32];

1895 1896 1897 1898 1899 1900 1901 1902 1903
static int __devinit sci_probe_earlyprintk(struct platform_device *pdev)
{
	struct plat_sci_port *cfg = pdev->dev.platform_data;

	if (early_serial_console.data)
		return -EEXIST;

	early_serial_console.index = pdev->id;

1904
	sci_init_single(NULL, &sci_ports[pdev->id], pdev->id, cfg);
1905 1906 1907 1908 1909 1910 1911 1912 1913

	serial_console_setup(&early_serial_console, early_serial_buf);

	if (!strstr(early_serial_buf, "keep"))
		early_serial_console.flags |= CON_BOOT;

	register_console(&early_serial_console);
	return 0;
}
1914 1915 1916

#define SCI_CONSOLE	(&serial_console)

1917 1918 1919 1920 1921
#else
static inline int __devinit sci_probe_earlyprintk(struct platform_device *pdev)
{
	return -EINVAL;
}
L
Linus Torvalds 已提交
1922

1923 1924 1925
#define SCI_CONSOLE	NULL

#endif /* CONFIG_SERIAL_SH_SCI_CONSOLE */
L
Linus Torvalds 已提交
1926 1927 1928 1929 1930 1931 1932 1933 1934 1935

static char banner[] __initdata =
	KERN_INFO "SuperH SCI(F) driver initialized\n";

static struct uart_driver sci_uart_driver = {
	.owner		= THIS_MODULE,
	.driver_name	= "sci",
	.dev_name	= "ttySC",
	.major		= SCI_MAJOR,
	.minor		= SCI_MINOR_START,
1936
	.nr		= SCI_NPORTS,
L
Linus Torvalds 已提交
1937 1938 1939
	.cons		= SCI_CONSOLE,
};

1940
static int sci_remove(struct platform_device *dev)
1941
{
1942
	struct sci_port *port = platform_get_drvdata(dev);
1943

1944 1945
	cpufreq_unregister_notifier(&port->freq_transition,
				    CPUFREQ_TRANSITION_NOTIFIER);
1946

1947 1948 1949 1950
	uart_remove_one_port(&sci_uart_driver, &port->port);

	clk_put(port->iclk);
	clk_put(port->fclk);
1951

M
Magnus Damm 已提交
1952
	pm_runtime_disable(&dev->dev);
1953 1954 1955
	return 0;
}

1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972
static int __devinit sci_probe_single(struct platform_device *dev,
				      unsigned int index,
				      struct plat_sci_port *p,
				      struct sci_port *sciport)
{
	int ret;

	/* Sanity check */
	if (unlikely(index >= SCI_NPORTS)) {
		dev_notice(&dev->dev, "Attempting to register port "
			   "%d when only %d are available.\n",
			   index+1, SCI_NPORTS);
		dev_notice(&dev->dev, "Consider bumping "
			   "CONFIG_SERIAL_SH_SCI_NR_UARTS!\n");
		return 0;
	}

1973 1974 1975
	ret = sci_init_single(dev, sciport, index, p);
	if (ret)
		return ret;
1976

1977
	return uart_add_one_port(&sci_uart_driver, &sciport->port);
1978 1979
}

1980
static int __devinit sci_probe(struct platform_device *dev)
L
Linus Torvalds 已提交
1981
{
1982
	struct plat_sci_port *p = dev->dev.platform_data;
1983
	struct sci_port *sp = &sci_ports[dev->id];
1984
	int ret;
1985

1986 1987 1988 1989 1990 1991 1992
	/*
	 * If we've come here via earlyprintk initialization, head off to
	 * the special early probe. We don't have sufficient device state
	 * to make it beyond this yet.
	 */
	if (is_early_platform_device(dev))
		return sci_probe_earlyprintk(dev);
1993

1994
	platform_set_drvdata(dev, sp);
1995

1996
	ret = sci_probe_single(dev, dev->id, p, sp);
1997 1998
	if (ret)
		goto err_unreg;
1999

2000
	sp->freq_transition.notifier_call = sci_notifier;
L
Linus Torvalds 已提交
2001

2002 2003 2004 2005
	ret = cpufreq_register_notifier(&sp->freq_transition,
					CPUFREQ_TRANSITION_NOTIFIER);
	if (unlikely(ret < 0))
		goto err_unreg;
L
Linus Torvalds 已提交
2006 2007 2008 2009 2010

#ifdef CONFIG_SH_STANDARD_BIOS
	sh_bios_gdb_detach();
#endif

2011
	return 0;
2012 2013

err_unreg:
2014
	sci_remove(dev);
2015
	return ret;
L
Linus Torvalds 已提交
2016 2017
}

2018
static int sci_suspend(struct device *dev)
L
Linus Torvalds 已提交
2019
{
2020
	struct sci_port *sport = dev_get_drvdata(dev);
2021

2022 2023
	if (sport)
		uart_suspend_port(&sci_uart_driver, &sport->port);
L
Linus Torvalds 已提交
2024

2025 2026
	return 0;
}
L
Linus Torvalds 已提交
2027

2028
static int sci_resume(struct device *dev)
2029
{
2030
	struct sci_port *sport = dev_get_drvdata(dev);
2031

2032 2033
	if (sport)
		uart_resume_port(&sci_uart_driver, &sport->port);
2034 2035 2036 2037

	return 0;
}

2038
static const struct dev_pm_ops sci_dev_pm_ops = {
2039 2040 2041 2042
	.suspend	= sci_suspend,
	.resume		= sci_resume,
};

2043 2044
static struct platform_driver sci_driver = {
	.probe		= sci_probe,
2045
	.remove		= sci_remove,
2046 2047 2048
	.driver		= {
		.name	= "sh-sci",
		.owner	= THIS_MODULE,
2049
		.pm	= &sci_dev_pm_ops,
2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071
	},
};

static int __init sci_init(void)
{
	int ret;

	printk(banner);

	ret = uart_register_driver(&sci_uart_driver);
	if (likely(ret == 0)) {
		ret = platform_driver_register(&sci_driver);
		if (unlikely(ret))
			uart_unregister_driver(&sci_uart_driver);
	}

	return ret;
}

static void __exit sci_exit(void)
{
	platform_driver_unregister(&sci_driver);
L
Linus Torvalds 已提交
2072 2073 2074
	uart_unregister_driver(&sci_uart_driver);
}

2075 2076 2077 2078
#ifdef CONFIG_SERIAL_SH_SCI_CONSOLE
early_platform_init_buffer("earlyprintk", &sci_driver,
			   early_serial_buf, ARRAY_SIZE(early_serial_buf));
#endif
L
Linus Torvalds 已提交
2079 2080 2081
module_init(sci_init);
module_exit(sci_exit);

2082
MODULE_LICENSE("GPL");
2083
MODULE_ALIAS("platform:sh-sci");