[PATCH 4/9] OF: import bus/device related functions from Linux OF API

Sebastian Hesselbarth sebastian.hesselbarth at gmail.com
Tue Jun 25 08:55:37 EDT 2013


On 06/25/13 11:20, Sebastian Hesselbarth wrote:
> This imports some bus and device related functions from Linux OF API
> with some modifcations for Barebox.
>
> Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth at gmail.com>
> ---
> Cc: barebox at lists.infradead.org
> ---
>   drivers/of/Makefile   |    2 +-
>   drivers/of/platform.c |  294 +++++++++++++++++++++++++++++++++++++++++++++++++
>   include/of.h          |   18 +++
>   3 files changed, 313 insertions(+), 1 deletions(-)
>   create mode 100644 drivers/of/platform.c
[...]
> diff --git a/drivers/of/platform.c b/drivers/of/platform.c
> new file mode 100644
> index 0000000..450d770
> --- /dev/null
> +++ b/drivers/of/platform.c
> @@ -0,0 +1,294 @@
> +/*
> + * platform.c - bus/device related devicetree functions
> + *
> + * Copyright (c) 2012 Sascha Hauer <s.hauer at pengutronix.de>, Pengutronix
> + *
> + * based on Linux devicetree support
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2
> + * as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + */
[...]
> +/**
> + * of_platform_device_create - Alloc, initialize and register an of_device
> + * @np: pointer to node to create device for
> + * @parent: device model parent device.
> + *
> + * Returns pointer to created platform device, or NULL if a device was not
> + * registered. Unavailable devices will not get registered.
> + */
> +static struct device_d *of_platform_device_create(struct device_node *np,
> +						struct device_d *parent)
> +{
> +	struct device_d *dev;
> +	struct resource *res, temp_res;
> +	int i, ret, num_reg = 0;
> +
> +	if (!of_device_is_available(np))
> +		return NULL;
> +
> +	dev = xzalloc(sizeof(*dev));
> +
> +	/* setup generic device info */
> +	dev->id = DEVICE_ID_SINGLE;
> +	dev->device_node = np;
> +	dev->parent = parent;
> +	of_device_make_bus_id(dev);
> +
> +	/* count the io resources */
> +	if (of_can_translate_address(np))
> +		while (of_address_to_resource(np, num_reg, &temp_res) == 0)
> +			num_reg++;
> +
> +	/* Populate the resource table */
> +	if (num_reg) {
> +		res = xzalloc(sizeof(*res) * num_reg);
> +
> +		dev->num_resources = num_reg;
> +		dev->resource = res;
> +		for (i = 0; i < num_reg; i++, res++) {
> +			ret = of_address_to_resource(np, i, res);
> +			if (ret)
> +				goto err_free;
> +		}
> +	}
> +
> +	debug("register device 0x%08x\n", (num_reg) ? dev->resource[0].start : (-1));
> +
> +	ret = platform_device_register(dev);
> +	if (ret)
> +		goto err_free;
> +
> +	return dev;
> +
> +err_free:
> +	free(dev);
> +	return NULL;
> +}

of_platform_device_create is missing a check for already existing
devices. I have added a check that tries to match all mem resources
of the node with existing devices.

[...]
> +/**
> + * of_platform_populate() - Populate platform_devices from device tree data
> + * @root: parent of the first level to probe or NULL for the root of the tree
> + * @matches: match table, NULL to use the default
> + * @lookup: auxdata table for matching id and platform_data with device nodes

Removed the line above, as lookup auxdata is not used on barebox.

Sebastian



More information about the barebox mailing list