From: Mark A. Greer <[email protected]>

Factor out the common SoC init code and create some infrastructure
to allow easy adding of hooks to SoC-specific data in future patches.

Signed-off-by: Mark A. Greer <[email protected]>
---
 arch/arm/mach-davinci/Makefile              |    2 +-
 arch/arm/mach-davinci/board-dm355-evm.c     |    2 +-
 arch/arm/mach-davinci/board-dm644x-evm.c    |    2 +-
 arch/arm/mach-davinci/board-dm646x-evm.c    |    2 +-
 arch/arm/mach-davinci/board-sffsdr.c        |    2 +-
 arch/arm/mach-davinci/common.c              |   56 +++++++++++++++++++++++++++
 arch/arm/mach-davinci/dm355.c               |   12 +++--
 arch/arm/mach-davinci/dm644x.c              |   13 +++---
 arch/arm/mach-davinci/dm646x.c              |   12 +++--
 arch/arm/mach-davinci/include/mach/common.h |   20 +++++++++
 10 files changed, 102 insertions(+), 21 deletions(-)
 create mode 100644 arch/arm/mach-davinci/common.c

diff --git a/arch/arm/mach-davinci/Makefile b/arch/arm/mach-davinci/Makefile
index 6783681..9822a78 100644
--- a/arch/arm/mach-davinci/Makefile
+++ b/arch/arm/mach-davinci/Makefile
@@ -5,7 +5,7 @@
 
 # Common objects
 obj-y                  := time.o irq.o clock.o serial.o io.o id.o psc.o \
-                          gpio.o devices.o usb.o dma.o iram.o
+                          gpio.o devices.o usb.o dma.o iram.o common.o
 
 obj-$(CONFIG_DAVINCI_MUX)              += mux.o
 
diff --git a/arch/arm/mach-davinci/board-dm355-evm.c 
b/arch/arm/mach-davinci/board-dm355-evm.c
index e4327df..eb9bfb3 100644
--- a/arch/arm/mach-davinci/board-dm355-evm.c
+++ b/arch/arm/mach-davinci/board-dm355-evm.c
@@ -190,7 +190,7 @@ static struct davinci_uart_config uart_config __initdata = {
 static void __init dm355_evm_map_io(void)
 {
        davinci_map_common_io();
-       dm355_init();
+       davinci_soc_init(&davinci_soc_info_dm355);
 }
 
 static int dm355evm_mmc_get_cd(int module)
diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c 
b/arch/arm/mach-davinci/board-dm644x-evm.c
index 20ec961..53c06dc 100644
--- a/arch/arm/mach-davinci/board-dm644x-evm.c
+++ b/arch/arm/mach-davinci/board-dm644x-evm.c
@@ -591,7 +591,7 @@ static void __init
 davinci_evm_map_io(void)
 {
        davinci_map_common_io();
-       dm644x_init();
+       davinci_soc_init(&davinci_soc_info_dm644x);
 }
 
 static int davinci_phy_fixup(struct phy_device *phydev)
diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c 
b/arch/arm/mach-davinci/board-dm646x-evm.c
index 907f424..bb61d8c 100644
--- a/arch/arm/mach-davinci/board-dm646x-evm.c
+++ b/arch/arm/mach-davinci/board-dm646x-evm.c
@@ -116,7 +116,7 @@ static void __init evm_init_i2c(void)
 static void __init davinci_map_io(void)
 {
        davinci_map_common_io();
-       dm646x_init();
+       davinci_soc_init(&davinci_soc_info_dm646x);
 }
 
 static __init void evm_init(void)
diff --git a/arch/arm/mach-davinci/board-sffsdr.c 
b/arch/arm/mach-davinci/board-sffsdr.c
index 0d83cb0..db408f0 100644
--- a/arch/arm/mach-davinci/board-sffsdr.c
+++ b/arch/arm/mach-davinci/board-sffsdr.c
@@ -148,7 +148,7 @@ static struct davinci_uart_config uart_config __initdata = {
 static void __init davinci_sffsdr_map_io(void)
 {
        davinci_map_common_io();
-       dm644x_init();
+       davinci_soc_init(&davinci_soc_info_dm644x);
 }
 
 static __init void davinci_sffsdr_init(void)
diff --git a/arch/arm/mach-davinci/common.c b/arch/arm/mach-davinci/common.c
new file mode 100644
index 0000000..2f4d375
--- /dev/null
+++ b/arch/arm/mach-davinci/common.c
@@ -0,0 +1,56 @@
+/*
+ * Code commons to all DaVinci SoCs.
+ *
+ * Author: Mark A. Greer <[email protected]>
+ *
+ * 2009 (c) MontaVista Software, Inc. This file is licensed under
+ * the terms of the GNU General Public License version 2. This program
+ * is licensed "as is" without any warranty of any kind, whether express
+ * or implied.
+ */
+#include <linux/bootmem.h>
+
+#include <mach/clock.h>
+#include <mach/mux.h>
+#include <mach/common.h>
+
+struct davinci_soc_info *davinci_soc_info;
+
+int __init davinci_soc_init(struct davinci_soc_info *soc_info)
+{
+       int ret;
+
+       if (!soc_info) {
+               ret = -EINVAL;
+               goto err;
+       }
+
+       davinci_soc_info = alloc_bootmem_low(sizeof(struct davinci_soc_info));
+       if (!davinci_soc_info) {
+               ret = -ENOMEM;
+               goto err;
+       }
+
+       memcpy(davinci_soc_info, soc_info, sizeof(struct davinci_soc_info));
+
+       if (davinci_soc_info->cpu_clks) {
+               ret = davinci_clk_init(davinci_soc_info->cpu_clks);
+
+               if (ret != 0)
+                       goto err;
+       }
+
+       if (davinci_soc_info->mux_pins_num > 0) {
+               ret = davinci_mux_register(davinci_soc_info->mux_pins,
+                               davinci_soc_info->mux_pins_num);
+
+               if (ret != 0)
+                       goto err;
+       }
+
+       return 0;
+
+err:
+       printk(KERN_ERR "DaVinci SoC init failed\n");
+       return ret;
+}
diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c
index 0a9cd98..4f72cfe 100644
--- a/arch/arm/mach-davinci/dm355.c
+++ b/arch/arm/mach-davinci/dm355.c
@@ -25,6 +25,8 @@
 #include "clock.h"
 #include "mux.h"
 
+#include <mach/common.h>
+
 /*
  * Device specific clocks
  */
@@ -463,8 +465,8 @@ EVT_CFG(DM355,  EVT9_ASP1_RX,             1,    1,    0,    
 false)
 EVT_CFG(DM355,  EVT26_MMC0_RX,       2,    1,    0,     false)
 };
 
-void __init dm355_init(void)
-{
-       davinci_clk_init(dm355_clks);
-       davinci_mux_register(dm355_pins, ARRAY_SIZE(dm355_pins));;
-}
+DAVINCI_SOC_START(dm355)
+       .cpu_clks       = dm355_clks,
+       .mux_pins       = dm355_pins,
+       .mux_pins_num   = ARRAY_SIZE(dm355_pins),
+DAVINCI_SOC_END
diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c
index 7251b82..db22c20 100644
--- a/arch/arm/mach-davinci/dm644x.c
+++ b/arch/arm/mach-davinci/dm644x.c
@@ -20,6 +20,8 @@
 #include "clock.h"
 #include "mux.h"
 
+#include <mach/common.h>
+
 /*
  * Device specific clocks
  */
@@ -355,9 +357,8 @@ MUX_CFG(DM644X, LOEEN,              0,   24,    1,    1,    
 true)
 MUX_CFG(DM644X, LFLDEN,                0,   25,    1,    1,     false)
 };
 
-
-void __init dm644x_init(void)
-{
-       davinci_clk_init(dm644x_clks);
-       davinci_mux_register(dm644x_pins, ARRAY_SIZE(dm644x_pins));
-}
+DAVINCI_SOC_START(dm644x)
+       .cpu_clks       = dm644x_clks,
+       .mux_pins       = dm644x_pins,
+       .mux_pins_num   = ARRAY_SIZE(dm644x_pins),
+DAVINCI_SOC_END
diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c
index 099443a..b84a3f2 100644
--- a/arch/arm/mach-davinci/dm646x.c
+++ b/arch/arm/mach-davinci/dm646x.c
@@ -20,6 +20,8 @@
 #include "clock.h"
 #include "mux.h"
 
+#include <mach/common.h>
+
 /*
  * Device specific clocks
  */
@@ -266,8 +268,8 @@ MUX_CFG(DM646X, AUDCK1,             0,   29,    1,    0,    
 false)
 MUX_CFG(DM646X, AUDCK0,                0,   28,    1,    0,     false)
 };
 
-void __init dm646x_init(void)
-{
-       davinci_clk_init(dm646x_clks);
-       davinci_mux_register(dm646x_pins, ARRAY_SIZE(dm646x_pins));
-}
+DAVINCI_SOC_START(dm646x)
+       .cpu_clks       = dm646x_clks,
+       .mux_pins       = dm646x_pins,
+       .mux_pins_num   = ARRAY_SIZE(dm646x_pins),
+DAVINCI_SOC_END
diff --git a/arch/arm/mach-davinci/include/mach/common.h 
b/arch/arm/mach-davinci/include/mach/common.h
index 1917709..4d9eb11 100644
--- a/arch/arm/mach-davinci/include/mach/common.h
+++ b/arch/arm/mach-davinci/include/mach/common.h
@@ -25,4 +25,24 @@ extern void setup_usb(unsigned mA, unsigned potpgt_msec);
 /* parameters describe VBUS sourcing for host mode */
 extern void setup_usb(unsigned mA, unsigned potpgt_msec);
 
+/* SoC specific init support */
+struct davinci_soc_info {
+       struct clk **cpu_clks;
+       const struct mux_config *mux_pins;
+       unsigned long mux_pins_num;
+};
+
+#define DAVINCI_SOC_START(_name)                                       \
+struct davinci_soc_info davinci_soc_info_##_name __initdata = {
+
+#define DAVINCI_SOC_END                                                        
\
+};
+
+extern struct davinci_soc_info davinci_soc_info_dm644x;
+extern struct davinci_soc_info davinci_soc_info_dm646x;
+extern struct davinci_soc_info davinci_soc_info_dm355;
+
+extern int davinci_soc_init(struct davinci_soc_info *soc_info);
+extern struct davinci_soc_info *davinci_soc_info;
+
 #endif /* __ARCH_ARM_MACH_DAVINCI_COMMON_H */
-- 
1.6.0.3


_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to