On 13/07/15 00:11, Bjorn Helgaas wrote: > Weak header file declarations are error-prone because they make every > definition weak, and the linker chooses one based on link order (see > 10629d711ed7 ("PCI: Remove __weak annotation from pcibios_get_phb_of_node > decl")). > > get_c0_compare_int() is defined in several files. Each definition is weak, > so I assume Kconfig prevents two or more from being included. The caller > contains default code used when get_c0_compare_int() isn't defined at all. > > Add a weak get_c0_compare_int() definition with the default code and remove > the weak annotation from the declaration. > > Then the platform implementations will be strong and will override the weak > default. If multiple platforms are ever configured in, we'll get a link > error instead of calling a random platform's implementation. > > Signed-off-by: Bjorn Helgaas <bhelgaas@xxxxxxxxxx> Reviewed-by: James Hogan <james.hogan@xxxxxxxxxx> Cheers James > --- > arch/mips/include/asm/time.h | 2 +- > arch/mips/kernel/cevt-r4k.c | 11 +++++++---- > 2 files changed, 8 insertions(+), 5 deletions(-) > > diff --git a/arch/mips/include/asm/time.h b/arch/mips/include/asm/time.h > index ce6a7d5..44a9c3a 100644 > --- a/arch/mips/include/asm/time.h > +++ b/arch/mips/include/asm/time.h > @@ -51,7 +51,7 @@ extern int get_c0_perfcount_int(void); > /* > * Initialize the calling CPU's compare interrupt as clockevent device > */ > -extern unsigned int __weak get_c0_compare_int(void); > +extern unsigned int get_c0_compare_int(void); > extern int r4k_clockevent_init(void); > > static inline int mips_clockevent_init(void) > diff --git a/arch/mips/kernel/cevt-r4k.c b/arch/mips/kernel/cevt-r4k.c > index d70c4d8..cc7cc46 100644 > --- a/arch/mips/kernel/cevt-r4k.c > +++ b/arch/mips/kernel/cevt-r4k.c > @@ -174,6 +174,11 @@ int c0_compare_int_usable(void) > return 1; > } > > +unsigned int __weak get_c0_compare_int(void) > +{ > + return MIPS_CPU_IRQ_BASE + cp0_compare_irq; > +} > + > int r4k_clockevent_init(void) > { > unsigned int cpu = smp_processor_id(); > @@ -189,11 +194,9 @@ int r4k_clockevent_init(void) > /* > * With vectored interrupts things are getting platform specific. > * get_c0_compare_int is a hook to allow a platform to return the > - * interrupt number of it's liking. > + * interrupt number of its liking. > */ > - irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq; > - if (get_c0_compare_int) > - irq = get_c0_compare_int(); > + irq = get_c0_compare_int(); > > cd = &per_cpu(mips_clockevent_device, cpu); > >
Attachment:
signature.asc
Description: OpenPGP digital signature