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 <[email protected]>Reviewed-by: James Hogan <[email protected]> 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); > >
signature.asc
Description: OpenPGP digital signature

