2021-01-15 09:52:26

by Heikki Krogerus

[permalink] [raw]
Subject: [PATCH v3 0/4] Remove one more platform_device_add_properties() call

Hi,

I'm now clearing the dev_fwnode(dev)->secondary pointer in
device_remove_software_node() as requested by Daniel and Andy. Thanks
guys, it's much better now. I also took the liberty of including one
more PCI ID patch where I add PCI ID for the Alder Lake-P variant. I
hope that is OK.

Andy, I dropped your Tested-by tag because of the change I made to the
first patch. If you have time to retest these, I would much appreciate.


v2 cover letter:

Hi Felipe, Rafael,

This is the second version of this series. There are no real changes,
but I added the Tiger Lake ID patch to this series in hope that it
will make your life a bit easier, assuming that Rafael will still pick
these.


The original over letter:

I originally introduced these as part of my series where I was
proposing PM ops for software nodes [1], but since that still needs
work, I'm sending these two separately.

So basically I'm only modifying dwc3-pci.c so it registers a software
node directly at this point. That will remove one more user of
platform_device_add_properties().

[1] https://lore.kernel.org/lkml/[email protected]/

thanks,

Heikki Krogerus (4):
software node: Introduce device_add_software_node()
usb: dwc3: pci: Register a software node for the dwc3 platform device
usb: dwc3: pci: ID for Tiger Lake CPU
usb: dwc3: pci: add support for the Intel Alder Lake-P

drivers/base/swnode.c | 71 ++++++++++++++++++++++++++++++++-----
drivers/usb/dwc3/dwc3-pci.c | 69 ++++++++++++++++++++++-------------
include/linux/property.h | 3 ++
3 files changed, 110 insertions(+), 33 deletions(-)

--
2.29.2


2021-01-15 09:53:07

by Heikki Krogerus

[permalink] [raw]
Subject: [PATCH v3 1/4] software node: Introduce device_add_software_node()

This helper will register a software node and then assign
it to device at the same time. The function will also make
sure that the device can't have more than one software node.

Signed-off-by: Heikki Krogerus <[email protected]>
Acked-by: Felipe Balbi <[email protected]>
---
drivers/base/swnode.c | 71 +++++++++++++++++++++++++++++++++++-----
include/linux/property.h | 3 ++
2 files changed, 65 insertions(+), 9 deletions(-)

diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
index 4a4b2008fbc26..4842dd6782000 100644
--- a/drivers/base/swnode.c
+++ b/drivers/base/swnode.c
@@ -48,6 +48,19 @@ EXPORT_SYMBOL_GPL(is_software_node);
struct swnode, fwnode) : NULL; \
})

+static inline struct swnode *dev_to_swnode(struct device *dev)
+{
+ struct fwnode_handle *fwnode = dev_fwnode(dev);
+
+ if (!fwnode)
+ return NULL;
+
+ if (!is_software_node(fwnode))
+ fwnode = fwnode->secondary;
+
+ return to_swnode(fwnode);
+}
+
static struct swnode *
software_node_to_swnode(const struct software_node *node)
{
@@ -843,22 +856,62 @@ void fwnode_remove_software_node(struct fwnode_handle *fwnode)
}
EXPORT_SYMBOL_GPL(fwnode_remove_software_node);

+/**
+ * device_add_software_node - Assign software node to a device
+ * @dev: The device the software node is meant for.
+ * @swnode: The software node.
+ *
+ * This function will register @swnode and make it the secondary firmware node
+ * pointer of @dev. If @dev has no primary node, then @swnode will become the primary
+ * node.
+ */
+int device_add_software_node(struct device *dev, const struct software_node *swnode)
+{
+ int ret;
+
+ /* Only one software node per device. */
+ if (dev_to_swnode(dev))
+ return -EBUSY;
+
+ ret = software_node_register(swnode);
+ if (ret)
+ return ret;
+
+ set_secondary_fwnode(dev, software_node_fwnode(swnode));
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(device_add_software_node);
+
+/**
+ * device_remove_software_node - Remove device's software node
+ * @dev: The device with the software node.
+ *
+ * This function will unregister the software node of @dev.
+ */
+void device_remove_software_node(struct device *dev)
+{
+ struct swnode *swnode;
+
+ swnode = dev_to_swnode(dev);
+ if (!swnode)
+ return;
+
+ software_node_notify(dev, KOBJ_REMOVE);
+ set_secondary_fwnode(dev, NULL);
+ kobject_put(&swnode->kobj);
+}
+EXPORT_SYMBOL_GPL(device_remove_software_node);
+
int software_node_notify(struct device *dev, unsigned long action)
{
- struct fwnode_handle *fwnode = dev_fwnode(dev);
struct swnode *swnode;
int ret;

- if (!fwnode)
- return 0;
-
- if (!is_software_node(fwnode))
- fwnode = fwnode->secondary;
- if (!is_software_node(fwnode))
+ swnode = dev_to_swnode(dev);
+ if (!swnode)
return 0;

- swnode = to_swnode(fwnode);
-
switch (action) {
case KOBJ_ADD:
ret = sysfs_create_link(&dev->kobj, &swnode->kobj,
diff --git a/include/linux/property.h b/include/linux/property.h
index 0a9001fe7aeab..b0e413dc59271 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -488,4 +488,7 @@ fwnode_create_software_node(const struct property_entry *properties,
const struct fwnode_handle *parent);
void fwnode_remove_software_node(struct fwnode_handle *fwnode);

+int device_add_software_node(struct device *dev, const struct software_node *swnode);
+void device_remove_software_node(struct device *dev);
+
#endif /* _LINUX_PROPERTY_H_ */
--
2.29.2

2021-01-15 09:53:36

by Heikki Krogerus

[permalink] [raw]
Subject: [PATCH v3 2/4] usb: dwc3: pci: Register a software node for the dwc3 platform device

By registering the software node directly instead of just
the properties in it, the driver can take advantage of also
the other features the software nodes have.

Signed-off-by: Heikki Krogerus <[email protected]>
Acked-by: Felipe Balbi <[email protected]>
---
drivers/usb/dwc3/dwc3-pci.c | 61 ++++++++++++++++++++++---------------
1 file changed, 37 insertions(+), 24 deletions(-)

diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c
index bae6a70664c80..037bc21bffa66 100644
--- a/drivers/usb/dwc3/dwc3-pci.c
+++ b/drivers/usb/dwc3/dwc3-pci.c
@@ -142,6 +142,18 @@ static const struct property_entry dwc3_pci_amd_properties[] = {
{}
};

+static const struct software_node dwc3_pci_intel_swnode = {
+ .properties = dwc3_pci_intel_properties,
+};
+
+static const struct software_node dwc3_pci_intel_mrfld_swnode = {
+ .properties = dwc3_pci_mrfld_properties,
+};
+
+static const struct software_node dwc3_pci_amd_swnode = {
+ .properties = dwc3_pci_amd_properties,
+};
+
static int dwc3_pci_quirks(struct dwc3_pci *dwc)
{
struct pci_dev *pdev = dwc->pci;
@@ -222,7 +234,6 @@ static void dwc3_pci_resume_work(struct work_struct *work)

static int dwc3_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
{
- struct property_entry *p = (struct property_entry *)id->driver_data;
struct dwc3_pci *dwc;
struct resource res[2];
int ret;
@@ -265,7 +276,7 @@ static int dwc3_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
dwc->dwc3->dev.parent = dev;
ACPI_COMPANION_SET(&dwc->dwc3->dev, ACPI_COMPANION(dev));

- ret = platform_device_add_properties(dwc->dwc3, p);
+ ret = device_add_software_node(&dwc->dwc3->dev, (void *)id->driver_data);
if (ret < 0)
goto err;

@@ -288,6 +299,7 @@ static int dwc3_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)

return 0;
err:
+ device_remove_software_node(&dwc->dwc3->dev);
platform_device_put(dwc->dwc3);
return ret;
}
@@ -304,75 +316,76 @@ static void dwc3_pci_remove(struct pci_dev *pci)
#endif
device_init_wakeup(&pci->dev, false);
pm_runtime_get(&pci->dev);
+ device_remove_software_node(&dwc->dwc3->dev);
platform_device_unregister(dwc->dwc3);
}

static const struct pci_device_id dwc3_pci_id_table[] = {
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BSW),
- (kernel_ulong_t) &dwc3_pci_intel_properties },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BYT),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MRFLD),
- (kernel_ulong_t) &dwc3_pci_mrfld_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_mrfld_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CMLLP),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CMLH),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_SPTLP),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_SPTH),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BXT),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BXT_M),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_APL),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_KBP),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_GLK),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CNPLP),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CNPH),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CNPV),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ICLLP),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_EHLLP),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGPLP),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGPH),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_JSP),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ADLS),
- (kernel_ulong_t) &dwc3_pci_intel_properties, },
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },

{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_NL_USB),
- (kernel_ulong_t) &dwc3_pci_amd_properties, },
+ (kernel_ulong_t) &dwc3_pci_amd_swnode, },
{ } /* Terminating Entry */
};
MODULE_DEVICE_TABLE(pci, dwc3_pci_id_table);
--
2.29.2

2021-01-15 09:54:13

by Heikki Krogerus

[permalink] [raw]
Subject: [PATCH v3 3/4] usb: dwc3: pci: ID for Tiger Lake CPU

Tiger Lake SOC (the versions of it that have integrated USB4
controller) may have two DWC3 controllers. One is part of
the PCH (Platform Controller Hub, i.e. the chipset) as
usual, and the other is inside the actual CPU block.

On all Intel platforms that have the two separate DWC3
controllers, the one inside the CPU handles USB3 and only
USB3 traffic, while the PCH version handles USB2 and USB2
alone. The reason for splitting the two busses like this is
to allow easy USB3 tunneling over USB4 connections. As USB2
is not tunneled over USB4, it has dedicated USB controllers
(both xHCI and DWC3).

Signed-off-by: Heikki Krogerus <[email protected]>
Acked-by: Felipe Balbi <[email protected]>
---
drivers/usb/dwc3/dwc3-pci.c | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c
index 037bc21bffa66..51029cec119ed 100644
--- a/drivers/usb/dwc3/dwc3-pci.c
+++ b/drivers/usb/dwc3/dwc3-pci.c
@@ -41,6 +41,7 @@
#define PCI_DEVICE_ID_INTEL_TGPH 0x43ee
#define PCI_DEVICE_ID_INTEL_JSP 0x4dee
#define PCI_DEVICE_ID_INTEL_ADLS 0x7ae1
+#define PCI_DEVICE_ID_INTEL_TGL 0x9a15

#define PCI_INTEL_BXT_DSM_GUID "732b85d5-b7a7-4a1b-9ba0-4bbd00ffd511"
#define PCI_INTEL_BXT_FUNC_PMU_PWR 4
@@ -384,6 +385,9 @@ static const struct pci_device_id dwc3_pci_id_table[] = {
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ADLS),
(kernel_ulong_t) &dwc3_pci_intel_swnode, },

+ { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGL),
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },
+
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_NL_USB),
(kernel_ulong_t) &dwc3_pci_amd_swnode, },
{ } /* Terminating Entry */
--
2.29.2

2021-01-15 09:56:07

by Heikki Krogerus

[permalink] [raw]
Subject: [PATCH v3 4/4] usb: dwc3: pci: add support for the Intel Alder Lake-P

This patch adds the necessary PCI ID for Intel Alder Lake-P
devices.

Signed-off-by: Heikki Krogerus <[email protected]>
---
drivers/usb/dwc3/dwc3-pci.c | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c
index 51029cec119ed..3d3918a8d5fbc 100644
--- a/drivers/usb/dwc3/dwc3-pci.c
+++ b/drivers/usb/dwc3/dwc3-pci.c
@@ -40,6 +40,7 @@
#define PCI_DEVICE_ID_INTEL_TGPLP 0xa0ee
#define PCI_DEVICE_ID_INTEL_TGPH 0x43ee
#define PCI_DEVICE_ID_INTEL_JSP 0x4dee
+#define PCI_DEVICE_ID_INTEL_ADLP 0x51ee
#define PCI_DEVICE_ID_INTEL_ADLS 0x7ae1
#define PCI_DEVICE_ID_INTEL_TGL 0x9a15

@@ -382,6 +383,9 @@ static const struct pci_device_id dwc3_pci_id_table[] = {
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_JSP),
(kernel_ulong_t) &dwc3_pci_intel_swnode, },

+ { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ADLP),
+ (kernel_ulong_t) &dwc3_pci_intel_swnode, },
+
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ADLS),
(kernel_ulong_t) &dwc3_pci_intel_swnode, },

--
2.29.2

2021-01-15 11:16:49

by Felipe Balbi

[permalink] [raw]
Subject: Re: [PATCH v3 4/4] usb: dwc3: pci: add support for the Intel Alder Lake-P

Heikki Krogerus <[email protected]> writes:

> This patch adds the necessary PCI ID for Intel Alder Lake-P
> devices.
>
> Signed-off-by: Heikki Krogerus <[email protected]>

The only missing my ack:

Acked-by: Felipe Balbi <[email protected]>

--
balbi


Attachments:
signature.asc (873.00 B)

2021-01-16 20:26:49

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v3 0/4] Remove one more platform_device_add_properties() call

On Fri, Jan 15, 2021 at 11:52 AM Heikki Krogerus
<[email protected]> wrote:
>
> Hi,
>
> I'm now clearing the dev_fwnode(dev)->secondary pointer in
> device_remove_software_node() as requested by Daniel and Andy. Thanks
> guys, it's much better now. I also took the liberty of including one
> more PCI ID patch where I add PCI ID for the Alder Lake-P variant. I
> hope that is OK.
>
> Andy, I dropped your Tested-by tag because of the change I made to the
> first patch. If you have time to retest these, I would much appreciate.

Since Greg already grabbed a v3 I will test it when it appears in linux-next.

--
With Best Regards,
Andy Shevchenko

2021-01-16 21:32:01

by Daniel Scally

[permalink] [raw]
Subject: Re: [PATCH v3 0/4] Remove one more platform_device_add_properties() call

On 16/01/2021 20:23, Andy Shevchenko wrote:
> On Fri, Jan 15, 2021 at 11:52 AM Heikki Krogerus
> <[email protected]> wrote:
>> Hi,
>>
>> I'm now clearing the dev_fwnode(dev)->secondary pointer in
>> device_remove_software_node() as requested by Daniel and Andy. Thanks
>> guys, it's much better now. I also took the liberty of including one
>> more PCI ID patch where I add PCI ID for the Alder Lake-P variant. I
>> hope that is OK.
>>
>> Andy, I dropped your Tested-by tag because of the change I made to the
>> first patch. If you have time to retest these, I would much appreciate.
> Since Greg already grabbed a v3 I will test it when it appears in linux-next.
>
It seems the grabbed one is the v2 one though actually

2021-01-17 21:14:39

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v3 0/4] Remove one more platform_device_add_properties() call

On Sat, Jan 16, 2021 at 11:29 PM Daniel Scally <[email protected]> wrote:
> On 16/01/2021 20:23, Andy Shevchenko wrote:
> > On Fri, Jan 15, 2021 at 11:52 AM Heikki Krogerus
> > <[email protected]> wrote:
> >> Hi,
> >>
> >> I'm now clearing the dev_fwnode(dev)->secondary pointer in
> >> device_remove_software_node() as requested by Daniel and Andy. Thanks
> >> guys, it's much better now. I also took the liberty of including one
> >> more PCI ID patch where I add PCI ID for the Alder Lake-P variant. I
> >> hope that is OK.
> >>
> >> Andy, I dropped your Tested-by tag because of the change I made to the
> >> first patch. If you have time to retest these, I would much appreciate.
> > Since Greg already grabbed a v3 I will test it when it appears in linux-next.
> >
> It seems the grabbed one is the v2 one though actually

In his last message he wrote that he noticed the v3 *as I understand that*.
Greg, is it right? I mean you took v3 eventually?

--
With Best Regards,
Andy Shevchenko

2021-01-17 21:17:29

by Daniel Scally

[permalink] [raw]
Subject: Re: [PATCH v3 0/4] Remove one more platform_device_add_properties() call


On 17/01/2021 21:05, Andy Shevchenko wrote:
> On Sat, Jan 16, 2021 at 11:29 PM Daniel Scally <[email protected]> wrote:
>> On 16/01/2021 20:23, Andy Shevchenko wrote:
>>> On Fri, Jan 15, 2021 at 11:52 AM Heikki Krogerus
>>> <[email protected]> wrote:
>>>> Hi,
>>>>
>>>> I'm now clearing the dev_fwnode(dev)->secondary pointer in
>>>> device_remove_software_node() as requested by Daniel and Andy. Thanks
>>>> guys, it's much better now. I also took the liberty of including one
>>>> more PCI ID patch where I add PCI ID for the Alder Lake-P variant. I
>>>> hope that is OK.
>>>>
>>>> Andy, I dropped your Tested-by tag because of the change I made to the
>>>> first patch. If you have time to retest these, I would much appreciate.
>>> Since Greg already grabbed a v3 I will test it when it appears in linux-next.
>>>
>> It seems the grabbed one is the v2 one though actually
> In his last message he wrote that he noticed the v3 *as I understand that*.
> Greg, is it right? I mean you took v3 eventually?
>
You're right:

https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git/commit/?h=usb-testing&id=e68d0119e3284334de5650a1ac42ef4e179f895e

My bad; I went off the automated message but didn't check the tree.