atmel_serial.c 25.7 KB
Newer Older
1
/*
2
 *  linux/drivers/char/atmel_serial.c
3
 *
4
 *  Driver for Atmel AT91 / AT32 Serial ports
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 *  Copyright (C) 2003 Rick Bronson
 *
 *  Based on drivers/char/serial_sa1100.c, by Deep Blue Solutions Ltd.
 *  Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */
#include <linux/module.h>
#include <linux/tty.h>
#include <linux/ioport.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/serial.h>
31
#include <linux/clk.h>
32 33 34
#include <linux/console.h>
#include <linux/sysrq.h>
#include <linux/tty_flip.h>
35
#include <linux/platform_device.h>
36
#include <linux/atmel_pdc.h>
37
#include <linux/atmel_serial.h>
38 39 40

#include <asm/io.h>

41
#include <asm/mach/serial_at91.h>
42
#include <asm/arch/board.h>
43

44
#ifdef CONFIG_ARM
45
#include <asm/arch/cpu.h>
46
#include <asm/arch/gpio.h>
47
#endif
48

49
#if defined(CONFIG_SERIAL_ATMEL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
50 51 52 53 54
#define SUPPORT_SYSRQ
#endif

#include <linux/serial_core.h>

55
#ifdef CONFIG_SERIAL_ATMEL_TTYAT
56 57 58 59

/* Use device name ttyAT, major 204 and minor 154-169.  This is necessary if we
 * should coexist with the 8250 driver, such as if we have an external 16C550
 * UART. */
60
#define SERIAL_ATMEL_MAJOR	204
61
#define MINOR_START		154
62
#define ATMEL_DEVICENAME	"ttyAT"
63 64 65 66 67

#else

/* Use device name ttyS, major 4, minor 64-68.  This is the usual serial port
 * name, but it is legally reserved for the 8250 driver. */
68
#define SERIAL_ATMEL_MAJOR	TTY_MAJOR
69
#define MINOR_START		64
70
#define ATMEL_DEVICENAME	"ttyS"
71 72 73

#endif

74
#define ATMEL_ISR_PASS_LIMIT	256
75

R
Remy Bohmer 已提交
76
/* UART registers. CR is write-only, hence no GET macro */
77 78 79 80 81 82 83 84 85 86 87 88 89
#define UART_PUT_CR(port,v)	__raw_writel(v, (port)->membase + ATMEL_US_CR)
#define UART_GET_MR(port)	__raw_readl((port)->membase + ATMEL_US_MR)
#define UART_PUT_MR(port,v)	__raw_writel(v, (port)->membase + ATMEL_US_MR)
#define UART_PUT_IER(port,v)	__raw_writel(v, (port)->membase + ATMEL_US_IER)
#define UART_PUT_IDR(port,v)	__raw_writel(v, (port)->membase + ATMEL_US_IDR)
#define UART_GET_IMR(port)	__raw_readl((port)->membase + ATMEL_US_IMR)
#define UART_GET_CSR(port)	__raw_readl((port)->membase + ATMEL_US_CSR)
#define UART_GET_CHAR(port)	__raw_readl((port)->membase + ATMEL_US_RHR)
#define UART_PUT_CHAR(port,v)	__raw_writel(v, (port)->membase + ATMEL_US_THR)
#define UART_GET_BRGR(port)	__raw_readl((port)->membase + ATMEL_US_BRGR)
#define UART_PUT_BRGR(port,v)	__raw_writel(v, (port)->membase + ATMEL_US_BRGR)
#define UART_PUT_RTOR(port,v)	__raw_writel(v, (port)->membase + ATMEL_US_RTOR)

90
 /* PDC registers */
91 92 93 94 95 96 97 98 99 100 101
#define UART_PUT_PTCR(port,v)	__raw_writel(v, (port)->membase + ATMEL_PDC_PTCR)
#define UART_GET_PTSR(port)	__raw_readl((port)->membase + ATMEL_PDC_PTSR)

#define UART_PUT_RPR(port,v)	__raw_writel(v, (port)->membase + ATMEL_PDC_RPR)
#define UART_GET_RPR(port)	__raw_readl((port)->membase + ATMEL_PDC_RPR)
#define UART_PUT_RCR(port,v)	__raw_writel(v, (port)->membase + ATMEL_PDC_RCR)
#define UART_PUT_RNPR(port,v)	__raw_writel(v, (port)->membase + ATMEL_PDC_RNPR)
#define UART_PUT_RNCR(port,v)	__raw_writel(v, (port)->membase + ATMEL_PDC_RNCR)

#define UART_PUT_TPR(port,v)	__raw_writel(v, (port)->membase + ATMEL_PDC_TPR)
#define UART_PUT_TCR(port,v)	__raw_writel(v, (port)->membase + ATMEL_PDC_TCR)
102

103 104
static int (*atmel_open_hook)(struct uart_port *);
static void (*atmel_close_hook)(struct uart_port *);
105

106 107 108
/*
 * We wrap our port structure around the generic uart_port.
 */
109
struct atmel_uart_port {
110 111 112
	struct uart_port	uart;		/* uart */
	struct clk		*clk;		/* uart clock */
	unsigned short		suspended;	/* is port suspended? */
113
	int			break_active;	/* break being received */
114 115
};

116
static struct atmel_uart_port atmel_ports[ATMEL_MAX_UART];
117

118
#ifdef SUPPORT_SYSRQ
119
static struct console atmel_console;
120 121 122 123 124
#endif

/*
 * Return TIOCSER_TEMT when transmitter FIFO and Shift register is empty.
 */
125
static u_int atmel_tx_empty(struct uart_port *port)
126
{
127
	return (UART_GET_CSR(port) & ATMEL_US_TXEMPTY) ? TIOCSER_TEMT : 0;
128 129 130 131 132
}

/*
 * Set state of the modem control output lines
 */
133
static void atmel_set_mctrl(struct uart_port *port, u_int mctrl)
134 135
{
	unsigned int control = 0;
136
	unsigned int mode;
137

138
#ifdef CONFIG_ARCH_AT91RM9200
139
	if (cpu_is_at91rm9200()) {
140
		/*
R
Remy Bohmer 已提交
141 142
		 * AT91RM9200 Errata #39: RTS0 is not internally connected
		 * to PA21. We need to drive the pin manually.
143
		 */
144
		if (port->mapbase == AT91RM9200_BASE_US0) {
145
			if (mctrl & TIOCM_RTS)
146
				at91_set_gpio_value(AT91_PIN_PA21, 0);
147
			else
148
				at91_set_gpio_value(AT91_PIN_PA21, 1);
149
		}
150
	}
151
#endif
152 153

	if (mctrl & TIOCM_RTS)
154
		control |= ATMEL_US_RTSEN;
155
	else
156
		control |= ATMEL_US_RTSDIS;
157 158

	if (mctrl & TIOCM_DTR)
159
		control |= ATMEL_US_DTREN;
160
	else
161
		control |= ATMEL_US_DTRDIS;
162

163 164 165
	UART_PUT_CR(port, control);

	/* Local loopback mode? */
166
	mode = UART_GET_MR(port) & ~ATMEL_US_CHMODE;
167
	if (mctrl & TIOCM_LOOP)
168
		mode |= ATMEL_US_CHMODE_LOC_LOOP;
169
	else
170
		mode |= ATMEL_US_CHMODE_NORMAL;
171
	UART_PUT_MR(port, mode);
172 173 174 175 176
}

/*
 * Get state of the modem control input lines
 */
177
static u_int atmel_get_mctrl(struct uart_port *port)
178 179 180 181 182 183 184 185
{
	unsigned int status, ret = 0;

	status = UART_GET_CSR(port);

	/*
	 * The control signals are active low.
	 */
186
	if (!(status & ATMEL_US_DCD))
187
		ret |= TIOCM_CD;
188
	if (!(status & ATMEL_US_CTS))
189
		ret |= TIOCM_CTS;
190
	if (!(status & ATMEL_US_DSR))
191
		ret |= TIOCM_DSR;
192
	if (!(status & ATMEL_US_RI))
193 194 195 196 197 198 199 200
		ret |= TIOCM_RI;

	return ret;
}

/*
 * Stop transmitting.
 */
201
static void atmel_stop_tx(struct uart_port *port)
202
{
203
	UART_PUT_IDR(port, ATMEL_US_TXRDY);
204 205 206 207 208
}

/*
 * Start transmitting.
 */
209
static void atmel_start_tx(struct uart_port *port)
210
{
211
	UART_PUT_IER(port, ATMEL_US_TXRDY);
212 213 214 215 216
}

/*
 * Stop receiving - port is in process of being closed.
 */
217
static void atmel_stop_rx(struct uart_port *port)
218
{
219
	UART_PUT_IDR(port, ATMEL_US_RXRDY);
220 221 222 223 224
}

/*
 * Enable modem status interrupts
 */
225
static void atmel_enable_ms(struct uart_port *port)
226
{
R
Remy Bohmer 已提交
227 228
	UART_PUT_IER(port, ATMEL_US_RIIC | ATMEL_US_DSRIC
			| ATMEL_US_DCDIC | ATMEL_US_CTSIC);
229 230 231 232 233
}

/*
 * Control the transmission of a break signal
 */
234
static void atmel_break_ctl(struct uart_port *port, int break_state)
235 236
{
	if (break_state != 0)
237
		UART_PUT_CR(port, ATMEL_US_STTBRK);	/* start break */
238
	else
239
		UART_PUT_CR(port, ATMEL_US_STPBRK);	/* stop break */
240 241 242 243 244
}

/*
 * Characters received (called from interrupt handler)
 */
245
static void atmel_rx_chars(struct uart_port *port)
246
{
R
Remy Bohmer 已提交
247
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;
248 249 250
	struct tty_struct *tty = port->info->tty;
	unsigned int status, ch, flg;

251
	status = UART_GET_CSR(port);
252
	while (status & ATMEL_US_RXRDY) {
253 254 255 256 257 258 259 260 261 262
		ch = UART_GET_CHAR(port);

		port->icount.rx++;

		flg = TTY_NORMAL;

		/*
		 * note that the error handling code is
		 * out of the main execution path
		 */
263 264 265
		if (unlikely(status & (ATMEL_US_PARE | ATMEL_US_FRAME
				       | ATMEL_US_OVRE | ATMEL_US_RXBRK)
			     || atmel_port->break_active)) {
R
Remy Bohmer 已提交
266 267
			/* clear error */
			UART_PUT_CR(port, ATMEL_US_RSTSTA);
268 269
			if (status & ATMEL_US_RXBRK
			    && !atmel_port->break_active) {
R
Remy Bohmer 已提交
270 271
				/* ignore side-effect */
				status &= ~(ATMEL_US_PARE | ATMEL_US_FRAME);
272
				port->icount.brk++;
273 274
				atmel_port->break_active = 1;
				UART_PUT_IER(port, ATMEL_US_RXBRK);
275 276
				if (uart_handle_break(port))
					goto ignore_char;
277 278 279 280 281 282 283 284 285 286 287
			} else {
				/*
				 * This is either the end-of-break
				 * condition or we've received at
				 * least one character without RXBRK
				 * being set. In both cases, the next
				 * RXBRK will indicate start-of-break.
				 */
				UART_PUT_IDR(port, ATMEL_US_RXBRK);
				status &= ~ATMEL_US_RXBRK;
				atmel_port->break_active = 0;
288
			}
289
			if (status & ATMEL_US_PARE)
290
				port->icount.parity++;
291
			if (status & ATMEL_US_FRAME)
292
				port->icount.frame++;
293
			if (status & ATMEL_US_OVRE)
294 295
				port->icount.overrun++;

296 297
			status &= port->read_status_mask;

298
			if (status & ATMEL_US_RXBRK)
299
				flg = TTY_BREAK;
300
			else if (status & ATMEL_US_PARE)
301
				flg = TTY_PARITY;
302
			else if (status & ATMEL_US_FRAME)
303 304 305
				flg = TTY_FRAME;
		}

306
		if (uart_handle_sysrq_char(port, ch))
307 308
			goto ignore_char;

309
		uart_insert_char(port, status, ATMEL_US_OVRE, ch, flg);
310

R
Remy Bohmer 已提交
311
ignore_char:
312
		status = UART_GET_CSR(port);
313 314 315 316 317 318 319 320
	}

	tty_flip_buffer_push(tty);
}

/*
 * Transmit characters (called from interrupt handler)
 */
321
static void atmel_tx_chars(struct uart_port *port)
322 323 324 325 326 327 328 329 330 331
{
	struct circ_buf *xmit = &port->info->xmit;

	if (port->x_char) {
		UART_PUT_CHAR(port, port->x_char);
		port->icount.tx++;
		port->x_char = 0;
		return;
	}
	if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
332
		atmel_stop_tx(port);
333 334 335
		return;
	}

336
	while (UART_GET_CSR(port) & ATMEL_US_TXRDY) {
337 338 339 340 341 342 343 344 345 346 347
		UART_PUT_CHAR(port, xmit->buf[xmit->tail]);
		xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
		port->icount.tx++;
		if (uart_circ_empty(xmit))
			break;
	}

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

	if (uart_circ_empty(xmit))
348
		atmel_stop_tx(port);
349 350
}

R
Remy Bohmer 已提交
351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404
/*
 * receive interrupt handler.
 */
static void
atmel_handle_receive(struct uart_port *port, unsigned int pending)
{
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;

	/* Interrupt receive */
	if (pending & ATMEL_US_RXRDY)
		atmel_rx_chars(port);
	else if (pending & ATMEL_US_RXBRK) {
		/*
		 * End of break detected. If it came along with a
		 * character, atmel_rx_chars will handle it.
		 */
		UART_PUT_CR(port, ATMEL_US_RSTSTA);
		UART_PUT_IDR(port, ATMEL_US_RXBRK);
		atmel_port->break_active = 0;
	}
}

/*
 * transmit interrupt handler.
 */
static void
atmel_handle_transmit(struct uart_port *port, unsigned int pending)
{
	/* Interrupt transmit */
	if (pending & ATMEL_US_TXRDY)
		atmel_tx_chars(port);
}

/*
 * status flags interrupt handler.
 */
static void
atmel_handle_status(struct uart_port *port, unsigned int pending,
		    unsigned int status)
{
	/* TODO: All reads to CSR will clear these interrupts! */
	if (pending & ATMEL_US_RIIC)
		port->icount.rng++;
	if (pending & ATMEL_US_DSRIC)
		port->icount.dsr++;
	if (pending & ATMEL_US_DCDIC)
		uart_handle_dcd_change(port, !(status & ATMEL_US_DCD));
	if (pending & ATMEL_US_CTSIC)
		uart_handle_cts_change(port, !(status & ATMEL_US_CTS));
	if (pending & (ATMEL_US_RIIC | ATMEL_US_DSRIC | ATMEL_US_DCDIC
				| ATMEL_US_CTSIC))
		wake_up_interruptible(&port->info->delta_msr_wait);
}

405 406 407
/*
 * Interrupt handler
 */
408
static irqreturn_t atmel_interrupt(int irq, void *dev_id)
409 410 411 412 413
{
	struct uart_port *port = dev_id;
	unsigned int status, pending, pass_counter = 0;

	status = UART_GET_CSR(port);
414 415
	pending = status & UART_GET_IMR(port);
	while (pending) {
R
Remy Bohmer 已提交
416 417 418
		atmel_handle_receive(port, pending);
		atmel_handle_status(port, pending, status);
		atmel_handle_transmit(port, pending);
419

420
		if (pass_counter++ > ATMEL_ISR_PASS_LIMIT)
421
			break;
422

423 424
		status = UART_GET_CSR(port);
		pending = status & UART_GET_IMR(port);
425 426 427 428 429 430 431
	}
	return IRQ_HANDLED;
}

/*
 * Perform initialization and enable port for reception
 */
432
static int atmel_startup(struct uart_port *port)
433 434 435 436 437 438 439 440 441 442 443 444 445
{
	int retval;

	/*
	 * Ensure that no interrupts are enabled otherwise when
	 * request_irq() is called we could get stuck trying to
	 * handle an unexpected interrupt
	 */
	UART_PUT_IDR(port, -1);

	/*
	 * Allocate the IRQ
	 */
R
Remy Bohmer 已提交
446 447
	retval = request_irq(port->irq, atmel_interrupt, IRQF_SHARED,
			"atmel_serial", port);
448
	if (retval) {
449
		printk("atmel_serial: atmel_startup - Can't get irq\n");
450 451 452 453 454 455 456
		return retval;
	}

	/*
	 * If there is a specific "open" function (to register
	 * control line interrupts)
	 */
457 458
	if (atmel_open_hook) {
		retval = atmel_open_hook(port);
459 460 461 462 463 464 465 466 467
		if (retval) {
			free_irq(port->irq, port);
			return retval;
		}
	}

	/*
	 * Finally, enable the serial port
	 */
468
	UART_PUT_CR(port, ATMEL_US_RSTSTA | ATMEL_US_RSTRX);
R
Remy Bohmer 已提交
469 470
	/* enable xmit & rcvr */
	UART_PUT_CR(port, ATMEL_US_TXEN | ATMEL_US_RXEN);
471

R
Remy Bohmer 已提交
472 473
	/* enable receive only */
	UART_PUT_IER(port, ATMEL_US_RXRDY);
474

475 476 477 478 479 480
	return 0;
}

/*
 * Disable the port
 */
481
static void atmel_shutdown(struct uart_port *port)
482 483 484 485
{
	/*
	 * Disable all interrupts, port and break condition.
	 */
486
	UART_PUT_CR(port, ATMEL_US_RSTSTA);
487 488 489 490 491 492 493 494 495 496 497
	UART_PUT_IDR(port, -1);

	/*
	 * Free the interrupt
	 */
	free_irq(port->irq, port);

	/*
	 * If there is a specific "close" function (to unregister
	 * control line interrupts)
	 */
498 499
	if (atmel_close_hook)
		atmel_close_hook(port);
500 501 502 503 504
}

/*
 * Power / Clock management.
 */
R
Remy Bohmer 已提交
505 506
static void atmel_serial_pm(struct uart_port *port, unsigned int state,
			    unsigned int oldstate)
507
{
R
Remy Bohmer 已提交
508
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;
509

510
	switch (state) {
R
Remy Bohmer 已提交
511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526
	case 0:
		/*
		 * Enable the peripheral clock for this serial port.
		 * This is called on uart_open() or a resume event.
		 */
		clk_enable(atmel_port->clk);
		break;
	case 3:
		/*
		 * Disable the peripheral clock for this serial port.
		 * This is called on uart_close() or a suspend event.
		 */
		clk_disable(atmel_port->clk);
		break;
	default:
		printk(KERN_ERR "atmel_serial: unknown pm %d\n", state);
527 528 529 530 531 532
	}
}

/*
 * Change the port parameters
 */
R
Remy Bohmer 已提交
533 534
static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
			      struct ktermios *old)
535 536 537 538
{
	unsigned long flags;
	unsigned int mode, imr, quot, baud;

539
	/* Get current mode register */
R
Remy Bohmer 已提交
540 541
	mode = UART_GET_MR(port) & ~(ATMEL_US_USCLKS | ATMEL_US_CHRL
					| ATMEL_US_NBSTOP | ATMEL_US_PAR);
542

R
Remy Bohmer 已提交
543
	baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16);
544 545
	quot = uart_get_divisor(port, baud);

R
Remy Bohmer 已提交
546
	if (quot > 65535) {	/* BRGR is 16-bit, so switch to slower clock */
547 548 549
		quot /= 8;
		mode |= ATMEL_US_USCLKS_MCK_DIV8;
	}
550 551 552 553

	/* byte size */
	switch (termios->c_cflag & CSIZE) {
	case CS5:
554
		mode |= ATMEL_US_CHRL_5;
555 556
		break;
	case CS6:
557
		mode |= ATMEL_US_CHRL_6;
558 559
		break;
	case CS7:
560
		mode |= ATMEL_US_CHRL_7;
561 562
		break;
	default:
563
		mode |= ATMEL_US_CHRL_8;
564 565 566 567 568
		break;
	}

	/* stop bits */
	if (termios->c_cflag & CSTOPB)
569
		mode |= ATMEL_US_NBSTOP_2;
570 571 572

	/* parity */
	if (termios->c_cflag & PARENB) {
R
Remy Bohmer 已提交
573 574
		/* Mark or Space parity */
		if (termios->c_cflag & CMSPAR) {
575
			if (termios->c_cflag & PARODD)
576
				mode |= ATMEL_US_PAR_MARK;
577
			else
578
				mode |= ATMEL_US_PAR_SPACE;
R
Remy Bohmer 已提交
579
		} else if (termios->c_cflag & PARODD)
580
			mode |= ATMEL_US_PAR_ODD;
581
		else
582
			mode |= ATMEL_US_PAR_EVEN;
R
Remy Bohmer 已提交
583
	} else
584
		mode |= ATMEL_US_PAR_NONE;
585 586 587

	spin_lock_irqsave(&port->lock, flags);

588
	port->read_status_mask = ATMEL_US_OVRE;
589
	if (termios->c_iflag & INPCK)
590
		port->read_status_mask |= (ATMEL_US_FRAME | ATMEL_US_PARE);
591
	if (termios->c_iflag & (BRKINT | PARMRK))
592
		port->read_status_mask |= ATMEL_US_RXBRK;
593 594 595 596 597 598

	/*
	 * Characters to ignore
	 */
	port->ignore_status_mask = 0;
	if (termios->c_iflag & IGNPAR)
599
		port->ignore_status_mask |= (ATMEL_US_FRAME | ATMEL_US_PARE);
600
	if (termios->c_iflag & IGNBRK) {
601
		port->ignore_status_mask |= ATMEL_US_RXBRK;
602 603 604 605 606
		/*
		 * If we're ignoring parity and break indicators,
		 * ignore overruns too (for real raw support).
		 */
		if (termios->c_iflag & IGNPAR)
607
			port->ignore_status_mask |= ATMEL_US_OVRE;
608
	}
R
Remy Bohmer 已提交
609
	/* TODO: Ignore all characters if CREAD is set.*/
610 611 612 613

	/* update the per-port timeout */
	uart_update_timeout(port, termios->c_cflag, baud);

R
Remy Bohmer 已提交
614 615 616 617
	/* save/disable interrupts and drain transmitter */
	imr = UART_GET_IMR(port);
	UART_PUT_IDR(port, -1);
	while (!(UART_GET_CSR(port) & ATMEL_US_TXEMPTY))
618
		cpu_relax();
619 620

	/* disable receiver and transmitter */
621
	UART_PUT_CR(port, ATMEL_US_TXDIS | ATMEL_US_RXDIS);
622 623 624 625 626 627

	/* set the parity, stop bits and data size */
	UART_PUT_MR(port, mode);

	/* set the baud rate */
	UART_PUT_BRGR(port, quot);
628 629
	UART_PUT_CR(port, ATMEL_US_RSTSTA | ATMEL_US_RSTRX);
	UART_PUT_CR(port, ATMEL_US_TXEN | ATMEL_US_RXEN);
630 631 632 633 634 635 636 637 638 639 640 641 642 643

	/* restore interrupts */
	UART_PUT_IER(port, imr);

	/* CTS flow-control and modem-status interrupts */
	if (UART_ENABLE_MS(port, termios->c_cflag))
		port->ops->enable_ms(port);

	spin_unlock_irqrestore(&port->lock, flags);
}

/*
 * Return string describing the specified port
 */
644
static const char *atmel_type(struct uart_port *port)
645
{
646
	return (port->type == PORT_ATMEL) ? "ATMEL_SERIAL" : NULL;
647 648 649 650 651
}

/*
 * Release the memory region(s) being used by 'port'.
 */
652
static void atmel_release_port(struct uart_port *port)
653
{
654 655 656 657 658 659 660 661 662
	struct platform_device *pdev = to_platform_device(port->dev);
	int size = pdev->resource[0].end - pdev->resource[0].start + 1;

	release_mem_region(port->mapbase, size);

	if (port->flags & UPF_IOREMAP) {
		iounmap(port->membase);
		port->membase = NULL;
	}
663 664 665 666 667
}

/*
 * Request the memory region(s) being used by 'port'.
 */
668
static int atmel_request_port(struct uart_port *port)
669
{
670 671 672
	struct platform_device *pdev = to_platform_device(port->dev);
	int size = pdev->resource[0].end - pdev->resource[0].start + 1;

673
	if (!request_mem_region(port->mapbase, size, "atmel_serial"))
674 675 676 677 678 679 680 681 682
		return -EBUSY;

	if (port->flags & UPF_IOREMAP) {
		port->membase = ioremap(port->mapbase, size);
		if (port->membase == NULL) {
			release_mem_region(port->mapbase, size);
			return -ENOMEM;
		}
	}
683

684
	return 0;
685 686 687 688 689
}

/*
 * Configure/autoconfigure the port.
 */
690
static void atmel_config_port(struct uart_port *port, int flags)
691 692
{
	if (flags & UART_CONFIG_TYPE) {
693
		port->type = PORT_ATMEL;
694
		atmel_request_port(port);
695 696 697 698 699 700
	}
}

/*
 * Verify the new serial_struct (for TIOCSSERIAL).
 */
701
static int atmel_verify_port(struct uart_port *port, struct serial_struct *ser)
702 703
{
	int ret = 0;
704
	if (ser->type != PORT_UNKNOWN && ser->type != PORT_ATMEL)
705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720
		ret = -EINVAL;
	if (port->irq != ser->irq)
		ret = -EINVAL;
	if (ser->io_type != SERIAL_IO_MEM)
		ret = -EINVAL;
	if (port->uartclk / 16 != ser->baud_base)
		ret = -EINVAL;
	if ((void *)port->mapbase != ser->iomem_base)
		ret = -EINVAL;
	if (port->iobase != ser->port)
		ret = -EINVAL;
	if (ser->hub6 != 0)
		ret = -EINVAL;
	return ret;
}

721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738
static struct uart_ops atmel_pops = {
	.tx_empty	= atmel_tx_empty,
	.set_mctrl	= atmel_set_mctrl,
	.get_mctrl	= atmel_get_mctrl,
	.stop_tx	= atmel_stop_tx,
	.start_tx	= atmel_start_tx,
	.stop_rx	= atmel_stop_rx,
	.enable_ms	= atmel_enable_ms,
	.break_ctl	= atmel_break_ctl,
	.startup	= atmel_startup,
	.shutdown	= atmel_shutdown,
	.set_termios	= atmel_set_termios,
	.type		= atmel_type,
	.release_port	= atmel_release_port,
	.request_port	= atmel_request_port,
	.config_port	= atmel_config_port,
	.verify_port	= atmel_verify_port,
	.pm		= atmel_serial_pm,
739 740
};

741 742 743
/*
 * Configure the port from the platform device resource info.
 */
R
Remy Bohmer 已提交
744 745
static void __devinit atmel_init_port(struct atmel_uart_port *atmel_port,
				      struct platform_device *pdev)
746
{
747
	struct uart_port *port = &atmel_port->uart;
748
	struct atmel_uart_data *data = pdev->dev.platform_data;
749 750

	port->iotype	= UPIO_MEM;
751
	port->flags	= UPF_BOOT_AUTOCONF;
752
	port->ops	= &atmel_pops;
753
	port->fifosize	= 1;
754 755 756 757 758 759
	port->line	= pdev->id;
	port->dev	= &pdev->dev;

	port->mapbase	= pdev->resource[0].start;
	port->irq	= pdev->resource[1].start;

760 761 762
	if (data->regs)
		/* Already mapped by setup code */
		port->membase = data->regs;
763 764 765 766
	else {
		port->flags	|= UPF_IOREMAP;
		port->membase	= NULL;
	}
767

R
Remy Bohmer 已提交
768 769
	/* for console, the clock could already be configured */
	if (!atmel_port->clk) {
770 771 772
		atmel_port->clk = clk_get(&pdev->dev, "usart");
		clk_enable(atmel_port->clk);
		port->uartclk = clk_get_rate(atmel_port->clk);
773
	}
774 775
}

776 777 778
/*
 * Register board-specific modem-control line handlers.
 */
779
void __init atmel_register_uart_fns(struct atmel_port_fns *fns)
780 781
{
	if (fns->enable_ms)
782
		atmel_pops.enable_ms = fns->enable_ms;
783
	if (fns->get_mctrl)
784
		atmel_pops.get_mctrl = fns->get_mctrl;
785
	if (fns->set_mctrl)
786
		atmel_pops.set_mctrl = fns->set_mctrl;
787 788
	atmel_open_hook		= fns->open;
	atmel_close_hook	= fns->close;
789 790
	atmel_pops.pm		= fns->pm;
	atmel_pops.set_wake	= fns->set_wake;
791 792
}

793
#ifdef CONFIG_SERIAL_ATMEL_CONSOLE
794
static void atmel_console_putchar(struct uart_port *port, int ch)
795
{
796
	while (!(UART_GET_CSR(port) & ATMEL_US_TXRDY))
797
		cpu_relax();
798 799
	UART_PUT_CHAR(port, ch);
}
800 801 802 803

/*
 * Interrupts are disabled on entering
 */
804
static void atmel_console_write(struct console *co, const char *s, u_int count)
805
{
806
	struct uart_port *port = &atmel_ports[co->index].uart;
807
	unsigned int status, imr;
808 809

	/*
R
Remy Bohmer 已提交
810
	 * First, save IMR and then disable interrupts
811
	 */
R
Remy Bohmer 已提交
812
	imr = UART_GET_IMR(port);
813
	UART_PUT_IDR(port, ATMEL_US_RXRDY | ATMEL_US_TXRDY);
814

815
	uart_console_write(port, s, count, atmel_console_putchar);
816 817

	/*
R
Remy Bohmer 已提交
818 819
	 * Finally, wait for transmitter to become empty
	 * and restore IMR
820 821 822
	 */
	do {
		status = UART_GET_CSR(port);
823
	} while (!(status & ATMEL_US_TXRDY));
R
Remy Bohmer 已提交
824 825
	/* set interrupts back the way they were */
	UART_PUT_IER(port, imr);
826 827 828
}

/*
R
Remy Bohmer 已提交
829 830
 * If the port was already initialised (eg, by a boot loader),
 * try to determine the current setup.
831
 */
R
Remy Bohmer 已提交
832 833
static void __init atmel_console_get_options(struct uart_port *port, int *baud,
					     int *parity, int *bits)
834 835 836 837 838 839
{
	unsigned int mr, quot;

// TODO: CR is a write-only register
//	unsigned int cr;
//
840 841
//	cr = UART_GET_CR(port) & (ATMEL_US_RXEN | ATMEL_US_TXEN);
//	if (cr == (ATMEL_US_RXEN | ATMEL_US_TXEN)) {
842 843 844
//		/* ok, the port was enabled */
//	}

845 846
	mr = UART_GET_MR(port) & ATMEL_US_CHRL;
	if (mr == ATMEL_US_CHRL_8)
847 848 849 850
		*bits = 8;
	else
		*bits = 7;

851 852
	mr = UART_GET_MR(port) & ATMEL_US_PAR;
	if (mr == ATMEL_US_PAR_EVEN)
853
		*parity = 'e';
854
	else if (mr == ATMEL_US_PAR_ODD)
855 856
		*parity = 'o';

857 858 859 860 861 862
	/*
	 * The serial core only rounds down when matching this to a
	 * supported baud rate. Make sure we don't end up slightly
	 * lower than one of those, as it would make us fall through
	 * to a much lower baud rate than we really want.
	 */
863
	quot = UART_GET_BRGR(port);
864
	*baud = port->uartclk / (16 * (quot - 1));
865 866
}

867
static int __init atmel_console_setup(struct console *co, char *options)
868
{
869
	struct uart_port *port = &atmel_ports[co->index].uart;
870 871 872 873 874
	int baud = 115200;
	int bits = 8;
	int parity = 'n';
	int flow = 'n';

R
Remy Bohmer 已提交
875 876
	if (port->membase == NULL) {
		/* Port not initialized yet - delay setup */
877
		return -ENODEV;
R
Remy Bohmer 已提交
878
	}
879

R
Remy Bohmer 已提交
880
	UART_PUT_IDR(port, -1);
881 882
	UART_PUT_CR(port, ATMEL_US_RSTSTA | ATMEL_US_RSTRX);
	UART_PUT_CR(port, ATMEL_US_TXEN | ATMEL_US_RXEN);
883 884 885 886

	if (options)
		uart_parse_options(options, &baud, &parity, &bits, &flow);
	else
887
		atmel_console_get_options(port, &baud, &parity, &bits);
888 889 890 891

	return uart_set_options(port, co, baud, parity, bits, flow);
}

892
static struct uart_driver atmel_uart;
893

894 895 896
static struct console atmel_console = {
	.name		= ATMEL_DEVICENAME,
	.write		= atmel_console_write,
897
	.device		= uart_console_device,
898
	.setup		= atmel_console_setup,
899 900
	.flags		= CON_PRINTBUFFER,
	.index		= -1,
901
	.data		= &atmel_uart,
902 903
};

904
#define ATMEL_CONSOLE_DEVICE	&atmel_console
905

906 907 908
/*
 * Early console initialization (before VM subsystem initialized).
 */
909
static int __init atmel_console_init(void)
910
{
911
	if (atmel_default_console_device) {
R
Remy Bohmer 已提交
912 913 914 915
		add_preferred_console(ATMEL_DEVICENAME,
				      atmel_default_console_device->id, NULL);
		atmel_init_port(&atmel_ports[atmel_default_console_device->id],
				atmel_default_console_device);
916
		register_console(&atmel_console);
917
	}
918 919 920

	return 0;
}
R
Remy Bohmer 已提交
921

922
console_initcall(atmel_console_init);
923

924 925 926
/*
 * Late console initialization.
 */
927
static int __init atmel_late_console_init(void)
928
{
R
Remy Bohmer 已提交
929 930
	if (atmel_default_console_device
	    && !(atmel_console.flags & CON_ENABLED))
931
		register_console(&atmel_console);
932 933 934

	return 0;
}
R
Remy Bohmer 已提交
935

936
core_initcall(atmel_late_console_init);
937

938
#else
939
#define ATMEL_CONSOLE_DEVICE	NULL
940 941
#endif

942
static struct uart_driver atmel_uart = {
R
Remy Bohmer 已提交
943 944 945 946 947 948 949
	.owner		= THIS_MODULE,
	.driver_name	= "atmel_serial",
	.dev_name	= ATMEL_DEVICENAME,
	.major		= SERIAL_ATMEL_MAJOR,
	.minor		= MINOR_START,
	.nr		= ATMEL_MAX_UART,
	.cons		= ATMEL_CONSOLE_DEVICE,
950 951
};

952
#ifdef CONFIG_PM
R
Remy Bohmer 已提交
953 954
static int atmel_serial_suspend(struct platform_device *pdev,
				pm_message_t state)
955
{
956
	struct uart_port *port = platform_get_drvdata(pdev);
R
Remy Bohmer 已提交
957
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;
958

R
Remy Bohmer 已提交
959 960
	if (device_may_wakeup(&pdev->dev)
	    && !at91_suspend_entering_slow_clock())
961 962
		enable_irq_wake(port->irq);
	else {
963 964
		uart_suspend_port(&atmel_uart, port);
		atmel_port->suspended = 1;
965
	}
966

967 968
	return 0;
}
969

970
static int atmel_serial_resume(struct platform_device *pdev)
971 972
{
	struct uart_port *port = platform_get_drvdata(pdev);
R
Remy Bohmer 已提交
973
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;
974

975 976 977
	if (atmel_port->suspended) {
		uart_resume_port(&atmel_uart, port);
		atmel_port->suspended = 0;
R
Remy Bohmer 已提交
978
	} else
979
		disable_irq_wake(port->irq);
980 981 982

	return 0;
}
983
#else
984 985
#define atmel_serial_suspend NULL
#define atmel_serial_resume NULL
986
#endif
987

988
static int __devinit atmel_serial_probe(struct platform_device *pdev)
989
{
990
	struct atmel_uart_port *port;
991
	int ret;
992

993 994
	port = &atmel_ports[pdev->id];
	atmel_init_port(port, pdev);
995

996
	ret = uart_add_one_port(&atmel_uart, &port->uart);
997 998 999 1000 1001 1002 1003 1004
	if (!ret) {
		device_init_wakeup(&pdev->dev, 1);
		platform_set_drvdata(pdev, port);
	}

	return ret;
}

1005
static int __devexit atmel_serial_remove(struct platform_device *pdev)
1006 1007
{
	struct uart_port *port = platform_get_drvdata(pdev);
R
Remy Bohmer 已提交
1008
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;
1009 1010
	int ret = 0;

1011 1012
	clk_disable(atmel_port->clk);
	clk_put(atmel_port->clk);
1013 1014 1015 1016 1017

	device_init_wakeup(&pdev->dev, 0);
	platform_set_drvdata(pdev, NULL);

	if (port) {
1018
		ret = uart_remove_one_port(&atmel_uart, port);
1019 1020 1021 1022 1023 1024
		kfree(port);
	}

	return ret;
}

1025 1026 1027 1028 1029
static struct platform_driver atmel_serial_driver = {
	.probe		= atmel_serial_probe,
	.remove		= __devexit_p(atmel_serial_remove),
	.suspend	= atmel_serial_suspend,
	.resume		= atmel_serial_resume,
1030
	.driver		= {
1031
		.name	= "atmel_usart",
1032 1033 1034 1035
		.owner	= THIS_MODULE,
	},
};

1036
static int __init atmel_serial_init(void)
1037 1038 1039
{
	int ret;

1040
	ret = uart_register_driver(&atmel_uart);
1041 1042 1043
	if (ret)
		return ret;

1044
	ret = platform_driver_register(&atmel_serial_driver);
1045
	if (ret)
1046
		uart_unregister_driver(&atmel_uart);
1047 1048 1049 1050

	return ret;
}

1051
static void __exit atmel_serial_exit(void)
1052
{
1053 1054
	platform_driver_unregister(&atmel_serial_driver);
	uart_unregister_driver(&atmel_uart);
1055 1056
}

1057 1058
module_init(atmel_serial_init);
module_exit(atmel_serial_exit);
1059 1060

MODULE_AUTHOR("Rick Bronson");
1061
MODULE_DESCRIPTION("Atmel AT91 / AT32 serial port driver");
1062
MODULE_LICENSE("GPL");