[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <DM8PR02MB819876BA541F3C62D971EF09E3039@DM8PR02MB8198.namprd02.prod.outlook.com>
Date: Wed, 2 Mar 2022 05:14:30 +0000
From: "Linyu Yuan (QUIC)" <quic_linyyuan@...cinc.com>
To: "mka@...omium.org" <mka@...omium.org>,
"Linyu Yuan (QUIC)" <quic_linyyuan@...cinc.com>
CC: "gregkh@...uxfoundation.org" <gregkh@...uxfoundation.org>,
"Tao Wang (Consultant) (QUIC)" <quic_wat@...cinc.com>,
"balbi@...nel.org" <balbi@...nel.org>,
"devicetree@...r.kernel.org" <devicetree@...r.kernel.org>,
"dianders@...omium.org" <dianders@...omium.org>,
"frowand.list@...il.com" <frowand.list@...il.com>,
"hadess@...ess.net" <hadess@...ess.net>,
"krzk@...nel.org" <krzk@...nel.org>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
"linux-usb@...r.kernel.org" <linux-usb@...r.kernel.org>,
"mathias.nyman@...el.com" <mathias.nyman@...el.com>,
"michal.simek@...inx.com" <michal.simek@...inx.com>,
"peter.chen@...nel.org" <peter.chen@...nel.org>,
"ravisadineni@...omium.org" <ravisadineni@...omium.org>,
"robh+dt@...nel.org" <robh+dt@...nel.org>,
"rogerq@...nel.org" <rogerq@...nel.org>,
"stern@...land.harvard.edu" <stern@...land.harvard.edu>,
"swboyd@...omium.org" <swboyd@...omium.org>
Subject: RE: 回复: 回复: Re: [PATCH v20 3/5] usb: misc: Add onboard_usb_hub driver
> From: mka@...omium.org <mka@...omium.org>
> Sent: Wednesday, March 2, 2022 12:33 AM
> To: Linyu Yuan (QUIC) <quic_linyyuan@...cinc.com>
> Cc: gregkh@...uxfoundation.org; Tao Wang (Consultant) (QUIC)
> <quic_wat@...cinc.com>; balbi@...nel.org; devicetree@...r.kernel.org;
> dianders@...omium.org; frowand.list@...il.com; hadess@...ess.net;
> krzk@...nel.org; linux-kernel@...r.kernel.org; linux-usb@...r.kernel.org;
> mathias.nyman@...el.com; michal.simek@...inx.com;
> peter.chen@...nel.org; ravisadineni@...omium.org; robh+dt@...nel.org;
> rogerq@...nel.org; stern@...land.harvard.edu; swboyd@...omium.org
> Subject: Re: 回复: 回复: Re: [PATCH v20 3/5] usb: misc: Add
> onboard_usb_hub driver
>
> > In my opinion, if it need update VID/PID table in this driver to support a
> new HUB,
> > we can parse VID/PID from device tree and create dynamic VID/PID entry
> to id_table of onboard_hub_usbdev_driver.
> >
> > Hope you can understand what I said.
>
> Not really.
>
> I doubt that what you are suggesting would work. The easiest thing
> to convince people would probably be to send a patch (based on this
> one) with a working implementation of your idea.
I show my idea, but not test,
diff --git a/drivers/usb/misc/onboard_usb_hub.c b/drivers/usb/misc/onboard_usb_hub.c
index e280409..1811317 100644
--- a/drivers/usb/misc/onboard_usb_hub.c
+++ b/drivers/usb/misc/onboard_usb_hub.c
@@ -10,6 +10,7 @@
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/list.h>
+#include <linux/slab.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/of.h>
@@ -173,6 +174,58 @@ static void onboard_hub_remove_usbdev(struct onboard_hub *hub, const struct usb_
mutex_unlock(&hub->lock);
}
+#define MAX_HUB_NUM 4
+#define MAX_TABLE_SIZE (MAX_HUB_NUM * 2)
+static struct usb_device_id onboard_hub_id_table[MAX_TABLE_SIZE + 1];
+MODULE_DEVICE_TABLE(usb, onboard_hub_id_table);
+
+static void onboard_hub_add_idtable(__u16 vid, __u16 pid)
+{
+ int i;
+
+ for (i = 0; i < MAX_TABLE_SIZE; i++) {
+ if (!onboard_hub_id_table[i].idVendor)
+ break;
+
+ if (onboard_hub_id_table[i].idVendor == vid &&
+ onboard_hub_id_table[i].idProduct == pid)
+ return;
+ }
+ if (i == MAX_TABLE_SIZE)
+ return;
+
+ onboard_hub_id_table[i].idVendor = vid;
+ onboard_hub_id_table[i].idProduct = pid;
+ onboard_hub_id_table[i].match_flags = USB_DEVICE_ID_MATCH_DEVICE;
+}
+
+static int onboard_hub_parse_idtable(struct device_node *np)
+{
+ int size = of_property_count_elems_of_size(np, "vidpid", sizeof(int));
+ int ret, i;
+ u16 *ids;
+
+ if (!size || size % 2)
+ return -EINVAL;
+
+ ids = kzalloc(sizeof(u16) * size, GFP_KERNEL);
+ if (!ids)
+ return -ENOMEM;
+
+ ret = of_property_read_u16_array(np, "vidpid", ids, size);
+ if (ret) {
+ kfree(ids);
+ return -EINVAL;
+ }
+
+ for (i = 0; i < size; i+=2)
+ onboard_hub_add_idtable(ids[i], ids[i+1]);
+
+ kfree(ids);
+
+ return 0;
+}
+
static ssize_t always_powered_in_suspend_show(struct device *dev, struct device_attribute *attr,
char *buf)
{
@@ -210,6 +263,10 @@ static int onboard_hub_probe(struct platform_device *pdev)
struct onboard_hub *hub;
int err;
+ err = onboard_hub_parse_idtable(dev->of_node);
+ if (err)
+ return err;
+
hub = devm_kzalloc(dev, sizeof(*hub), GFP_KERNEL);
if (!hub)
return -ENOMEM;
@@ -378,15 +435,6 @@ static void onboard_hub_usbdev_disconnect(struct usb_device *udev)
onboard_hub_remove_usbdev(hub, udev);
}
-static const struct usb_device_id onboard_hub_id_table[] = {
- { USB_DEVICE(VENDOR_ID_REALTEK, 0x0411) }, /* RTS5411 USB 3.1 */
- { USB_DEVICE(VENDOR_ID_REALTEK, 0x5411) }, /* RTS5411 USB 2.1 */
- { USB_DEVICE(VENDOR_ID_REALTEK, 0x0414) }, /* RTS5414 USB 3.2 */
- { USB_DEVICE(VENDOR_ID_REALTEK, 0x5414) }, /* RTS5414 USB 2.1 */
- {}
-};
-MODULE_DEVICE_TABLE(usb, onboard_hub_id_table);
-
static struct usb_device_driver onboard_hub_usbdev_driver = {
.name = "onboard-usb-hub",
.probe = onboard_hub_usbdev_probe,
Powered by blists - more mailing lists