ARM: OMAP2+: Add device-tree support for 32kHz counter
For OMAP devices, the 32kHz counter is the default clock-source for the kernel. However, this is not the only possible clock-source the kernel can use for OMAP devices. When booting with device-tree, if the 32kHz counter is the desired clock-source for the kernel, then parse the device-tree blob to ensure that the counter is present and if so map memory for the counter using the device-tree of_iomap() function so we are no longer reliant on the OMAP HWMOD framework to do this for us. Signed-off-by: Jon Hunter <jon-hunter@ti.com>
This commit is contained in:
parent
9725f4451a
commit
9883f7c8dd
1 changed files with 27 additions and 1 deletions
|
@ -159,6 +159,11 @@ static struct of_device_id omap_timer_match[] __initdata = {
|
|||
{ }
|
||||
};
|
||||
|
||||
static struct of_device_id omap_counter_match[] __initdata = {
|
||||
{ .compatible = "ti,omap-counter32k", },
|
||||
{ }
|
||||
};
|
||||
|
||||
/**
|
||||
* omap_get_timer_dt - get a timer using device-tree
|
||||
* @match - device-tree match structure for matching a device type
|
||||
|
@ -377,10 +382,25 @@ static u32 notrace dmtimer_read_sched_clock(void)
|
|||
static int __init omap2_sync32k_clocksource_init(void)
|
||||
{
|
||||
int ret;
|
||||
struct device_node *np = NULL;
|
||||
struct omap_hwmod *oh;
|
||||
void __iomem *vbase;
|
||||
const char *oh_name = "counter_32k";
|
||||
|
||||
/*
|
||||
* If device-tree is present, then search the DT blob
|
||||
* to see if the 32kHz counter is supported.
|
||||
*/
|
||||
if (of_have_populated_dt()) {
|
||||
np = omap_get_timer_dt(omap_counter_match, NULL);
|
||||
if (!np)
|
||||
return -ENODEV;
|
||||
|
||||
of_property_read_string_index(np, "ti,hwmods", 0, &oh_name);
|
||||
if (!oh_name)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/*
|
||||
* First check hwmod data is available for sync32k counter
|
||||
*/
|
||||
|
@ -390,7 +410,13 @@ static int __init omap2_sync32k_clocksource_init(void)
|
|||
|
||||
omap_hwmod_setup_one(oh_name);
|
||||
|
||||
vbase = omap_hwmod_get_mpu_rt_va(oh);
|
||||
if (np) {
|
||||
vbase = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
} else {
|
||||
vbase = omap_hwmod_get_mpu_rt_va(oh);
|
||||
}
|
||||
|
||||
if (!vbase) {
|
||||
pr_warn("%s: failed to get counter_32k resource\n", __func__);
|
||||
return -ENXIO;
|
||||
|
|
Loading…
Reference in a new issue