Messages in this thread Patch in this message | | | From | Chunyan Zhang <> | Subject | [PATCH v2 2/3] clocksource/drivers/timer-of: Add boilerplate macros for timer module driver | Date | Thu, 15 Jul 2021 14:54:54 +0800 |
| |
From: Chunyan Zhang <chunyan.zhang@unisoc.com>
To support module build, platform driver structs, .probe(), match table and module macros need to be added to the timer driver. So this patch provides a few macros to take care of these things, and that would reduce the repeat code lines in every sigle driver.
Signed-off-by: Chunyan Zhang <chunyan.zhang@unisoc.com> --- drivers/clocksource/timer-of.c | 13 +++++++++++++ drivers/clocksource/timer-of.h | 20 ++++++++++++++++++++ 2 files changed, 33 insertions(+)
diff --git a/drivers/clocksource/timer-of.c b/drivers/clocksource/timer-of.c index 7f108978fd51..ecd7f7379400 100644 --- a/drivers/clocksource/timer-of.c +++ b/drivers/clocksource/timer-of.c @@ -8,7 +8,9 @@ #include <linux/interrupt.h> #include <linux/of.h> #include <linux/of_address.h> +#include <linux/of_device.h> #include <linux/of_irq.h> +#include <linux/platform_device.h> #include <linux/slab.h> #include "timer-of.h" @@ -229,3 +231,14 @@ void timer_of_cleanup(struct timer_of *to) if (to->flags & TIMER_OF_BASE) timer_of_base_exit(&to->of_base); } + +int platform_timer_probe(struct platform_device *pdev) +{ + int (*init_cb)(struct device_node *node); + struct device_node *np = pdev->dev.of_node; + + init_cb = of_device_get_match_data(&pdev->dev); + + return init_cb(np); +} +EXPORT_SYMBOL_GPL(platform_timer_probe); diff --git a/drivers/clocksource/timer-of.h b/drivers/clocksource/timer-of.h index 1b8cfac5900a..129f539d5f54 100644 --- a/drivers/clocksource/timer-of.h +++ b/drivers/clocksource/timer-of.h @@ -3,6 +3,7 @@ #define __TIMER_OF_H__ #include <linux/clockchips.h> +#include <linux/platform_device.h> #define TIMER_OF_BASE 0x1 #define TIMER_OF_CLOCK 0x2 @@ -71,4 +72,23 @@ extern int timer_of_init(struct device_node *np, extern void timer_of_cleanup(struct timer_of *to); +extern int platform_timer_probe(struct platform_device *pdev); + +#define TIMER_PLATFORM_DRIVER_BEGIN(drv_name) \ +static const struct of_device_id drv_name##_timer_match_table[] = { + +#define TIMER_MATCH(compat, _data) { .compatible = compat, .data = _data }, + +#define TIMER_PLATFORM_DRIVER_END(drv_name) \ + {}, \ +}; \ +MODULE_DEVICE_TABLE(of, drv_name##_timer_match_table); \ +static struct platform_driver drv_name##_driver = { \ + .probe = platform_timer_probe, \ + .driver = { \ + .name = #drv_name, \ + .of_match_table = drv_name##_timer_match_table, \ + }, \ +}; \ +module_platform_driver(drv_name##_driver) #endif -- 2.25.1
| |