diff options
Diffstat (limited to 'arch/arm/mach-at91')
76 files changed, 377 insertions, 491 deletions
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig index 043624219b5..e34c1bdb804 100644 --- a/arch/arm/mach-at91/Kconfig +++ b/arch/arm/mach-at91/Kconfig @@ -494,8 +494,17 @@ endif  comment "Generic Board Type" +config MACH_AT91RM9200_DT +	bool "Atmel AT91RM9200 Evaluation Kits with device-tree support" +	depends on SOC_AT91RM9200 +	select USE_OF +	help +	  Select this if you want to experiment device-tree with +	  an Atmel RM9200 Evaluation Kit. +  config MACH_AT91SAM_DT  	bool "Atmel AT91SAM Evaluation Kits with device-tree support" +	depends on SOC_AT91SAM9  	select USE_OF  	help  	  Select this if you want to experiment device-tree with diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile index 3bb7a51efc9..b38a1dcb79b 100644 --- a/arch/arm/mach-at91/Makefile +++ b/arch/arm/mach-at91/Makefile @@ -88,6 +88,7 @@ obj-$(CONFIG_MACH_SNAPPER_9260)	+= board-snapper9260.o  obj-$(CONFIG_MACH_AT91SAM9M10G45EK) += board-sam9m10g45ek.o  # AT91SAM board with device-tree +obj-$(CONFIG_MACH_AT91RM9200_DT) += board-rm9200-dt.o  obj-$(CONFIG_MACH_AT91SAM_DT) += board-dt.o  # AT91X40 board-specific support diff --git a/arch/arm/mach-at91/include/mach/at91_aic.h b/arch/arm/mach-at91/at91_aic.h index eaea66197fa..eaea66197fa 100644 --- a/arch/arm/mach-at91/include/mach/at91_aic.h +++ b/arch/arm/mach-at91/at91_aic.h diff --git a/arch/arm/mach-at91/include/mach/at91_rstc.h b/arch/arm/mach-at91/at91_rstc.h index 875fa336800..875fa336800 100644 --- a/arch/arm/mach-at91/include/mach/at91_rstc.h +++ b/arch/arm/mach-at91/at91_rstc.h diff --git a/arch/arm/mach-at91/include/mach/at91_shdwc.h b/arch/arm/mach-at91/at91_shdwc.h index 60478ea8bd4..60478ea8bd4 100644 --- a/arch/arm/mach-at91/include/mach/at91_shdwc.h +++ b/arch/arm/mach-at91/at91_shdwc.h diff --git a/arch/arm/mach-at91/include/mach/at91_tc.h b/arch/arm/mach-at91/at91_tc.h index 46a317fd716..46a317fd716 100644 --- a/arch/arm/mach-at91/include/mach/at91_tc.h +++ b/arch/arm/mach-at91/at91_tc.h diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c index 5269825194a..8ce068240c6 100644 --- a/arch/arm/mach-at91/at91rm9200.c +++ b/arch/arm/mach-at91/at91rm9200.c @@ -17,11 +17,11 @@  #include <asm/mach/map.h>  #include <asm/system_misc.h>  #include <mach/at91rm9200.h> -#include <mach/at91_aic.h>  #include <mach/at91_pmc.h>  #include <mach/at91_st.h>  #include <mach/cpu.h> +#include "at91_aic.h"  #include "soc.h"  #include "generic.h"  #include "clock.h" @@ -194,6 +194,24 @@ static struct clk_lookup periph_clocks_lookups[] = {  	CLKDEV_CON_ID("pioB", &pioB_clk),  	CLKDEV_CON_ID("pioC", &pioC_clk),  	CLKDEV_CON_ID("pioD", &pioD_clk), +	/* usart lookup table for DT entries */ +	CLKDEV_CON_DEV_ID("usart", "fffff200.serial", &mck), +	CLKDEV_CON_DEV_ID("usart", "fffc0000.serial", &usart0_clk), +	CLKDEV_CON_DEV_ID("usart", "fffc4000.serial", &usart1_clk), +	CLKDEV_CON_DEV_ID("usart", "fffc8000.serial", &usart2_clk), +	CLKDEV_CON_DEV_ID("usart", "fffcc000.serial", &usart3_clk), +	/* tc lookup table for DT entries */ +	CLKDEV_CON_DEV_ID("t0_clk", "fffa0000.timer", &tc0_clk), +	CLKDEV_CON_DEV_ID("t1_clk", "fffa0000.timer", &tc1_clk), +	CLKDEV_CON_DEV_ID("t2_clk", "fffa0000.timer", &tc2_clk), +	CLKDEV_CON_DEV_ID("t0_clk", "fffa4000.timer", &tc3_clk), +	CLKDEV_CON_DEV_ID("t1_clk", "fffa4000.timer", &tc4_clk), +	CLKDEV_CON_DEV_ID("t2_clk", "fffa4000.timer", &tc5_clk), +	CLKDEV_CON_DEV_ID("hclk", "300000.ohci", &ohci_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioA_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioB_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioC_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioD_clk),  };  static struct clk_lookup usart_clocks_lookups[] = { @@ -361,10 +379,10 @@ static unsigned int at91rm9200_default_irq_priority[NR_AIC_IRQS] __initdata = {  	0	/* Advanced Interrupt Controller (IRQ6) */  }; -struct at91_init_soc __initdata at91rm9200_soc = { +AT91_SOC_START(rm9200)  	.map_io = at91rm9200_map_io,  	.default_irq_priority = at91rm9200_default_irq_priority,  	.ioremap_registers = at91rm9200_ioremap_registers,  	.register_clocks = at91rm9200_register_clocks,  	.init = at91rm9200_initialize, -}; +AT91_SOC_END diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c index 3cee0e6ea7c..2a1f8e67683 100644 --- a/arch/arm/mach-at91/at91rm9200_devices.c +++ b/arch/arm/mach-at91/at91rm9200_devices.c @@ -18,11 +18,11 @@  #include <linux/platform_device.h>  #include <linux/i2c-gpio.h> -#include <mach/board.h>  #include <mach/at91rm9200.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h> +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/at91rm9200_time.c b/arch/arm/mach-at91/at91rm9200_time.c index aaa443b48c9..cafe98836c8 100644 --- a/arch/arm/mach-at91/at91rm9200_time.c +++ b/arch/arm/mach-at91/at91rm9200_time.c @@ -24,6 +24,9 @@  #include <linux/irq.h>  #include <linux/clockchips.h>  #include <linux/export.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h>  #include <asm/mach/time.h> @@ -91,7 +94,8 @@ static irqreturn_t at91rm9200_timer_interrupt(int irq, void *dev_id)  static struct irqaction at91rm9200_timer_irq = {  	.name		= "at91_tick",  	.flags		= IRQF_SHARED | IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, -	.handler	= at91rm9200_timer_interrupt +	.handler	= at91rm9200_timer_interrupt, +	.irq		= NR_IRQS_LEGACY + AT91_ID_SYS,  };  static cycle_t read_clk32k(struct clocksource *cs) @@ -179,8 +183,60 @@ static struct clock_event_device clkevt = {  void __iomem *at91_st_base;  EXPORT_SYMBOL_GPL(at91_st_base); +#ifdef CONFIG_OF +static struct of_device_id at91rm9200_st_timer_ids[] = { +	{ .compatible = "atmel,at91rm9200-st" }, +	{ /* sentinel */ } +}; + +static int __init of_at91rm9200_st_init(void) +{ +	struct device_node *np; +	int ret; + +	np = of_find_matching_node(NULL, at91rm9200_st_timer_ids); +	if (!np) +		goto err; + +	at91_st_base = of_iomap(np, 0); +	if (!at91_st_base) +		goto node_err; + +	/* Get the interrupts property */ +	ret = irq_of_parse_and_map(np, 0); +	if (!ret) +		goto ioremap_err; +	at91rm9200_timer_irq.irq = ret; + +	of_node_put(np); + +	return 0; + +ioremap_err: +	iounmap(at91_st_base); +node_err: +	of_node_put(np); +err: +	return -EINVAL; +} +#else +static int __init of_at91rm9200_st_init(void) +{ +	return -EINVAL; +} +#endif +  void __init at91rm9200_ioremap_st(u32 addr)  { +#ifdef CONFIG_OF +	struct device_node *np; + +	np = of_find_matching_node(NULL, at91rm9200_st_timer_ids); +	if (np) { +		of_node_put(np); +		return; +	} +#endif  	at91_st_base = ioremap(addr, 256);  	if (!at91_st_base)  		panic("Impossible to ioremap ST\n"); @@ -191,13 +247,16 @@ void __init at91rm9200_ioremap_st(u32 addr)   */  void __init at91rm9200_timer_init(void)  { +	/* For device tree enabled device: initialize here */ +	of_at91rm9200_st_init(); +  	/* Disable all timer interrupts, and clear any pending ones */  	at91_st_write(AT91_ST_IDR,  		AT91_ST_PITS | AT91_ST_WDOVF | AT91_ST_RTTINC | AT91_ST_ALMS);  	at91_st_read(AT91_ST_SR);  	/* Make IRQs happen for the system timer */ -	setup_irq(NR_IRQS_LEGACY + AT91_ID_SYS, &at91rm9200_timer_irq); +	setup_irq(at91rm9200_timer_irq.irq, &at91rm9200_timer_irq);  	/* The 32KiHz "Slow Clock" (tick every 30517.58 nanoseconds) is used  	 * directly for the clocksource and all clockevents, after adjusting diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index f8202615f4a..c65e7b8d7a8 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c @@ -20,10 +20,10 @@  #include <mach/cpu.h>  #include <mach/at91_dbgu.h>  #include <mach/at91sam9260.h> -#include <mach/at91_aic.h>  #include <mach/at91_pmc.h> -#include <mach/at91_rstc.h> +#include "at91_aic.h" +#include "at91_rstc.h"  #include "soc.h"  #include "generic.h"  #include "clock.h" @@ -230,11 +230,15 @@ static struct clk_lookup periph_clocks_lookups[] = {  	CLKDEV_CON_DEV_ID("t1_clk", "fffdc000.timer", &tc4_clk),  	CLKDEV_CON_DEV_ID("t2_clk", "fffdc000.timer", &tc5_clk),  	CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &ohci_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "fffa8000.mmc", &mmc_clk),  	/* fake hclk clock */  	CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk),  	CLKDEV_CON_ID("pioA", &pioA_clk),  	CLKDEV_CON_ID("pioB", &pioB_clk),  	CLKDEV_CON_ID("pioC", &pioC_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioA_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioB_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioC_clk),  };  static struct clk_lookup usart_clocks_lookups[] = { @@ -390,10 +394,10 @@ static unsigned int at91sam9260_default_irq_priority[NR_AIC_IRQS] __initdata = {  	0,	/* Advanced Interrupt Controller */  }; -struct at91_init_soc __initdata at91sam9260_soc = { +AT91_SOC_START(sam9260)  	.map_io = at91sam9260_map_io,  	.default_irq_priority = at91sam9260_default_irq_priority,  	.ioremap_registers = at91sam9260_ioremap_registers,  	.register_clocks = at91sam9260_register_clocks,  	.init = at91sam9260_initialize, -}; +AT91_SOC_END diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 414bd855fb0..1f6fac21b2c 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c @@ -19,7 +19,6 @@  #include <linux/platform_data/at91_adc.h> -#include <mach/board.h>  #include <mach/cpu.h>  #include <mach/at91sam9260.h>  #include <mach/at91sam9260_matrix.h> @@ -27,6 +26,7 @@  #include <mach/at91sam9_smc.h>  #include <mach/at91_adc.h> +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c index 04295c04b3e..9d3e9b8b992 100644 --- a/arch/arm/mach-at91/at91sam9261.c +++ b/arch/arm/mach-at91/at91sam9261.c @@ -19,10 +19,10 @@  #include <asm/system_misc.h>  #include <mach/cpu.h>  #include <mach/at91sam9261.h> -#include <mach/at91_aic.h>  #include <mach/at91_pmc.h> -#include <mach/at91_rstc.h> +#include "at91_aic.h" +#include "at91_rstc.h"  #include "soc.h"  #include "generic.h"  #include "clock.h" @@ -334,10 +334,10 @@ static unsigned int at91sam9261_default_irq_priority[NR_AIC_IRQS] __initdata = {  	0,	/* Advanced Interrupt Controller */  }; -struct at91_init_soc __initdata at91sam9261_soc = { +AT91_SOC_START(sam9261)  	.map_io = at91sam9261_map_io,  	.default_irq_priority = at91sam9261_default_irq_priority,  	.ioremap_registers = at91sam9261_ioremap_registers,  	.register_clocks = at91sam9261_register_clocks,  	.init = at91sam9261_initialize, -}; +AT91_SOC_END diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index cd604aad8e9..6ce6d27e244 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c @@ -21,12 +21,12 @@  #include <linux/fb.h>  #include <video/atmel_lcdc.h> -#include <mach/board.h>  #include <mach/at91sam9261.h>  #include <mach/at91sam9261_matrix.h>  #include <mach/at91_matrix.h>  #include <mach/at91sam9_smc.h> +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c index d6f9c23927c..82deb4d748b 100644 --- a/arch/arm/mach-at91/at91sam9263.c +++ b/arch/arm/mach-at91/at91sam9263.c @@ -18,10 +18,10 @@  #include <asm/mach/map.h>  #include <asm/system_misc.h>  #include <mach/at91sam9263.h> -#include <mach/at91_aic.h>  #include <mach/at91_pmc.h> -#include <mach/at91_rstc.h> +#include "at91_aic.h" +#include "at91_rstc.h"  #include "soc.h"  #include "generic.h"  #include "clock.h" @@ -211,7 +211,14 @@ static struct clk_lookup periph_clocks_lookups[] = {  	CLKDEV_CON_DEV_ID("hclk", "a00000.ohci", &ohci_clk),  	CLKDEV_CON_DEV_ID("spi_clk", "fffa4000.spi", &spi0_clk),  	CLKDEV_CON_DEV_ID("spi_clk", "fffa8000.spi", &spi1_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "fff80000.mmc", &mmc0_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "fff84000.mmc", &mmc1_clk),  	CLKDEV_CON_DEV_ID(NULL, "fff88000.i2c", &twi_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff200.gpio", &pioA_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioB_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioCDE_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioCDE_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioCDE_clk),  };  static struct clk_lookup usart_clocks_lookups[] = { @@ -365,10 +372,10 @@ static unsigned int at91sam9263_default_irq_priority[NR_AIC_IRQS] __initdata = {  	0,	/* Advanced Interrupt Controller (IRQ1) */  }; -struct at91_init_soc __initdata at91sam9263_soc = { +AT91_SOC_START(sam9263)  	.map_io = at91sam9263_map_io,  	.default_irq_priority = at91sam9263_default_irq_priority,  	.ioremap_registers = at91sam9263_ioremap_registers,  	.register_clocks = at91sam9263_register_clocks,  	.init = at91sam9263_initialize, -}; +AT91_SOC_END diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index 9c61e59a210..fb98163b9b3 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c @@ -20,12 +20,12 @@  #include <linux/fb.h>  #include <video/atmel_lcdc.h> -#include <mach/board.h>  #include <mach/at91sam9263.h>  #include <mach/at91sam9263_matrix.h>  #include <mach/at91_matrix.h>  #include <mach/at91sam9_smc.h> +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/at91sam926x_time.c b/arch/arm/mach-at91/at91sam926x_time.c index ffc0957d762..358412f1f5f 100644 --- a/arch/arm/mach-at91/at91sam926x_time.c +++ b/arch/arm/mach-at91/at91sam926x_time.c @@ -20,8 +20,18 @@  #include <asm/mach/time.h> -#include <mach/at91_pit.h> +#define AT91_PIT_MR		0x00			/* Mode Register */ +#define		AT91_PIT_PITIEN		(1 << 25)		/* Timer Interrupt Enable */ +#define		AT91_PIT_PITEN		(1 << 24)		/* Timer Enabled */ +#define		AT91_PIT_PIV		(0xfffff)		/* Periodic Interval Value */ +#define AT91_PIT_SR		0x04			/* Status Register */ +#define		AT91_PIT_PITS		(1 << 0)		/* Timer Status */ + +#define AT91_PIT_PIVR		0x08			/* Periodic Interval Value Register */ +#define AT91_PIT_PIIR		0x0c			/* Periodic Interval Image Register */ +#define		AT91_PIT_PICNT		(0xfff << 20)		/* Interval Counter */ +#define		AT91_PIT_CPIV		(0xfffff)		/* Inverval Value */  #define PIT_CPIV(x)	((x) & AT91_PIT_CPIV)  #define PIT_PICNT(x)	(((x) & AT91_PIT_PICNT) >> 20) diff --git a/arch/arm/mach-at91/at91sam9_alt_reset.S b/arch/arm/mach-at91/at91sam9_alt_reset.S index 7af2e108b8a..f039538d3bd 100644 --- a/arch/arm/mach-at91/at91sam9_alt_reset.S +++ b/arch/arm/mach-at91/at91sam9_alt_reset.S @@ -16,7 +16,7 @@  #include <linux/linkage.h>  #include <mach/hardware.h>  #include <mach/at91_ramc.h> -#include <mach/at91_rstc.h> +#include "at91_rstc.h"  			.arm diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index b7ae124c16e..45d753d473f 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c @@ -18,10 +18,10 @@  #include <asm/mach/map.h>  #include <asm/system_misc.h>  #include <mach/at91sam9g45.h> -#include <mach/at91_aic.h>  #include <mach/at91_pmc.h>  #include <mach/cpu.h> +#include "at91_aic.h"  #include "soc.h"  #include "generic.h"  #include "clock.h" @@ -256,10 +256,18 @@ static struct clk_lookup periph_clocks_lookups[] = {  	CLKDEV_CON_DEV_ID("t0_clk", "fffd4000.timer", &tcb0_clk),  	CLKDEV_CON_DEV_ID("hclk", "700000.ohci", &uhphs_clk),  	CLKDEV_CON_DEV_ID("ehci_clk", "800000.ehci", &uhphs_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "fff80000.mmc", &mmc0_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "fffd0000.mmc", &mmc1_clk),  	CLKDEV_CON_DEV_ID(NULL, "fff84000.i2c", &twi0_clk),  	CLKDEV_CON_DEV_ID(NULL, "fff88000.i2c", &twi1_clk),  	/* fake hclk clock */  	CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff200.gpio", &pioA_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioB_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioC_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioDE_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioDE_clk), +  	CLKDEV_CON_ID("pioA", &pioA_clk),  	CLKDEV_CON_ID("pioB", &pioB_clk),  	CLKDEV_CON_ID("pioC", &pioC_clk), @@ -408,10 +416,10 @@ static unsigned int at91sam9g45_default_irq_priority[NR_AIC_IRQS] __initdata = {  	0,	/* Advanced Interrupt Controller (IRQ0) */  }; -struct at91_init_soc __initdata at91sam9g45_soc = { +AT91_SOC_START(sam9g45)  	.map_io = at91sam9g45_map_io,  	.default_irq_priority = at91sam9g45_default_irq_priority,  	.ioremap_registers = at91sam9g45_ioremap_registers,  	.register_clocks = at91sam9g45_register_clocks,  	.init = at91sam9g45_initialize, -}; +AT91_SOC_END diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index fcd233cb33d..e35964201a1 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c @@ -26,7 +26,6 @@  #include <video/atmel_lcdc.h>  #include <mach/at91_adc.h> -#include <mach/board.h>  #include <mach/at91sam9g45.h>  #include <mach/at91sam9g45_matrix.h>  #include <mach/at91_matrix.h> @@ -36,6 +35,7 @@  #include <media/atmel-isi.h> +#include "board.h"  #include "generic.h"  #include "clock.h" diff --git a/arch/arm/mach-at91/at91sam9g45_reset.S b/arch/arm/mach-at91/at91sam9g45_reset.S index 9d457182c86..721a1a34dd1 100644 --- a/arch/arm/mach-at91/at91sam9g45_reset.S +++ b/arch/arm/mach-at91/at91sam9g45_reset.S @@ -13,8 +13,7 @@  #include <linux/linkage.h>  #include <mach/hardware.h>  #include <mach/at91_ramc.h> -#include <mach/at91_rstc.h> - +#include "at91_rstc.h"  			.arm  			.globl	at91sam9g45_restart diff --git a/arch/arm/mach-at91/at91sam9n12.c b/arch/arm/mach-at91/at91sam9n12.c index 732d3d3f4ec..5dfc8fd8710 100644 --- a/arch/arm/mach-at91/at91sam9n12.c +++ b/arch/arm/mach-at91/at91sam9n12.c @@ -15,8 +15,8 @@  #include <mach/at91sam9n12.h>  #include <mach/at91_pmc.h>  #include <mach/cpu.h> -#include <mach/board.h> +#include "board.h"  #include "soc.h"  #include "generic.h"  #include "clock.h" @@ -168,13 +168,14 @@ static struct clk_lookup periph_clocks_lookups[] = {  	CLKDEV_CON_DEV_ID("usart", "f8028000.serial", &usart3_clk),  	CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb_clk),  	CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "f0008000.mmc", &mmc_clk),  	CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma_clk),  	CLKDEV_CON_DEV_ID(NULL, "f8010000.i2c", &twi0_clk),  	CLKDEV_CON_DEV_ID(NULL, "f8014000.i2c", &twi1_clk), -	CLKDEV_CON_ID("pioA", &pioAB_clk), -	CLKDEV_CON_ID("pioB", &pioAB_clk), -	CLKDEV_CON_ID("pioC", &pioCD_clk), -	CLKDEV_CON_ID("pioD", &pioCD_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioAB_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioAB_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioCD_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioCD_clk),  	/* additional fake clock for macb_hclk */  	CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &uhp_clk),  	CLKDEV_CON_DEV_ID("ohci_clk", "500000.ohci", &uhp_clk), @@ -223,13 +224,10 @@ static void __init at91sam9n12_map_io(void)  void __init at91sam9n12_initialize(void)  {  	at91_extern_irq = (1 << AT91SAM9N12_ID_IRQ0); - -	/* Register GPIO subsystem (using DT) */ -	at91_gpio_init(NULL, 0);  } -struct at91_init_soc __initdata at91sam9n12_soc = { +AT91_SOC_START(sam9n12)  	.map_io = at91sam9n12_map_io,  	.register_clocks = at91sam9n12_register_clocks,  	.init = at91sam9n12_initialize, -}; +AT91_SOC_END diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c index 72e90841222..44e3a633fda 100644 --- a/arch/arm/mach-at91/at91sam9rl.c +++ b/arch/arm/mach-at91/at91sam9rl.c @@ -19,10 +19,10 @@  #include <mach/cpu.h>  #include <mach/at91_dbgu.h>  #include <mach/at91sam9rl.h> -#include <mach/at91_aic.h>  #include <mach/at91_pmc.h> -#include <mach/at91_rstc.h> +#include "at91_aic.h" +#include "at91_rstc.h"  #include "soc.h"  #include "generic.h"  #include "clock.h" @@ -338,10 +338,10 @@ static unsigned int at91sam9rl_default_irq_priority[NR_AIC_IRQS] __initdata = {  	0,	/* Advanced Interrupt Controller */  }; -struct at91_init_soc __initdata at91sam9rl_soc = { +AT91_SOC_START(sam9rl)  	.map_io = at91sam9rl_map_io,  	.default_irq_priority = at91sam9rl_default_irq_priority,  	.ioremap_registers = at91sam9rl_ioremap_registers,  	.register_clocks = at91sam9rl_register_clocks,  	.init = at91sam9rl_initialize, -}; +AT91_SOC_END diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index 5047bdc92ad..160384d93db 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c @@ -17,13 +17,13 @@  #include <linux/fb.h>  #include <video/atmel_lcdc.h> -#include <mach/board.h>  #include <mach/at91sam9rl.h>  #include <mach/at91sam9rl_matrix.h>  #include <mach/at91_matrix.h>  #include <mach/at91sam9_smc.h>  #include <linux/platform_data/dma-atmel.h> +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c index e5035380dcb..dfb2c0c13fb 100644 --- a/arch/arm/mach-at91/at91sam9x5.c +++ b/arch/arm/mach-at91/at91sam9x5.c @@ -15,8 +15,8 @@  #include <mach/at91sam9x5.h>  #include <mach/at91_pmc.h>  #include <mach/cpu.h> -#include <mach/board.h> +#include "board.h"  #include "soc.h"  #include "generic.h"  #include "clock.h" @@ -229,15 +229,17 @@ static struct clk_lookup periph_clocks_lookups[] = {  	CLKDEV_CON_DEV_ID("usart", "f8028000.serial", &usart3_clk),  	CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb0_clk),  	CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb0_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "f0008000.mmc", &mmc0_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "f000c000.mmc", &mmc1_clk),  	CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma0_clk),  	CLKDEV_CON_DEV_ID("dma_clk", "ffffee00.dma-controller", &dma1_clk),  	CLKDEV_CON_DEV_ID(NULL, "f8010000.i2c", &twi0_clk),  	CLKDEV_CON_DEV_ID(NULL, "f8014000.i2c", &twi1_clk),  	CLKDEV_CON_DEV_ID(NULL, "f8018000.i2c", &twi2_clk), -	CLKDEV_CON_ID("pioA", &pioAB_clk), -	CLKDEV_CON_ID("pioB", &pioAB_clk), -	CLKDEV_CON_ID("pioC", &pioCD_clk), -	CLKDEV_CON_ID("pioD", &pioCD_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioAB_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioAB_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioCD_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioCD_clk),  	/* additional fake clock for macb_hclk */  	CLKDEV_CON_DEV_ID("hclk", "f802c000.ethernet", &macb0_clk),  	CLKDEV_CON_DEV_ID("hclk", "f8030000.ethernet", &macb1_clk), @@ -313,18 +315,11 @@ static void __init at91sam9x5_map_io(void)  	at91_init_sram(0, AT91SAM9X5_SRAM_BASE, AT91SAM9X5_SRAM_SIZE);  } -void __init at91sam9x5_initialize(void) -{ -	/* Register GPIO subsystem (using DT) */ -	at91_gpio_init(NULL, 0); -} -  /* --------------------------------------------------------------------   *  Interrupt initialization   * -------------------------------------------------------------------- */ -struct at91_init_soc __initdata at91sam9x5_soc = { +AT91_SOC_START(sam9x5)  	.map_io = at91sam9x5_map_io,  	.register_clocks = at91sam9x5_register_clocks, -	.init = at91sam9x5_initialize, -}; +AT91_SOC_END diff --git a/arch/arm/mach-at91/at91x40.c b/arch/arm/mach-at91/at91x40.c index bb7f54474b9..19ca7939690 100644 --- a/arch/arm/mach-at91/at91x40.c +++ b/arch/arm/mach-at91/at91x40.c @@ -18,9 +18,10 @@  #include <asm/system_misc.h>  #include <asm/mach/arch.h>  #include <mach/at91x40.h> -#include <mach/at91_aic.h>  #include <mach/at91_st.h>  #include <mach/timex.h> + +#include "at91_aic.h"  #include "generic.h"  /* diff --git a/arch/arm/mach-at91/at91x40_time.c b/arch/arm/mach-at91/at91x40_time.c index ee06d7bcdf7..0e57e440c06 100644 --- a/arch/arm/mach-at91/at91x40_time.c +++ b/arch/arm/mach-at91/at91x40_time.c @@ -26,7 +26,8 @@  #include <linux/io.h>  #include <mach/hardware.h>  #include <asm/mach/time.h> -#include <mach/at91_tc.h> + +#include "at91_tc.h"  #define at91_tc_read(field) \  	__raw_readl(AT91_IO_P2V(AT91_TC) + field) diff --git a/arch/arm/mach-at91/board-1arm.c b/arch/arm/mach-at91/board-1arm.c index 22d8856094f..b99b5752cc1 100644 --- a/arch/arm/mach-at91/board-1arm.c +++ b/arch/arm/mach-at91/board-1arm.c @@ -34,10 +34,10 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h>  #include <mach/cpu.h> -#include <mach/at91_aic.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-afeb-9260v1.c b/arch/arm/mach-at91/board-afeb-9260v1.c index 93a832f7023..854b9797428 100644 --- a/arch/arm/mach-at91/board-afeb-9260v1.c +++ b/arch/arm/mach-at91/board-afeb-9260v1.c @@ -43,9 +43,8 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h> - +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-cam60.c b/arch/arm/mach-at91/board-cam60.c index 477e708497b..28a18ce6d91 100644 --- a/arch/arm/mach-at91/board-cam60.c +++ b/arch/arm/mach-at91/board-cam60.c @@ -38,10 +38,10 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-carmeva.c b/arch/arm/mach-at91/board-carmeva.c index 71d8f362a1d..c17bb533a94 100644 --- a/arch/arm/mach-at91/board-carmeva.c +++ b/arch/arm/mach-at91/board-carmeva.c @@ -35,9 +35,9 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-cpu9krea.c b/arch/arm/mach-at91/board-cpu9krea.c index e71c473316e..847432441ec 100644 --- a/arch/arm/mach-at91/board-cpu9krea.c +++ b/arch/arm/mach-at91/board-cpu9krea.c @@ -40,12 +40,12 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91sam9260_matrix.h>  #include <mach/at91_matrix.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-cpuat91.c b/arch/arm/mach-at91/board-cpuat91.c index 2cbd1a2b6c3..2a7af786874 100644 --- a/arch/arm/mach-at91/board-cpuat91.c +++ b/arch/arm/mach-at91/board-cpuat91.c @@ -36,12 +36,12 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h>  #include <mach/cpu.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h"  static struct gpio_led cpuat91_leds[] = { diff --git a/arch/arm/mach-at91/board-csb337.c b/arch/arm/mach-at91/board-csb337.c index 3e37437a7a6..78e02507442 100644 --- a/arch/arm/mach-at91/board-csb337.c +++ b/arch/arm/mach-at91/board-csb337.c @@ -38,9 +38,9 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-csb637.c b/arch/arm/mach-at91/board-csb637.c index 872871ab116..ec0f3abd504 100644 --- a/arch/arm/mach-at91/board-csb637.c +++ b/arch/arm/mach-at91/board-csb637.c @@ -35,9 +35,9 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-dt.c b/arch/arm/mach-at91/board-dt.c index e8f45c4e0ea..881170ce61d 100644 --- a/arch/arm/mach-at91/board-dt.c +++ b/arch/arm/mach-at91/board-dt.c @@ -15,23 +15,20 @@  #include <linux/of_irq.h>  #include <linux/of_platform.h> -#include <mach/board.h> -#include <mach/at91_aic.h> -  #include <asm/setup.h>  #include <asm/irq.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/mach/irq.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h"  static const struct of_device_id irq_of_match[] __initconst = {  	{ .compatible = "atmel,at91rm9200-aic", .data = at91_aic_of_init }, -	{ .compatible = "atmel,at91rm9200-gpio", .data = at91_gpio_of_irq_setup }, -	{ .compatible = "atmel,at91sam9x5-gpio", .data = at91_gpio_of_irq_setup },  	{ /*sentinel*/ }  }; diff --git a/arch/arm/mach-at91/board-eb01.c b/arch/arm/mach-at91/board-eb01.c index 01f66e99ece..b489388a6f8 100644 --- a/arch/arm/mach-at91/board-eb01.c +++ b/arch/arm/mach-at91/board-eb01.c @@ -27,8 +27,9 @@  #include <mach/hardware.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <mach/board.h> -#include <mach/at91_aic.h> + +#include "at91_aic.h" +#include "board.h"  #include "generic.h"  static void __init at91eb01_init_irq(void) diff --git a/arch/arm/mach-at91/board-eb9200.c b/arch/arm/mach-at91/board-eb9200.c index 0cfac16ee9d..9f5e71c95f0 100644 --- a/arch/arm/mach-at91/board-eb9200.c +++ b/arch/arm/mach-at91/board-eb9200.c @@ -35,9 +35,8 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h> - +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-ecbat91.c b/arch/arm/mach-at91/board-ecbat91.c index 3d931ffac4b..ef69e0ebe94 100644 --- a/arch/arm/mach-at91/board-ecbat91.c +++ b/arch/arm/mach-at91/board-ecbat91.c @@ -37,10 +37,10 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h>  #include <mach/cpu.h> -#include <mach/at91_aic.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-eco920.c b/arch/arm/mach-at91/board-eco920.c index d93658a2b12..50f3d3795c0 100644 --- a/arch/arm/mach-at91/board-eco920.c +++ b/arch/arm/mach-at91/board-eco920.c @@ -24,12 +24,12 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h>  #include <mach/cpu.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h"  static void __init eco920_init_early(void) diff --git a/arch/arm/mach-at91/board-flexibity.c b/arch/arm/mach-at91/board-flexibity.c index fa98abacb1b..5d44eba0f20 100644 --- a/arch/arm/mach-at91/board-flexibity.c +++ b/arch/arm/mach-at91/board-flexibity.c @@ -33,9 +33,9 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h"  static void __init flexibity_init_early(void) diff --git a/arch/arm/mach-at91/board-foxg20.c b/arch/arm/mach-at91/board-foxg20.c index 6e47071d820..191d37c16ba 100644 --- a/arch/arm/mach-at91/board-foxg20.c +++ b/arch/arm/mach-at91/board-foxg20.c @@ -41,10 +41,10 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-gsia18s.c b/arch/arm/mach-at91/board-gsia18s.c index a9d5e78118c..23a2fa17ab2 100644 --- a/arch/arm/mach-at91/board-gsia18s.c +++ b/arch/arm/mach-at91/board-gsia18s.c @@ -30,14 +30,14 @@  #include <asm/mach-types.h>  #include <asm/mach/arch.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/gsia18s.h> -#include <mach/stamp9g20.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" +#include "gsia18s.h" +#include "stamp9g20.h"  static void __init gsia18s_init_early(void)  { diff --git a/arch/arm/mach-at91/board-kafa.c b/arch/arm/mach-at91/board-kafa.c index 86050da3ba5..9a43d1e1a03 100644 --- a/arch/arm/mach-at91/board-kafa.c +++ b/arch/arm/mach-at91/board-kafa.c @@ -34,10 +34,10 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/cpu.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-kb9202.c b/arch/arm/mach-at91/board-kb9202.c index abe9fed7a3e..f168bec2369 100644 --- a/arch/arm/mach-at91/board-kb9202.c +++ b/arch/arm/mach-at91/board-kb9202.c @@ -35,12 +35,12 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h>  #include <mach/cpu.h> -#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-neocore926.c b/arch/arm/mach-at91/board-neocore926.c index 6960778af4c..bc7a1c4a1f6 100644 --- a/arch/arm/mach-at91/board-neocore926.c +++ b/arch/arm/mach-at91/board-neocore926.c @@ -44,10 +44,10 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-pcontrol-g20.c b/arch/arm/mach-at91/board-pcontrol-g20.c index 9ca3e32c54c..0299554495d 100644 --- a/arch/arm/mach-at91/board-pcontrol-g20.c +++ b/arch/arm/mach-at91/board-pcontrol-g20.c @@ -29,13 +29,13 @@  #include <asm/mach-types.h>  #include <asm/mach/arch.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/stamp9g20.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" +#include "stamp9g20.h"  static void __init pcontrol_g20_init_early(void) diff --git a/arch/arm/mach-at91/board-picotux200.c b/arch/arm/mach-at91/board-picotux200.c index f83e1de699e..4938f1cd5e1 100644 --- a/arch/arm/mach-at91/board-picotux200.c +++ b/arch/arm/mach-at91/board-picotux200.c @@ -37,11 +37,11 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-qil-a9260.c b/arch/arm/mach-at91/board-qil-a9260.c index 799f214edeb..33b1628467e 100644 --- a/arch/arm/mach-at91/board-qil-a9260.c +++ b/arch/arm/mach-at91/board-qil-a9260.c @@ -40,11 +40,11 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/at91_shdwc.h> +#include "at91_aic.h" +#include "at91_shdwc.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-rm9200-dt.c b/arch/arm/mach-at91/board-rm9200-dt.c new file mode 100644 index 00000000000..5f9ce3da3fd --- /dev/null +++ b/arch/arm/mach-at91/board-rm9200-dt.c @@ -0,0 +1,57 @@ +/* + *  Setup code for AT91RM9200 Evaluation Kits with Device Tree support + * + *  Copyright (C) 2011 Atmel, + *                2011 Nicolas Ferre <nicolas.ferre@atmel.com> + *                2012 Joachim Eastwood <manabian@gmail.com> + * + * Licensed under GPLv2 or later. + */ + +#include <linux/types.h> +#include <linux/init.h> +#include <linux/module.h> +#include <linux/gpio.h> +#include <linux/of.h> +#include <linux/of_irq.h> +#include <linux/of_platform.h> + +#include <asm/setup.h> +#include <asm/irq.h> +#include <asm/mach/arch.h> +#include <asm/mach/map.h> +#include <asm/mach/irq.h> + +#include "at91_aic.h" +#include "generic.h" + + +static const struct of_device_id irq_of_match[] __initconst = { +	{ .compatible = "atmel,at91rm9200-aic", .data = at91_aic_of_init }, +	{ /*sentinel*/ } +}; + +static void __init at91rm9200_dt_init_irq(void) +{ +	of_irq_init(irq_of_match); +} + +static void __init at91rm9200_dt_device_init(void) +{ +	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); +} + +static const char *at91rm9200_dt_board_compat[] __initdata = { +	"atmel,at91rm9200", +	NULL +}; + +DT_MACHINE_START(at91rm9200_dt, "Atmel AT91RM9200 (Device Tree)") +	.timer		= &at91rm9200_timer, +	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq, +	.init_early	= at91rm9200_dt_initialize, +	.init_irq	= at91rm9200_dt_init_irq, +	.init_machine	= at91rm9200_dt_device_init, +	.dt_compat	= at91rm9200_dt_board_compat, +MACHINE_END diff --git a/arch/arm/mach-at91/board-rm9200dk.c b/arch/arm/mach-at91/board-rm9200dk.c index 66338e7ebfb..9e5061bef0d 100644 --- a/arch/arm/mach-at91/board-rm9200dk.c +++ b/arch/arm/mach-at91/board-rm9200dk.c @@ -39,11 +39,11 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-rm9200ek.c b/arch/arm/mach-at91/board-rm9200ek.c index 5d1b5729dc6..58277dbc718 100644 --- a/arch/arm/mach-at91/board-rm9200ek.c +++ b/arch/arm/mach-at91/board-rm9200ek.c @@ -39,11 +39,11 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-rsi-ews.c b/arch/arm/mach-at91/board-rsi-ews.c index a0ecf04e9ae..2e8b8339a20 100644 --- a/arch/arm/mach-at91/board-rsi-ews.c +++ b/arch/arm/mach-at91/board-rsi-ews.c @@ -25,11 +25,11 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <linux/gpio.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h"  static void __init rsi_ews_init_early(void) diff --git a/arch/arm/mach-at91/board-sam9-l9260.c b/arch/arm/mach-at91/board-sam9-l9260.c index c5f01acce3c..b75fbf6003a 100644 --- a/arch/arm/mach-at91/board-sam9-l9260.c +++ b/arch/arm/mach-at91/board-sam9-l9260.c @@ -37,10 +37,10 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-sam9260ek.c b/arch/arm/mach-at91/board-sam9260ek.c index 8cd6e679fbe..f0135cd1d85 100644 --- a/arch/arm/mach-at91/board-sam9260ek.c +++ b/arch/arm/mach-at91/board-sam9260ek.c @@ -41,12 +41,12 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/at91_shdwc.h>  #include <mach/system_rev.h> +#include "at91_aic.h" +#include "at91_shdwc.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-sam9261ek.c b/arch/arm/mach-at91/board-sam9261ek.c index a9167dd45f9..13ebaa8e410 100644 --- a/arch/arm/mach-at91/board-sam9261ek.c +++ b/arch/arm/mach-at91/board-sam9261ek.c @@ -45,12 +45,12 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/at91_shdwc.h>  #include <mach/system_rev.h> +#include "at91_aic.h" +#include "at91_shdwc.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-sam9263ek.c b/arch/arm/mach-at91/board-sam9263ek.c index b87dbe2be0d..89b9608742a 100644 --- a/arch/arm/mach-at91/board-sam9263ek.c +++ b/arch/arm/mach-at91/board-sam9263ek.c @@ -44,12 +44,12 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/at91_shdwc.h>  #include <mach/system_rev.h> +#include "at91_aic.h" +#include "at91_shdwc.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-sam9g20ek.c b/arch/arm/mach-at91/board-sam9g20ek.c index 3ab2b86a376..7b512380236 100644 --- a/arch/arm/mach-at91/board-sam9g20ek.c +++ b/arch/arm/mach-at91/board-sam9g20ek.c @@ -43,11 +43,11 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include <mach/system_rev.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-sam9m10g45ek.c b/arch/arm/mach-at91/board-sam9m10g45ek.c index 3d48ec15468..e4cc375e3a3 100644 --- a/arch/arm/mach-at91/board-sam9m10g45ek.c +++ b/arch/arm/mach-at91/board-sam9m10g45ek.c @@ -42,12 +42,12 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/at91_shdwc.h>  #include <mach/system_rev.h> +#include "at91_aic.h" +#include "at91_shdwc.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-sam9rlek.c b/arch/arm/mach-at91/board-sam9rlek.c index fb89ea92e3f..377a1097afa 100644 --- a/arch/arm/mach-at91/board-sam9rlek.c +++ b/arch/arm/mach-at91/board-sam9rlek.c @@ -30,11 +30,12 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/at91_shdwc.h> + +#include "at91_aic.h" +#include "at91_shdwc.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-snapper9260.c b/arch/arm/mach-at91/board-snapper9260.c index a4e031a039f..98771500ddb 100644 --- a/arch/arm/mach-at91/board-snapper9260.c +++ b/arch/arm/mach-at91/board-snapper9260.c @@ -32,10 +32,10 @@  #include <asm/mach/arch.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-stamp9g20.c b/arch/arm/mach-at91/board-stamp9g20.c index c3fb31d5116..48a962b61fa 100644 --- a/arch/arm/mach-at91/board-stamp9g20.c +++ b/arch/arm/mach-at91/board-stamp9g20.c @@ -25,10 +25,10 @@  #include <asm/mach-types.h>  #include <asm/mach/arch.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-usb-a926x.c b/arch/arm/mach-at91/board-usb-a926x.c index 6ea069b5733..c1060f96e58 100644 --- a/arch/arm/mach-at91/board-usb-a926x.c +++ b/arch/arm/mach-at91/board-usb-a926x.c @@ -41,11 +41,11 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/at91_shdwc.h> +#include "at91_aic.h" +#include "at91_shdwc.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-yl-9200.c b/arch/arm/mach-at91/board-yl-9200.c index f162fdfd66e..8673aebcb85 100644 --- a/arch/arm/mach-at91/board-yl-9200.c +++ b/arch/arm/mach-at91/board-yl-9200.c @@ -43,12 +43,12 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h>  #include <mach/cpu.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/board.h index c55a4364ffb..4a234fb2ab3 100644 --- a/arch/arm/mach-at91/include/mach/board.h +++ b/arch/arm/mach-at91/board.h @@ -31,71 +31,24 @@  #ifndef __ASM_ARCH_BOARD_H  #define __ASM_ARCH_BOARD_H -#include <linux/mtd/partitions.h> -#include <linux/device.h> -#include <linux/i2c.h> -#include <linux/leds.h> -#include <linux/spi/spi.h> -#include <linux/usb/atmel_usba_udc.h> -#include <linux/atmel-mci.h> -#include <sound/atmel-ac97c.h> -#include <linux/serial.h> -#include <linux/platform_data/macb.h>  #include <linux/platform_data/atmel.h>   /* USB Device */ -struct at91_udc_data { -	int	vbus_pin;		/* high == host powering us */ -	u8	vbus_active_low;	/* vbus polarity */ -	u8	vbus_polled;		/* Use polling, not interrupt */ -	int	pullup_pin;		/* active == D+ pulled up */ -	u8	pullup_active_low;	/* true == pullup_pin is active low */ -};  extern void __init at91_add_device_udc(struct at91_udc_data *data);   /* USB High Speed Device */  extern void __init at91_add_device_usba(struct usba_platform_data *data);   /* Compact Flash */ -struct at91_cf_data { -	int	irq_pin;		/* I/O IRQ */ -	int	det_pin;		/* Card detect */ -	int	vcc_pin;		/* power switching */ -	int	rst_pin;		/* card reset */ -	u8	chipselect;		/* EBI Chip Select number */ -	u8	flags; -#define AT91_CF_TRUE_IDE	0x01 -#define AT91_IDE_SWAP_A0_A2	0x02 -};  extern void __init at91_add_device_cf(struct at91_cf_data *data);   /* MMC / SD */ -  /* at91_mci platform config */ -struct at91_mmc_data { -	int		det_pin;	/* card detect IRQ */ -	unsigned	slot_b:1;	/* uses Slot B */ -	unsigned	wire4:1;	/* (SD) supports DAT0..DAT3 */ -	int		wp_pin;		/* (SD) writeprotect detect */ -	int		vcc_pin;	/* power switching (high == on) */ -}; -extern void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data); -    /* atmel-mci platform config */  extern void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data);  extern void __init at91_add_device_eth(struct macb_platform_data *data);   /* USB Host */ -#define AT91_MAX_USBH_PORTS	3 -struct at91_usbh_data { -	int		vbus_pin[AT91_MAX_USBH_PORTS];	/* port power-control pin */ -	int             overcurrent_pin[AT91_MAX_USBH_PORTS]; -	u8		ports;				/* number of ports on root hub */ -	u8              overcurrent_supported; -	u8              vbus_pin_active_low[AT91_MAX_USBH_PORTS]; -	u8              overcurrent_status[AT91_MAX_USBH_PORTS]; -	u8              overcurrent_changed[AT91_MAX_USBH_PORTS]; -};  extern void __init at91_add_device_usbh(struct at91_usbh_data *data);  extern void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data);  extern void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data); @@ -124,13 +77,6 @@ extern void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pin  extern struct platform_device *atmel_default_console_device; -struct atmel_uart_data { -	int			num;		/* port num */ -	short			use_dma_tx;	/* use transmit DMA? */ -	short			use_dma_rx;	/* use receive DMA? */ -	void __iomem		*regs;		/* virt. base address, if any */ -	struct serial_rs485	rs485;		/* rs485 settings */ -};  extern void __init at91_add_device_serial(void);  /* @@ -173,24 +119,13 @@ extern void __init at91_add_device_isi(struct isi_platform_data *data,  		bool use_pck_as_mck);   /* Touchscreen Controller */ -struct at91_tsadcc_data { -	unsigned int    adc_clock; -	u8		pendet_debounce; -	u8		ts_sample_hold_time; -};  extern void __init at91_add_device_tsadcc(struct at91_tsadcc_data *data);  /* CAN */ -struct at91_can_data { -	void (*transceiver_switch)(int on); -};  extern void __init at91_add_device_can(struct at91_can_data *data);   /* LEDs */  extern void __init at91_gpio_leds(struct gpio_led *leds, int nr);  extern void __init at91_pwm_leds(struct gpio_led *leds, int nr); -/* FIXME: this needs a better location, but gets stuff building again */ -extern int at91_suspend_entering_slow_clock(void); -  #endif diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h index b62f560e6c7..fc593d615e7 100644 --- a/arch/arm/mach-at91/generic.h +++ b/arch/arm/mach-at91/generic.h @@ -20,6 +20,7 @@ extern void __init at91_init_sram(int bank, unsigned long base,  extern void __init at91rm9200_set_type(int type);  extern void __init at91_initialize(unsigned long main_clock);  extern void __init at91x40_initialize(unsigned long main_clock); +extern void __init at91rm9200_dt_initialize(void);  extern void __init at91_dt_initialize(void);   /* Interrupts */ diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c index be42cf0e74b..c5d7e1e9d75 100644 --- a/arch/arm/mach-at91/gpio.c +++ b/arch/arm/mach-at91/gpio.c @@ -23,8 +23,6 @@  #include <linux/io.h>  #include <linux/irqdomain.h>  #include <linux/of_address.h> -#include <linux/of_irq.h> -#include <linux/of_gpio.h>  #include <asm/mach/irq.h> @@ -33,6 +31,8 @@  #include "generic.h" +#define MAX_NB_GPIO_PER_BANK	32 +  struct at91_gpio_chip {  	struct gpio_chip	chip;  	struct at91_gpio_chip	*next;		/* Bank sharing same clock */ @@ -46,6 +46,7 @@ struct at91_gpio_chip {  #define to_at91_gpio_chip(c) container_of(c, struct at91_gpio_chip, chip) +static int at91_gpiolib_request(struct gpio_chip *chip, unsigned offset);  static void at91_gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip);  static void at91_gpiolib_set(struct gpio_chip *chip, unsigned offset, int val);  static int at91_gpiolib_get(struct gpio_chip *chip, unsigned offset); @@ -55,26 +56,27 @@ static int at91_gpiolib_direction_input(struct gpio_chip *chip,  					unsigned offset);  static int at91_gpiolib_to_irq(struct gpio_chip *chip, unsigned offset); -#define AT91_GPIO_CHIP(name, nr_gpio)					\ +#define AT91_GPIO_CHIP(name)						\  	{								\  		.chip = {						\  			.label		  = name,			\ +			.request	  = at91_gpiolib_request,	\  			.direction_input  = at91_gpiolib_direction_input, \  			.direction_output = at91_gpiolib_direction_output, \  			.get		  = at91_gpiolib_get,		\  			.set		  = at91_gpiolib_set,		\  			.dbg_show	  = at91_gpiolib_dbg_show,	\  			.to_irq		  = at91_gpiolib_to_irq,	\ -			.ngpio		  = nr_gpio,			\ +			.ngpio		  = MAX_NB_GPIO_PER_BANK,	\  		},							\  	}  static struct at91_gpio_chip gpio_chip[] = { -	AT91_GPIO_CHIP("pioA", 32), -	AT91_GPIO_CHIP("pioB", 32), -	AT91_GPIO_CHIP("pioC", 32), -	AT91_GPIO_CHIP("pioD", 32), -	AT91_GPIO_CHIP("pioE", 32), +	AT91_GPIO_CHIP("pioA"), +	AT91_GPIO_CHIP("pioB"), +	AT91_GPIO_CHIP("pioC"), +	AT91_GPIO_CHIP("pioD"), +	AT91_GPIO_CHIP("pioE"),  };  static int gpio_banks; @@ -89,7 +91,7 @@ static unsigned long at91_gpio_caps;  static inline void __iomem *pin_to_controller(unsigned pin)  { -	pin /= 32; +	pin /= MAX_NB_GPIO_PER_BANK;  	if (likely(pin < gpio_banks))  		return gpio_chip[pin].regbase; @@ -98,7 +100,7 @@ static inline void __iomem *pin_to_controller(unsigned pin)  static inline unsigned pin_to_mask(unsigned pin)  { -	return 1 << (pin % 32); +	return 1 << (pin % MAX_NB_GPIO_PER_BANK);  } @@ -713,80 +715,6 @@ postcore_initcall(at91_gpio_debugfs_init);   */  static struct lock_class_key gpio_lock_class; -#if defined(CONFIG_OF) -static int at91_gpio_irq_map(struct irq_domain *h, unsigned int virq, -							irq_hw_number_t hw) -{ -	struct at91_gpio_chip	*at91_gpio = h->host_data; - -	irq_set_lockdep_class(virq, &gpio_lock_class); - -	/* -	 * Can use the "simple" and not "edge" handler since it's -	 * shorter, and the AIC handles interrupts sanely. -	 */ -	irq_set_chip_and_handler(virq, &gpio_irqchip, -				 handle_simple_irq); -	set_irq_flags(virq, IRQF_VALID); -	irq_set_chip_data(virq, at91_gpio); - -	return 0; -} - -static struct irq_domain_ops at91_gpio_ops = { -	.map	= at91_gpio_irq_map, -	.xlate	= irq_domain_xlate_twocell, -}; - -int __init at91_gpio_of_irq_setup(struct device_node *node, -				     struct device_node *parent) -{ -	struct at91_gpio_chip	*prev = NULL; -	int			alias_idx = of_alias_get_id(node, "gpio"); -	struct at91_gpio_chip	*at91_gpio = &gpio_chip[alias_idx]; - -	/* Setup proper .irq_set_type function */ -	if (has_pio3()) -		gpio_irqchip.irq_set_type = alt_gpio_irq_type; -	else -		gpio_irqchip.irq_set_type = gpio_irq_type; - -	/* Disable irqs of this PIO controller */ -	__raw_writel(~0, at91_gpio->regbase + PIO_IDR); - -	/* Setup irq domain */ -	at91_gpio->domain = irq_domain_add_linear(node, at91_gpio->chip.ngpio, -						&at91_gpio_ops, at91_gpio); -	if (!at91_gpio->domain) -		panic("at91_gpio.%d: couldn't allocate irq domain (DT).\n", -			at91_gpio->pioc_idx); - -	/* Setup chained handler */ -	if (at91_gpio->pioc_idx) -		prev = &gpio_chip[at91_gpio->pioc_idx - 1]; - -	/* The toplevel handler handles one bank of GPIOs, except -	 * on some SoC it can handles up to three... -	 * We only set up the handler for the first of the list. -	 */ -	if (prev && prev->next == at91_gpio) -		return 0; - -	at91_gpio->pioc_virq = irq_create_mapping(irq_find_host(parent), -							at91_gpio->pioc_hwirq); -	irq_set_chip_data(at91_gpio->pioc_virq, at91_gpio); -	irq_set_chained_handler(at91_gpio->pioc_virq, gpio_irq_handler); - -	return 0; -} -#else -int __init at91_gpio_of_irq_setup(struct device_node *node, -				     struct device_node *parent) -{ -	return -EINVAL; -} -#endif -  /*   * irqdomain initialization: pile up irqdomains on top of AIC range   */ @@ -862,6 +790,16 @@ void __init at91_gpio_irq_setup(void)  }  /* gpiolib support */ +static int at91_gpiolib_request(struct gpio_chip *chip, unsigned offset) +{ +	struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip); +	void __iomem *pio = at91_gpio->regbase; +	unsigned mask = 1 << offset; + +	__raw_writel(mask, pio + PIO_PER); +	return 0; +} +  static int at91_gpiolib_direction_input(struct gpio_chip *chip,  					unsigned offset)  { @@ -975,81 +913,11 @@ err:  	return -EINVAL;  } -#ifdef CONFIG_OF_GPIO -static void __init of_at91_gpio_init_one(struct device_node *np) -{ -	int alias_idx; -	struct at91_gpio_chip *at91_gpio; - -	if (!np) -		return; - -	alias_idx = of_alias_get_id(np, "gpio"); -	if (alias_idx >= MAX_GPIO_BANKS) { -		pr_err("at91_gpio, failed alias idx(%d) > MAX_GPIO_BANKS(%d), ignoring.\n", -						alias_idx, MAX_GPIO_BANKS); -		return; -	} - -	at91_gpio = &gpio_chip[alias_idx]; -	at91_gpio->chip.base = alias_idx * at91_gpio->chip.ngpio; - -	at91_gpio->regbase = of_iomap(np, 0); -	if (!at91_gpio->regbase) { -		pr_err("at91_gpio.%d, failed to map registers, ignoring.\n", -								alias_idx); -		return; -	} - -	/* Get the interrupts property */ -	if (of_property_read_u32(np, "interrupts", &at91_gpio->pioc_hwirq)) { -		pr_err("at91_gpio.%d, failed to get interrupts property, ignoring.\n", -								alias_idx); -		goto ioremap_err; -	} - -	/* Get capabilities from compatibility property */ -	if (of_device_is_compatible(np, "atmel,at91sam9x5-gpio")) -		at91_gpio_caps |= AT91_GPIO_CAP_PIO3; - -	/* Setup clock */ -	if (at91_gpio_setup_clk(alias_idx)) -		goto ioremap_err; - -	at91_gpio->chip.of_node = np; -	gpio_banks = max(gpio_banks, alias_idx + 1); -	at91_gpio->pioc_idx = alias_idx; -	return; - -ioremap_err: -	iounmap(at91_gpio->regbase); -} - -static int __init of_at91_gpio_init(void) -{ -	struct device_node *np = NULL; - -	/* -	 * This isn't ideal, but it gets things hooked up until this -	 * driver is converted into a platform_device -	 */ -	for_each_compatible_node(np, NULL, "atmel,at91rm9200-gpio") -		of_at91_gpio_init_one(np); - -	return gpio_banks > 0 ? 0 : -EINVAL; -} -#else -static int __init of_at91_gpio_init(void) -{ -	return -EINVAL; -} -#endif -  static void __init at91_gpio_init_one(int idx, u32 regbase, int pioc_hwirq)  {  	struct at91_gpio_chip *at91_gpio = &gpio_chip[idx]; -	at91_gpio->chip.base = idx * at91_gpio->chip.ngpio; +	at91_gpio->chip.base = idx * MAX_NB_GPIO_PER_BANK;  	at91_gpio->pioc_hwirq = pioc_hwirq;  	at91_gpio->pioc_idx = idx; @@ -1079,11 +947,11 @@ void __init at91_gpio_init(struct at91_gpio_bank *data, int nr_banks)  	BUG_ON(nr_banks > MAX_GPIO_BANKS); -	if (of_at91_gpio_init() < 0) { -		/* No GPIO controller found in device tree */ -		for (i = 0; i < nr_banks; i++) -			at91_gpio_init_one(i, data[i].regbase, data[i].id); -	} +	if (of_have_populated_dt()) +		return; + +	for (i = 0; i < nr_banks; i++) +		at91_gpio_init_one(i, data[i].regbase, data[i].id);  	for (i = 0; i < gpio_banks; i++) {  		at91_gpio = &gpio_chip[i]; diff --git a/arch/arm/mach-at91/include/mach/gsia18s.h b/arch/arm/mach-at91/gsia18s.h index 307c194926f..307c194926f 100644 --- a/arch/arm/mach-at91/include/mach/gsia18s.h +++ b/arch/arm/mach-at91/gsia18s.h diff --git a/arch/arm/mach-at91/include/mach/at91_pit.h b/arch/arm/mach-at91/include/mach/at91_pit.h deleted file mode 100644 index d1f80ad7f4d..00000000000 --- a/arch/arm/mach-at91/include/mach/at91_pit.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * arch/arm/mach-at91/include/mach/at91_pit.h - * - * Copyright (C) 2007 Andrew Victor - * Copyright (C) 2007 Atmel Corporation. - * - * Periodic Interval Timer (PIT) - System peripherals regsters. - * Based on AT91SAM9261 datasheet revision D. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - */ - -#ifndef AT91_PIT_H -#define AT91_PIT_H - -#define AT91_PIT_MR		0x00			/* Mode Register */ -#define		AT91_PIT_PITIEN		(1 << 25)		/* Timer Interrupt Enable */ -#define		AT91_PIT_PITEN		(1 << 24)		/* Timer Enabled */ -#define		AT91_PIT_PIV		(0xfffff)		/* Periodic Interval Value */ - -#define AT91_PIT_SR		0x04			/* Status Register */ -#define		AT91_PIT_PITS		(1 << 0)		/* Timer Status */ - -#define AT91_PIT_PIVR		0x08			/* Periodic Interval Value Register */ -#define AT91_PIT_PIIR		0x0c			/* Periodic Interval Image Register */ -#define		AT91_PIT_PICNT		(0xfff << 20)		/* Interval Counter */ -#define		AT91_PIT_CPIV		(0xfffff)		/* Inverval Value */ - -#endif diff --git a/arch/arm/mach-at91/include/mach/at91_rtc.h b/arch/arm/mach-at91/include/mach/at91_rtc.h deleted file mode 100644 index da1945e5f71..00000000000 --- a/arch/arm/mach-at91/include/mach/at91_rtc.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * arch/arm/mach-at91/include/mach/at91_rtc.h - * - * Copyright (C) 2005 Ivan Kokshaysky - * Copyright (C) SAN People - * - * Real Time Clock (RTC) - System peripheral registers. - * Based on AT91RM9200 datasheet revision E. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - */ - -#ifndef AT91_RTC_H -#define AT91_RTC_H - -#define	AT91_RTC_CR		0x00			/* Control Register */ -#define		AT91_RTC_UPDTIM		(1 <<  0)		/* Update Request Time Register */ -#define		AT91_RTC_UPDCAL		(1 <<  1)		/* Update Request Calendar Register */ -#define		AT91_RTC_TIMEVSEL	(3 <<  8)		/* Time Event Selection */ -#define			AT91_RTC_TIMEVSEL_MINUTE	(0 << 8) -#define			AT91_RTC_TIMEVSEL_HOUR		(1 << 8) -#define			AT91_RTC_TIMEVSEL_DAY24		(2 << 8) -#define			AT91_RTC_TIMEVSEL_DAY12		(3 << 8) -#define		AT91_RTC_CALEVSEL	(3 << 16)		/* Calendar Event Selection */ -#define			AT91_RTC_CALEVSEL_WEEK		(0 << 16) -#define			AT91_RTC_CALEVSEL_MONTH		(1 << 16) -#define			AT91_RTC_CALEVSEL_YEAR		(2 << 16) - -#define	AT91_RTC_MR		0x04			/* Mode Register */ -#define			AT91_RTC_HRMOD		(1 <<  0)		/* 12/24 Hour Mode */ - -#define	AT91_RTC_TIMR		0x08			/* Time Register */ -#define		AT91_RTC_SEC		(0x7f <<  0)		/* Current Second */ -#define		AT91_RTC_MIN		(0x7f <<  8)		/* Current Minute */ -#define		AT91_RTC_HOUR		(0x3f << 16)		/* Current Hour */ -#define		AT91_RTC_AMPM		(1    << 22)		/* Ante Meridiem Post Meridiem Indicator */ - -#define	AT91_RTC_CALR		0x0c			/* Calendar Register */ -#define		AT91_RTC_CENT		(0x7f <<  0)		/* Current Century */ -#define		AT91_RTC_YEAR		(0xff <<  8)		/* Current Year */ -#define		AT91_RTC_MONTH		(0x1f << 16)		/* Current Month */ -#define		AT91_RTC_DAY		(7    << 21)		/* Current Day */ -#define		AT91_RTC_DATE		(0x3f << 24)		/* Current Date */ - -#define	AT91_RTC_TIMALR		0x10			/* Time Alarm Register */ -#define		AT91_RTC_SECEN		(1 <<  7)		/* Second Alarm Enable */ -#define		AT91_RTC_MINEN		(1 << 15)		/* Minute Alarm Enable */ -#define		AT91_RTC_HOUREN		(1 << 23)		/* Hour Alarm Enable */ - -#define	AT91_RTC_CALALR		0x14			/* Calendar Alarm Register */ -#define		AT91_RTC_MTHEN		(1 << 23)		/* Month Alarm Enable */ -#define		AT91_RTC_DATEEN		(1 << 31)		/* Date Alarm Enable */ - -#define	AT91_RTC_SR		0x18			/* Status Register */ -#define		AT91_RTC_ACKUPD		(1 <<  0)		/* Acknowledge for Update */ -#define		AT91_RTC_ALARM		(1 <<  1)		/* Alarm Flag */ -#define		AT91_RTC_SECEV		(1 <<  2)		/* Second Event */ -#define		AT91_RTC_TIMEV		(1 <<  3)		/* Time Event */ -#define		AT91_RTC_CALEV		(1 <<  4)		/* Calendar Event */ - -#define	AT91_RTC_SCCR		0x1c			/* Status Clear Command Register */ -#define	AT91_RTC_IER		0x20			/* Interrupt Enable Register */ -#define	AT91_RTC_IDR		0x24			/* Interrupt Disable Register */ -#define	AT91_RTC_IMR		0x28			/* Interrupt Mask Register */ - -#define	AT91_RTC_VER		0x2c			/* Valid Entry Register */ -#define		AT91_RTC_NVTIM		(1 <<  0)		/* Non valid Time */ -#define		AT91_RTC_NVCAL		(1 <<  1)		/* Non valid Calendar */ -#define		AT91_RTC_NVTIMALR	(1 <<  2)		/* Non valid Time Alarm */ -#define		AT91_RTC_NVCALALR	(1 <<  3)		/* Non valid Calendar Alarm */ - -#endif diff --git a/arch/arm/mach-at91/include/mach/hardware.h b/arch/arm/mach-at91/include/mach/hardware.h index 711a7892d33..a832e070761 100644 --- a/arch/arm/mach-at91/include/mach/hardware.h +++ b/arch/arm/mach-at91/include/mach/hardware.h @@ -90,9 +90,6 @@  #define AT91_SRAM_MAX		SZ_1M  #define AT91_VIRT_BASE		(AT91_IO_VIRT_BASE - AT91_SRAM_MAX) -/* Serial ports */ -#define ATMEL_MAX_UART		7		/* 6 USART3's and one DBGU port (SAM9260) */ -  /* External Memory Map */  #define AT91_CHIPSELECT_0	0x10000000  #define AT91_CHIPSELECT_1	0x20000000 diff --git a/arch/arm/mach-at91/irq.c b/arch/arm/mach-at91/irq.c index febc2ee901a..8e210262aee 100644 --- a/arch/arm/mach-at91/irq.c +++ b/arch/arm/mach-at91/irq.c @@ -42,7 +42,7 @@  #include <asm/mach/irq.h>  #include <asm/mach/map.h> -#include <mach/at91_aic.h> +#include "at91_aic.h"  void __iomem *at91_aic_base;  static struct irq_domain *at91_aic_domain; diff --git a/arch/arm/mach-at91/leds.c b/arch/arm/mach-at91/leds.c index 1b1e62b5f41..3e22978b554 100644 --- a/arch/arm/mach-at91/leds.c +++ b/arch/arm/mach-at91/leds.c @@ -15,7 +15,7 @@  #include <linux/init.h>  #include <linux/platform_device.h> -#include <mach/board.h> +#include "board.h"  /* ------------------------------------------------------------------------- */ diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index 5315f05896e..adb6db888a1 100644 --- a/arch/arm/mach-at91/pm.c +++ b/arch/arm/mach-at91/pm.c @@ -25,10 +25,10 @@  #include <asm/mach/time.h>  #include <asm/mach/irq.h> -#include <mach/at91_aic.h>  #include <mach/at91_pmc.h>  #include <mach/cpu.h> +#include "at91_aic.h"  #include "generic.h"  #include "pm.h" @@ -36,8 +36,8 @@   * Show the reason for the previous system reset.   */ -#include <mach/at91_rstc.h> -#include <mach/at91_shdwc.h> +#include "at91_rstc.h" +#include "at91_shdwc.h"  static void __init show_reset_status(void)  { diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c index 0b32c81730a..9ee866ce047 100644 --- a/arch/arm/mach-at91/setup.c +++ b/arch/arm/mach-at91/setup.c @@ -10,6 +10,7 @@  #include <linux/mm.h>  #include <linux/pm.h>  #include <linux/of_address.h> +#include <linux/pinctrl/machine.h>  #include <asm/system_misc.h>  #include <asm/mach/map.h> @@ -18,8 +19,8 @@  #include <mach/cpu.h>  #include <mach/at91_dbgu.h>  #include <mach/at91_pmc.h> -#include <mach/at91_shdwc.h> +#include "at91_shdwc.h"  #include "soc.h"  #include "generic.h" @@ -338,6 +339,7 @@ static void at91_dt_rstc(void)  }  static struct of_device_id ramc_ids[] = { +	{ .compatible = "atmel,at91rm9200-sdramc" },  	{ .compatible = "atmel,at91sam9260-sdramc" },  	{ .compatible = "atmel,at91sam9g45-ddramc" },  	{ /*sentinel*/ } @@ -436,6 +438,19 @@ end:  	of_node_put(np);  } +void __init at91rm9200_dt_initialize(void) +{ +	at91_dt_ramc(); + +	/* Init clock subsystem */ +	at91_dt_clock_init(); + +	/* Register the processor-specific clocks */ +	at91_boot_soc.register_clocks(); + +	at91_boot_soc.init(); +} +  void __init at91_dt_initialize(void)  {  	at91_dt_rstc(); @@ -448,7 +463,8 @@ void __init at91_dt_initialize(void)  	/* Register the processor-specific clocks */  	at91_boot_soc.register_clocks(); -	at91_boot_soc.init(); +	if (at91_boot_soc.init) +		at91_boot_soc.init();  }  #endif @@ -463,4 +479,6 @@ void __init at91_initialize(unsigned long main_clock)  	at91_boot_soc.register_clocks();  	at91_boot_soc.init(); + +	pinctrl_provide_dummies();  } diff --git a/arch/arm/mach-at91/soc.h b/arch/arm/mach-at91/soc.h index a9cfeb15371..9c6d3d4f9a2 100644 --- a/arch/arm/mach-at91/soc.h +++ b/arch/arm/mach-at91/soc.h @@ -5,6 +5,7 @@   */  struct at91_init_soc { +	int builtin;  	unsigned int *default_irq_priority;  	void (*map_io)(void);  	void (*ioremap_registers)(void); @@ -22,9 +23,18 @@ extern struct at91_init_soc at91sam9rl_soc;  extern struct at91_init_soc at91sam9x5_soc;  extern struct at91_init_soc at91sam9n12_soc; +#define AT91_SOC_START(_name)				\ +struct at91_init_soc __initdata at91##_name##_soc	\ + __used							\ +						= {	\ +	.builtin	= 1,				\ + +#define AT91_SOC_END					\ +}; +  static inline int at91_soc_is_enabled(void)  { -	return at91_boot_soc.init != NULL; +	return at91_boot_soc.builtin;  }  #if !defined(CONFIG_SOC_AT91RM9200) diff --git a/arch/arm/mach-at91/include/mach/stamp9g20.h b/arch/arm/mach-at91/stamp9g20.h index f62c0abca4b..f62c0abca4b 100644 --- a/arch/arm/mach-at91/include/mach/stamp9g20.h +++ b/arch/arm/mach-at91/stamp9g20.h  |