• Home
  • Raw
  • Download

Lines Matching +full:ps +full:- +full:speed

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright 2007, Frank A Kingswood <frank@kingswood-consulting.co.uk>
4 * Copyright 2007, Werner Cornelius <werner@cornelius-consult.de>
10 * serial port, an IEEE-1284 parallel printer port or a memory-like
27 /* flags for IO-Bits */
51 /* Break support - the information used to implement this was gleaned from
113 dev_dbg(&dev->dev, "%s - (%02x,%04x,%04x)\n", __func__, in ch341_control_out()
120 dev_err(&dev->dev, "failed to send control message: %d\n", r); in ch341_control_out()
131 dev_dbg(&dev->dev, "%s - (%02x,%04x,%04x,%u)\n", __func__, in ch341_control_in()
139 dev_err(&dev->dev, in ch341_control_in()
142 r = -EIO; in ch341_control_in()
145 dev_err(&dev->dev, "failed to receive control message: %d\n", in ch341_control_in()
154 #define CH341_CLK_DIV(ps, fact) (1 << (12 - 3 * (ps) - (fact))) argument
155 #define CH341_MIN_RATE(ps) (CH341_CLKRATE / (CH341_CLK_DIV((ps), 1) * 512)) argument
169 * The device line speed is given by the following equation:
171 * baudrate = 48000000 / (2^(12 - 3 * ps - fact) * div), where
173 * 0 <= ps <= 3,
178 static int ch341_get_divisor(struct ch341_private *priv, speed_t speed) in ch341_get_divisor() argument
182 int ps; in ch341_get_divisor() local
185 * Clamp to supported range, this makes the (ps < 0) and (div < 2) in ch341_get_divisor()
188 speed = clamp_val(speed, CH341_MIN_BPS, CH341_MAX_BPS); in ch341_get_divisor()
195 for (ps = 3; ps >= 0; ps--) { in ch341_get_divisor()
196 if (speed > ch341_min_rates[ps]) in ch341_get_divisor()
200 if (ps < 0) in ch341_get_divisor()
201 return -EINVAL; in ch341_get_divisor()
204 clk_div = CH341_CLK_DIV(ps, fact); in ch341_get_divisor()
205 div = CH341_CLKRATE / (clk_div * speed); in ch341_get_divisor()
207 /* Some devices require a lower base clock if ps < 3. */ in ch341_get_divisor()
208 if (ps < 3 && (priv->quirks & CH341_QUIRK_LIMITED_PRESCALER)) in ch341_get_divisor()
219 return -EINVAL; in ch341_get_divisor()
225 if (16 * CH341_CLKRATE / (clk_div * div) - 16 * speed >= in ch341_get_divisor()
226 16 * speed - 16 * CH341_CLKRATE / (clk_div * (div + 1))) in ch341_get_divisor()
239 return (0x100 - div) << 8 | fact << 2 | ps; in ch341_get_divisor()
250 return -EINVAL; in ch341_set_baudrate_lcr()
254 return -EINVAL; in ch341_set_baudrate_lcr()
257 * CH341A buffers data until a full endpoint-size packet (32 bytes) in ch341_set_baudrate_lcr()
296 return -ENOMEM; in ch341_get_status()
302 spin_lock_irqsave(&priv->lock, flags); in ch341_get_status()
303 priv->msr = (~(*buffer)) & CH341_BITS_MODEM_STAT; in ch341_get_status()
304 spin_unlock_irqrestore(&priv->lock, flags); in ch341_get_status()
310 /* -------------------------------------------------------------------------- */
320 return -ENOMEM; in ch341_configure()
326 dev_dbg(&dev->dev, "Chip version: 0x%02x\n", buffer[0]); in ch341_configure()
332 r = ch341_set_baudrate_lcr(dev, priv, priv->baud_rate, priv->lcr); in ch341_configure()
336 r = ch341_set_handshake(dev, priv->mcr); in ch341_configure()
345 struct usb_device *udev = port->serial->dev; in ch341_detect_quirks()
353 return -ENOMEM; in ch341_detect_quirks()
364 if (r == -EPIPE) { in ch341_detect_quirks()
365 dev_info(&port->dev, "break control not supported, using simulated break\n"); in ch341_detect_quirks()
373 r = -EIO; in ch341_detect_quirks()
374 dev_err(&port->dev, "failed to read break control: %d\n", r); in ch341_detect_quirks()
383 dev_dbg(&port->dev, "enabling quirk flags: 0x%02lx\n", quirks); in ch341_detect_quirks()
384 priv->quirks |= quirks; in ch341_detect_quirks()
397 return -ENOMEM; in ch341_port_probe()
399 spin_lock_init(&priv->lock); in ch341_port_probe()
400 priv->baud_rate = DEFAULT_BAUD_RATE; in ch341_port_probe()
405 priv->lcr = CH341_LCR_ENABLE_RX | CH341_LCR_ENABLE_TX | CH341_LCR_CS8; in ch341_port_probe()
407 r = ch341_configure(port->serial->dev, priv); in ch341_port_probe()
436 if (priv->msr & CH341_BIT_DCD) in ch341_carrier_raised()
447 spin_lock_irqsave(&priv->lock, flags); in ch341_dtr_rts()
449 priv->mcr |= CH341_BIT_RTS | CH341_BIT_DTR; in ch341_dtr_rts()
451 priv->mcr &= ~(CH341_BIT_RTS | CH341_BIT_DTR); in ch341_dtr_rts()
452 spin_unlock_irqrestore(&priv->lock, flags); in ch341_dtr_rts()
453 ch341_set_handshake(port->serial->dev, priv->mcr); in ch341_dtr_rts()
459 usb_kill_urb(port->interrupt_in_urb); in ch341_close()
472 dev_dbg(&port->dev, "%s - submitting interrupt urb\n", __func__); in ch341_open()
473 r = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); in ch341_open()
475 dev_err(&port->dev, "%s - failed to submit interrupt urb: %d\n", in ch341_open()
480 r = ch341_get_status(port->serial->dev, priv); in ch341_open()
482 dev_err(&port->dev, "failed to read modem status: %d\n", r); in ch341_open()
493 usb_kill_urb(port->interrupt_in_urb); in ch341_open()
499 * tty->termios contains the new setting to be used.
511 if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios)) in ch341_set_termios()
545 priv->baud_rate = baud_rate; in ch341_set_termios()
547 r = ch341_set_baudrate_lcr(port->serial->dev, priv, in ch341_set_termios()
548 priv->baud_rate, lcr); in ch341_set_termios()
550 priv->baud_rate = tty_termios_baud_rate(old_termios); in ch341_set_termios()
551 tty_termios_copy_hw(&tty->termios, old_termios); in ch341_set_termios()
553 priv->lcr = lcr; in ch341_set_termios()
557 spin_lock_irqsave(&priv->lock, flags); in ch341_set_termios()
559 priv->mcr &= ~(CH341_BIT_DTR | CH341_BIT_RTS); in ch341_set_termios()
560 else if (old_termios && (old_termios->c_cflag & CBAUD) == B0) in ch341_set_termios()
561 priv->mcr |= (CH341_BIT_DTR | CH341_BIT_RTS); in ch341_set_termios()
562 spin_unlock_irqrestore(&priv->lock, flags); in ch341_set_termios()
564 ch341_set_handshake(port->serial->dev, priv->mcr); in ch341_set_termios()
583 struct usb_serial_port *port = tty->driver_data; in ch341_simulate_break()
589 dev_dbg(&port->dev, "enter break state requested\n"); in ch341_simulate_break()
591 r = ch341_set_baudrate_lcr(port->serial->dev, priv, in ch341_simulate_break()
595 dev_err(&port->dev, in ch341_simulate_break()
603 dev_err(&port->dev, in ch341_simulate_break()
616 priv->break_end = jiffies + (11 * HZ / CH341_MIN_BPS); in ch341_simulate_break()
621 dev_dbg(&port->dev, "leave break state requested\n"); in ch341_simulate_break()
625 if (time_before(now, priv->break_end)) { in ch341_simulate_break()
627 delay = priv->break_end - now; in ch341_simulate_break()
628 dev_dbg(&port->dev, in ch341_simulate_break()
636 r = ch341_set_baudrate_lcr(port->serial->dev, priv, priv->baud_rate, in ch341_simulate_break()
637 priv->lcr); in ch341_simulate_break()
639 dev_err(&port->dev, in ch341_simulate_break()
641 priv->baud_rate, r); in ch341_simulate_break()
648 struct usb_serial_port *port = tty->driver_data; in ch341_break_ctl()
654 if (priv->quirks & CH341_QUIRK_SIMULATE_BREAK) { in ch341_break_ctl()
663 r = ch341_control_in(port->serial->dev, CH341_REQ_READ_REG, in ch341_break_ctl()
666 dev_err(&port->dev, "%s - USB control read error (%d)\n", in ch341_break_ctl()
670 dev_dbg(&port->dev, "%s - initial ch341 break register contents - reg1: %x, reg2: %x\n", in ch341_break_ctl()
673 dev_dbg(&port->dev, "%s - Enter break state requested\n", __func__); in ch341_break_ctl()
677 dev_dbg(&port->dev, "%s - Leave break state requested\n", __func__); in ch341_break_ctl()
681 dev_dbg(&port->dev, "%s - New ch341 break register contents - reg1: %x, reg2: %x\n", in ch341_break_ctl()
684 r = ch341_control_out(port->serial->dev, CH341_REQ_WRITE_REG, in ch341_break_ctl()
687 dev_err(&port->dev, "%s - USB control write error (%d)\n", in ch341_break_ctl()
696 struct usb_serial_port *port = tty->driver_data; in ch341_tiocmset()
701 spin_lock_irqsave(&priv->lock, flags); in ch341_tiocmset()
703 priv->mcr |= CH341_BIT_RTS; in ch341_tiocmset()
705 priv->mcr |= CH341_BIT_DTR; in ch341_tiocmset()
707 priv->mcr &= ~CH341_BIT_RTS; in ch341_tiocmset()
709 priv->mcr &= ~CH341_BIT_DTR; in ch341_tiocmset()
710 control = priv->mcr; in ch341_tiocmset()
711 spin_unlock_irqrestore(&priv->lock, flags); in ch341_tiocmset()
713 return ch341_set_handshake(port->serial->dev, control); in ch341_tiocmset()
730 spin_lock_irqsave(&priv->lock, flags); in ch341_update_status()
731 delta = status ^ priv->msr; in ch341_update_status()
732 priv->msr = status; in ch341_update_status()
733 spin_unlock_irqrestore(&priv->lock, flags); in ch341_update_status()
736 dev_dbg(&port->dev, "%s - multiple status change\n", __func__); in ch341_update_status()
742 port->icount.cts++; in ch341_update_status()
744 port->icount.dsr++; in ch341_update_status()
746 port->icount.rng++; in ch341_update_status()
748 port->icount.dcd++; in ch341_update_status()
749 tty = tty_port_tty_get(&port->port); in ch341_update_status()
757 wake_up_interruptible(&port->port.delta_msr_wait); in ch341_update_status()
762 struct usb_serial_port *port = urb->context; in ch341_read_int_callback()
763 unsigned char *data = urb->transfer_buffer; in ch341_read_int_callback()
764 unsigned int len = urb->actual_length; in ch341_read_int_callback()
767 switch (urb->status) { in ch341_read_int_callback()
771 case -ECONNRESET: in ch341_read_int_callback()
772 case -ENOENT: in ch341_read_int_callback()
773 case -ESHUTDOWN: in ch341_read_int_callback()
775 dev_dbg(&urb->dev->dev, "%s - urb shutting down: %d\n", in ch341_read_int_callback()
776 __func__, urb->status); in ch341_read_int_callback()
779 dev_dbg(&urb->dev->dev, "%s - nonzero urb status: %d\n", in ch341_read_int_callback()
780 __func__, urb->status); in ch341_read_int_callback()
784 usb_serial_debug_data(&port->dev, __func__, len, data); in ch341_read_int_callback()
789 dev_err(&urb->dev->dev, "%s - usb_submit_urb failed: %d\n", in ch341_read_int_callback()
796 struct usb_serial_port *port = tty->driver_data; in ch341_tiocmget()
803 spin_lock_irqsave(&priv->lock, flags); in ch341_tiocmget()
804 mcr = priv->mcr; in ch341_tiocmget()
805 status = priv->msr; in ch341_tiocmget()
806 spin_unlock_irqrestore(&priv->lock, flags); in ch341_tiocmget()
815 dev_dbg(&port->dev, "%s - result = %x\n", __func__, result); in ch341_tiocmget()
822 struct usb_serial_port *port = serial->port[0]; in ch341_reset_resume()
830 /* reconfigure ch341 serial port after bus-reset */ in ch341_reset_resume()
831 ch341_configure(serial->dev, priv); in ch341_reset_resume()
833 if (tty_port_initialized(&port->port)) { in ch341_reset_resume()
834 ret = usb_submit_urb(port->interrupt_in_urb, GFP_NOIO); in ch341_reset_resume()
836 dev_err(&port->dev, "failed to submit interrupt urb: %d\n", in ch341_reset_resume()
841 ret = ch341_get_status(port->serial->dev, priv); in ch341_reset_resume()
843 dev_err(&port->dev, "failed to read modem status: %d\n", in ch341_reset_resume()
854 .name = "ch341-uart",