clocksource: armada-370-xp: Introduce new compatibles
The Armada XP SoC clocksource driver cannot work without the 25 MHz fixed timer. Therefore it's appropriate to introduce a new compatible string and use it to set the 25 MHz fixed timer. The 'marvell,timer-25MHz' property will be marked as deprecated. Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> Reviewed-by: Andrew Lunn <andrew@lunn.ch>
This commit is contained in:
committed by
Daniel Lezcano
parent
573145f08c
commit
7cd6392c9b
@@ -13,6 +13,19 @@
|
|||||||
*
|
*
|
||||||
* Timer 0 is used as free-running clocksource, while timer 1 is
|
* Timer 0 is used as free-running clocksource, while timer 1 is
|
||||||
* used as clock_event_device.
|
* used as clock_event_device.
|
||||||
|
*
|
||||||
|
* ---
|
||||||
|
* Clocksource driver for Armada 370 and Armada XP SoC.
|
||||||
|
* This driver implements one compatible string for each SoC, given
|
||||||
|
* each has its own characteristics:
|
||||||
|
*
|
||||||
|
* * Armada 370 has no 25 MHz fixed timer.
|
||||||
|
*
|
||||||
|
* * Armada XP cannot work properly without such 25 MHz fixed timer as
|
||||||
|
* doing otherwise leads to using a clocksource whose frequency varies
|
||||||
|
* when doing cpufreq frequency changes.
|
||||||
|
*
|
||||||
|
* See Documentation/devicetree/bindings/timer/marvell,armada-370-xp-timer.txt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
@@ -212,7 +225,7 @@ static struct local_timer_ops armada_370_xp_local_timer_ops = {
|
|||||||
.stop = armada_370_xp_timer_stop,
|
.stop = armada_370_xp_timer_stop,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init armada_370_xp_timer_init(struct device_node *np)
|
static void __init armada_370_xp_timer_common_init(struct device_node *np)
|
||||||
{
|
{
|
||||||
u32 clr = 0, set = 0;
|
u32 clr = 0, set = 0;
|
||||||
int res;
|
int res;
|
||||||
@@ -221,20 +234,10 @@ static void __init armada_370_xp_timer_init(struct device_node *np)
|
|||||||
WARN_ON(!timer_base);
|
WARN_ON(!timer_base);
|
||||||
local_base = of_iomap(np, 1);
|
local_base = of_iomap(np, 1);
|
||||||
|
|
||||||
if (of_find_property(np, "marvell,timer-25Mhz", NULL)) {
|
if (timer25Mhz)
|
||||||
/* The fixed 25MHz timer is available so let's use it */
|
|
||||||
set = TIMER0_25MHZ;
|
set = TIMER0_25MHZ;
|
||||||
timer_clk = 25000000;
|
else
|
||||||
} else {
|
|
||||||
unsigned long rate = 0;
|
|
||||||
struct clk *clk = of_clk_get(np, 0);
|
|
||||||
WARN_ON(IS_ERR(clk));
|
|
||||||
rate = clk_get_rate(clk);
|
|
||||||
timer_clk = rate / TIMER_DIVIDER;
|
|
||||||
|
|
||||||
clr = TIMER0_25MHZ;
|
clr = TIMER0_25MHZ;
|
||||||
timer25Mhz = false;
|
|
||||||
}
|
|
||||||
timer_ctrl_clrset(clr, set);
|
timer_ctrl_clrset(clr, set);
|
||||||
local_timer_ctrl_clrset(clr, set);
|
local_timer_ctrl_clrset(clr, set);
|
||||||
|
|
||||||
@@ -288,5 +291,26 @@ static void __init armada_370_xp_timer_init(struct device_node *np)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CLOCKSOURCE_OF_DECLARE(armada_370_xp, "marvell,armada-370-xp-timer",
|
|
||||||
armada_370_xp_timer_init);
|
static void __init armada_xp_timer_init(struct device_node *np)
|
||||||
|
{
|
||||||
|
/* The fixed 25MHz timer is required, timer25Mhz is true by default */
|
||||||
|
timer_clk = 25000000;
|
||||||
|
|
||||||
|
armada_370_xp_timer_common_init(np);
|
||||||
|
}
|
||||||
|
CLOCKSOURCE_OF_DECLARE(armada_xp, "marvell,armada-xp-timer",
|
||||||
|
armada_xp_timer_init);
|
||||||
|
|
||||||
|
static void __init armada_370_timer_init(struct device_node *np)
|
||||||
|
{
|
||||||
|
struct clk *clk = of_clk_get(np, 0);
|
||||||
|
|
||||||
|
WARN_ON(IS_ERR(clk));
|
||||||
|
timer_clk = clk_get_rate(clk) / TIMER_DIVIDER;
|
||||||
|
timer25Mhz = false;
|
||||||
|
|
||||||
|
armada_370_xp_timer_common_init(np);
|
||||||
|
}
|
||||||
|
CLOCKSOURCE_OF_DECLARE(armada_370, "marvell,armada-370-timer",
|
||||||
|
armada_370_timer_init);
|
||||||
|
Reference in New Issue
Block a user