Commit 1e12a521 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

Merge tag 'usb-serial-4.21-rc1' of...

Merge tag 'usb-serial-4.21-rc1' of https://git.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial

 into usb-next

Johan writes:

USB-serial updates for 4.21-rc1

Here are the USB-serial updates for 4.21-rc1, including:

 - support for mos7840 3-port devices
 - improved ftdi baud-rate divisor calculations
 - support for a new class of f81534 devices

Included are also various clean ups and some new pl2303 device ids.

All have been in linux-next with no reported issues.

Signed-off-by: default avatarJohan Hovold <johan@kernel.org>

* tag 'usb-serial-4.21-rc1' of https://git.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial:
  USB: serial: pl2303: add ids for Hewlett-Packard HP POS pole displays
  USB: serial: mos7840: remove set but not used variables 'number, serial'
  USB: serial: mos7840: add a product ID for the new product
  USB: serial: mos7840: clean up register handling
  USB: serial: ftdi_sio: use rounding when calculating baud rate divisors
  USB: serial: f81534: fix reading old/new IC config
  USB: serial: mos7840: remove set but not used variables 'st, data1, iflag'
  USB: serial: quatech2: remove set but not used variable 'port_priv'
parents eafb27fa 8d503f20
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -45,14 +45,17 @@
#define F81534_CONFIG1_REG		(0x09 + F81534_UART_BASE_ADDRESS)

#define F81534_DEF_CONF_ADDRESS_START	0x3000
#define F81534_DEF_CONF_SIZE		8
#define F81534_DEF_CONF_SIZE		12

#define F81534_CUSTOM_ADDRESS_START	0x2f00
#define F81534_CUSTOM_DATA_SIZE		0x10
#define F81534_CUSTOM_NO_CUSTOM_DATA	0xff
#define F81534_CUSTOM_VALID_TOKEN	0xf0
#define F81534_CONF_OFFSET		1
#define F81534_CONF_GPIO_OFFSET		4
#define F81534_CONF_INIT_GPIO_OFFSET	4
#define F81534_CONF_WORK_GPIO_OFFSET	8
#define F81534_CONF_GPIO_SHUTDOWN	7
#define F81534_CONF_GPIO_RS232		1

#define F81534_MAX_DATA_BLOCK		64
#define F81534_MAX_BUS_RETRY		20
@@ -1337,8 +1340,19 @@ static int f81534_set_port_output_pin(struct usb_serial_port *port)
	serial_priv = usb_get_serial_data(serial);
	port_priv = usb_get_serial_port_data(port);

	idx = F81534_CONF_GPIO_OFFSET + port_priv->phy_num;
	idx = F81534_CONF_INIT_GPIO_OFFSET + port_priv->phy_num;
	value = serial_priv->conf_data[idx];
	if (value >= F81534_CONF_GPIO_SHUTDOWN) {
		/*
		 * Newer IC configure will make transceiver in shutdown mode on
		 * initial power on. We need enable it before using UARTs.
		 */
		idx = F81534_CONF_WORK_GPIO_OFFSET + port_priv->phy_num;
		value = serial_priv->conf_data[idx];
		if (value >= F81534_CONF_GPIO_SHUTDOWN)
			value = F81534_CONF_GPIO_RS232;
	}

	pins = &f81534_port_out_pins[port_priv->phy_num];

	for (i = 0; i < ARRAY_SIZE(pins->pin); ++i) {
+3 −3
Original line number Diff line number Diff line
@@ -1130,7 +1130,7 @@ static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base)
{
	unsigned short int divisor;
	/* divisor shifted 3 bits to the left */
	int divisor3 = base / 2 / baud;
	int divisor3 = DIV_ROUND_CLOSEST(base, 2 * baud);
	if ((divisor3 & 0x7) == 7)
		divisor3++; /* round x.7/8 up to x+1 */
	divisor = divisor3 >> 3;
@@ -1156,7 +1156,7 @@ static u32 ftdi_232bm_baud_base_to_divisor(int baud, int base)
	static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
	u32 divisor;
	/* divisor shifted 3 bits to the left */
	int divisor3 = base / 2 / baud;
	int divisor3 = DIV_ROUND_CLOSEST(base, 2 * baud);
	divisor = divisor3 >> 3;
	divisor |= (u32)divfrac[divisor3 & 0x7] << 14;
	/* Deal with special cases for highest baud rates. */
@@ -1179,7 +1179,7 @@ static u32 ftdi_2232h_baud_base_to_divisor(int baud, int base)
	int divisor3;

	/* hi-speed baud rate is 10-bit sampling instead of 16-bit */
	divisor3 = base * 8 / (baud * 10);
	divisor3 = DIV_ROUND_CLOSEST(8 * base, 10 * baud);

	divisor = divisor3 >> 3;
	divisor |= (u32)divfrac[divisor3 & 0x7] << 14;
+25 −46
Original line number Diff line number Diff line
@@ -94,6 +94,7 @@
/* The native mos7840/7820 component */
#define USB_VENDOR_ID_MOSCHIP           0x9710
#define MOSCHIP_DEVICE_ID_7840          0x7840
#define MOSCHIP_DEVICE_ID_7843          0x7843
#define MOSCHIP_DEVICE_ID_7820          0x7820
#define MOSCHIP_DEVICE_ID_7810          0x7810
/* The native component can have its vendor/device id's overridden
@@ -176,6 +177,7 @@ enum mos7840_flag {

static const struct usb_device_id id_table[] = {
	{USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7840)},
	{USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7843)},
	{USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)},
	{USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7810)},
	{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_2)},
@@ -298,15 +300,10 @@ static int mos7840_set_uart_reg(struct usb_serial_port *port, __u16 reg,
	val = val & 0x00ff;
	/* For the UART control registers, the application number need
	   to be Or'ed */
	if (port->serial->num_ports == 4) {
		val |= ((__u16)port->port_number + 1) << 8;
	} else {
		if (port->port_number == 0) {
			val |= ((__u16)port->port_number + 1) << 8;
		} else {
	if (port->serial->num_ports == 2 && port->port_number != 0)
		val |= ((__u16)port->port_number + 2) << 8;
		}
	}
	else
		val |= ((__u16)port->port_number + 1) << 8;
	dev_dbg(&port->dev, "%s application number is %x\n", __func__, val);
	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), MCS_WRREQ,
			       MCS_WR_RTYPE, val, reg, NULL, 0,
@@ -332,15 +329,10 @@ static int mos7840_get_uart_reg(struct usb_serial_port *port, __u16 reg,
		return -ENOMEM;

	/* Wval  is same as application number */
	if (port->serial->num_ports == 4) {
		Wval = ((__u16)port->port_number + 1) << 8;
	} else {
		if (port->port_number == 0) {
			Wval = ((__u16)port->port_number + 1) << 8;
		} else {
	if (port->serial->num_ports == 2 && port->port_number != 0)
		Wval = ((__u16)port->port_number + 2) << 8;
		}
	}
	else
		Wval = ((__u16)port->port_number + 1) << 8;
	dev_dbg(&port->dev, "%s application number is %x\n", __func__, Wval);
	ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ,
			      MCS_RD_RTYPE, Wval, reg, buf, VENDOR_READ_LENGTH,
@@ -601,7 +593,7 @@ static void mos7840_interrupt_callback(struct urb *urb)
	struct usb_serial *serial;
	__u16 Data;
	unsigned char *data;
	__u8 sp[5], st;
	__u8 sp[5];
	int i, rv = 0;
	__u16 wval, wreg = 0;
	int status = urb->status;
@@ -644,7 +636,6 @@ static void mos7840_interrupt_callback(struct urb *urb)
	sp[1] = (__u8) data[1];
	sp[2] = (__u8) data[2];
	sp[3] = (__u8) data[3];
	st = (__u8) data[4];

	for (i = 0; i < serial->num_ports; i++) {
		mos7840_port = mos7840_get_port_private(serial->port[i]);
@@ -1300,7 +1291,6 @@ static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port,
	struct urb *urb;
	/* __u16 Data; */
	const unsigned char *current_position = data;
	unsigned char *data1;

	if (mos7840_port_paranoia_check(port, __func__))
		return -1;
@@ -1361,7 +1351,6 @@ static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port,
			mos7840_bulk_out_data_callback, mos7840_port);
	}

	data1 = urb->transfer_buffer;
	dev_dbg(&port->dev, "bulkout endpoint is %d\n", port->bulk_out_endpointAddress);

	if (mos7840_port->has_led)
@@ -1592,7 +1581,6 @@ static int mos7840_send_cmd_write_baud_rate(struct moschip_port *mos7840_port,
	int divisor = 0;
	int status;
	__u16 Data;
	unsigned char number;
	__u16 clk_sel_val;
	struct usb_serial_port *port;

@@ -1606,8 +1594,6 @@ static int mos7840_send_cmd_write_baud_rate(struct moschip_port *mos7840_port,
	if (mos7840_serial_paranoia_check(port->serial, __func__))
		return -1;

	number = mos7840_port->port->port_number;

	dev_dbg(&port->dev, "%s - baud = %d\n", __func__, baudRate);
	/* reset clk_uart_sel in spregOffset */
	if (baudRate > 115200) {
@@ -1697,14 +1683,12 @@ static void mos7840_change_port_settings(struct tty_struct *tty,
{
	int baud;
	unsigned cflag;
	unsigned iflag;
	__u8 lData;
	__u8 lParity;
	__u8 lStop;
	int status;
	__u16 Data;
	struct usb_serial_port *port;
	struct usb_serial *serial;

	if (mos7840_port == NULL)
		return;
@@ -1717,8 +1701,6 @@ static void mos7840_change_port_settings(struct tty_struct *tty,
	if (mos7840_serial_paranoia_check(port->serial, __func__))
		return;

	serial = port->serial;

	if (!mos7840_port->open) {
		dev_dbg(&port->dev, "%s - port not opened\n", __func__);
		return;
@@ -1729,7 +1711,6 @@ static void mos7840_change_port_settings(struct tty_struct *tty,
	lParity = LCR_PAR_NONE;

	cflag = tty->termios.c_cflag;
	iflag = tty->termios.c_iflag;

	/* Change the number of bits */
	switch (cflag & CSIZE) {
@@ -2043,7 +2024,8 @@ static int mos7840_probe(struct usb_serial *serial,
	int device_type;

	if (product == MOSCHIP_DEVICE_ID_7810 ||
		product == MOSCHIP_DEVICE_ID_7820) {
		product == MOSCHIP_DEVICE_ID_7820 ||
		product == MOSCHIP_DEVICE_ID_7843) {
		device_type = product;
		goto out;
	}
@@ -2077,6 +2059,9 @@ static int mos7840_calc_num_ports(struct usb_serial *serial,
	int device_type = (unsigned long)usb_get_serial_data(serial);
	int num_ports;

	if (device_type == MOSCHIP_DEVICE_ID_7843)
		num_ports = 3;
	else
		num_ports = (device_type >> 4) & 0x000F;

	/*
@@ -2132,22 +2117,16 @@ static int mos7840_port_probe(struct usb_serial_port *port)
		mos7840_port->SpRegOffset = 0x0;
		mos7840_port->ControlRegOffset = 0x1;
		mos7840_port->DcrRegOffset = 0x4;
	} else if ((mos7840_port->port_num == 2) && (serial->num_ports == 4)) {
		mos7840_port->SpRegOffset = 0x8;
		mos7840_port->ControlRegOffset = 0x9;
		mos7840_port->DcrRegOffset = 0x16;
	} else if ((mos7840_port->port_num == 2) && (serial->num_ports == 2)) {
		mos7840_port->SpRegOffset = 0xa;
		mos7840_port->ControlRegOffset = 0xb;
		mos7840_port->DcrRegOffset = 0x19;
	} else if ((mos7840_port->port_num == 3) && (serial->num_ports == 4)) {
		mos7840_port->SpRegOffset = 0xa;
		mos7840_port->ControlRegOffset = 0xb;
		mos7840_port->DcrRegOffset = 0x19;
	} else if ((mos7840_port->port_num == 4) && (serial->num_ports == 4)) {
		mos7840_port->SpRegOffset = 0xc;
		mos7840_port->ControlRegOffset = 0xd;
		mos7840_port->DcrRegOffset = 0x1c;
	} else {
		u8 phy_num = mos7840_port->port_num;

		/* Port 2 in the 2-port case uses registers of port 3 */
		if (serial->num_ports == 2)
			phy_num = 3;

		mos7840_port->SpRegOffset = 0x8 + 2 * (phy_num - 2);
		mos7840_port->ControlRegOffset = 0x9 + 2 * (phy_num - 2);
		mos7840_port->DcrRegOffset = 0x16 + 3 * (phy_num - 2);
	}
	mos7840_dump_serial_port(port, mos7840_port);
	mos7840_set_port_private(port, mos7840_port);
+5 −0
Original line number Diff line number Diff line
@@ -91,9 +91,14 @@ static const struct usb_device_id id_table[] = {
	{ USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
	{ USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
	{ USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
	{ USB_DEVICE(HP_VENDOR_ID, HP_LD220TA_PRODUCT_ID) },
	{ USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) },
	{ USB_DEVICE(HP_VENDOR_ID, HP_LD960TA_PRODUCT_ID) },
	{ USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) },
	{ USB_DEVICE(HP_VENDOR_ID, HP_LCM960_PRODUCT_ID) },
	{ USB_DEVICE(HP_VENDOR_ID, HP_LM920_PRODUCT_ID) },
	{ USB_DEVICE(HP_VENDOR_ID, HP_LM940_PRODUCT_ID) },
	{ USB_DEVICE(HP_VENDOR_ID, HP_TD620_PRODUCT_ID) },
	{ USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
	{ USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
	{ USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
+5 −0
Original line number Diff line number Diff line
@@ -119,10 +119,15 @@

/* Hewlett-Packard POS Pole Displays */
#define HP_VENDOR_ID		0x03f0
#define HP_LM920_PRODUCT_ID	0x026b
#define HP_TD620_PRODUCT_ID	0x0956
#define HP_LD960_PRODUCT_ID	0x0b39
#define HP_LCM220_PRODUCT_ID	0x3139
#define HP_LCM960_PRODUCT_ID	0x3239
#define HP_LD220_PRODUCT_ID	0x3524
#define HP_LD220TA_PRODUCT_ID	0x4349
#define HP_LD960TA_PRODUCT_ID	0x4439
#define HP_LM940_PRODUCT_ID	0x5039

/* Cressi Edy (diving computer) PC interface */
#define CRESSI_VENDOR_ID	0x04b8
Loading