Skip to contentSkip to conversation

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

PATCH In review Andy Shevchenko 2 participants 4 messages Jun 7, 2021 – Jun 8, 2021

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH v2 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]>

---
v2: moved put call into the conditional inside the loop (Heikki)

 drivers/usb/typec/mux/intel_pmc_mux.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/typec/mux/intel_pmc_mux.c +3 -1
index dc8689db0100..221aa1c0e77a 100644
@@ -654,8 +654,10 @@ static int pmc_usb_probe(struct platform_device *pdev)
 			break;
 
 		ret = pmc_usb_register_port(pmc, i, fwnode);
-		if (ret)
+		if (ret) {
+			fwnode_handle_put(fwnode);
 			goto err_remove_ports;
+		}
 	}
 
 	platform_set_drvdata(pdev, pmc);
Signature · 1 line
2.32.0
#1 lore raw

PATCH v2 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")

---
v2: added Rb tag (Heikki)

 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 221aa1c0e77a..34e1662ad6ef 100644
@@ -604,6 +604,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.32.0
#2 lore raw

PATCH v2 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.

---
v2: added Rb tag (Heikki)

 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 34e1662ad6ef..2cdd22130834 100644
@@ -600,12 +600,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);
 	}
 
@@ -676,7 +676,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;
 }
@@ -692,7 +692,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.32.0
maintainer Reviewed-by on v2 1/3
#3 lore raw
In reply to Andy Shevchenko
Quoted 6 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]>
Quoted 23 lines

---
v2: moved put call into the conditional inside the loop (Heikki)

 drivers/usb/typec/mux/intel_pmc_mux.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/typec/mux/intel_pmc_mux.c +3 -1
index dc8689db0100..221aa1c0e77a 100644
@@ -654,8 +654,10 @@ static int pmc_usb_probe(struct platform_device *pdev)
 			break;
 
 		ret = pmc_usb_register_port(pmc, i, fwnode);
-		if (ret)
+		if (ret) {
+			fwnode_handle_put(fwnode);
 			goto err_remove_ports;
+		}
 	}
 
 	platform_set_drvdata(pdev, pmc);
Signature · 1 line
2.32.0
Signature · 1 line
heikki