Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae278a93 authored by Stephen Warren's avatar Stephen Warren
Browse files

clocksource: add common of_clksrc_init() function



It is desirable to move all clocksource drivers to drivers/clocksource,
yet each requires its own initialization function. We'd rather not
pollute <linux/> with a header for each function. Instead, create a
single of_clksrc_init() function which will determine which clocksource
driver to initialize based on device tree.

Based on a similar patch for drivers/irqchip by Thomas Petazzoni.

Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
parent 6bb27d73
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
config CLKSRC_OF
	bool

config CLKSRC_I8253
config CLKSRC_I8253
	bool
	bool


+1 −0
Original line number Original line Diff line number Diff line
obj-$(CONFIG_CLKSRC_OF)	+= clksrc-of.o
obj-$(CONFIG_ATMEL_TCB_CLKSRC)	+= tcb_clksrc.o
obj-$(CONFIG_ATMEL_TCB_CLKSRC)	+= tcb_clksrc.o
obj-$(CONFIG_X86_CYCLONE_TIMER)	+= cyclone.o
obj-$(CONFIG_X86_CYCLONE_TIMER)	+= cyclone.o
obj-$(CONFIG_X86_PM_TIMER)	+= acpi_pm.o
obj-$(CONFIG_X86_PM_TIMER)	+= acpi_pm.o
+35 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <linux/init.h>
#include <linux/of.h>

extern struct of_device_id __clksrc_of_table[];

static const struct of_device_id __clksrc_of_table_sentinel
	__used __section(__clksrc_of_table_end);

void __init clocksource_of_init(void)
{
	struct device_node *np;
	const struct of_device_id *match;
	void (*init_func)(void);

	for_each_matching_node_and_match(np, __clksrc_of_table, &match) {
		init_func = match->data;
		init_func();
	}
}
+9 −0
Original line number Original line Diff line number Diff line
@@ -149,6 +149,14 @@
#define TRACE_SYSCALLS()
#define TRACE_SYSCALLS()
#endif
#endif


#ifdef CONFIG_CLKSRC_OF
#define CLKSRC_OF_TABLES() . = ALIGN(8);				\
			   VMLINUX_SYMBOL(__clksrc_of_table) = .;	\
			   *(__clksrc_of_table)				\
			   *(__clksrc_of_table_end)
#else
#define CLKSRC_OF_TABLES()
#endif


#define KERNEL_DTB()							\
#define KERNEL_DTB()							\
	STRUCT_ALIGN();							\
	STRUCT_ALIGN();							\
@@ -493,6 +501,7 @@
	DEV_DISCARD(init.rodata)					\
	DEV_DISCARD(init.rodata)					\
	CPU_DISCARD(init.rodata)					\
	CPU_DISCARD(init.rodata)					\
	MEM_DISCARD(init.rodata)					\
	MEM_DISCARD(init.rodata)					\
	CLKSRC_OF_TABLES()						\
	KERNEL_DTB()
	KERNEL_DTB()


#define INIT_TEXT							\
#define INIT_TEXT							\
+9 −0
Original line number Original line Diff line number Diff line
@@ -332,4 +332,13 @@ extern int clocksource_mmio_init(void __iomem *, const char *,


extern int clocksource_i8253_init(void);
extern int clocksource_i8253_init(void);


#ifdef CONFIG_CLKSRC_OF
extern void clocksource_of_init(void);

#define CLOCKSOURCE_OF_DECLARE(name, compat, fn)			\
	static const struct of_device_id __clksrc_of_table_##name	\
		__used __section(__clksrc_of_table)			\
		 = { .compatible = compat, .data = fn };
#endif

#endif /* _LINUX_CLOCKSOURCE_H */
#endif /* _LINUX_CLOCKSOURCE_H */