diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-27 16:47:35 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-27 16:47:35 -0700 | 
| commit | 66f03c614c0902ccf7d6160459362a9352f33271 (patch) | |
| tree | b9a8864efe5aa7fc5c96cc5ccbeca41f5cd6f6a7 /arch/arm/mach-at91/at91sam926x_time.c | |
| parent | 34800598b2eebe061445216473b1e4c2ff5cba99 (diff) | |
| parent | cdc3df6f44f72c5924a16a47e1663c3fb0e57820 (diff) | |
| download | olio-linux-3.10-66f03c614c0902ccf7d6160459362a9352f33271.tar.xz olio-linux-3.10-66f03c614c0902ccf7d6160459362a9352f33271.zip  | |
Merge tag 'dt' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Pull "ARM: device tree work" from Arnd Bergmann:
 "Most of these patches convert code from using static platform data to
  describing the hardware in the device tree.  This is only the first
  half of the changes for v3.4 because a lot of patches for this topic
  came in the last week before the merge window.
  Signed-off-by: Arnd Bergmann <arnd@arndb.de>"
Fix up trivial conflicts in arch/arm/mach-vexpress/{Kconfig,core.h}
* tag 'dt' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (86 commits)
  Document: devicetree: add OF documents for arch-mmp
  ARM: dts: append DTS file of pxa168
  ARM: mmp: append OF support on pxa168
  ARM: mmp: enable rtc clk in pxa168
  i2c: pxa: add OF support
  serial: pxa: add OF support
  arm/dts: mt_ventoux: very basic support for TeeJet Mt.Ventoux board
  ARM: OMAP2+: Remove extra ifdefs for board-generic
  ARM: OMAP2+: Fix build error when only ARCH_OMAP2/3 or 4 is selected
  ASoC: DT: Add digital microphone binding to PAZ00 board.
  ARM: dt: Add ARM PMU to tegra*.dtsi
  ARM: at91: at91sam9x5cm/dt: add leds support
  ARM: at91: usb_a9g20/dt: add gpio-keys support
  ARM: at91: at91sam9m10g45ek/dt: add gpio-keys support
  ARM: at91: at91sam9m10g45ek/dt: add leds support
  ARM: at91: usb_a9g20/dt: add leds support
  ARM: at91/pio: add new PIO3 features
  ARM: at91: add sam9_smc.o to at91sam9x5 build
  ARM: at91/tc/clocksource: Add 32 bit variant to Timer Counter
  ARM: at91/tc: add device tree support to atmel_tclib
  ...
Diffstat (limited to 'arch/arm/mach-at91/at91sam926x_time.c')
| -rw-r--r-- | arch/arm/mach-at91/at91sam926x_time.c | 68 | 
1 files changed, 66 insertions, 2 deletions
diff --git a/arch/arm/mach-at91/at91sam926x_time.c b/arch/arm/mach-at91/at91sam926x_time.c index d89ead740a9..a94758b4273 100644 --- a/arch/arm/mach-at91/at91sam926x_time.c +++ b/arch/arm/mach-at91/at91sam926x_time.c @@ -14,6 +14,9 @@  #include <linux/kernel.h>  #include <linux/clk.h>  #include <linux/clockchips.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h>  #include <asm/mach/time.h> @@ -133,7 +136,8 @@ static irqreturn_t at91sam926x_pit_interrupt(int irq, void *dev_id)  static struct irqaction at91sam926x_pit_irq = {  	.name		= "at91_tick",  	.flags		= IRQF_SHARED | IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, -	.handler	= at91sam926x_pit_interrupt +	.handler	= at91sam926x_pit_interrupt, +	.irq		= AT91_ID_SYS,  };  static void at91sam926x_pit_reset(void) @@ -149,6 +153,51 @@ static void at91sam926x_pit_reset(void)  	pit_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN);  } +#ifdef CONFIG_OF +static struct of_device_id pit_timer_ids[] = { +	{ .compatible = "atmel,at91sam9260-pit" }, +	{ /* sentinel */ } +}; + +static int __init of_at91sam926x_pit_init(void) +{ +	struct device_node	*np; +	int			ret; + +	np = of_find_matching_node(NULL, pit_timer_ids); +	if (!np) +		goto err; + +	pit_base_addr = of_iomap(np, 0); +	if (!pit_base_addr) +		goto node_err; + +	/* Get the interrupts property */ +	ret = irq_of_parse_and_map(np, 0); +	if (!ret) { +		pr_crit("AT91: PIT: Unable to get IRQ from DT\n"); +		goto ioremap_err; +	} +	at91sam926x_pit_irq.irq = ret; + +	of_node_put(np); + +	return 0; + +ioremap_err: +	iounmap(pit_base_addr); +node_err: +	of_node_put(np); +err: +	return -EINVAL; +} +#else +static int __init of_at91sam926x_pit_init(void) +{ +	return -EINVAL; +} +#endif +  /*   * Set up both clocksource and clockevent support.   */ @@ -156,6 +205,10 @@ static void __init at91sam926x_pit_init(void)  {  	unsigned long	pit_rate;  	unsigned	bits; +	int		ret; + +	/* For device tree enabled device: initialize here */ +	of_at91sam926x_pit_init();  	/*  	 * Use our actual MCK to figure out how many MCK/16 ticks per @@ -177,7 +230,9 @@ static void __init at91sam926x_pit_init(void)  	clocksource_register_hz(&pit_clk, pit_rate);  	/* Set up irq handler */ -	setup_irq(AT91_ID_SYS, &at91sam926x_pit_irq); +	ret = setup_irq(at91sam926x_pit_irq.irq, &at91sam926x_pit_irq); +	if (ret) +		pr_crit("AT91: PIT: Unable to setup IRQ\n");  	/* Set up and register clockevents */  	pit_clkevt.mult = div_sc(pit_rate, NSEC_PER_SEC, pit_clkevt.shift); @@ -193,6 +248,15 @@ static void at91sam926x_pit_suspend(void)  void __init at91sam926x_ioremap_pit(u32 addr)  { +#if defined(CONFIG_OF) +	struct device_node *np = +		of_find_matching_node(NULL, pit_timer_ids); + +	if (np) { +		of_node_put(np); +		return; +	} +#endif  	pit_base_addr = ioremap(addr, 16);  	if (!pit_base_addr)  |