]> Git Repo - linux.git/blob - drivers/mmc/core/sdio_uart.c
Merge tag 'cxl-for-6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl
[linux.git] / drivers / mmc / core / sdio_uart.c
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
51 struct 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
64 struct 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
84 static struct sdio_uart_port *sdio_uart_table[UART_NR];
85 static DEFINE_SPINLOCK(sdio_uart_table_lock);
86
87 static 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
110 static 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
126 static void sdio_uart_port_put(struct sdio_uart_port *port)
127 {
128         tty_port_put(&port->port);
129 }
130
131 static 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
162 static 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
175 static 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
181 static 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
188 static 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
193 static 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
214 static 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
233 static 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
247 static 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
334 static 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
342 static 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
350 static 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
357 static 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
411 static 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
450 static 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  */
499 static 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
529 static 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
552 static 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
581 static 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
647 err2:
648         sdio_disable_func(port->func);
649 err1:
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
664 static 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
696 static 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
713 static 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
735 static 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
746 static 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
752 static 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
758 static 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
764 static 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
787 static 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
793 static 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
799 static 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
813 static 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
835 static 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
861 static 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
901 static 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
920 static 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
934 static 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
949 static 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
994 static 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
1002 static 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
1021 static struct tty_driver *sdio_uart_tty_driver;
1022
1023 static 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
1097 static 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
1105 static 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
1111 MODULE_DEVICE_TABLE(sdio, sdio_uart_ids);
1112
1113 static 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
1120 static 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
1152 err2:
1153         tty_unregister_driver(tty_drv);
1154 err1:
1155         tty_driver_kref_put(tty_drv);
1156         return ret;
1157 }
1158
1159 static 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
1166 module_init(sdio_uart_init);
1167 module_exit(sdio_uart_exit);
1168
1169 MODULE_AUTHOR("Nicolas Pitre");
1170 MODULE_LICENSE("GPL");
This page took 0.10568 seconds and 4 git commands to generate.