mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-15 15:04:27 +08:00
ba327b1e52
This adjusts the clockrate for the MTU timer. On the different UX500 variants this rate is different. The platform can also have been set up at hardware initialization, bootloader or early init for different clock speeds. To have the clock framework available early so the timers can use them, the clock initialization for Nomadik and ux500 is moved to IRQ init time. A custom per-clock callback is added to handle special cases like this. This solves a user-visible bug: without this patch the current UX500 platforms will not be synchronized to wall-clock time and the platform will drift in time. Acked-by: Rabin Vincent <rabin.vincent@stericsson.com> Signed-off-by: Linus Walleij <linus.walleij@stericsson.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
72 lines
1.3 KiB
C
72 lines
1.3 KiB
C
/*
|
|
* linux/arch/arm/mach-nomadik/clock.c
|
|
*
|
|
* Copyright (C) 2009 Alessandro Rubini
|
|
*/
|
|
#include <linux/kernel.h>
|
|
#include <linux/module.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/clk.h>
|
|
#include <asm/clkdev.h>
|
|
#include "clock.h"
|
|
|
|
/*
|
|
* The nomadik board uses generic clocks, but the serial pl011 file
|
|
* calls clk_enable(), clk_disable(), clk_get_rate(), so we provide them
|
|
*/
|
|
unsigned long clk_get_rate(struct clk *clk)
|
|
{
|
|
return clk->rate;
|
|
}
|
|
EXPORT_SYMBOL(clk_get_rate);
|
|
|
|
/* enable and disable do nothing */
|
|
int clk_enable(struct clk *clk)
|
|
{
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL(clk_enable);
|
|
|
|
void clk_disable(struct clk *clk)
|
|
{
|
|
}
|
|
EXPORT_SYMBOL(clk_disable);
|
|
|
|
static struct clk clk_24 = {
|
|
.rate = 2400000,
|
|
};
|
|
|
|
static struct clk clk_48 = {
|
|
.rate = 48 * 1000 * 1000,
|
|
};
|
|
|
|
/*
|
|
* Catch-all default clock to satisfy drivers using the clk API. We don't
|
|
* model the actual hardware clocks yet.
|
|
*/
|
|
static struct clk clk_default;
|
|
|
|
#define CLK(_clk, dev) \
|
|
{ \
|
|
.clk = _clk, \
|
|
.dev_id = dev, \
|
|
}
|
|
|
|
static struct clk_lookup lookups[] = {
|
|
CLK(&clk_24, "mtu0"),
|
|
CLK(&clk_24, "mtu1"),
|
|
CLK(&clk_48, "uart0"),
|
|
CLK(&clk_48, "uart1"),
|
|
CLK(&clk_default, "gpio.0"),
|
|
CLK(&clk_default, "gpio.1"),
|
|
CLK(&clk_default, "gpio.2"),
|
|
CLK(&clk_default, "gpio.3"),
|
|
CLK(&clk_default, "rng"),
|
|
};
|
|
|
|
int __init clk_init(void)
|
|
{
|
|
clkdev_add_table(lookups, ARRAY_SIZE(lookups));
|
|
return 0;
|
|
}
|