cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sdio_uart.c (28864B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * SDIO UART/GPS driver
      4 *
      5 * Based on drivers/serial/8250.c and drivers/serial/serial_core.c
      6 * by Russell King.
      7 *
      8 * Author:	Nicolas Pitre
      9 * Created:	June 15, 2007
     10 * Copyright:	MontaVista Software, Inc.
     11 */
     12
     13/*
     14 * Note: Although this driver assumes a 16550A-like UART implementation,
     15 * it is not possible to leverage the common 8250/16550 driver, nor the
     16 * core UART infrastructure, as they assumes direct access to the hardware
     17 * registers, often under a spinlock.  This is not possible in the SDIO
     18 * context as SDIO access functions must be able to sleep.
     19 *
     20 * Because we need to lock the SDIO host to ensure an exclusive access to
     21 * the card, we simply rely on that lock to also prevent and serialize
     22 * concurrent access to the same port.
     23 */
     24
     25#include <linux/module.h>
     26#include <linux/init.h>
     27#include <linux/kernel.h>
     28#include <linux/sched.h>
     29#include <linux/mutex.h>
     30#include <linux/seq_file.h>
     31#include <linux/serial.h>
     32#include <linux/serial_reg.h>
     33#include <linux/circ_buf.h>
     34#include <linux/tty.h>
     35#include <linux/tty_flip.h>
     36#include <linux/kfifo.h>
     37#include <linux/slab.h>
     38
     39#include <linux/mmc/core.h>
     40#include <linux/mmc/card.h>
     41#include <linux/mmc/sdio_func.h>
     42#include <linux/mmc/sdio_ids.h>
     43
     44
     45#define UART_NR		8	/* Number of UARTs this driver can handle */
     46
     47
     48#define FIFO_SIZE	PAGE_SIZE
     49#define WAKEUP_CHARS	256
     50
     51struct uart_icount {
     52	__u32	cts;
     53	__u32	dsr;
     54	__u32	rng;
     55	__u32	dcd;
     56	__u32	rx;
     57	__u32	tx;
     58	__u32	frame;
     59	__u32	overrun;
     60	__u32	parity;
     61	__u32	brk;
     62};
     63
     64struct sdio_uart_port {
     65	struct tty_port		port;
     66	unsigned int		index;
     67	struct sdio_func	*func;
     68	struct mutex		func_lock;
     69	struct task_struct	*in_sdio_uart_irq;
     70	unsigned int		regs_offset;
     71	struct kfifo		xmit_fifo;
     72	spinlock_t		write_lock;
     73	struct uart_icount	icount;
     74	unsigned int		uartclk;
     75	unsigned int		mctrl;
     76	unsigned int		rx_mctrl;
     77	unsigned int		read_status_mask;
     78	unsigned int		ignore_status_mask;
     79	unsigned char		x_char;
     80	unsigned char           ier;
     81	unsigned char           lcr;
     82};
     83
     84static struct sdio_uart_port *sdio_uart_table[UART_NR];
     85static DEFINE_SPINLOCK(sdio_uart_table_lock);
     86
     87static int sdio_uart_add_port(struct sdio_uart_port *port)
     88{
     89	int index, ret = -EBUSY;
     90
     91	mutex_init(&port->func_lock);
     92	spin_lock_init(&port->write_lock);
     93	if (kfifo_alloc(&port->xmit_fifo, FIFO_SIZE, GFP_KERNEL))
     94		return -ENOMEM;
     95
     96	spin_lock(&sdio_uart_table_lock);
     97	for (index = 0; index < UART_NR; index++) {
     98		if (!sdio_uart_table[index]) {
     99			port->index = index;
    100			sdio_uart_table[index] = port;
    101			ret = 0;
    102			break;
    103		}
    104	}
    105	spin_unlock(&sdio_uart_table_lock);
    106
    107	return ret;
    108}
    109
    110static struct sdio_uart_port *sdio_uart_port_get(unsigned index)
    111{
    112	struct sdio_uart_port *port;
    113
    114	if (index >= UART_NR)
    115		return NULL;
    116
    117	spin_lock(&sdio_uart_table_lock);
    118	port = sdio_uart_table[index];
    119	if (port)
    120		tty_port_get(&port->port);
    121	spin_unlock(&sdio_uart_table_lock);
    122
    123	return port;
    124}
    125
    126static void sdio_uart_port_put(struct sdio_uart_port *port)
    127{
    128	tty_port_put(&port->port);
    129}
    130
    131static void sdio_uart_port_remove(struct sdio_uart_port *port)
    132{
    133	struct sdio_func *func;
    134
    135	spin_lock(&sdio_uart_table_lock);
    136	sdio_uart_table[port->index] = NULL;
    137	spin_unlock(&sdio_uart_table_lock);
    138
    139	/*
    140	 * We're killing a port that potentially still is in use by
    141	 * the tty layer. Be careful to prevent any further access
    142	 * to the SDIO function and arrange for the tty layer to
    143	 * give up on that port ASAP.
    144	 * Beware: the lock ordering is critical.
    145	 */
    146	mutex_lock(&port->port.mutex);
    147	mutex_lock(&port->func_lock);
    148	func = port->func;
    149	sdio_claim_host(func);
    150	port->func = NULL;
    151	mutex_unlock(&port->func_lock);
    152	/* tty_hangup is async so is this safe as is ?? */
    153	tty_port_tty_hangup(&port->port, false);
    154	mutex_unlock(&port->port.mutex);
    155	sdio_release_irq(func);
    156	sdio_disable_func(func);
    157	sdio_release_host(func);
    158
    159	sdio_uart_port_put(port);
    160}
    161
    162static int sdio_uart_claim_func(struct sdio_uart_port *port)
    163{
    164	mutex_lock(&port->func_lock);
    165	if (unlikely(!port->func)) {
    166		mutex_unlock(&port->func_lock);
    167		return -ENODEV;
    168	}
    169	if (likely(port->in_sdio_uart_irq != current))
    170		sdio_claim_host(port->func);
    171	mutex_unlock(&port->func_lock);
    172	return 0;
    173}
    174
    175static inline void sdio_uart_release_func(struct sdio_uart_port *port)
    176{
    177	if (likely(port->in_sdio_uart_irq != current))
    178		sdio_release_host(port->func);
    179}
    180
    181static inline unsigned int sdio_in(struct sdio_uart_port *port, int offset)
    182{
    183	unsigned char c;
    184	c = sdio_readb(port->func, port->regs_offset + offset, NULL);
    185	return c;
    186}
    187
    188static inline void sdio_out(struct sdio_uart_port *port, int offset, int value)
    189{
    190	sdio_writeb(port->func, value, port->regs_offset + offset, NULL);
    191}
    192
    193static unsigned int sdio_uart_get_mctrl(struct sdio_uart_port *port)
    194{
    195	unsigned char status;
    196	unsigned int ret;
    197
    198	/* FIXME: What stops this losing the delta bits and breaking
    199	   sdio_uart_check_modem_status ? */
    200	status = sdio_in(port, UART_MSR);
    201
    202	ret = 0;
    203	if (status & UART_MSR_DCD)
    204		ret |= TIOCM_CAR;
    205	if (status & UART_MSR_RI)
    206		ret |= TIOCM_RNG;
    207	if (status & UART_MSR_DSR)
    208		ret |= TIOCM_DSR;
    209	if (status & UART_MSR_CTS)
    210		ret |= TIOCM_CTS;
    211	return ret;
    212}
    213
    214static void sdio_uart_write_mctrl(struct sdio_uart_port *port,
    215				  unsigned int mctrl)
    216{
    217	unsigned char mcr = 0;
    218
    219	if (mctrl & TIOCM_RTS)
    220		mcr |= UART_MCR_RTS;
    221	if (mctrl & TIOCM_DTR)
    222		mcr |= UART_MCR_DTR;
    223	if (mctrl & TIOCM_OUT1)
    224		mcr |= UART_MCR_OUT1;
    225	if (mctrl & TIOCM_OUT2)
    226		mcr |= UART_MCR_OUT2;
    227	if (mctrl & TIOCM_LOOP)
    228		mcr |= UART_MCR_LOOP;
    229
    230	sdio_out(port, UART_MCR, mcr);
    231}
    232
    233static inline void sdio_uart_update_mctrl(struct sdio_uart_port *port,
    234					  unsigned int set, unsigned int clear)
    235{
    236	unsigned int old;
    237
    238	old = port->mctrl;
    239	port->mctrl = (old & ~clear) | set;
    240	if (old != port->mctrl)
    241		sdio_uart_write_mctrl(port, port->mctrl);
    242}
    243
    244#define sdio_uart_set_mctrl(port, x)	sdio_uart_update_mctrl(port, x, 0)
    245#define sdio_uart_clear_mctrl(port, x)	sdio_uart_update_mctrl(port, 0, x)
    246
    247static void sdio_uart_change_speed(struct sdio_uart_port *port,
    248				   struct ktermios *termios,
    249				   struct ktermios *old)
    250{
    251	unsigned char cval, fcr = 0;
    252	unsigned int baud, quot;
    253
    254	cval = UART_LCR_WLEN(tty_get_char_size(termios->c_cflag));
    255
    256	if (termios->c_cflag & CSTOPB)
    257		cval |= UART_LCR_STOP;
    258	if (termios->c_cflag & PARENB)
    259		cval |= UART_LCR_PARITY;
    260	if (!(termios->c_cflag & PARODD))
    261		cval |= UART_LCR_EPAR;
    262
    263	for (;;) {
    264		baud = tty_termios_baud_rate(termios);
    265		if (baud == 0)
    266			baud = 9600;  /* Special case: B0 rate. */
    267		if (baud <= port->uartclk)
    268			break;
    269		/*
    270		 * Oops, the quotient was zero.  Try again with the old
    271		 * baud rate if possible, otherwise default to 9600.
    272		 */
    273		termios->c_cflag &= ~CBAUD;
    274		if (old) {
    275			termios->c_cflag |= old->c_cflag & CBAUD;
    276			old = NULL;
    277		} else
    278			termios->c_cflag |= B9600;
    279	}
    280	quot = (2 * port->uartclk + baud) / (2 * baud);
    281
    282	if (baud < 2400)
    283		fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1;
    284	else
    285		fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10;
    286
    287	port->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
    288	if (termios->c_iflag & INPCK)
    289		port->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
    290	if (termios->c_iflag & (BRKINT | PARMRK))
    291		port->read_status_mask |= UART_LSR_BI;
    292
    293	/*
    294	 * Characters to ignore
    295	 */
    296	port->ignore_status_mask = 0;
    297	if (termios->c_iflag & IGNPAR)
    298		port->ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
    299	if (termios->c_iflag & IGNBRK) {
    300		port->ignore_status_mask |= UART_LSR_BI;
    301		/*
    302		 * If we're ignoring parity and break indicators,
    303		 * ignore overruns too (for real raw support).
    304		 */
    305		if (termios->c_iflag & IGNPAR)
    306			port->ignore_status_mask |= UART_LSR_OE;
    307	}
    308
    309	/*
    310	 * ignore all characters if CREAD is not set
    311	 */
    312	if ((termios->c_cflag & CREAD) == 0)
    313		port->ignore_status_mask |= UART_LSR_DR;
    314
    315	/*
    316	 * CTS flow control flag and modem status interrupts
    317	 */
    318	port->ier &= ~UART_IER_MSI;
    319	if ((termios->c_cflag & CRTSCTS) || !(termios->c_cflag & CLOCAL))
    320		port->ier |= UART_IER_MSI;
    321
    322	port->lcr = cval;
    323
    324	sdio_out(port, UART_IER, port->ier);
    325	sdio_out(port, UART_LCR, cval | UART_LCR_DLAB);
    326	sdio_out(port, UART_DLL, quot & 0xff);
    327	sdio_out(port, UART_DLM, quot >> 8);
    328	sdio_out(port, UART_LCR, cval);
    329	sdio_out(port, UART_FCR, fcr);
    330
    331	sdio_uart_write_mctrl(port, port->mctrl);
    332}
    333
    334static void sdio_uart_start_tx(struct sdio_uart_port *port)
    335{
    336	if (!(port->ier & UART_IER_THRI)) {
    337		port->ier |= UART_IER_THRI;
    338		sdio_out(port, UART_IER, port->ier);
    339	}
    340}
    341
    342static void sdio_uart_stop_tx(struct sdio_uart_port *port)
    343{
    344	if (port->ier & UART_IER_THRI) {
    345		port->ier &= ~UART_IER_THRI;
    346		sdio_out(port, UART_IER, port->ier);
    347	}
    348}
    349
    350static void sdio_uart_stop_rx(struct sdio_uart_port *port)
    351{
    352	port->ier &= ~UART_IER_RLSI;
    353	port->read_status_mask &= ~UART_LSR_DR;
    354	sdio_out(port, UART_IER, port->ier);
    355}
    356
    357static void sdio_uart_receive_chars(struct sdio_uart_port *port,
    358				    unsigned int *status)
    359{
    360	unsigned int ch, flag;
    361	int max_count = 256;
    362
    363	do {
    364		ch = sdio_in(port, UART_RX);
    365		flag = TTY_NORMAL;
    366		port->icount.rx++;
    367
    368		if (unlikely(*status & (UART_LSR_BI | UART_LSR_PE |
    369					UART_LSR_FE | UART_LSR_OE))) {
    370			/*
    371			 * For statistics only
    372			 */
    373			if (*status & UART_LSR_BI) {
    374				*status &= ~(UART_LSR_FE | UART_LSR_PE);
    375				port->icount.brk++;
    376			} else if (*status & UART_LSR_PE)
    377				port->icount.parity++;
    378			else if (*status & UART_LSR_FE)
    379				port->icount.frame++;
    380			if (*status & UART_LSR_OE)
    381				port->icount.overrun++;
    382
    383			/*
    384			 * Mask off conditions which should be ignored.
    385			 */
    386			*status &= port->read_status_mask;
    387			if (*status & UART_LSR_BI)
    388				flag = TTY_BREAK;
    389			else if (*status & UART_LSR_PE)
    390				flag = TTY_PARITY;
    391			else if (*status & UART_LSR_FE)
    392				flag = TTY_FRAME;
    393		}
    394
    395		if ((*status & port->ignore_status_mask & ~UART_LSR_OE) == 0)
    396			tty_insert_flip_char(&port->port, ch, flag);
    397
    398		/*
    399		 * Overrun is special.  Since it's reported immediately,
    400		 * it doesn't affect the current character.
    401		 */
    402		if (*status & ~port->ignore_status_mask & UART_LSR_OE)
    403			tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
    404
    405		*status = sdio_in(port, UART_LSR);
    406	} while ((*status & UART_LSR_DR) && (max_count-- > 0));
    407
    408	tty_flip_buffer_push(&port->port);
    409}
    410
    411static void sdio_uart_transmit_chars(struct sdio_uart_port *port)
    412{
    413	struct kfifo *xmit = &port->xmit_fifo;
    414	int count;
    415	struct tty_struct *tty;
    416	u8 iobuf[16];
    417	int len;
    418
    419	if (port->x_char) {
    420		sdio_out(port, UART_TX, port->x_char);
    421		port->icount.tx++;
    422		port->x_char = 0;
    423		return;
    424	}
    425
    426	tty = tty_port_tty_get(&port->port);
    427
    428	if (tty == NULL || !kfifo_len(xmit) ||
    429				tty->flow.stopped || tty->hw_stopped) {
    430		sdio_uart_stop_tx(port);
    431		tty_kref_put(tty);
    432		return;
    433	}
    434
    435	len = kfifo_out_locked(xmit, iobuf, 16, &port->write_lock);
    436	for (count = 0; count < len; count++) {
    437		sdio_out(port, UART_TX, iobuf[count]);
    438		port->icount.tx++;
    439	}
    440
    441	len = kfifo_len(xmit);
    442	if (len < WAKEUP_CHARS) {
    443		tty_wakeup(tty);
    444		if (len == 0)
    445			sdio_uart_stop_tx(port);
    446	}
    447	tty_kref_put(tty);
    448}
    449
    450static void sdio_uart_check_modem_status(struct sdio_uart_port *port)
    451{
    452	int status;
    453	struct tty_struct *tty;
    454
    455	status = sdio_in(port, UART_MSR);
    456
    457	if ((status & UART_MSR_ANY_DELTA) == 0)
    458		return;
    459
    460	if (status & UART_MSR_TERI)
    461		port->icount.rng++;
    462	if (status & UART_MSR_DDSR)
    463		port->icount.dsr++;
    464	if (status & UART_MSR_DDCD) {
    465		port->icount.dcd++;
    466		/* DCD raise - wake for open */
    467		if (status & UART_MSR_DCD)
    468			wake_up_interruptible(&port->port.open_wait);
    469		else {
    470			/* DCD drop - hang up if tty attached */
    471			tty_port_tty_hangup(&port->port, false);
    472		}
    473	}
    474	if (status & UART_MSR_DCTS) {
    475		port->icount.cts++;
    476		tty = tty_port_tty_get(&port->port);
    477		if (tty && C_CRTSCTS(tty)) {
    478			int cts = (status & UART_MSR_CTS);
    479			if (tty->hw_stopped) {
    480				if (cts) {
    481					tty->hw_stopped = 0;
    482					sdio_uart_start_tx(port);
    483					tty_wakeup(tty);
    484				}
    485			} else {
    486				if (!cts) {
    487					tty->hw_stopped = 1;
    488					sdio_uart_stop_tx(port);
    489				}
    490			}
    491		}
    492		tty_kref_put(tty);
    493	}
    494}
    495
    496/*
    497 * This handles the interrupt from one port.
    498 */
    499static void sdio_uart_irq(struct sdio_func *func)
    500{
    501	struct sdio_uart_port *port = sdio_get_drvdata(func);
    502	unsigned int iir, lsr;
    503
    504	/*
    505	 * In a few places sdio_uart_irq() is called directly instead of
    506	 * waiting for the actual interrupt to be raised and the SDIO IRQ
    507	 * thread scheduled in order to reduce latency.  However, some
    508	 * interaction with the tty core may end up calling us back
    509	 * (serial echo, flow control, etc.) through those same places
    510	 * causing undesirable effects.  Let's stop the recursion here.
    511	 */
    512	if (unlikely(port->in_sdio_uart_irq == current))
    513		return;
    514
    515	iir = sdio_in(port, UART_IIR);
    516	if (iir & UART_IIR_NO_INT)
    517		return;
    518
    519	port->in_sdio_uart_irq = current;
    520	lsr = sdio_in(port, UART_LSR);
    521	if (lsr & UART_LSR_DR)
    522		sdio_uart_receive_chars(port, &lsr);
    523	sdio_uart_check_modem_status(port);
    524	if (lsr & UART_LSR_THRE)
    525		sdio_uart_transmit_chars(port);
    526	port->in_sdio_uart_irq = NULL;
    527}
    528
    529static int uart_carrier_raised(struct tty_port *tport)
    530{
    531	struct sdio_uart_port *port =
    532			container_of(tport, struct sdio_uart_port, port);
    533	unsigned int ret = sdio_uart_claim_func(port);
    534	if (ret)	/* Missing hardware shouldn't block for carrier */
    535		return 1;
    536	ret = sdio_uart_get_mctrl(port);
    537	sdio_uart_release_func(port);
    538	if (ret & TIOCM_CAR)
    539		return 1;
    540	return 0;
    541}
    542
    543/**
    544 *	uart_dtr_rts		-	 port helper to set uart signals
    545 *	@tport: tty port to be updated
    546 *	@onoff: set to turn on DTR/RTS
    547 *
    548 *	Called by the tty port helpers when the modem signals need to be
    549 *	adjusted during an open, close and hangup.
    550 */
    551
    552static void uart_dtr_rts(struct tty_port *tport, int onoff)
    553{
    554	struct sdio_uart_port *port =
    555			container_of(tport, struct sdio_uart_port, port);
    556	int ret = sdio_uart_claim_func(port);
    557	if (ret)
    558		return;
    559	if (onoff == 0)
    560		sdio_uart_clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
    561	else
    562		sdio_uart_set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
    563	sdio_uart_release_func(port);
    564}
    565
    566/**
    567 *	sdio_uart_activate	-	start up hardware
    568 *	@tport: tty port to activate
    569 *	@tty: tty bound to this port
    570 *
    571 *	Activate a tty port. The port locking guarantees us this will be
    572 *	run exactly once per set of opens, and if successful will see the
    573 *	shutdown method run exactly once to match. Start up and shutdown are
    574 *	protected from each other by the internal locking and will not run
    575 *	at the same time even during a hangup event.
    576 *
    577 *	If we successfully start up the port we take an extra kref as we
    578 *	will keep it around until shutdown when the kref is dropped.
    579 */
    580
    581static int sdio_uart_activate(struct tty_port *tport, struct tty_struct *tty)
    582{
    583	struct sdio_uart_port *port =
    584			container_of(tport, struct sdio_uart_port, port);
    585	int ret;
    586
    587	/*
    588	 * Set the TTY IO error marker - we will only clear this
    589	 * once we have successfully opened the port.
    590	 */
    591	set_bit(TTY_IO_ERROR, &tty->flags);
    592
    593	kfifo_reset(&port->xmit_fifo);
    594
    595	ret = sdio_uart_claim_func(port);
    596	if (ret)
    597		return ret;
    598	ret = sdio_enable_func(port->func);
    599	if (ret)
    600		goto err1;
    601	ret = sdio_claim_irq(port->func, sdio_uart_irq);
    602	if (ret)
    603		goto err2;
    604
    605	/*
    606	 * Clear the FIFO buffers and disable them.
    607	 * (they will be reenabled in sdio_change_speed())
    608	 */
    609	sdio_out(port, UART_FCR, UART_FCR_ENABLE_FIFO);
    610	sdio_out(port, UART_FCR, UART_FCR_ENABLE_FIFO |
    611		       UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
    612	sdio_out(port, UART_FCR, 0);
    613
    614	/*
    615	 * Clear the interrupt registers.
    616	 */
    617	(void) sdio_in(port, UART_LSR);
    618	(void) sdio_in(port, UART_RX);
    619	(void) sdio_in(port, UART_IIR);
    620	(void) sdio_in(port, UART_MSR);
    621
    622	/*
    623	 * Now, initialize the UART
    624	 */
    625	sdio_out(port, UART_LCR, UART_LCR_WLEN8);
    626
    627	port->ier = UART_IER_RLSI|UART_IER_RDI|UART_IER_RTOIE|UART_IER_UUE;
    628	port->mctrl = TIOCM_OUT2;
    629
    630	sdio_uart_change_speed(port, &tty->termios, NULL);
    631
    632	if (C_BAUD(tty))
    633		sdio_uart_set_mctrl(port, TIOCM_RTS | TIOCM_DTR);
    634
    635	if (C_CRTSCTS(tty))
    636		if (!(sdio_uart_get_mctrl(port) & TIOCM_CTS))
    637			tty->hw_stopped = 1;
    638
    639	clear_bit(TTY_IO_ERROR, &tty->flags);
    640
    641	/* Kick the IRQ handler once while we're still holding the host lock */
    642	sdio_uart_irq(port->func);
    643
    644	sdio_uart_release_func(port);
    645	return 0;
    646
    647err2:
    648	sdio_disable_func(port->func);
    649err1:
    650	sdio_uart_release_func(port);
    651	return ret;
    652}
    653
    654/**
    655 *	sdio_uart_shutdown	-	stop hardware
    656 *	@tport: tty port to shut down
    657 *
    658 *	Deactivate a tty port. The port locking guarantees us this will be
    659 *	run only if a successful matching activate already ran. The two are
    660 *	protected from each other by the internal locking and will not run
    661 *	at the same time even during a hangup event.
    662 */
    663
    664static void sdio_uart_shutdown(struct tty_port *tport)
    665{
    666	struct sdio_uart_port *port =
    667			container_of(tport, struct sdio_uart_port, port);
    668	int ret;
    669
    670	ret = sdio_uart_claim_func(port);
    671	if (ret)
    672		return;
    673
    674	sdio_uart_stop_rx(port);
    675
    676	/* Disable interrupts from this port */
    677	sdio_release_irq(port->func);
    678	port->ier = 0;
    679	sdio_out(port, UART_IER, 0);
    680
    681	sdio_uart_clear_mctrl(port, TIOCM_OUT2);
    682
    683	/* Disable break condition and FIFOs. */
    684	port->lcr &= ~UART_LCR_SBC;
    685	sdio_out(port, UART_LCR, port->lcr);
    686	sdio_out(port, UART_FCR, UART_FCR_ENABLE_FIFO |
    687				 UART_FCR_CLEAR_RCVR |
    688				 UART_FCR_CLEAR_XMIT);
    689	sdio_out(port, UART_FCR, 0);
    690
    691	sdio_disable_func(port->func);
    692
    693	sdio_uart_release_func(port);
    694}
    695
    696static void sdio_uart_port_destroy(struct tty_port *tport)
    697{
    698	struct sdio_uart_port *port =
    699		container_of(tport, struct sdio_uart_port, port);
    700	kfifo_free(&port->xmit_fifo);
    701	kfree(port);
    702}
    703
    704/**
    705 *	sdio_uart_install	-	install method
    706 *	@driver: the driver in use (sdio_uart in our case)
    707 *	@tty: the tty being bound
    708 *
    709 *	Look up and bind the tty and the driver together. Initialize
    710 *	any needed private data (in our case the termios)
    711 */
    712
    713static int sdio_uart_install(struct tty_driver *driver, struct tty_struct *tty)
    714{
    715	int idx = tty->index;
    716	struct sdio_uart_port *port = sdio_uart_port_get(idx);
    717	int ret = tty_standard_install(driver, tty);
    718
    719	if (ret == 0)
    720		/* This is the ref sdio_uart_port get provided */
    721		tty->driver_data = port;
    722	else
    723		sdio_uart_port_put(port);
    724	return ret;
    725}
    726
    727/**
    728 *	sdio_uart_cleanup	-	called on the last tty kref drop
    729 *	@tty: the tty being destroyed
    730 *
    731 *	Called asynchronously when the last reference to the tty is dropped.
    732 *	We cannot destroy the tty->driver_data port kref until this point
    733 */
    734
    735static void sdio_uart_cleanup(struct tty_struct *tty)
    736{
    737	struct sdio_uart_port *port = tty->driver_data;
    738	tty->driver_data = NULL;	/* Bug trap */
    739	sdio_uart_port_put(port);
    740}
    741
    742/*
    743 *	Open/close/hangup is now entirely boilerplate
    744 */
    745
    746static int sdio_uart_open(struct tty_struct *tty, struct file *filp)
    747{
    748	struct sdio_uart_port *port = tty->driver_data;
    749	return tty_port_open(&port->port, tty, filp);
    750}
    751
    752static void sdio_uart_close(struct tty_struct *tty, struct file * filp)
    753{
    754	struct sdio_uart_port *port = tty->driver_data;
    755	tty_port_close(&port->port, tty, filp);
    756}
    757
    758static void sdio_uart_hangup(struct tty_struct *tty)
    759{
    760	struct sdio_uart_port *port = tty->driver_data;
    761	tty_port_hangup(&port->port);
    762}
    763
    764static int sdio_uart_write(struct tty_struct *tty, const unsigned char *buf,
    765			   int count)
    766{
    767	struct sdio_uart_port *port = tty->driver_data;
    768	int ret;
    769
    770	if (!port->func)
    771		return -ENODEV;
    772
    773	ret = kfifo_in_locked(&port->xmit_fifo, buf, count, &port->write_lock);
    774	if (!(port->ier & UART_IER_THRI)) {
    775		int err = sdio_uart_claim_func(port);
    776		if (!err) {
    777			sdio_uart_start_tx(port);
    778			sdio_uart_irq(port->func);
    779			sdio_uart_release_func(port);
    780		} else
    781			ret = err;
    782	}
    783
    784	return ret;
    785}
    786
    787static unsigned int sdio_uart_write_room(struct tty_struct *tty)
    788{
    789	struct sdio_uart_port *port = tty->driver_data;
    790	return FIFO_SIZE - kfifo_len(&port->xmit_fifo);
    791}
    792
    793static unsigned int sdio_uart_chars_in_buffer(struct tty_struct *tty)
    794{
    795	struct sdio_uart_port *port = tty->driver_data;
    796	return kfifo_len(&port->xmit_fifo);
    797}
    798
    799static void sdio_uart_send_xchar(struct tty_struct *tty, char ch)
    800{
    801	struct sdio_uart_port *port = tty->driver_data;
    802
    803	port->x_char = ch;
    804	if (ch && !(port->ier & UART_IER_THRI)) {
    805		if (sdio_uart_claim_func(port) != 0)
    806			return;
    807		sdio_uart_start_tx(port);
    808		sdio_uart_irq(port->func);
    809		sdio_uart_release_func(port);
    810	}
    811}
    812
    813static void sdio_uart_throttle(struct tty_struct *tty)
    814{
    815	struct sdio_uart_port *port = tty->driver_data;
    816
    817	if (!I_IXOFF(tty) && !C_CRTSCTS(tty))
    818		return;
    819
    820	if (sdio_uart_claim_func(port) != 0)
    821		return;
    822
    823	if (I_IXOFF(tty)) {
    824		port->x_char = STOP_CHAR(tty);
    825		sdio_uart_start_tx(port);
    826	}
    827
    828	if (C_CRTSCTS(tty))
    829		sdio_uart_clear_mctrl(port, TIOCM_RTS);
    830
    831	sdio_uart_irq(port->func);
    832	sdio_uart_release_func(port);
    833}
    834
    835static void sdio_uart_unthrottle(struct tty_struct *tty)
    836{
    837	struct sdio_uart_port *port = tty->driver_data;
    838
    839	if (!I_IXOFF(tty) && !C_CRTSCTS(tty))
    840		return;
    841
    842	if (sdio_uart_claim_func(port) != 0)
    843		return;
    844
    845	if (I_IXOFF(tty)) {
    846		if (port->x_char) {
    847			port->x_char = 0;
    848		} else {
    849			port->x_char = START_CHAR(tty);
    850			sdio_uart_start_tx(port);
    851		}
    852	}
    853
    854	if (C_CRTSCTS(tty))
    855		sdio_uart_set_mctrl(port, TIOCM_RTS);
    856
    857	sdio_uart_irq(port->func);
    858	sdio_uart_release_func(port);
    859}
    860
    861static void sdio_uart_set_termios(struct tty_struct *tty,
    862						struct ktermios *old_termios)
    863{
    864	struct sdio_uart_port *port = tty->driver_data;
    865	unsigned int cflag = tty->termios.c_cflag;
    866
    867	if (sdio_uart_claim_func(port) != 0)
    868		return;
    869
    870	sdio_uart_change_speed(port, &tty->termios, old_termios);
    871
    872	/* Handle transition to B0 status */
    873	if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD))
    874		sdio_uart_clear_mctrl(port, TIOCM_RTS | TIOCM_DTR);
    875
    876	/* Handle transition away from B0 status */
    877	if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) {
    878		unsigned int mask = TIOCM_DTR;
    879		if (!(cflag & CRTSCTS) || !tty_throttled(tty))
    880			mask |= TIOCM_RTS;
    881		sdio_uart_set_mctrl(port, mask);
    882	}
    883
    884	/* Handle turning off CRTSCTS */
    885	if ((old_termios->c_cflag & CRTSCTS) && !(cflag & CRTSCTS)) {
    886		tty->hw_stopped = 0;
    887		sdio_uart_start_tx(port);
    888	}
    889
    890	/* Handle turning on CRTSCTS */
    891	if (!(old_termios->c_cflag & CRTSCTS) && (cflag & CRTSCTS)) {
    892		if (!(sdio_uart_get_mctrl(port) & TIOCM_CTS)) {
    893			tty->hw_stopped = 1;
    894			sdio_uart_stop_tx(port);
    895		}
    896	}
    897
    898	sdio_uart_release_func(port);
    899}
    900
    901static int sdio_uart_break_ctl(struct tty_struct *tty, int break_state)
    902{
    903	struct sdio_uart_port *port = tty->driver_data;
    904	int result;
    905
    906	result = sdio_uart_claim_func(port);
    907	if (result != 0)
    908		return result;
    909
    910	if (break_state == -1)
    911		port->lcr |= UART_LCR_SBC;
    912	else
    913		port->lcr &= ~UART_LCR_SBC;
    914	sdio_out(port, UART_LCR, port->lcr);
    915
    916	sdio_uart_release_func(port);
    917	return 0;
    918}
    919
    920static int sdio_uart_tiocmget(struct tty_struct *tty)
    921{
    922	struct sdio_uart_port *port = tty->driver_data;
    923	int result;
    924
    925	result = sdio_uart_claim_func(port);
    926	if (!result) {
    927		result = port->mctrl | sdio_uart_get_mctrl(port);
    928		sdio_uart_release_func(port);
    929	}
    930
    931	return result;
    932}
    933
    934static int sdio_uart_tiocmset(struct tty_struct *tty,
    935			      unsigned int set, unsigned int clear)
    936{
    937	struct sdio_uart_port *port = tty->driver_data;
    938	int result;
    939
    940	result = sdio_uart_claim_func(port);
    941	if (!result) {
    942		sdio_uart_update_mctrl(port, set, clear);
    943		sdio_uart_release_func(port);
    944	}
    945
    946	return result;
    947}
    948
    949static int sdio_uart_proc_show(struct seq_file *m, void *v)
    950{
    951	int i;
    952
    953	seq_printf(m, "serinfo:1.0 driver%s%s revision:%s\n",
    954		       "", "", "");
    955	for (i = 0; i < UART_NR; i++) {
    956		struct sdio_uart_port *port = sdio_uart_port_get(i);
    957		if (port) {
    958			seq_printf(m, "%d: uart:SDIO", i);
    959			if (capable(CAP_SYS_ADMIN)) {
    960				seq_printf(m, " tx:%d rx:%d",
    961					      port->icount.tx, port->icount.rx);
    962				if (port->icount.frame)
    963					seq_printf(m, " fe:%d",
    964						      port->icount.frame);
    965				if (port->icount.parity)
    966					seq_printf(m, " pe:%d",
    967						      port->icount.parity);
    968				if (port->icount.brk)
    969					seq_printf(m, " brk:%d",
    970						      port->icount.brk);
    971				if (port->icount.overrun)
    972					seq_printf(m, " oe:%d",
    973						      port->icount.overrun);
    974				if (port->icount.cts)
    975					seq_printf(m, " cts:%d",
    976						      port->icount.cts);
    977				if (port->icount.dsr)
    978					seq_printf(m, " dsr:%d",
    979						      port->icount.dsr);
    980				if (port->icount.rng)
    981					seq_printf(m, " rng:%d",
    982						      port->icount.rng);
    983				if (port->icount.dcd)
    984					seq_printf(m, " dcd:%d",
    985						      port->icount.dcd);
    986			}
    987			sdio_uart_port_put(port);
    988			seq_putc(m, '\n');
    989		}
    990	}
    991	return 0;
    992}
    993
    994static const struct tty_port_operations sdio_uart_port_ops = {
    995	.dtr_rts = uart_dtr_rts,
    996	.carrier_raised = uart_carrier_raised,
    997	.shutdown = sdio_uart_shutdown,
    998	.activate = sdio_uart_activate,
    999	.destruct = sdio_uart_port_destroy,
   1000};
   1001
   1002static const struct tty_operations sdio_uart_ops = {
   1003	.open			= sdio_uart_open,
   1004	.close			= sdio_uart_close,
   1005	.write			= sdio_uart_write,
   1006	.write_room		= sdio_uart_write_room,
   1007	.chars_in_buffer	= sdio_uart_chars_in_buffer,
   1008	.send_xchar		= sdio_uart_send_xchar,
   1009	.throttle		= sdio_uart_throttle,
   1010	.unthrottle		= sdio_uart_unthrottle,
   1011	.set_termios		= sdio_uart_set_termios,
   1012	.hangup			= sdio_uart_hangup,
   1013	.break_ctl		= sdio_uart_break_ctl,
   1014	.tiocmget		= sdio_uart_tiocmget,
   1015	.tiocmset		= sdio_uart_tiocmset,
   1016	.install		= sdio_uart_install,
   1017	.cleanup		= sdio_uart_cleanup,
   1018	.proc_show		= sdio_uart_proc_show,
   1019};
   1020
   1021static struct tty_driver *sdio_uart_tty_driver;
   1022
   1023static int sdio_uart_probe(struct sdio_func *func,
   1024			   const struct sdio_device_id *id)
   1025{
   1026	struct sdio_uart_port *port;
   1027	int ret;
   1028
   1029	port = kzalloc(sizeof(struct sdio_uart_port), GFP_KERNEL);
   1030	if (!port)
   1031		return -ENOMEM;
   1032
   1033	if (func->class == SDIO_CLASS_UART) {
   1034		pr_warn("%s: need info on UART class basic setup\n",
   1035			sdio_func_id(func));
   1036		kfree(port);
   1037		return -ENOSYS;
   1038	} else if (func->class == SDIO_CLASS_GPS) {
   1039		/*
   1040		 * We need tuple 0x91.  It contains SUBTPL_SIOREG
   1041		 * and SUBTPL_RCVCAPS.
   1042		 */
   1043		struct sdio_func_tuple *tpl;
   1044		for (tpl = func->tuples; tpl; tpl = tpl->next) {
   1045			if (tpl->code != 0x91)
   1046				continue;
   1047			if (tpl->size < 10)
   1048				continue;
   1049			if (tpl->data[1] == 0)  /* SUBTPL_SIOREG */
   1050				break;
   1051		}
   1052		if (!tpl) {
   1053			pr_warn("%s: can't find tuple 0x91 subtuple 0 (SUBTPL_SIOREG) for GPS class\n",
   1054				sdio_func_id(func));
   1055			kfree(port);
   1056			return -EINVAL;
   1057		}
   1058		pr_debug("%s: Register ID = 0x%02x, Exp ID = 0x%02x\n",
   1059		       sdio_func_id(func), tpl->data[2], tpl->data[3]);
   1060		port->regs_offset = (tpl->data[4] << 0) |
   1061				    (tpl->data[5] << 8) |
   1062				    (tpl->data[6] << 16);
   1063		pr_debug("%s: regs offset = 0x%x\n",
   1064		       sdio_func_id(func), port->regs_offset);
   1065		port->uartclk = tpl->data[7] * 115200;
   1066		if (port->uartclk == 0)
   1067			port->uartclk = 115200;
   1068		pr_debug("%s: clk %d baudcode %u 4800-div %u\n",
   1069		       sdio_func_id(func), port->uartclk,
   1070		       tpl->data[7], tpl->data[8] | (tpl->data[9] << 8));
   1071	} else {
   1072		kfree(port);
   1073		return -EINVAL;
   1074	}
   1075
   1076	port->func = func;
   1077	sdio_set_drvdata(func, port);
   1078	tty_port_init(&port->port);
   1079	port->port.ops = &sdio_uart_port_ops;
   1080
   1081	ret = sdio_uart_add_port(port);
   1082	if (ret) {
   1083		kfree(port);
   1084	} else {
   1085		struct device *dev;
   1086		dev = tty_port_register_device(&port->port,
   1087				sdio_uart_tty_driver, port->index, &func->dev);
   1088		if (IS_ERR(dev)) {
   1089			sdio_uart_port_remove(port);
   1090			ret = PTR_ERR(dev);
   1091		}
   1092	}
   1093
   1094	return ret;
   1095}
   1096
   1097static void sdio_uart_remove(struct sdio_func *func)
   1098{
   1099	struct sdio_uart_port *port = sdio_get_drvdata(func);
   1100
   1101	tty_unregister_device(sdio_uart_tty_driver, port->index);
   1102	sdio_uart_port_remove(port);
   1103}
   1104
   1105static const struct sdio_device_id sdio_uart_ids[] = {
   1106	{ SDIO_DEVICE_CLASS(SDIO_CLASS_UART)		},
   1107	{ SDIO_DEVICE_CLASS(SDIO_CLASS_GPS)		},
   1108	{ /* end: all zeroes */				},
   1109};
   1110
   1111MODULE_DEVICE_TABLE(sdio, sdio_uart_ids);
   1112
   1113static struct sdio_driver sdio_uart_driver = {
   1114	.probe		= sdio_uart_probe,
   1115	.remove		= sdio_uart_remove,
   1116	.name		= "sdio_uart",
   1117	.id_table	= sdio_uart_ids,
   1118};
   1119
   1120static int __init sdio_uart_init(void)
   1121{
   1122	int ret;
   1123	struct tty_driver *tty_drv;
   1124
   1125	sdio_uart_tty_driver = tty_drv = tty_alloc_driver(UART_NR,
   1126			TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV);
   1127	if (IS_ERR(tty_drv))
   1128		return PTR_ERR(tty_drv);
   1129
   1130	tty_drv->driver_name = "sdio_uart";
   1131	tty_drv->name =   "ttySDIO";
   1132	tty_drv->major = 0;  /* dynamically allocated */
   1133	tty_drv->minor_start = 0;
   1134	tty_drv->type = TTY_DRIVER_TYPE_SERIAL;
   1135	tty_drv->subtype = SERIAL_TYPE_NORMAL;
   1136	tty_drv->init_termios = tty_std_termios;
   1137	tty_drv->init_termios.c_cflag = B4800 | CS8 | CREAD | HUPCL | CLOCAL;
   1138	tty_drv->init_termios.c_ispeed = 4800;
   1139	tty_drv->init_termios.c_ospeed = 4800;
   1140	tty_set_operations(tty_drv, &sdio_uart_ops);
   1141
   1142	ret = tty_register_driver(tty_drv);
   1143	if (ret)
   1144		goto err1;
   1145
   1146	ret = sdio_register_driver(&sdio_uart_driver);
   1147	if (ret)
   1148		goto err2;
   1149
   1150	return 0;
   1151
   1152err2:
   1153	tty_unregister_driver(tty_drv);
   1154err1:
   1155	tty_driver_kref_put(tty_drv);
   1156	return ret;
   1157}
   1158
   1159static void __exit sdio_uart_exit(void)
   1160{
   1161	sdio_unregister_driver(&sdio_uart_driver);
   1162	tty_unregister_driver(sdio_uart_tty_driver);
   1163	tty_driver_kref_put(sdio_uart_tty_driver);
   1164}
   1165
   1166module_init(sdio_uart_init);
   1167module_exit(sdio_uart_exit);
   1168
   1169MODULE_AUTHOR("Nicolas Pitre");
   1170MODULE_LICENSE("GPL");