[PATCH v3 18/19] ARM: at91: move pit timer to common clk framework
Nicolas Ferre
nicolas.ferre at atmel.com
Tue Oct 8 12:28:23 EDT 2013
On 08/08/2013 10:17, Boris BREZILLON :
> Use device tree to get the source clock of the PIT (Periodic Interval Timer).
> If the clock is not found in device tree (or dt is not enabled) we'll try to
> get it using clk_lookup definitions.
>
> Signed-off-by: Boris BREZILLON <b.brezillon at overkiz.com>
Acked-by: Nicolas Ferre <nicolas.ferre at atmel.com>
> ---
> arch/arm/mach-at91/at91sam926x_time.c | 14 +++++++++++++-
> 1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/mach-at91/at91sam926x_time.c b/arch/arm/mach-at91/at91sam926x_time.c
> index 3a4bc2e..8ac976a 100644
> --- a/arch/arm/mach-at91/at91sam926x_time.c
> +++ b/arch/arm/mach-at91/at91sam926x_time.c
> @@ -39,6 +39,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)
> {
> @@ -195,10 +196,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 +235,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 +244,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);
>
>
--
Nicolas Ferre
More information about the linux-arm-kernel
mailing list