Also:
- rename "fsl_spi" to "fsl,spi";
- add and use cell-index property, if found;
- split probing code out of fsl_spi_init, thus we can call
  it for legacy device_type probing and new "compatible" probing.

Per http://ozlabs.org/pipermail/linuxppc-dev/2007-December/048388.html

Signed-off-by: Anton Vorontsov <[EMAIL PROTECTED]>
---
 arch/powerpc/boot/dts/mpc8313erdb.dts    |    4 +-
 arch/powerpc/boot/dts/mpc832x_mds.dts    |    8 ++--
 arch/powerpc/boot/dts/mpc832x_rdb.dts    |    8 ++--
 arch/powerpc/boot/dts/mpc8349emitx.dts   |    4 +-
 arch/powerpc/boot/dts/mpc8349emitxgp.dts |    4 +-
 arch/powerpc/boot/dts/mpc834x_mds.dts    |    4 +-
 arch/powerpc/boot/dts/mpc836x_mds.dts    |    8 ++--
 arch/powerpc/boot/dts/mpc8568mds.dts     |    8 ++--
 arch/powerpc/sysdev/fsl_soc.c            |   87 ++++++++++++++++++-----------
 9 files changed, 78 insertions(+), 57 deletions(-)

diff --git a/arch/powerpc/boot/dts/mpc8313erdb.dts 
b/arch/powerpc/boot/dts/mpc8313erdb.dts
index c5b6665..a0492b6 100644
--- a/arch/powerpc/boot/dts/mpc8313erdb.dts
+++ b/arch/powerpc/boot/dts/mpc8313erdb.dts
@@ -82,8 +82,8 @@
                };
 
                [EMAIL PROTECTED] {
-                       device_type = "spi";
-                       compatible = "fsl_spi";
+                       cell-index = <0>;
+                       compatible = "fsl,spi";
                        reg = <7000 1000>;
                        interrupts = <10 8>;
                        interrupt-parent = < &ipic >;
diff --git a/arch/powerpc/boot/dts/mpc832x_mds.dts 
b/arch/powerpc/boot/dts/mpc832x_mds.dts
index 8844d30..36ecd39 100644
--- a/arch/powerpc/boot/dts/mpc832x_mds.dts
+++ b/arch/powerpc/boot/dts/mpc832x_mds.dts
@@ -193,8 +193,8 @@
                };
 
                [EMAIL PROTECTED] {
-                       device_type = "spi";
-                       compatible = "fsl_spi";
+                       cell-index = <0>;
+                       compatible = "fsl,spi";
                        reg = <4c0 40>;
                        interrupts = <2>;
                        interrupt-parent = < &qeic >;
@@ -202,8 +202,8 @@
                };
 
                [EMAIL PROTECTED] {
-                       device_type = "spi";
-                       compatible = "fsl_spi";
+                       cell-index = <1>;
+                       compatible = "fsl,spi";
                        reg = <500 40>;
                        interrupts = <1>;
                        interrupt-parent = < &qeic >;
diff --git a/arch/powerpc/boot/dts/mpc832x_rdb.dts 
b/arch/powerpc/boot/dts/mpc832x_rdb.dts
index a7a2e45..ce63b13 100644
--- a/arch/powerpc/boot/dts/mpc832x_rdb.dts
+++ b/arch/powerpc/boot/dts/mpc832x_rdb.dts
@@ -183,8 +183,8 @@
                };
 
                [EMAIL PROTECTED] {
-                       device_type = "spi";
-                       compatible = "fsl_spi";
+                       cell-index = <0>;
+                       compatible = "fsl,spi";
                        reg = <4c0 40>;
                        interrupts = <2>;
                        interrupt-parent = <&qeic>;
@@ -192,8 +192,8 @@
                };
 
                [EMAIL PROTECTED] {
-                       device_type = "spi";
-                       compatible = "fsl_spi";
+                       cell-index = <1>;
+                       compatible = "fsl,spi";
                        reg = <500 40>;
                        interrupts = <1>;
                        interrupt-parent = <&qeic>;
diff --git a/arch/powerpc/boot/dts/mpc8349emitx.dts 
b/arch/powerpc/boot/dts/mpc8349emitx.dts
index e354f26..f8fc5f6 100644
--- a/arch/powerpc/boot/dts/mpc8349emitx.dts
+++ b/arch/powerpc/boot/dts/mpc8349emitx.dts
@@ -82,8 +82,8 @@
                };
 
                [EMAIL PROTECTED] {
-                       device_type = "spi";
-                       compatible = "fsl_spi";
+                       cell-index = <0>;
+                       compatible = "fsl,spi";
                        reg = <7000 1000>;
                        interrupts = <10 8>;
                        interrupt-parent = < &ipic >;
diff --git a/arch/powerpc/boot/dts/mpc8349emitxgp.dts 
b/arch/powerpc/boot/dts/mpc8349emitxgp.dts
index ebdf0b7..666650c 100644
--- a/arch/powerpc/boot/dts/mpc8349emitxgp.dts
+++ b/arch/powerpc/boot/dts/mpc8349emitxgp.dts
@@ -80,8 +80,8 @@
                };
 
                [EMAIL PROTECTED] {
-                       device_type = "spi";
-                       compatible = "fsl_spi";
+                       cell-index = <0>;
+                       compatible = "fsl,spi";
                        reg = <7000 1000>;
                        interrupts = <10 8>;
                        interrupt-parent = < &ipic >;
diff --git a/arch/powerpc/boot/dts/mpc834x_mds.dts 
b/arch/powerpc/boot/dts/mpc834x_mds.dts
index 0ba13eb..6ed36a1 100644
--- a/arch/powerpc/boot/dts/mpc834x_mds.dts
+++ b/arch/powerpc/boot/dts/mpc834x_mds.dts
@@ -93,8 +93,8 @@
                };
 
                [EMAIL PROTECTED] {
-                       device_type = "spi";
-                       compatible = "fsl_spi";
+                       cell-index = <0>;
+                       compatible = "fsl,spi";
                        reg = <7000 1000>;
                        interrupts = <10 8>;
                        interrupt-parent = < &ipic >;
diff --git a/arch/powerpc/boot/dts/mpc836x_mds.dts 
b/arch/powerpc/boot/dts/mpc836x_mds.dts
index 5f0b427..7801e66 100644
--- a/arch/powerpc/boot/dts/mpc836x_mds.dts
+++ b/arch/powerpc/boot/dts/mpc836x_mds.dts
@@ -224,8 +224,8 @@
                };
 
                [EMAIL PROTECTED] {
-                       device_type = "spi";
-                       compatible = "fsl_spi";
+                       cell-index = <0>;
+                       compatible = "fsl,spi";
                        reg = <4c0 40>;
                        interrupts = <2>;
                        interrupt-parent = < &qeic >;
@@ -233,8 +233,8 @@
                };
 
                [EMAIL PROTECTED] {
-                       device_type = "spi";
-                       compatible = "fsl_spi";
+                       cell-index = <1>;
+                       compatible = "fsl,spi";
                        reg = <500 40>;
                        interrupts = <1>;
                        interrupt-parent = < &qeic >;
diff --git a/arch/powerpc/boot/dts/mpc8568mds.dts 
b/arch/powerpc/boot/dts/mpc8568mds.dts
index ea70010..2a0ba5f 100644
--- a/arch/powerpc/boot/dts/mpc8568mds.dts
+++ b/arch/powerpc/boot/dts/mpc8568mds.dts
@@ -301,8 +301,8 @@
                };
 
                [EMAIL PROTECTED] {
-                       device_type = "spi";
-                       compatible = "fsl_spi";
+                       cell-index = <0>;
+                       compatible = "fsl,spi";
                        reg = <4c0 40>;
                        interrupts = <2>;
                        interrupt-parent = <&qeic>;
@@ -310,8 +310,8 @@
                };
 
                [EMAIL PROTECTED] {
-                       device_type = "spi";
-                       compatible = "fsl_spi";
+                       cell-index = <1>;
+                       compatible = "fsl,spi";
                        reg = <500 40>;
                        interrupts = <1>;
                        interrupt-parent = <&qeic>;
diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/fsl_soc.c
index 746f4c5..5676a8a 100644
--- a/arch/powerpc/sysdev/fsl_soc.c
+++ b/arch/powerpc/sysdev/fsl_soc.c
@@ -1226,39 +1226,17 @@ arch_initcall(cpm_smc_uart_of_init);
 #endif /* CONFIG_8xx */
 #endif /* CONFIG_PPC_CPM_NEW_BINDING */
 
-int __init fsl_spi_init(struct spi_board_info *board_infos,
-                       unsigned int num_board_infos,
-                       void (*activate_cs)(u8 cs, u8 polarity),
-                       void (*deactivate_cs)(u8 cs, u8 polarity))
+static int __init of_fsl_spi_probe(char *type, char *compatible, u32 sysclk,
+                                  struct spi_board_info *board_infos,
+                                  unsigned int num_board_infos,
+                                  void (*activate_cs)(u8 cs, u8 polarity),
+                                  void (*deactivate_cs)(u8 cs, u8 polarity))
 {
        struct device_node *np;
-       unsigned int i;
-       u32 sysclk;
-
-       /* SPI controller is either clocked from QE or SoC clock */
-       sysclk = get_brgfreq();
-       if (sysclk == -1) {
-               const u32 *freq;
-               int size;
-
-               np = of_find_node_by_type(NULL, "soc");
-               if (!np)
-                       return -ENODEV;
-
-               freq = of_get_property(np, "bus-frequency", &size);
-               if (!freq || size != sizeof(*freq)) {
-                       of_node_put(np);
-                       return -ENODEV;
-               }
-
-               sysclk = *freq;
-               of_node_put(np);
-       }
+       unsigned int i = 0;
 
-       for (np = NULL, i = 1;
-            (np = of_find_compatible_node(np, "spi", "fsl_spi")) != NULL;
-            i++) {
-               int ret = 0;
+       for_each_compatible_node(np, type, compatible) {
+               int ret;
                unsigned int j;
                const void *prop;
                struct resource res[2];
@@ -1277,6 +1255,10 @@ int __init fsl_spi_init(struct spi_board_info 
*board_infos,
                        goto err;
                pdata.bus_num = *(u32 *)prop;
 
+               prop = of_get_property(np, "cell-index", NULL);
+               if (prop)
+                       i = *(u32 *)prop;
+
                prop = of_get_property(np, "mode", NULL);
                if (prop && !strcmp(prop, "cpu-qe"))
                        pdata.qe_mode = 1;
@@ -1287,7 +1269,7 @@ int __init fsl_spi_init(struct spi_board_info 
*board_infos,
                }
 
                if (!pdata.max_chipselect)
-                       goto err;
+                       continue;
 
                ret = of_address_to_resource(np, 0, &res[0]);
                if (ret)
@@ -1314,13 +1296,52 @@ int __init fsl_spi_init(struct spi_board_info 
*board_infos,
                if (ret)
                        goto unreg;
 
-               continue;
+               goto next;
 unreg:
                platform_device_del(pdev);
 err:
-               continue;
+               pr_err("%s: registration failed\n", np->full_name);
+next:
+               i++;
        }
 
+       return i;
+}
+
+int __init fsl_spi_init(struct spi_board_info *board_infos,
+                       unsigned int num_board_infos,
+                       void (*activate_cs)(u8 cs, u8 polarity),
+                       void (*deactivate_cs)(u8 cs, u8 polarity))
+{
+       u32 sysclk;
+       int ret;
+
+       /* SPI controller is either clocked from QE or SoC clock */
+       sysclk = get_brgfreq();
+       if (sysclk == -1) {
+               struct device_node *np;
+               const u32 *prop;
+
+               np = of_find_node_by_type(NULL, "soc");
+               if (!np)
+                       return -ENODEV;
+
+               prop = of_get_property(np, "bus-frequency", NULL);
+               if (!prop) {
+                       of_node_put(np);
+                       return -ENODEV;
+               }
+
+               sysclk = *prop;
+               of_node_put(np);
+       }
+
+       ret = of_fsl_spi_probe(NULL, "fsl,spi", sysclk, board_infos,
+                              num_board_infos, activate_cs, deactivate_cs);
+       if (!ret)
+               of_fsl_spi_probe("spi", "fsl_spi", sysclk, board_infos,
+                                num_board_infos, activate_cs, deactivate_cs);
+
        return spi_register_board_info(board_infos, num_board_infos);
 }
 
-- 
1.5.2.2
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to