Lines Matching +full:spi +full:- +full:rx +full:- +full:delay +full:- +full:us

2  *  max3107.c - spi uart protocol driver for Maxim 3107
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 #include <linux/delay.h>
37 #include <linux/spi/spi.h>
77 const struct baud_table *baud_tbl = s->baud_tbl; in get_new_brg()
87 /* Perform SPI transfer for write/read of device register(s) */
88 int max3107_rw(struct max3107_port *s, u8 *tx, u8 *rx, int len) in max3107_rw() argument
93 /* Initialize SPI ,message */ in max3107_rw()
96 /* Initialize SPI transfer */ in max3107_rw()
100 spi_xfer.rx_buf = rx; in max3107_rw()
103 /* Add SPI transfer to SPI message */ in max3107_rw()
116 /* Perform synchronous SPI transfer */ in max3107_rw()
117 if (spi_sync(s->spi, &spi_msg)) { in max3107_rw()
118 dev_err(&s->spi->dev, "spi_sync failure\n"); in max3107_rw()
119 return -EIO; in max3107_rw()
125 pr_info("rx len %d:\n", spi_xfer.len); in max3107_rw()
139 struct uart_port *port = &s->port; in put_data_to_circ_buf()
142 if (!port->state) in put_data_to_circ_buf()
145 tty = port->state->port.tty; in put_data_to_circ_buf()
151 /* Update RX counter */ in put_data_to_circ_buf()
152 port->icount.rx += len; in put_data_to_circ_buf()
160 int len; /* SPI transfer buffer length */ in max3107_handlerx()
164 if (!s->rx_enabled) in max3107_handlerx()
165 /* RX is disabled */ in max3107_handlerx()
169 /* RX fifo is empty */ in max3107_handlerx()
172 dev_warn(&s->spi->dev, "Possible RX FIFO overrun %d\n", rxlvl); in max3107_handlerx()
173 /* Ensure sanity of RX level */ in max3107_handlerx()
176 if ((s->rxbuf == 0) || (s->rxstr == 0)) { in max3107_handlerx()
177 dev_warn(&s->spi->dev, "Rx buffer/str isn't ready\n"); in max3107_handlerx()
180 buf = s->rxbuf; in max3107_handlerx()
181 valid_str = s->rxstr; in max3107_handlerx()
187 if (s->irqen_reg & MAX3107_IRQ_RXFIFO_BIT) { in max3107_handlerx()
188 /* First disable RX FIFO interrupt */ in max3107_handlerx()
189 pr_debug("Disabling RX INT\n"); in max3107_handlerx()
191 s->irqen_reg &= ~MAX3107_IRQ_RXFIFO_BIT; in max3107_handlerx()
192 buf[0] |= s->irqen_reg; in max3107_handlerx()
196 * buffer was zeroed and SPI transfer of 0x0000 means reading in max3107_handlerx()
197 * from RX FIFO in max3107_handlerx()
200 /* Append RX level query */ in max3107_handlerx()
204 /* Perform the SPI transfer */ in max3107_handlerx()
206 dev_err(&s->spi->dev, "SPI transfer for RX h failed\n"); in max3107_handlerx()
210 /* Skip RX FIFO interrupt disabling word if it was added */ in max3107_handlerx()
211 j = ((len - 1) - rxlvl); in max3107_handlerx()
216 /* Get new RX level */ in max3107_handlerx()
217 rxlvl = (buf[len - 1] & MAX3107_SPI_RX_DATA_MASK); in max3107_handlerx()
220 if (s->rx_enabled) { in max3107_handlerx()
221 /* RX still enabled, re-enable RX FIFO interrupt */ in max3107_handlerx()
222 pr_debug("Enabling RX INT\n"); in max3107_handlerx()
224 s->irqen_reg |= MAX3107_IRQ_RXFIFO_BIT; in max3107_handlerx()
225 buf[0] |= s->irqen_reg; in max3107_handlerx()
227 dev_err(&s->spi->dev, "RX FIFO INT enabling failed\n"); in max3107_handlerx()
231 if (s->port.state->port.tty) in max3107_handlerx()
232 tty_flip_buffer_push(s->port.state->port.tty); in max3107_handlerx()
239 struct circ_buf *xmit = &s->port.state->xmit; in max3107_handletx()
242 int len; /* SPI transfer buffer length */ in max3107_handletx()
245 if (!s->tx_fifo_empty) in max3107_handletx()
249 if (uart_circ_empty(xmit) || uart_tx_stopped(&s->port)) in max3107_handletx()
253 if (!s->txbuf) { in max3107_handletx()
254 dev_warn(&s->spi->dev, "Txbuf isn't ready\n"); in max3107_handletx()
257 buf = s->txbuf; in max3107_handletx()
268 s->port.icount.tx += len; in max3107_handletx()
271 s->tx_fifo_empty = 0; in max3107_handletx()
274 if (s->irqen_reg & MAX3107_IRQ_TXEMPTY_BIT) { in max3107_handletx()
278 s->irqen_reg &= ~MAX3107_IRQ_TXEMPTY_BIT; in max3107_handletx()
279 buf[i] |= s->irqen_reg; in max3107_handletx()
284 spin_lock_irqsave(&s->port.lock, flags); in max3107_handletx()
287 buf[i] |= ((u16)xmit->buf[xmit->tail] & in max3107_handletx()
289 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); in max3107_handletx()
291 spin_unlock_irqrestore(&s->port.lock, flags); in max3107_handletx()
292 if (!(s->irqen_reg & MAX3107_IRQ_TXEMPTY_BIT)) { in max3107_handletx()
296 s->irqen_reg |= MAX3107_IRQ_TXEMPTY_BIT; in max3107_handletx()
297 buf[i] |= s->irqen_reg; in max3107_handletx()
301 if (!s->tx_enabled) { in max3107_handletx()
305 spin_lock_irqsave(&s->data_lock, flags); in max3107_handletx()
306 s->mode1_reg &= ~MAX3107_MODE1_TXDIS_BIT; in max3107_handletx()
307 buf[i] |= s->mode1_reg; in max3107_handletx()
308 spin_unlock_irqrestore(&s->data_lock, flags); in max3107_handletx()
309 s->tx_enabled = 1; in max3107_handletx()
314 /* Perform the SPI transfer */ in max3107_handletx()
316 dev_err(&s->spi->dev, in max3107_handletx()
317 "SPI transfer TX handling failed\n"); in max3107_handletx()
324 uart_write_wakeup(&s->port); in max3107_handletx()
329 * Also reads and returns current RX FIFO level
333 u16 buf[4]; /* Buffer for SPI transfers */ in handle_interrupt()
344 /* Query RX level */ in handle_interrupt()
348 dev_err(&s->spi->dev, in handle_interrupt()
349 "SPI transfer for INTR handling failed\n"); in handle_interrupt()
360 /* RX timeout interrupt, in handle_interrupt()
361 * handled by normal RX handling in handle_interrupt()
363 pr_debug("RX TO INT\n"); in handle_interrupt()
372 spin_lock_irqsave(&s->data_lock, flags); in handle_interrupt()
373 s->mode1_reg |= MAX3107_MODE1_TXDIS_BIT; in handle_interrupt()
374 buf[0] |= s->mode1_reg; in handle_interrupt()
375 spin_unlock_irqrestore(&s->data_lock, flags); in handle_interrupt()
377 dev_err(&s->spi->dev, "SPI transfer TX dis failed\n"); in handle_interrupt()
378 s->tx_enabled = 0; in handle_interrupt()
379 s->tx_fifo_empty = 1; in handle_interrupt()
383 /* RX FIFO interrupt, in handle_interrupt()
384 * handled by normal RX handling in handle_interrupt()
388 /* Return RX level */ in handle_interrupt()
395 if (!work_pending(&s->work) && !freezing(current) && !s->suspended) in max3107_dowork()
396 queue_work(s->workqueue, &s->work); in max3107_dowork()
398 dev_warn(&s->spi->dev, "interrup isn't serviced normally!\n"); in max3107_dowork()
406 int len; /* SPI transfer buffer length */ in max3107_work()
407 u16 buf[5]; /* Buffer for SPI transfers */ in max3107_work()
410 /* Start by reading current RX FIFO level */ in max3107_work()
413 dev_err(&s->spi->dev, "SPI transfer RX lev failed\n"); in max3107_work()
422 /* Handle RX */ in max3107_work()
426 if (s->handle_irq) { in max3107_work()
428 * We also get new RX FIFO level since new data may in max3107_work()
432 s->handle_irq = 0; in max3107_work()
441 spin_lock_irqsave(&s->data_lock, flags); in max3107_work()
442 if (s->mode1_commit) { in max3107_work()
445 buf[len++] |= s->mode1_reg; in max3107_work()
446 s->mode1_commit = 0; in max3107_work()
448 if (s->lcr_commit) { in max3107_work()
451 buf[len++] |= s->lcr_reg; in max3107_work()
452 s->lcr_commit = 0; in max3107_work()
454 if (s->brg_commit) { in max3107_work()
457 buf[len++] |= ((s->brg_cfg >> 16) & in max3107_work()
460 buf[len++] |= ((s->brg_cfg >> 8) & in max3107_work()
463 buf[len++] |= ((s->brg_cfg) & 0xff); in max3107_work()
464 s->brg_commit = 0; in max3107_work()
466 spin_unlock_irqrestore(&s->data_lock, flags); in max3107_work()
470 dev_err(&s->spi->dev, in max3107_work()
471 "SPI transfer config failed\n"); in max3107_work()
474 /* Reloop if interrupt handling indicated data in RX FIFO */ in max3107_work()
482 u16 buf[1]; /* Buffer for SPI transfer */ in max3107_set_sleep()
487 spin_lock_irqsave(&s->data_lock, flags); in max3107_set_sleep()
490 s->mode1_reg &= ~MAX3107_MODE1_FORCESLEEP_BIT; in max3107_set_sleep()
493 s->mode1_reg |= MAX3107_MODE1_FORCESLEEP_BIT; in max3107_set_sleep()
496 s->mode1_reg &= ~MAX3107_MODE1_AUTOSLEEP_BIT; in max3107_set_sleep()
499 s->mode1_reg |= MAX3107_MODE1_AUTOSLEEP_BIT; in max3107_set_sleep()
502 spin_unlock_irqrestore(&s->data_lock, flags); in max3107_set_sleep()
503 dev_warn(&s->spi->dev, "invalid sleep mode\n"); in max3107_set_sleep()
506 buf[0] |= s->mode1_reg; in max3107_set_sleep()
507 spin_unlock_irqrestore(&s->data_lock, flags); in max3107_set_sleep()
510 dev_err(&s->spi->dev, "SPI transfer sleep mode failed\n"); in max3107_set_sleep()
520 u16 buf[11]; /* Buffer for SPI transfers */ in max3107_register_init()
523 s->baud = 9600; in max3107_register_init()
525 if (s->ext_clk) { in max3107_register_init()
526 s->brg_cfg = MAX3107_BRG26_B9600; in max3107_register_init()
527 s->baud_tbl = (struct baud_table *)brg26_ext; in max3107_register_init()
529 s->brg_cfg = MAX3107_BRG13_IB9600; in max3107_register_init()
530 s->baud_tbl = (struct baud_table *)brg13_int; in max3107_register_init()
533 if (s->pdata->init) in max3107_register_init()
534 s->pdata->init(s); in max3107_register_init()
537 | ((s->brg_cfg >> 16) & MAX3107_SPI_TX_DATA_MASK); in max3107_register_init()
539 | ((s->brg_cfg >> 8) & MAX3107_SPI_TX_DATA_MASK); in max3107_register_init()
541 | ((s->brg_cfg) & 0xff); in max3107_register_init()
544 s->lcr_reg = MAX3107_LCR_WORD_LEN_8; in max3107_register_init()
546 | s->lcr_reg; in max3107_register_init()
549 s->mode1_reg = 0; in max3107_register_init()
551 s->mode1_reg |= MAX3107_MODE1_IRQSEL_BIT; in max3107_register_init()
553 s->mode1_reg |= MAX3107_MODE1_TXDIS_BIT; in max3107_register_init()
554 s->tx_enabled = 0; in max3107_register_init()
555 /* RX is enabled */ in max3107_register_init()
556 s->rx_enabled = 1; in max3107_register_init()
558 | s->mode1_reg; in max3107_register_init()
562 if (s->loopback) { in max3107_register_init()
568 s->tx_fifo_empty = 1; in max3107_register_init()
572 /* RX FIFO trigger for 16 words, TX FIFO trigger not used */ in max3107_register_init()
585 /* 8. Configure RX timeout register */ in max3107_register_init()
592 /* Enable RX timeout interrupt */ in max3107_register_init()
595 /* Perform SPI transfer */ in max3107_register_init()
597 dev_err(&s->spi->dev, "SPI transfer for init failed\n"); in max3107_register_init()
604 s->irqen_reg = MAX3107_IRQ_LSR_BIT; in max3107_register_init()
605 /* Enable RX FIFO interrupt */ in max3107_register_init()
606 s->irqen_reg |= MAX3107_IRQ_RXFIFO_BIT; in max3107_register_init()
608 | s->irqen_reg; in max3107_register_init()
612 if (s->loopback) { in max3107_register_init()
617 /* Perform SPI transfer */ in max3107_register_init()
619 dev_err(&s->spi->dev, "SPI transfer for init failed\n"); in max3107_register_init()
628 if (irqno != s->spi->irq) { in max3107_irq()
634 s->handle_irq = 1; in max3107_irq()
657 s->suspended = 1; in max3107_hw_susp()
663 s->suspended = 0; in max3107_hw_susp()
690 (s->tx_fifo_empty && uart_circ_empty(&s->port.state->xmit))); in max3107_tx_empty()
691 return s->tx_fifo_empty && uart_circ_empty(&s->port.state->xmit); in max3107_tx_empty()
694 /* Function for stopping RX */
700 /* Set RX disabled in MODE 1 register */ in max3107_stop_rx()
701 spin_lock_irqsave(&s->data_lock, flags); in max3107_stop_rx()
702 s->mode1_reg |= MAX3107_MODE1_RXDIS_BIT; in max3107_stop_rx()
703 s->mode1_commit = 1; in max3107_stop_rx()
704 spin_unlock_irqrestore(&s->data_lock, flags); in max3107_stop_rx()
705 /* Set RX disabled */ in max3107_stop_rx()
706 s->rx_enabled = 0; in max3107_stop_rx()
740 if (!port->state) in max3107_set_termios()
743 tty = port->state->port.tty; in max3107_set_termios()
749 if ((termios->c_cflag & CSIZE) == CS7) in max3107_set_termios()
755 if (termios->c_cflag & PARENB) { in max3107_set_termios()
757 if (!(termios->c_cflag & PARODD)) in max3107_set_termios()
762 if (termios->c_cflag & CSTOPB) { in max3107_set_termios()
768 termios->c_cflag &= ~CMSPAR; in max3107_set_termios()
771 s->port.ignore_status_mask = 0; in max3107_set_termios()
772 if (termios->c_iflag & IGNPAR) in max3107_set_termios()
773 s->port.ignore_status_mask |= MAX3107_ALL_ERRORS; in max3107_set_termios()
776 s->port.state->port.tty->low_latency = 1; in max3107_set_termios()
781 spin_lock_irqsave(&s->data_lock, flags); in max3107_set_termios()
785 baud = s->baud; in max3107_set_termios()
786 new_brg = s->brg_cfg; in max3107_set_termios()
788 spin_unlock_irqrestore(&s->data_lock, flags); in max3107_set_termios()
790 s->baud = baud; in max3107_set_termios()
793 uart_update_timeout(port, termios->c_cflag, baud); in max3107_set_termios()
795 spin_lock_irqsave(&s->data_lock, flags); in max3107_set_termios()
796 if (s->lcr_reg != new_lcr) { in max3107_set_termios()
797 s->lcr_reg = new_lcr; in max3107_set_termios()
798 s->lcr_commit = 1; in max3107_set_termios()
800 if (s->brg_cfg != new_brg) { in max3107_set_termios()
801 s->brg_cfg = new_brg; in max3107_set_termios()
802 s->brg_commit = 1; in max3107_set_termios()
804 spin_unlock_irqrestore(&s->data_lock, flags); in max3107_set_termios()
815 if (s->suspended && s->pdata->hw_suspend) in max3107_shutdown()
816 s->pdata->hw_suspend(s, 0); in max3107_shutdown()
819 free_irq(s->spi->irq, s); in max3107_shutdown()
821 if (s->workqueue) { in max3107_shutdown()
823 flush_workqueue(s->workqueue); in max3107_shutdown()
824 destroy_workqueue(s->workqueue); in max3107_shutdown()
825 s->workqueue = NULL; in max3107_shutdown()
829 if (s->pdata->hw_suspend) in max3107_shutdown()
830 s->pdata->hw_suspend(s, 1); in max3107_shutdown()
839 s->workqueue = create_freezable_workqueue("max3107"); in max3107_startup()
840 if (!s->workqueue) { in max3107_startup()
841 dev_err(&s->spi->dev, "Workqueue creation failed\n"); in max3107_startup()
842 return -EBUSY; in max3107_startup()
844 INIT_WORK(&s->work, max3107_work); in max3107_startup()
847 if (request_irq(s->spi->irq, max3107_irq, IRQF_TRIGGER_FALLING, in max3107_startup()
849 dev_err(&s->spi->dev, "IRQ reguest failed\n"); in max3107_startup()
850 destroy_workqueue(s->workqueue); in max3107_startup()
851 s->workqueue = NULL; in max3107_startup()
852 return -EBUSY; in max3107_startup()
856 if (s->pdata->hw_suspend) in max3107_startup()
857 s->pdata->hw_suspend(s, 0); in max3107_startup()
869 return s->spi->modalias; in max3107_type()
889 s->port.type = PORT_MAX3107; in max3107_config_port()
896 if (ser->type == PORT_UNKNOWN || ser->type == PORT_MAX3107) in max3107_verify_port()
899 return -EINVAL; in max3107_verify_port()
960 * max3107_probe - SPI bus probe entry point
961 * @spi: the spi device
963 * SPI wants us to probe this device and if appropriate claim it.
968 int max3107_probe(struct spi_device *spi, struct max3107_plat *pdata) in max3107_probe() argument
971 u16 buf[2]; /* Buffer for SPI transfers */ in max3107_probe()
980 return -ENOMEM; in max3107_probe()
983 s->pdata = pdata; in max3107_probe()
985 /* SPI Rx buffer in max3107_probe()
986 * +2 for RX FIFO interrupt in max3107_probe()
987 * disabling and RX level query in max3107_probe()
989 s->rxbuf = kzalloc(sizeof(u16) * (MAX3107_RX_FIFO_SIZE+2), GFP_KERNEL); in max3107_probe()
990 if (!s->rxbuf) { in max3107_probe()
991 pr_err("Allocating RX buffer failed\n"); in max3107_probe()
992 retval = -ENOMEM; in max3107_probe()
995 s->rxstr = kzalloc(sizeof(u8) * MAX3107_RX_FIFO_SIZE, GFP_KERNEL); in max3107_probe()
996 if (!s->rxstr) { in max3107_probe()
997 pr_err("Allocating RX buffer failed\n"); in max3107_probe()
998 retval = -ENOMEM; in max3107_probe()
1001 /* SPI Tx buffer in max3107_probe()
1002 * SPI transfer buffer in max3107_probe()
1007 s->txbuf = kzalloc(sizeof(u16) * MAX3107_TX_FIFO_SIZE + 3, GFP_KERNEL); in max3107_probe()
1008 if (!s->txbuf) { in max3107_probe()
1010 retval = -ENOMEM; in max3107_probe()
1014 spin_lock_init(&s->data_lock); in max3107_probe()
1016 /* SPI intializations */ in max3107_probe()
1017 dev_set_drvdata(&spi->dev, s); in max3107_probe()
1018 spi->mode = SPI_MODE_0; in max3107_probe()
1019 spi->dev.platform_data = pdata; in max3107_probe()
1020 spi->bits_per_word = 16; in max3107_probe()
1021 s->ext_clk = pdata->ext_clk; in max3107_probe()
1022 s->loopback = pdata->loopback; in max3107_probe()
1023 spi_setup(spi); in max3107_probe()
1024 s->spi = spi; in max3107_probe()
1029 dev_err(&s->spi->dev, "SPI transfer for REVID read failed\n"); in max3107_probe()
1030 retval = -EIO; in max3107_probe()
1035 dev_err(&s->spi->dev, "REVID %x does not match\n", in max3107_probe()
1037 retval = -ENODEV; in max3107_probe()
1047 if (s->ext_clk) { in max3107_probe()
1055 /* Perform SPI transfer */ in max3107_probe()
1057 dev_err(&s->spi->dev, "SPI transfer for init failed\n"); in max3107_probe()
1058 retval = -EIO; in max3107_probe()
1066 dev_err(&s->spi->dev, "Registering UART driver failed\n"); in max3107_probe()
1073 s->port.fifosize = 128; in max3107_probe()
1074 s->port.ops = &max3107_ops; in max3107_probe()
1075 s->port.line = 0; in max3107_probe()
1076 s->port.dev = &spi->dev; in max3107_probe()
1077 s->port.uartclk = 9600; in max3107_probe()
1078 s->port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF; in max3107_probe()
1079 s->port.irq = s->spi->irq; in max3107_probe()
1080 s->port.type = PORT_MAX3107; in max3107_probe()
1083 retval = uart_add_one_port(&max3107_uart_driver, &s->port); in max3107_probe()
1085 dev_err(&s->spi->dev, "Adding UART port failed\n"); in max3107_probe()
1089 if (pdata->configure) { in max3107_probe()
1090 retval = pdata->configure(s); in max3107_probe()
1096 if (pdata->hw_suspend) in max3107_probe()
1097 pdata->hw_suspend(s, 1); in max3107_probe()
1102 kfree(s->txbuf); in max3107_probe()
1104 kfree(s->rxstr); in max3107_probe()
1106 kfree(s->rxbuf); in max3107_probe()
1114 int max3107_remove(struct spi_device *spi) in max3107_remove() argument
1116 struct max3107_port *s = dev_get_drvdata(&spi->dev); in max3107_remove()
1121 if (uart_remove_one_port(&max3107_uart_driver, &s->port)) in max3107_remove()
1122 dev_warn(&s->spi->dev, "Removing UART port failed\n"); in max3107_remove()
1126 kfree(s->rxbuf); in max3107_remove()
1127 kfree(s->rxstr); in max3107_remove()
1128 kfree(s->txbuf); in max3107_remove()
1138 int max3107_suspend(struct spi_device *spi, pm_message_t state) in max3107_suspend() argument
1141 struct max3107_port *s = dev_get_drvdata(&spi->dev); in max3107_suspend()
1146 uart_suspend_port(&max3107_uart_driver, &s->port); in max3107_suspend()
1149 if (s->pdata->hw_suspend) in max3107_suspend()
1150 s->pdata->hw_suspend(s, 1); in max3107_suspend()
1157 int max3107_resume(struct spi_device *spi) in max3107_resume() argument
1160 struct max3107_port *s = dev_get_drvdata(&spi->dev); in max3107_resume()
1165 if (s->pdata->hw_suspend) in max3107_resume()
1166 s->pdata->hw_suspend(s, 0); in max3107_resume()
1169 uart_resume_port(&max3107_uart_driver, &s->port); in max3107_resume()
1175 static int max3107_probe_generic(struct spi_device *spi) in max3107_probe_generic() argument
1177 return max3107_probe(spi, &generic_plat_data); in max3107_probe_generic()
1180 /* Spi driver data */
1214 MODULE_ALIAS("spi:max3107");