From: "Mark A. Greer" <[email protected]> Create a structure to encapsulate SoC-specific information. This will assist in generalizing code so it can be used by different SoCs that have similar hardware but with minor differences such as having a different base address. The global 'davinci_soc_info' will point to that structure.
The idea is that the code for each SoC fills out the structure with the correct information. The board-specific code can then modify anything in that structure before calling a common init routine that sets 'davinci_soc_info', maps in I/O regions, etc. This structure will be extended in subsequent patches but initially, it holds the map_desc structure for any I/O regions the SoC/board wants statically mapped. Signed-off-by: Mark A. Greer <[email protected]> --- arch/arm/mach-davinci/Makefile | 2 +- arch/arm/mach-davinci/board-dm355-evm.c | 7 +++- arch/arm/mach-davinci/board-dm644x-evm.c | 7 +++- arch/arm/mach-davinci/board-dm646x-evm.c | 7 +++- arch/arm/mach-davinci/board-sffsdr.c | 7 +++- arch/arm/mach-davinci/common.c | 54 +++++++++++++++++++++++++++ arch/arm/mach-davinci/dm355.c | 22 +++++++++++ arch/arm/mach-davinci/dm644x.c | 22 +++++++++++ arch/arm/mach-davinci/dm646x.c | 22 +++++++++++ arch/arm/mach-davinci/include/mach/common.h | 11 +++++- arch/arm/mach-davinci/include/mach/dm355.h | 1 + arch/arm/mach-davinci/include/mach/dm644x.h | 1 + arch/arm/mach-davinci/include/mach/dm646x.h | 1 + arch/arm/mach-davinci/io.c | 39 ------------------- 14 files changed, 158 insertions(+), 45 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 370a507..ca2ceef 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 c2cf531..05601c4 100644 --- a/arch/arm/mach-davinci/board-dm355-evm.c +++ b/arch/arm/mach-davinci/board-dm355-evm.c @@ -38,6 +38,7 @@ #include <mach/serial.h> #include <mach/nand.h> #include <mach/mmc.h> +#include <mach/common.h> #define DAVINCI_ASYNC_EMIF_CONTROL_BASE 0x01e10000 #define DAVINCI_ASYNC_EMIF_DATA_CE0_BASE 0x02000000 @@ -189,7 +190,11 @@ static struct davinci_uart_config uart_config __initdata = { static void __init dm355_evm_map_io(void) { - davinci_map_common_io(); + struct davinci_soc_info *soc_info; + + soc_info = dm355_get_soc_info(); + davinci_common_init(soc_info); + dm355_init(); } diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c index 49e253f..6b716b0 100644 --- a/arch/arm/mach-davinci/board-dm644x-evm.c +++ b/arch/arm/mach-davinci/board-dm644x-evm.c @@ -44,6 +44,7 @@ #include <mach/psc.h> #include <mach/nand.h> #include <mach/mmc.h> +#include <mach/common.h> #define DM644X_EVM_PHY_MASK (0x2) #define DM644X_EVM_MDIO_FREQUENCY (2200000) /* PHY bus frequency */ @@ -599,7 +600,11 @@ static struct davinci_uart_config uart_config __initdata = { static void __init davinci_evm_map_io(void) { - davinci_map_common_io(); + struct davinci_soc_info *soc_info; + + soc_info = dm644x_get_soc_info(); + davinci_common_init(soc_info); + dm644x_init(); } diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c index a300d5d..5761857 100644 --- a/arch/arm/mach-davinci/board-dm646x-evm.c +++ b/arch/arm/mach-davinci/board-dm646x-evm.c @@ -39,6 +39,7 @@ #include <mach/serial.h> #include <mach/i2c.h> #include <mach/mmc.h> +#include <mach/common.h> #include <linux/platform_device.h> #include <linux/i2c.h> @@ -123,7 +124,11 @@ static void __init evm_init_i2c(void) static void __init davinci_map_io(void) { - davinci_map_common_io(); + struct davinci_soc_info *soc_info; + + soc_info = dm646x_get_soc_info(); + davinci_common_init(soc_info); + dm646x_init(); } diff --git a/arch/arm/mach-davinci/board-sffsdr.c b/arch/arm/mach-davinci/board-sffsdr.c index 2589b0e..33621c4 100644 --- a/arch/arm/mach-davinci/board-sffsdr.c +++ b/arch/arm/mach-davinci/board-sffsdr.c @@ -53,6 +53,7 @@ #include <mach/serial.h> #include <mach/psc.h> #include <mach/mux.h> +#include <mach/common.h> #define SFFSDR_PHY_MASK (0x2) #define SFFSDR_MDIO_FREQUENCY (2200000) /* PHY bus frequency */ @@ -155,7 +156,11 @@ static struct davinci_uart_config uart_config __initdata = { static void __init davinci_sffsdr_map_io(void) { - davinci_map_common_io(); + struct davinci_soc_info *soc_info; + + soc_info = dm644x_get_soc_info(); + davinci_common_init(soc_info); + dm644x_init(); } diff --git a/arch/arm/mach-davinci/common.c b/arch/arm/mach-davinci/common.c new file mode 100644 index 0000000..e2d035a --- /dev/null +++ b/arch/arm/mach-davinci/common.c @@ -0,0 +1,54 @@ +/* + * 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/module.h> +#include <linux/io.h> + +#include <asm/tlb.h> +#include <asm/mach/map.h> + +#include <mach/common.h> + +struct davinci_soc_info *davinci_soc_info; +EXPORT_SYMBOL(davinci_soc_info); + +int __init davinci_common_init(struct davinci_soc_info *soc_info) +{ + int ret; + + if (!soc_info) { + ret = -EINVAL; + goto err; + } + + davinci_soc_info = soc_info; + + if (davinci_soc_info->io_desc && (davinci_soc_info->io_desc_num > 0)) + iotable_init(davinci_soc_info->io_desc, + davinci_soc_info->io_desc_num); + + /* Normally devicemaps_init() would flush caches and tlb after + * mdesc->map_io(), but we must also do it here because of the CPU + * revision check below. + */ + local_flush_tlb_all(); + flush_cache_all(); + + /* We want to check CPU revision early for cpu_is_xxxx() macros. + * IO space mapping must be initialized before we can do that. + */ + davinci_check_revision(); + + 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 5f31649..f454e24 100644 --- a/arch/arm/mach-davinci/dm355.c +++ b/arch/arm/mach-davinci/dm355.c @@ -16,6 +16,8 @@ #include <linux/spi/spi.h> +#include <asm/mach/map.h> + #include <mach/dm355.h> #include <mach/clock.h> #include <mach/cpu.h> @@ -23,6 +25,7 @@ #include <mach/psc.h> #include <mach/mux.h> #include <mach/irqs.h> +#include <mach/common.h> #include "clock.h" #include "mux.h" @@ -522,6 +525,25 @@ static struct platform_device dm355_edma_device = { /*----------------------------------------------------------------------*/ +static struct map_desc dm355_io_desc[] = { + { + .virtual = IO_VIRT, + .pfn = __phys_to_pfn(IO_PHYS), + .length = IO_SIZE, + .type = MT_DEVICE + }, +}; + +static struct davinci_soc_info davinci_soc_info_dm355 = { + .io_desc = dm355_io_desc, + .io_desc_num = ARRAY_SIZE(dm355_io_desc), +}; + +struct davinci_soc_info *dm355_get_soc_info(void) +{ + return &davinci_soc_info_dm355; +} + void __init dm355_init(void) { davinci_clk_init(dm355_clks); diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c index 6a08568..ecfcdb2 100644 --- a/arch/arm/mach-davinci/dm644x.c +++ b/arch/arm/mach-davinci/dm644x.c @@ -13,6 +13,8 @@ #include <linux/clk.h> #include <linux/platform_device.h> +#include <asm/mach/map.h> + #include <mach/dm644x.h> #include <mach/clock.h> #include <mach/cpu.h> @@ -20,6 +22,7 @@ #include <mach/irqs.h> #include <mach/psc.h> #include <mach/mux.h> +#include <mach/common.h> #include "clock.h" #include "mux.h" @@ -463,6 +466,25 @@ void dm644x_init_emac(struct emac_platform_data *unused) {} #endif +static struct map_desc dm644x_io_desc[] = { + { + .virtual = IO_VIRT, + .pfn = __phys_to_pfn(IO_PHYS), + .length = IO_SIZE, + .type = MT_DEVICE + }, +}; + +static struct davinci_soc_info davinci_soc_info_dm644x = { + .io_desc = dm644x_io_desc, + .io_desc_num = ARRAY_SIZE(dm644x_io_desc), +}; + +struct davinci_soc_info *dm644x_get_soc_info(void) +{ + return &davinci_soc_info_dm644x; +} + void __init dm644x_init(void) { davinci_clk_init(dm644x_clks); diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c index b302f12..8c7d2e7 100644 --- a/arch/arm/mach-davinci/dm646x.c +++ b/arch/arm/mach-davinci/dm646x.c @@ -13,6 +13,8 @@ #include <linux/clk.h> #include <linux/platform_device.h> +#include <asm/mach/map.h> + #include <mach/dm646x.h> #include <mach/clock.h> #include <mach/cpu.h> @@ -20,6 +22,7 @@ #include <mach/irqs.h> #include <mach/psc.h> #include <mach/mux.h> +#include <mach/common.h> #include "clock.h" #include "mux.h" @@ -442,6 +445,25 @@ void dm646x_init_emac(struct emac_platform_data *unused) {} #endif +static struct map_desc dm646x_io_desc[] = { + { + .virtual = IO_VIRT, + .pfn = __phys_to_pfn(IO_PHYS), + .length = IO_SIZE, + .type = MT_DEVICE + }, +}; + +static struct davinci_soc_info davinci_soc_info_dm646x = { + .io_desc = dm646x_io_desc, + .io_desc_num = ARRAY_SIZE(dm646x_io_desc), +}; + +struct davinci_soc_info *dm646x_get_soc_info(void) +{ + return &davinci_soc_info_dm646x; +} + void __init dm646x_init(void) { davinci_clk_init(dm646x_clks); diff --git a/arch/arm/mach-davinci/include/mach/common.h b/arch/arm/mach-davinci/include/mach/common.h index 1917709..a754365 100644 --- a/arch/arm/mach-davinci/include/mach/common.h +++ b/arch/arm/mach-davinci/include/mach/common.h @@ -17,7 +17,6 @@ struct sys_timer; extern struct sys_timer davinci_timer; extern void davinci_irq_init(void); -extern void davinci_map_common_io(void); /* parameters describe VBUS sourcing for host mode */ extern void setup_usb(unsigned mA, unsigned potpgt_msec); @@ -25,4 +24,14 @@ 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 map_desc *io_desc; + unsigned long io_desc_num; +}; + +extern struct davinci_soc_info *davinci_soc_info; +extern int davinci_common_init(struct davinci_soc_info *soc_info); +extern void davinci_check_revision(void); + #endif /* __ARCH_ARM_MACH_DAVINCI_COMMON_H */ diff --git a/arch/arm/mach-davinci/include/mach/dm355.h b/arch/arm/mach-davinci/include/mach/dm355.h index f7100b6..65300c5 100644 --- a/arch/arm/mach-davinci/include/mach/dm355.h +++ b/arch/arm/mach-davinci/include/mach/dm355.h @@ -14,6 +14,7 @@ #include <mach/hardware.h> void __init dm355_init(void); +struct davinci_soc_info *dm355_get_soc_info(void); struct spi_board_info; diff --git a/arch/arm/mach-davinci/include/mach/dm644x.h b/arch/arm/mach-davinci/include/mach/dm644x.h index ace167a..3f7347e 100644 --- a/arch/arm/mach-davinci/include/mach/dm644x.h +++ b/arch/arm/mach-davinci/include/mach/dm644x.h @@ -34,6 +34,7 @@ #define DM644X_EMAC_CNTRL_RAM_SIZE (0x2000) void __init dm644x_init(void); +struct davinci_soc_info *dm644x_get_soc_info(void); void dm644x_init_emac(struct emac_platform_data *pdata); #endif /* __ASM_ARCH_DM644X_H */ diff --git a/arch/arm/mach-davinci/include/mach/dm646x.h b/arch/arm/mach-davinci/include/mach/dm646x.h index 02ce872..23316aa 100644 --- a/arch/arm/mach-davinci/include/mach/dm646x.h +++ b/arch/arm/mach-davinci/include/mach/dm646x.h @@ -23,6 +23,7 @@ #define DM646X_EMAC_CNTRL_RAM_SIZE (0x2000) void __init dm646x_init(void); +struct davinci_soc_info *dm646x_get_soc_info(void); void dm646x_init_emac(struct emac_platform_data *pdata); #endif /* __ASM_ARCH_DM646X_H */ diff --git a/arch/arm/mach-davinci/io.c b/arch/arm/mach-davinci/io.c index 5f77af7..49912b4 100644 --- a/arch/arm/mach-davinci/io.c +++ b/arch/arm/mach-davinci/io.c @@ -9,48 +9,9 @@ */ #include <linux/module.h> -#include <linux/kernel.h> -#include <linux/init.h> #include <linux/io.h> #include <asm/tlb.h> -#include <asm/memory.h> - -#include <asm/mach/map.h> -#include <mach/clock.h> -#include <mach/mux.h> - -extern void davinci_check_revision(void); - -/* - * The machine specific code may provide the extra mapping besides the - * default mapping provided here. - */ -static struct map_desc davinci_io_desc[] __initdata = { - { - .virtual = IO_VIRT, - .pfn = __phys_to_pfn(IO_PHYS), - .length = IO_SIZE, - .type = MT_DEVICE - }, -}; - -void __init davinci_map_common_io(void) -{ - iotable_init(davinci_io_desc, ARRAY_SIZE(davinci_io_desc)); - - /* Normally devicemaps_init() would flush caches and tlb after - * mdesc->map_io(), but we must also do it here because of the CPU - * revision check below. - */ - local_flush_tlb_all(); - flush_cache_all(); - - /* We want to check CPU revision early for cpu_is_xxxx() macros. - * IO space mapping must be initialized before we can do that. - */ - davinci_check_revision(); -} #define BETWEEN(p, st, sz) ((p) >= (st) && (p) < ((st) + (sz))) #define XLATE(p, pst, vst) ((void __iomem *)((p) - (pst) + (vst))) -- 1.6.0.3 _______________________________________________ Davinci-linux-open-source mailing list [email protected] http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
