static struct device_node * __init tilcdc_get_overlay(struct kfree_table *kft) { const int size = __dtb_tilcdc_slave_compat_end - __dtb_tilcdc_slave_compat_begin; static void *overlay_data; struct device_node *overlay; int ret; if (!size) { pr_warn("%s: No overlay data\n", __func__); return NULL; } overlay_data = kmemdup(__dtb_tilcdc_slave_compat_begin, size, GFP_KERNEL); if (!overlay_data || kfree_table_add(kft, overlay_data)) return NULL; of_fdt_unflatten_tree(overlay_data, NULL, &overlay); if (!overlay) { pr_warn("%s: Unfattening overlay tree failed\n", __func__); return NULL; } of_node_set_flag(overlay, OF_DETACHED); ret = of_resolve_phandles(overlay); if (ret) { pr_err("%s: Failed to resolve phandles: %d\n", __func__, ret); return NULL; } return overlay; }
/** * dtbocfg_overlay_create() - Create Device Tree Overlay * @overlay: Pointer to Device Tree Overlay Item * return Success(0) or Error Status. */ static int dtbocfg_overlay_item_create(struct dtbocfg_overlay_item *overlay) { int ret_val; of_fdt_unflatten_tree(overlay->dtbo, &overlay->node); if (overlay->node == NULL) { pr_err("%s: failed to unflatten tree\n", __func__); ret_val = -EINVAL; goto failed; } pr_debug("%s: unflattened OK\n", __func__); of_node_set_flag(overlay->node, OF_DETACHED); ret_val = of_resolve_phandles(overlay->node); if (ret_val != 0) { pr_err("%s: Failed to resolve tree\n", __func__); goto failed; } pr_debug("%s: resolved OK\n", __func__); ret_val = of_overlay_create(overlay->node); if (ret_val < 0) { pr_err("%s: Failed to create overlay (ret_val=%d)\n", __func__, ret_val); goto failed; } overlay->id = ret_val; pr_debug("%s: create OK\n", __func__); return 0; failed: return ret_val; }