atmel_serial.c 29.2 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 109 110 111 112
struct atmel_uart_char {
	u16		status;
	u16		ch;
};

#define ATMEL_SERIAL_RINGSIZE 1024

113 114 115
/*
 * We wrap our port structure around the generic uart_port.
 */
116
struct atmel_uart_port {
117 118 119
	struct uart_port	uart;		/* uart */
	struct clk		*clk;		/* uart clock */
	unsigned short		suspended;	/* is port suspended? */
120
	int			break_active;	/* break being received */
121 122 123 124 125 126

	struct tasklet_struct	tasklet;
	unsigned int		irq_status;
	unsigned int		irq_status_prev;

	struct circ_buf		rx_ring;
127 128
};

129
static struct atmel_uart_port atmel_ports[ATMEL_MAX_UART];
130

131
#ifdef SUPPORT_SYSRQ
132
static struct console atmel_console;
133 134 135 136 137
#endif

/*
 * Return TIOCSER_TEMT when transmitter FIFO and Shift register is empty.
 */
138
static u_int atmel_tx_empty(struct uart_port *port)
139
{
140
	return (UART_GET_CSR(port) & ATMEL_US_TXEMPTY) ? TIOCSER_TEMT : 0;
141 142 143 144 145
}

/*
 * Set state of the modem control output lines
 */
146
static void atmel_set_mctrl(struct uart_port *port, u_int mctrl)
147 148
{
	unsigned int control = 0;
149
	unsigned int mode;
150

151
#ifdef CONFIG_ARCH_AT91RM9200
152
	if (cpu_is_at91rm9200()) {
153
		/*
R
Remy Bohmer 已提交
154 155
		 * AT91RM9200 Errata #39: RTS0 is not internally connected
		 * to PA21. We need to drive the pin manually.
156
		 */
157
		if (port->mapbase == AT91RM9200_BASE_US0) {
158
			if (mctrl & TIOCM_RTS)
159
				at91_set_gpio_value(AT91_PIN_PA21, 0);
160
			else
161
				at91_set_gpio_value(AT91_PIN_PA21, 1);
162
		}
163
	}
164
#endif
165 166

	if (mctrl & TIOCM_RTS)
167
		control |= ATMEL_US_RTSEN;
168
	else
169
		control |= ATMEL_US_RTSDIS;
170 171

	if (mctrl & TIOCM_DTR)
172
		control |= ATMEL_US_DTREN;
173
	else
174
		control |= ATMEL_US_DTRDIS;
175

176 177 178
	UART_PUT_CR(port, control);

	/* Local loopback mode? */
179
	mode = UART_GET_MR(port) & ~ATMEL_US_CHMODE;
180
	if (mctrl & TIOCM_LOOP)
181
		mode |= ATMEL_US_CHMODE_LOC_LOOP;
182
	else
183
		mode |= ATMEL_US_CHMODE_NORMAL;
184
	UART_PUT_MR(port, mode);
185 186 187 188 189
}

/*
 * Get state of the modem control input lines
 */
190
static u_int atmel_get_mctrl(struct uart_port *port)
191 192 193 194 195 196 197 198
{
	unsigned int status, ret = 0;

	status = UART_GET_CSR(port);

	/*
	 * The control signals are active low.
	 */
199
	if (!(status & ATMEL_US_DCD))
200
		ret |= TIOCM_CD;
201
	if (!(status & ATMEL_US_CTS))
202
		ret |= TIOCM_CTS;
203
	if (!(status & ATMEL_US_DSR))
204
		ret |= TIOCM_DSR;
205
	if (!(status & ATMEL_US_RI))
206 207 208 209 210 211 212 213
		ret |= TIOCM_RI;

	return ret;
}

/*
 * Stop transmitting.
 */
214
static void atmel_stop_tx(struct uart_port *port)
215
{
216
	UART_PUT_IDR(port, ATMEL_US_TXRDY);
217 218 219 220 221
}

/*
 * Start transmitting.
 */
222
static void atmel_start_tx(struct uart_port *port)
223
{
224
	UART_PUT_IER(port, ATMEL_US_TXRDY);
225 226 227 228 229
}

/*
 * Stop receiving - port is in process of being closed.
 */
230
static void atmel_stop_rx(struct uart_port *port)
231
{
232
	UART_PUT_IDR(port, ATMEL_US_RXRDY);
233 234 235 236 237
}

/*
 * Enable modem status interrupts
 */
238
static void atmel_enable_ms(struct uart_port *port)
239
{
R
Remy Bohmer 已提交
240 241
	UART_PUT_IER(port, ATMEL_US_RIIC | ATMEL_US_DSRIC
			| ATMEL_US_DCDIC | ATMEL_US_CTSIC);
242 243 244 245 246
}

/*
 * Control the transmission of a break signal
 */
247
static void atmel_break_ctl(struct uart_port *port, int break_state)
248 249
{
	if (break_state != 0)
250
		UART_PUT_CR(port, ATMEL_US_STTBRK);	/* start break */
251
	else
252
		UART_PUT_CR(port, ATMEL_US_STPBRK);	/* stop break */
253 254
}

255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
/*
 * Stores the incoming character in the ring buffer
 */
static void
atmel_buffer_rx_char(struct uart_port *port, unsigned int status,
		     unsigned int ch)
{
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;
	struct circ_buf *ring = &atmel_port->rx_ring;
	struct atmel_uart_char *c;

	if (!CIRC_SPACE(ring->head, ring->tail, ATMEL_SERIAL_RINGSIZE))
		/* Buffer overflow, ignore char */
		return;

	c = &((struct atmel_uart_char *)ring->buf)[ring->head];
	c->status	= status;
	c->ch		= ch;

	/* Make sure the character is stored before we update head. */
	smp_wmb();

	ring->head = (ring->head + 1) & (ATMEL_SERIAL_RINGSIZE - 1);
}

280 281 282
/*
 * Characters received (called from interrupt handler)
 */
283
static void atmel_rx_chars(struct uart_port *port)
284
{
R
Remy Bohmer 已提交
285
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;
286
	unsigned int status, ch;
287

288
	status = UART_GET_CSR(port);
289
	while (status & ATMEL_US_RXRDY) {
290 291 292 293 294 295
		ch = UART_GET_CHAR(port);

		/*
		 * note that the error handling code is
		 * out of the main execution path
		 */
296 297 298
		if (unlikely(status & (ATMEL_US_PARE | ATMEL_US_FRAME
				       | ATMEL_US_OVRE | ATMEL_US_RXBRK)
			     || atmel_port->break_active)) {
299

R
Remy Bohmer 已提交
300 301
			/* clear error */
			UART_PUT_CR(port, ATMEL_US_RSTSTA);
302

303 304 305 306 307 308 309 310 311 312 313 314 315 316 317
			if (status & ATMEL_US_RXBRK
			    && !atmel_port->break_active) {
				atmel_port->break_active = 1;
				UART_PUT_IER(port, ATMEL_US_RXBRK);
			} 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;
318
			}
319 320
		}

321
		atmel_buffer_rx_char(port, status, ch);
322
		status = UART_GET_CSR(port);
323 324
	}

325
	tasklet_schedule(&atmel_port->tasklet);
326 327 328
}

/*
329 330
 * Transmit characters (called from tasklet with TXRDY interrupt
 * disabled)
331
 */
332
static void atmel_tx_chars(struct uart_port *port)
333 334 335
{
	struct circ_buf *xmit = &port->info->xmit;

336
	if (port->x_char && UART_GET_CSR(port) & ATMEL_US_TXRDY) {
337 338 339 340
		UART_PUT_CHAR(port, port->x_char);
		port->icount.tx++;
		port->x_char = 0;
	}
341
	if (uart_circ_empty(xmit) || uart_tx_stopped(port))
342 343
		return;

344
	while (UART_GET_CSR(port) & ATMEL_US_TXRDY) {
345 346 347 348 349 350 351 352 353 354
		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);

355 356
	if (!uart_circ_empty(xmit))
		UART_PUT_IER(port, ATMEL_US_TXRDY);
357 358
}

R
Remy Bohmer 已提交
359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381
/*
 * 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;
	}
}

/*
382
 * transmit interrupt handler. (Transmit is IRQF_NODELAY safe)
R
Remy Bohmer 已提交
383 384 385 386
 */
static void
atmel_handle_transmit(struct uart_port *port, unsigned int pending)
{
387 388
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;

R
Remy Bohmer 已提交
389
	/* Interrupt transmit */
390 391 392 393
	if (pending & ATMEL_US_TXRDY) {
		UART_PUT_IDR(port, ATMEL_US_TXRDY);
		tasklet_schedule(&atmel_port->tasklet);
	}
R
Remy Bohmer 已提交
394 395 396 397 398 399 400 401 402
}

/*
 * status flags interrupt handler.
 */
static void
atmel_handle_status(struct uart_port *port, unsigned int pending,
		    unsigned int status)
{
403 404
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;

R
Remy Bohmer 已提交
405
	if (pending & (ATMEL_US_RIIC | ATMEL_US_DSRIC | ATMEL_US_DCDIC
406 407 408 409
				| ATMEL_US_CTSIC)) {
		atmel_port->irq_status = status;
		tasklet_schedule(&atmel_port->tasklet);
	}
R
Remy Bohmer 已提交
410 411
}

412 413 414
/*
 * Interrupt handler
 */
415
static irqreturn_t atmel_interrupt(int irq, void *dev_id)
416 417 418 419 420
{
	struct uart_port *port = dev_id;
	unsigned int status, pending, pass_counter = 0;

	status = UART_GET_CSR(port);
421 422
	pending = status & UART_GET_IMR(port);
	while (pending) {
R
Remy Bohmer 已提交
423 424 425
		atmel_handle_receive(port, pending);
		atmel_handle_status(port, pending, status);
		atmel_handle_transmit(port, pending);
426

427
		if (pass_counter++ > ATMEL_ISR_PASS_LIMIT)
428
			break;
429

430 431
		status = UART_GET_CSR(port);
		pending = status & UART_GET_IMR(port);
432 433 434 435
	}
	return IRQ_HANDLED;
}

436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543
static void atmel_rx_from_ring(struct uart_port *port)
{
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;
	struct circ_buf *ring = &atmel_port->rx_ring;
	unsigned int flg;
	unsigned int status;

	while (ring->head != ring->tail) {
		struct atmel_uart_char c;

		/* Make sure c is loaded after head. */
		smp_rmb();

		c = ((struct atmel_uart_char *)ring->buf)[ring->tail];

		ring->tail = (ring->tail + 1) & (ATMEL_SERIAL_RINGSIZE - 1);

		port->icount.rx++;
		status = c.status;
		flg = TTY_NORMAL;

		/*
		 * note that the error handling code is
		 * out of the main execution path
		 */
		if (unlikely(status & (ATMEL_US_PARE | ATMEL_US_FRAME
				       | ATMEL_US_OVRE | ATMEL_US_RXBRK))) {
			if (status & ATMEL_US_RXBRK) {
				/* ignore side-effect */
				status &= ~(ATMEL_US_PARE | ATMEL_US_FRAME);

				port->icount.brk++;
				if (uart_handle_break(port))
					continue;
			}
			if (status & ATMEL_US_PARE)
				port->icount.parity++;
			if (status & ATMEL_US_FRAME)
				port->icount.frame++;
			if (status & ATMEL_US_OVRE)
				port->icount.overrun++;

			status &= port->read_status_mask;

			if (status & ATMEL_US_RXBRK)
				flg = TTY_BREAK;
			else if (status & ATMEL_US_PARE)
				flg = TTY_PARITY;
			else if (status & ATMEL_US_FRAME)
				flg = TTY_FRAME;
		}


		if (uart_handle_sysrq_char(port, c.ch))
			continue;

		uart_insert_char(port, status, ATMEL_US_OVRE, c.ch, flg);
	}

	/*
	 * Drop the lock here since it might end up calling
	 * uart_start(), which takes the lock.
	 */
	spin_unlock(&port->lock);
	tty_flip_buffer_push(port->info->tty);
	spin_lock(&port->lock);
}

/*
 * tasklet handling tty stuff outside the interrupt handler.
 */
static void atmel_tasklet_func(unsigned long data)
{
	struct uart_port *port = (struct uart_port *)data;
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;
	unsigned int status;
	unsigned int status_change;

	/* The interrupt handler does not take the lock */
	spin_lock(&port->lock);

	atmel_tx_chars(port);

	status = atmel_port->irq_status;
	status_change = status ^ atmel_port->irq_status_prev;

	if (status_change & (ATMEL_US_RI | ATMEL_US_DSR
				| ATMEL_US_DCD | ATMEL_US_CTS)) {
		/* TODO: All reads to CSR will clear these interrupts! */
		if (status_change & ATMEL_US_RI)
			port->icount.rng++;
		if (status_change & ATMEL_US_DSR)
			port->icount.dsr++;
		if (status_change & ATMEL_US_DCD)
			uart_handle_dcd_change(port, !(status & ATMEL_US_DCD));
		if (status_change & ATMEL_US_CTS)
			uart_handle_cts_change(port, !(status & ATMEL_US_CTS));

		wake_up_interruptible(&port->info->delta_msr_wait);

		atmel_port->irq_status_prev = status;
	}

	atmel_rx_from_ring(port);

	spin_unlock(&port->lock);
}

544 545 546
/*
 * Perform initialization and enable port for reception
 */
547
static int atmel_startup(struct uart_port *port)
548 549 550 551 552 553 554 555 556 557 558 559 560
{
	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 已提交
561 562
	retval = request_irq(port->irq, atmel_interrupt, IRQF_SHARED,
			"atmel_serial", port);
563
	if (retval) {
564
		printk("atmel_serial: atmel_startup - Can't get irq\n");
565 566 567 568 569 570 571
		return retval;
	}

	/*
	 * If there is a specific "open" function (to register
	 * control line interrupts)
	 */
572 573
	if (atmel_open_hook) {
		retval = atmel_open_hook(port);
574 575 576 577 578 579 580 581 582
		if (retval) {
			free_irq(port->irq, port);
			return retval;
		}
	}

	/*
	 * Finally, enable the serial port
	 */
583
	UART_PUT_CR(port, ATMEL_US_RSTSTA | ATMEL_US_RSTRX);
R
Remy Bohmer 已提交
584 585
	/* enable xmit & rcvr */
	UART_PUT_CR(port, ATMEL_US_TXEN | ATMEL_US_RXEN);
586

R
Remy Bohmer 已提交
587 588
	/* enable receive only */
	UART_PUT_IER(port, ATMEL_US_RXRDY);
589

590 591 592 593 594 595
	return 0;
}

/*
 * Disable the port
 */
596
static void atmel_shutdown(struct uart_port *port)
597 598 599 600
{
	/*
	 * Disable all interrupts, port and break condition.
	 */
601
	UART_PUT_CR(port, ATMEL_US_RSTSTA);
602 603 604 605 606 607 608 609 610 611 612
	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)
	 */
613 614
	if (atmel_close_hook)
		atmel_close_hook(port);
615 616 617 618 619
}

/*
 * Power / Clock management.
 */
R
Remy Bohmer 已提交
620 621
static void atmel_serial_pm(struct uart_port *port, unsigned int state,
			    unsigned int oldstate)
622
{
R
Remy Bohmer 已提交
623
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;
624

625
	switch (state) {
R
Remy Bohmer 已提交
626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641
	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);
642 643 644 645 646 647
	}
}

/*
 * Change the port parameters
 */
R
Remy Bohmer 已提交
648 649
static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
			      struct ktermios *old)
650 651 652 653
{
	unsigned long flags;
	unsigned int mode, imr, quot, baud;

654
	/* Get current mode register */
R
Remy Bohmer 已提交
655 656
	mode = UART_GET_MR(port) & ~(ATMEL_US_USCLKS | ATMEL_US_CHRL
					| ATMEL_US_NBSTOP | ATMEL_US_PAR);
657

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

R
Remy Bohmer 已提交
661
	if (quot > 65535) {	/* BRGR is 16-bit, so switch to slower clock */
662 663 664
		quot /= 8;
		mode |= ATMEL_US_USCLKS_MCK_DIV8;
	}
665 666 667 668

	/* byte size */
	switch (termios->c_cflag & CSIZE) {
	case CS5:
669
		mode |= ATMEL_US_CHRL_5;
670 671
		break;
	case CS6:
672
		mode |= ATMEL_US_CHRL_6;
673 674
		break;
	case CS7:
675
		mode |= ATMEL_US_CHRL_7;
676 677
		break;
	default:
678
		mode |= ATMEL_US_CHRL_8;
679 680 681 682 683
		break;
	}

	/* stop bits */
	if (termios->c_cflag & CSTOPB)
684
		mode |= ATMEL_US_NBSTOP_2;
685 686 687

	/* parity */
	if (termios->c_cflag & PARENB) {
R
Remy Bohmer 已提交
688 689
		/* Mark or Space parity */
		if (termios->c_cflag & CMSPAR) {
690
			if (termios->c_cflag & PARODD)
691
				mode |= ATMEL_US_PAR_MARK;
692
			else
693
				mode |= ATMEL_US_PAR_SPACE;
R
Remy Bohmer 已提交
694
		} else if (termios->c_cflag & PARODD)
695
			mode |= ATMEL_US_PAR_ODD;
696
		else
697
			mode |= ATMEL_US_PAR_EVEN;
R
Remy Bohmer 已提交
698
	} else
699
		mode |= ATMEL_US_PAR_NONE;
700 701 702

	spin_lock_irqsave(&port->lock, flags);

703
	port->read_status_mask = ATMEL_US_OVRE;
704
	if (termios->c_iflag & INPCK)
705
		port->read_status_mask |= (ATMEL_US_FRAME | ATMEL_US_PARE);
706
	if (termios->c_iflag & (BRKINT | PARMRK))
707
		port->read_status_mask |= ATMEL_US_RXBRK;
708 709 710 711 712 713

	/*
	 * Characters to ignore
	 */
	port->ignore_status_mask = 0;
	if (termios->c_iflag & IGNPAR)
714
		port->ignore_status_mask |= (ATMEL_US_FRAME | ATMEL_US_PARE);
715
	if (termios->c_iflag & IGNBRK) {
716
		port->ignore_status_mask |= ATMEL_US_RXBRK;
717 718 719 720 721
		/*
		 * If we're ignoring parity and break indicators,
		 * ignore overruns too (for real raw support).
		 */
		if (termios->c_iflag & IGNPAR)
722
			port->ignore_status_mask |= ATMEL_US_OVRE;
723
	}
R
Remy Bohmer 已提交
724
	/* TODO: Ignore all characters if CREAD is set.*/
725 726 727 728

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

R
Remy Bohmer 已提交
729 730 731 732
	/* save/disable interrupts and drain transmitter */
	imr = UART_GET_IMR(port);
	UART_PUT_IDR(port, -1);
	while (!(UART_GET_CSR(port) & ATMEL_US_TXEMPTY))
733
		cpu_relax();
734 735

	/* disable receiver and transmitter */
736
	UART_PUT_CR(port, ATMEL_US_TXDIS | ATMEL_US_RXDIS);
737 738 739 740 741 742

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

	/* set the baud rate */
	UART_PUT_BRGR(port, quot);
743 744
	UART_PUT_CR(port, ATMEL_US_RSTSTA | ATMEL_US_RSTRX);
	UART_PUT_CR(port, ATMEL_US_TXEN | ATMEL_US_RXEN);
745 746 747 748 749 750 751 752 753 754 755 756 757 758

	/* 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
 */
759
static const char *atmel_type(struct uart_port *port)
760
{
761
	return (port->type == PORT_ATMEL) ? "ATMEL_SERIAL" : NULL;
762 763 764 765 766
}

/*
 * Release the memory region(s) being used by 'port'.
 */
767
static void atmel_release_port(struct uart_port *port)
768
{
769 770 771 772 773 774 775 776 777
	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;
	}
778 779 780 781 782
}

/*
 * Request the memory region(s) being used by 'port'.
 */
783
static int atmel_request_port(struct uart_port *port)
784
{
785 786 787
	struct platform_device *pdev = to_platform_device(port->dev);
	int size = pdev->resource[0].end - pdev->resource[0].start + 1;

788
	if (!request_mem_region(port->mapbase, size, "atmel_serial"))
789 790 791 792 793 794 795 796 797
		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;
		}
	}
798

799
	return 0;
800 801 802 803 804
}

/*
 * Configure/autoconfigure the port.
 */
805
static void atmel_config_port(struct uart_port *port, int flags)
806 807
{
	if (flags & UART_CONFIG_TYPE) {
808
		port->type = PORT_ATMEL;
809
		atmel_request_port(port);
810 811 812 813 814 815
	}
}

/*
 * Verify the new serial_struct (for TIOCSSERIAL).
 */
816
static int atmel_verify_port(struct uart_port *port, struct serial_struct *ser)
817 818
{
	int ret = 0;
819
	if (ser->type != PORT_UNKNOWN && ser->type != PORT_ATMEL)
820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835
		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;
}

836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853
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,
854 855
};

856 857 858
/*
 * Configure the port from the platform device resource info.
 */
R
Remy Bohmer 已提交
859 860
static void __devinit atmel_init_port(struct atmel_uart_port *atmel_port,
				      struct platform_device *pdev)
861
{
862
	struct uart_port *port = &atmel_port->uart;
863
	struct atmel_uart_data *data = pdev->dev.platform_data;
864 865

	port->iotype	= UPIO_MEM;
866
	port->flags	= UPF_BOOT_AUTOCONF;
867
	port->ops	= &atmel_pops;
868
	port->fifosize	= 1;
869 870 871 872 873 874
	port->line	= pdev->id;
	port->dev	= &pdev->dev;

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

875 876 877 878 879
	tasklet_init(&atmel_port->tasklet, atmel_tasklet_func,
			(unsigned long)port);

	memset(&atmel_port->rx_ring, 0, sizeof(atmel_port->rx_ring));

880 881 882
	if (data->regs)
		/* Already mapped by setup code */
		port->membase = data->regs;
883 884 885 886
	else {
		port->flags	|= UPF_IOREMAP;
		port->membase	= NULL;
	}
887

R
Remy Bohmer 已提交
888 889
	/* for console, the clock could already be configured */
	if (!atmel_port->clk) {
890 891 892
		atmel_port->clk = clk_get(&pdev->dev, "usart");
		clk_enable(atmel_port->clk);
		port->uartclk = clk_get_rate(atmel_port->clk);
893
	}
894 895
}

896 897 898
/*
 * Register board-specific modem-control line handlers.
 */
899
void __init atmel_register_uart_fns(struct atmel_port_fns *fns)
900 901
{
	if (fns->enable_ms)
902
		atmel_pops.enable_ms = fns->enable_ms;
903
	if (fns->get_mctrl)
904
		atmel_pops.get_mctrl = fns->get_mctrl;
905
	if (fns->set_mctrl)
906
		atmel_pops.set_mctrl = fns->set_mctrl;
907 908
	atmel_open_hook		= fns->open;
	atmel_close_hook	= fns->close;
909 910
	atmel_pops.pm		= fns->pm;
	atmel_pops.set_wake	= fns->set_wake;
911 912
}

913
#ifdef CONFIG_SERIAL_ATMEL_CONSOLE
914
static void atmel_console_putchar(struct uart_port *port, int ch)
915
{
916
	while (!(UART_GET_CSR(port) & ATMEL_US_TXRDY))
917
		cpu_relax();
918 919
	UART_PUT_CHAR(port, ch);
}
920 921 922 923

/*
 * Interrupts are disabled on entering
 */
924
static void atmel_console_write(struct console *co, const char *s, u_int count)
925
{
926
	struct uart_port *port = &atmel_ports[co->index].uart;
927
	unsigned int status, imr;
928 929

	/*
R
Remy Bohmer 已提交
930
	 * First, save IMR and then disable interrupts
931
	 */
R
Remy Bohmer 已提交
932
	imr = UART_GET_IMR(port);
933
	UART_PUT_IDR(port, ATMEL_US_RXRDY | ATMEL_US_TXRDY);
934

935
	uart_console_write(port, s, count, atmel_console_putchar);
936 937

	/*
R
Remy Bohmer 已提交
938 939
	 * Finally, wait for transmitter to become empty
	 * and restore IMR
940 941 942
	 */
	do {
		status = UART_GET_CSR(port);
943
	} while (!(status & ATMEL_US_TXRDY));
R
Remy Bohmer 已提交
944 945
	/* set interrupts back the way they were */
	UART_PUT_IER(port, imr);
946 947 948
}

/*
R
Remy Bohmer 已提交
949 950
 * If the port was already initialised (eg, by a boot loader),
 * try to determine the current setup.
951
 */
R
Remy Bohmer 已提交
952 953
static void __init atmel_console_get_options(struct uart_port *port, int *baud,
					     int *parity, int *bits)
954 955 956
{
	unsigned int mr, quot;

957 958 959 960 961 962 963
	/*
	 * If the baud rate generator isn't running, the port wasn't
	 * initialized by the boot loader.
	 */
	quot = UART_GET_BRGR(port);
	if (!quot)
		return;
964

965 966
	mr = UART_GET_MR(port) & ATMEL_US_CHRL;
	if (mr == ATMEL_US_CHRL_8)
967 968 969 970
		*bits = 8;
	else
		*bits = 7;

971 972
	mr = UART_GET_MR(port) & ATMEL_US_PAR;
	if (mr == ATMEL_US_PAR_EVEN)
973
		*parity = 'e';
974
	else if (mr == ATMEL_US_PAR_ODD)
975 976
		*parity = 'o';

977 978 979 980 981 982 983
	/*
	 * 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.
	 */
	*baud = port->uartclk / (16 * (quot - 1));
984 985
}

986
static int __init atmel_console_setup(struct console *co, char *options)
987
{
988
	struct uart_port *port = &atmel_ports[co->index].uart;
989 990 991 992 993
	int baud = 115200;
	int bits = 8;
	int parity = 'n';
	int flow = 'n';

R
Remy Bohmer 已提交
994 995
	if (port->membase == NULL) {
		/* Port not initialized yet - delay setup */
996
		return -ENODEV;
R
Remy Bohmer 已提交
997
	}
998

R
Remy Bohmer 已提交
999
	UART_PUT_IDR(port, -1);
1000 1001
	UART_PUT_CR(port, ATMEL_US_RSTSTA | ATMEL_US_RSTRX);
	UART_PUT_CR(port, ATMEL_US_TXEN | ATMEL_US_RXEN);
1002 1003 1004 1005

	if (options)
		uart_parse_options(options, &baud, &parity, &bits, &flow);
	else
1006
		atmel_console_get_options(port, &baud, &parity, &bits);
1007 1008 1009 1010

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

1011
static struct uart_driver atmel_uart;
1012

1013 1014 1015
static struct console atmel_console = {
	.name		= ATMEL_DEVICENAME,
	.write		= atmel_console_write,
1016
	.device		= uart_console_device,
1017
	.setup		= atmel_console_setup,
1018 1019
	.flags		= CON_PRINTBUFFER,
	.index		= -1,
1020
	.data		= &atmel_uart,
1021 1022
};

1023
#define ATMEL_CONSOLE_DEVICE	&atmel_console
1024

1025 1026 1027
/*
 * Early console initialization (before VM subsystem initialized).
 */
1028
static int __init atmel_console_init(void)
1029
{
1030
	if (atmel_default_console_device) {
R
Remy Bohmer 已提交
1031 1032 1033 1034
		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);
1035
		register_console(&atmel_console);
1036
	}
1037 1038 1039

	return 0;
}
R
Remy Bohmer 已提交
1040

1041
console_initcall(atmel_console_init);
1042

1043 1044 1045
/*
 * Late console initialization.
 */
1046
static int __init atmel_late_console_init(void)
1047
{
R
Remy Bohmer 已提交
1048 1049
	if (atmel_default_console_device
	    && !(atmel_console.flags & CON_ENABLED))
1050
		register_console(&atmel_console);
1051 1052 1053

	return 0;
}
R
Remy Bohmer 已提交
1054

1055
core_initcall(atmel_late_console_init);
1056

1057 1058 1059 1060 1061
static inline bool atmel_is_console_port(struct uart_port *port)
{
	return port->cons && port->cons->index == port->line;
}

1062
#else
1063
#define ATMEL_CONSOLE_DEVICE	NULL
1064 1065 1066 1067 1068

static inline bool atmel_is_console_port(struct uart_port *port)
{
	return false;
}
1069 1070
#endif

1071
static struct uart_driver atmel_uart = {
R
Remy Bohmer 已提交
1072 1073 1074 1075 1076 1077 1078
	.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,
1079 1080
};

1081
#ifdef CONFIG_PM
R
Remy Bohmer 已提交
1082 1083
static int atmel_serial_suspend(struct platform_device *pdev,
				pm_message_t state)
1084
{
1085
	struct uart_port *port = platform_get_drvdata(pdev);
R
Remy Bohmer 已提交
1086
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;
1087

R
Remy Bohmer 已提交
1088 1089
	if (device_may_wakeup(&pdev->dev)
	    && !at91_suspend_entering_slow_clock())
1090 1091
		enable_irq_wake(port->irq);
	else {
1092 1093
		uart_suspend_port(&atmel_uart, port);
		atmel_port->suspended = 1;
1094
	}
1095

1096 1097
	return 0;
}
1098

1099
static int atmel_serial_resume(struct platform_device *pdev)
1100 1101
{
	struct uart_port *port = platform_get_drvdata(pdev);
R
Remy Bohmer 已提交
1102
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;
1103

1104 1105 1106
	if (atmel_port->suspended) {
		uart_resume_port(&atmel_uart, port);
		atmel_port->suspended = 0;
R
Remy Bohmer 已提交
1107
	} else
1108
		disable_irq_wake(port->irq);
1109 1110 1111

	return 0;
}
1112
#else
1113 1114
#define atmel_serial_suspend NULL
#define atmel_serial_resume NULL
1115
#endif
1116

1117
static int __devinit atmel_serial_probe(struct platform_device *pdev)
1118
{
1119
	struct atmel_uart_port *port;
1120
	void *data;
1121
	int ret;
1122

1123 1124
	BUILD_BUG_ON(!is_power_of_2(ATMEL_SERIAL_RINGSIZE));

1125 1126
	port = &atmel_ports[pdev->id];
	atmel_init_port(port, pdev);
1127

1128 1129 1130 1131 1132 1133
	ret = -ENOMEM;
	data = kmalloc(ATMEL_SERIAL_RINGSIZE, GFP_KERNEL);
	if (!data)
		goto err_alloc_ring;
	port->rx_ring.buf = data;

1134
	ret = uart_add_one_port(&atmel_uart, &port->uart);
1135 1136 1137 1138 1139 1140 1141 1142 1143
	if (ret)
		goto err_add_port;

	device_init_wakeup(&pdev->dev, 1);
	platform_set_drvdata(pdev, port);

	return 0;

err_add_port:
1144 1145 1146
	kfree(port->rx_ring.buf);
	port->rx_ring.buf = NULL;
err_alloc_ring:
1147 1148 1149 1150
	if (!atmel_is_console_port(&port->uart)) {
		clk_disable(port->clk);
		clk_put(port->clk);
		port->clk = NULL;
1151 1152 1153 1154 1155
	}

	return ret;
}

1156
static int __devexit atmel_serial_remove(struct platform_device *pdev)
1157 1158
{
	struct uart_port *port = platform_get_drvdata(pdev);
R
Remy Bohmer 已提交
1159
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;
1160 1161 1162 1163 1164
	int ret = 0;

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

1165 1166
	ret = uart_remove_one_port(&atmel_uart, port);

1167 1168 1169
	tasklet_kill(&atmel_port->tasklet);
	kfree(atmel_port->rx_ring.buf);

1170 1171 1172 1173
	/* "port" is allocated statically, so we shouldn't free it */

	clk_disable(atmel_port->clk);
	clk_put(atmel_port->clk);
1174 1175 1176 1177

	return ret;
}

1178 1179 1180 1181 1182
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,
1183
	.driver		= {
1184
		.name	= "atmel_usart",
1185 1186 1187 1188
		.owner	= THIS_MODULE,
	},
};

1189
static int __init atmel_serial_init(void)
1190 1191 1192
{
	int ret;

1193
	ret = uart_register_driver(&atmel_uart);
1194 1195 1196
	if (ret)
		return ret;

1197
	ret = platform_driver_register(&atmel_serial_driver);
1198
	if (ret)
1199
		uart_unregister_driver(&atmel_uart);
1200 1201 1202 1203

	return ret;
}

1204
static void __exit atmel_serial_exit(void)
1205
{
1206 1207
	platform_driver_unregister(&atmel_serial_driver);
	uart_unregister_driver(&atmel_uart);
1208 1209
}

1210 1211
module_init(atmel_serial_init);
module_exit(atmel_serial_exit);
1212 1213

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