Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

USB: serial: invoke dcd_change ldisc's handler.

The DCD pin of the serial port can receive a PPS signal. By calling
the port line discipline dcd handle, this patch allow to monitor PPS
through USB serial devices.

However the performance aren't as good as the uart drivers, so
document this point too.

Signed-off-by: Paul Chavent <paul.chavent@onera.fr>
Acked-by: Rodolfo Giometti <giometti@enneenne.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Paul Chavent and committed by
Greg Kroah-Hartman
833efc0e d14654df

+25
+15
Documentation/pps/pps.txt
··· 66 66 into files /dev/pps0, /dev/pps1, etc.. 67 67 68 68 69 + PPS with USB to serial devices 70 + ------------------------------ 71 + 72 + It is possible to grab the PPS from an USB to serial device. However, 73 + you should take into account the latencies and jitter introduced by 74 + the USB stack. Users has reported clock instability around +-1ms when 75 + synchronized with PPS through USB. This isn't suited for time server 76 + synchronization. 77 + 78 + If your device doesn't report PPS, you can check that the feature is 79 + supported by its driver. Most of the time, you only need to add a call 80 + to usb_serial_handle_dcd_change after checking the DCD status (see 81 + ch341 and pl2303 examples). 82 + 83 + 69 84 Coding example 70 85 -------------- 71 86
+10
drivers/usb/serial/generic.c
··· 570 570 571 571 dev_dbg(&usb_port->dev, "%s - status %d\n", __func__, status); 572 572 573 + if (tty) { 574 + struct tty_ldisc *ld = tty_ldisc_ref(tty); 575 + 576 + if (ld) { 577 + if (ld->ops->dcd_change) 578 + ld->ops->dcd_change(tty, status); 579 + tty_ldisc_deref(ld); 580 + } 581 + } 582 + 573 583 if (status) 574 584 wake_up_interruptible(&port->open_wait); 575 585 else if (tty && !C_CLOCAL(tty))