sh-sci.c 81.2 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0
L
Linus Torvalds 已提交
2 3 4
/*
 * SuperH on-chip serial module support.  (SCI with no FIFO / with FIFO)
 *
P
Paul Mundt 已提交
5
 *  Copyright (C) 2002 - 2011  Paul Mundt
6
 *  Copyright (C) 2015 Glider bvba
M
Markus Brunner 已提交
7
 *  Modified to support SH7720 SCIF. Markus Brunner, Mark Jonas (Jul 2007).
L
Linus Torvalds 已提交
8 9 10 11 12 13 14 15
 *
 * 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).
16
 *   Removed SH7300 support (Jul 2007).
L
Linus Torvalds 已提交
17
 */
18 19 20
#if defined(CONFIG_SERIAL_SH_SCI_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
#define SUPPORT_SYSRQ
#endif
L
Linus Torvalds 已提交
21 22 23

#undef DEBUG

24 25 26 27 28 29 30 31
#include <linux/clk.h>
#include <linux/console.h>
#include <linux/ctype.h>
#include <linux/cpufreq.h>
#include <linux/delay.h>
#include <linux/dmaengine.h>
#include <linux/dma-mapping.h>
#include <linux/err.h>
L
Linus Torvalds 已提交
32
#include <linux/errno.h>
33
#include <linux/init.h>
L
Linus Torvalds 已提交
34 35
#include <linux/interrupt.h>
#include <linux/ioport.h>
36
#include <linux/ktime.h>
37 38
#include <linux/major.h>
#include <linux/module.h>
L
Linus Torvalds 已提交
39
#include <linux/mm.h>
B
Bastian Hecht 已提交
40
#include <linux/of.h>
41
#include <linux/of_device.h>
42
#include <linux/platform_device.h>
M
Magnus Damm 已提交
43
#include <linux/pm_runtime.h>
44
#include <linux/scatterlist.h>
45 46 47
#include <linux/serial.h>
#include <linux/serial_sci.h>
#include <linux/sh_dma.h>
48
#include <linux/slab.h>
49 50 51 52 53
#include <linux/string.h>
#include <linux/sysrq.h>
#include <linux/timer.h>
#include <linux/tty.h>
#include <linux/tty_flip.h>
54 55

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

59
#include "serial_mctrl_gpio.h"
L
Linus Torvalds 已提交
60 61
#include "sh-sci.h"

62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
/* Offsets into the sci_port->irqs array */
enum {
	SCIx_ERI_IRQ,
	SCIx_RXI_IRQ,
	SCIx_TXI_IRQ,
	SCIx_BRI_IRQ,
	SCIx_NR_IRQS,

	SCIx_MUX_IRQ = SCIx_NR_IRQS,	/* special case */
};

#define SCIx_IRQ_IS_MUXED(port)			\
	((port)->irqs[SCIx_ERI_IRQ] ==	\
	 (port)->irqs[SCIx_RXI_IRQ]) ||	\
	((port)->irqs[SCIx_ERI_IRQ] &&	\
	 ((port)->irqs[SCIx_RXI_IRQ] < 0))

79 80
enum SCI_CLKS {
	SCI_FCK,		/* Functional Clock */
81
	SCI_SCK,		/* Optional External Clock */
82 83
	SCI_BRG_INT,		/* Optional BRG Internal Clock Source */
	SCI_SCIF_CLK,		/* Optional BRG External Clock Source */
84 85 86
	SCI_NUM_CLKS
};

87 88 89 90
/* Bit x set means sampling rate x + 1 is supported */
#define SCI_SR(x)		BIT((x) - 1)
#define SCI_SR_RANGE(x, y)	GENMASK((y) - 1, (x) - 1)

91 92 93 94
#define SCI_SR_SCIFAB		SCI_SR(5) | SCI_SR(7) | SCI_SR(11) | \
				SCI_SR(13) | SCI_SR(16) | SCI_SR(17) | \
				SCI_SR(19) | SCI_SR(27)

95 96 97 98 99 100 101 102
#define min_sr(_port)		ffs((_port)->sampling_rate_mask)
#define max_sr(_port)		fls((_port)->sampling_rate_mask)

/* Iterate over all supported sampling rates, from high to low */
#define for_each_sr(_sr, _port)						\
	for ((_sr) = max_sr(_port); (_sr) >= min_sr(_port); (_sr)--)	\
		if ((_port)->sampling_rate_mask & SCI_SR((_sr)))

103 104 105 106 107 108
struct plat_sci_reg {
	u8 offset, size;
};

struct sci_port_params {
	const struct plat_sci_reg regs[SCIx_NR_REGS];
109 110 111 112 113 114
	unsigned int fifosize;
	unsigned int overrun_reg;
	unsigned int overrun_mask;
	unsigned int sampling_rate_mask;
	unsigned int error_mask;
	unsigned int error_clear;
115 116
};

117 118 119
struct sci_port {
	struct uart_port	port;

120
	/* Platform configuration */
121
	const struct sci_port_params *params;
122
	const struct plat_sci_port *cfg;
123
	unsigned int		sampling_rate_mask;
124
	resource_size_t		reg_size;
125
	struct mctrl_gpios	*gpios;
126

127 128 129
	/* Clocks */
	struct clk		*clks[SCI_NUM_CLKS];
	unsigned long		clk_rates[SCI_NUM_CLKS];
130

131
	int			irqs[SCIx_NR_IRQS];
132 133
	char			*irqstr[SCIx_NR_IRQS];

134 135
	struct dma_chan			*chan_tx;
	struct dma_chan			*chan_rx;
P
Paul Mundt 已提交
136

137 138 139 140
#ifdef CONFIG_SERIAL_SH_SCI_DMA
	dma_cookie_t			cookie_tx;
	dma_cookie_t			cookie_rx[2];
	dma_cookie_t			active_rx;
141 142
	dma_addr_t			tx_dma_addr;
	unsigned int			tx_dma_len;
143
	struct scatterlist		sg_rx[2];
144
	void				*rx_buf[2];
145 146
	size_t				buf_len_rx;
	struct work_struct		work_tx;
147 148
	struct hrtimer			rx_timer;
	unsigned int			rx_timeout;	/* microseconds */
149
#endif
150
	unsigned int			rx_frame;
151
	int				rx_trigger;
152 153
	struct timer_list		rx_fifo_timer;
	int				rx_fifo_timeout;
154
	u16				hscif_tot;
155

156
	bool has_rtscts;
157
	bool autorts;
158 159 160
};

#define SCI_NPORTS CONFIG_SERIAL_SH_SCI_NR_UARTS
161

162
static struct sci_port sci_ports[SCI_NPORTS];
163
static unsigned long sci_ports_in_use;
164
static struct uart_driver sci_uart_driver;
L
Linus Torvalds 已提交
165

166 167 168 169 170 171
static inline struct sci_port *
to_sci_port(struct uart_port *uart)
{
	return container_of(uart, struct sci_port, port);
}

172
static const struct sci_port_params sci_port_params[SCIx_NR_REGTYPES] = {
173 174 175 176 177
	/*
	 * Common SCI definitions, dependent on the port's regshift
	 * value.
	 */
	[SCIx_SCI_REGTYPE] = {
178 179 180 181 182 183 184 185
		.regs = {
			[SCSMR]		= { 0x00,  8 },
			[SCBRR]		= { 0x01,  8 },
			[SCSCR]		= { 0x02,  8 },
			[SCxTDR]	= { 0x03,  8 },
			[SCxSR]		= { 0x04,  8 },
			[SCxRDR]	= { 0x05,  8 },
		},
186 187 188 189 190 191
		.fifosize = 1,
		.overrun_reg = SCxSR,
		.overrun_mask = SCI_ORER,
		.sampling_rate_mask = SCI_SR(32),
		.error_mask = SCI_DEFAULT_ERROR_MASK | SCI_ORER,
		.error_clear = SCI_ERROR_CLEAR & ~SCI_ORER,
192 193 194
	},

	/*
195
	 * Common definitions for legacy IrDA ports.
196 197
	 */
	[SCIx_IRDA_REGTYPE] = {
198 199 200 201 202 203 204 205 206 207
		.regs = {
			[SCSMR]		= { 0x00,  8 },
			[SCBRR]		= { 0x02,  8 },
			[SCSCR]		= { 0x04,  8 },
			[SCxTDR]	= { 0x06,  8 },
			[SCxSR]		= { 0x08, 16 },
			[SCxRDR]	= { 0x0a,  8 },
			[SCFCR]		= { 0x0c,  8 },
			[SCFDR]		= { 0x0e, 16 },
		},
208 209 210 211 212 213
		.fifosize = 1,
		.overrun_reg = SCxSR,
		.overrun_mask = SCI_ORER,
		.sampling_rate_mask = SCI_SR(32),
		.error_mask = SCI_DEFAULT_ERROR_MASK | SCI_ORER,
		.error_clear = SCI_ERROR_CLEAR & ~SCI_ORER,
214 215 216 217 218 219
	},

	/*
	 * Common SCIFA definitions.
	 */
	[SCIx_SCIFA_REGTYPE] = {
220 221 222 223 224 225 226 227 228 229 230 231
		.regs = {
			[SCSMR]		= { 0x00, 16 },
			[SCBRR]		= { 0x04,  8 },
			[SCSCR]		= { 0x08, 16 },
			[SCxTDR]	= { 0x20,  8 },
			[SCxSR]		= { 0x14, 16 },
			[SCxRDR]	= { 0x24,  8 },
			[SCFCR]		= { 0x18, 16 },
			[SCFDR]		= { 0x1c, 16 },
			[SCPCR]		= { 0x30, 16 },
			[SCPDR]		= { 0x34, 16 },
		},
232 233 234 235 236 237
		.fifosize = 64,
		.overrun_reg = SCxSR,
		.overrun_mask = SCIFA_ORER,
		.sampling_rate_mask = SCI_SR_SCIFAB,
		.error_mask = SCIF_DEFAULT_ERROR_MASK | SCIFA_ORER,
		.error_clear = SCIF_ERROR_CLEAR & ~SCIFA_ORER,
238 239 240 241 242 243
	},

	/*
	 * Common SCIFB definitions.
	 */
	[SCIx_SCIFB_REGTYPE] = {
244 245 246 247 248 249 250 251 252 253 254 255 256
		.regs = {
			[SCSMR]		= { 0x00, 16 },
			[SCBRR]		= { 0x04,  8 },
			[SCSCR]		= { 0x08, 16 },
			[SCxTDR]	= { 0x40,  8 },
			[SCxSR]		= { 0x14, 16 },
			[SCxRDR]	= { 0x60,  8 },
			[SCFCR]		= { 0x18, 16 },
			[SCTFDR]	= { 0x38, 16 },
			[SCRFDR]	= { 0x3c, 16 },
			[SCPCR]		= { 0x30, 16 },
			[SCPDR]		= { 0x34, 16 },
		},
257 258 259 260 261 262
		.fifosize = 256,
		.overrun_reg = SCxSR,
		.overrun_mask = SCIFA_ORER,
		.sampling_rate_mask = SCI_SR_SCIFAB,
		.error_mask = SCIF_DEFAULT_ERROR_MASK | SCIFA_ORER,
		.error_clear = SCIF_ERROR_CLEAR & ~SCIFA_ORER,
263 264
	},

265 266 267 268 269
	/*
	 * Common SH-2(A) SCIF definitions for ports with FIFO data
	 * count registers.
	 */
	[SCIx_SH2_SCIF_FIFODATA_REGTYPE] = {
270 271 272 273 274 275 276 277 278 279 280 281
		.regs = {
			[SCSMR]		= { 0x00, 16 },
			[SCBRR]		= { 0x04,  8 },
			[SCSCR]		= { 0x08, 16 },
			[SCxTDR]	= { 0x0c,  8 },
			[SCxSR]		= { 0x10, 16 },
			[SCxRDR]	= { 0x14,  8 },
			[SCFCR]		= { 0x18, 16 },
			[SCFDR]		= { 0x1c, 16 },
			[SCSPTR]	= { 0x20, 16 },
			[SCLSR]		= { 0x24, 16 },
		},
282 283 284 285 286 287
		.fifosize = 16,
		.overrun_reg = SCLSR,
		.overrun_mask = SCLSR_ORER,
		.sampling_rate_mask = SCI_SR(32),
		.error_mask = SCIF_DEFAULT_ERROR_MASK,
		.error_clear = SCIF_ERROR_CLEAR,
288 289
	},

290 291 292 293
	/*
	 * Common SH-3 SCIF definitions.
	 */
	[SCIx_SH3_SCIF_REGTYPE] = {
294 295 296 297 298 299 300 301 302 303
		.regs = {
			[SCSMR]		= { 0x00,  8 },
			[SCBRR]		= { 0x02,  8 },
			[SCSCR]		= { 0x04,  8 },
			[SCxTDR]	= { 0x06,  8 },
			[SCxSR]		= { 0x08, 16 },
			[SCxRDR]	= { 0x0a,  8 },
			[SCFCR]		= { 0x0c,  8 },
			[SCFDR]		= { 0x0e, 16 },
		},
304 305 306 307 308 309
		.fifosize = 16,
		.overrun_reg = SCLSR,
		.overrun_mask = SCLSR_ORER,
		.sampling_rate_mask = SCI_SR(32),
		.error_mask = SCIF_DEFAULT_ERROR_MASK,
		.error_clear = SCIF_ERROR_CLEAR,
310 311 312 313 314 315
	},

	/*
	 * Common SH-4(A) SCIF(B) definitions.
	 */
	[SCIx_SH4_SCIF_REGTYPE] = {
316 317 318 319 320 321 322 323 324 325 326 327
		.regs = {
			[SCSMR]		= { 0x00, 16 },
			[SCBRR]		= { 0x04,  8 },
			[SCSCR]		= { 0x08, 16 },
			[SCxTDR]	= { 0x0c,  8 },
			[SCxSR]		= { 0x10, 16 },
			[SCxRDR]	= { 0x14,  8 },
			[SCFCR]		= { 0x18, 16 },
			[SCFDR]		= { 0x1c, 16 },
			[SCSPTR]	= { 0x20, 16 },
			[SCLSR]		= { 0x24, 16 },
		},
328 329 330 331 332 333
		.fifosize = 16,
		.overrun_reg = SCLSR,
		.overrun_mask = SCLSR_ORER,
		.sampling_rate_mask = SCI_SR(32),
		.error_mask = SCIF_DEFAULT_ERROR_MASK,
		.error_clear = SCIF_ERROR_CLEAR,
334 335 336 337 338 339 340
	},

	/*
	 * Common SCIF definitions for ports with a Baud Rate Generator for
	 * External Clock (BRG).
	 */
	[SCIx_SH4_SCIF_BRG_REGTYPE] = {
341 342 343 344 345 346 347 348 349 350 351 352 353 354
		.regs = {
			[SCSMR]		= { 0x00, 16 },
			[SCBRR]		= { 0x04,  8 },
			[SCSCR]		= { 0x08, 16 },
			[SCxTDR]	= { 0x0c,  8 },
			[SCxSR]		= { 0x10, 16 },
			[SCxRDR]	= { 0x14,  8 },
			[SCFCR]		= { 0x18, 16 },
			[SCFDR]		= { 0x1c, 16 },
			[SCSPTR]	= { 0x20, 16 },
			[SCLSR]		= { 0x24, 16 },
			[SCDL]		= { 0x30, 16 },
			[SCCKS]		= { 0x34, 16 },
		},
355 356 357 358 359 360
		.fifosize = 16,
		.overrun_reg = SCLSR,
		.overrun_mask = SCLSR_ORER,
		.sampling_rate_mask = SCI_SR(32),
		.error_mask = SCIF_DEFAULT_ERROR_MASK,
		.error_clear = SCIF_ERROR_CLEAR,
U
Ulrich Hecht 已提交
361 362 363 364 365 366
	},

	/*
	 * Common HSCIF definitions.
	 */
	[SCIx_HSCIF_REGTYPE] = {
367 368 369 370 371 372 373 374 375 376 377 378 379 380
		.regs = {
			[SCSMR]		= { 0x00, 16 },
			[SCBRR]		= { 0x04,  8 },
			[SCSCR]		= { 0x08, 16 },
			[SCxTDR]	= { 0x0c,  8 },
			[SCxSR]		= { 0x10, 16 },
			[SCxRDR]	= { 0x14,  8 },
			[SCFCR]		= { 0x18, 16 },
			[SCFDR]		= { 0x1c, 16 },
			[SCSPTR]	= { 0x20, 16 },
			[SCLSR]		= { 0x24, 16 },
			[HSSRR]		= { 0x40, 16 },
			[SCDL]		= { 0x30, 16 },
			[SCCKS]		= { 0x34, 16 },
381 382
			[HSRTRGR]	= { 0x54, 16 },
			[HSTTRGR]	= { 0x58, 16 },
383
		},
384 385 386 387 388 389
		.fifosize = 128,
		.overrun_reg = SCLSR,
		.overrun_mask = SCLSR_ORER,
		.sampling_rate_mask = SCI_SR_RANGE(8, 32),
		.error_mask = SCIF_DEFAULT_ERROR_MASK,
		.error_clear = SCIF_ERROR_CLEAR,
390 391 392 393 394 395 396
	},

	/*
	 * Common SH-4(A) SCIF(B) definitions for ports without an SCSPTR
	 * register.
	 */
	[SCIx_SH4_SCIF_NO_SCSPTR_REGTYPE] = {
397 398 399 400 401 402 403 404 405 406 407
		.regs = {
			[SCSMR]		= { 0x00, 16 },
			[SCBRR]		= { 0x04,  8 },
			[SCSCR]		= { 0x08, 16 },
			[SCxTDR]	= { 0x0c,  8 },
			[SCxSR]		= { 0x10, 16 },
			[SCxRDR]	= { 0x14,  8 },
			[SCFCR]		= { 0x18, 16 },
			[SCFDR]		= { 0x1c, 16 },
			[SCLSR]		= { 0x24, 16 },
		},
408 409 410 411 412 413
		.fifosize = 16,
		.overrun_reg = SCLSR,
		.overrun_mask = SCLSR_ORER,
		.sampling_rate_mask = SCI_SR(32),
		.error_mask = SCIF_DEFAULT_ERROR_MASK,
		.error_clear = SCIF_ERROR_CLEAR,
414 415 416 417 418 419 420
	},

	/*
	 * Common SH-4(A) SCIF(B) definitions for ports with FIFO data
	 * count registers.
	 */
	[SCIx_SH4_SCIF_FIFODATA_REGTYPE] = {
421 422 423 424 425 426 427 428 429 430 431 432 433 434
		.regs = {
			[SCSMR]		= { 0x00, 16 },
			[SCBRR]		= { 0x04,  8 },
			[SCSCR]		= { 0x08, 16 },
			[SCxTDR]	= { 0x0c,  8 },
			[SCxSR]		= { 0x10, 16 },
			[SCxRDR]	= { 0x14,  8 },
			[SCFCR]		= { 0x18, 16 },
			[SCFDR]		= { 0x1c, 16 },
			[SCTFDR]	= { 0x1c, 16 },	/* aliased to SCFDR */
			[SCRFDR]	= { 0x20, 16 },
			[SCSPTR]	= { 0x24, 16 },
			[SCLSR]		= { 0x28, 16 },
		},
435 436 437 438 439 440
		.fifosize = 16,
		.overrun_reg = SCLSR,
		.overrun_mask = SCLSR_ORER,
		.sampling_rate_mask = SCI_SR(32),
		.error_mask = SCIF_DEFAULT_ERROR_MASK,
		.error_clear = SCIF_ERROR_CLEAR,
441 442 443 444 445 446 447
	},

	/*
	 * SH7705-style SCIF(B) ports, lacking both SCSPTR and SCLSR
	 * registers.
	 */
	[SCIx_SH7705_SCIF_REGTYPE] = {
448 449 450 451 452 453 454 455 456 457
		.regs = {
			[SCSMR]		= { 0x00, 16 },
			[SCBRR]		= { 0x04,  8 },
			[SCSCR]		= { 0x08, 16 },
			[SCxTDR]	= { 0x20,  8 },
			[SCxSR]		= { 0x14, 16 },
			[SCxRDR]	= { 0x24,  8 },
			[SCFCR]		= { 0x18, 16 },
			[SCFDR]		= { 0x1c, 16 },
		},
458
		.fifosize = 64,
459 460 461 462 463
		.overrun_reg = SCxSR,
		.overrun_mask = SCIFA_ORER,
		.sampling_rate_mask = SCI_SR(16),
		.error_mask = SCIF_DEFAULT_ERROR_MASK | SCIFA_ORER,
		.error_clear = SCIF_ERROR_CLEAR & ~SCIFA_ORER,
464 465 466
	},
};

467
#define sci_getreg(up, offset)		(&to_sci_port(up)->params->regs[offset])
468

469 470 471 472 473 474 475 476
/*
 * The "offset" here is rather misleading, in that it refers to an enum
 * value relative to the port mapping rather than the fixed offset
 * itself, which needs to be manually retrieved from the platform's
 * register map for the given port.
 */
static unsigned int sci_serial_in(struct uart_port *p, int offset)
{
477
	const struct plat_sci_reg *reg = sci_getreg(p, offset);
478 479 480 481 482 483 484 485 486 487 488 489 490

	if (reg->size == 8)
		return ioread8(p->membase + (reg->offset << p->regshift));
	else if (reg->size == 16)
		return ioread16(p->membase + (reg->offset << p->regshift));
	else
		WARN(1, "Invalid register access\n");

	return 0;
}

static void sci_serial_out(struct uart_port *p, int offset, int value)
{
491
	const struct plat_sci_reg *reg = sci_getreg(p, offset);
492 493 494 495 496 497 498 499 500

	if (reg->size == 8)
		iowrite8(value, p->membase + (reg->offset << p->regshift));
	else if (reg->size == 16)
		iowrite16(value, p->membase + (reg->offset << p->regshift));
	else
		WARN(1, "Invalid register access\n");
}

501 502
static void sci_port_enable(struct sci_port *sci_port)
{
503 504
	unsigned int i;

505 506 507 508 509
	if (!sci_port->port.dev)
		return;

	pm_runtime_get_sync(sci_port->port.dev);

510 511 512 513 514
	for (i = 0; i < SCI_NUM_CLKS; i++) {
		clk_prepare_enable(sci_port->clks[i]);
		sci_port->clk_rates[i] = clk_get_rate(sci_port->clks[i]);
	}
	sci_port->port.uartclk = sci_port->clk_rates[SCI_FCK];
515 516 517 518
}

static void sci_port_disable(struct sci_port *sci_port)
{
519 520
	unsigned int i;

521 522 523
	if (!sci_port->port.dev)
		return;

524 525
	for (i = SCI_NUM_CLKS; i-- > 0; )
		clk_disable_unprepare(sci_port->clks[i]);
526 527 528 529

	pm_runtime_put_sync(sci_port->port.dev);
}

530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612
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.
	 */
	return SCSCR_RIE | (to_sci_port(port)->cfg->scscr & SCSCR_REIE);
}

static void sci_start_tx(struct uart_port *port)
{
	struct sci_port *s = to_sci_port(port);
	unsigned short ctrl;

#ifdef CONFIG_SERIAL_SH_SCI_DMA
	if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
		u16 new, scr = serial_port_in(port, SCSCR);
		if (s->chan_tx)
			new = scr | SCSCR_TDRQE;
		else
			new = scr & ~SCSCR_TDRQE;
		if (new != scr)
			serial_port_out(port, SCSCR, new);
	}

	if (s->chan_tx && !uart_circ_empty(&s->port.state->xmit) &&
	    dma_submit_error(s->cookie_tx)) {
		s->cookie_tx = 0;
		schedule_work(&s->work_tx);
	}
#endif

	if (!s->chan_tx || port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
		/* Set TIE (Transmit Interrupt Enable) bit in SCSCR */
		ctrl = serial_port_in(port, SCSCR);
		serial_port_out(port, SCSCR, ctrl | SCSCR_TIE);
	}
}

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

	/* Clear TIE (Transmit Interrupt Enable) bit in SCSCR */
	ctrl = serial_port_in(port, SCSCR);

	if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
		ctrl &= ~SCSCR_TDRQE;

	ctrl &= ~SCSCR_TIE;

	serial_port_out(port, SCSCR, ctrl);
}

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

	ctrl = serial_port_in(port, SCSCR) | port_rx_irq_mask(port);

	if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
		ctrl &= ~SCSCR_RDRQE;

	serial_port_out(port, SCSCR, ctrl);
}

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

	ctrl = serial_port_in(port, SCSCR);

	if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
		ctrl &= ~SCSCR_RDRQE;

	ctrl &= ~port_rx_irq_mask(port);

	serial_port_out(port, SCSCR, ctrl);
}

613 614 615 616 617
static void sci_clear_SCxSR(struct uart_port *port, unsigned int mask)
{
	if (port->type == PORT_SCI) {
		/* Just store the mask */
		serial_port_out(port, SCxSR, mask);
618
	} else if (to_sci_port(port)->params->overrun_mask == SCIFA_ORER) {
619 620 621 622 623 624 625 626 627 628
		/* SCIFA/SCIFB and SCIF on SH7705/SH7720/SH7721 */
		/* Only clear the status bits we want to clear */
		serial_port_out(port, SCxSR,
				serial_port_in(port, SCxSR) & mask);
	} else {
		/* Store the mask, clear parity/framing errors */
		serial_port_out(port, SCxSR, mask & ~(SCIF_FERC | SCIF_PERC));
	}
}

629 630
#if defined(CONFIG_CONSOLE_POLL) || defined(CONFIG_SERIAL_SH_SCI_CONSOLE) || \
    defined(CONFIG_SERIAL_SH_SCI_EARLYCON)
631 632

#ifdef CONFIG_CONSOLE_POLL
633
static int sci_poll_get_char(struct uart_port *port)
L
Linus Torvalds 已提交
634 635 636 637
{
	unsigned short status;
	int c;

638
	do {
639
		status = serial_port_in(port, SCxSR);
L
Linus Torvalds 已提交
640
		if (status & SCxSR_ERRORS(port)) {
641
			sci_clear_SCxSR(port, SCxSR_ERROR_CLEAR(port));
L
Linus Torvalds 已提交
642 643
			continue;
		}
644 645 646 647 648
		break;
	} while (1);

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

650
	c = serial_port_in(port, SCxRDR);
651

652
	/* Dummy read */
653
	serial_port_in(port, SCxSR);
654
	sci_clear_SCxSR(port, SCxSR_RDxF_CLEAR(port));
L
Linus Torvalds 已提交
655 656 657

	return c;
}
658
#endif
L
Linus Torvalds 已提交
659

660
static void sci_poll_put_char(struct uart_port *port, unsigned char c)
L
Linus Torvalds 已提交
661 662 663 664
{
	unsigned short status;

	do {
665
		status = serial_port_in(port, SCxSR);
L
Linus Torvalds 已提交
666 667
	} while (!(status & SCxSR_TDxE(port)));

668
	serial_port_out(port, SCxTDR, c);
669
	sci_clear_SCxSR(port, SCxSR_TDxE_CLEAR(port) & ~SCxSR_TEND(port));
L
Linus Torvalds 已提交
670
}
671 672
#endif /* CONFIG_CONSOLE_POLL || CONFIG_SERIAL_SH_SCI_CONSOLE ||
	  CONFIG_SERIAL_SH_SCI_EARLYCON */
L
Linus Torvalds 已提交
673

674
static void sci_init_pins(struct uart_port *port, unsigned int cflag)
L
Linus Torvalds 已提交
675
{
676
	struct sci_port *s = to_sci_port(port);
L
Linus Torvalds 已提交
677

678 679 680 681 682 683
	/*
	 * Use port-specific handler if provided.
	 */
	if (s->cfg->ops && s->cfg->ops->init_pins) {
		s->cfg->ops->init_pins(port, cflag);
		return;
L
Linus Torvalds 已提交
684
	}
P
Paul Mundt 已提交
685

686
	if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
687
		u16 data = serial_port_in(port, SCPDR);
688 689 690 691
		u16 ctrl = serial_port_in(port, SCPCR);

		/* Enable RXD and TXD pin functions */
		ctrl &= ~(SCPCR_RXDC | SCPCR_TXDC);
692
		if (to_sci_port(port)->has_rtscts) {
693 694 695 696 697 698 699 700 701 702 703
			/* RTS# is output, active low, unless autorts */
			if (!(port->mctrl & TIOCM_RTS)) {
				ctrl |= SCPCR_RTSC;
				data |= SCPDR_RTSD;
			} else if (!s->autorts) {
				ctrl |= SCPCR_RTSC;
				data &= ~SCPDR_RTSD;
			} else {
				/* Enable RTS# pin function */
				ctrl &= ~SCPCR_RTSC;
			}
704 705 706
			/* Enable CTS# pin function */
			ctrl &= ~SCPCR_CTSC;
		}
707
		serial_port_out(port, SCPDR, data);
708 709
		serial_port_out(port, SCPCR, ctrl);
	} else if (sci_getreg(port, SCSPTR)->size) {
710 711
		u16 status = serial_port_in(port, SCSPTR);

712 713 714 715 716 717
		/* RTS# is always output; and active low, unless autorts */
		status |= SCSPTR_RTSIO;
		if (!(port->mctrl & TIOCM_RTS))
			status |= SCSPTR_RTSDT;
		else if (!s->autorts)
			status &= ~SCSPTR_RTSDT;
718 719 720
		/* CTS# and SCK are inputs */
		status &= ~(SCSPTR_CTSIO | SCSPTR_SCKIO);
		serial_port_out(port, SCSPTR, status);
721
	}
722
}
723

724
static int sci_txfill(struct uart_port *port)
725
{
726 727
	struct sci_port *s = to_sci_port(port);
	unsigned int fifo_mask = (s->params->fifosize << 1) - 1;
728
	const struct plat_sci_reg *reg;
729

730 731
	reg = sci_getreg(port, SCTFDR);
	if (reg->size)
732
		return serial_port_in(port, SCTFDR) & fifo_mask;
733

734 735
	reg = sci_getreg(port, SCFDR);
	if (reg->size)
736
		return serial_port_in(port, SCFDR) >> 8;
737

738
	return !(serial_port_in(port, SCxSR) & SCI_TDRE);
739 740
}

741 742
static int sci_txroom(struct uart_port *port)
{
743
	return port->fifosize - sci_txfill(port);
744 745 746
}

static int sci_rxfill(struct uart_port *port)
747
{
748 749
	struct sci_port *s = to_sci_port(port);
	unsigned int fifo_mask = (s->params->fifosize << 1) - 1;
750
	const struct plat_sci_reg *reg;
751 752 753

	reg = sci_getreg(port, SCRFDR);
	if (reg->size)
754
		return serial_port_in(port, SCRFDR) & fifo_mask;
755 756 757

	reg = sci_getreg(port, SCFDR);
	if (reg->size)
758
		return serial_port_in(port, SCFDR) & fifo_mask;
759

760
	return (serial_port_in(port, SCxSR) & SCxSR_RDxF(port)) != 0;
761 762
}

L
Linus Torvalds 已提交
763 764 765 766 767 768
/* ********************************************************************** *
 *                   the interrupt related routines                       *
 * ********************************************************************** */

static void sci_transmit_chars(struct uart_port *port)
{
A
Alan Cox 已提交
769
	struct circ_buf *xmit = &port->state->xmit;
L
Linus Torvalds 已提交
770 771 772
	unsigned int stopped = uart_tx_stopped(port);
	unsigned short status;
	unsigned short ctrl;
773
	int count;
L
Linus Torvalds 已提交
774

775
	status = serial_port_in(port, SCxSR);
L
Linus Torvalds 已提交
776
	if (!(status & SCxSR_TDxE(port))) {
777
		ctrl = serial_port_in(port, SCSCR);
778
		if (uart_circ_empty(xmit))
779
			ctrl &= ~SCSCR_TIE;
780
		else
781
			ctrl |= SCSCR_TIE;
782
		serial_port_out(port, SCSCR, ctrl);
L
Linus Torvalds 已提交
783 784 785
		return;
	}

786
	count = sci_txroom(port);
L
Linus Torvalds 已提交
787 788 789 790 791 792 793 794 795 796 797 798 799 800

	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;
		}

801
		serial_port_out(port, SCxTDR, c);
L
Linus Torvalds 已提交
802 803 804 805

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

806
	sci_clear_SCxSR(port, SCxSR_TDxE_CLEAR(port));
L
Linus Torvalds 已提交
807 808 809 810

	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
		uart_write_wakeup(port);
	if (uart_circ_empty(xmit)) {
811
		sci_stop_tx(port);
L
Linus Torvalds 已提交
812
	} else {
813
		ctrl = serial_port_in(port, SCSCR);
L
Linus Torvalds 已提交
814

815
		if (port->type != PORT_SCI) {
816
			serial_port_in(port, SCxSR); /* Dummy read */
817
			sci_clear_SCxSR(port, SCxSR_TDxE_CLEAR(port));
L
Linus Torvalds 已提交
818 819
		}

820
		ctrl |= SCSCR_TIE;
821
		serial_port_out(port, SCSCR, ctrl);
L
Linus Torvalds 已提交
822 823 824 825
	}
}

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

828
static void sci_receive_chars(struct uart_port *port)
L
Linus Torvalds 已提交
829
{
830
	struct tty_port *tport = &port->state->port;
L
Linus Torvalds 已提交
831 832
	int i, count, copied = 0;
	unsigned short status;
A
Alan Cox 已提交
833
	unsigned char flag;
L
Linus Torvalds 已提交
834

835
	status = serial_port_in(port, SCxSR);
L
Linus Torvalds 已提交
836 837 838 839 840
	if (!(status & SCxSR_RDxF(port)))
		return;

	while (1) {
		/* Don't copy more bytes than there is room for in the buffer */
841
		count = tty_buffer_request_room(tport, sci_rxfill(port));
L
Linus Torvalds 已提交
842 843 844 845 846 847

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

		if (port->type == PORT_SCI) {
848
			char c = serial_port_in(port, SCxRDR);
849
			if (uart_handle_sysrq_char(port, c))
L
Linus Torvalds 已提交
850
				count = 0;
851
			else
J
Jiri Slaby 已提交
852
				tty_insert_flip_char(tport, c, TTY_NORMAL);
L
Linus Torvalds 已提交
853
		} else {
854
			for (i = 0; i < count; i++) {
855
				char c = serial_port_in(port, SCxRDR);
856

857
				status = serial_port_in(port, SCxSR);
858
				if (uart_handle_sysrq_char(port, c)) {
L
Linus Torvalds 已提交
859 860 861 862 863
					count--; i--;
					continue;
				}

				/* Store data and status */
864
				if (status & SCxSR_FER(port)) {
A
Alan Cox 已提交
865
					flag = TTY_FRAME;
866
					port->icount.frame++;
867
					dev_notice(port->dev, "frame error\n");
868
				} else if (status & SCxSR_PER(port)) {
A
Alan Cox 已提交
869
					flag = TTY_PARITY;
870
					port->icount.parity++;
871
					dev_notice(port->dev, "parity error\n");
A
Alan Cox 已提交
872 873
				} else
					flag = TTY_NORMAL;
874

J
Jiri Slaby 已提交
875
				tty_insert_flip_char(tport, c, flag);
L
Linus Torvalds 已提交
876 877 878
			}
		}

879
		serial_port_in(port, SCxSR); /* dummy read */
880
		sci_clear_SCxSR(port, SCxSR_RDxF_CLEAR(port));
L
Linus Torvalds 已提交
881 882 883 884 885 886 887

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

	if (copied) {
		/* Tell the rest of the system the news. New characters! */
J
Jiri Slaby 已提交
888
		tty_flip_buffer_push(tport);
L
Linus Torvalds 已提交
889
	} else {
890 891
		/* TTY buffers full; read from RX reg to prevent lockup */
		serial_port_in(port, SCxRDR);
892
		serial_port_in(port, SCxSR); /* dummy read */
893
		sci_clear_SCxSR(port, SCxSR_RDxF_CLEAR(port));
L
Linus Torvalds 已提交
894 895 896
	}
}

897
static int sci_handle_errors(struct uart_port *port)
L
Linus Torvalds 已提交
898 899
{
	int copied = 0;
900
	unsigned short status = serial_port_in(port, SCxSR);
J
Jiri Slaby 已提交
901
	struct tty_port *tport = &port->state->port;
902
	struct sci_port *s = to_sci_port(port);
L
Linus Torvalds 已提交
903

904
	/* Handle overruns */
905
	if (status & s->params->overrun_mask) {
906
		port->icount.overrun++;
907

908 909 910
		/* overrun error */
		if (tty_insert_flip_char(tport, 0, TTY_OVERRUN))
			copied++;
911

912
		dev_notice(port->dev, "overrun error\n");
L
Linus Torvalds 已提交
913 914
	}

915
	if (status & SCxSR_FER(port)) {
916 917
		/* frame error */
		port->icount.frame++;
918

919 920
		if (tty_insert_flip_char(tport, 0, TTY_FRAME))
			copied++;
921

922
		dev_notice(port->dev, "frame error\n");
L
Linus Torvalds 已提交
923 924
	}

925
	if (status & SCxSR_PER(port)) {
L
Linus Torvalds 已提交
926
		/* parity error */
927 928
		port->icount.parity++;

J
Jiri Slaby 已提交
929
		if (tty_insert_flip_char(tport, 0, TTY_PARITY))
930
			copied++;
931

932
		dev_notice(port->dev, "parity error\n");
L
Linus Torvalds 已提交
933 934
	}

A
Alan Cox 已提交
935
	if (copied)
J
Jiri Slaby 已提交
936
		tty_flip_buffer_push(tport);
L
Linus Torvalds 已提交
937 938 939 940

	return copied;
}

941
static int sci_handle_fifo_overrun(struct uart_port *port)
942
{
J
Jiri Slaby 已提交
943
	struct tty_port *tport = &port->state->port;
944
	struct sci_port *s = to_sci_port(port);
945
	const struct plat_sci_reg *reg;
946
	int copied = 0;
947
	u16 status;
948

949
	reg = sci_getreg(port, s->params->overrun_reg);
950
	if (!reg->size)
951 952
		return 0;

953 954 955 956
	status = serial_port_in(port, s->params->overrun_reg);
	if (status & s->params->overrun_mask) {
		status &= ~s->params->overrun_mask;
		serial_port_out(port, s->params->overrun_reg, status);
957

958 959
		port->icount.overrun++;

J
Jiri Slaby 已提交
960
		tty_insert_flip_char(tport, 0, TTY_OVERRUN);
J
Jiri Slaby 已提交
961
		tty_flip_buffer_push(tport);
962

963
		dev_dbg(port->dev, "overrun error\n");
964 965 966 967 968 969
		copied++;
	}

	return copied;
}

970
static int sci_handle_breaks(struct uart_port *port)
L
Linus Torvalds 已提交
971 972
{
	int copied = 0;
973
	unsigned short status = serial_port_in(port, SCxSR);
J
Jiri Slaby 已提交
974
	struct tty_port *tport = &port->state->port;
L
Linus Torvalds 已提交
975

976 977 978
	if (uart_handle_break(port))
		return 0;

979
	if (status & SCxSR_BRK(port)) {
980 981
		port->icount.brk++;

L
Linus Torvalds 已提交
982
		/* Notify of BREAK */
J
Jiri Slaby 已提交
983
		if (tty_insert_flip_char(tport, 0, TTY_BREAK))
A
Alan Cox 已提交
984
			copied++;
985 986

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

A
Alan Cox 已提交
989
	if (copied)
J
Jiri Slaby 已提交
990
		tty_flip_buffer_push(tport);
991

992 993
	copied += sci_handle_fifo_overrun(port);

L
Linus Torvalds 已提交
994 995 996
	return copied;
}

997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055
static int scif_set_rtrg(struct uart_port *port, int rx_trig)
{
	unsigned int bits;

	if (rx_trig < 1)
		rx_trig = 1;
	if (rx_trig >= port->fifosize)
		rx_trig = port->fifosize;

	/* HSCIF can be set to an arbitrary level. */
	if (sci_getreg(port, HSRTRGR)->size) {
		serial_port_out(port, HSRTRGR, rx_trig);
		return rx_trig;
	}

	switch (port->type) {
	case PORT_SCIF:
		if (rx_trig < 4) {
			bits = 0;
			rx_trig = 1;
		} else if (rx_trig < 8) {
			bits = SCFCR_RTRG0;
			rx_trig = 4;
		} else if (rx_trig < 14) {
			bits = SCFCR_RTRG1;
			rx_trig = 8;
		} else {
			bits = SCFCR_RTRG0 | SCFCR_RTRG1;
			rx_trig = 14;
		}
		break;
	case PORT_SCIFA:
	case PORT_SCIFB:
		if (rx_trig < 16) {
			bits = 0;
			rx_trig = 1;
		} else if (rx_trig < 32) {
			bits = SCFCR_RTRG0;
			rx_trig = 16;
		} else if (rx_trig < 48) {
			bits = SCFCR_RTRG1;
			rx_trig = 32;
		} else {
			bits = SCFCR_RTRG0 | SCFCR_RTRG1;
			rx_trig = 48;
		}
		break;
	default:
		WARN(1, "unknown FIFO configuration");
		return 1;
	}

	serial_port_out(port, SCFCR,
		(serial_port_in(port, SCFCR) &
		~(SCFCR_RTRG1 | SCFCR_RTRG0)) | bits);

	return rx_trig;
}

1056 1057 1058 1059 1060 1061 1062 1063 1064
static int scif_rtrg_enabled(struct uart_port *port)
{
	if (sci_getreg(port, HSRTRGR)->size)
		return serial_port_in(port, HSRTRGR) != 0;
	else
		return (serial_port_in(port, SCFCR) &
			(SCFCR_RTRG0 | SCFCR_RTRG1)) != 0;
}

1065
static void rx_fifo_timer_fn(struct timer_list *t)
1066
{
1067
	struct sci_port *s = from_timer(s, t, rx_fifo_timer);
1068 1069 1070 1071 1072 1073
	struct uart_port *port = &s->port;

	dev_dbg(port->dev, "Rx timed out\n");
	scif_set_rtrg(port, 1);
}

1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090
static ssize_t rx_trigger_show(struct device *dev,
			       struct device_attribute *attr,
			       char *buf)
{
	struct uart_port *port = dev_get_drvdata(dev);
	struct sci_port *sci = to_sci_port(port);

	return sprintf(buf, "%d\n", sci->rx_trigger);
}

static ssize_t rx_trigger_store(struct device *dev,
				struct device_attribute *attr,
				const char *buf,
				size_t count)
{
	struct uart_port *port = dev_get_drvdata(dev);
	struct sci_port *sci = to_sci_port(port);
1091
	int ret;
1092 1093
	long r;

1094 1095 1096
	ret = kstrtol(buf, 0, &r);
	if (ret)
		return ret;
1097

1098
	sci->rx_trigger = scif_set_rtrg(port, r);
1099 1100 1101
	if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
		scif_set_rtrg(port, 1);

1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112
	return count;
}

static DEVICE_ATTR(rx_fifo_trigger, 0644, rx_trigger_show, rx_trigger_store);

static ssize_t rx_fifo_timeout_show(struct device *dev,
			       struct device_attribute *attr,
			       char *buf)
{
	struct uart_port *port = dev_get_drvdata(dev);
	struct sci_port *sci = to_sci_port(port);
1113
	int v;
1114

1115 1116 1117 1118 1119 1120
	if (port->type == PORT_HSCIF)
		v = sci->hscif_tot >> HSSCR_TOT_SHIFT;
	else
		v = sci->rx_fifo_timeout;

	return sprintf(buf, "%d\n", v);
1121 1122 1123 1124 1125 1126 1127 1128 1129
}

static ssize_t rx_fifo_timeout_store(struct device *dev,
				struct device_attribute *attr,
				const char *buf,
				size_t count)
{
	struct uart_port *port = dev_get_drvdata(dev);
	struct sci_port *sci = to_sci_port(port);
1130
	int ret;
1131 1132
	long r;

1133 1134 1135
	ret = kstrtol(buf, 0, &r);
	if (ret)
		return ret;
1136 1137 1138 1139 1140 1141 1142 1143 1144

	if (port->type == PORT_HSCIF) {
		if (r < 0 || r > 3)
			return -EINVAL;
		sci->hscif_tot = r << HSSCR_TOT_SHIFT;
	} else {
		sci->rx_fifo_timeout = r;
		scif_set_rtrg(port, 1);
		if (r > 0)
1145
			timer_setup(&sci->rx_fifo_timer, rx_fifo_timer_fn, 0);
1146 1147
	}

1148 1149 1150
	return count;
}

J
Joe Perches 已提交
1151
static DEVICE_ATTR_RW(rx_fifo_timeout);
1152 1153


1154
#ifdef CONFIG_SERIAL_SH_SCI_DMA
1155 1156 1157 1158 1159 1160
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;
1161

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

1164
	spin_lock_irqsave(&port->lock, flags);
1165

1166 1167
	xmit->tail += s->tx_dma_len;
	xmit->tail &= UART_XMIT_SIZE - 1;
1168

1169
	port->icount.tx += s->tx_dma_len;
L
Linus Torvalds 已提交
1170

1171 1172
	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
		uart_write_wakeup(port);
L
Linus Torvalds 已提交
1173

1174 1175 1176 1177 1178 1179 1180 1181 1182 1183
	if (!uart_circ_empty(xmit)) {
		s->cookie_tx = 0;
		schedule_work(&s->work_tx);
	} else {
		s->cookie_tx = -EINVAL;
		if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
			u16 ctrl = serial_port_in(port, SCSCR);
			serial_port_out(port, SCSCR, ctrl & ~SCSCR_TIE);
		}
	}
L
Linus Torvalds 已提交
1184

1185
	spin_unlock_irqrestore(&port->lock, flags);
L
Linus Torvalds 已提交
1186 1187
}

1188 1189
/* Locking: called with port lock held */
static int sci_dma_rx_push(struct sci_port *s, void *buf, size_t count)
L
Linus Torvalds 已提交
1190
{
1191 1192 1193
	struct uart_port *port = &s->port;
	struct tty_port *tport = &port->state->port;
	int copied;
L
Linus Torvalds 已提交
1194

1195
	copied = tty_insert_flip_string(tport, buf, count);
1196
	if (copied < count)
1197
		port->icount.buf_overrun++;
L
Linus Torvalds 已提交
1198

1199
	port->icount.rx += copied;
L
Linus Torvalds 已提交
1200

1201
	return copied;
L
Linus Torvalds 已提交
1202 1203
}

1204
static int sci_dma_rx_find_active(struct sci_port *s)
L
Linus Torvalds 已提交
1205
{
1206
	unsigned int i;
L
Linus Torvalds 已提交
1207

1208 1209 1210
	for (i = 0; i < ARRAY_SIZE(s->cookie_rx); i++)
		if (s->active_rx == s->cookie_rx[i])
			return i;
L
Linus Torvalds 已提交
1211

1212
	return -1;
L
Linus Torvalds 已提交
1213 1214
}

1215
static void sci_rx_dma_release(struct sci_port *s, bool enable_pio)
P
Paul Mundt 已提交
1216
{
1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228
	struct dma_chan *chan = s->chan_rx;
	struct uart_port *port = &s->port;
	unsigned long flags;

	spin_lock_irqsave(&port->lock, flags);
	s->chan_rx = NULL;
	s->cookie_rx[0] = s->cookie_rx[1] = -EINVAL;
	spin_unlock_irqrestore(&port->lock, flags);
	dmaengine_terminate_all(chan);
	dma_free_coherent(chan->device->dev, s->buf_len_rx * 2, s->rx_buf[0],
			  sg_dma_address(&s->sg_rx[0]));
	dma_release_channel(chan);
1229 1230
	if (enable_pio) {
		spin_lock_irqsave(&port->lock, flags);
1231
		sci_start_rx(port);
1232 1233
		spin_unlock_irqrestore(&port->lock, flags);
	}
P
Paul Mundt 已提交
1234 1235
}

1236 1237 1238 1239 1240 1241 1242 1243 1244
static void start_hrtimer_us(struct hrtimer *hrt, unsigned long usec)
{
	long sec = usec / 1000000;
	long nsec = (usec % 1000000) * 1000;
	ktime_t t = ktime_set(sec, nsec);

	hrtimer_start(hrt, t, HRTIMER_MODE_REL);
}

1245
static void sci_dma_rx_complete(void *arg)
L
Linus Torvalds 已提交
1246
{
1247
	struct sci_port *s = arg;
1248
	struct dma_chan *chan = s->chan_rx;
1249
	struct uart_port *port = &s->port;
1250
	struct dma_async_tx_descriptor *desc;
1251 1252
	unsigned long flags;
	int active, count = 0;
L
Linus Torvalds 已提交
1253

1254 1255
	dev_dbg(port->dev, "%s(%d) active cookie %d\n", __func__, port->line,
		s->active_rx);
1256

1257
	spin_lock_irqsave(&port->lock, flags);
L
Linus Torvalds 已提交
1258

1259 1260 1261
	active = sci_dma_rx_find_active(s);
	if (active >= 0)
		count = sci_dma_rx_push(s, s->rx_buf[active], s->buf_len_rx);
P
Paul Mundt 已提交
1262

1263
	start_hrtimer_us(&s->rx_timer, s->rx_timeout);
P
Paul Mundt 已提交
1264

1265 1266
	if (count)
		tty_flip_buffer_push(&port->state->port);
1267

1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281
	desc = dmaengine_prep_slave_sg(s->chan_rx, &s->sg_rx[active], 1,
				       DMA_DEV_TO_MEM,
				       DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
	if (!desc)
		goto fail;

	desc->callback = sci_dma_rx_complete;
	desc->callback_param = s;
	s->cookie_rx[active] = dmaengine_submit(desc);
	if (dma_submit_error(s->cookie_rx[active]))
		goto fail;

	s->active_rx = s->cookie_rx[!active];

1282 1283
	dma_async_issue_pending(chan);

1284
	spin_unlock_irqrestore(&port->lock, flags);
1285 1286 1287 1288 1289 1290 1291 1292
	dev_dbg(port->dev, "%s: cookie %d #%d, new active cookie %d\n",
		__func__, s->cookie_rx[active], active, s->active_rx);
	return;

fail:
	spin_unlock_irqrestore(&port->lock, flags);
	dev_warn(port->dev, "Failed submitting Rx DMA descriptor\n");
	sci_rx_dma_release(s, true);
L
Linus Torvalds 已提交
1293 1294
}

1295
static void sci_tx_dma_release(struct sci_port *s, bool enable_pio)
L
Linus Torvalds 已提交
1296
{
1297 1298
	struct dma_chan *chan = s->chan_tx;
	struct uart_port *port = &s->port;
1299
	unsigned long flags;
L
Linus Torvalds 已提交
1300

1301 1302 1303 1304 1305 1306 1307 1308
	spin_lock_irqsave(&port->lock, flags);
	s->chan_tx = NULL;
	s->cookie_tx = -EINVAL;
	spin_unlock_irqrestore(&port->lock, flags);
	dmaengine_terminate_all(chan);
	dma_unmap_single(chan->device->dev, s->tx_dma_addr, UART_XMIT_SIZE,
			 DMA_TO_DEVICE);
	dma_release_channel(chan);
1309 1310
	if (enable_pio) {
		spin_lock_irqsave(&port->lock, flags);
1311
		sci_start_tx(port);
1312 1313
		spin_unlock_irqrestore(&port->lock, flags);
	}
1314
}
1315

1316 1317 1318 1319
static void sci_submit_rx(struct sci_port *s)
{
	struct dma_chan *chan = s->chan_rx;
	int i;
1320

1321 1322 1323
	for (i = 0; i < 2; i++) {
		struct scatterlist *sg = &s->sg_rx[i];
		struct dma_async_tx_descriptor *desc;
L
Linus Torvalds 已提交
1324

1325 1326 1327 1328 1329
		desc = dmaengine_prep_slave_sg(chan,
			sg, 1, DMA_DEV_TO_MEM,
			DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
		if (!desc)
			goto fail;
1330

1331 1332 1333 1334 1335
		desc->callback = sci_dma_rx_complete;
		desc->callback_param = s;
		s->cookie_rx[i] = dmaengine_submit(desc);
		if (dma_submit_error(s->cookie_rx[i]))
			goto fail;
1336

1337
	}
1338

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

1341 1342
	dma_async_issue_pending(chan);
	return;
1343

1344 1345 1346 1347 1348 1349 1350 1351
fail:
	if (i)
		dmaengine_terminate_all(chan);
	for (i = 0; i < 2; i++)
		s->cookie_rx[i] = -EINVAL;
	s->active_rx = -EINVAL;
	sci_rx_dma_release(s, true);
}
1352

1353
static void work_fn_tx(struct work_struct *work)
L
Linus Torvalds 已提交
1354
{
1355 1356 1357 1358 1359 1360
	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;
	dma_addr_t buf;
L
Linus Torvalds 已提交
1361

1362
	/*
1363 1364 1365 1366 1367
	 * 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.
1368
	 */
1369 1370 1371 1372 1373 1374
	spin_lock_irq(&port->lock);
	buf = s->tx_dma_addr + (xmit->tail & (UART_XMIT_SIZE - 1));
	s->tx_dma_len = min_t(unsigned int,
		CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE),
		CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE));
	spin_unlock_irq(&port->lock);
1375

1376 1377 1378 1379 1380 1381 1382 1383 1384
	desc = dmaengine_prep_slave_single(chan, buf, s->tx_dma_len,
					   DMA_MEM_TO_DEV,
					   DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
	if (!desc) {
		dev_warn(port->dev, "Failed preparing Tx DMA descriptor\n");
		/* switch to PIO */
		sci_tx_dma_release(s, true);
		return;
	}
1385

1386 1387
	dma_sync_single_for_device(chan->device->dev, buf, s->tx_dma_len,
				   DMA_TO_DEVICE);
L
Linus Torvalds 已提交
1388

1389 1390 1391 1392 1393 1394 1395 1396 1397 1398
	spin_lock_irq(&port->lock);
	desc->callback = sci_dma_tx_complete;
	desc->callback_param = s;
	spin_unlock_irq(&port->lock);
	s->cookie_tx = dmaengine_submit(desc);
	if (dma_submit_error(s->cookie_tx)) {
		dev_warn(port->dev, "Failed submitting Tx DMA descriptor\n");
		/* switch to PIO */
		sci_tx_dma_release(s, true);
		return;
L
Linus Torvalds 已提交
1399 1400
	}

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

1404
	dma_async_issue_pending(chan);
L
Linus Torvalds 已提交
1405 1406
}

1407
static enum hrtimer_restart rx_timer_fn(struct hrtimer *t)
L
Linus Torvalds 已提交
1408
{
1409
	struct sci_port *s = container_of(t, struct sci_port, rx_timer);
1410
	struct dma_chan *chan = s->chan_rx;
1411
	struct uart_port *port = &s->port;
1412 1413 1414 1415 1416 1417 1418 1419 1420
	struct dma_tx_state state;
	enum dma_status status;
	unsigned long flags;
	unsigned int read;
	int active, count;
	u16 scr;

	dev_dbg(port->dev, "DMA Rx timed out\n");

1421 1422
	spin_lock_irqsave(&port->lock, flags);

1423 1424 1425
	active = sci_dma_rx_find_active(s);
	if (active < 0) {
		spin_unlock_irqrestore(&port->lock, flags);
1426
		return HRTIMER_NORESTART;
1427 1428 1429
	}

	status = dmaengine_tx_status(s->chan_rx, s->active_rx, &state);
1430
	if (status == DMA_COMPLETE) {
1431
		spin_unlock_irqrestore(&port->lock, flags);
1432 1433
		dev_dbg(port->dev, "Cookie %d #%d has already completed\n",
			s->active_rx, active);
1434 1435

		/* Let packet complete handler take care of the packet */
1436
		return HRTIMER_NORESTART;
1437
	}
1438

1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450
	dmaengine_pause(chan);

	/*
	 * sometimes DMA transfer doesn't stop even if it is stopped and
	 * data keeps on coming until transaction is complete so check
	 * for DMA_COMPLETE again
	 * Let packet complete handler take care of the packet
	 */
	status = dmaengine_tx_status(s->chan_rx, s->active_rx, &state);
	if (status == DMA_COMPLETE) {
		spin_unlock_irqrestore(&port->lock, flags);
		dev_dbg(port->dev, "Transaction complete after DMA engine was stopped");
1451
		return HRTIMER_NORESTART;
1452 1453
	}

1454 1455 1456 1457 1458 1459 1460 1461 1462 1463
	/* Handle incomplete DMA receive */
	dmaengine_terminate_all(s->chan_rx);
	read = sg_dma_len(&s->sg_rx[active]) - state.residue;

	if (read) {
		count = sci_dma_rx_push(s, s->rx_buf[active], read);
		if (count)
			tty_flip_buffer_push(&port->state->port);
	}

1464 1465
	if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
		sci_submit_rx(s);
1466 1467 1468 1469 1470 1471 1472 1473 1474 1475

	/* Direct new serial port interrupts back to CPU */
	scr = serial_port_in(port, SCSCR);
	if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
		scr &= ~SCSCR_RDRQE;
		enable_irq(s->irqs[SCIx_RXI_IRQ]);
	}
	serial_port_out(port, SCSCR, scr | SCSCR_RIE);

	spin_unlock_irqrestore(&port->lock, flags);
1476 1477

	return HRTIMER_NORESTART;
L
Linus Torvalds 已提交
1478 1479
}

1480
static struct dma_chan *sci_request_dma_chan(struct uart_port *port,
1481
					     enum dma_transfer_direction dir)
1482 1483 1484 1485 1486
{
	struct dma_chan *chan;
	struct dma_slave_config cfg;
	int ret;

1487 1488
	chan = dma_request_slave_channel(port->dev,
					 dir == DMA_MEM_TO_DEV ? "tx" : "rx");
1489
	if (!chan) {
1490
		dev_warn(port->dev, "dma_request_slave_channel failed\n");
1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515
		return NULL;
	}

	memset(&cfg, 0, sizeof(cfg));
	cfg.direction = dir;
	if (dir == DMA_MEM_TO_DEV) {
		cfg.dst_addr = port->mapbase +
			(sci_getreg(port, SCxTDR)->offset << port->regshift);
		cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
	} else {
		cfg.src_addr = port->mapbase +
			(sci_getreg(port, SCxRDR)->offset << port->regshift);
		cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
	}

	ret = dmaengine_slave_config(chan, &cfg);
	if (ret) {
		dev_warn(port->dev, "dmaengine_slave_config failed %d\n", ret);
		dma_release_channel(chan);
		return NULL;
	}

	return chan;
}

1516
static void sci_request_dma(struct uart_port *port)
1517
{
1518 1519
	struct sci_port *s = to_sci_port(port);
	struct dma_chan *chan;
1520

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

1523
	if (!port->dev->of_node)
1524
		return;
1525

1526
	s->cookie_tx = -EINVAL;
1527 1528 1529 1530 1531 1532 1533 1534

	/*
	 * Don't request a dma channel if no channel was specified
	 * in the device tree.
	 */
	if (!of_find_property(port->dev->of_node, "dmas", NULL))
		return;

1535
	chan = sci_request_dma_chan(port, DMA_MEM_TO_DEV);
1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551
	dev_dbg(port->dev, "%s: TX: got channel %p\n", __func__, chan);
	if (chan) {
		s->chan_tx = chan;
		/* UART circular tx buffer is an aligned page. */
		s->tx_dma_addr = dma_map_single(chan->device->dev,
						port->state->xmit.buf,
						UART_XMIT_SIZE,
						DMA_TO_DEVICE);
		if (dma_mapping_error(chan->device->dev, s->tx_dma_addr)) {
			dev_warn(port->dev, "Failed mapping Tx DMA descriptor\n");
			dma_release_channel(chan);
			s->chan_tx = NULL;
		} else {
			dev_dbg(port->dev, "%s: mapped %lu@%p to %pad\n",
				__func__, UART_XMIT_SIZE,
				port->state->xmit.buf, &s->tx_dma_addr);
1552
		}
1553 1554

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

1557
	chan = sci_request_dma_chan(port, DMA_DEV_TO_MEM);
1558 1559 1560 1561 1562
	dev_dbg(port->dev, "%s: RX: got channel %p\n", __func__, chan);
	if (chan) {
		unsigned int i;
		dma_addr_t dma;
		void *buf;
1563

1564
		s->chan_rx = chan;
1565

1566 1567 1568 1569 1570 1571 1572 1573 1574 1575
		s->buf_len_rx = 2 * max_t(size_t, 16, port->fifosize);
		buf = dma_alloc_coherent(chan->device->dev, s->buf_len_rx * 2,
					 &dma, GFP_KERNEL);
		if (!buf) {
			dev_warn(port->dev,
				 "Failed to allocate Rx dma buffer, using PIO\n");
			dma_release_channel(chan);
			s->chan_rx = NULL;
			return;
		}
1576

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

1580 1581 1582
			sg_init_table(sg, 1);
			s->rx_buf[i] = buf;
			sg_dma_address(sg) = dma;
1583
			sg_dma_len(sg) = s->buf_len_rx;
1584

1585 1586 1587 1588
			buf += s->buf_len_rx;
			dma += s->buf_len_rx;
		}

1589 1590
		hrtimer_init(&s->rx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
		s->rx_timer.function = rx_timer_fn;
1591

1592 1593
		if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
			sci_submit_rx(s);
1594
	}
1595 1596
}

1597
static void sci_free_dma(struct uart_port *port)
1598
{
1599
	struct sci_port *s = to_sci_port(port);
1600

1601 1602 1603 1604 1605
	if (s->chan_tx)
		sci_tx_dma_release(s, false);
	if (s->chan_rx)
		sci_rx_dma_release(s, false);
}
1606 1607 1608 1609 1610 1611 1612 1613 1614 1615

static void sci_flush_buffer(struct uart_port *port)
{
	/*
	 * In uart_flush_buffer(), the xmit circular buffer has just been
	 * cleared, so we have to reset tx_dma_len accordingly.
	 */
	to_sci_port(port)->tx_dma_len = 0;
}
#else /* !CONFIG_SERIAL_SH_SCI_DMA */
1616 1617 1618
static inline void sci_request_dma(struct uart_port *port)
{
}
1619

1620 1621 1622
static inline void sci_free_dma(struct uart_port *port)
{
}
1623 1624 1625

#define sci_flush_buffer	NULL
#endif /* !CONFIG_SERIAL_SH_SCI_DMA */
1626

1627 1628 1629 1630
static irqreturn_t sci_rx_interrupt(int irq, void *ptr)
{
	struct uart_port *port = ptr;
	struct sci_port *s = to_sci_port(port);
1631

1632
#ifdef CONFIG_SERIAL_SH_SCI_DMA
1633 1634 1635
	if (s->chan_rx) {
		u16 scr = serial_port_in(port, SCSCR);
		u16 ssr = serial_port_in(port, SCxSR);
1636

1637 1638 1639 1640 1641 1642
		/* Disable future Rx interrupts */
		if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
			disable_irq_nosync(irq);
			scr |= SCSCR_RDRQE;
		} else {
			scr &= ~SCSCR_RIE;
1643
			sci_submit_rx(s);
1644 1645 1646 1647 1648
		}
		serial_port_out(port, SCSCR, scr);
		/* Clear current interrupt */
		serial_port_out(port, SCxSR,
				ssr & ~(SCIF_DR | SCxSR_RDxF(port)));
1649
		dev_dbg(port->dev, "Rx IRQ %lu: setup t-out in %u us\n",
1650
			jiffies, s->rx_timeout);
1651
		start_hrtimer_us(&s->rx_timer, s->rx_timeout);
1652

1653 1654 1655
		return IRQ_HANDLED;
	}
#endif
1656

1657 1658 1659 1660 1661
	if (s->rx_trigger > 1 && s->rx_fifo_timeout > 0) {
		if (!scif_rtrg_enabled(port))
			scif_set_rtrg(port, s->rx_trigger);

		mod_timer(&s->rx_fifo_timer, jiffies + DIV_ROUND_UP(
1662
			  s->rx_frame * HZ * s->rx_fifo_timeout, 1000000));
1663 1664
	}

1665 1666 1667 1668 1669 1670 1671
	/* 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?
	 */
	sci_receive_chars(ptr);

	return IRQ_HANDLED;
1672 1673
}

1674
static irqreturn_t sci_tx_interrupt(int irq, void *ptr)
1675
{
1676
	struct uart_port *port = ptr;
1677
	unsigned long flags;
1678

1679
	spin_lock_irqsave(&port->lock, flags);
1680
	sci_transmit_chars(port);
1681
	spin_unlock_irqrestore(&port->lock, flags);
1682 1683

	return IRQ_HANDLED;
1684 1685
}

1686
static irqreturn_t sci_er_interrupt(int irq, void *ptr)
1687
{
1688 1689
	struct uart_port *port = ptr;
	struct sci_port *s = to_sci_port(port);
1690

1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710
	/* Handle errors */
	if (port->type == PORT_SCI) {
		if (sci_handle_errors(port)) {
			/* discard character in rx buffer */
			serial_port_in(port, SCxSR);
			sci_clear_SCxSR(port, SCxSR_RDxF_CLEAR(port));
		}
	} else {
		sci_handle_fifo_overrun(port);
		if (!s->chan_rx)
			sci_receive_chars(ptr);
	}

	sci_clear_SCxSR(port, SCxSR_ERROR_CLEAR(port));

	/* Kick the transmission */
	if (!s->chan_tx)
		sci_tx_interrupt(irq, ptr);

	return IRQ_HANDLED;
1711 1712
}

1713
static irqreturn_t sci_br_interrupt(int irq, void *ptr)
1714
{
1715
	struct uart_port *port = ptr;
1716

1717 1718 1719
	/* Handle BREAKs */
	sci_handle_breaks(port);
	sci_clear_SCxSR(port, SCxSR_BREAK_CLEAR(port));
1720

1721 1722
	return IRQ_HANDLED;
}
1723

1724 1725 1726 1727 1728 1729
static irqreturn_t sci_mpxed_interrupt(int irq, void *ptr)
{
	unsigned short ssr_status, scr_status, err_enabled, orer_status = 0;
	struct uart_port *port = ptr;
	struct sci_port *s = to_sci_port(port);
	irqreturn_t ret = IRQ_NONE;
1730

1731 1732
	ssr_status = serial_port_in(port, SCxSR);
	scr_status = serial_port_in(port, SCSCR);
1733
	if (s->params->overrun_reg == SCxSR)
1734
		orer_status = ssr_status;
1735 1736
	else if (sci_getreg(port, s->params->overrun_reg)->size)
		orer_status = serial_port_in(port, s->params->overrun_reg);
1737

1738
	err_enabled = scr_status & port_rx_irq_mask(port);
1739

1740 1741 1742 1743
	/* Tx Interrupt */
	if ((ssr_status & SCxSR_TDxE(port)) && (scr_status & SCSCR_TIE) &&
	    !s->chan_tx)
		ret = sci_tx_interrupt(irq, ptr);
1744

1745 1746 1747 1748 1749 1750 1751
	/*
	 * Rx Interrupt: if we're using DMA, the DMA controller clears RDF /
	 * DR flags
	 */
	if (((ssr_status & SCxSR_RDxF(port)) || s->chan_rx) &&
	    (scr_status & SCSCR_RIE))
		ret = sci_rx_interrupt(irq, ptr);
1752

1753 1754 1755
	/* Error Interrupt */
	if ((ssr_status & SCxSR_ERRORS(port)) && err_enabled)
		ret = sci_er_interrupt(irq, ptr);
1756

1757 1758 1759 1760 1761
	/* Break Interrupt */
	if ((ssr_status & SCxSR_BRK(port)) && err_enabled)
		ret = sci_br_interrupt(irq, ptr);

	/* Overrun Interrupt */
1762
	if (orer_status & s->params->overrun_mask) {
1763 1764
		sci_handle_fifo_overrun(port);
		ret = IRQ_HANDLED;
1765 1766
	}

1767 1768
	return ret;
}
1769

1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780
static const struct sci_irq_desc {
	const char	*desc;
	irq_handler_t	handler;
} sci_irq_desc[] = {
	/*
	 * Split out handlers, the default case.
	 */
	[SCIx_ERI_IRQ] = {
		.desc = "rx err",
		.handler = sci_er_interrupt,
	},
1781

1782 1783 1784 1785
	[SCIx_RXI_IRQ] = {
		.desc = "rx full",
		.handler = sci_rx_interrupt,
	},
1786

1787 1788 1789 1790
	[SCIx_TXI_IRQ] = {
		.desc = "tx empty",
		.handler = sci_tx_interrupt,
	},
1791

1792 1793 1794 1795
	[SCIx_BRI_IRQ] = {
		.desc = "break",
		.handler = sci_br_interrupt,
	},
1796 1797

	/*
1798
	 * Special muxed handler.
1799
	 */
1800 1801 1802 1803 1804
	[SCIx_MUX_IRQ] = {
		.desc = "mux",
		.handler = sci_mpxed_interrupt,
	},
};
1805

1806 1807 1808 1809
static int sci_request_irq(struct sci_port *port)
{
	struct uart_port *up = &port->port;
	int i, j, ret = 0;
1810

1811 1812 1813
	for (i = j = 0; i < SCIx_NR_IRQS; i++, j++) {
		const struct sci_irq_desc *desc;
		int irq;
1814

1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831
		if (SCIx_IRQ_IS_MUXED(port)) {
			i = SCIx_MUX_IRQ;
			irq = up->irq;
		} else {
			irq = port->irqs[i];

			/*
			 * Certain port types won't support all of the
			 * available interrupt sources.
			 */
			if (unlikely(irq < 0))
				continue;
		}

		desc = sci_irq_desc + i;
		port->irqstr[j] = kasprintf(GFP_KERNEL, "%s:%s",
					    dev_name(up->dev), desc->desc);
1832 1833
		if (!port->irqstr[j]) {
			ret = -ENOMEM;
1834
			goto out_nomem;
1835
		}
1836 1837 1838 1839 1840 1841 1842

		ret = request_irq(irq, desc->handler, up->irqflags,
				  port->irqstr[j], port);
		if (unlikely(ret)) {
			dev_err(up->dev, "Can't allocate %s IRQ\n", desc->desc);
			goto out_noirq;
		}
1843 1844
	}

1845
	return 0;
L
Linus Torvalds 已提交
1846

1847 1848 1849
out_noirq:
	while (--i >= 0)
		free_irq(port->irqs[i], port);
P
Paul Mundt 已提交
1850

1851 1852 1853
out_nomem:
	while (--j >= 0)
		kfree(port->irqstr[j]);
P
Paul Mundt 已提交
1854

1855
	return ret;
L
Linus Torvalds 已提交
1856 1857
}

1858
static void sci_free_irq(struct sci_port *port)
L
Linus Torvalds 已提交
1859
{
1860
	int i;
L
Linus Torvalds 已提交
1861

1862 1863 1864 1865 1866 1867
	/*
	 * Intentionally in reverse order so we iterate over the muxed
	 * IRQ first.
	 */
	for (i = 0; i < SCIx_NR_IRQS; i++) {
		int irq = port->irqs[i];
P
Paul Mundt 已提交
1868

1869 1870 1871 1872 1873 1874
		/*
		 * Certain port types won't support all of the available
		 * interrupt sources.
		 */
		if (unlikely(irq < 0))
			continue;
P
Paul Mundt 已提交
1875

1876 1877
		free_irq(port->irqs[i], port);
		kfree(port->irqstr[i]);
P
Paul Mundt 已提交
1878

1879 1880 1881 1882 1883
		if (SCIx_IRQ_IS_MUXED(port)) {
			/* If there's only one IRQ, we're done. */
			return;
		}
	}
L
Linus Torvalds 已提交
1884 1885
}

1886
static unsigned int sci_tx_empty(struct uart_port *port)
L
Linus Torvalds 已提交
1887
{
1888 1889
	unsigned short status = serial_port_in(port, SCxSR);
	unsigned short in_tx_fifo = sci_txfill(port);
P
Paul Mundt 已提交
1890

1891
	return (status & SCxSR_TEND(port)) && !in_tx_fifo ? TIOCSER_TEMT : 0;
L
Linus Torvalds 已提交
1892 1893
}

1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933
static void sci_set_rts(struct uart_port *port, bool state)
{
	if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
		u16 data = serial_port_in(port, SCPDR);

		/* Active low */
		if (state)
			data &= ~SCPDR_RTSD;
		else
			data |= SCPDR_RTSD;
		serial_port_out(port, SCPDR, data);

		/* RTS# is output */
		serial_port_out(port, SCPCR,
				serial_port_in(port, SCPCR) | SCPCR_RTSC);
	} else if (sci_getreg(port, SCSPTR)->size) {
		u16 ctrl = serial_port_in(port, SCSPTR);

		/* Active low */
		if (state)
			ctrl &= ~SCSPTR_RTSDT;
		else
			ctrl |= SCSPTR_RTSDT;
		serial_port_out(port, SCSPTR, ctrl);
	}
}

static bool sci_get_cts(struct uart_port *port)
{
	if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
		/* Active low */
		return !(serial_port_in(port, SCPDR) & SCPDR_CTSD);
	} else if (sci_getreg(port, SCSPTR)->size) {
		/* Active low */
		return !(serial_port_in(port, SCSPTR) & SCSPTR_CTSDT);
	}

	return true;
}

1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946
/*
 * Modem control is a bit of a mixed bag for SCI(F) ports. Generally
 * CTS/RTS is supported in hardware by at least one port and controlled
 * via SCSPTR (SCxPCR for SCIFA/B parts), or external pins (presently
 * handled via the ->init_pins() op, which is a bit of a one-way street,
 * lacking any ability to defer pin control -- this will later be
 * converted over to the GPIO framework).
 *
 * Other modes (such as loopback) are supported generically on certain
 * port types, but not others. For these it's sufficient to test for the
 * existence of the support register and simply ignore the port type.
 */
static void sci_set_mctrl(struct uart_port *port, unsigned int mctrl)
L
Linus Torvalds 已提交
1947
{
1948 1949
	struct sci_port *s = to_sci_port(port);

1950 1951
	if (mctrl & TIOCM_LOOP) {
		const struct plat_sci_reg *reg;
P
Paul Mundt 已提交
1952

1953 1954 1955 1956 1957 1958 1959 1960 1961
		/*
		 * Standard loopback mode for SCFCR ports.
		 */
		reg = sci_getreg(port, SCFCR);
		if (reg->size)
			serial_port_out(port, SCFCR,
					serial_port_in(port, SCFCR) |
					SCFCR_LOOP);
	}
1962 1963

	mctrl_gpio_set(s->gpios, mctrl);
1964

1965
	if (!s->has_rtscts)
1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988
		return;

	if (!(mctrl & TIOCM_RTS)) {
		/* Disable Auto RTS */
		serial_port_out(port, SCFCR,
				serial_port_in(port, SCFCR) & ~SCFCR_MCE);

		/* Clear RTS */
		sci_set_rts(port, 0);
	} else if (s->autorts) {
		if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
			/* Enable RTS# pin function */
			serial_port_out(port, SCPCR,
				serial_port_in(port, SCPCR) & ~SCPCR_RTSC);
		}

		/* Enable Auto RTS */
		serial_port_out(port, SCFCR,
				serial_port_in(port, SCFCR) | SCFCR_MCE);
	} else {
		/* Set RTS */
		sci_set_rts(port, 1);
	}
1989
}
P
Paul Mundt 已提交
1990

1991 1992
static unsigned int sci_get_mctrl(struct uart_port *port)
{
1993 1994 1995 1996 1997 1998
	struct sci_port *s = to_sci_port(port);
	struct mctrl_gpios *gpios = s->gpios;
	unsigned int mctrl = 0;

	mctrl_gpio_get(gpios, &mctrl);

1999 2000
	/*
	 * CTS/RTS is handled in hardware when supported, while nothing
2001
	 * else is wired up.
2002
	 */
2003 2004 2005 2006
	if (s->autorts) {
		if (sci_get_cts(port))
			mctrl |= TIOCM_CTS;
	} else if (IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(gpios, UART_GPIO_CTS))) {
2007
		mctrl |= TIOCM_CTS;
2008
	}
2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019
	if (IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(gpios, UART_GPIO_DSR)))
		mctrl |= TIOCM_DSR;
	if (IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(gpios, UART_GPIO_DCD)))
		mctrl |= TIOCM_CAR;

	return mctrl;
}

static void sci_enable_ms(struct uart_port *port)
{
	mctrl_gpio_enable_ms(to_sci_port(port)->gpios);
L
Linus Torvalds 已提交
2020 2021 2022 2023
}

static void sci_break_ctl(struct uart_port *port, int break_state)
{
2024
	unsigned short scscr, scsptr;
2025
	unsigned long flags;
2026

2027
	/* check wheter the port has SCSPTR */
2028
	if (!sci_getreg(port, SCSPTR)->size) {
2029 2030 2031 2032
		/*
		 * Not supported by hardware. Most parts couple break and rx
		 * interrupts together, with break detection always enabled.
		 */
2033
		return;
2034
	}
2035

2036
	spin_lock_irqsave(&port->lock, flags);
2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049
	scsptr = serial_port_in(port, SCSPTR);
	scscr = serial_port_in(port, SCSCR);

	if (break_state == -1) {
		scsptr = (scsptr | SCSPTR_SPB2IO) & ~SCSPTR_SPB2DT;
		scscr &= ~SCSCR_TE;
	} else {
		scsptr = (scsptr | SCSPTR_SPB2DT) & ~SCSPTR_SPB2IO;
		scscr |= SCSCR_TE;
	}

	serial_port_out(port, SCSPTR, scsptr);
	serial_port_out(port, SCSCR, scscr);
2050
	spin_unlock_irqrestore(&port->lock, flags);
L
Linus Torvalds 已提交
2051 2052 2053 2054
}

static int sci_startup(struct uart_port *port)
{
2055
	struct sci_port *s = to_sci_port(port);
2056
	int ret;
L
Linus Torvalds 已提交
2057

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

2060 2061
	sci_request_dma(port);

2062
	ret = sci_request_irq(s);
2063 2064
	if (unlikely(ret < 0)) {
		sci_free_dma(port);
2065
		return ret;
2066
	}
2067

L
Linus Torvalds 已提交
2068 2069 2070 2071 2072
	return 0;
}

static void sci_shutdown(struct uart_port *port)
{
2073
	struct sci_port *s = to_sci_port(port);
2074
	unsigned long flags;
2075
	u16 scr;
L
Linus Torvalds 已提交
2076

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

2079
	s->autorts = false;
2080 2081
	mctrl_gpio_disable_ms(to_sci_port(port)->gpios);

2082
	spin_lock_irqsave(&port->lock, flags);
L
Linus Torvalds 已提交
2083
	sci_stop_rx(port);
2084
	sci_stop_tx(port);
2085 2086 2087 2088
	/*
	 * Stop RX and TX, disable related interrupts, keep clock source
	 * and HSCIF TOT bits
	 */
2089
	scr = serial_port_in(port, SCSCR);
2090 2091
	serial_port_out(port, SCSCR, scr &
			(SCSCR_CKE1 | SCSCR_CKE0 | s->hscif_tot));
2092
	spin_unlock_irqrestore(&port->lock, flags);
2093

2094 2095 2096 2097
#ifdef CONFIG_SERIAL_SH_SCI_DMA
	if (s->chan_rx) {
		dev_dbg(port->dev, "%s(%d) deleting rx_timer\n", __func__,
			port->line);
2098
		hrtimer_cancel(&s->rx_timer);
2099 2100 2101
	}
#endif

L
Linus Torvalds 已提交
2102
	sci_free_irq(s);
2103
	sci_free_dma(port);
L
Linus Torvalds 已提交
2104 2105
}

2106 2107
static int sci_sck_calc(struct sci_port *s, unsigned int bps,
			unsigned int *srr)
2108
{
2109 2110
	unsigned long freq = s->clk_rates[SCI_SCK];
	int err, min_err = INT_MAX;
2111
	unsigned int sr;
2112

2113 2114
	if (s->port.type != PORT_HSCIF)
		freq *= 2;
2115

2116
	for_each_sr(sr, s) {
2117 2118 2119 2120 2121 2122
		err = DIV_ROUND_CLOSEST(freq, sr) - bps;
		if (abs(err) >= abs(min_err))
			continue;

		min_err = err;
		*srr = sr - 1;
2123

2124 2125 2126
		if (!err)
			break;
	}
2127

2128 2129 2130
	dev_dbg(s->port.dev, "SCK: %u%+d bps using SR %u\n", bps, min_err,
		*srr + 1);
	return min_err;
2131 2132
}

2133 2134 2135
static int sci_brg_calc(struct sci_port *s, unsigned int bps,
			unsigned long freq, unsigned int *dlr,
			unsigned int *srr)
2136
{
2137
	int err, min_err = INT_MAX;
2138
	unsigned int sr, dl;
2139

2140 2141
	if (s->port.type != PORT_HSCIF)
		freq *= 2;
2142

2143
	for_each_sr(sr, s) {
2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157
		dl = DIV_ROUND_CLOSEST(freq, sr * bps);
		dl = clamp(dl, 1U, 65535U);

		err = DIV_ROUND_CLOSEST(freq, sr * dl) - bps;
		if (abs(err) >= abs(min_err))
			continue;

		min_err = err;
		*dlr = dl;
		*srr = sr - 1;

		if (!err)
			break;
	}
2158

2159 2160 2161 2162
	dev_dbg(s->port.dev, "BRG: %u%+d bps using DL %u SR %u\n", bps,
		min_err, *dlr, *srr + 1);
	return min_err;
}
2163

2164
/* calculate sample rate, BRR, and clock select */
2165 2166 2167
static int sci_scbrr_calc(struct sci_port *s, unsigned int bps,
			  unsigned int *brr, unsigned int *srr,
			  unsigned int *cks)
U
Ulrich Hecht 已提交
2168
{
2169
	unsigned long freq = s->clk_rates[SCI_FCK];
2170
	unsigned int sr, br, prediv, scrate, c;
2171
	int err, min_err = INT_MAX;
U
Ulrich Hecht 已提交
2172

2173 2174
	if (s->port.type != PORT_HSCIF)
		freq *= 2;
2175

2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190
	/*
	 * Find the combination of sample rate and clock select with the
	 * smallest deviation from the desired baud rate.
	 * Prefer high sample rates to maximise the receive margin.
	 *
	 * M: Receive margin (%)
	 * N: Ratio of bit rate to clock (N = sampling rate)
	 * D: Clock duty (D = 0 to 1.0)
	 * L: Frame length (L = 9 to 12)
	 * F: Absolute value of clock frequency deviation
	 *
	 *  M = |(0.5 - 1 / 2 * N) - ((L - 0.5) * F) -
	 *      (|D - 0.5| / N * (1 + F))|
	 *  NOTE: Usually, treat D for 0.5, F is 0 by this calculation.
	 */
2191
	for_each_sr(sr, s) {
U
Ulrich Hecht 已提交
2192 2193
		for (c = 0; c <= 3; c++) {
			/* integerized formulas from HSCIF documentation */
2194
			prediv = sr * (1 << (2 * c + 1));
2195 2196 2197 2198 2199

			/*
			 * We need to calculate:
			 *
			 *     br = freq / (prediv * bps) clamped to [1..256]
2200
			 *     err = freq / (br * prediv) - bps
2201
			 *
2202 2203
			 * Watch out for overflow when calculating the desired
			 * sampling clock rate!
2204
			 */
2205 2206 2207 2208 2209
			if (bps > UINT_MAX / prediv)
				break;

			scrate = prediv * bps;
			br = DIV_ROUND_CLOSEST(freq, scrate);
2210
			br = clamp(br, 1U, 256U);
2211

2212
			err = DIV_ROUND_CLOSEST(freq, br * prediv) - bps;
2213
			if (abs(err) >= abs(min_err))
2214 2215
				continue;

2216
			min_err = err;
2217
			*brr = br - 1;
2218 2219
			*srr = sr - 1;
			*cks = c;
2220 2221 2222

			if (!err)
				goto found;
U
Ulrich Hecht 已提交
2223 2224 2225
		}
	}

2226
found:
2227 2228
	dev_dbg(s->port.dev, "BRR: %u%+d bps using N %u SR %u cks %u\n", bps,
		min_err, *brr, *srr + 1, *cks);
2229
	return min_err;
U
Ulrich Hecht 已提交
2230 2231
}

2232 2233
static void sci_reset(struct uart_port *port)
{
2234
	const struct plat_sci_reg *reg;
2235
	unsigned int status;
2236
	struct sci_port *s = to_sci_port(port);
2237

2238
	serial_port_out(port, SCSCR, s->hscif_tot);	/* TE=0, RE=0, CKE1=0 */
2239

2240 2241
	reg = sci_getreg(port, SCFCR);
	if (reg->size)
2242
		serial_port_out(port, SCFCR, SCFCR_RFRST | SCFCR_TFRST);
2243 2244 2245 2246

	sci_clear_SCxSR(port,
			SCxSR_RDxF_CLEAR(port) & SCxSR_ERROR_CLEAR(port) &
			SCxSR_BREAK_CLEAR(port));
2247 2248 2249 2250 2251
	if (sci_getreg(port, SCLSR)->size) {
		status = serial_port_in(port, SCLSR);
		status &= ~(SCLSR_TO | SCLSR_ORER);
		serial_port_out(port, SCLSR, status);
	}
2252

2253 2254 2255
	if (s->rx_trigger > 1) {
		if (s->rx_fifo_timeout) {
			scif_set_rtrg(port, 1);
2256
			timer_setup(&s->rx_fifo_timer, rx_fifo_timer_fn, 0);
2257
		} else {
2258 2259 2260 2261 2262
			if (port->type == PORT_SCIFA ||
			    port->type == PORT_SCIFB)
				scif_set_rtrg(port, 1);
			else
				scif_set_rtrg(port, s->rx_trigger);
2263 2264
		}
	}
2265 2266
}

A
Alan Cox 已提交
2267 2268
static void sci_set_termios(struct uart_port *port, struct ktermios *termios,
			    struct ktermios *old)
L
Linus Torvalds 已提交
2269
{
2270
	unsigned int baud, smr_val = SCSMR_ASYNC, scr_val = 0, i, bits;
2271 2272
	unsigned int brr = 255, cks = 0, srr = 15, dl = 0, sccks = 0;
	unsigned int brr1 = 255, cks1 = 0, srr1 = 15, dl1 = 0;
2273
	struct sci_port *s = to_sci_port(port);
2274
	const struct plat_sci_reg *reg;
2275 2276 2277
	int min_err = INT_MAX, err;
	unsigned long max_freq = 0;
	int best_clk = -1;
2278
	unsigned long flags;
L
Linus Torvalds 已提交
2279

2280 2281 2282 2283 2284 2285 2286 2287 2288
	if ((termios->c_cflag & CSIZE) == CS7)
		smr_val |= SCSMR_CHR;
	if (termios->c_cflag & PARENB)
		smr_val |= SCSMR_PE;
	if (termios->c_cflag & PARODD)
		smr_val |= SCSMR_PE | SCSMR_ODD;
	if (termios->c_cflag & CSTOPB)
		smr_val |= SCSMR_STOP;

2289 2290 2291 2292 2293 2294 2295 2296
	/*
	 * 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.
	 */
2297 2298 2299 2300
	if (!port->uartclk) {
		baud = uart_get_baud_rate(port, termios, old, 0, 115200);
		goto done;
	}
L
Linus Torvalds 已提交
2301

2302 2303 2304
	for (i = 0; i < SCI_NUM_CLKS; i++)
		max_freq = max(max_freq, s->clk_rates[i]);

2305
	baud = uart_get_baud_rate(port, termios, old, 0, max_freq / min_sr(s));
2306 2307 2308 2309 2310 2311 2312 2313
	if (!baud)
		goto done;

	/*
	 * There can be multiple sources for the sampling clock.  Find the one
	 * that gives us the smallest deviation from the desired baud rate.
	 */

2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328
	/* Optional Undivided External Clock */
	if (s->clk_rates[SCI_SCK] && port->type != PORT_SCIFA &&
	    port->type != PORT_SCIFB) {
		err = sci_sck_calc(s, baud, &srr1);
		if (abs(err) < abs(min_err)) {
			best_clk = SCI_SCK;
			scr_val = SCSCR_CKE1;
			sccks = SCCKS_CKS;
			min_err = err;
			srr = srr1;
			if (!err)
				goto done;
		}
	}

2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357
	/* Optional BRG Frequency Divided External Clock */
	if (s->clk_rates[SCI_SCIF_CLK] && sci_getreg(port, SCDL)->size) {
		err = sci_brg_calc(s, baud, s->clk_rates[SCI_SCIF_CLK], &dl1,
				   &srr1);
		if (abs(err) < abs(min_err)) {
			best_clk = SCI_SCIF_CLK;
			scr_val = SCSCR_CKE1;
			sccks = 0;
			min_err = err;
			dl = dl1;
			srr = srr1;
			if (!err)
				goto done;
		}
	}

	/* Optional BRG Frequency Divided Internal Clock */
	if (s->clk_rates[SCI_BRG_INT] && sci_getreg(port, SCDL)->size) {
		err = sci_brg_calc(s, baud, s->clk_rates[SCI_BRG_INT], &dl1,
				   &srr1);
		if (abs(err) < abs(min_err)) {
			best_clk = SCI_BRG_INT;
			scr_val = SCSCR_CKE1;
			sccks = SCCKS_XIN;
			min_err = err;
			dl = dl1;
			srr = srr1;
			if (!min_err)
				goto done;
U
Ulrich Hecht 已提交
2358 2359
		}
	}
2360

2361 2362 2363 2364
	/* Divided Functional Clock using standard Bit Rate Register */
	err = sci_scbrr_calc(s, baud, &brr1, &srr1, &cks1);
	if (abs(err) < abs(min_err)) {
		best_clk = SCI_FCK;
2365
		scr_val = 0;
2366 2367 2368 2369 2370 2371 2372 2373 2374 2375
		min_err = err;
		brr = brr1;
		srr = srr1;
		cks = cks1;
	}

done:
	if (best_clk >= 0)
		dev_dbg(port->dev, "Using clk %pC for %u%+d bps\n",
			s->clks[best_clk], baud, min_err);
2376

2377
	sci_port_enable(s);
2378

2379 2380 2381 2382
	/*
	 * Program the optional External Baud Rate Generator (BRG) first.
	 * It controls the mux to select (H)SCK or frequency divided clock.
	 */
2383 2384
	if (best_clk >= 0 && sci_getreg(port, SCCKS)->size) {
		serial_port_out(port, SCDL, dl);
2385
		serial_port_out(port, SCCKS, sccks);
2386
	}
L
Linus Torvalds 已提交
2387

2388 2389
	spin_lock_irqsave(&port->lock, flags);

2390
	sci_reset(port);
L
Linus Torvalds 已提交
2391 2392 2393

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

2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414
	/* byte size and parity */
	switch (termios->c_cflag & CSIZE) {
	case CS5:
		bits = 7;
		break;
	case CS6:
		bits = 8;
		break;
	case CS7:
		bits = 9;
		break;
	default:
		bits = 10;
		break;
	}

	if (termios->c_cflag & CSTOPB)
		bits++;
	if (termios->c_cflag & PARENB)
		bits++;

2415
	if (best_clk >= 0) {
2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426
		if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
			switch (srr + 1) {
			case 5:  smr_val |= SCSMR_SRC_5;  break;
			case 7:  smr_val |= SCSMR_SRC_7;  break;
			case 11: smr_val |= SCSMR_SRC_11; break;
			case 13: smr_val |= SCSMR_SRC_13; break;
			case 16: smr_val |= SCSMR_SRC_16; break;
			case 17: smr_val |= SCSMR_SRC_17; break;
			case 19: smr_val |= SCSMR_SRC_19; break;
			case 27: smr_val |= SCSMR_SRC_27; break;
			}
2427
		smr_val |= cks;
2428
		serial_port_out(port, SCSCR, scr_val | s->hscif_tot);
2429 2430
		serial_port_out(port, SCSMR, smr_val);
		serial_port_out(port, SCBRR, brr);
2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451
		if (sci_getreg(port, HSSRR)->size) {
			unsigned int hssrr = srr | HSCIF_SRE;
			/* Calculate deviation from intended rate at the
			 * center of the last stop bit in sampling clocks.
			 */
			int last_stop = bits * 2 - 1;
			int deviation = min_err * srr * last_stop / 2 / baud;

			if (abs(deviation) >= 2) {
				/* At least two sampling clocks off at the
				 * last stop bit; we can increase the error
				 * margin by shifting the sampling point.
				 */
				int shift = min(-8, max(7, deviation / 2));

				hssrr |= (shift << HSCIF_SRHP_SHIFT) &
					 HSCIF_SRHP_MASK;
				hssrr |= HSCIF_SRDE;
			}
			serial_port_out(port, HSSRR, hssrr);
		}
2452 2453 2454 2455 2456 2457

		/* Wait one bit interval */
		udelay((1000000 + (baud - 1)) / baud);
	} else {
		/* Don't touch the bit rate configuration */
		scr_val = s->cfg->scscr & (SCSCR_CKE1 | SCSCR_CKE0);
2458 2459
		smr_val |= serial_port_in(port, SCSMR) &
			   (SCSMR_CKEDG | SCSMR_SRC_MASK | SCSMR_CKS);
2460
		serial_port_out(port, SCSCR, scr_val | s->hscif_tot);
2461
		serial_port_out(port, SCSMR, smr_val);
2462
	}
L
Linus Torvalds 已提交
2463

2464
	sci_init_pins(port, termios->c_cflag);
2465

2466 2467
	port->status &= ~UPSTAT_AUTOCTS;
	s->autorts = false;
2468 2469
	reg = sci_getreg(port, SCFCR);
	if (reg->size) {
2470
		unsigned short ctrl = serial_port_in(port, SCFCR);
2471

2472 2473 2474 2475 2476 2477
		if ((port->flags & UPF_HARD_FLOW) &&
		    (termios->c_cflag & CRTSCTS)) {
			/* There is no CTS interrupt to restart the hardware */
			port->status |= UPSTAT_AUTOCTS;
			/* MCE is enabled when RTS is raised */
			s->autorts = true;
2478
		}
2479 2480 2481 2482 2483 2484 2485 2486

		/*
		 * As we've done a sci_reset() above, ensure we don't
		 * interfere with the FIFOs while toggling MCE. As the
		 * reset values could still be set, simply mask them out.
		 */
		ctrl &= ~(SCFCR_RFRST | SCFCR_TFRST);

2487
		serial_port_out(port, SCFCR, ctrl);
2488
	}
2489 2490 2491 2492
	if (port->flags & UPF_HARD_FLOW) {
		/* Refresh (Auto) RTS */
		sci_set_mctrl(port, port->mctrl);
	}
2493

2494 2495
	scr_val |= SCSCR_RE | SCSCR_TE |
		   (s->cfg->scscr & ~(SCSCR_CKE1 | SCSCR_CKE0));
2496
	serial_port_out(port, SCSCR, scr_val | s->hscif_tot);
2497 2498 2499 2500 2501 2502 2503 2504 2505 2506
	if ((srr + 1 == 5) &&
	    (port->type == PORT_SCIFA || port->type == PORT_SCIFB)) {
		/*
		 * In asynchronous mode, when the sampling rate is 1/5, first
		 * received data may become invalid on some SCIFA and SCIFB.
		 * To avoid this problem wait more than 1 serial data time (1
		 * bit time x serial data number) after setting SCSCR.RE = 1.
		 */
		udelay(DIV_ROUND_UP(10 * 1000000, baud));
	}
L
Linus Torvalds 已提交
2507

2508
	/*
2509
	 * Calculate delay for 2 DMA buffers (4 FIFO).
2510 2511 2512 2513 2514 2515 2516
	 * See 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 5 jiffies (20ms) for 2 DMA
	 * buffers (4 FIFO sizes), but when performing a faster transfer, the
	 * value obtained by this formula is too small. Therefore, if the value
	 * is smaller than 20ms, use 20ms as the timeout value for DMA.
2517
	 */
2518
	s->rx_frame = (10000 * bits) / (baud / 100);
2519
#ifdef CONFIG_SERIAL_SH_SCI_DMA
2520 2521 2522
	s->rx_timeout = s->buf_len_rx * 2 * s->rx_frame;
	if (s->rx_timeout < 20)
		s->rx_timeout = 20;
2523 2524
#endif

L
Linus Torvalds 已提交
2525
	if ((termios->c_cflag & CREAD) != 0)
2526
		sci_start_rx(port);
2527

2528 2529
	spin_unlock_irqrestore(&port->lock, flags);

2530
	sci_port_disable(s);
2531 2532 2533

	if (UART_ENABLE_MS(port, termios->c_cflag))
		sci_enable_ms(port);
L
Linus Torvalds 已提交
2534 2535
}

2536 2537 2538 2539 2540 2541
static void sci_pm(struct uart_port *port, unsigned int state,
		   unsigned int oldstate)
{
	struct sci_port *sci_port = to_sci_port(port);

	switch (state) {
2542
	case UART_PM_STATE_OFF:
2543 2544 2545 2546 2547 2548 2549 2550
		sci_port_disable(sci_port);
		break;
	default:
		sci_port_enable(sci_port);
		break;
	}
}

L
Linus Torvalds 已提交
2551 2552 2553
static const char *sci_type(struct uart_port *port)
{
	switch (port->type) {
2554 2555 2556 2557 2558 2559 2560 2561
	case PORT_IRDA:
		return "irda";
	case PORT_SCI:
		return "sci";
	case PORT_SCIF:
		return "scif";
	case PORT_SCIFA:
		return "scifa";
2562 2563
	case PORT_SCIFB:
		return "scifb";
U
Ulrich Hecht 已提交
2564 2565
	case PORT_HSCIF:
		return "hscif";
L
Linus Torvalds 已提交
2566 2567
	}

P
Paul Mundt 已提交
2568
	return NULL;
L
Linus Torvalds 已提交
2569 2570
}

2571 2572
static int sci_remap_port(struct uart_port *port)
{
2573
	struct sci_port *sport = to_sci_port(port);
2574 2575 2576 2577 2578 2579 2580

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

2581
	if (port->dev->of_node || (port->flags & UPF_IOREMAP)) {
2582
		port->membase = ioremap_nocache(port->mapbase, sport->reg_size);
2583 2584 2585 2586 2587 2588 2589 2590 2591 2592
		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.
		 */
J
Jingoo Han 已提交
2593
		port->membase = (void __iomem *)(uintptr_t)port->mapbase;
2594 2595 2596 2597 2598
	}

	return 0;
}

2599
static void sci_release_port(struct uart_port *port)
L
Linus Torvalds 已提交
2600
{
2601 2602
	struct sci_port *sport = to_sci_port(port);

2603
	if (port->dev->of_node || (port->flags & UPF_IOREMAP)) {
2604 2605 2606 2607
		iounmap(port->membase);
		port->membase = NULL;
	}

2608
	release_mem_region(port->mapbase, sport->reg_size);
L
Linus Torvalds 已提交
2609 2610
}

2611
static int sci_request_port(struct uart_port *port)
L
Linus Torvalds 已提交
2612
{
2613
	struct resource *res;
2614
	struct sci_port *sport = to_sci_port(port);
2615
	int ret;
L
Linus Torvalds 已提交
2616

2617 2618 2619 2620
	res = request_mem_region(port->mapbase, sport->reg_size,
				 dev_name(port->dev));
	if (unlikely(res == NULL)) {
		dev_err(port->dev, "request_mem_region failed.");
2621
		return -EBUSY;
2622
	}
L
Linus Torvalds 已提交
2623

2624 2625 2626 2627
	ret = sci_remap_port(port);
	if (unlikely(ret != 0)) {
		release_resource(res);
		return ret;
2628
	}
2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640

	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 已提交
2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651
}

static int sci_verify_port(struct uart_port *port, struct serial_struct *ser)
{
	if (ser->baud_base < 2400)
		/* No paper tape reader for Mitch.. */
		return -EINVAL;

	return 0;
}

2652
static const struct uart_ops sci_uart_ops = {
L
Linus Torvalds 已提交
2653 2654 2655 2656 2657 2658
	.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,
2659
	.enable_ms	= sci_enable_ms,
L
Linus Torvalds 已提交
2660 2661 2662
	.break_ctl	= sci_break_ctl,
	.startup	= sci_startup,
	.shutdown	= sci_shutdown,
2663
	.flush_buffer	= sci_flush_buffer,
L
Linus Torvalds 已提交
2664
	.set_termios	= sci_set_termios,
2665
	.pm		= sci_pm,
L
Linus Torvalds 已提交
2666 2667 2668 2669 2670
	.type		= sci_type,
	.release_port	= sci_release_port,
	.request_port	= sci_request_port,
	.config_port	= sci_config_port,
	.verify_port	= sci_verify_port,
2671 2672 2673 2674
#ifdef CONFIG_CONSOLE_POLL
	.poll_get_char	= sci_poll_get_char,
	.poll_put_char	= sci_poll_put_char,
#endif
L
Linus Torvalds 已提交
2675 2676
};

2677 2678
static int sci_init_clocks(struct sci_port *sci_port, struct device *dev)
{
2679 2680
	const char *clk_names[] = {
		[SCI_FCK] = "fck",
2681
		[SCI_SCK] = "sck",
2682 2683
		[SCI_BRG_INT] = "brg_int",
		[SCI_SCIF_CLK] = "scif_clk",
2684 2685 2686
	};
	struct clk *clk;
	unsigned int i;
2687

2688 2689 2690
	if (sci_port->cfg->type == PORT_HSCIF)
		clk_names[SCI_SCK] = "hsck";

2691 2692 2693 2694
	for (i = 0; i < SCI_NUM_CLKS; i++) {
		clk = devm_clk_get(dev, clk_names[i]);
		if (PTR_ERR(clk) == -EPROBE_DEFER)
			return -EPROBE_DEFER;
2695

2696 2697 2698 2699 2700 2701 2702 2703
		if (IS_ERR(clk) && i == SCI_FCK) {
			/*
			 * "fck" used to be called "sci_ick", and we need to
			 * maintain DT backward compatibility.
			 */
			clk = devm_clk_get(dev, "sci_ick");
			if (PTR_ERR(clk) == -EPROBE_DEFER)
				return -EPROBE_DEFER;
2704

2705 2706
			if (!IS_ERR(clk))
				goto found;
2707

2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731
			/*
			 * Not all SH platforms declare a clock lookup entry
			 * for SCI devices, in which case we need to get the
			 * global "peripheral_clk" clock.
			 */
			clk = devm_clk_get(dev, "peripheral_clk");
			if (!IS_ERR(clk))
				goto found;

			dev_err(dev, "failed to get %s (%ld)\n", clk_names[i],
				PTR_ERR(clk));
			return PTR_ERR(clk);
		}

found:
		if (IS_ERR(clk))
			dev_dbg(dev, "failed to get %s (%ld)\n", clk_names[i],
				PTR_ERR(clk));
		else
			dev_dbg(dev, "clk %s is %pC rate %pCr\n", clk_names[i],
				clk, clk);
		sci_port->clks[i] = IS_ERR(clk) ? NULL : clk;
	}
	return 0;
2732 2733
}

2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774
static const struct sci_port_params *
sci_probe_regmap(const struct plat_sci_port *cfg)
{
	unsigned int regtype;

	if (cfg->regtype != SCIx_PROBE_REGTYPE)
		return &sci_port_params[cfg->regtype];

	switch (cfg->type) {
	case PORT_SCI:
		regtype = SCIx_SCI_REGTYPE;
		break;
	case PORT_IRDA:
		regtype = SCIx_IRDA_REGTYPE;
		break;
	case PORT_SCIFA:
		regtype = SCIx_SCIFA_REGTYPE;
		break;
	case PORT_SCIFB:
		regtype = SCIx_SCIFB_REGTYPE;
		break;
	case PORT_SCIF:
		/*
		 * The SH-4 is a bit of a misnomer here, although that's
		 * where this particular port layout originated. This
		 * configuration (or some slight variation thereof)
		 * remains the dominant model for all SCIFs.
		 */
		regtype = SCIx_SH4_SCIF_REGTYPE;
		break;
	case PORT_HSCIF:
		regtype = SCIx_HSCIF_REGTYPE;
		break;
	default:
		pr_err("Can't probe register map for given port\n");
		return NULL;
	}

	return &sci_port_params[regtype];
}

B
Bill Pemberton 已提交
2775
static int sci_init_single(struct platform_device *dev,
2776
			   struct sci_port *sci_port, unsigned int index,
2777
			   const struct plat_sci_port *p, bool early)
2778
{
2779
	struct uart_port *port = &sci_port->port;
2780 2781
	const struct resource *res;
	unsigned int i;
2782
	int ret;
2783

2784 2785
	sci_port->cfg	= p;

2786 2787 2788
	port->ops	= &sci_uart_ops;
	port->iotype	= UPIO_MEM;
	port->line	= index;
2789

2790 2791 2792
	res = platform_get_resource(dev, IORESOURCE_MEM, 0);
	if (res == NULL)
		return -ENOMEM;
2793

2794
	port->mapbase = res->start;
2795
	sci_port->reg_size = resource_size(res);
2796

2797 2798
	for (i = 0; i < ARRAY_SIZE(sci_port->irqs); ++i)
		sci_port->irqs[i] = platform_get_irq(dev, i);
2799

2800 2801 2802 2803 2804 2805 2806
	/* The SCI generates several interrupts. They can be muxed together or
	 * connected to different interrupt lines. In the muxed case only one
	 * interrupt resource is specified. In the non-muxed case three or four
	 * interrupt resources are specified, as the BRI interrupt is optional.
	 */
	if (sci_port->irqs[0] < 0)
		return -ENXIO;
2807

2808 2809 2810 2811
	if (sci_port->irqs[1] < 0) {
		sci_port->irqs[1] = sci_port->irqs[0];
		sci_port->irqs[2] = sci_port->irqs[0];
		sci_port->irqs[3] = sci_port->irqs[0];
2812 2813
	}

2814 2815 2816
	sci_port->params = sci_probe_regmap(p);
	if (unlikely(sci_port->params == NULL))
		return -EINVAL;
2817

2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839
	switch (p->type) {
	case PORT_SCIFB:
		sci_port->rx_trigger = 48;
		break;
	case PORT_HSCIF:
		sci_port->rx_trigger = 64;
		break;
	case PORT_SCIFA:
		sci_port->rx_trigger = 32;
		break;
	case PORT_SCIF:
		if (p->regtype == SCIx_SH7705_SCIF_REGTYPE)
			/* RX triggering not implemented for this IP */
			sci_port->rx_trigger = 1;
		else
			sci_port->rx_trigger = 8;
		break;
	default:
		sci_port->rx_trigger = 1;
		break;
	}

2840
	sci_port->rx_fifo_timeout = 0;
2841
	sci_port->hscif_tot = 0;
2842

2843 2844 2845
	/* SCIFA on sh7723 and sh7724 need a custom sampling rate that doesn't
	 * match the SoC datasheet, this should be investigated. Let platform
	 * data override the sampling rate for now.
2846
	 */
2847 2848 2849
	sci_port->sampling_rate_mask = p->sampling_rate
				     ? SCI_SR(p->sampling_rate)
				     : sci_port->params->sampling_rate_mask;
2850

2851
	if (!early) {
2852 2853 2854
		ret = sci_init_clocks(sci_port, &dev->dev);
		if (ret < 0)
			return ret;
2855

2856
		port->dev = &dev->dev;
M
Magnus Damm 已提交
2857 2858

		pm_runtime_enable(&dev->dev);
2859
	}
2860

2861
	port->type		= p->type;
2862
	port->flags		= UPF_FIXED_PORT | UPF_BOOT_AUTOCONF | p->flags;
2863
	port->fifosize		= sci_port->params->fifosize;
2864

2865 2866 2867 2868 2869 2870 2871
	if (port->type == PORT_SCI) {
		if (sci_port->reg_size >= 0x20)
			port->regshift = 2;
		else
			port->regshift = 1;
	}

2872
	/*
2873
	 * The UART port needs an IRQ value, so we peg this to the RX IRQ
2874 2875 2876 2877 2878
	 * 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.
	 */
2879
	port->irq		= sci_port->irqs[SCIx_RXI_IRQ];
Y
Yong Zhang 已提交
2880
	port->irqflags		= 0;
2881

2882 2883 2884
	port->serial_in		= sci_serial_in;
	port->serial_out	= sci_serial_out;

2885
	return 0;
2886 2887
}

2888 2889 2890 2891 2892
static void sci_cleanup_single(struct sci_port *port)
{
	pm_runtime_disable(port->port.dev);
}

2893 2894
#if defined(CONFIG_SERIAL_SH_SCI_CONSOLE) || \
    defined(CONFIG_SERIAL_SH_SCI_EARLYCON)
2895 2896 2897 2898 2899
static void serial_console_putchar(struct uart_port *port, int ch)
{
	sci_poll_put_char(port, ch);
}

L
Linus Torvalds 已提交
2900 2901 2902 2903 2904 2905 2906
/*
 *	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)
{
2907 2908
	struct sci_port *sci_port = &sci_ports[co->index];
	struct uart_port *port = &sci_port->port;
2909
	unsigned short bits, ctrl, ctrl_temp;
2910 2911 2912 2913
	unsigned long flags;
	int locked = 1;

	local_irq_save(flags);
2914
#if defined(SUPPORT_SYSRQ)
2915 2916
	if (port->sysrq)
		locked = 0;
2917 2918 2919
	else
#endif
	if (oops_in_progress)
2920 2921 2922 2923
		locked = spin_trylock(&port->lock);
	else
		spin_lock(&port->lock);

2924
	/* first save SCSCR then disable interrupts, keep clock source */
2925
	ctrl = serial_port_in(port, SCSCR);
2926 2927
	ctrl_temp = SCSCR_RE | SCSCR_TE |
		    (sci_port->cfg->scscr & ~(SCSCR_CKE1 | SCSCR_CKE0)) |
2928
		    (ctrl & (SCSCR_CKE1 | SCSCR_CKE0));
2929
	serial_port_out(port, SCSCR, ctrl_temp | sci_port->hscif_tot);
2930

2931
	uart_console_write(port, s, count, serial_console_putchar);
M
Magnus Damm 已提交
2932 2933 2934

	/* wait until fifo is empty and last bit has been transmitted */
	bits = SCxSR_TDxE(port) | SCxSR_TEND(port);
2935
	while ((serial_port_in(port, SCxSR) & bits) != bits)
M
Magnus Damm 已提交
2936
		cpu_relax();
2937 2938 2939 2940 2941 2942 2943

	/* restore the SCSCR */
	serial_port_out(port, SCSCR, ctrl);

	if (locked)
		spin_unlock(&port->lock);
	local_irq_restore(flags);
L
Linus Torvalds 已提交
2944 2945
}

B
Bill Pemberton 已提交
2946
static int serial_console_setup(struct console *co, char *options)
L
Linus Torvalds 已提交
2947
{
2948
	struct sci_port *sci_port;
L
Linus Torvalds 已提交
2949 2950 2951 2952 2953 2954 2955
	struct uart_port *port;
	int baud = 115200;
	int bits = 8;
	int parity = 'n';
	int flow = 'n';
	int ret;

2956
	/*
2957
	 * Refuse to handle any bogus ports.
L
Linus Torvalds 已提交
2958
	 */
2959
	if (co->index < 0 || co->index >= SCI_NPORTS)
2960 2961
		return -ENODEV;

2962 2963 2964
	sci_port = &sci_ports[co->index];
	port = &sci_port->port;

2965 2966 2967 2968 2969 2970
	/*
	 * Refuse to handle uninitialized ports.
	 */
	if (!port->ops)
		return -ENODEV;

2971 2972 2973
	ret = sci_remap_port(port);
	if (unlikely(ret != 0))
		return ret;
2974

L
Linus Torvalds 已提交
2975 2976 2977
	if (options)
		uart_parse_options(options, &baud, &parity, &bits, &flow);

2978
	return uart_set_options(port, co, baud, parity, bits, flow);
L
Linus Torvalds 已提交
2979 2980 2981 2982
}

static struct console serial_console = {
	.name		= "ttySC",
2983
	.device		= uart_console_device,
L
Linus Torvalds 已提交
2984 2985
	.write		= serial_console_write,
	.setup		= serial_console_setup,
P
Paul Mundt 已提交
2986
	.flags		= CON_PRINTBUFFER,
L
Linus Torvalds 已提交
2987
	.index		= -1,
2988
	.data		= &sci_uart_driver,
L
Linus Torvalds 已提交
2989 2990
};

2991 2992 2993 2994
static struct console early_serial_console = {
	.name           = "early_ttySC",
	.write          = serial_console_write,
	.flags          = CON_PRINTBUFFER,
2995
	.index		= -1,
2996
};
2997

2998 2999
static char early_serial_buf[32];

B
Bill Pemberton 已提交
3000
static int sci_probe_earlyprintk(struct platform_device *pdev)
3001
{
3002
	const struct plat_sci_port *cfg = dev_get_platdata(&pdev->dev);
3003 3004 3005 3006 3007 3008

	if (early_serial_console.data)
		return -EEXIST;

	early_serial_console.index = pdev->id;

3009
	sci_init_single(pdev, &sci_ports[pdev->id], pdev->id, cfg, true);
3010 3011 3012 3013 3014 3015 3016 3017 3018

	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;
}
3019 3020 3021

#define SCI_CONSOLE	(&serial_console)

3022
#else
B
Bill Pemberton 已提交
3023
static inline int sci_probe_earlyprintk(struct platform_device *pdev)
3024 3025 3026
{
	return -EINVAL;
}
L
Linus Torvalds 已提交
3027

3028 3029
#define SCI_CONSOLE	NULL

3030
#endif /* CONFIG_SERIAL_SH_SCI_CONSOLE || CONFIG_SERIAL_SH_SCI_EARLYCON */
L
Linus Torvalds 已提交
3031

3032
static const char banner[] __initconst = "SuperH (H)SCI(F) driver initialized";
L
Linus Torvalds 已提交
3033

3034
static DEFINE_MUTEX(sci_uart_registration_lock);
L
Linus Torvalds 已提交
3035 3036 3037 3038 3039 3040
static struct uart_driver sci_uart_driver = {
	.owner		= THIS_MODULE,
	.driver_name	= "sci",
	.dev_name	= "ttySC",
	.major		= SCI_MAJOR,
	.minor		= SCI_MINOR_START,
3041
	.nr		= SCI_NPORTS,
L
Linus Torvalds 已提交
3042 3043 3044
	.cons		= SCI_CONSOLE,
};

3045
static int sci_remove(struct platform_device *dev)
3046
{
3047
	struct sci_port *port = platform_get_drvdata(dev);
3048

3049
	sci_ports_in_use &= ~BIT(port->port.line);
3050 3051
	uart_remove_one_port(&sci_uart_driver, &port->port);

3052
	sci_cleanup_single(port);
3053

3054 3055 3056 3057
	if (port->port.fifosize > 1) {
		sysfs_remove_file(&dev->dev.kobj,
				  &dev_attr_rx_fifo_trigger.attr);
	}
3058 3059
	if (port->port.type == PORT_SCIFA || port->port.type == PORT_SCIFB ||
	    port->port.type == PORT_HSCIF) {
3060 3061 3062 3063
		sysfs_remove_file(&dev->dev.kobj,
				  &dev_attr_rx_fifo_timeout.attr);
	}

3064 3065 3066
	return 0;
}

3067 3068 3069 3070

#define SCI_OF_DATA(type, regtype)	(void *)((type) << 16 | (regtype))
#define SCI_OF_TYPE(data)		((unsigned long)(data) >> 16)
#define SCI_OF_REGTYPE(data)		((unsigned long)(data) & 0xffff)
B
Bastian Hecht 已提交
3071 3072

static const struct of_device_id of_sci_match[] = {
3073 3074 3075 3076 3077
	/* SoC-specific types */
	{
		.compatible = "renesas,scif-r7s72100",
		.data = SCI_OF_DATA(PORT_SCIF, SCIx_SH2_SCIF_FIFODATA_REGTYPE),
	},
3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088
	/* Family-specific types */
	{
		.compatible = "renesas,rcar-gen1-scif",
		.data = SCI_OF_DATA(PORT_SCIF, SCIx_SH4_SCIF_BRG_REGTYPE),
	}, {
		.compatible = "renesas,rcar-gen2-scif",
		.data = SCI_OF_DATA(PORT_SCIF, SCIx_SH4_SCIF_BRG_REGTYPE),
	}, {
		.compatible = "renesas,rcar-gen3-scif",
		.data = SCI_OF_DATA(PORT_SCIF, SCIx_SH4_SCIF_BRG_REGTYPE),
	},
3089
	/* Generic types */
B
Bastian Hecht 已提交
3090 3091
	{
		.compatible = "renesas,scif",
3092
		.data = SCI_OF_DATA(PORT_SCIF, SCIx_SH4_SCIF_REGTYPE),
B
Bastian Hecht 已提交
3093 3094
	}, {
		.compatible = "renesas,scifa",
3095
		.data = SCI_OF_DATA(PORT_SCIFA, SCIx_SCIFA_REGTYPE),
B
Bastian Hecht 已提交
3096 3097
	}, {
		.compatible = "renesas,scifb",
3098
		.data = SCI_OF_DATA(PORT_SCIFB, SCIx_SCIFB_REGTYPE),
B
Bastian Hecht 已提交
3099 3100
	}, {
		.compatible = "renesas,hscif",
3101
		.data = SCI_OF_DATA(PORT_HSCIF, SCIx_HSCIF_REGTYPE),
Y
Yoshinori Sato 已提交
3102 3103
	}, {
		.compatible = "renesas,sci",
3104
		.data = SCI_OF_DATA(PORT_SCI, SCIx_SCI_REGTYPE),
B
Bastian Hecht 已提交
3105 3106 3107 3108 3109 3110
	}, {
		/* Terminator */
	},
};
MODULE_DEVICE_TABLE(of, of_sci_match);

3111 3112
static struct plat_sci_port *sci_parse_dt(struct platform_device *pdev,
					  unsigned int *dev_id)
B
Bastian Hecht 已提交
3113 3114 3115
{
	struct device_node *np = pdev->dev.of_node;
	struct plat_sci_port *p;
3116
	struct sci_port *sp;
3117
	const void *data;
B
Bastian Hecht 已提交
3118 3119 3120 3121 3122
	int id;

	if (!IS_ENABLED(CONFIG_OF) || !np)
		return NULL;

3123
	data = of_device_get_match_data(&pdev->dev);
B
Bastian Hecht 已提交
3124 3125

	p = devm_kzalloc(&pdev->dev, sizeof(struct plat_sci_port), GFP_KERNEL);
3126
	if (!p)
B
Bastian Hecht 已提交
3127 3128
		return NULL;

3129
	/* Get the line number from the aliases node. */
B
Bastian Hecht 已提交
3130
	id = of_alias_get_id(np, "serial");
3131 3132
	if (id < 0 && ~sci_ports_in_use)
		id = ffz(sci_ports_in_use);
B
Bastian Hecht 已提交
3133 3134 3135 3136
	if (id < 0) {
		dev_err(&pdev->dev, "failed to get alias id (%d)\n", id);
		return NULL;
	}
3137 3138 3139 3140
	if (id >= ARRAY_SIZE(sci_ports)) {
		dev_err(&pdev->dev, "serial%d out of range\n", id);
		return NULL;
	}
B
Bastian Hecht 已提交
3141

3142
	sp = &sci_ports[id];
B
Bastian Hecht 已提交
3143 3144
	*dev_id = id;

3145 3146
	p->type = SCI_OF_TYPE(data);
	p->regtype = SCI_OF_REGTYPE(data);
B
Bastian Hecht 已提交
3147

3148
	sp->has_rtscts = of_property_read_bool(np, "uart-has-rtscts");
3149

B
Bastian Hecht 已提交
3150 3151 3152
	return p;
}

B
Bill Pemberton 已提交
3153
static int sci_probe_single(struct platform_device *dev,
3154 3155 3156 3157 3158 3159 3160 3161
				      unsigned int index,
				      struct plat_sci_port *p,
				      struct sci_port *sciport)
{
	int ret;

	/* Sanity check */
	if (unlikely(index >= SCI_NPORTS)) {
3162
		dev_notice(&dev->dev, "Attempting to register port %d when only %d are available\n",
3163
			   index+1, SCI_NPORTS);
3164
		dev_notice(&dev->dev, "Consider bumping CONFIG_SERIAL_SH_SCI_NR_UARTS!\n");
3165
		return -EINVAL;
3166
	}
3167 3168 3169
	BUILD_BUG_ON(SCI_NPORTS > sizeof(sci_ports_in_use) * 8);
	if (sci_ports_in_use & BIT(index))
		return -EBUSY;
3170

3171 3172 3173 3174 3175 3176 3177 3178 3179 3180
	mutex_lock(&sci_uart_registration_lock);
	if (!sci_uart_driver.state) {
		ret = uart_register_driver(&sci_uart_driver);
		if (ret) {
			mutex_unlock(&sci_uart_registration_lock);
			return ret;
		}
	}
	mutex_unlock(&sci_uart_registration_lock);

3181
	ret = sci_init_single(dev, sciport, index, p, false);
3182 3183
	if (ret)
		return ret;
3184

3185 3186 3187 3188
	sciport->gpios = mctrl_gpio_init(&sciport->port, 0);
	if (IS_ERR(sciport->gpios) && PTR_ERR(sciport->gpios) != -ENOSYS)
		return PTR_ERR(sciport->gpios);

3189
	if (sciport->has_rtscts) {
3190 3191 3192 3193 3194 3195 3196
		if (!IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(sciport->gpios,
							UART_GPIO_CTS)) ||
		    !IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(sciport->gpios,
							UART_GPIO_RTS))) {
			dev_err(&dev->dev, "Conflicting RTS/CTS config\n");
			return -EINVAL;
		}
3197
		sciport->port.flags |= UPF_HARD_FLOW;
3198 3199
	}

3200 3201 3202 3203 3204 3205 3206
	ret = uart_add_one_port(&sci_uart_driver, &sciport->port);
	if (ret) {
		sci_cleanup_single(sciport);
		return ret;
	}

	return 0;
3207 3208
}

B
Bill Pemberton 已提交
3209
static int sci_probe(struct platform_device *dev)
L
Linus Torvalds 已提交
3210
{
B
Bastian Hecht 已提交
3211 3212 3213
	struct plat_sci_port *p;
	struct sci_port *sp;
	unsigned int dev_id;
3214
	int ret;
3215

3216 3217 3218 3219 3220 3221 3222
	/*
	 * 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);
3223

B
Bastian Hecht 已提交
3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238
	if (dev->dev.of_node) {
		p = sci_parse_dt(dev, &dev_id);
		if (p == NULL)
			return -EINVAL;
	} else {
		p = dev->dev.platform_data;
		if (p == NULL) {
			dev_err(&dev->dev, "no platform data supplied\n");
			return -EINVAL;
		}

		dev_id = dev->id;
	}

	sp = &sci_ports[dev_id];
3239
	platform_set_drvdata(dev, sp);
3240

B
Bastian Hecht 已提交
3241
	ret = sci_probe_single(dev, dev_id, p, sp);
3242
	if (ret)
3243
		return ret;
3244

3245 3246 3247 3248 3249 3250
	if (sp->port.fifosize > 1) {
		ret = sysfs_create_file(&dev->dev.kobj,
				&dev_attr_rx_fifo_trigger.attr);
		if (ret)
			return ret;
	}
3251 3252
	if (sp->port.type == PORT_SCIFA || sp->port.type == PORT_SCIFB ||
	    sp->port.type == PORT_HSCIF) {
3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263
		ret = sysfs_create_file(&dev->dev.kobj,
				&dev_attr_rx_fifo_timeout.attr);
		if (ret) {
			if (sp->port.fifosize > 1) {
				sysfs_remove_file(&dev->dev.kobj,
					&dev_attr_rx_fifo_trigger.attr);
			}
			return ret;
		}
	}

L
Linus Torvalds 已提交
3264 3265 3266 3267
#ifdef CONFIG_SH_STANDARD_BIOS
	sh_bios_gdb_detach();
#endif

3268
	sci_ports_in_use |= BIT(dev_id);
3269
	return 0;
L
Linus Torvalds 已提交
3270 3271
}

S
Sergei Shtylyov 已提交
3272
static __maybe_unused int sci_suspend(struct device *dev)
L
Linus Torvalds 已提交
3273
{
3274
	struct sci_port *sport = dev_get_drvdata(dev);
3275

3276 3277
	if (sport)
		uart_suspend_port(&sci_uart_driver, &sport->port);
L
Linus Torvalds 已提交
3278

3279 3280
	return 0;
}
L
Linus Torvalds 已提交
3281

S
Sergei Shtylyov 已提交
3282
static __maybe_unused int sci_resume(struct device *dev)
3283
{
3284
	struct sci_port *sport = dev_get_drvdata(dev);
3285

3286 3287
	if (sport)
		uart_resume_port(&sci_uart_driver, &sport->port);
3288 3289 3290 3291

	return 0;
}

S
Sergei Shtylyov 已提交
3292
static SIMPLE_DEV_PM_OPS(sci_dev_pm_ops, sci_suspend, sci_resume);
3293

3294 3295
static struct platform_driver sci_driver = {
	.probe		= sci_probe,
3296
	.remove		= sci_remove,
3297 3298
	.driver		= {
		.name	= "sh-sci",
3299
		.pm	= &sci_dev_pm_ops,
B
Bastian Hecht 已提交
3300
		.of_match_table = of_match_ptr(of_sci_match),
3301 3302 3303 3304 3305
	},
};

static int __init sci_init(void)
{
3306
	pr_info("%s\n", banner);
3307

3308
	return platform_driver_register(&sci_driver);
3309 3310 3311 3312 3313
}

static void __exit sci_exit(void)
{
	platform_driver_unregister(&sci_driver);
3314 3315 3316

	if (sci_uart_driver.state)
		uart_unregister_driver(&sci_uart_driver);
L
Linus Torvalds 已提交
3317 3318
}

3319 3320 3321 3322
#ifdef CONFIG_SERIAL_SH_SCI_CONSOLE
early_platform_init_buffer("earlyprintk", &sci_driver,
			   early_serial_buf, ARRAY_SIZE(early_serial_buf));
#endif
3323
#ifdef CONFIG_SERIAL_SH_SCI_EARLYCON
3324
static struct plat_sci_port port_cfg __initdata;
3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335

static int __init early_console_setup(struct earlycon_device *device,
				      int type)
{
	if (!device->port.membase)
		return -ENODEV;

	device->port.serial_in = sci_serial_in;
	device->port.serial_out	= sci_serial_out;
	device->port.type = type;
	memcpy(&sci_ports[0].port, &device->port, sizeof(struct uart_port));
3336
	port_cfg.type = type;
3337
	sci_ports[0].cfg = &port_cfg;
3338
	sci_ports[0].params = sci_probe_regmap(&port_cfg);
3339 3340 3341
	port_cfg.scscr = sci_serial_in(&sci_ports[0].port, SCSCR);
	sci_serial_out(&sci_ports[0].port, SCSCR,
		       SCSCR_RE | SCSCR_TE | port_cfg.scscr);
3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378

	device->con->write = serial_console_write;
	return 0;
}
static int __init sci_early_console_setup(struct earlycon_device *device,
					  const char *opt)
{
	return early_console_setup(device, PORT_SCI);
}
static int __init scif_early_console_setup(struct earlycon_device *device,
					  const char *opt)
{
	return early_console_setup(device, PORT_SCIF);
}
static int __init scifa_early_console_setup(struct earlycon_device *device,
					  const char *opt)
{
	return early_console_setup(device, PORT_SCIFA);
}
static int __init scifb_early_console_setup(struct earlycon_device *device,
					  const char *opt)
{
	return early_console_setup(device, PORT_SCIFB);
}
static int __init hscif_early_console_setup(struct earlycon_device *device,
					  const char *opt)
{
	return early_console_setup(device, PORT_HSCIF);
}

OF_EARLYCON_DECLARE(sci, "renesas,sci", sci_early_console_setup);
OF_EARLYCON_DECLARE(scif, "renesas,scif", scif_early_console_setup);
OF_EARLYCON_DECLARE(scifa, "renesas,scifa", scifa_early_console_setup);
OF_EARLYCON_DECLARE(scifb, "renesas,scifb", scifb_early_console_setup);
OF_EARLYCON_DECLARE(hscif, "renesas,hscif", hscif_early_console_setup);
#endif /* CONFIG_SERIAL_SH_SCI_EARLYCON */

L
Linus Torvalds 已提交
3379 3380 3381
module_init(sci_init);
module_exit(sci_exit);

3382
MODULE_LICENSE("GPL");
3383
MODULE_ALIAS("platform:sh-sci");
3384
MODULE_AUTHOR("Paul Mundt");
U
Ulrich Hecht 已提交
3385
MODULE_DESCRIPTION("SuperH (H)SCI(F) serial driver");