static int delete_dt_node(u32 phandle) { struct device_node *dn; dn = of_find_node_by_phandle(phandle); if (!dn) return -ENOENT; dlpar_detach_node(dn); return 0; }
static int delete_dt_node(__be32 phandle) { struct device_node *dn; dn = of_find_node_by_phandle(be32_to_cpu(phandle)); if (!dn) return -ENOENT; dlpar_detach_node(dn); of_node_put(dn); return 0; }
int dlpar_detach_node(struct device_node *dn) { struct device_node *child; int rc; child = of_get_next_child(dn, NULL); while (child) { dlpar_detach_node(child); child = of_get_next_child(dn, child); } rc = of_detach_node(dn); if (rc) return rc; return 0; }
int dlpar_detach_node(struct device_node *dn) { struct device_node *child; int rc; child = of_get_next_child(dn, NULL); while (child) { dlpar_detach_node(child); child = of_get_next_child(dn, child); } rc = of_detach_node(dn); if (rc) return rc; of_node_put(dn); /* Must decrement the refcount */ return 0; }
static ssize_t dlpar_cpu_release(const char *buf, size_t count) { struct device_node *dn; const u32 *drc_index; int rc; dn = of_find_node_by_path(buf); if (!dn) return -EINVAL; drc_index = of_get_property(dn, "ibm,my-drc-index", NULL); if (!drc_index) { of_node_put(dn); return -EINVAL; } cpu_hotplug_driver_lock(); rc = dlpar_offline_cpu(dn); if (rc) { of_node_put(dn); rc = -EINVAL; goto out; } rc = dlpar_release_drc(*drc_index); if (rc) { of_node_put(dn); goto out; } rc = dlpar_detach_node(dn); if (rc) { dlpar_acquire_drc(*drc_index); goto out; } of_node_put(dn); out: cpu_hotplug_driver_unlock(); return rc ? rc : count; }
static ssize_t dlpar_cpu_release(const char *buf, size_t count) { struct device_node *dn; u32 drc_index; int rc; dn = of_find_node_by_path(buf); if (!dn) return -EINVAL; rc = of_property_read_u32(dn, "ibm,my-drc-index", &drc_index); if (rc) { of_node_put(dn); return -EINVAL; } rc = dlpar_offline_cpu(dn); if (rc) { of_node_put(dn); return -EINVAL; } rc = dlpar_release_drc(drc_index); if (rc) { of_node_put(dn); return rc; } rc = dlpar_detach_node(dn); if (rc) { dlpar_acquire_drc(drc_index); return rc; } of_node_put(dn); return count; }