fdt: Add new fdt_set_node_status & fdt_set_status_by_alias helpers
authorShengzhou Liu <Shengzhou.Liu@freescale.com>
Fri, 14 Oct 2011 08:26:05 +0000 (16:26 +0800)
committerKumar Gala <galak@kernel.crashing.org>
Tue, 18 Oct 2011 05:36:55 +0000 (00:36 -0500)
Add common function fdt_set_node_status() to assist in various locations
that we set a nodes status.  This function utilizes the status values
that are part of the EPAPR spec (on power.org).

fdt_set_status_by_alias() is based on fdt_set_node_status() but uses an
alias string to identify the node to update.

We also add some shortcut functions to help the common cases of setting
"okay" and "disabled":

fdt_status_okay()
fdt_status_disabled()
fdt_status_okay_by_alias()
fdt_status_disabled_by_alias()

Finally, we fixup the corenet_ds ethernet code which previously had
a function by the same name that can be replaced with the new helpers.

Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Acked-by: Gerald Van Baren <vanbaren@cideas.com>
board/freescale/corenet_ds/eth_hydra.c
board/freescale/corenet_ds/eth_p4080.c
common/fdt_support.c
include/fdt_support.h

index 91b340826dd0ac9be235fcf774fc4207415a5fd0..a7a5e13af767ef03eac4645cad02d7fef8f552e3 100644 (file)
@@ -70,6 +70,7 @@
 #include <fm_eth.h>
 #include <fsl_mdio.h>
 #include <malloc.h>
+#include <fdt_support.h>
 #include <asm/fsl_dtsec.h>
 
 #include "../common/ngpixis.h"
@@ -199,25 +200,6 @@ static int hydra_mdio_init(char *realbusname, char *fakebusname)
        return mdio_register(bus);
 }
 
-/*
- * Given an alias or a path for a node, set the status of that node.
- *
- * If 'alias' is not a valid alias, then it is treated as a full path to the
- * node.  No error checking is performed.
- *
- * This function is normally called to set the status for a virtual MDIO node.
- */
-static void fdt_set_node_status(void *fdt, const char *alias,
-                               const char *status)
-{
-       const char *path = fdt_get_alias(fdt, alias);
-
-       if (!path)
-               path = alias;
-
-       do_fixup_by_path(fdt, path, "status", status, strlen(status) + 1, 1);
-}
-
 /*
  * Given an alias or a path for a node, set the mux value of that node.
  *
@@ -372,14 +354,14 @@ void fdt_fixup_board_enet(void *fdt)
                case PHY_INTERFACE_MODE_SGMII:
                        lane = serdes_get_first_lane(SGMII_FM1_DTSEC1 + idx);
                        if (lane >= 0) {
-                               fdt_set_node_status(fdt, "emi1_sgmii", "okay");
+                               fdt_status_okay_by_alias(fdt, "emi1_sgmii");
                                /* Also set the MUX value */
                                fdt_set_mdio_mux(fdt, "emi1_sgmii",
                                                 mdio_mux[i].val);
                        }
                        break;
                case PHY_INTERFACE_MODE_RGMII:
-                       fdt_set_node_status(fdt, "emi1_rgmii", "okay");
+                       fdt_status_okay_by_alias(fdt, "emi1_rgmii");
                        break;
                default:
                        break;
@@ -388,7 +370,7 @@ void fdt_fixup_board_enet(void *fdt)
 
        lane = serdes_get_first_lane(XAUI_FM1);
        if (lane >= 0)
-               fdt_set_node_status(fdt, "emi2_xgmii", "okay");
+               fdt_status_okay_by_alias(fdt, "emi2_xgmii");
 #endif
 }
 
index d4657f73169055f706046ccc843a58799fd9f945..00dfa9ac3918c6abe8f745bb36627c519bca16ce 100644 (file)
@@ -199,22 +199,6 @@ static int p4080ds_mdio_init(char *realbusname, u32 muxval)
        return mdio_register(bus);
 }
 
-/*
- * Sets the specified node's status to the value contained in "status"
- * If the first character of the specified path is "/" then we use
- * alias as a path.  Otherwise, we look for an alias of that name
- */
-static void fdt_set_node_status(void *fdt, const char *alias,
-                       const char *status)
-{
-       const char *path = fdt_get_alias(fdt, alias);
-
-       if (!path)
-               path = alias;
-
-       do_fixup_by_path(fdt, path, "status", status, strlen(status) + 1, 1);
-}
-
 void board_ft_fman_fixup_port(void *blob, char * prop, phys_addr_t pa,
                                enum fm_port port, int offset)
 {
@@ -255,28 +239,28 @@ void fdt_fixup_board_enet(void *fdt)
         */
 
        /* We've got six MDIO nodes that may or may not need to exist */
-       fdt_set_node_status(fdt, "emi1_slot3", "disabled");
-       fdt_set_node_status(fdt, "emi1_slot4", "disabled");
-       fdt_set_node_status(fdt, "emi1_slot5", "disabled");
-       fdt_set_node_status(fdt, "emi2_slot4", "disabled");
-       fdt_set_node_status(fdt, "emi2_slot5", "disabled");
+       fdt_status_disabled_by_alias(fdt, "emi1_slot3");
+       fdt_status_disabled_by_alias(fdt, "emi1_slot4");
+       fdt_status_disabled_by_alias(fdt, "emi1_slot5");
+       fdt_status_disabled_by_alias(fdt, "emi2_slot4");
+       fdt_status_disabled_by_alias(fdt, "emi2_slot5");
 
        for (i = 0; i < NUM_FM_PORTS; i++) {
                switch (mdio_mux[i]) {
                case EMI1_SLOT3:
-                       fdt_set_node_status(fdt, "emi1_slot3", "okay");
+                       fdt_status_okay_by_alias(fdt, "emi1_slot3");
                        break;
                case EMI1_SLOT4:
-                       fdt_set_node_status(fdt, "emi1_slot4", "okay");
+                       fdt_status_okay_by_alias(fdt, "emi1_slot4");
                        break;
                case EMI1_SLOT5:
-                       fdt_set_node_status(fdt, "emi1_slot5", "okay");
+                       fdt_status_okay_by_alias(fdt, "emi1_slot5");
                        break;
                case EMI2_SLOT4:
-                       fdt_set_node_status(fdt, "emi2_slot4", "okay");
+                       fdt_status_okay_by_alias(fdt, "emi2_slot4");
                        break;
                case EMI2_SLOT5:
-                       fdt_set_node_status(fdt, "emi2_slot5", "okay");
+                       fdt_status_okay_by_alias(fdt, "emi2_slot5");
                        break;
                }
        }
index e0d3fe33e7e1900b3eb49e16b88e27a5e60446fe..bdda64d2d71887c559916dfddbcfdab660ed957e 100644 (file)
@@ -2,7 +2,7 @@
  * (C) Copyright 2007
  * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com
  *
- * Copyright 2010 Freescale Semiconductor, Inc.
+ * Copyright 2010-2011 Freescale Semiconductor, Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -1259,6 +1259,64 @@ unsigned int fdt_create_phandle(void *fdt, int nodeoffset)
        return phandle;
 }
 
+/*
+ * fdt_set_node_status: Set status for the given node
+ *
+ * @fdt: ptr to device tree
+ * @nodeoffset: node to update
+ * @status: FDT_STATUS_OKAY, FDT_STATUS_DISABLED,
+ *         FDT_STATUS_FAIL, FDT_STATUS_FAIL_ERROR_CODE
+ * @error_code: optional, only used if status is FDT_STATUS_FAIL_ERROR_CODE
+ */
+int fdt_set_node_status(void *fdt, int nodeoffset,
+                       enum fdt_status status, unsigned int error_code)
+{
+       char buf[16];
+       int ret = 0;
+
+       if (nodeoffset < 0)
+               return nodeoffset;
+
+       switch (status) {
+       case FDT_STATUS_OKAY:
+               ret = fdt_setprop_string(fdt, nodeoffset, "status", "okay");
+               break;
+       case FDT_STATUS_DISABLED:
+               ret = fdt_setprop_string(fdt, nodeoffset, "status", "disabled");
+               break;
+       case FDT_STATUS_FAIL:
+               ret = fdt_setprop_string(fdt, nodeoffset, "status", "fail");
+               break;
+       case FDT_STATUS_FAIL_ERROR_CODE:
+               sprintf(buf, "fail-%d", error_code);
+               ret = fdt_setprop_string(fdt, nodeoffset, "status", buf);
+               break;
+       default:
+               printf("Invalid fdt status: %x\n", status);
+               ret = -1;
+               break;
+       }
+
+       return ret;
+}
+
+/*
+ * fdt_set_status_by_alias: Set status for the given node given an alias
+ *
+ * @fdt: ptr to device tree
+ * @alias: alias of node to update
+ * @status: FDT_STATUS_OKAY, FDT_STATUS_DISABLED,
+ *         FDT_STATUS_FAIL, FDT_STATUS_FAIL_ERROR_CODE
+ * @error_code: optional, only used if status is FDT_STATUS_FAIL_ERROR_CODE
+ */
+int fdt_set_status_by_alias(void *fdt, const char* alias,
+                           enum fdt_status status, unsigned int error_code)
+{
+       int offset = fdt_path_offset(fdt, alias);
+
+       return fdt_set_node_status(fdt, offset, status, error_code);
+}
+
 #if defined(CONFIG_VIDEO)
 int fdt_add_edid(void *blob, const char *compat, unsigned char *edid_buf)
 {
index 4826eee1ba0f3a72be29bfa458af7f3afbfd352f..c7b4605f06e760ede18cb4fc8bedd66165434e98 100644 (file)
@@ -104,5 +104,33 @@ int fdt_verify_alias_address(void *fdt, int anode, const char *alias,
                              u64 addr);
 u64 fdt_get_base_address(void *fdt, int node);
 
+enum fdt_status {
+       FDT_STATUS_OKAY,
+       FDT_STATUS_DISABLED,
+       FDT_STATUS_FAIL,
+       FDT_STATUS_FAIL_ERROR_CODE,
+};
+int fdt_set_node_status(void *fdt, int nodeoffset,
+                       enum fdt_status status, unsigned int error_code);
+static inline int fdt_status_okay(void *fdt, int nodeoffset)
+{
+       return fdt_set_node_status(fdt, nodeoffset, FDT_STATUS_OKAY, 0);
+}
+static inline int fdt_status_disabled(void *fdt, int nodeoffset)
+{
+       return fdt_set_node_status(fdt, nodeoffset, FDT_STATUS_DISABLED, 0);
+}
+
+int fdt_set_status_by_alias(void *fdt, const char* alias,
+                           enum fdt_status status, unsigned int error_code);
+static inline int fdt_status_okay_by_alias(void *fdt, const char* alias)
+{
+       return fdt_set_status_by_alias(fdt, alias, FDT_STATUS_OKAY, 0);
+}
+static inline int fdt_status_disabled_by_alias(void *fdt, const char* alias)
+{
+       return fdt_set_status_by_alias(fdt, alias, FDT_STATUS_DISABLED, 0);
+}
+
 #endif /* ifdef CONFIG_OF_LIBFDT */
 #endif /* ifndef __FDT_SUPPORT_H */