Hi Greg, On Thu, Jun 30, 2022 at 03:46:58PM +0200, Greg Kroah-Hartman wrote: > From: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > > ixp4xx_timer_setup is exported, and so can not be an __init function. > Remove the __init marking as the build system is rightfully claiming > this is an error in older kernels. > > This is fixed "properly" in commit 41929c9f628b > ("clocksource/drivers/ixp4xx: Drop boardfile probe path") but that can > not be backported to older kernels as the reworking of the IXP4xx > codebase is not suitable for stable releases. > > Cc: Linus Walleij <linus.walleij@xxxxxxxxxx> > Cc: Daniel Lezcano <daniel.lezcano@xxxxxxxxxx> > Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> This patch causes the following warnings with clang when building ARCH=arm allmodconfig on 5.15, 5.10, and 5.4. I am surprised nobody else saw them. WARNING: modpost: vmlinux.o(.text+0x1219ccc): Section mismatch in reference from the function ixp4xx_timer_register() to the function .init.text:sched_clock_register() The function ixp4xx_timer_register() references the function __init sched_clock_register(). This is often because ixp4xx_timer_register lacks a __init annotation or the annotation of sched_clock_register is wrong. WARNING: modpost: vmlinux.o(.text+0x1219cf4): Section mismatch in reference from the function ixp4xx_timer_register() to the function .init.text:register_current_timer_delay() The function ixp4xx_timer_register() references the function __init register_current_timer_delay(). This is often because ixp4xx_timer_register lacks a __init annotation or the annotation of register_current_timer_delay is wrong. I think it would just be better to remove the export of ixp4xx_timer_setup(), rather than removing __init, as it is only called in arch/arm/mach-ixp4xx/common.c, which has to be built into the kernel image as it is 'obj-y' in arch/arm/mach-ixp4xx/Makefile. Cheers, Nathan > --- > drivers/clocksource/mmio.c | 2 +- > drivers/clocksource/timer-ixp4xx.c | 10 ++++------ > include/linux/platform_data/timer-ixp4xx.h | 5 ++--- > 3 files changed, 7 insertions(+), 10 deletions(-) > > --- a/drivers/clocksource/mmio.c > +++ b/drivers/clocksource/mmio.c > @@ -46,7 +46,7 @@ u64 clocksource_mmio_readw_down(struct c > * @bits: Number of valid bits > * @read: One of clocksource_mmio_read*() above > */ > -int __init clocksource_mmio_init(void __iomem *base, const char *name, > +int clocksource_mmio_init(void __iomem *base, const char *name, > unsigned long hz, int rating, unsigned bits, > u64 (*read)(struct clocksource *)) > { > --- a/drivers/clocksource/timer-ixp4xx.c > +++ b/drivers/clocksource/timer-ixp4xx.c > @@ -161,9 +161,8 @@ static int ixp4xx_resume(struct clock_ev > * We use OS timer1 on the CPU for the timer tick and the timestamp > * counter as a source of real clock ticks to account for missed jiffies. > */ > -static __init int ixp4xx_timer_register(void __iomem *base, > - int timer_irq, > - unsigned int timer_freq) > +static int ixp4xx_timer_register(void __iomem *base, int timer_irq, > + unsigned int timer_freq) > { > struct ixp4xx_timer *tmr; > int ret; > @@ -269,9 +268,8 @@ builtin_platform_driver(ixp4xx_timer_dri > * @timer_irq: Linux IRQ number for the timer > * @timer_freq: Fixed frequency of the timer > */ > -void __init ixp4xx_timer_setup(resource_size_t timerbase, > - int timer_irq, > - unsigned int timer_freq) > +void ixp4xx_timer_setup(resource_size_t timerbase, int timer_irq, > + unsigned int timer_freq) > { > void __iomem *base; > > --- a/include/linux/platform_data/timer-ixp4xx.h > +++ b/include/linux/platform_data/timer-ixp4xx.h > @@ -4,8 +4,7 @@ > > #include <linux/ioport.h> > > -void __init ixp4xx_timer_setup(resource_size_t timerbase, > - int timer_irq, > - unsigned int timer_freq); > +void ixp4xx_timer_setup(resource_size_t timerbase, int timer_irq, > + unsigned int timer_freq); > > #endif > > >