Commit 10021488 authored by Heiko Stuebner's avatar Heiko Stuebner

clocksource: dw_apb_timer_of: use clocksource_of_init

dw_apb_timer_init used to search the devicetree for matching timer
devices, making calls to it from board files necessary.

Change the dw_apb_timer_init to work with CLOCKSOURCE_OF_DECLARE.
With this change the function gets called once for each timer node
and tracks these number of calls to attach clockevent and clocksource
devices to the nodes.

Also remove the calls to dw_apb_timer_init from all previous users, as
clocksource_of_init is the default for init_time now.

Tested on the upcoming rk3066 code.
Signed-off-by: default avatarHeiko Stuebner <heiko@sntech.de>
Acked-by: default avatarRob Herring <rob.herring@calxeda.com>
Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
Acked-by: default avatarJamie Iles <jamie@jamieiles.com>
Acked-by: default avatarDinh Nguyen <dinguyen@altera.com>
parent 1b4eca0f
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/of_irq.h> #include <linux/of_irq.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/dw_apb_timer.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
...@@ -88,7 +87,6 @@ DT_MACHINE_START(PICOXCELL, "Picochip picoXcell") ...@@ -88,7 +87,6 @@ DT_MACHINE_START(PICOXCELL, "Picochip picoXcell")
.map_io = picoxcell_map_io, .map_io = picoxcell_map_io,
.nr_irqs = NR_IRQS_LEGACY, .nr_irqs = NR_IRQS_LEGACY,
.init_irq = irqchip_init, .init_irq = irqchip_init,
.init_time = dw_apb_timer_init,
.init_machine = picoxcell_init_machine, .init_machine = picoxcell_init_machine,
.dt_compat = picoxcell_dt_match, .dt_compat = picoxcell_dt_match,
.restart = picoxcell_wdt_restart, .restart = picoxcell_wdt_restart,
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <linux/dw_apb_timer.h>
#include <linux/clk-provider.h> #include <linux/clk-provider.h>
#include <linux/irqchip.h> #include <linux/irqchip.h>
#include <linux/of_address.h> #include <linux/of_address.h>
...@@ -120,7 +119,6 @@ DT_MACHINE_START(SOCFPGA, "Altera SOCFPGA") ...@@ -120,7 +119,6 @@ DT_MACHINE_START(SOCFPGA, "Altera SOCFPGA")
.smp = smp_ops(socfpga_smp_ops), .smp = smp_ops(socfpga_smp_ops),
.map_io = socfpga_map_io, .map_io = socfpga_map_io,
.init_irq = socfpga_init_irq, .init_irq = socfpga_init_irq,
.init_time = dw_apb_timer_init,
.init_machine = socfpga_cyclone5_init, .init_machine = socfpga_cyclone5_init,
.restart = socfpga_cyclone5_restart, .restart = socfpga_cyclone5_restart,
.dt_compat = altera_dt_match, .dt_compat = altera_dt_match,
......
...@@ -22,6 +22,7 @@ config DW_APB_TIMER ...@@ -22,6 +22,7 @@ config DW_APB_TIMER
config DW_APB_TIMER_OF config DW_APB_TIMER_OF
bool bool
select DW_APB_TIMER select DW_APB_TIMER
select CLKSRC_OF
config ARMADA_370_XP_TIMER config ARMADA_370_XP_TIMER
bool bool
......
...@@ -133,27 +133,26 @@ static void init_sched_clock(void) ...@@ -133,27 +133,26 @@ static void init_sched_clock(void)
setup_sched_clock(read_sched_clock, 32, sched_rate); setup_sched_clock(read_sched_clock, 32, sched_rate);
} }
static const struct of_device_id osctimer_ids[] __initconst = { static int num_called;
{ .compatible = "picochip,pc3x2-timer" }, static void __init dw_apb_timer_init(struct device_node *timer)
{ .compatible = "snps,dw-apb-timer-osc" },
{},
};
void __init dw_apb_timer_init(void)
{ {
struct device_node *event_timer, *source_timer; switch (num_called) {
case 0:
event_timer = of_find_matching_node(NULL, osctimer_ids); pr_debug("%s: found clockevent timer\n", __func__);
if (!event_timer) add_clockevent(timer);
panic("No timer for clockevent"); of_node_put(timer);
add_clockevent(event_timer); break;
case 1:
source_timer = of_find_matching_node(event_timer, osctimer_ids); pr_debug("%s: found clocksource timer\n", __func__);
if (!source_timer) add_clocksource(timer);
panic("No timer for clocksource"); of_node_put(timer);
add_clocksource(source_timer); init_sched_clock();
break;
of_node_put(source_timer); default:
break;
}
init_sched_clock(); num_called++;
} }
CLOCKSOURCE_OF_DECLARE(pc3x2_timer, "picochip,pc3x2-timer", dw_apb_timer_init);
CLOCKSOURCE_OF_DECLARE(apb_timer, "snps,dw-apb-timer-osc", dw_apb_timer_init);
...@@ -53,5 +53,4 @@ void dw_apb_clocksource_start(struct dw_apb_clocksource *dw_cs); ...@@ -53,5 +53,4 @@ void dw_apb_clocksource_start(struct dw_apb_clocksource *dw_cs);
cycle_t dw_apb_clocksource_read(struct dw_apb_clocksource *dw_cs); cycle_t dw_apb_clocksource_read(struct dw_apb_clocksource *dw_cs);
void dw_apb_clocksource_unregister(struct dw_apb_clocksource *dw_cs); void dw_apb_clocksource_unregister(struct dw_apb_clocksource *dw_cs);
extern void dw_apb_timer_init(void);
#endif /* __DW_APB_TIMER_H__ */ #endif /* __DW_APB_TIMER_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment