usb: typec: intel_pmc_mux: Put fwnode in error case during ->probe()
Subsystems (3)
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.
--- drivers/usb/typec/mux/intel_pmc_mux.c | 1 + 1 file changed, 1 insertion(+)
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);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
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.
--- drivers/usb/typec/mux/intel_pmc_mux.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/typec/mux/intel_pmc_mux.c +5 -0
@@ -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
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]>Signed-off-by Andy Shevchenko <[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@@ -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
PATCH 3/3 usb: typec: intel_pmc_mux: Put ACPI device using acpi_dev_put()
In reply to Andy ShevchenkoFor 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
@@ -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
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.
Signed-off-by Andy Shevchenko <[email protected]>
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@@ -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
Heikki Krogerus
maintainerQuoted 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]>Signed-off-by Andy Shevchenko <[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
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
-0for (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
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
Heikki Krogerus
maintainerQuoted 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
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