FROMLIST: clocksource: mips-gic: Add device-tree support

Parse the GIC timer frequency and interrupt from the device-tree.

Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
Acked-by: Arnd Bergmann <arnd@arndb.de>
(am from http://patchwork.linux-mips.org/patch/8421/)

BUG=chrome-os-partner:30840
TEST=Build and boot on FPGA

Change-Id: I35669cd8cf9fc733d9dcc4e351d9913bc3d999a3
Reviewed-on: https://chromium-review.googlesource.com/220063
Reviewed-by: Ben Chan <benchan@chromium.org>
Commit-Queue: Andrew Bresticker <abrestic@chromium.org>
Tested-by: Andrew Bresticker <abrestic@chromium.org>
This commit is contained in:
Andrew Bresticker
2014-11-12 11:43:39 -08:00
committed by chrome-internal-fetch
parent b0ded5b5fc
commit aa9612d3f5
2 changed files with 35 additions and 7 deletions

View File

@@ -154,3 +154,4 @@ config CLKSRC_QCOM
config CLKSRC_MIPS_GIC
bool
depends on MIPS_GIC
select CLKSRC_OF

View File

@@ -11,6 +11,7 @@
#include <linux/interrupt.h>
#include <linux/irqchip/mips-gic.h>
#include <linux/notifier.h>
#include <linux/of_irq.h>
#include <linux/percpu.h>
#include <linux/smp.h>
#include <linux/time.h>
@@ -101,8 +102,6 @@ static int gic_clockevent_init(void)
if (!cpu_has_counter || !gic_frequency)
return -ENXIO;
gic_timer_irq = MIPS_GIC_IRQ_BASE +
GIC_LOCAL_TO_HWIRQ(GIC_LOCAL_INT_COMPARE);
setup_percpu_irq(gic_timer_irq, &gic_compare_irqaction);
register_cpu_notifier(&gic_cpu_nb);
@@ -123,17 +122,45 @@ static struct clocksource gic_clocksource = {
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
};
void __init gic_clocksource_init(unsigned int frequency)
static void __init __gic_clocksource_init(void)
{
gic_frequency = frequency;
/* Set clocksource mask. */
gic_clocksource.mask = CLOCKSOURCE_MASK(gic_get_count_width());
/* Calculate a somewhat reasonable rating value. */
gic_clocksource.rating = 200 + frequency / 10000000;
gic_clocksource.rating = 200 + gic_frequency / 10000000;
clocksource_register_hz(&gic_clocksource, frequency);
clocksource_register_hz(&gic_clocksource, gic_frequency);
gic_clockevent_init();
}
void __init gic_clocksource_init(unsigned int frequency)
{
gic_frequency = frequency;
gic_timer_irq = MIPS_GIC_IRQ_BASE +
GIC_LOCAL_TO_HWIRQ(GIC_LOCAL_INT_COMPARE);
__gic_clocksource_init();
}
static void __init gic_clocksource_of_init(struct device_node *node)
{
if (WARN_ON(!gic_present || !node->parent ||
!of_device_is_compatible(node->parent, "mti,gic")))
return;
if (of_property_read_u32(node, "clock-frequency", &gic_frequency)) {
pr_err("GIC frequency not specified.\n");
return;
}
gic_timer_irq = irq_of_parse_and_map(node, 0);
if (!gic_timer_irq) {
pr_err("GIC timer IRQ not specified.\n");
return;
}
__gic_clocksource_init();
}
CLOCKSOURCE_OF_DECLARE(mips_gic_timer, "mti,gic-timer",
gic_clocksource_of_init);