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
