Skip to contentSkip to conversation

usb: typec: intel_pmc_mux: Put fwnode in error case during ->probe()

PATCH Superseded Andy Shevchenko 2 participants 9 messages Jun 6, 2021 – Jun 7, 2021

Subsystems (3)

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/3 usb: typec: intel_pmc_mux: Put fwnode in error case during ->probe()

device_get_next_child_node() bumps a reference counting of a returned variable. We have to balance it whenever we return to the caller.

Fixes 6701adfa9693 ("usb: typec: driver for Intel PMC mux control")
Cc Heikki Krogerus <[email protected]>
---
 drivers/usb/typec/mux/intel_pmc_mux.c | 1 +
 1 file changed, 1 insertion(+)
drivers/usb/typec/mux/intel_pmc_mux.c +1 -0
index 46a25b8db72e..134325444e6a 100644
@@ -645,6 +645,7 @@ static int pmc_usb_probe(struct platform_device *pdev)
 	return 0;
 
 err_remove_ports:
+	fwnode_handle_put(fwnode);
 	for (i = 0; i < pmc->num_ports; i++) {
 		typec_switch_unregister(pmc->port[i].typec_sw);
 		typec_mux_unregister(pmc->port[i].typec_mux);
Signature · 1 line
2.31.1
#1 lore raw

PATCH 2/3 usb: typec: intel_pmc_mux: Add missed error check for devm_ioremap_resource()

devm_ioremap_resource() can return an error, add missed check for it.

Fixes 43d596e32276 ("usb: typec: intel_pmc_mux: Check the port status before connect")
Cc Heikki Krogerus <[email protected]>
---
 drivers/usb/typec/mux/intel_pmc_mux.c | 5 +++++
 1 file changed, 5 insertions(+)
drivers/usb/typec/mux/intel_pmc_mux.c +5 -0
index 134325444e6a..de40276cc18b 100644
@@ -586,6 +586,11 @@ static int pmc_usb_probe_iom(struct pmc_usb *pmc)
 		return -ENOMEM;
 	}
 
+	if (IS_ERR(pmc->iom_base)) {
+		put_device(&adev->dev);
+		return PTR_ERR(pmc->iom_base);
+	}
+
 	pmc->iom_adev = adev;
 
 	return 0;
Signature · 1 line
2.31.1
maintainer Reviewed-by on v1 2/3
#2 lore raw

Re: [PATCH v1 2/3] usb: typec: intel_pmc_mux: Add missed error check for devm_ioremap_resource()

Quoted 5 lines · Andy Shevchenko

devm_ioremap_resource() can return an error, add missed check for it.

Fixes 43d596e32276 ("usb: typec: intel_pmc_mux: Check the port status before connect")
Cc Heikki Krogerus <[email protected]>
Quoted 22 lines
---
 drivers/usb/typec/mux/intel_pmc_mux.c | 5 +++++
 1 file changed, 5 insertions(+)
drivers/usb/typec/mux/intel_pmc_mux.c +5 -0
index 134325444e6a..de40276cc18b 100644
@@ -586,6 +586,11 @@ static int pmc_usb_probe_iom(struct pmc_usb *pmc)
 		return -ENOMEM;
 	}
 
+	if (IS_ERR(pmc->iom_base)) {
+		put_device(&adev->dev);
+		return PTR_ERR(pmc->iom_base);
+	}
+
 	pmc->iom_adev = adev;
 
 	return 0;
Signature · 1 line
2.31.1
Signature · 1 line
heikki
#3 lore raw

PATCH 3/3 usb: typec: intel_pmc_mux: Put ACPI device using acpi_dev_put()

In reply to Andy Shevchenko

For ACPI devices we have a symmetric API to put them, so use it in the driver.

---
 drivers/usb/typec/mux/intel_pmc_mux.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/usb/typec/mux/intel_pmc_mux.c +4 -4
index de40276cc18b..2d0a863956c7 100644
@@ -582,12 +582,12 @@ static int pmc_usb_probe_iom(struct pmc_usb *pmc)
 	acpi_dev_free_resource_list(&resource_list);
 
 	if (!pmc->iom_base) {
-		put_device(&adev->dev);
+		acpi_dev_put(adev);
 		return -ENOMEM;
 	}
 
 	if (IS_ERR(pmc->iom_base)) {
-		put_device(&adev->dev);
+		acpi_dev_put(adev);
 		return PTR_ERR(pmc->iom_base);
 	}
 
@@ -657,7 +657,7 @@ static int pmc_usb_probe(struct platform_device *pdev)
 		usb_role_switch_unregister(pmc->port[i].usb_sw);
 	}
 
-	put_device(&pmc->iom_adev->dev);
+	acpi_dev_put(pmc->iom_adev);
 
 	return ret;
 }
@@ -673,7 +673,7 @@ static int pmc_usb_remove(struct platform_device *pdev)
 		usb_role_switch_unregister(pmc->port[i].usb_sw);
 	}
 
-	put_device(&pmc->iom_adev->dev);
+	acpi_dev_put(pmc->iom_adev);
 
 	return 0;
 }
Signature · 1 line
2.31.1
maintainer Reviewed-by on v1 3/3
#4 lore raw

Re: [PATCH v1 3/3] usb: typec: intel_pmc_mux: Put ACPI device using acpi_dev_put()

Quoted 3 lines · Andy Shevchenko

For ACPI devices we have a symmetric API to put them, so use it in the driver.

Quoted 43 lines
---
 drivers/usb/typec/mux/intel_pmc_mux.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/usb/typec/mux/intel_pmc_mux.c +4 -4
index de40276cc18b..2d0a863956c7 100644
@@ -582,12 +582,12 @@ static int pmc_usb_probe_iom(struct pmc_usb *pmc)
 	acpi_dev_free_resource_list(&resource_list);
 
 	if (!pmc->iom_base) {
-		put_device(&adev->dev);
+		acpi_dev_put(adev);
 		return -ENOMEM;
 	}
 
 	if (IS_ERR(pmc->iom_base)) {
-		put_device(&adev->dev);
+		acpi_dev_put(adev);
 		return PTR_ERR(pmc->iom_base);
 	}
 
@@ -657,7 +657,7 @@ static int pmc_usb_probe(struct platform_device *pdev)
 		usb_role_switch_unregister(pmc->port[i].usb_sw);
 	}
 
-	put_device(&pmc->iom_adev->dev);
+	acpi_dev_put(pmc->iom_adev);
 
 	return ret;
 }
@@ -673,7 +673,7 @@ static int pmc_usb_remove(struct platform_device *pdev)
 		usb_role_switch_unregister(pmc->port[i].usb_sw);
 	}
 
-	put_device(&pmc->iom_adev->dev);
+	acpi_dev_put(pmc->iom_adev);
 
 	return 0;
 }
Signature · 1 line
2.31.1
Signature · 1 line
heikki
maintainer
#5 lore raw
In reply to Andy Shevchenko
Quoted 15 lines · Andy Shevchenko

device_get_next_child_node() bumps a reference counting of a returned variable. We have to balance it whenever we return to the caller.

Fixes 6701adfa9693 ("usb: typec: driver for Intel PMC mux control")
Cc Heikki Krogerus <[email protected]>
---
 drivers/usb/typec/mux/intel_pmc_mux.c | 1 +
 1 file changed, 1 insertion(+)
drivers/usb/typec/mux/intel_pmc_mux.c +0 -0
index 46a25b8db72e..134325444e6a 100644

drivers/usb/typec/mux/intel_pmc_mux.c static int pmc_usb_probe(struct platform_device *pdev) · line 648

Quoted 4 lines
drivers/usb/typec/mux/intel_pmc_mux.c +1 -0
@@ -645,6 +645,7 @@ static int pmc_usb_probe(struct platform_device *pdev)
 	return 0;
 
 err_remove_ports:
+	fwnode_handle_put(fwnode);

Wouldn't it be more clear to do that in the condition that jumps to this lable?

Quoted 5 lines
drivers/usb/typec/mux/intel_pmc_mux.c +0 -0
 	for (i = 0; i < pmc->num_ports; i++) {
 		typec_switch_unregister(pmc->port[i].typec_sw);
 		typec_mux_unregister(pmc->port[i].typec_mux);
Signature · 1 line
2.31.1
Signature · 1 line
heikki
#6 lore raw
Quoted 2 lines · Heikki Krogerus
Quoted 1 line · Andy Shevchenko

device_get_next_child_node() bumps a reference counting of a returned variable.

...

Quoted 5 lines
Quoted 2 lines

err_remove_ports:
+ fwnode_handle_put(fwnode);

Wouldn't it be more clear to do that in the condition that jumps to this lable?

In this case it doesn't matter. As a general pattern, no, because this will help to keep this in mind in complex error handling ladders. That said, I prefer my variant unless there is a strong opinion to move it into the conditional.

Quoted 3 lines
Quoted 3 lines
      for (i = 0; i < pmc->num_ports; i++) {
              typec_switch_unregister(pmc->port[i].typec_sw);
              typec_mux_unregister(pmc->port[i].typec_mux);
Signature · 2 lines
With Best Regards,
Andy Shevchenko
maintainer
#7 lore raw
Quoted 10 lines · Andy Shevchenko
Quoted 2 lines · Heikki Krogerus
Quoted 1 line · Andy Shevchenko

device_get_next_child_node() bumps a reference counting of a returned variable.

...

Quoted 3 lines
Quoted 2 lines

err_remove_ports:
+ fwnode_handle_put(fwnode);

Quoted 7 lines
Quoted 2 lines

Wouldn't it be more clear to do that in the condition that jumps to this lable?

In this case it doesn't matter. As a general pattern, no, because this will help to keep this in mind in complex error handling ladders. That said, I prefer my variant unless there is a strong opinion to move it into the conditional.

Now it looks like you are releasing the mux device fwnode instead of a port fwnode because everything else related to the ports is destroyed in below loop. That's too confusing.

Just handle it inside the condition, and the whole thing becomes clear.

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
      for (i = 0; i < pmc->num_ports; i++) {
              typec_switch_unregister(pmc->port[i].typec_sw);
              typec_mux_unregister(pmc->port[i].typec_mux);
Signature · 1 line
heikki
#8 lore raw
Quoted 19 lines · Heikki Krogerus
Quoted 10 lines · Andy Shevchenko
Quoted 2 lines · Heikki Krogerus
Quoted 1 line · Andy Shevchenko

device_get_next_child_node() bumps a reference counting of a returned variable.

...

Quoted 3 lines
Quoted 2 lines

err_remove_ports:
+ fwnode_handle_put(fwnode);

Quoted 7 lines
Quoted 2 lines

Wouldn't it be more clear to do that in the condition that jumps to this lable?

In this case it doesn't matter. As a general pattern, no, because this will help to keep this in mind in complex error handling ladders. That said, I prefer my variant unless there is a strong opinion to move it into the conditional.

Quoted 6 lines

Now it looks like you are releasing the mux device fwnode instead of a port fwnode because everything else related to the ports is destroyed in below loop. That's too confusing.

Just handle it inside the condition, and the whole thing becomes clear.

I see your point, okay, I will update in v2.
Thanks for your review!

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
      for (i = 0; i < pmc->num_ports; i++) {
              typec_switch_unregister(pmc->port[i].typec_sw);
              typec_mux_unregister(pmc->port[i].typec_mux);
Signature · 2 lines
With Best Regards,
Andy Shevchenko