[PATCH 2/4] ppc: add mpc85xx device tree fixup functions
Sascha Hauer
s.hauer at pengutronix.de
Mon Sep 2 04:49:12 EDT 2013
Hi Renaud,
On Fri, Aug 30, 2013 at 02:34:27PM +0100, Renaud Barbier wrote:
> +/* These properties specify whether the hardware supports the stashing
> + * of buffer descriptors in L2 cache.
> + */
> +static void fdt_add_enet_stashing(void *fdt)
> +{
> + struct device_node *node;
> +
> + node = of_find_compatible_node(fdt, NULL, "gianfar");
> + while (node) {
> + of_set_property(node, "bd-stash", NULL, 0, 1);
> + of_property_write_u32(node, "rx-stash-len", 96);
> + of_property_write_u32(node, "rx-stash-idx", 0);
> + node = of_find_compatible_node(node, NULL, "gianfar");
> + }
> +}
Out of curiosity, why is this dynamically added and not part of the
static dts file?
> +
> +static int fdt_stdout_setup(struct device_node *blob)
> +{
> + struct device_node *node, *alias;
> + char sername[9] = { 0 };
> + const char *prop;
> + struct console_device *cdev;
> + int len;
> +
> + node = of_find_node_by_path("/chosen");
> + if (node == NULL)
> + node = of_create_node(blob, "/chosen");
You should be able to call of_create_node() without checking for
existence first. If the node already exists of_create_node() will just
return that node.
> +
> + if (node == NULL) {
> + pr_err("%s: could not open /chosen node\n", __func__);
> + goto error;
> + }
> +
> + for_each_console(cdev)
> + if ((cdev->f_active & (CONSOLE_STDIN | CONSOLE_STDOUT)))
> + break;
> + if (cdev)
> + sprintf(sername, "serial%d", cdev->dev->id);
> + else
> + sprintf(sername, "serial%d", 0);
> +
> + alias = of_find_node_by_path_from(blob, "/aliases");
> + if (!alias) {
> + pr_err("%s: could not get aliases node.\n", __func__);
> + goto error;
> + }
> + prop = of_get_property(alias, sername, &len);
> + of_set_property(node, "linux,stdout-path", prop, len, 1);
> + return 0;
> +error:
> + return 1;
Please return an error code.
> +}
> +
> +static void fdt_mac_setup(struct device_node *blob)
> +{
> + struct device_node *alias, *node;
> + const char *path, *tmp;
> + char mac[16], eth[12], *end;
> + unsigned char mac_addr[6];
> + struct device_d *dev;
> + int ix, idx = 0;
> +
> + alias = of_find_node_by_path_from(blob, "/aliases");
> + if (!alias) {
> + pr_err("%s: Failed to get /aliases node\n", __func__);
> + return;
> + }
> +
> + sprintf(mac, "eth%d.ethaddr", idx);
> + while ((tmp = getenv(mac)) != NULL) {
> + sprintf(eth, "eth%d", idx);
> + dev = get_device_by_name(eth);
> +
> + /* If the parent id is not set correctly by
> + * the board support, the wrong device path
> + * may be obtained.
> + */
> + sprintf(eth, "ethernet%d", dev->parent->id);
> + path = of_get_property(alias, eth, NULL);
> + if (!path) {
> + idx++;
> + sprintf(mac, "eth%d.ethaddr", idx);
> + continue;
> + }
> +
> + for (ix = 0; ix < 6; ix++) {
> + mac_addr[ix] = tmp ? simple_strtoul(tmp, &end, 16) : 0;
> + if (tmp)
> + tmp = (*end) ? end+1 : end;
> + }
> +
> + node = of_find_node_by_path_from(blob, path);
> + of_set_property(node, "mac-address", mac_addr,
> + sizeof(mac_addr), 1);
> + of_set_property(node, "local-mac-address", mac_addr,
> + sizeof(mac_addr), 1);
> + idx++;
> + sprintf(mac, "eth%d.ethaddr", idx);
> + }
> +}
This function could be simplified by using of_find_node_by_alias().
We already have eth_of_fixup(). Would it be possible to use this by
changing it to something like this:
static int eth_of_fixup(struct device_node *root)
{
struct eth_device *edev;
struct device_node *node;
int ret;
/*
* Add the mac-address property for each network device we
* find a nodepath for and which has a valid mac address.
*/
list_for_each_entry(edev, &netdev_list, list) {
if (!is_valid_ether_addr(edev->ethaddr)) {
dev_dbg(&edev->dev, "%s: no valid mac address, cannot fixup\n",
__func__);
continue;
}
if (edev->nodepath) {
node = of_find_node_by_path_from(root, edev->nodepath);
} else {
char eth[12];
sprintf(eth, "ethernet%d", edev->dev.id);
node = of_find_node_by_alias(root, eth);
}
if (!node) {
dev_dbg(&edev->dev, "%s: no node to fixup\n", __func__);
continue;
}
ret = of_set_property(node, "mac-address", edev->ethaddr, 6, 1);
if (ret)
pr_err("Setting mac-address property of %s failed with: %s\n",
node->full_name, strerror(-ret));
}
return 0;
}
(untested)
Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
More information about the barebox
mailing list