Commit ec0b9d35 authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Ralf Baechle

MIPS: Remove "weak" from get_c0_compare_int() declaration

Weak header file declarations are error-prone because they make every
definition weak, and the linker chooses one based on link order (see
10629d71 ("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: default avatarBjorn Helgaas <bhelgaas@google.com>
Reviewed-by: default avatarJames Hogan <james.hogan@imgtec.com>
Cc: Andrew Bresticker <abrestic@chromium.org>
Cc: linux-mips@linux-mips.org
Cc: linux-kernel@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/10686/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent c60f9944
...@@ -51,7 +51,7 @@ extern int __weak get_c0_perfcount_int(void); ...@@ -51,7 +51,7 @@ extern int __weak get_c0_perfcount_int(void);
/* /*
* Initialize the calling CPU's compare interrupt as clockevent device * 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); extern int r4k_clockevent_init(void);
static inline int mips_clockevent_init(void) static inline int mips_clockevent_init(void)
......
...@@ -174,6 +174,11 @@ int c0_compare_int_usable(void) ...@@ -174,6 +174,11 @@ int c0_compare_int_usable(void)
return 1; return 1;
} }
unsigned int __weak get_c0_compare_int(void)
{
return MIPS_CPU_IRQ_BASE + cp0_compare_irq;
}
int r4k_clockevent_init(void) int r4k_clockevent_init(void)
{ {
unsigned int cpu = smp_processor_id(); unsigned int cpu = smp_processor_id();
...@@ -189,10 +194,8 @@ int r4k_clockevent_init(void) ...@@ -189,10 +194,8 @@ int r4k_clockevent_init(void)
/* /*
* With vectored interrupts things are getting platform specific. * With vectored interrupts things are getting platform specific.
* get_c0_compare_int is a hook to allow a platform to return the * 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); cd = &per_cpu(mips_clockevent_device, cpu);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment