diff options
Diffstat (limited to 'arch/arm/mach-at91/at91sam926x_time.c')
| -rw-r--r-- | arch/arm/mach-at91/at91sam926x_time.c | 17 | 
1 files changed, 15 insertions, 2 deletions
diff --git a/arch/arm/mach-at91/at91sam926x_time.c b/arch/arm/mach-at91/at91sam926x_time.c index 3a4bc2e1a65..0a9e2fc8f79 100644 --- a/arch/arm/mach-at91/at91sam926x_time.c +++ b/arch/arm/mach-at91/at91sam926x_time.c @@ -19,6 +19,7 @@  #include <linux/of_irq.h>  #include <asm/mach/time.h> +#include <mach/hardware.h>  #define AT91_PIT_MR		0x00			/* Mode Register */  #define		AT91_PIT_PITIEN		(1 << 25)		/* Timer Interrupt Enable */ @@ -39,6 +40,7 @@  static u32 pit_cycle;		/* write-once */  static u32 pit_cnt;		/* access only w/system irq blocked */  static void __iomem *pit_base_addr __read_mostly; +static struct clk *mck;  static inline unsigned int pit_read(unsigned int reg_offset)  { @@ -171,7 +173,7 @@ 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, +	.flags		= IRQF_SHARED | IRQF_TIMER | IRQF_IRQPOLL,  	.handler	= at91sam926x_pit_interrupt,  	.irq		= NR_IRQS_LEGACY + AT91_ID_SYS,  }; @@ -195,10 +197,14 @@ static int __init of_at91sam926x_pit_init(void)  	if (!pit_base_addr)  		goto node_err; +	mck = of_clk_get(np, 0); +  	/* 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"); +		if (!IS_ERR(mck)) +			clk_put(mck);  		goto ioremap_err;  	}  	at91sam926x_pit_irq.irq = ret; @@ -230,6 +236,8 @@ void __init at91sam926x_pit_init(void)  	unsigned	bits;  	int		ret; +	mck = ERR_PTR(-ENOENT); +  	/* For device tree enabled device: initialize here */  	of_at91sam926x_pit_init(); @@ -237,7 +245,12 @@ void __init at91sam926x_pit_init(void)  	 * Use our actual MCK to figure out how many MCK/16 ticks per  	 * 1/HZ period (instead of a compile-time constant LATCH).  	 */ -	pit_rate = clk_get_rate(clk_get(NULL, "mck")) / 16; +	if (IS_ERR(mck)) +		mck = clk_get(NULL, "mck"); + +	if (IS_ERR(mck)) +		panic("AT91: PIT: Unable to get mck clk\n"); +	pit_rate = clk_get_rate(mck) / 16;  	pit_cycle = (pit_rate + HZ/2) / HZ;  	WARN_ON(((pit_cycle - 1) & ~AT91_PIT_PIV) != 0);  | 
