* [PATCH 1/2 v4] USB: serial: mos7840: Adjust port settings for read and write registers
@ 2018-11-30 6:31 Jackychou
2018-11-30 6:31 ` [PATCH 2/2 v4] USB: serial: mos7840: Add a product ID for the new product Jackychou
2018-12-05 6:03 ` [PATCH 1/2 v4] USB: serial: mos7840: Adjust port settings for read and write registers Johan Hovold
0 siblings, 2 replies; 3+ messages in thread
From: Jackychou @ 2018-11-30 6:31 UTC (permalink / raw)
To: johan; +Cc: gregkh, linux-usb, linux-kernel, louis, jackychou
From: JackyChou <jackychou@asix.com.tw>
In the read/write function, set port 2 independently in the 2-port case.
When setting the offset of port registers, the offset between port 1 and
other ports is different, so port 1 is set independently.
Then in the rest of ports, the port 2 between 2-ports case and 4-ports case
is different, so port 2 in 2-ports case is set independently.
Signed-off-by: JackyChou <jackychou@asix.com.tw>
---
drivers/usb/serial/mos7840.c | 48 ++++++++++++------------------------
1 file changed, 16 insertions(+), 32 deletions(-)
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
index 88828b4b8c44..92ab68ef08ab 100644
--- a/drivers/usb/serial/mos7840.c
+++ b/drivers/usb/serial/mos7840.c
@@ -298,15 +298,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) {
+ 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;
- } else {
- if (port->port_number == 0) {
- val |= ((__u16)port->port_number + 1) << 8;
- } else {
- val |= ((__u16)port->port_number + 2) << 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 +327,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) {
+ 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;
- } else {
- if (port->port_number == 0) {
- Wval = ((__u16)port->port_number + 1) << 8;
- } else {
- Wval = ((__u16)port->port_number + 2) << 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,
@@ -2132,22 +2122,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 port_offset;
+
+ if ((mos7840_port->port_num == 2) && (serial->num_ports == 2))
+ port_offset = 1;
+ else
+ port_offset = mos7840_port->port_num - 2;
+ mos7840_port->SpRegOffset = 0x8 + (2 * port_offset);
+ mos7840_port->ControlRegOffset = 0x9 + (2 * port_offset);
+ mos7840_port->DcrRegOffset = 0x16 + (3 * port_offset);
}
mos7840_dump_serial_port(port, mos7840_port);
mos7840_set_port_private(port, mos7840_port);
--
2.17.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2 v4] USB: serial: mos7840: Add a product ID for the new product
2018-11-30 6:31 [PATCH 1/2 v4] USB: serial: mos7840: Adjust port settings for read and write registers Jackychou
@ 2018-11-30 6:31 ` Jackychou
2018-12-05 6:03 ` [PATCH 1/2 v4] USB: serial: mos7840: Adjust port settings for read and write registers Johan Hovold
1 sibling, 0 replies; 3+ messages in thread
From: Jackychou @ 2018-11-30 6:31 UTC (permalink / raw)
To: johan; +Cc: gregkh, linux-usb, linux-kernel, louis, jackychou
From: JackyChou <jackychou@asix.com.tw>
Add a new PID 0x7843 to the driver.
Let the new products be able to set up 3 serial ports with the driver.
Signed-off-by: JackyChou <jackychou@asix.com.tw>
---
drivers/usb/serial/mos7840.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
index 92ab68ef08ab..b6e7b55fcb7c 100644
--- a/drivers/usb/serial/mos7840.c
+++ b/drivers/usb/serial/mos7840.c
@@ -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)},
@@ -2033,7 +2035,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;
}
@@ -2067,7 +2070,10 @@ static int mos7840_calc_num_ports(struct usb_serial *serial,
int device_type = (unsigned long)usb_get_serial_data(serial);
int num_ports;
- num_ports = (device_type >> 4) & 0x000F;
+ if (device_type == MOSCHIP_DEVICE_ID_7843)
+ num_ports = 3;
+ else
+ num_ports = (device_type >> 4) & 0x000F;
/*
* num_ports is currently never zero as device_type is one of
--
2.17.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH 1/2 v4] USB: serial: mos7840: Adjust port settings for read and write registers
2018-11-30 6:31 [PATCH 1/2 v4] USB: serial: mos7840: Adjust port settings for read and write registers Jackychou
2018-11-30 6:31 ` [PATCH 2/2 v4] USB: serial: mos7840: Add a product ID for the new product Jackychou
@ 2018-12-05 6:03 ` Johan Hovold
1 sibling, 0 replies; 3+ messages in thread
From: Johan Hovold @ 2018-12-05 6:03 UTC (permalink / raw)
To: Jackychou; +Cc: johan, gregkh, linux-usb, linux-kernel, louis
On Fri, Nov 30, 2018 at 02:31:21PM +0800, Jackychou wrote:
> From: JackyChou <jackychou@asix.com.tw>
>
> In the read/write function, set port 2 independently in the 2-port case.
>
> When setting the offset of port registers, the offset between port 1 and
> other ports is different, so port 1 is set independently.
> Then in the rest of ports, the port 2 between 2-ports case and 4-ports case
> is different, so port 2 in 2-ports case is set independently.
>
> Signed-off-by: JackyChou <jackychou@asix.com.tw>
> ---
Thanks for the update.
> + } else {
> + u8 port_offset;
> +
> + if ((mos7840_port->port_num == 2) && (serial->num_ports == 2))
> + port_offset = 1;
> + else
> + port_offset = mos7840_port->port_num - 2;
> + mos7840_port->SpRegOffset = 0x8 + (2 * port_offset);
> + mos7840_port->ControlRegOffset = 0x9 + (2 * port_offset);
> + mos7840_port->DcrRegOffset = 0x16 + (3 * port_offset);
I simplified this further as:
} 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);
before applying.
Johan
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2018-12-05 6:04 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-30 6:31 [PATCH 1/2 v4] USB: serial: mos7840: Adjust port settings for read and write registers Jackychou
2018-11-30 6:31 ` [PATCH 2/2 v4] USB: serial: mos7840: Add a product ID for the new product Jackychou
2018-12-05 6:03 ` [PATCH 1/2 v4] USB: serial: mos7840: Adjust port settings for read and write registers Johan Hovold
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).