diff options
Diffstat (limited to 'arch/arm/mach-integrator/integrator_cp.c')
| -rw-r--r-- | arch/arm/mach-integrator/integrator_cp.c | 238 | 
1 files changed, 23 insertions, 215 deletions
diff --git a/arch/arm/mach-integrator/integrator_cp.c b/arch/arm/mach-integrator/integrator_cp.c index 8c60fcb08a9..0e57f8f820a 100644 --- a/arch/arm/mach-integrator/integrator_cp.c +++ b/arch/arm/mach-integrator/integrator_cp.c @@ -23,33 +23,23 @@  #include <linux/irqchip/versatile-fpga.h>  #include <linux/gfp.h>  #include <linux/mtd/physmap.h> -#include <linux/platform_data/clk-integrator.h>  #include <linux/of_irq.h>  #include <linux/of_address.h>  #include <linux/of_platform.h>  #include <linux/sys_soc.h> +#include <linux/sched_clock.h> -#include <mach/hardware.h> -#include <mach/platform.h>  #include <asm/setup.h>  #include <asm/mach-types.h> -#include <asm/hardware/arm_timer.h> -#include <asm/hardware/icst.h> - -#include <mach/cm.h> -#include <mach/lm.h> -#include <mach/irqs.h> -  #include <asm/mach/arch.h>  #include <asm/mach/irq.h>  #include <asm/mach/map.h>  #include <asm/mach/time.h> -#include <asm/hardware/timer-sp.h> -  #include <plat/clcd.h> -#include <plat/sched_clock.h> +#include "hardware.h" +#include "cm.h"  #include "common.h"  /* Base address to the CP controller */ @@ -66,8 +56,6 @@ static void __iomem *intcp_con_base;  /*   * Logical      Physical   * f1000000	10000000	Core module registers - * f1100000	11000000	System controller registers - * f1200000	12000000	EBI registers   * f1300000	13000000	Counter/Timer   * f1400000	14000000	Interrupt controller   * f1600000	16000000	UART 0 @@ -75,7 +63,6 @@ static void __iomem *intcp_con_base;   * f1a00000	1a000000	Debug LEDs   * fc900000	c9000000	GPIO   * fca00000	ca000000	SIC - * fcb00000	cb000000	CP system control   */  static struct map_desc intcp_io_desc[] __initdata __maybe_unused = { @@ -85,11 +72,6 @@ static struct map_desc intcp_io_desc[] __initdata __maybe_unused = {  		.length		= SZ_4K,  		.type		= MT_DEVICE  	}, { -		.virtual	= IO_ADDRESS(INTEGRATOR_EBI_BASE), -		.pfn		= __phys_to_pfn(INTEGRATOR_EBI_BASE), -		.length		= SZ_4K, -		.type		= MT_DEVICE -	}, {  		.virtual	= IO_ADDRESS(INTEGRATOR_CT_BASE),  		.pfn		= __phys_to_pfn(INTEGRATOR_CT_BASE),  		.length		= SZ_4K, @@ -199,7 +181,8 @@ static struct mmci_platform_data mmc_data = {  static void cp_clcd_enable(struct clcd_fb *fb)  {  	struct fb_var_screeninfo *var = &fb->fb.var; -	u32 val = CM_CTRL_STATIC1 | CM_CTRL_STATIC2; +	u32 val = CM_CTRL_STATIC1 | CM_CTRL_STATIC2 +			| CM_CTRL_LCDEN0 | CM_CTRL_LCDEN1;  	if (var->bits_per_pixel <= 8 ||  	    (var->bits_per_pixel == 16 && var->green.length == 5)) @@ -242,14 +225,16 @@ static struct clcd_board clcd_data = {  #define REFCOUNTER (__io_address(INTEGRATOR_HDR_BASE) + 0x28) +static u64 notrace intcp_read_sched_clock(void) +{ +	return readl(REFCOUNTER); +} +  static void __init intcp_init_early(void)  { -#ifdef CONFIG_PLAT_VERSATILE_SCHED_CLOCK -	versatile_sched_clock_init(REFCOUNTER, 24000000); -#endif +	sched_clock_register(intcp_read_sched_clock, 32, 24000000);  } -#ifdef CONFIG_OF  static const struct of_device_id fpga_irq_of_match[] __initconst = {  	{ .compatible = "arm,versatile-fpga-irq", .data = fpga_irq_of_init, },  	{ /* Sentinel */ } @@ -257,8 +242,8 @@ static const struct of_device_id fpga_irq_of_match[] __initconst = {  static void __init intcp_init_irq_of(void)  { +	cm_init();  	of_irq_init(fpga_irq_of_match); -	integrator_clk_init(true);  }  /* @@ -287,21 +272,20 @@ static struct of_dev_auxdata intcp_auxdata_lookup[] __initdata = {  	{ /* sentinel */ },  }; +static const struct of_device_id intcp_syscon_match[] = { +	{ .compatible = "arm,integrator-cp-syscon"}, +	{ }, +}; +  static void __init intcp_init_of(void)  { -	struct device_node *root;  	struct device_node *cpcon;  	struct device *parent;  	struct soc_device *soc_dev;  	struct soc_device_attribute *soc_dev_attr;  	u32 intcp_sc_id; -	int err; -	/* Here we create an SoC device for the root node */ -	root = of_find_node_by_path("/"); -	if (!root) -		return; -	cpcon = of_find_node_by_path("/cpcon"); +	cpcon = of_find_matching_node(NULL, intcp_syscon_match);  	if (!cpcon)  		return; @@ -309,19 +293,17 @@ static void __init intcp_init_of(void)  	if (!intcp_con_base)  		return; +	of_platform_populate(NULL, of_default_bus_match_table, +			     intcp_auxdata_lookup, NULL); +  	intcp_sc_id = readl(intcp_con_base);  	soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);  	if (!soc_dev_attr)  		return; -	err = of_property_read_string(root, "compatible", -				      &soc_dev_attr->soc_id); -	if (err) -		return; -	err = of_property_read_string(root, "model", &soc_dev_attr->machine); -	if (err) -		return; +	soc_dev_attr->soc_id = "XCV"; +	soc_dev_attr->machine = "Integrator/CP";  	soc_dev_attr->family = "Integrator";  	soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%c",  					   'A' + (intcp_sc_id & 0x0f)); @@ -335,8 +317,6 @@ static void __init intcp_init_of(void)  	parent = soc_device_to_device(soc_dev);  	integrator_init_sysfs(parent, intcp_sc_id); -	of_platform_populate(root, of_default_bus_match_table, -			intcp_auxdata_lookup, parent);  }  static const char * intcp_dt_board_compat[] = { @@ -354,175 +334,3 @@ DT_MACHINE_START(INTEGRATOR_CP_DT, "ARM Integrator/CP (Device Tree)")  	.restart	= integrator_restart,  	.dt_compat      = intcp_dt_board_compat,  MACHINE_END - -#endif - -#ifdef CONFIG_ATAGS - -/* - * For the ATAG boot some static mappings are needed. This will - * go away with the ATAG support down the road. - */ - -static struct map_desc intcp_io_desc_atag[] __initdata = { -	{ -		.virtual	= IO_ADDRESS(INTEGRATOR_CP_CTL_BASE), -		.pfn		= __phys_to_pfn(INTEGRATOR_CP_CTL_BASE), -		.length		= SZ_4K, -		.type		= MT_DEVICE -	}, -}; - -static void __init intcp_map_io_atag(void) -{ -	iotable_init(intcp_io_desc_atag, ARRAY_SIZE(intcp_io_desc_atag)); -	intcp_con_base = __io_address(INTEGRATOR_CP_CTL_BASE); -	intcp_map_io(); -} - - -/* - * This is where non-devicetree initialization code is collected and stashed - * for eventual deletion. - */ - -#define INTCP_FLASH_SIZE		SZ_32M - -static struct resource intcp_flash_resource = { -	.start		= INTCP_PA_FLASH_BASE, -	.end		= INTCP_PA_FLASH_BASE + INTCP_FLASH_SIZE - 1, -	.flags		= IORESOURCE_MEM, -}; - -static struct platform_device intcp_flash_device = { -	.name		= "physmap-flash", -	.id		= 0, -	.dev		= { -		.platform_data	= &intcp_flash_data, -	}, -	.num_resources	= 1, -	.resource	= &intcp_flash_resource, -}; - -#define INTCP_ETH_SIZE			0x10 - -static struct resource smc91x_resources[] = { -	[0] = { -		.start	= INTEGRATOR_CP_ETH_BASE, -		.end	= INTEGRATOR_CP_ETH_BASE + INTCP_ETH_SIZE - 1, -		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.start	= IRQ_CP_ETHINT, -		.end	= IRQ_CP_ETHINT, -		.flags	= IORESOURCE_IRQ, -	}, -}; - -static struct platform_device smc91x_device = { -	.name		= "smc91x", -	.id		= 0, -	.num_resources	= ARRAY_SIZE(smc91x_resources), -	.resource	= smc91x_resources, -}; - -static struct platform_device *intcp_devs[] __initdata = { -	&intcp_flash_device, -	&smc91x_device, -}; - -#define INTCP_VA_CIC_BASE		__io_address(INTEGRATOR_HDR_BASE + 0x40) -#define INTCP_VA_PIC_BASE		__io_address(INTEGRATOR_IC_BASE) -#define INTCP_VA_SIC_BASE		__io_address(INTEGRATOR_CP_SIC_BASE) - -static void __init intcp_init_irq(void) -{ -	u32 pic_mask, cic_mask, sic_mask; - -	/* These masks are for the HW IRQ registers */ -	pic_mask = ~((~0u) << (11 - 0)); -	pic_mask |= (~((~0u) << (29 - 22))) << 22; -	cic_mask = ~((~0u) << (1 + IRQ_CIC_END - IRQ_CIC_START)); -	sic_mask = ~((~0u) << (1 + IRQ_SIC_END - IRQ_SIC_START)); - -	/* -	 * Disable all interrupt sources -	 */ -	writel(0xffffffff, INTCP_VA_PIC_BASE + IRQ_ENABLE_CLEAR); -	writel(0xffffffff, INTCP_VA_PIC_BASE + FIQ_ENABLE_CLEAR); -	writel(0xffffffff, INTCP_VA_CIC_BASE + IRQ_ENABLE_CLEAR); -	writel(0xffffffff, INTCP_VA_CIC_BASE + FIQ_ENABLE_CLEAR); -	writel(sic_mask, INTCP_VA_SIC_BASE + IRQ_ENABLE_CLEAR); -	writel(sic_mask, INTCP_VA_SIC_BASE + FIQ_ENABLE_CLEAR); - -	fpga_irq_init(INTCP_VA_PIC_BASE, "PIC", IRQ_PIC_START, -		      -1, pic_mask, NULL); - -	fpga_irq_init(INTCP_VA_CIC_BASE, "CIC", IRQ_CIC_START, -		      -1, cic_mask, NULL); - -	fpga_irq_init(INTCP_VA_SIC_BASE, "SIC", IRQ_SIC_START, -		      IRQ_CP_CPPLDINT, sic_mask, NULL); - -	integrator_clk_init(true); -} - -#define TIMER0_VA_BASE __io_address(INTEGRATOR_TIMER0_BASE) -#define TIMER1_VA_BASE __io_address(INTEGRATOR_TIMER1_BASE) -#define TIMER2_VA_BASE __io_address(INTEGRATOR_TIMER2_BASE) - -static void __init cp_timer_init(void) -{ -	writel(0, TIMER0_VA_BASE + TIMER_CTRL); -	writel(0, TIMER1_VA_BASE + TIMER_CTRL); -	writel(0, TIMER2_VA_BASE + TIMER_CTRL); - -	sp804_clocksource_init(TIMER2_VA_BASE, "timer2"); -	sp804_clockevents_init(TIMER1_VA_BASE, IRQ_TIMERINT1, "timer1"); -} - -#define INTEGRATOR_CP_MMC_IRQS	{ IRQ_CP_MMCIINT0, IRQ_CP_MMCIINT1 } -#define INTEGRATOR_CP_AACI_IRQS	{ IRQ_CP_AACIINT } - -static AMBA_APB_DEVICE(mmc, "mmci", 0, INTEGRATOR_CP_MMC_BASE, -	INTEGRATOR_CP_MMC_IRQS, &mmc_data); - -static AMBA_APB_DEVICE(aaci, "aaci", 0, INTEGRATOR_CP_AACI_BASE, -	INTEGRATOR_CP_AACI_IRQS, NULL); - -static AMBA_AHB_DEVICE(clcd, "clcd", 0, INTCP_PA_CLCD_BASE, -	{ IRQ_CP_CLCDCINT }, &clcd_data); - -static struct amba_device *amba_devs[] __initdata = { -	&mmc_device, -	&aaci_device, -	&clcd_device, -}; - -static void __init intcp_init(void) -{ -	int i; - -	platform_add_devices(intcp_devs, ARRAY_SIZE(intcp_devs)); - -	for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { -		struct amba_device *d = amba_devs[i]; -		amba_device_register(d, &iomem_resource); -	} -	integrator_init(true); -} - -MACHINE_START(CINTEGRATOR, "ARM-IntegratorCP") -	/* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ -	.atag_offset	= 0x100, -	.reserve	= integrator_reserve, -	.map_io		= intcp_map_io_atag, -	.init_early	= intcp_init_early, -	.init_irq	= intcp_init_irq, -	.handle_irq	= fpga_handle_irq, -	.init_time	= cp_timer_init, -	.init_machine	= intcp_init, -	.restart	= integrator_restart, -MACHINE_END - -#endif  | 
