On Thu, Mar 28, 2024 at 02:01:19PM +0000, Charles Keepax wrote: > +static bool cs42l43_has_sidecar(struct fwnode_handle *fwnode) > +{ > + static const int func_smart_amp = 0x1; > + struct fwnode_handle *child_fwnode, *ext_fwnode; > + unsigned long long function; > + unsigned int val; > + int ret; > + > + if (!is_acpi_node(fwnode)) > + return false; > + > + fwnode_for_each_child_node(fwnode, child_fwnode) { > + struct acpi_device *adev = to_acpi_device_node(child_fwnode); > + > + ret = acpi_evaluate_integer(adev->handle, "_ADR", NULL, &function); > + if (ACPI_FAILURE(ret)) > + continue; > + > + if (function != func_smart_amp) > + continue; > + > + ext_fwnode = fwnode_get_named_child_node(child_fwnode, > + "mipi-sdca-function-expansion-subproperties"); > + if (!ext_fwnode) > + continue; > + > + ret = fwnode_property_read_u32(ext_fwnode, > + "01fa-cirrus-sidecar-instances", > + &val); > + if (ret) > + continue; > + > + return !!val; This should call fwnode_handle_put(child_fwnode) before returning. An alternative fix would be to use the new device_for_each_child_node_scoped() macro. regards, dan carpenter > + } > + > + return false; > +}