Skip to contentSkip to conversation

clocksource/drivers/stm: Fix section mismatches

PATCH Applied Johan Hovold 4 participants 10 messages Oct 17, 2025 – Nov 26, 2025

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 clocksource/drivers/stm: Fix section mismatches

Platform drivers can be probed after their init sections have been discarded (e.g. on probe deferral or manual rebind through sysfs) so the probe function must not live in init. Device managed resource actions similarly cannot be discarded.

The "_probe" suffix of the driver structure name prevents modpost from warning about this so replace it to catch any similar future issues.

Fixes cec32ac75827 ("clocksource/drivers/nxp-timer: Add the System Timer Module for the s32gx platforms")
Cc Daniel Lezcano <[email protected]>
---
 drivers/clocksource/timer-nxp-stm.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/clocksource/timer-nxp-stm.c +9 -9
index bbc40623728f..ce10bdcfc76b 100644
@@ -177,15 +177,15 @@ static void nxp_stm_clocksource_resume(struct clocksource *cs)
 	nxp_stm_clocksource_enable(cs);
 }
 
-static void __init devm_clocksource_unregister(void *data)
+static void devm_clocksource_unregister(void *data)
 {
 	struct stm_timer *stm_timer = data;
 
 	clocksource_unregister(&stm_timer->cs);
 }
 
-static int __init nxp_stm_clocksource_init(struct device *dev, struct stm_timer *stm_timer,
-					   const char *name, void __iomem *base, struct clk *clk)
+static int nxp_stm_clocksource_init(struct device *dev, struct stm_timer *stm_timer,
+				    const char *name, void __iomem *base, struct clk *clk)
 {
 	int ret;
 
@@ -298,9 +298,9 @@ static void nxp_stm_clockevent_resume(struct clock_event_device *ced)
 	nxp_stm_module_get(stm_timer);
 }
 
-static int __init nxp_stm_clockevent_per_cpu_init(struct device *dev, struct stm_timer *stm_timer,
-						  const char *name, void __iomem *base, int irq,
-						  struct clk *clk, int cpu)
+static int nxp_stm_clockevent_per_cpu_init(struct device *dev, struct stm_timer *stm_timer,
+					   const char *name, void __iomem *base, int irq,
+					   struct clk *clk, int cpu)
 {
 	stm_timer->base = base;
 	stm_timer->rate = clk_get_rate(clk);
@@ -388,7 +388,7 @@ static irqreturn_t nxp_stm_module_interrupt(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
-static int __init nxp_stm_timer_probe(struct platform_device *pdev)
+static int nxp_stm_timer_probe(struct platform_device *pdev)
 {
 	struct stm_timer *stm_timer;
 	struct device *dev = &pdev->dev;
@@ -484,14 +484,14 @@ static const struct of_device_id nxp_stm_of_match[] = {
 };
 MODULE_DEVICE_TABLE(of, nxp_stm_of_match);
 
-static struct platform_driver nxp_stm_probe = {
+static struct platform_driver nxp_stm_driver = {
 	.probe	= nxp_stm_timer_probe,
 	.driver	= {
 		.name		= "nxp-stm",
 		.of_match_table	= nxp_stm_of_match,
 	},
 };
-module_platform_driver(nxp_stm_probe);
+module_platform_driver(nxp_stm_driver);
 
 MODULE_DESCRIPTION("NXP System Timer Module driver");
 MODULE_LICENSE("GPL");
Signature · 1 line
2.49.1
#1 lore raw
Quoted 5 lines · Johan Hovold

Platform drivers can be probed after their init sections have been discarded (e.g. on probe deferral or manual rebind through sysfs) so the probe function must not live in init. Device managed resource actions similarly cannot be discarded.

Quoted 7 lines

The "_probe" suffix of the driver structure name prevents modpost from warning about this so replace it to catch any similar future issues.

Fixes cec32ac75827 ("clocksource/drivers/nxp-timer: Add the System Timer Module for the s32gx platforms")
Cc Daniel Lezcano <[email protected]>

Addressing this apparently depends on commit 84b1a903aed8 ("time/sched_clock: Export symbol for sched_clock register function") which was merged for 6.18-rc1.

So the stable tag should be dropped (e.g. unless it's possible to backport also the dependency to 6.17).

Johan

maintainer
#2 lore raw
Quoted 14 lines · Johan Hovold
Quoted 5 lines · Johan Hovold

Platform drivers can be probed after their init sections have been discarded (e.g. on probe deferral or manual rebind through sysfs) so the probe function must not live in init. Device managed resource actions similarly cannot be discarded.

Quoted 7 lines

The "_probe" suffix of the driver structure name prevents modpost from warning about this so replace it to catch any similar future issues.

Fixes cec32ac75827 ("clocksource/drivers/nxp-timer: Add the System Timer Module for the s32gx platforms")
Cc Daniel Lezcano <[email protected]>
Quoted 6 lines

Addressing this apparently depends on commit 84b1a903aed8 ("time/sched_clock: Export symbol for sched_clock register function") which was merged for 6.18-rc1.

So the stable tag should be dropped (e.g. unless it's possible to backport also the dependency to 6.17).

Quite easy to do so, just ask us! :)

#3 lore raw
Quoted 15 lines · Greg Kroah-Hartman
Quoted 14 lines · Johan Hovold
Quoted 12 lines · Johan Hovold

Platform drivers can be probed after their init sections have been discarded (e.g. on probe deferral or manual rebind through sysfs) so the probe function must not live in init. Device managed resource actions similarly cannot be discarded.

The "_probe" suffix of the driver structure name prevents modpost from warning about this so replace it to catch any similar future issues.

Fixes cec32ac75827 ("clocksource/drivers/nxp-timer: Add the System Timer Module for the s32gx platforms")
Cc Daniel Lezcano <[email protected]>
Quoted 8 lines
Quoted 6 lines

Addressing this apparently depends on commit 84b1a903aed8 ("time/sched_clock: Export symbol for sched_clock register function") which was merged for 6.18-rc1.

So the stable tag should be dropped (e.g. unless it's possible to backport also the dependency to 6.17).

Quite easy to do so, just ask us! :)

Heh. I meant that there may be something preventing the dependency from being backported (even if I didn't see anything obvious based on a quick look at the series adding it).

Johan

#4 lore raw
In reply to Johan Hovold

Hi Johan,

thanks for your fix.

You should replace __init by __init_or_module

Quoted 78 lines · Johan Hovold

Platform drivers can be probed after their init sections have been discarded (e.g. on probe deferral or manual rebind through sysfs) so the probe function must not live in init. Device managed resource actions similarly cannot be discarded.

The "_probe" suffix of the driver structure name prevents modpost from warning about this so replace it to catch any similar future issues.

Fixes cec32ac75827 ("clocksource/drivers/nxp-timer: Add the System Timer Module for the s32gx platforms")
Cc Daniel Lezcano <[email protected]>
---
  drivers/clocksource/timer-nxp-stm.c | 18 +++++++++---------
  1 file changed, 9 insertions(+), 9 deletions(-)
drivers/clocksource/timer-nxp-stm.c +9 -9
index bbc40623728f..ce10bdcfc76b 100644
@@ -177,15 +177,15 @@ static void nxp_stm_clocksource_resume(struct clocksource *cs)
  	nxp_stm_clocksource_enable(cs);
  }
 
-static void __init devm_clocksource_unregister(void *data)
+static void devm_clocksource_unregister(void *data)
  {
  	struct stm_timer *stm_timer = data;
 
  	clocksource_unregister(&stm_timer->cs);
  }
 
-static int __init nxp_stm_clocksource_init(struct device *dev, struct stm_timer *stm_timer,
-					   const char *name, void __iomem *base, struct clk *clk)
+static int nxp_stm_clocksource_init(struct device *dev, struct stm_timer *stm_timer,
+				    const char *name, void __iomem *base, struct clk *clk)
  {
  	int ret;
 
@@ -298,9 +298,9 @@ static void nxp_stm_clockevent_resume(struct clock_event_device *ced)
  	nxp_stm_module_get(stm_timer);
  }
 
-static int __init nxp_stm_clockevent_per_cpu_init(struct device *dev, struct stm_timer *stm_timer,
-						  const char *name, void __iomem *base, int irq,
-						  struct clk *clk, int cpu)
+static int nxp_stm_clockevent_per_cpu_init(struct device *dev, struct stm_timer *stm_timer,
+					   const char *name, void __iomem *base, int irq,
+					   struct clk *clk, int cpu)
  {
  	stm_timer->base = base;
  	stm_timer->rate = clk_get_rate(clk);
@@ -388,7 +388,7 @@ static irqreturn_t nxp_stm_module_interrupt(int irq, void *dev_id)
  	return IRQ_HANDLED;
  }
 
-static int __init nxp_stm_timer_probe(struct platform_device *pdev)
+static int nxp_stm_timer_probe(struct platform_device *pdev)
  {
  	struct stm_timer *stm_timer;
  	struct device *dev = &pdev->dev;
@@ -484,14 +484,14 @@ static const struct of_device_id nxp_stm_of_match[] = {
  };
  MODULE_DEVICE_TABLE(of, nxp_stm_of_match);
 
-static struct platform_driver nxp_stm_probe = {
+static struct platform_driver nxp_stm_driver = {
  	.probe	= nxp_stm_timer_probe,
  	.driver	= {
  		.name		= "nxp-stm",
  		.of_match_table	= nxp_stm_of_match,
  	},
  };
-module_platform_driver(nxp_stm_probe);
+module_platform_driver(nxp_stm_driver);
 
  MODULE_DESCRIPTION("NXP System Timer Module driver");
  MODULE_LICENSE("GPL");
Signature · 5 lines
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
#5 lore raw

Hi Daniel,

Quoted 1 line · Daniel Lezcano

You should replace __init by __init_or_module

That's not sufficient as the driver can still be rebound through sysfs currently (the driver would probably crash anyway, but that's a separate issue).

Also note that no drivers use __init_or_module these days, likely as everyone uses modules and it's not worth the added complexity in trying to get the section markers right for a build configuration that few people care about.

I can send a follow-on patch to suppress the unbind attribute, or include it in a v2 if you insist on using __init_or_module.

What do you prefer?

Quoted 5 lines · Johan Hovold
Quoted 4 lines

Platform drivers can be probed after their init sections have been discarded (e.g. on probe deferral or manual rebind through sysfs) so the probe function must not live in init. Device managed resource actions similarly cannot be discarded.

Johan

#6 lore raw
Quoted 15 lines · Johan Hovold

Hi Daniel,

Quoted 1 line · Daniel Lezcano

You should replace __init by __init_or_module

That's not sufficient as the driver can still be rebound through sysfs currently (the driver would probably crash anyway, but that's a separate issue).

Also note that no drivers use __init_or_module these days, likely as everyone uses modules and it's not worth the added complexity in trying to get the section markers right for a build configuration that few people care about.

Quoted 4 lines

I can send a follow-on patch to suppress the unbind attribute, or include it in a v2 if you insist on using __init_or_module.

What do you prefer?

I think it makes sens to use __init_or_module because these drivers have been always compiled in and we are converting them into modules.

[ ... ]

Signature · 5 lines
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
#7 lore raw
Quoted 15 lines · Daniel Lezcano
Quoted 13 lines · Johan Hovold
Quoted 1 line · Daniel Lezcano

You should replace __init by __init_or_module

That's not sufficient as the driver can still be rebound through sysfs currently (the driver would probably crash anyway, but that's a separate issue).

Also note that no drivers use __init_or_module these days, likely as everyone uses modules and it's not worth the added complexity in trying to get the section markers right for a build configuration that few people care about.

Quoted 7 lines
Quoted 4 lines

I can send a follow-on patch to suppress the unbind attribute, or include it in a v2 if you insist on using __init_or_module.

What do you prefer?

I think it makes sens to use __init_or_module because these drivers have been always compiled in and we are converting them into modules.

That's not really relevant. __init_or_module will only save a tiny bit of memory in builds where modules are completely disabled (i.e. !CONFIG_MODULES) which is hardly used any more.

Note that it has nothing to do with whether this particular driver is built as a module or not.

And since no other drivers cares about this uncommon case, are you sure you want to do this here?

Note that this would also require suppressing section mismatch warnings for the common case (CONFIG_MODULES).

Johan

#8 lore raw
In reply to Johan Hovold
Quoted 5 lines · Johan Hovold

Platform drivers can be probed after their init sections have been discarded (e.g. on probe deferral or manual rebind through sysfs) so the probe function must not live in init. Device managed resource actions similarly cannot be discarded.

Quoted 8 lines

The "_probe" suffix of the driver structure name prevents modpost from warning about this so replace it to catch any similar future issues.

Fixes cec32ac75827 ("clocksource/drivers/nxp-timer: Add the System Timer Module for the s32gx platforms")
Cc Daniel Lezcano <[email protected]>

---

Applied, thanks

Signature · 5 lines
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
merge bot Applied
#9 lore raw

[tip: timers/clocksource] clocksource/drivers/nxp-stm: Fix section mismatches

In reply to Johan Hovold
The following commit has been merged into the timers/clocksource branch of tip:

The following commit has been merged into the timers/clocksource branch of tip:

Commit-ID:     b452d2c97eeccbf9c7ac5b3d2d9e80bf6d8a23db
Gitweb:        https://git.kernel.org/tip/b452d2c97eeccbf9c7ac5b3d2d9e80bf6d8a23db
Author:        Johan Hovold <[email protected]>
AuthorDate:    Fri, 17 Oct 2025 07:49:43 +02:00
Committer:     Daniel Lezcano <[email protected]>
CommitterDate: Wed, 26 Nov 2025 11:24:44 +01:00

clocksource/drivers/nxp-stm: Fix section mismatches

Platform drivers can be probed after their init sections have been discarded (e.g. on probe deferral or manual rebind through sysfs) so the probe function must not live in init. Device managed resource actions similarly cannot be discarded.

The "_probe" suffix of the driver structure name prevents modpost from warning about this so replace it to catch any similar future issues.

Fixes cec32ac75827 ("clocksource/drivers/nxp-timer: Add the System Timer Module for the s32gx platforms")
Cc Daniel Lezcano <[email protected]>
---
 drivers/clocksource/timer-nxp-stm.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/clocksource/timer-nxp-stm.c +9 -9
index 16d5216..c320d76 100644
@@ -177,15 +177,15 @@ static void nxp_stm_clocksource_resume(struct clocksource *cs)
 	nxp_stm_clocksource_enable(cs);
 }
 
-static void __init devm_clocksource_unregister(void *data)
+static void devm_clocksource_unregister(void *data)
 {
 	struct stm_timer *stm_timer = data;
 
 	clocksource_unregister(&stm_timer->cs);
 }
 
-static int __init nxp_stm_clocksource_init(struct device *dev, struct stm_timer *stm_timer,
-					   const char *name, void __iomem *base, struct clk *clk)
+static int nxp_stm_clocksource_init(struct device *dev, struct stm_timer *stm_timer,
+				    const char *name, void __iomem *base, struct clk *clk)
 {
 	int ret;
 
@@ -296,9 +296,9 @@ static void nxp_stm_clockevent_resume(struct clock_event_device *ced)
 	nxp_stm_module_get(stm_timer);
 }
 
-static int __init nxp_stm_clockevent_per_cpu_init(struct device *dev, struct stm_timer *stm_timer,
-						  const char *name, void __iomem *base, int irq,
-						  struct clk *clk, int cpu)
+static int nxp_stm_clockevent_per_cpu_init(struct device *dev, struct stm_timer *stm_timer,
+					   const char *name, void __iomem *base, int irq,
+					   struct clk *clk, int cpu)
 {
 	stm_timer->base = base;
 	stm_timer->rate = clk_get_rate(clk);
@@ -386,7 +386,7 @@ static irqreturn_t nxp_stm_module_interrupt(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
-static int __init nxp_stm_timer_probe(struct platform_device *pdev)
+static int nxp_stm_timer_probe(struct platform_device *pdev)
 {
 	struct stm_timer *stm_timer;
 	struct device *dev = &pdev->dev;
@@ -482,14 +482,14 @@ static const struct of_device_id nxp_stm_of_match[] = {
 };
 MODULE_DEVICE_TABLE(of, nxp_stm_of_match);
 
-static struct platform_driver nxp_stm_probe = {
+static struct platform_driver nxp_stm_driver = {
 	.probe	= nxp_stm_timer_probe,
 	.driver	= {
 		.name		= "nxp-stm",
 		.of_match_table	= nxp_stm_of_match,
 	},
 };
-module_platform_driver(nxp_stm_probe);
+module_platform_driver(nxp_stm_driver);
 
 MODULE_DESCRIPTION("NXP System Timer Module driver");
 MODULE_LICENSE("GPL");