/** * 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; }
for_each_child_of_node(overlay, fragment) { prop = of_find_property(fragment, "target-path", NULL); if (!prop) continue; if (!strncmp("i2c", (char *)prop->value, prop->length)) if (tilcdc_prop_str_update(prop, i2c->full_name, &kft)) goto out; if (!strncmp("lcdc", (char *)prop->value, prop->length)) if (tilcdc_prop_str_update(prop, lcdc->full_name, &kft)) goto out; } tilcdc_node_disable(slave); ret = of_overlay_create(overlay); if (ret) pr_err("%s: Creating overlay failed: %d\n", __func__, ret); else pr_info("%s: ti,tilcdc,slave node successfully converted\n", __func__); out: kfree_table_free(&kft); of_node_put(i2c); of_node_put(slave); of_node_put(lcdc); of_node_put(fragment); } static int __init tilcdc_slave_compat_init(void) {