Lines Matching +full:serial +full:- +full:number
1 // SPDX-License-Identifier: GPL-2.0
4 * Controls the Moschip 7720 usb to dual port serial converter
14 * Greg Kroah-Hartman <gregkh@suse.de>
16 * Originally based on drivers/usb/serial/io_edgeport.c which is:
18 * Copyright (C) 2001-2002 Greg Kroah-Hartman <greg@kroah.com>
28 #include <linux/serial.h>
31 #include <linux/usb/serial.h>
36 #define DRIVER_DESC "Moschip USB Serial Driver"
55 /* This structure holds all of the local serial port information */
93 PPF = 2<<5, /* moschip calls this 'CB-FIFO mode */
105 struct usb_serial *serial; /* back to containing struct */ member
108 atomic_t shadowDSR; /* updated in int-in callback */
119 MOS7720_THR, /* serial port regs */
136 MOS7720_SP2_REG, /* serial port 2 (7720 only) */
185 else /* serial port reg */ in get_reg_value()
192 * not specific to a particular serial port.
194 static int write_mos_reg(struct usb_serial *serial, unsigned int serial_portnum, in write_mos_reg() argument
197 struct usb_device *usbdev = serial->dev; in write_mos_reg()
206 dev_err(&usbdev->dev, in write_mos_reg()
214 * ignored for registers that are not specific to a particular serial port.
216 static int read_mos_reg(struct usb_serial *serial, unsigned int serial_portnum, in read_mos_reg() argument
219 struct usb_device *usbdev = serial->dev; in read_mos_reg()
231 return -ENOMEM; in read_mos_reg()
239 dev_err(&usbdev->dev, in read_mos_reg()
242 status = -EIO; in read_mos_reg()
256 mos_parport->shadowECR = mode; in mos7715_change_mode()
257 write_mos_reg(mos_parport->serial, dummy, MOS7720_ECR, in mos7715_change_mode()
258 mos_parport->shadowECR); in mos7715_change_mode()
274 struct mos7715_parport *mos_parport = urbtrack->mos_parport; in destroy_urbtracker()
276 usb_free_urb(urbtrack->urb); in destroy_urbtracker()
277 kfree(urbtrack->setup); in destroy_urbtracker()
279 kref_put(&mos_parport->ref_count, destroy_mos_parport); in destroy_urbtracker()
283 * This runs as a tasklet when sending an urb in a non-blocking parallel
298 if (unlikely(mos_parport->serial == NULL)) in send_deferred_urbs()
301 dev = &mos_parport->serial->dev->dev; in send_deferred_urbs()
304 if (!mutex_trylock(&mos_parport->serial->disc_mutex)) { in send_deferred_urbs()
306 tasklet_schedule(&mos_parport->urb_tasklet); in send_deferred_urbs()
311 if (unlikely(mos_parport->serial->disconnected)) { in send_deferred_urbs()
312 mutex_unlock(&mos_parport->serial->disc_mutex); in send_deferred_urbs()
316 spin_lock_irqsave(&mos_parport->listlock, flags); in send_deferred_urbs()
317 if (list_empty(&mos_parport->deferred_urbs)) { in send_deferred_urbs()
318 spin_unlock_irqrestore(&mos_parport->listlock, flags); in send_deferred_urbs()
319 mutex_unlock(&mos_parport->serial->disc_mutex); in send_deferred_urbs()
325 list_for_each_safe(cursor, next, &mos_parport->deferred_urbs) in send_deferred_urbs()
326 list_move_tail(cursor, &mos_parport->active_urbs); in send_deferred_urbs()
327 list_for_each_entry_safe(urbtrack, tmp, &mos_parport->active_urbs, in send_deferred_urbs()
329 ret_val = usb_submit_urb(urbtrack->urb, GFP_ATOMIC); in send_deferred_urbs()
333 list_del(&urbtrack->urblist_entry); in send_deferred_urbs()
334 kref_put(&urbtrack->ref_count, destroy_urbtracker); in send_deferred_urbs()
337 spin_unlock_irqrestore(&mos_parport->listlock, flags); in send_deferred_urbs()
338 mutex_unlock(&mos_parport->serial->disc_mutex); in send_deferred_urbs()
344 struct urbtracker *urbtrack = urb->context; in async_complete()
345 int status = urb->status; in async_complete()
349 dev_dbg(&urb->dev->dev, "%s - nonzero urb status received: %d\n", __func__, status); in async_complete()
352 spin_lock_irqsave(&urbtrack->mos_parport->listlock, flags); in async_complete()
353 list_del(&urbtrack->urblist_entry); in async_complete()
354 spin_unlock_irqrestore(&urbtrack->mos_parport->listlock, flags); in async_complete()
355 kref_put(&urbtrack->ref_count, destroy_urbtracker); in async_complete()
364 struct usb_serial *serial = mos_parport->serial; in write_parport_reg_nonblock() local
365 struct usb_device *usbdev = serial->dev; in write_parport_reg_nonblock()
370 return -ENOMEM; in write_parport_reg_nonblock()
372 urbtrack->urb = usb_alloc_urb(0, GFP_ATOMIC); in write_parport_reg_nonblock()
373 if (!urbtrack->urb) { in write_parport_reg_nonblock()
375 return -ENOMEM; in write_parport_reg_nonblock()
377 urbtrack->setup = kmalloc(sizeof(*urbtrack->setup), GFP_ATOMIC); in write_parport_reg_nonblock()
378 if (!urbtrack->setup) { in write_parport_reg_nonblock()
379 usb_free_urb(urbtrack->urb); in write_parport_reg_nonblock()
381 return -ENOMEM; in write_parport_reg_nonblock()
383 urbtrack->setup->bRequestType = (__u8)0x40; in write_parport_reg_nonblock()
384 urbtrack->setup->bRequest = (__u8)0x0e; in write_parport_reg_nonblock()
385 urbtrack->setup->wValue = cpu_to_le16(get_reg_value(reg, dummy)); in write_parport_reg_nonblock()
386 urbtrack->setup->wIndex = cpu_to_le16(get_reg_index(reg)); in write_parport_reg_nonblock()
387 urbtrack->setup->wLength = 0; in write_parport_reg_nonblock()
388 usb_fill_control_urb(urbtrack->urb, usbdev, in write_parport_reg_nonblock()
390 (unsigned char *)urbtrack->setup, in write_parport_reg_nonblock()
392 kref_get(&mos_parport->ref_count); in write_parport_reg_nonblock()
393 urbtrack->mos_parport = mos_parport; in write_parport_reg_nonblock()
394 kref_init(&urbtrack->ref_count); in write_parport_reg_nonblock()
395 INIT_LIST_HEAD(&urbtrack->urblist_entry); in write_parport_reg_nonblock()
401 if (!mutex_trylock(&serial->disc_mutex)) { in write_parport_reg_nonblock()
402 spin_lock_irqsave(&mos_parport->listlock, flags); in write_parport_reg_nonblock()
403 list_add_tail(&urbtrack->urblist_entry, in write_parport_reg_nonblock()
404 &mos_parport->deferred_urbs); in write_parport_reg_nonblock()
405 spin_unlock_irqrestore(&mos_parport->listlock, flags); in write_parport_reg_nonblock()
406 tasklet_schedule(&mos_parport->urb_tasklet); in write_parport_reg_nonblock()
407 dev_dbg(&usbdev->dev, "tasklet scheduled\n"); in write_parport_reg_nonblock()
412 if (serial->disconnected) { in write_parport_reg_nonblock()
413 kref_put(&urbtrack->ref_count, destroy_urbtracker); in write_parport_reg_nonblock()
414 mutex_unlock(&serial->disc_mutex); in write_parport_reg_nonblock()
415 return -ENODEV; in write_parport_reg_nonblock()
419 spin_lock_irqsave(&mos_parport->listlock, flags); in write_parport_reg_nonblock()
420 list_add_tail(&urbtrack->urblist_entry, &mos_parport->active_urbs); in write_parport_reg_nonblock()
421 spin_unlock_irqrestore(&mos_parport->listlock, flags); in write_parport_reg_nonblock()
422 ret_val = usb_submit_urb(urbtrack->urb, GFP_ATOMIC); in write_parport_reg_nonblock()
423 mutex_unlock(&serial->disc_mutex); in write_parport_reg_nonblock()
425 dev_err(&usbdev->dev, in write_parport_reg_nonblock()
427 spin_lock_irqsave(&mos_parport->listlock, flags); in write_parport_reg_nonblock()
428 list_del(&urbtrack->urblist_entry); in write_parport_reg_nonblock()
429 spin_unlock_irqrestore(&mos_parport->listlock, flags); in write_parport_reg_nonblock()
430 kref_put(&urbtrack->ref_count, destroy_urbtracker); in write_parport_reg_nonblock()
442 * not called the release function yet because someone has a serial port open.
453 mos_parport = pp->private_data; in parport_prologue()
457 return -1; in parport_prologue()
459 mos_parport->msg_pending = true; /* synch usb call pending */ in parport_prologue()
460 reinit_completion(&mos_parport->syncmsg_compl); in parport_prologue()
463 mutex_lock(&mos_parport->serial->disc_mutex); in parport_prologue()
464 if (mos_parport->serial->disconnected) { in parport_prologue()
466 mutex_unlock(&mos_parport->serial->disc_mutex); in parport_prologue()
467 mos_parport->msg_pending = false; in parport_prologue()
468 complete(&mos_parport->syncmsg_compl); in parport_prologue()
469 return -1; in parport_prologue()
481 struct mos7715_parport *mos_parport = pp->private_data; in parport_epilogue()
482 mutex_unlock(&mos_parport->serial->disc_mutex); in parport_epilogue()
483 mos_parport->msg_pending = false; in parport_epilogue()
484 complete(&mos_parport->syncmsg_compl); in parport_epilogue()
489 struct mos7715_parport *mos_parport = pp->private_data; in parport_mos7715_write_data()
494 write_mos_reg(mos_parport->serial, dummy, MOS7720_DPR, (__u8)d); in parport_mos7715_write_data()
500 struct mos7715_parport *mos_parport = pp->private_data; in parport_mos7715_read_data()
505 read_mos_reg(mos_parport->serial, dummy, MOS7720_DPR, &d); in parport_mos7715_read_data()
512 struct mos7715_parport *mos_parport = pp->private_data; in parport_mos7715_write_control()
517 data = ((__u8)d & 0x0f) | (mos_parport->shadowDCR & 0xf0); in parport_mos7715_write_control()
518 write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR, data); in parport_mos7715_write_control()
519 mos_parport->shadowDCR = data; in parport_mos7715_write_control()
529 mos_parport = pp->private_data; in parport_mos7715_read_control()
534 dcr = mos_parport->shadowDCR & 0x0f; in parport_mos7715_read_control()
543 struct mos7715_parport *mos_parport = pp->private_data; in parport_mos7715_frob_control()
550 mos_parport->shadowDCR = (mos_parport->shadowDCR & (~mask)) ^ val; in parport_mos7715_frob_control()
551 write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR, in parport_mos7715_frob_control()
552 mos_parport->shadowDCR); in parport_mos7715_frob_control()
553 dcr = mos_parport->shadowDCR & 0x0f; in parport_mos7715_frob_control()
564 mos_parport = pp->private_data; in parport_mos7715_read_status()
569 status = atomic_read(&mos_parport->shadowDSR) & 0xf8; in parport_mos7715_read_status()
584 struct mos7715_parport *mos_parport = pp->private_data; in parport_mos7715_data_forward()
589 mos_parport->shadowDCR &= ~0x20; in parport_mos7715_data_forward()
590 write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR, in parport_mos7715_data_forward()
591 mos_parport->shadowDCR); in parport_mos7715_data_forward()
597 struct mos7715_parport *mos_parport = pp->private_data; in parport_mos7715_data_reverse()
602 mos_parport->shadowDCR |= 0x20; in parport_mos7715_data_reverse()
603 write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR, in parport_mos7715_data_reverse()
604 mos_parport->shadowDCR); in parport_mos7715_data_reverse()
611 s->u.pc.ctr = DCR_INIT_VAL; in parport_mos7715_init_state()
612 s->u.pc.ecr = ECR_INIT_VAL; in parport_mos7715_init_state()
622 mos_parport = pp->private_data; in parport_mos7715_save_state()
627 s->u.pc.ctr = mos_parport->shadowDCR; in parport_mos7715_save_state()
628 s->u.pc.ecr = mos_parport->shadowECR; in parport_mos7715_save_state()
639 mos_parport = pp->private_data; in parport_mos7715_restore_state()
644 mos_parport->shadowDCR = s->u.pc.ctr; in parport_mos7715_restore_state()
645 mos_parport->shadowECR = s->u.pc.ecr; in parport_mos7715_restore_state()
647 mos_parport->shadowDCR); in parport_mos7715_restore_state()
649 mos_parport->shadowECR); in parport_mos7715_restore_state()
658 struct mos7715_parport *mos_parport = pp->private_data; in parport_mos7715_write_compat()
664 retval = usb_bulk_msg(mos_parport->serial->dev, in parport_mos7715_write_compat()
665 usb_sndbulkpipe(mos_parport->serial->dev, 2), in parport_mos7715_write_compat()
670 dev_err(&mos_parport->serial->dev->dev, in parport_mos7715_write_compat()
708 static int mos7715_parport_init(struct usb_serial *serial) in mos7715_parport_init() argument
715 return -ENOMEM; in mos7715_parport_init()
717 mos_parport->msg_pending = false; in mos7715_parport_init()
718 kref_init(&mos_parport->ref_count); in mos7715_parport_init()
719 spin_lock_init(&mos_parport->listlock); in mos7715_parport_init()
720 INIT_LIST_HEAD(&mos_parport->active_urbs); in mos7715_parport_init()
721 INIT_LIST_HEAD(&mos_parport->deferred_urbs); in mos7715_parport_init()
722 usb_set_serial_data(serial, mos_parport); /* hijack private pointer */ in mos7715_parport_init()
723 mos_parport->serial = serial; in mos7715_parport_init()
724 tasklet_setup(&mos_parport->urb_tasklet, send_deferred_urbs); in mos7715_parport_init()
725 init_completion(&mos_parport->syncmsg_compl); in mos7715_parport_init()
728 write_mos_reg(mos_parport->serial, dummy, MOS7720_PP_REG, (__u8)0x80); in mos7715_parport_init()
729 write_mos_reg(mos_parport->serial, dummy, MOS7720_PP_REG, (__u8)0x00); in mos7715_parport_init()
732 mos_parport->shadowDCR = DCR_INIT_VAL; in mos7715_parport_init()
733 write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR, in mos7715_parport_init()
734 mos_parport->shadowDCR); in mos7715_parport_init()
735 mos_parport->shadowECR = ECR_INIT_VAL; in mos7715_parport_init()
736 write_mos_reg(mos_parport->serial, dummy, MOS7720_ECR, in mos7715_parport_init()
737 mos_parport->shadowECR); in mos7715_parport_init()
740 mos_parport->pp = parport_register_port(0, PARPORT_IRQ_NONE, in mos7715_parport_init()
743 if (mos_parport->pp == NULL) { in mos7715_parport_init()
744 dev_err(&serial->interface->dev, in mos7715_parport_init()
746 kref_put(&mos_parport->ref_count, destroy_mos_parport); in mos7715_parport_init()
747 return -EIO; in mos7715_parport_init()
749 mos_parport->pp->private_data = mos_parport; in mos7715_parport_init()
750 mos_parport->pp->modes = PARPORT_MODE_COMPAT | PARPORT_MODE_PCSPP; in mos7715_parport_init()
751 mos_parport->pp->dev = &serial->interface->dev; in mos7715_parport_init()
752 parport_announce_port(mos_parport->pp); in mos7715_parport_init()
767 int status = urb->status; in mos7720_interrupt_callback()
768 struct device *dev = &urb->dev->dev; in mos7720_interrupt_callback()
777 case -ECONNRESET: in mos7720_interrupt_callback()
778 case -ENOENT: in mos7720_interrupt_callback()
779 case -ESHUTDOWN: in mos7720_interrupt_callback()
781 dev_dbg(dev, "%s - urb shutting down with status: %d\n", __func__, status); in mos7720_interrupt_callback()
784 dev_dbg(dev, "%s - nonzero urb status received: %d\n", __func__, status); in mos7720_interrupt_callback()
788 length = urb->actual_length; in mos7720_interrupt_callback()
789 data = urb->transfer_buffer; in mos7720_interrupt_callback()
792 * Byte 1 IIR Port 1 (port.number is 0) in mos7720_interrupt_callback()
793 * Byte 2 IIR Port 2 (port.number is 1) in mos7720_interrupt_callback()
794 * Byte 3 -------------- in mos7720_interrupt_callback()
798 * oneukum 2007-03-14 */ in mos7720_interrupt_callback()
814 dev_dbg(dev, "Serial Port 1: Receiver status error or address bit detected in 9-bit mode\n"); in mos7720_interrupt_callback()
817 dev_dbg(dev, "Serial Port 1: Receiver time out\n"); in mos7720_interrupt_callback()
820 /* dev_dbg(dev, "Serial Port 1: Modem status change\n"); */ in mos7720_interrupt_callback()
826 dev_dbg(dev, "Serial Port 2: Receiver status error or address bit detected in 9-bit mode\n"); in mos7720_interrupt_callback()
829 dev_dbg(dev, "Serial Port 2: Receiver time out\n"); in mos7720_interrupt_callback()
832 /* dev_dbg(dev, "Serial Port 2: Modem status change\n"); */ in mos7720_interrupt_callback()
840 dev_err(dev, "%s - Error %d submitting control urb\n", __func__, result); in mos7720_interrupt_callback()
852 int status = urb->status; in mos7715_interrupt_callback()
853 struct device *dev = &urb->dev->dev; in mos7715_interrupt_callback()
861 case -ECONNRESET: in mos7715_interrupt_callback()
862 case -ENOENT: in mos7715_interrupt_callback()
863 case -ESHUTDOWN: in mos7715_interrupt_callback()
864 case -ENODEV: in mos7715_interrupt_callback()
866 dev_dbg(dev, "%s - urb shutting down with status: %d\n", __func__, status); in mos7715_interrupt_callback()
869 dev_dbg(dev, "%s - nonzero urb status received: %d\n", __func__, status); in mos7715_interrupt_callback()
873 length = urb->actual_length; in mos7715_interrupt_callback()
874 data = urb->transfer_buffer; in mos7715_interrupt_callback()
877 * Byte 1: IIR serial Port in mos7715_interrupt_callback()
888 if (!(iir & 0x01)) { /* serial port interrupt pending */ in mos7715_interrupt_callback()
891 dev_dbg(dev, "Serial Port: Receiver status error or address bit detected in 9-bit mode\n"); in mos7715_interrupt_callback()
894 dev_dbg(dev, "Serial Port: Receiver time out\n"); in mos7715_interrupt_callback()
897 /* dev_dbg(dev, "Serial Port: Modem status change\n"); */ in mos7715_interrupt_callback()
904 struct usb_serial_port *port = urb->context; in mos7715_interrupt_callback()
905 struct mos7715_parport *mos_parport = port->serial->private; in mos7715_interrupt_callback()
908 atomic_set(&mos_parport->shadowDSR, data[2]); in mos7715_interrupt_callback()
915 dev_err(dev, "%s - Error %d submitting control urb\n", __func__, result); in mos7715_interrupt_callback()
928 int status = urb->status; in mos7720_bulk_in_callback()
931 dev_dbg(&urb->dev->dev, "nonzero read bulk status received: %d\n", status); in mos7720_bulk_in_callback()
935 port = urb->context; in mos7720_bulk_in_callback()
937 dev_dbg(&port->dev, "Entering...%s\n", __func__); in mos7720_bulk_in_callback()
939 data = urb->transfer_buffer; in mos7720_bulk_in_callback()
941 if (urb->actual_length) { in mos7720_bulk_in_callback()
942 tty_insert_flip_string(&port->port, data, urb->actual_length); in mos7720_bulk_in_callback()
943 tty_flip_buffer_push(&port->port); in mos7720_bulk_in_callback()
946 if (port->read_urb->status != -EINPROGRESS) { in mos7720_bulk_in_callback()
947 retval = usb_submit_urb(port->read_urb, GFP_ATOMIC); in mos7720_bulk_in_callback()
949 dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, retval = %d\n", retval); in mos7720_bulk_in_callback()
955 * this is the callback function for when we have finished sending serial
961 int status = urb->status; in mos7720_bulk_out_data_callback()
964 dev_dbg(&urb->dev->dev, "nonzero write bulk status received:%d\n", status); in mos7720_bulk_out_data_callback()
968 mos7720_port = urb->context; in mos7720_bulk_out_data_callback()
970 dev_dbg(&urb->dev->dev, "NULL mos7720_port pointer\n"); in mos7720_bulk_out_data_callback()
974 if (mos7720_port->open) in mos7720_bulk_out_data_callback()
975 tty_port_tty_wakeup(&mos7720_port->port->port); in mos7720_bulk_out_data_callback()
978 static int mos77xx_calc_num_ports(struct usb_serial *serial, in mos77xx_calc_num_ports() argument
981 u16 product = le16_to_cpu(serial->dev->descriptor.idProduct); in mos77xx_calc_num_ports()
986 * parallel port, and the second for the serial port. We swap in mos77xx_calc_num_ports()
988 * only registered port structure uses the serial-port in mos77xx_calc_num_ports()
991 swap(epds->bulk_in[0], epds->bulk_in[1]); in mos77xx_calc_num_ports()
992 swap(epds->bulk_out[0], epds->bulk_out[1]); in mos77xx_calc_num_ports()
1002 struct usb_serial *serial; in mos7720_open() local
1011 serial = port->serial; in mos7720_open()
1015 return -ENODEV; in mos7720_open()
1017 usb_clear_halt(serial->dev, port->write_urb->pipe); in mos7720_open()
1018 usb_clear_halt(serial->dev, port->read_urb->pipe); in mos7720_open()
1023 mos7720_port->write_urb_pool[j] = urb; in mos7720_open()
1027 urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, in mos7720_open()
1029 if (!urb->transfer_buffer) { in mos7720_open()
1030 usb_free_urb(mos7720_port->write_urb_pool[j]); in mos7720_open()
1031 mos7720_port->write_urb_pool[j] = NULL; in mos7720_open()
1038 return -ENOMEM; in mos7720_open()
1040 /* Initialize MCS7720 -- Write Init values to corresponding Registers in mos7720_open()
1054 port_number = port->port_number; in mos7720_open()
1055 read_mos_reg(serial, port_number, MOS7720_LSR, &data); in mos7720_open()
1057 dev_dbg(&port->dev, "SS::%p LSR:%x\n", mos7720_port, data); in mos7720_open()
1059 write_mos_reg(serial, dummy, MOS7720_SP1_REG, 0x02); in mos7720_open()
1060 write_mos_reg(serial, dummy, MOS7720_SP2_REG, 0x02); in mos7720_open()
1062 write_mos_reg(serial, port_number, MOS7720_IER, 0x00); in mos7720_open()
1063 write_mos_reg(serial, port_number, MOS7720_FCR, 0x00); in mos7720_open()
1065 write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf); in mos7720_open()
1066 mos7720_port->shadowLCR = 0x03; in mos7720_open()
1067 write_mos_reg(serial, port_number, MOS7720_LCR, in mos7720_open()
1068 mos7720_port->shadowLCR); in mos7720_open()
1069 mos7720_port->shadowMCR = 0x0b; in mos7720_open()
1070 write_mos_reg(serial, port_number, MOS7720_MCR, in mos7720_open()
1071 mos7720_port->shadowMCR); in mos7720_open()
1073 write_mos_reg(serial, port_number, MOS7720_SP_CONTROL_REG, 0x00); in mos7720_open()
1074 read_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, &data); in mos7720_open()
1075 data = data | (port->port_number + 1); in mos7720_open()
1076 write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, data); in mos7720_open()
1077 mos7720_port->shadowLCR = 0x83; in mos7720_open()
1078 write_mos_reg(serial, port_number, MOS7720_LCR, in mos7720_open()
1079 mos7720_port->shadowLCR); in mos7720_open()
1080 write_mos_reg(serial, port_number, MOS7720_THR, 0x0c); in mos7720_open()
1081 write_mos_reg(serial, port_number, MOS7720_IER, 0x00); in mos7720_open()
1082 mos7720_port->shadowLCR = 0x03; in mos7720_open()
1083 write_mos_reg(serial, port_number, MOS7720_LCR, in mos7720_open()
1084 mos7720_port->shadowLCR); in mos7720_open()
1085 write_mos_reg(serial, port_number, MOS7720_IER, 0x0c); in mos7720_open()
1087 response = usb_submit_urb(port->read_urb, GFP_KERNEL); in mos7720_open()
1089 dev_err(&port->dev, "%s - Error %d submitting read urb\n", in mos7720_open()
1093 mos7720_port->shadowMCR = UART_MCR_OUT2; /* Must set to enable ints! */ in mos7720_open()
1096 mos7720_port->open = 1; in mos7720_open()
1106 * If successful, we return the number of bytes left to be written in the
1108 * Otherwise we return a negative error number.
1112 struct usb_serial_port *port = tty->driver_data; in mos7720_chars_in_buffer()
1122 if (mos7720_port->write_urb_pool[i] && in mos7720_chars_in_buffer()
1123 mos7720_port->write_urb_pool[i]->status == -EINPROGRESS) in mos7720_chars_in_buffer()
1126 dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars); in mos7720_chars_in_buffer()
1132 struct usb_serial *serial; in mos7720_close() local
1136 serial = port->serial; in mos7720_close()
1143 usb_kill_urb(mos7720_port->write_urb_pool[j]); in mos7720_close()
1147 if (mos7720_port->write_urb_pool[j]) { in mos7720_close()
1148 kfree(mos7720_port->write_urb_pool[j]->transfer_buffer); in mos7720_close()
1149 usb_free_urb(mos7720_port->write_urb_pool[j]); in mos7720_close()
1155 usb_kill_urb(port->write_urb); in mos7720_close()
1156 usb_kill_urb(port->read_urb); in mos7720_close()
1158 write_mos_reg(serial, port->port_number, MOS7720_MCR, 0x00); in mos7720_close()
1159 write_mos_reg(serial, port->port_number, MOS7720_IER, 0x00); in mos7720_close()
1161 mos7720_port->open = 0; in mos7720_close()
1166 struct usb_serial_port *port = tty->driver_data; in mos7720_break()
1168 struct usb_serial *serial; in mos7720_break() local
1171 serial = port->serial; in mos7720_break()
1177 if (break_state == -1) in mos7720_break()
1178 data = mos7720_port->shadowLCR | UART_LCR_SBC; in mos7720_break()
1180 data = mos7720_port->shadowLCR & ~UART_LCR_SBC; in mos7720_break()
1182 mos7720_port->shadowLCR = data; in mos7720_break()
1183 write_mos_reg(serial, port->port_number, MOS7720_LCR, in mos7720_break()
1184 mos7720_port->shadowLCR); in mos7720_break()
1192 * Otherwise we return a negative error number.
1196 struct usb_serial_port *port = tty->driver_data; in mos7720_write_room()
1203 return -ENODEV; in mos7720_write_room()
1207 if (mos7720_port->write_urb_pool[i] && in mos7720_write_room()
1208 mos7720_port->write_urb_pool[i]->status != -EINPROGRESS) in mos7720_write_room()
1212 dev_dbg(&port->dev, "%s - returns %d\n", __func__, room); in mos7720_write_room()
1225 struct usb_serial *serial; in mos7720_write() local
1229 serial = port->serial; in mos7720_write()
1233 return -ENODEV; in mos7720_write()
1239 if (mos7720_port->write_urb_pool[i] && in mos7720_write()
1240 mos7720_port->write_urb_pool[i]->status != -EINPROGRESS) { in mos7720_write()
1241 urb = mos7720_port->write_urb_pool[i]; in mos7720_write()
1242 dev_dbg(&port->dev, "URB:%d\n", i); in mos7720_write()
1248 dev_dbg(&port->dev, "%s - no more free urbs\n", __func__); in mos7720_write()
1252 if (urb->transfer_buffer == NULL) { in mos7720_write()
1253 urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, in mos7720_write()
1255 if (!urb->transfer_buffer) { in mos7720_write()
1256 bytes_sent = -ENOMEM; in mos7720_write()
1262 memcpy(urb->transfer_buffer, current_position, transfer_size); in mos7720_write()
1263 usb_serial_debug_data(&port->dev, __func__, transfer_size, in mos7720_write()
1264 urb->transfer_buffer); in mos7720_write()
1267 usb_fill_bulk_urb(urb, serial->dev, in mos7720_write()
1268 usb_sndbulkpipe(serial->dev, in mos7720_write()
1269 port->bulk_out_endpointAddress), in mos7720_write()
1270 urb->transfer_buffer, transfer_size, in mos7720_write()
1276 dev_err_console(port, "%s - usb_submit_urb(write bulk) failed " in mos7720_write()
1289 struct usb_serial_port *port = tty->driver_data; in mos7720_throttle()
1298 if (!mos7720_port->open) { in mos7720_throttle()
1299 dev_dbg(&port->dev, "%s - port not opened\n", __func__); in mos7720_throttle()
1313 mos7720_port->shadowMCR &= ~UART_MCR_RTS; in mos7720_throttle()
1314 write_mos_reg(port->serial, port->port_number, MOS7720_MCR, in mos7720_throttle()
1315 mos7720_port->shadowMCR); in mos7720_throttle()
1321 struct usb_serial_port *port = tty->driver_data; in mos7720_unthrottle()
1328 if (!mos7720_port->open) { in mos7720_unthrottle()
1329 dev_dbg(&port->dev, "%s - port not opened\n", __func__); in mos7720_unthrottle()
1343 mos7720_port->shadowMCR |= UART_MCR_RTS; in mos7720_unthrottle()
1344 write_mos_reg(port->serial, port->port_number, MOS7720_MCR, in mos7720_unthrottle()
1345 mos7720_port->shadowMCR); in mos7720_unthrottle()
1354 struct usb_serial *serial; in set_higher_rates() local
1358 return -EINVAL; in set_higher_rates()
1360 port = mos7720_port->port; in set_higher_rates()
1361 serial = port->serial; in set_higher_rates()
1366 dev_dbg(&port->dev, "Sending Setting Commands ..........\n"); in set_higher_rates()
1367 port_number = port->port_number; in set_higher_rates()
1369 write_mos_reg(serial, port_number, MOS7720_IER, 0x00); in set_higher_rates()
1370 write_mos_reg(serial, port_number, MOS7720_FCR, 0x00); in set_higher_rates()
1371 write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf); in set_higher_rates()
1372 mos7720_port->shadowMCR = 0x0b; in set_higher_rates()
1373 write_mos_reg(serial, port_number, MOS7720_MCR, in set_higher_rates()
1374 mos7720_port->shadowMCR); in set_higher_rates()
1375 write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, 0x00); in set_higher_rates()
1385 write_mos_reg(serial, dummy, sp_reg, baud * 0x10); in set_higher_rates()
1386 write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, 0x03); in set_higher_rates()
1387 mos7720_port->shadowMCR = 0x2b; in set_higher_rates()
1388 write_mos_reg(serial, port_number, MOS7720_MCR, in set_higher_rates()
1389 mos7720_port->shadowMCR); in set_higher_rates()
1394 mos7720_port->shadowLCR = mos7720_port->shadowLCR | UART_LCR_DLAB; in set_higher_rates()
1395 write_mos_reg(serial, port_number, MOS7720_LCR, in set_higher_rates()
1396 mos7720_port->shadowLCR); in set_higher_rates()
1397 write_mos_reg(serial, port_number, MOS7720_DLL, 0x01); in set_higher_rates()
1398 write_mos_reg(serial, port_number, MOS7720_DLM, 0x00); in set_higher_rates()
1399 mos7720_port->shadowLCR = mos7720_port->shadowLCR & ~UART_LCR_DLAB; in set_higher_rates()
1400 write_mos_reg(serial, port_number, MOS7720_LCR, in set_higher_rates()
1401 mos7720_port->shadowLCR); in set_higher_rates()
1447 dev_dbg(&port->dev, "%s - %d\n", __func__, baudrate); in calc_baud_rate_divisor()
1464 round = (__u16)(round1 - (custom * 10)); in calc_baud_rate_divisor()
1469 dev_dbg(&port->dev, "Baud %d = %d\n", baudrate, custom); in calc_baud_rate_divisor()
1473 dev_dbg(&port->dev, "Baud calculation Failed...\n"); in calc_baud_rate_divisor()
1474 return -EINVAL; in calc_baud_rate_divisor()
1486 struct usb_serial *serial; in send_cmd_write_baud_rate() local
1489 unsigned char number; in send_cmd_write_baud_rate() local
1492 return -1; in send_cmd_write_baud_rate()
1494 port = mos7720_port->port; in send_cmd_write_baud_rate()
1495 serial = port->serial; in send_cmd_write_baud_rate()
1497 number = port->port_number; in send_cmd_write_baud_rate()
1498 dev_dbg(&port->dev, "%s - baud = %d\n", __func__, baudrate); in send_cmd_write_baud_rate()
1503 dev_err(&port->dev, "%s - bad baud rate\n", __func__); in send_cmd_write_baud_rate()
1508 mos7720_port->shadowLCR = mos7720_port->shadowLCR | UART_LCR_DLAB; in send_cmd_write_baud_rate()
1509 write_mos_reg(serial, number, MOS7720_LCR, mos7720_port->shadowLCR); in send_cmd_write_baud_rate()
1512 write_mos_reg(serial, number, MOS7720_DLL, (__u8)(divisor & 0xff)); in send_cmd_write_baud_rate()
1513 write_mos_reg(serial, number, MOS7720_DLM, in send_cmd_write_baud_rate()
1517 mos7720_port->shadowLCR = mos7720_port->shadowLCR & ~UART_LCR_DLAB; in send_cmd_write_baud_rate()
1518 write_mos_reg(serial, number, MOS7720_LCR, mos7720_port->shadowLCR); in send_cmd_write_baud_rate()
1533 struct usb_serial *serial; in change_port_settings() local
1545 port = mos7720_port->port; in change_port_settings()
1546 serial = port->serial; in change_port_settings()
1547 port_number = port->port_number; in change_port_settings()
1549 if (!mos7720_port->open) { in change_port_settings()
1550 dev_dbg(&port->dev, "%s - port not opened\n", __func__); in change_port_settings()
1558 cflag = tty->termios.c_cflag; in change_port_settings()
1560 /* Change the number of bits */ in change_port_settings()
1583 dev_dbg(&port->dev, "%s - parity = odd\n", __func__); in change_port_settings()
1586 dev_dbg(&port->dev, "%s - parity = even\n", __func__); in change_port_settings()
1590 dev_dbg(&port->dev, "%s - parity = none\n", __func__); in change_port_settings()
1599 dev_dbg(&port->dev, "%s - stop bits = 2\n", __func__); in change_port_settings()
1602 dev_dbg(&port->dev, "%s - stop bits = 1\n", __func__); in change_port_settings()
1610 mos7720_port->shadowLCR &= in change_port_settings()
1612 mos7720_port->shadowLCR |= (lData | lParity | lStop); in change_port_settings()
1616 write_mos_reg(serial, port_number, MOS7720_IER, 0x00); in change_port_settings()
1617 write_mos_reg(serial, port_number, MOS7720_FCR, 0x00); in change_port_settings()
1618 write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf); in change_port_settings()
1621 write_mos_reg(serial, port_number, MOS7720_LCR, in change_port_settings()
1622 mos7720_port->shadowLCR); in change_port_settings()
1623 mos7720_port->shadowMCR = 0x0b; in change_port_settings()
1624 write_mos_reg(serial, port_number, MOS7720_MCR, in change_port_settings()
1625 mos7720_port->shadowMCR); in change_port_settings()
1628 mos7720_port->shadowMCR = UART_MCR_OUT2; in change_port_settings()
1630 mos7720_port->shadowMCR |= (UART_MCR_DTR | UART_MCR_RTS); in change_port_settings()
1633 mos7720_port->shadowMCR |= (UART_MCR_XONANY); in change_port_settings()
1635 * serial port, in SP1/2_CONTROL_REG */ in change_port_settings()
1637 write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, in change_port_settings()
1640 write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, in change_port_settings()
1644 mos7720_port->shadowMCR &= ~(UART_MCR_XONANY); in change_port_settings()
1646 write_mos_reg(serial, port_number, MOS7720_MCR, in change_port_settings()
1647 mos7720_port->shadowMCR); in change_port_settings()
1653 dev_dbg(&port->dev, "Picked default baud...\n"); in change_port_settings()
1660 write_mos_reg(serial, port_number, MOS7720_IER, 0x0c); in change_port_settings()
1664 dev_dbg(&port->dev, "%s - baud rate = %d\n", __func__, baud); in change_port_settings()
1671 write_mos_reg(serial, port_number, MOS7720_IER, 0x0c); in change_port_settings()
1673 if (port->read_urb->status != -EINPROGRESS) { in change_port_settings()
1674 status = usb_submit_urb(port->read_urb, GFP_KERNEL); in change_port_settings()
1676 dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n", status); in change_port_settings()
1696 if (!mos7720_port->open) { in mos7720_set_termios()
1697 dev_dbg(&port->dev, "%s - port not opened\n", __func__); in mos7720_set_termios()
1704 if (port->read_urb->status != -EINPROGRESS) { in mos7720_set_termios()
1705 status = usb_submit_urb(port->read_urb, GFP_KERNEL); in mos7720_set_termios()
1707 dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n", status); in mos7720_set_termios()
1712 * get_lsr_info - get line status register info
1724 struct usb_serial_port *port = tty->driver_data; in get_lsr_info()
1727 int port_number = port->port_number; in get_lsr_info()
1732 read_mos_reg(port->serial, port_number, MOS7720_LSR, &data); in get_lsr_info()
1735 dev_dbg(&port->dev, "%s -- Empty\n", __func__); in get_lsr_info()
1740 return -EFAULT; in get_lsr_info()
1746 struct usb_serial_port *port = tty->driver_data; in mos7720_tiocmget()
1752 mcr = mos7720_port->shadowMCR; in mos7720_tiocmget()
1753 msr = mos7720_port->shadowMSR; in mos7720_tiocmget()
1768 struct usb_serial_port *port = tty->driver_data; in mos7720_tiocmset()
1772 mcr = mos7720_port->shadowMCR; in mos7720_tiocmset()
1788 mos7720_port->shadowMCR = mcr; in mos7720_tiocmset()
1789 write_mos_reg(port->serial, port->port_number, MOS7720_MCR, in mos7720_tiocmset()
1790 mos7720_port->shadowMCR); in mos7720_tiocmset()
1798 struct usb_serial_port *port = tty->driver_data; in get_serial_info()
1801 ss->type = PORT_16550A; in get_serial_info()
1802 ss->line = mos7720_port->port->minor; in get_serial_info()
1803 ss->port = mos7720_port->port->port_number; in get_serial_info()
1804 ss->irq = 0; in get_serial_info()
1805 ss->xmit_fifo_size = NUM_URBS * URB_TRANSFER_BUFFER_SIZE; in get_serial_info()
1806 ss->baud_base = 9600; in get_serial_info()
1807 ss->close_delay = 5*HZ; in get_serial_info()
1808 ss->closing_wait = 30*HZ; in get_serial_info()
1815 struct usb_serial_port *port = tty->driver_data; in mos7720_ioctl()
1820 return -ENODEV; in mos7720_ioctl()
1824 dev_dbg(&port->dev, "%s TIOCSERGETLSR\n", __func__); in mos7720_ioctl()
1829 return -ENOIOCTLCMD; in mos7720_ioctl()
1832 static int mos7720_startup(struct usb_serial *serial) in mos7720_startup() argument
1839 product = le16_to_cpu(serial->dev->descriptor.idProduct); in mos7720_startup()
1840 dev = serial->dev; in mos7720_startup()
1843 struct urb *urb = serial->port[0]->interrupt_in_urb; in mos7720_startup()
1845 urb->complete = mos7715_interrupt_callback; in mos7720_startup()
1848 ret_val = mos7715_parport_init(serial); in mos7720_startup()
1854 ret_val = usb_submit_urb(serial->port[0]->interrupt_in_urb, GFP_KERNEL); in mos7720_startup()
1856 dev_err(&dev->dev, "failed to submit interrupt urb: %d\n", in mos7720_startup()
1861 read_mos_reg(serial, 0, MOS7720_LSR, &data); in mos7720_startup()
1862 dev_dbg(&dev->dev, "LSR:%x\n", data); in mos7720_startup()
1867 static void mos7720_release(struct usb_serial *serial) in mos7720_release() argument
1869 usb_kill_urb(serial->port[0]->interrupt_in_urb); in mos7720_release()
1874 if (le16_to_cpu(serial->dev->descriptor.idProduct) in mos7720_release()
1879 usb_get_serial_data(serial); in mos7720_release()
1883 mos_parport->pp->private_data = NULL; in mos7720_release()
1887 if (mos_parport->msg_pending) in mos7720_release()
1888 wait_for_completion_timeout(&mos_parport->syncmsg_compl, in mos7720_release()
1891 parport_remove_port(mos_parport->pp); in mos7720_release()
1892 usb_set_serial_data(serial, NULL); in mos7720_release()
1893 mos_parport->serial = NULL; in mos7720_release()
1896 tasklet_kill(&mos_parport->urb_tasklet); in mos7720_release()
1899 spin_lock_irqsave(&mos_parport->listlock, flags); in mos7720_release()
1901 &mos_parport->active_urbs, in mos7720_release()
1903 usb_unlink_urb(urbtrack->urb); in mos7720_release()
1904 spin_unlock_irqrestore(&mos_parport->listlock, flags); in mos7720_release()
1905 parport_del_port(mos_parport->pp); in mos7720_release()
1907 kref_put(&mos_parport->ref_count, destroy_mos_parport); in mos7720_release()
1918 return -ENOMEM; in mos7720_port_probe()
1920 mos7720_port->port = port; in mos7720_port_probe()