Skip to contentSkip to conversation

x86/ce4100: set pci ops via callback instead of module init

PATCH Superseded Sebastian Andrzej Siewior 2 participants 5 messages Mar 11, 2011 – Mar 14, 2011

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

PATCH 1/1 x86/ce4100: set pci ops via callback instead of module init

Setting those on subsys initcall will break any x86 platform except ce4100 which could lead to complains from users.
To avoid those complains, I move to pci.init like others which use the same kind of quirk.

---
 arch/x86/include/asm/ce4100.h     |    6 ++++++
 arch/x86/pci/ce4100.c             |    5 ++---
 arch/x86/platform/ce4100/ce4100.c |    9 +++++++++
 3 files changed, 17 insertions(+), 3 deletions(-)
 create mode 100644 arch/x86/include/asm/ce4100.h
arch/x86/include/asm/ce4100.h new file +6 -0
new file mode 100644
index 0000000..64db052
@@ -0,0 +1,6 @@
+#ifndef _ASM_CE4100_H_
+#define _ASM_CE4100_H_
+
+void ce4100_init_pci_ops(void);
+
+#endif
arch/x86/pci/ce4100.c +2 -3
index c63c6d3..8117f72 100644
@@ -34,6 +34,7 @@
 #include <linux/pci.h>
 #include <linux/init.h>
 
+#include <asm/ce4100.h>
 #include <asm/pci_x86.h>
 
 struct sim_reg {
@@ -306,10 +307,8 @@ struct pci_raw_ops ce4100_pci_conf = {
 	.write = ce4100_conf_write,
 };
 
-static int __init ce4100_pci_init(void)
+void __init ce4100_init_pci_ops(void)
 {
 	init_sim_regs();
 	raw_pci_ops = &ce4100_pci_conf;
-	return 0;
 }
-subsys_initcall(ce4100_pci_init);
arch/x86/platform/ce4100/ce4100.c +9 -0
index 68c0dbc..93b4e3c 100644
@@ -15,6 +15,7 @@
 #include <linux/serial_reg.h>
 #include <linux/serial_8250.h>
 
+#include <asm/ce4100.h>
 #include <asm/prom.h>
 #include <asm/setup.h>
 #include <asm/i8259.h>
@@ -125,6 +126,13 @@ static void __cpuinit sdv_pci_init(void)
 }
 #endif
 
+static int __cpuinit ce4100_pci_init(void)
+{
+	ce4100_init_pci_ops();
+	pci_legacy_init();
+	return 0;
+}
+
 /*
  * CE4100 specific x86_init function overrides and early setup
  * calls.
@@ -136,6 +144,7 @@ void __init x86_ce4100_early_setup(void)
 	x86_init.resources.probe_roms = x86_init_noop;
 	x86_init.mpparse.get_smp_config = x86_init_uint_noop;
 	x86_init.mpparse.find_smp_config = x86_init_noop;
+	x86_init.pci.init = ce4100_pci_init;
 
 #ifdef CONFIG_X86_IO_APIC
 	x86_init.pci.init_irq = sdv_pci_init;
Signature · 1 line
1.7.4
#1 lore raw

arch/x86/pci/ce4100.c struct pci_raw_ops ce4100_pci_conf = { · line 309

Quoted 7 lines · Sebastian Andrzej Siewior

struct sim_reg {

arch/x86/pci/ce4100.c +0 -1
@@ -306,10 +307,8 @@ struct pci_raw_ops ce4100_pci_conf = {
 	.write = ce4100_conf_write,
 };
 
-static int __init ce4100_pci_init(void)

Why don't you keep the function name and make it non static, add the call to pci_legacy_init() and just set the init.pci pointer to this?

So all pci is stuff is where it belongs

Thanks,

tglx

Quoted 44 lines
arch/x86/pci/ce4100.c +1 -2
+void __init ce4100_init_pci_ops(void)
 {
 	init_sim_regs();
 	raw_pci_ops = &ce4100_pci_conf;
-	return 0;
 }
-subsys_initcall(ce4100_pci_init);
arch/x86/platform/ce4100/ce4100.c +9 -0
index 68c0dbc..93b4e3c 100644
@@ -15,6 +15,7 @@
 #include <linux/serial_reg.h>
 #include <linux/serial_8250.h>
 
+#include <asm/ce4100.h>
 #include <asm/prom.h>
 #include <asm/setup.h>
 #include <asm/i8259.h>
@@ -125,6 +126,13 @@ static void __cpuinit sdv_pci_init(void)
 }
 #endif
 
+static int __cpuinit ce4100_pci_init(void)
+{
+	ce4100_init_pci_ops();
+	pci_legacy_init();
+	return 0;
+}
+
 /*
  * CE4100 specific x86_init function overrides and early setup
  * calls.
@@ -136,6 +144,7 @@ void __init x86_ce4100_early_setup(void)
 	x86_init.resources.probe_roms = x86_init_noop;
 	x86_init.mpparse.get_smp_config = x86_init_uint_noop;
 	x86_init.mpparse.find_smp_config = x86_init_noop;
+	x86_init.pci.init = ce4100_pci_init;
 
 #ifdef CONFIG_X86_IO_APIC
 	x86_init.pci.init_irq = sdv_pci_init;
Signature · 1 line
1.7.4
#2 lore raw

PATCH v2 1/1 x86/ce4100: set pci ops via callback instead of module init

Setting those on subsys initcall will break any x86 platform except ce4100 which could lead to complains from users.
To avoid I move to pci.init like others which use the same kind of quirk.

---
 arch/x86/include/asm/ce4100.h     |    6 ++++++
 arch/x86/pci/ce4100.c             |    6 +++---
 arch/x86/platform/ce4100/ce4100.c |    2 ++
 3 files changed, 11 insertions(+), 3 deletions(-)
 create mode 100644 arch/x86/include/asm/ce4100.h
arch/x86/include/asm/ce4100.h new file +6 -0
new file mode 100644
index 0000000..e656ad8
@@ -0,0 +1,6 @@
+#ifndef _ASM_CE4100_H_
+#define _ASM_CE4100_H_
+
+int ce4100_pci_init(void);
+
+#endif
arch/x86/pci/ce4100.c +3 -3
index c63c6d3..ed6060c 100644
@@ -34,6 +34,7 @@
 #include <linux/pci.h>
 #include <linux/init.h>
 
+#include <asm/ce4100.h>
 #include <asm/pci_x86.h>
 
 struct sim_reg {
@@ -306,10 +307,9 @@ struct pci_raw_ops ce4100_pci_conf = {
 	.write = ce4100_conf_write,
 };
 
-static int __init ce4100_pci_init(void)
+int __init ce4100_pci_init(void)
 {
 	init_sim_regs();
 	raw_pci_ops = &ce4100_pci_conf;
-	return 0;
+	return pci_legacy_init();
 }
-subsys_initcall(ce4100_pci_init);
arch/x86/platform/ce4100/ce4100.c +2 -0
index 68c0dbc..28071bb 100644
@@ -15,6 +15,7 @@
 #include <linux/serial_reg.h>
 #include <linux/serial_8250.h>
 
+#include <asm/ce4100.h>
 #include <asm/prom.h>
 #include <asm/setup.h>
 #include <asm/i8259.h>
@@ -136,6 +137,7 @@ void __init x86_ce4100_early_setup(void)
 	x86_init.resources.probe_roms = x86_init_noop;
 	x86_init.mpparse.get_smp_config = x86_init_uint_noop;
 	x86_init.mpparse.find_smp_config = x86_init_noop;
+	x86_init.pci.init = ce4100_pci_init;
 
 #ifdef CONFIG_X86_IO_APIC
 	x86_init.pci.init_irq = sdv_pci_init;
Signature · 1 line
1.7.4
#3 lore raw

PATCH v2 1/1 x86/ce4100: set pci ops via callback instead of module init

Setting those on subsys initcall will break any x86 platform except ce4100 which could lead to complains from users.
To avoid I move to pci.init like others which use the same kind of quirk.

---

This is against v2.6.38-rc8. The PCI file joined the kernel in v2.6.38-rc1.

 arch/x86/include/asm/ce4100.h     |    6 ++++++
 arch/x86/pci/ce4100.c             |    6 +++---
 arch/x86/platform/ce4100/ce4100.c |    2 ++
 3 files changed, 11 insertions(+), 3 deletions(-)
 create mode 100644 arch/x86/include/asm/ce4100.h
arch/x86/include/asm/ce4100.h new file +6 -0
new file mode 100644
index 0000000..e656ad8
@@ -0,0 +1,6 @@
+#ifndef _ASM_CE4100_H_
+#define _ASM_CE4100_H_
+
+int ce4100_pci_init(void);
+
+#endif
arch/x86/pci/ce4100.c +3 -3
index 85b68ef..1ec2841 100644
@@ -34,6 +34,7 @@
 #include <linux/pci.h>
 #include <linux/init.h>
 
+#include <asm/ce4100.h>
 #include <asm/pci_x86.h>
 
 struct sim_reg {
@@ -306,10 +307,9 @@ struct pci_raw_ops ce4100_pci_conf = {
 	.write = ce4100_conf_write,
 };
 
-static int __init ce4100_pci_init(void)
+int __init ce4100_pci_init(void)
 {
 	init_sim_regs();
 	raw_pci_ops = &ce4100_pci_conf;
-	return 0;
+	return pci_legacy_init();
 }
-subsys_initcall(ce4100_pci_init);
arch/x86/platform/ce4100/ce4100.c +2 -0
index d2c0d51..cd6f184 100644
@@ -15,6 +15,7 @@
 #include <linux/serial_reg.h>
 #include <linux/serial_8250.h>
 
+#include <asm/ce4100.h>
 #include <asm/setup.h>
 #include <asm/io.h>
 
@@ -129,4 +130,5 @@ void __init x86_ce4100_early_setup(void)
 	x86_init.resources.probe_roms = x86_init_noop;
 	x86_init.mpparse.get_smp_config = x86_init_uint_noop;
 	x86_init.mpparse.find_smp_config = sdv_find_smp_config;
+	x86_init.pci.init = ce4100_pci_init;
 }
Signature · 1 line
1.7.4
#4 lore raw

[tip:x86/urgent] x86: ce4100: Set pci ops via callback instead of module init

Commit-ID:  03150171dcf9492a96f57cbb2aef088bafcfcd2e
Gitweb:     http://git.kernel.org/tip/03150171dcf9492a96f57cbb2aef088bafcfcd2e
Author:     Sebastian Andrzej Siewior <[email protected]>
AuthorDate: Mon, 14 Mar 2011 10:33:40 +0100
Committer:  Thomas Gleixner <[email protected]>
CommitDate: Mon, 14 Mar 2011 15:13:23 +0100

x86: ce4100: Set pci ops via callback instead of module init

Setting the pci ops on subsys initcall unconditionally will break multi platform kernels on anything except ce4100.

Use x86_init.pci.init ops to call this only on real ce4100 platforms.

LKML-Reference: <[email protected]>

---
 arch/x86/include/asm/ce4100.h     |    6 ++++++
 arch/x86/pci/ce4100.c             |    7 ++++---
 arch/x86/platform/ce4100/ce4100.c |    2 ++
 3 files changed, 12 insertions(+), 3 deletions(-)
arch/x86/include/asm/ce4100.h new file +6 -0
new file mode 100644
index 0000000..e656ad8
@@ -0,0 +1,6 @@
+#ifndef _ASM_CE4100_H_
+#define _ASM_CE4100_H_
+
+int ce4100_pci_init(void);
+
+#endif
arch/x86/pci/ce4100.c +4 -3
index 85b68ef..9260b3e 100644
@@ -34,6 +34,7 @@
 #include <linux/pci.h>
 #include <linux/init.h>
 
+#include <asm/ce4100.h>
 #include <asm/pci_x86.h>
 
 struct sim_reg {
@@ -306,10 +307,10 @@ struct pci_raw_ops ce4100_pci_conf = {
 	.write = ce4100_conf_write,
 };
 
-static int __init ce4100_pci_init(void)
+int __init ce4100_pci_init(void)
 {
 	init_sim_regs();
 	raw_pci_ops = &ce4100_pci_conf;
-	return 0;
+	/* Indicate caller that it should invoke pci_legacy_init() */
+	return 1;
 }
-subsys_initcall(ce4100_pci_init);
arch/x86/platform/ce4100/ce4100.c +2 -0
index d2c0d51..cd6f184 100644
@@ -15,6 +15,7 @@
 #include <linux/serial_reg.h>
 #include <linux/serial_8250.h>
 
+#include <asm/ce4100.h>
 #include <asm/setup.h>
 #include <asm/io.h>
 
@@ -129,4 +130,5 @@ void __init x86_ce4100_early_setup(void)
 	x86_init.resources.probe_roms = x86_init_noop;
 	x86_init.mpparse.get_smp_config = x86_init_uint_noop;
 	x86_init.mpparse.find_smp_config = sdv_find_smp_config;
+	x86_init.pci.init = ce4100_pci_init;
 }