예제 #1
0
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;
}
예제 #2
0
/**
 * 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;
}