Re: [PATCH] net: smc91x: Add Atari EtherNAT support

2015-01-15 Thread Nicolas Pitre
On Thu, 15 Jan 2015, Geert Uytterhoeven wrote:

 From: Michael Schmitz schmitz...@gmail.com
 
 Add Atari specific code to the smc91x Ethernet driver. This code is used
 on the EtherNAT adapter card for the Atari Falcon extension port.
 
 Signed-off-by: Michael Schmitz schm...@debian.org
 Tested-by: Christian Steigies c...@debian.org
 [geert: Sort Kconfig entries, split in hard and soft dependencies]
 Signed-off-by: Geert Uytterhoeven ge...@linux-m68k.org

Long gone is the time I had access to hardware with this ethernet chip, 
but FWIW:

Acked-by: Nicolas Pitre n...@fluxnic.net



 ---
  drivers/net/ethernet/smsc/Kconfig  | 10 ++
  drivers/net/ethernet/smsc/smc91x.h | 21 +
  2 files changed, 27 insertions(+), 4 deletions(-)
 
 diff --git a/drivers/net/ethernet/smsc/Kconfig 
 b/drivers/net/ethernet/smsc/Kconfig
 index 9468e64e6007bd2e..3e97a8b43147cc7c 100644
 --- a/drivers/net/ethernet/smsc/Kconfig
 +++ b/drivers/net/ethernet/smsc/Kconfig
 @@ -5,8 +5,9 @@
  config NET_VENDOR_SMSC
   bool SMC (SMSC)/Western Digital devices
   default y
 - depends on ARM || ISA || MAC || ARM64 || MIPS || M32R || SUPERH || \
 - BLACKFIN || MN10300 || COLDFIRE || XTENSA || NIOS2 || PCI || 
 PCMCIA
 + depends on ARM || ARM64 || ATARI_ETHERNAT || BLACKFIN || COLDFIRE || \
 +ISA || M32R || MAC || MIPS || MN10300 || NIOS2 || PCI || \
 +PCMCIA || SUPERH || XTENSA
   ---help---
 If you have a network (Ethernet) card belonging to this class, say Y
 and read the Ethernet-HOWTO, available from
 @@ -38,8 +39,9 @@ config SMC91X
   tristate SMC 91C9x/91C1xxx support
   select CRC32
   select MII
 - depends on (ARM || M32R || SUPERH || MIPS || BLACKFIN || \
 - MN10300 || COLDFIRE || ARM64 || XTENSA || NIOS2)  (!OF || 
 GPIOLIB)
 + depends on !OF || GPIOLIB
 + depends on ARM || ARM64 || ATARI_ETHERNAT || BLACKFIN || COLDFIRE || \
 +M32R || MIPS || MN10300 || NIOS2 || SUPERH || XTENSA
   ---help---
 This is a driver for SMC's 91x series of Ethernet chipsets,
 including the SMC91C94 and the SMC91C111. Say Y if you want it
 diff --git a/drivers/net/ethernet/smsc/smc91x.h 
 b/drivers/net/ethernet/smsc/smc91x.h
 index 2a38dacbbd27fba4..be67baf5f6778d08 100644
 --- a/drivers/net/ethernet/smsc/smc91x.h
 +++ b/drivers/net/ethernet/smsc/smc91x.h
 @@ -216,6 +216,27 @@ SMC_outw(u16 val, void __iomem *ioaddr, int reg)
  
  #include unit/smc9.h
  
 +#elif defined(CONFIG_ATARI)
 +
 +#define SMC_CAN_USE_8BIT1
 +#define SMC_CAN_USE_16BIT   1
 +#define SMC_CAN_USE_32BIT   1
 +#define SMC_NOWAIT  1
 +
 +#define SMC_inb(a, r)   readb((a) + (r))
 +#define SMC_inw(a, r)   readw((a) + (r))
 +#define SMC_inl(a, r)   readl((a) + (r))
 +#define SMC_outb(v, a, r)   writeb(v, (a) + (r))
 +#define SMC_outw(v, a, r)   writew(v, (a) + (r))
 +#define SMC_outl(v, a, r)   writel(v, (a) + (r))
 +#define SMC_insw(a, r, p, l)readsw((a) + (r), p, l)
 +#define SMC_outsw(a, r, p, l)   writesw((a) + (r), p, l)
 +#define SMC_insl(a, r, p, l)readsl((a) + (r), p, l)
 +#define SMC_outsl(a, r, p, l)   writesl((a) + (r), p, l)
 +
 +#define RPC_LSA_DEFAULT RPC_LED_100_10
 +#define RPC_LSB_DEFAULT RPC_LED_TX_RX
 +
  #elif defined(CONFIG_ARCH_MSM)
  
  #define SMC_CAN_USE_8BIT 0
 -- 
 1.9.1
 
 
--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] net: smc91x: Add Atari EtherNAT support

2015-01-15 Thread David Miller
From: Geert Uytterhoeven ge...@linux-m68k.org
Date: Thu, 15 Jan 2015 14:06:15 +0100

 From: Michael Schmitz schmitz...@gmail.com
 
 Add Atari specific code to the smc91x Ethernet driver. This code is used
 on the EtherNAT adapter card for the Atari Falcon extension port.
 
 Signed-off-by: Michael Schmitz schm...@debian.org
 Tested-by: Christian Steigies c...@debian.org
 [geert: Sort Kconfig entries, split in hard and soft dependencies]
 Signed-off-by: Geert Uytterhoeven ge...@linux-m68k.org

Applied to net-next, thanks.
--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 07/28] PCI: Pass PCI domain number combined with root bus number

2015-01-15 Thread Yijing Wang
Now we could pass PCI domain combined with bus number
in u32 argu. Because in arm/arm64, PCI domain number
is assigned by pci_bus_assign_domain_nr(). So we leave
pci_scan_root_bus() and pci_create_root_bus() in arm/arm64
unchanged. A new function pci_host_assign_domain_nr()
will be introduced for arm/arm64 to assign domain number
in later patch.

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 arch/alpha/kernel/pci.c  |5 +++--
 arch/alpha/kernel/sys_nautilus.c |3 ++-
 arch/ia64/pci/pci.c  |4 ++--
 arch/ia64/sn/kernel/io_init.c|5 +++--
 arch/microblaze/pci/pci-common.c |5 +++--
 arch/mips/pci/pci.c  |4 ++--
 arch/powerpc/kernel/pci-common.c |5 +++--
 arch/s390/pci/pci.c  |5 +++--
 arch/sh/drivers/pci/pci.c|5 +++--
 arch/sparc/kernel/pci.c  |5 +++--
 arch/tile/kernel/pci.c   |4 ++--
 arch/tile/kernel/pci_gx.c|5 +++--
 arch/x86/pci/acpi.c  |6 +++---
 arch/x86/pci/common.c|3 ++-
 drivers/pci/xen-pcifront.c   |5 +++--
 15 files changed, 40 insertions(+), 29 deletions(-)

diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c
index 97f9730..b15f9f2 100644
--- a/arch/alpha/kernel/pci.c
+++ b/arch/alpha/kernel/pci.c
@@ -332,8 +332,9 @@ common_init_pci(void)
pci_add_resource_offset(resources, hose-mem_space,
hose-mem_space-start);
 
-   bus = pci_scan_root_bus(NULL, next_busno, alpha_mv.pci_ops,
-   hose, resources);
+   bus = pci_scan_root_bus(NULL,
+   PCI_DOMBUS(hose-index, next_busno), 
alpha_mv.pci_ops,
+   hose, resources);
if (bus)
pci_bus_add_devices(bus);
hose-bus = bus;
diff --git a/arch/alpha/kernel/sys_nautilus.c b/arch/alpha/kernel/sys_nautilus.c
index 2c864bb..f7bfdf3 100644
--- a/arch/alpha/kernel/sys_nautilus.c
+++ b/arch/alpha/kernel/sys_nautilus.c
@@ -206,7 +206,8 @@ nautilus_init_pci(void)
unsigned long memtop = max_low_pfn  PAGE_SHIFT;
 
/* Scan our single hose.  */
-   bus = pci_scan_bus_legacy(0, alpha_mv.pci_ops, hose);
+   bus = pci_scan_bus_legacy(PCI_DOMBUS(hose-index, 0),
+   alpha_mv.pci_ops, hose);
hose-bus = bus;
pcibios_claim_one_bus(bus);
 
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c
index 291a582..e457015 100644
--- a/arch/ia64/pci/pci.c
+++ b/arch/ia64/pci/pci.c
@@ -465,8 +465,8 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root 
*root)
 * should handle the case here, but it appears that IA64 hasn't
 * such quirk. So we just ignore the case now.
 */
-   pbus = pci_create_root_bus(NULL, bus, pci_root_ops, controller,
-  info-resources);
+   pbus = pci_create_root_bus(NULL, PCI_DOMBUS(domain, bus),
+   pci_root_ops, controller, info-resources);
if (!pbus) {
pci_free_resource_list(info-resources);
__release_pci_root_info(info);
diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c
index 63b43a6..bcdc5b8 100644
--- a/arch/ia64/sn/kernel/io_init.c
+++ b/arch/ia64/sn/kernel/io_init.c
@@ -266,8 +266,9 @@ sn_pci_controller_fixup(int segment, int busnum, struct 
pci_bus *bus)
pci_add_resource_offset(resources, res[1],
prom_bussoft_ptr-bs_legacy_mem);
 
-   bus = pci_scan_root_bus(NULL, busnum, pci_root_ops, controller,
-   resources);
+   bus = pci_scan_root_bus(NULL,
+   PCI_DOMBUS(controller-segment, busnum),
+   pci_root_ops, controller, resources);
if (bus == NULL) {
kfree(res);
kfree(controller);
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c
index 009b271..890bd36 100644
--- a/arch/microblaze/pci/pci-common.c
+++ b/arch/microblaze/pci/pci-common.c
@@ -1339,8 +1339,9 @@ static void pcibios_scan_phb(struct pci_controller *hose)
 
pcibios_setup_phb_resources(hose, resources);
 
-   bus = pci_scan_root_bus(hose-parent, hose-first_busno,
-   hose-ops, hose, resources);
+   bus = pci_scan_root_bus(hose-parent,
+   PCI_DOMBUS(hose-global_number, hose-first_busno),
+   hose-ops, hose, resources);
if (bus == NULL) {
pr_err(Failed to create bus for PCI domain %04x\n,
   hose-global_number);
diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c
index 9eb54b5..980755a 100644
--- a/arch/mips/pci/pci.c
+++ b/arch/mips/pci/pci.c
@@ -92,8 +92,8 @@ static void pcibios_scanbus(struct pci_controller *hose)
pci_add_resource_offset(resources,

[PATCH 02/28] PCI: Rip out pci_bus_add_devices() from pci_scan_root_bus()

2015-01-15 Thread Yijing Wang
Just like pci_scan_bus(), we also should rip out
pci_bus_add_devices() from pci_scan_root_bus().
Lots platforms first call pci_scan_root_bus(), but
after that, they call pci_bus_size_bridges() and
pci_bus_assign_resources(). Place pci_bus_add_devices()
in pci_scan_root_bus() hurts PCI scan logic.
For arm hw_pci-scan() functions which call
pci_scan_root_bus(), it's no need to change anything,
because pci_bus_add_devices() will be called later
in pci_common_init_dev().

Signed-off-by: Yijing Wang wangyij...@huawei.com
CC: David Howells dhowe...@redhat.com
CC: Tony Luck tony.l...@intel.com
CC: Michal Simek mon...@monstr.eu
CC: Ralf Baechle r...@linux-mips.org
CC: Koichi Yasutake yasutake.koi...@jp.panasonic.com
CC: Sebastian Ott seb...@linux.vnet.ibm.com
CC: Thomas Gleixner t...@linutronix.de
CC: Chris Metcalf cmetc...@ezchip.com
CC: Chris Zankel ch...@zankel.net
CC: linux-al...@vger.kernel.org
CC: linux-ker...@vger.kernel.org
CC: linux-m...@linux-mips.org
CC: linux-am33-l...@redhat.com
CC: linux-s...@vger.kernel.org
CC: linux...@vger.kernel.org
CC: sparcli...@vger.kernel.org
CC: linux-...@vger.kernel.org
CC: linux-xte...@linux-xtensa.org
---
 arch/alpha/kernel/pci.c  |2 ++
 arch/frv/mb93090-mb00/pci-vdk.c  |6 --
 arch/ia64/sn/kernel/io_init.c|1 +
 arch/microblaze/pci/pci-common.c |1 +
 arch/mips/pci/pci.c  |1 +
 arch/mn10300/unit-asb2305/pci.c  |5 -
 arch/s390/pci/pci.c  |2 +-
 arch/sh/drivers/pci/pci.c|1 +
 arch/sparc/kernel/leon_pci.c |1 +
 arch/tile/kernel/pci.c   |2 ++
 arch/tile/kernel/pci_gx.c|2 ++
 arch/x86/pci/common.c|1 +
 arch/xtensa/kernel/pci.c |2 ++
 drivers/pci/probe.c  |1 -
 14 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c
index 076c35c..97f9730 100644
--- a/arch/alpha/kernel/pci.c
+++ b/arch/alpha/kernel/pci.c
@@ -334,6 +334,8 @@ common_init_pci(void)
 
bus = pci_scan_root_bus(NULL, next_busno, alpha_mv.pci_ops,
hose, resources);
+   if (bus)
+   pci_bus_add_devices(bus);
hose-bus = bus;
hose-need_domain_info = need_domain_info;
next_busno = bus-busn_res.end + 1;
diff --git a/arch/frv/mb93090-mb00/pci-vdk.c b/arch/frv/mb93090-mb00/pci-vdk.c
index efa5d65..2b36044 100644
--- a/arch/frv/mb93090-mb00/pci-vdk.c
+++ b/arch/frv/mb93090-mb00/pci-vdk.c
@@ -316,6 +316,7 @@ void pcibios_fixup_bus(struct pci_bus *bus)
 
 int __init pcibios_init(void)
 {
+   struct pci_bus *bus;
struct pci_ops *dir = NULL;
LIST_HEAD(resources);
 
@@ -383,12 +384,13 @@ int __init pcibios_init(void)
printk(PCI: Probing PCI hardware\n);
pci_add_resource(resources, pci_ioport_resource);
pci_add_resource(resources, pci_iomem_resource);
-   pci_scan_root_bus(NULL, 0, pci_root_ops, NULL, resources);
+   bus = pci_scan_root_bus(NULL, 0, pci_root_ops, NULL, resources);
 
pcibios_irq_init();
pcibios_fixup_irqs();
pcibios_resource_survey();
-
+   if (bus)
+   pci_bus_add_devices(bus);
return 0;
 }
 
diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c
index 0b5ce82..63b43a6 100644
--- a/arch/ia64/sn/kernel/io_init.c
+++ b/arch/ia64/sn/kernel/io_init.c
@@ -272,6 +272,7 @@ sn_pci_controller_fixup(int segment, int busnum, struct 
pci_bus *bus)
kfree(res);
kfree(controller);
}
+   pci_bus_add_devices(bus);
 }
 
 /*
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c
index b30e41c..009b271 100644
--- a/arch/microblaze/pci/pci-common.c
+++ b/arch/microblaze/pci/pci-common.c
@@ -1351,6 +1351,7 @@ static void pcibios_scan_phb(struct pci_controller *hose)
hose-bus = bus;
 
hose-last_busno = bus-busn_res.end;
+   pci_bus_add_devices(bus);
 }
 
 static int __init pcibios_init(void)
diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c
index 1bf60b1..9eb54b5 100644
--- a/arch/mips/pci/pci.c
+++ b/arch/mips/pci/pci.c
@@ -114,6 +114,7 @@ static void pcibios_scanbus(struct pci_controller *hose)
pci_bus_size_bridges(bus);
pci_bus_assign_resources(bus);
}
+   pci_bus_add_devices(bus);
}
 }
 
diff --git a/arch/mn10300/unit-asb2305/pci.c b/arch/mn10300/unit-asb2305/pci.c
index 6b4339f..860aa35 100644
--- a/arch/mn10300/unit-asb2305/pci.c
+++ b/arch/mn10300/unit-asb2305/pci.c
@@ -345,6 +345,7 @@ void pcibios_fixup_bus(struct pci_bus *bus)
  */
 static int __init pcibios_init(void)
 {
+   struct pci_bus *bus;
resource_size_t io_offset, mem_offset;
LIST_HEAD(resources);
 
@@ -376,11 +377,13 @@ static int __init pcibios_init(void)
 
pci_add_resource_offset(resources, 

Re: linux-next: Tree for Jan 12 (build failures: m68k, ppc)

2015-01-15 Thread Geert Uytterhoeven
On Mon, Jan 12, 2015 at 6:59 PM, Guenter Roeck li...@roeck-us.net wrote:
  Build failures, seen since next-20150109:
  m68k:allmodconfig
  powerpc:ppc6xx_defconfig

It looks like parisc is also suffering:
http://kisskb.ellerman.id.au/kisskb/buildresult/12343847/

  Due to:
  ERROR: __get_user_bad [drivers/gpu/drm/drm.ko] undefined!
  make[1]: *** [__modpost] Error 1
 
  Caused by commit d34f20d6e2f (drm: Atomic modeset ioctl).

 Yeah, it needs a get_user() that supports 64-bit data.

 Hi Geert,

 I assume you mean m68k, where 64 bit support for get_user has been disabled.

 The problem on powerpc is different though: __get_user_nocheck()
 and __get_user_check() use
 unsigned long __gu_val;
 followed by
 __get_user_size(__gu_val, __gu_addr, (size), __gu_err);

 __get_user_size() fails in
 if (size  sizeof(x))
  (x) = __get_user_bad();

 Presumably unsigned long is 32 bit on 32 bit powerpc, not 64 bit.

 Overall, the explicit 64-bit use of get_user() seems to be quite unusual.

I noticed you've sent a fix for DRM.

Doh, and I was just fixing m68k...

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say programmer or something like that.
-- Linus Torvalds
--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[git pull] m68k updates for 3.19 (take 2)

2015-01-15 Thread Geert Uytterhoeven
Hi Linus,

The following changes since commit b1940cd21c0f4abdce101253e860feff547291b0:

  Linux 3.19-rc3 (2015-01-05 17:05:20 -0800)

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k.git for-linus

for you to fetch changes up to f27bd5bfeda5881ce283aa06408c8fa99fb950fa:

  m68k: Wire up execveat (2015-01-11 11:14:14 +0100)

Summary:
  m68k: Wire up execveat


Geert Uytterhoeven (1):
  m68k: Wire up execveat

 arch/m68k/include/asm/unistd.h  | 2 +-
 arch/m68k/include/uapi/asm/unistd.h | 1 +
 arch/m68k/kernel/syscalltable.S | 1 +
 3 files changed, 3 insertions(+), 1 deletion(-)

Thanks for pulling!

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say programmer or something like that.
-- Linus Torvalds
--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 0/5] m68k/atari: Remove obsolete IRQ_TYPE_*

2015-01-15 Thread Geert Uytterhoeven
On Mon, Jan 12, 2015 at 9:40 AM, Geert Uytterhoeven
ge...@linux-m68k.org wrote:
 IRQ_TYPE_SLOW, IRQ_TYPE_FAST, and IRQ_TYPE_PRIO are no longer used by
 the Atari platform interrupt code since commit 734085651c9b80aa
 ([PATCH] m68k: convert atari irq code) in v2.6.18-rc1, so drop them.

 Note that their values have been reused for different purposes
 (IRQ_TYPE_NONE, IRQ_TYPE_EDGE_RISING, and IRQ_TYPE_EDGE_FALLING) since
 commit 6a6de9ef5850d063 ([PATCH] genirq: core) in v2.6.18-rc1.

 The last patch depends on the first 4 patches.
 Please either apply the relevant patches (1, 3 or 4; parport has no
 maintainer) to your trees, or ack them.

Applied with maintainers' acks, and queued for 3.20.

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say programmer or something like that.
-- Linus Torvalds
--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] net: smc91x: Add Atari EtherNAT support

2015-01-15 Thread Geert Uytterhoeven
From: Michael Schmitz schmitz...@gmail.com

Add Atari specific code to the smc91x Ethernet driver. This code is used
on the EtherNAT adapter card for the Atari Falcon extension port.

Signed-off-by: Michael Schmitz schm...@debian.org
Tested-by: Christian Steigies c...@debian.org
[geert: Sort Kconfig entries, split in hard and soft dependencies]
Signed-off-by: Geert Uytterhoeven ge...@linux-m68k.org
---
 drivers/net/ethernet/smsc/Kconfig  | 10 ++
 drivers/net/ethernet/smsc/smc91x.h | 21 +
 2 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/smsc/Kconfig 
b/drivers/net/ethernet/smsc/Kconfig
index 9468e64e6007bd2e..3e97a8b43147cc7c 100644
--- a/drivers/net/ethernet/smsc/Kconfig
+++ b/drivers/net/ethernet/smsc/Kconfig
@@ -5,8 +5,9 @@
 config NET_VENDOR_SMSC
bool SMC (SMSC)/Western Digital devices
default y
-   depends on ARM || ISA || MAC || ARM64 || MIPS || M32R || SUPERH || \
-   BLACKFIN || MN10300 || COLDFIRE || XTENSA || NIOS2 || PCI || 
PCMCIA
+   depends on ARM || ARM64 || ATARI_ETHERNAT || BLACKFIN || COLDFIRE || \
+  ISA || M32R || MAC || MIPS || MN10300 || NIOS2 || PCI || \
+  PCMCIA || SUPERH || XTENSA
---help---
  If you have a network (Ethernet) card belonging to this class, say Y
  and read the Ethernet-HOWTO, available from
@@ -38,8 +39,9 @@ config SMC91X
tristate SMC 91C9x/91C1xxx support
select CRC32
select MII
-   depends on (ARM || M32R || SUPERH || MIPS || BLACKFIN || \
-   MN10300 || COLDFIRE || ARM64 || XTENSA || NIOS2)  (!OF || 
GPIOLIB)
+   depends on !OF || GPIOLIB
+   depends on ARM || ARM64 || ATARI_ETHERNAT || BLACKFIN || COLDFIRE || \
+  M32R || MIPS || MN10300 || NIOS2 || SUPERH || XTENSA
---help---
  This is a driver for SMC's 91x series of Ethernet chipsets,
  including the SMC91C94 and the SMC91C111. Say Y if you want it
diff --git a/drivers/net/ethernet/smsc/smc91x.h 
b/drivers/net/ethernet/smsc/smc91x.h
index 2a38dacbbd27fba4..be67baf5f6778d08 100644
--- a/drivers/net/ethernet/smsc/smc91x.h
+++ b/drivers/net/ethernet/smsc/smc91x.h
@@ -216,6 +216,27 @@ SMC_outw(u16 val, void __iomem *ioaddr, int reg)
 
 #include unit/smc9.h
 
+#elif defined(CONFIG_ATARI)
+
+#define SMC_CAN_USE_8BIT1
+#define SMC_CAN_USE_16BIT   1
+#define SMC_CAN_USE_32BIT   1
+#define SMC_NOWAIT  1
+
+#define SMC_inb(a, r)   readb((a) + (r))
+#define SMC_inw(a, r)   readw((a) + (r))
+#define SMC_inl(a, r)   readl((a) + (r))
+#define SMC_outb(v, a, r)   writeb(v, (a) + (r))
+#define SMC_outw(v, a, r)   writew(v, (a) + (r))
+#define SMC_outl(v, a, r)   writel(v, (a) + (r))
+#define SMC_insw(a, r, p, l)readsw((a) + (r), p, l)
+#define SMC_outsw(a, r, p, l)   writesw((a) + (r), p, l)
+#define SMC_insl(a, r, p, l)readsl((a) + (r), p, l)
+#define SMC_outsl(a, r, p, l)   writesl((a) + (r), p, l)
+
+#define RPC_LSA_DEFAULT RPC_LED_100_10
+#define RPC_LSB_DEFAULT RPC_LED_TX_RX
+
 #elif defined(CONFIG_ARCH_MSM)
 
 #define SMC_CAN_USE_8BIT   0
-- 
1.9.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: linux-next: Tree for Jan 12 (build failures: m68k, ppc)

2015-01-15 Thread Guenter Roeck

On 01/15/2015 02:12 AM, Geert Uytterhoeven wrote:

On Mon, Jan 12, 2015 at 6:59 PM, Guenter Roeck li...@roeck-us.net wrote:

Build failures, seen since next-20150109:
 m68k:allmodconfig
 powerpc:ppc6xx_defconfig


It looks like parisc is also suffering:
http://kisskb.ellerman.id.au/kisskb/buildresult/12343847/


Due to:
 ERROR: __get_user_bad [drivers/gpu/drm/drm.ko] undefined!
 make[1]: *** [__modpost] Error 1

Caused by commit d34f20d6e2f (drm: Atomic modeset ioctl).


Yeah, it needs a get_user() that supports 64-bit data.


Hi Geert,

I assume you mean m68k, where 64 bit support for get_user has been disabled.

The problem on powerpc is different though: __get_user_nocheck()
and __get_user_check() use
 unsigned long __gu_val;
followed by
 __get_user_size(__gu_val, __gu_addr, (size), __gu_err);

__get_user_size() fails in
 if (size  sizeof(x))
  (x) = __get_user_bad();

Presumably unsigned long is 32 bit on 32 bit powerpc, not 64 bit.

Overall, the explicit 64-bit use of get_user() seems to be quite unusual.


I noticed you've sent a fix for DRM.

Doh, and I was just fixing m68k...



Sorry, should have Cc:'d you.

Guenter

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 20/28] PCI/Parisc: Use pci_scan_root_bus() for simplicity

2015-01-15 Thread Yijing Wang
From: Yijing Wang wangyijing0...@gmail.com

Now pci_bus_add_devices() has been ripped out
from pci_scan_root_bus(), we could use pci_scan_root_bus()
instead of pci_create_root_bus() + pci_scan_child_bus()
for simplicity.

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 drivers/parisc/dino.c|   11 ++-
 drivers/parisc/lba_pci.c |6 ++
 2 files changed, 4 insertions(+), 13 deletions(-)

diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c
index a0580af..e5ee339 100644
--- a/drivers/parisc/dino.c
+++ b/drivers/parisc/dino.c
@@ -977,15 +977,11 @@ static int __init dino_probe(struct parisc_device *dev)
if (dino_dev-hba.gmmio_space.flags)
pci_add_resource(resources, dino_dev-hba.gmmio_space);
 
-   dino_dev-hba.bus_num.start = dino_current_bus;
-   dino_dev-hba.bus_num.end = 255;
-   dino_dev-hba.bus_num.flags = IORESOURCE_BUS;
-   pci_add_resource(resources, dino_dev-hba.bus_num);
/*
** It's not used to avoid chicken/egg problems
** with configuration accessor functions.
*/
-   dino_dev-hba.hba_bus = bus = pci_create_root_bus(dev-dev,
+   dino_dev-hba.hba_bus = bus = pci_scan_root_bus(dev-dev,
 dino_current_bus, dino_cfg_ops, NULL, resources);
if (!bus) {
printk(KERN_ERR ERROR: failed to scan PCI bus on %s (duplicate 
bus number %d?)\n,
@@ -996,13 +992,10 @@ static int __init dino_probe(struct parisc_device *dev)
return 0;
}
 
-   max = pci_scan_child_bus(bus);
-   pci_bus_update_busn_res_end(bus, max);
-
/* This code *depends* on scanning being single threaded
 * if it isn't, this global bus number count will fail
 */
-   dino_current_bus = max + 1;
+   dino_current_bus = bus-busn_res.end + 1;
pci_bus_assign_resources(bus);
pci_bus_add_devices(bus);
return 0;
diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c
index 37e71ff..9e3a016 100644
--- a/drivers/parisc/lba_pci.c
+++ b/drivers/parisc/lba_pci.c
@@ -1564,15 +1564,13 @@ lba_driver_probe(struct parisc_device *dev)
 
dev-dev.platform_data = lba_dev;
lba_bus = lba_dev-hba.hba_bus =
-   pci_create_root_bus(dev-dev, lba_dev-hba.bus_num.start,
+   pci_scan_root_bus(dev-dev, lba_dev-hba.bus_num.start,
cfg_ops, NULL, resources);
if (!lba_bus) {
pci_free_resource_list(resources);
return 0;
}
 
-   max = pci_scan_child_bus(lba_bus);
-
/* This is in lieu of calling pci_assign_unassigned_resources() */
if (is_pdc_pat()) {
/* assign resources to un-initialized devices */
@@ -1600,7 +1598,7 @@ lba_driver_probe(struct parisc_device *dev)
lba_dev-flags |= LBA_FLAG_SKIP_PROBE;
}
 
-   lba_next_bus = max + 1;
+   lba_next_bus = pci_bus_child_max_busnr(lba_bus) + 1;
pci_bus_add_devices(lba_bus);
 
/* Whew! Finally done! Tell services we got this one covered. */
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 22/28] PCI/tegra: Remove redundant tegra_pcie_scan_bus()

2015-01-15 Thread Yijing Wang
Now pci_scan_root_bus() is almost simliar to
pci_create_root_bus() + pci_scan_child_bus().
So we could use common pci_scan_root_bus() in
pci_common_init_dev() to scan pci busses.
tegra_pcie_scan_bus() is redundant, remove it.

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 drivers/pci/host/pci-tegra.c |   15 ---
 1 files changed, 0 insertions(+), 15 deletions(-)

diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c
index 6f9c29f..d9d1af0 100644
--- a/drivers/pci/host/pci-tegra.c
+++ b/drivers/pci/host/pci-tegra.c
@@ -679,21 +679,6 @@ static int tegra_pcie_map_irq(const struct pci_dev *pdev, 
u8 slot, u8 pin)
return irq;
 }
 
-static struct pci_bus *tegra_pcie_scan_bus(int nr, struct pci_sys_data *sys)
-{
-   struct tegra_pcie *pcie = sys_to_pcie(sys);
-   struct pci_bus *bus;
-
-   bus = pci_create_root_bus(pcie-dev, sys-busnr, tegra_pcie_ops, sys,
- sys-resources);
-   if (!bus)
-   return NULL;
-
-   pci_scan_child_bus(bus);
-
-   return bus;
-}
-
 static irqreturn_t tegra_pcie_isr(int irq, void *arg)
 {
const char *err_msg[] = {
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 21/28] PCI/mvebu: Use pci_common_init_dev() to simplify code

2015-01-15 Thread Yijing Wang
Mvebu_pcie_scan_bus() is not necessary, we could use
pci_common_init_dev() instead of pci_common_init(),
and pass the device pointer as the parent. Then
pci_scan_root_bus() will be called to scan the pci busses.

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 drivers/pci/host/pci-mvebu.c |   18 +-
 1 files changed, 1 insertions(+), 17 deletions(-)

diff --git a/drivers/pci/host/pci-mvebu.c b/drivers/pci/host/pci-mvebu.c
index 1309cfb..d5a2b70 100644
--- a/drivers/pci/host/pci-mvebu.c
+++ b/drivers/pci/host/pci-mvebu.c
@@ -750,21 +750,6 @@ static int mvebu_pcie_setup(int nr, struct pci_sys_data 
*sys)
return 1;
 }
 
-static struct pci_bus *mvebu_pcie_scan_bus(int nr, struct pci_sys_data *sys)
-{
-   struct mvebu_pcie *pcie = sys_to_pcie(sys);
-   struct pci_bus *bus;
-
-   bus = pci_create_root_bus(pcie-pdev-dev, sys-busnr,
- mvebu_pcie_ops, sys, sys-resources);
-   if (!bus)
-   return NULL;
-
-   pci_scan_child_bus(bus);
-
-   return bus;
-}
-
 static resource_size_t mvebu_pcie_align_resource(struct pci_dev *dev,
 const struct resource *res,
 resource_size_t start,
@@ -808,12 +793,11 @@ static void mvebu_pcie_enable(struct mvebu_pcie *pcie)
hw.nr_controllers = 1;
hw.private_data   = (void **)pcie;
hw.setup  = mvebu_pcie_setup;
-   hw.scan   = mvebu_pcie_scan_bus;
hw.map_irq= of_irq_parse_and_map_pci;
hw.ops= mvebu_pcie_ops;
hw.align_resource = mvebu_pcie_align_resource;
 
-   pci_common_init(hw);
+   pci_common_init_dev(pcie-pdev-dev, hw);
 }
 
 /*
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 27/28] PCI: Remove platform specific pci_domain_nr()

2015-01-15 Thread Yijing Wang
Now pci_host_bridge holds the domain number,
so we could eliminate all platform specific
pci_domain_nr().

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 arch/alpha/include/asm/pci.h |2 --
 arch/ia64/include/asm/pci.h  |1 -
 arch/microblaze/pci/pci-common.c |   11 ---
 arch/mips/include/asm/pci.h  |2 --
 arch/powerpc/kernel/pci-common.c |   11 ---
 arch/s390/pci/pci.c  |6 --
 arch/sh/include/asm/pci.h|2 --
 arch/sparc/kernel/pci.c  |   17 -
 arch/tile/include/asm/pci.h  |2 --
 arch/x86/include/asm/pci.h   |6 --
 drivers/pci/pci.c|8 
 include/linux/pci.h  |7 ++-
 12 files changed, 10 insertions(+), 65 deletions(-)

diff --git a/arch/alpha/include/asm/pci.h b/arch/alpha/include/asm/pci.h
index f7f680f..63a9a1e 100644
--- a/arch/alpha/include/asm/pci.h
+++ b/arch/alpha/include/asm/pci.h
@@ -95,8 +95,6 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, 
int channel)
return channel ? 15 : 14;
 }
 
-#define pci_domain_nr(bus) ((struct pci_controller *)(bus)-sysdata)-index
-
 static inline int pci_proc_domain(struct pci_bus *bus)
 {
struct pci_controller *hose = bus-sysdata;
diff --git a/arch/ia64/include/asm/pci.h b/arch/ia64/include/asm/pci.h
index 52af5ed..1dcea49 100644
--- a/arch/ia64/include/asm/pci.h
+++ b/arch/ia64/include/asm/pci.h
@@ -99,7 +99,6 @@ struct pci_controller {
 
 
 #define PCI_CONTROLLER(busdev) ((struct pci_controller *) busdev-sysdata)
-#define pci_domain_nr(busdev)(PCI_CONTROLLER(busdev)-segment)
 
 extern struct pci_ops pci_root_ops;
 
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c
index 890bd36..81ac523 100644
--- a/arch/microblaze/pci/pci-common.c
+++ b/arch/microblaze/pci/pci-common.c
@@ -123,17 +123,6 @@ unsigned long pci_address_to_pio(phys_addr_t address)
 }
 EXPORT_SYMBOL_GPL(pci_address_to_pio);
 
-/*
- * Return the domain number for this bus.
- */
-int pci_domain_nr(struct pci_bus *bus)
-{
-   struct pci_controller *hose = pci_bus_to_host(bus);
-
-   return hose-global_number;
-}
-EXPORT_SYMBOL(pci_domain_nr);
-
 /* This routine is meant to be used early during boot, when the
  * PCI bus numbers have not yet been assigned, and you need to
  * issue PCI config cycles to an OF device.
diff --git a/arch/mips/include/asm/pci.h b/arch/mips/include/asm/pci.h
index 6952962..9546396 100644
--- a/arch/mips/include/asm/pci.h
+++ b/arch/mips/include/asm/pci.h
@@ -121,8 +121,6 @@ static inline void pci_dma_burst_advice(struct pci_dev 
*pdev,
 }
 #endif
 
-#define pci_domain_nr(bus) ((struct pci_controller *)(bus)-sysdata)-index
-
 static inline int pci_proc_domain(struct pci_bus *bus)
 {
struct pci_controller *hose = bus-sysdata;
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index 0c7fb81..a482bd6 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -181,17 +181,6 @@ unsigned long pci_address_to_pio(phys_addr_t address)
 }
 EXPORT_SYMBOL_GPL(pci_address_to_pio);
 
-/*
- * Return the domain number for this bus.
- */
-int pci_domain_nr(struct pci_bus *bus)
-{
-   struct pci_controller *hose = pci_bus_to_host(bus);
-
-   return hose-global_number;
-}
-EXPORT_SYMBOL(pci_domain_nr);
-
 /* This routine is meant to be used early during boot, when the
  * PCI bus numbers have not yet been assigned, and you need to
  * issue PCI config cycles to an OF device.
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
index 612decf..8ca02f7 100644
--- a/arch/s390/pci/pci.c
+++ b/arch/s390/pci/pci.c
@@ -101,12 +101,6 @@ static struct zpci_dev *get_zdev_by_bus(struct pci_bus 
*bus)
return (bus  bus-sysdata) ? (struct zpci_dev *) bus-sysdata : NULL;
 }
 
-int pci_domain_nr(struct pci_bus *bus)
-{
-   return ((struct zpci_dev *) bus-sysdata)-domain;
-}
-EXPORT_SYMBOL_GPL(pci_domain_nr);
-
 int pci_proc_domain(struct pci_bus *bus)
 {
return pci_domain_nr(bus);
diff --git a/arch/sh/include/asm/pci.h b/arch/sh/include/asm/pci.h
index 5b45115..4dc3ad6 100644
--- a/arch/sh/include/asm/pci.h
+++ b/arch/sh/include/asm/pci.h
@@ -109,8 +109,6 @@ static inline void pci_dma_burst_advice(struct pci_dev 
*pdev,
 /* Board-specific fixup routines. */
 int pcibios_map_platform_irq(const struct pci_dev *dev, u8 slot, u8 pin);
 
-#define pci_domain_nr(bus) ((struct pci_channel *)(bus)-sysdata)-index
-
 static inline int pci_proc_domain(struct pci_bus *bus)
 {
struct pci_channel *hose = bus-sysdata;
diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c
index 42dc21f..519f121 100644
--- a/arch/sparc/kernel/pci.c
+++ b/arch/sparc/kernel/pci.c
@@ -906,23 +906,6 @@ int pcibus_to_node(struct pci_bus *pbus)
 EXPORT_SYMBOL(pcibus_to_node);
 #endif
 
-/* Return the domain number for this pci bus */
-
-int pci_domain_nr(struct pci_bus *pbus)
-{
-   struct pci_pbm_info 

[PATCH 00/28] Refine PCI scan interfaces and make generic pci host bridge

2015-01-15 Thread Yijing Wang
This series is based on Bjorn's pci-next branch.

Patch 1-4 ripped out pci_bus_add_devices() from pci scan interfaces
for better pci scan flow.

Patch 5-11 make a generic pci_host_bridge to hold pci_host_bridge
related informations, and introduce a pci_host_bridge_ops to 
support platform host drivers provide its own pci_host_bridge 
related operations to setup pci_host_bridge during pci enumeration.

Patch 12-28 apply the new pci scan interfaces to platform pci host
bridge drivers.

Now in kernel, we scan pci bus use the following ways:
1. pci_scan_bus. 
   parent = NULL, default io/mem/bus resources
   call pci_bus_add_devices()

2. pci_scan_bus_parented() + pci_bus_add_devices()
   default io/mem/bus resources, only used by xen

3. pci_scan_root_bus() + pci_bus_add_devices()

4. pci_create_root_bus() + pci_scan_child_bus() + pci_bus_add_devices()

5. pci_create_root_bus() + xx_of_scan_bus()  +  pci_bus_add_devices()

And we have a lot of arch specific pci_domain_nr() and other platform
specific weak function like pcibios_root_bridge_prepare().

After applied this series, we have following scan interfaces:

1. pci_scan_bus_legacy() 
   parent = NULL, default io/mem/bus resources.
   for legacy pci scan

2. pci_scan_root_bus()
   for callers provide its own parent and io/mem/bus resources
   but no platform specific pci_host_bridge operations

3. pci_scan_root_bridge()
   for callers provide its own parent and io/mem/bus resources
   and pci_host_bridge_ops.

Besides, above pci scan interfaces all need addtionally call 
pci_bus_add_devices()
to set match_driver true and try to attach drivers.

Also we could eliminate all arch specific pci_domain_nr() after applied this 
series.

I tested this series on x86 (with or without ACPI).
Comments and tests are warmly welcome!

Arnd Bergmann (1):
  xen/PCI: Don't use deprecated function pci_scan_bus_parented()

Yijing Wang (27):
  PCI: Rip out pci_bus_add_devices() from pci_scan_bus()
  PCI: Rip out pci_bus_add_devices() from pci_scan_root_bus()
  PCI: Remove deprecated pci_scan_bus_parented()
  PCI: Rename pci_scan_bus() to pci_scan_bus_legacy()
  PCI: Combine PCI domain and bus number in u32 arg
  PCI: Pass PCI domain number combined with root bus number
  PCI: Introduce pci_host_assign_domain_nr() to assign domain
  PCI: Separate pci_host_bridge creation out of pci_create_root_bus()
  PCI: Save sysdata in pci_host_bridge drvdata
  PCI: Introduce pci_host_bridge_ops to setup host bridge
  PCI: Introduce new scan function pci_scan_root_bridge()
  PCI/x86: Refine pci_acpi_scan_root() with generic pci_host_bridge
  PCI/IA64: Refine pci_acpi_scan_root() with generic pci_host_bridge
  PCI/powerpc: Rename pcibios_root_bridge_prepare() for better
readability
  PCI/powerpc: Use pci_scan_root_bridge() for simplicity
  PCI: Remove weak pcibios_root_bridge_prepare()
  PCI/sparc: Use pci_scan_root_bridge() for simplicity
  PCI: Introduce pci_bus_child_max_busnr()
  PCI/Parisc: Use pci_scan_root_bus() for simplicity
  PCI/mvebu: Use pci_common_init_dev() to simplify code
  PCI/tegra: Remove redundant tegra_pcie_scan_bus()
  PCI/designware: Use pci_scan_root_bus() for simplicity
  PCI/xgene: Use pci_scan_root_bus() instead of pci_create_root_bus()
  PCI: Rename __pci_create_root_bus() to pci_create_root_bus()
  PCI: Export find_pci_host_bridge()
  PCI: Remove platform specific pci_domain_nr()
  PCI: Remove pci_bus_assign_domain_nr()

 arch/alpha/include/asm/pci.h |2 -
 arch/alpha/kernel/pci.c  |7 +-
 arch/alpha/kernel/sys_nautilus.c |4 +-
 arch/frv/mb93090-mb00/pci-vdk.c  |6 +-
 arch/ia64/include/asm/pci.h  |1 -
 arch/ia64/pci/pci.c  |   34 +++---
 arch/ia64/sn/kernel/io_init.c|6 +-
 arch/m68k/coldfire/pci.c |3 +-
 arch/microblaze/pci/pci-common.c |   17 +--
 arch/mips/include/asm/pci.h  |2 -
 arch/mips/pci/pci.c  |5 +-
 arch/mn10300/unit-asb2305/pci.c  |5 +-
 arch/powerpc/include/asm/machdep.h   |2 +-
 arch/powerpc/kernel/pci-common.c |   73 ++-
 arch/powerpc/platforms/pseries/pci.c |2 +-
 arch/powerpc/platforms/pseries/pseries.h |2 +-
 arch/powerpc/platforms/pseries/setup.c   |2 +-
 arch/s390/pci/pci.c  |   13 +--
 arch/sh/drivers/pci/pci.c|6 +-
 arch/sh/include/asm/pci.h|2 -
 arch/sparc/kernel/leon_pci.c |1 +
 arch/sparc/kernel/pci.c  |   48 
 arch/sparc/kernel/pcic.c |4 +-
 arch/tile/include/asm/pci.h  |2 -
 arch/tile/kernel/pci.c   |6 +-
 arch/tile/kernel/pci_gx.c|7 +-
 arch/unicore32/kernel/pci.c  |   13 +--
 arch/x86/include/asm/pci.h   |6 -
 arch/x86/pci/acpi.c  |   38 +++---
 arch/x86/pci/common.c   

[PATCH 08/28] PCI: Introduce pci_host_assign_domain_nr() to assign domain

2015-01-15 Thread Yijing Wang
Introduce pci_host_assign_domain_nr() to assign domain
number for pci_host_bridge. Later we will remove
pci_bus_assign_domain_nr().

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 drivers/pci/pci.c   |   47 +++
 include/linux/pci.h |4 
 2 files changed, 51 insertions(+), 0 deletions(-)

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index c419554..8b35e8e 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -4443,6 +4443,53 @@ int pci_get_new_domain_nr(void)
 }
 
 #ifdef CONFIG_PCI_DOMAINS_GENERIC
+void pci_host_assign_domain_nr(struct pci_host_bridge *host)
+{
+   static int use_dt_domains = -1;
+   struct device *parent = host-dev.parent;
+   int domain = of_get_pci_domain_nr(parent-of_node);
+
+   /*
+* Check DT domain and use_dt_domains values.
+*
+* If DT domain property is valid (domain = 0) and
+* use_dt_domains != 0, the DT assignment is valid since this means
+* we have not previously allocated a domain number by using
+* pci_get_new_domain_nr(); we should also update use_dt_domains to
+* 1, to indicate that we have just assigned a domain number from
+* DT.
+*
+* If DT domain property value is not valid (ie domain  0), and we
+* have not previously assigned a domain number from DT
+* (use_dt_domains != 1) we should assign a domain number by
+* using the:
+*
+* pci_get_new_domain_nr()
+*
+* API and update the use_dt_domains value to keep track of method we
+* are using to assign domain numbers (use_dt_domains = 0).
+*
+* All other combinations imply we have a platform that is trying
+* to mix domain numbers obtained from DT and pci_get_new_domain_nr(),
+* which is a recipe for domain mishandling and it is prevented by
+* invalidating the domain value (domain = -1) and printing a
+* corresponding error.
+*/
+   if (domain = 0  use_dt_domains) {
+   use_dt_domains = 1;
+   } else if (domain  0  use_dt_domains != 1) {
+   use_dt_domains = 0;
+   domain = pci_get_new_domain_nr();
+   } else {
+   dev_err(parent, Node %s has inconsistent \linux,pci-domain\ 
property in DT\n,
+   parent-of_node-full_name);
+   domain = -1;
+   }
+
+   host-domain_nr = domain;
+}
+
+
 void pci_bus_assign_domain_nr(struct pci_bus *bus, struct device *parent)
 {
static int use_dt_domains = -1;
diff --git a/include/linux/pci.h b/include/linux/pci.h
index c771508..1b9c799 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1316,11 +1316,15 @@ static inline int pci_domain_nr(struct pci_bus *bus)
return bus-domain_nr;
 }
 void pci_bus_assign_domain_nr(struct pci_bus *bus, struct device *parent);
+void pci_host_assign_domain_nr(struct pci_host_bridge *host);
 #else
 static inline void pci_bus_assign_domain_nr(struct pci_bus *bus,
struct device *parent)
 {
 }
+static inline void pci_host_assign_domain_nr(struct pci_host_bridge *host)
+{
+}
 #endif
 
 /* some architectures require additional setup to direct VGA traffic */
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 04/28] PCI: Remove deprecated pci_scan_bus_parented()

2015-01-15 Thread Yijing Wang
No one uses pci_scan_bus_parented() any more,
remove it.

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 drivers/pci/probe.c |   19 ---
 include/linux/pci.h |2 --
 2 files changed, 0 insertions(+), 21 deletions(-)

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 7cf577f..e44de73 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -2091,25 +2091,6 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, 
int bus,
 }
 EXPORT_SYMBOL(pci_scan_root_bus);
 
-/* Deprecated; use pci_scan_root_bus() instead */
-struct pci_bus *pci_scan_bus_parented(struct device *parent,
-   int bus, struct pci_ops *ops, void *sysdata)
-{
-   LIST_HEAD(resources);
-   struct pci_bus *b;
-
-   pci_add_resource(resources, ioport_resource);
-   pci_add_resource(resources, iomem_resource);
-   pci_add_resource(resources, busn_resource);
-   b = pci_create_root_bus(parent, bus, ops, sysdata, resources);
-   if (b)
-   pci_scan_child_bus(b);
-   else
-   pci_free_resource_list(resources);
-   return b;
-}
-EXPORT_SYMBOL(pci_scan_bus_parented);
-
 struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops,
void *sysdata)
 {
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 360a966..55b2c81 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -769,8 +769,6 @@ void pcibios_bus_to_resource(struct pci_bus *bus, struct 
resource *res,
 void pcibios_scan_specific_bus(int busn);
 struct pci_bus *pci_find_bus(int domain, int busnr);
 void pci_bus_add_devices(const struct pci_bus *bus);
-struct pci_bus *pci_scan_bus_parented(struct device *parent, int bus,
- struct pci_ops *ops, void *sysdata);
 struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops, void *sysdata);
 struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
struct pci_ops *ops, void *sysdata,
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 05/28] PCI: Rename pci_scan_bus() to pci_scan_bus_legacy()

2015-01-15 Thread Yijing Wang
Pci_scan_bus() is called by legacy pci host drivers,
the legacy host drivers mean they use NUll as parent
device, use all IO/MEM as default resources. Rename
pci_scan_bus() to pci_scan_bus_legacy() for better
readability.

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 arch/alpha/kernel/sys_nautilus.c  |2 +-
 arch/m68k/coldfire/pci.c  |2 +-
 arch/sparc/kernel/pcic.c  |2 +-
 arch/unicore32/kernel/pci.c   |2 +-
 drivers/pci/hotplug/ibmphp_core.c |2 +-
 drivers/pci/probe.c   |4 ++--
 include/linux/pci.h   |2 +-
 7 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/arch/alpha/kernel/sys_nautilus.c b/arch/alpha/kernel/sys_nautilus.c
index 4ae4a40..2c864bb 100644
--- a/arch/alpha/kernel/sys_nautilus.c
+++ b/arch/alpha/kernel/sys_nautilus.c
@@ -206,7 +206,7 @@ nautilus_init_pci(void)
unsigned long memtop = max_low_pfn  PAGE_SHIFT;
 
/* Scan our single hose.  */
-   bus = pci_scan_bus(0, alpha_mv.pci_ops, hose);
+   bus = pci_scan_bus_legacy(0, alpha_mv.pci_ops, hose);
hose-bus = bus;
pcibios_claim_one_bus(bus);
 
diff --git a/arch/m68k/coldfire/pci.c b/arch/m68k/coldfire/pci.c
index d45f087..0ef4dd4 100644
--- a/arch/m68k/coldfire/pci.c
+++ b/arch/m68k/coldfire/pci.c
@@ -312,7 +312,7 @@ static int __init mcf_pci_init(void)
set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(msecs_to_jiffies(200));
 
-   rootbus = pci_scan_bus(0, mcf_pci_ops, NULL);
+   rootbus = pci_scan_bus_legacy(0, mcf_pci_ops, NULL);
rootbus-resource[0] = mcf_pci_io;
rootbus-resource[1] = mcf_pci_mem;
 
diff --git a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c
index 7a82fe2..f7edc97 100644
--- a/arch/sparc/kernel/pcic.c
+++ b/arch/sparc/kernel/pcic.c
@@ -390,7 +390,7 @@ static void __init pcic_pbm_scan_bus(struct linux_pcic 
*pcic)
 {
struct linux_pbm_info *pbm = pcic-pbm;
 
-   pbm-pci_bus = pci_scan_bus(pbm-pci_first_busno, pcic_ops, pbm);
+   pbm-pci_bus = pci_scan_bus_legacy(pbm-pci_first_busno, pcic_ops, 
pbm);
if (pbm-pci_bus)
pci_bus_add_devices(pbm-pci_bus);
 #if 0 /* deadwood transplanted from sparc64 */
diff --git a/arch/unicore32/kernel/pci.c b/arch/unicore32/kernel/pci.c
index 3d82024..2e238b4 100644
--- a/arch/unicore32/kernel/pci.c
+++ b/arch/unicore32/kernel/pci.c
@@ -258,7 +258,7 @@ static int __init pci_common_init(void)
 
pci_puv3_preinit();
 
-   puv3_bus = pci_scan_bus(0, pci_puv3_ops, NULL);
+   puv3_bus = pci_scan_bus_legacy(0, pci_puv3_ops, NULL);
 
if (!puv3_bus)
panic(PCI: unable to scan bus!);
diff --git a/drivers/pci/hotplug/ibmphp_core.c 
b/drivers/pci/hotplug/ibmphp_core.c
index 86e3bfd..4ade1b4 100644
--- a/drivers/pci/hotplug/ibmphp_core.c
+++ b/drivers/pci/hotplug/ibmphp_core.c
@@ -765,7 +765,7 @@ static u8 bus_structure_fixup(u8 busno)
(l != 0x)  (l != 0x)) {
debug(%s - Inside bus_structure_fixup()\n,
__func__);
-   b = pci_scan_bus(busno, ibmphp_pci_bus-ops, NULL);
+   b = pci_scan_bus_legacy(busno, ibmphp_pci_bus-ops, 
NULL);
if (b)
pci_bus_add_devices(b);
break;
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index e44de73..ed894cb 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -2091,7 +2091,7 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, 
int bus,
 }
 EXPORT_SYMBOL(pci_scan_root_bus);
 
-struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops,
+struct pci_bus *pci_scan_bus_legacy(int bus, struct pci_ops *ops,
void *sysdata)
 {
LIST_HEAD(resources);
@@ -2108,7 +2108,7 @@ struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops,
}
return b;
 }
-EXPORT_SYMBOL(pci_scan_bus);
+EXPORT_SYMBOL(pci_scan_bus_legacy);
 
 /**
  * pci_rescan_bus_bridge_resize - scan a PCI bus for devices.
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 55b2c81..a6fa2f1 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -769,7 +769,7 @@ void pcibios_bus_to_resource(struct pci_bus *bus, struct 
resource *res,
 void pcibios_scan_specific_bus(int busn);
 struct pci_bus *pci_find_bus(int domain, int busnr);
 void pci_bus_add_devices(const struct pci_bus *bus);
-struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops, void *sysdata);
+struct pci_bus *pci_scan_bus_legacy(int bus, struct pci_ops *ops, void 
*sysdata);
 struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
struct pci_ops *ops, void *sysdata,
struct list_head *resources);
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of 

[PATCH 06/28] PCI: Combine PCI domain and bus number in u32 arg

2015-01-15 Thread Yijing Wang
Currently, we use int type for bus number in
pci_create_root_bus(), pci_scan_root_bus() and
pci_scan_bus_legacy. Because PCI bus number
always = 255, so we could change the bus number
argument type to u32, and combine PCI domain and
bus number in one. Also add a domain member in
pci_host_bridge to save domain number. Finally,
we could eliminate lots of the platform specific
pci_domain_nr() in the last of the series.

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 drivers/pci/probe.c  |   16 +---
 include/linux/pci.h  |7 ---
 include/uapi/linux/pci.h |3 +++
 3 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index ed894cb..50f58b3 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1889,7 +1889,7 @@ void __weak pcibios_remove_bus(struct pci_bus *bus)
 {
 }
 
-struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
+struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
struct pci_ops *ops, void *sysdata, struct list_head *resources)
 {
int error;
@@ -1900,6 +1900,7 @@ struct pci_bus *pci_create_root_bus(struct device 
*parent, int bus,
resource_size_t offset;
char bus_addr[64];
char *fmt;
+   u8  bus = PCI_BUSNUM(db);
 
b = pci_alloc_bus(NULL);
if (!b)
@@ -1920,6 +1921,7 @@ struct pci_bus *pci_create_root_bus(struct device 
*parent, int bus,
if (!bridge)
goto err_out;
 
+   bridge-domain = PCI_DOMAIN(db);
bridge-dev.parent = parent;
bridge-dev.release = pci_release_host_bridge_dev;
dev_set_name(bridge-dev, pci%04x:%02x, pci_domain_nr(b), bus);
@@ -2057,7 +2059,7 @@ void pci_bus_release_busn_res(struct pci_bus *b)
res, ret ? can not be : is);
 }
 
-struct pci_bus *pci_scan_root_bus(struct device *parent, int bus,
+struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
struct pci_ops *ops, void *sysdata, struct list_head *resources)
 {
struct pci_host_bridge_window *window;
@@ -2071,15 +2073,15 @@ struct pci_bus *pci_scan_root_bus(struct device 
*parent, int bus,
break;
}
 
-   b = pci_create_root_bus(parent, bus, ops, sysdata, resources);
+   b = pci_create_root_bus(parent, db, ops, sysdata, resources);
if (!b)
return NULL;
 
if (!found) {
dev_info(b-dev,
 No busn resource found for root bus, will use [bus 
%02x-ff]\n,
-   bus);
-   pci_bus_insert_busn_res(b, bus, 255);
+   PCI_BUSNUM(db));
+   pci_bus_insert_busn_res(b, PCI_BUSNUM(db), 255);
}
 
max = pci_scan_child_bus(b);
@@ -2091,7 +2093,7 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, 
int bus,
 }
 EXPORT_SYMBOL(pci_scan_root_bus);
 
-struct pci_bus *pci_scan_bus_legacy(int bus, struct pci_ops *ops,
+struct pci_bus *pci_scan_bus_legacy(u32 db, struct pci_ops *ops,
void *sysdata)
 {
LIST_HEAD(resources);
@@ -2100,7 +2102,7 @@ struct pci_bus *pci_scan_bus_legacy(int bus, struct 
pci_ops *ops,
pci_add_resource(resources, ioport_resource);
pci_add_resource(resources, iomem_resource);
pci_add_resource(resources, busn_resource);
-   b = pci_create_root_bus(NULL, bus, ops, sysdata, resources);
+   b = pci_create_root_bus(NULL, db, ops, sysdata, resources);
if (b) {
pci_scan_child_bus(b);
} else {
diff --git a/include/linux/pci.h b/include/linux/pci.h
index a6fa2f1..c771508 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -402,6 +402,7 @@ struct pci_host_bridge_window {
 };
 
 struct pci_host_bridge {
+   u16 domain;
struct device dev;
struct pci_bus *bus;/* root bus */
struct list_head windows;   /* pci_host_bridge_windows */
@@ -769,14 +770,14 @@ void pcibios_bus_to_resource(struct pci_bus *bus, struct 
resource *res,
 void pcibios_scan_specific_bus(int busn);
 struct pci_bus *pci_find_bus(int domain, int busnr);
 void pci_bus_add_devices(const struct pci_bus *bus);
-struct pci_bus *pci_scan_bus_legacy(int bus, struct pci_ops *ops, void 
*sysdata);
-struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
+struct pci_bus *pci_scan_bus_legacy(u32 dombus, struct pci_ops *ops, void 
*sysdata);
+struct pci_bus *pci_create_root_bus(struct device *parent, u32 dombus,
struct pci_ops *ops, void *sysdata,
struct list_head *resources);
 int pci_bus_insert_busn_res(struct pci_bus *b, int bus, int busmax);
 int pci_bus_update_busn_res_end(struct pci_bus *b, int busmax);
 void pci_bus_release_busn_res(struct pci_bus *b);
-struct pci_bus *pci_scan_root_bus(struct device *parent, int bus,
+struct pci_bus 

[PATCH 01/28] PCI: Rip out pci_bus_add_devices() from pci_scan_bus()

2015-01-15 Thread Yijing Wang
Pci_bus_add_devices() should not be placed in pci_scan_bus().
Now pci device will be added to driver core once its
creation. All things left in pci_bus_add_devices() are
driver attachment and other trivial sysfs things.
Pci_scan_bus() should be the function responsible for
scanning PCI devices, not including driver attachment.
Other, some callers(m68k,unicore32,alpha) of pci_scan_bus()
will call pci_bus_size_bridges() and pci_bus_assign_resources()
after pci_scan_bus().

E.g.
In m68k
mcf_pci_init()
pci_scan_bus()
...
pci_bus_add_devices() --- try to attach driver
pci_fixup_irqs()
pci_bus_size_bridges()
pci_bus_assign_resources()

It is not correct, resources should be assigned correctly
before attaching driver.
So we should rip out pci_bus_add_devices() for better
code design. After applied this patch, pci_scan_bus()
should be used in flow like:

pci_scan_bus() (mandatory)
pci_fixup_irqs() (optional)
pci_bus_size_bridges() (optional)
pci_pci_bus_assign_resources() (optional)
pci_bus_add_devices() (mandatory)

Signed-off-by: Yijing Wang wangyij...@huawei.com
CC: David S. Miller da...@davemloft.net
CC: Geert Uytterhoeven ge...@linux-m68k.org
CC: Guan Xuetao g...@mprc.pku.edu.cn
CC: linux-al...@vger.kernel.org
CC: linux-m...@lists.linux-m68k.org
CC: sparcli...@vger.kernel.org
---
 arch/alpha/kernel/sys_nautilus.c  |1 +
 arch/m68k/coldfire/pci.c  |1 +
 arch/sparc/kernel/pcic.c  |2 ++
 arch/unicore32/kernel/pci.c   |   11 +++
 drivers/pci/hotplug/ibmphp_core.c |6 --
 drivers/pci/probe.c   |1 -
 6 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/arch/alpha/kernel/sys_nautilus.c b/arch/alpha/kernel/sys_nautilus.c
index 837c0fa..4ae4a40 100644
--- a/arch/alpha/kernel/sys_nautilus.c
+++ b/arch/alpha/kernel/sys_nautilus.c
@@ -253,6 +253,7 @@ nautilus_init_pci(void)
   for the root bus, so just clear it. */
bus-self = NULL;
pci_fixup_irqs(alpha_mv.pci_swizzle, alpha_mv.pci_map_irq);
+   pci_bus_add_devices(bus);
 }
 
 /*
diff --git a/arch/m68k/coldfire/pci.c b/arch/m68k/coldfire/pci.c
index df96792..d45f087 100644
--- a/arch/m68k/coldfire/pci.c
+++ b/arch/m68k/coldfire/pci.c
@@ -319,6 +319,7 @@ static int __init mcf_pci_init(void)
pci_fixup_irqs(pci_common_swizzle, mcf_pci_map_irq);
pci_bus_size_bridges(rootbus);
pci_bus_assign_resources(rootbus);
+   pci_bus_add_devices(rootbus);
return 0;
 }
 
diff --git a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c
index 6cc78c2..7a82fe2 100644
--- a/arch/sparc/kernel/pcic.c
+++ b/arch/sparc/kernel/pcic.c
@@ -391,6 +391,8 @@ static void __init pcic_pbm_scan_bus(struct linux_pcic 
*pcic)
struct linux_pbm_info *pbm = pcic-pbm;
 
pbm-pci_bus = pci_scan_bus(pbm-pci_first_busno, pcic_ops, pbm);
+   if (pbm-pci_bus)
+   pci_bus_add_devices(pbm-pci_bus);
 #if 0 /* deadwood transplanted from sparc64 */
pci_fill_in_pbm_cookies(pbm-pci_bus, pbm, pbm-prom_node);
pci_record_assignments(pbm, pbm-pci_bus);
diff --git a/arch/unicore32/kernel/pci.c b/arch/unicore32/kernel/pci.c
index 374a055..3d82024 100644
--- a/arch/unicore32/kernel/pci.c
+++ b/arch/unicore32/kernel/pci.c
@@ -266,17 +266,12 @@ static int __init pci_common_init(void)
pci_fixup_irqs(pci_common_swizzle, pci_puv3_map_irq);
 
if (!pci_has_flag(PCI_PROBE_ONLY)) {
-   /*
-* Size the bridge windows.
-*/
+   /* Size the bridge windows. */
pci_bus_size_bridges(puv3_bus);
-
-   /*
-* Assign resources.
-*/
+   /* Assign resources. */
pci_bus_assign_resources(puv3_bus);
}
-
+   pci_bus_add_devices(puv3_bus);
return 0;
 }
 subsys_initcall(pci_common_init);
diff --git a/drivers/pci/hotplug/ibmphp_core.c 
b/drivers/pci/hotplug/ibmphp_core.c
index 96c5c72..86e3bfd 100644
--- a/drivers/pci/hotplug/ibmphp_core.c
+++ b/drivers/pci/hotplug/ibmphp_core.c
@@ -738,7 +738,7 @@ static void ibm_unconfigure_device(struct pci_func *func)
  */
 static u8 bus_structure_fixup(u8 busno)
 {
-   struct pci_bus *bus;
+   struct pci_bus *bus, *b;
struct pci_dev *dev;
u16 l;
 
@@ -765,7 +765,9 @@ static u8 bus_structure_fixup(u8 busno)
(l != 0x)  (l != 0x)) {
debug(%s - Inside bus_structure_fixup()\n,
__func__);
-   pci_scan_bus(busno, ibmphp_pci_bus-ops, NULL);
+   b = pci_scan_bus(busno, ibmphp_pci_bus-ops, NULL);
+   if (b)
+   pci_bus_add_devices(b);
break;
}
}
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 23212f8..053c0f4 100644

[PATCH 09/28] PCI: Separate pci_host_bridge creation out of pci_create_root_bus()

2015-01-15 Thread Yijing Wang
We want to make a generic pci_host_bridge, then we could
place common PCI infos like domain number in it. Ripping
out pci_host_bridge creation from pci_create_root_bus()
make code more better readability. Further more, we could
use the generic pci_host_bridge to hold host bridge specific
operations like pcibios_root_bridge_prepare().

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 drivers/pci/host-bridge.c |   78 +
 drivers/pci/probe.c   |  121 +++--
 include/linux/pci.h   |6 ++-
 3 files changed, 134 insertions(+), 71 deletions(-)

diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
index 0e5f3c9..c9ee582 100644
--- a/drivers/pci/host-bridge.c
+++ b/drivers/pci/host-bridge.c
@@ -8,6 +8,84 @@
 
 #include pci.h
 
+static LIST_HEAD(pci_host_bridge_list);
+static DEFINE_MUTEX(phb_mutex);
+
+static void pci_release_host_bridge_dev(struct device *dev)
+{
+   struct pci_host_bridge *bridge = to_pci_host_bridge(dev);
+
+   if (bridge-release_fn)
+   bridge-release_fn(bridge);
+
+   pci_free_resource_list(bridge-windows);
+   kfree(bridge);
+}
+
+struct pci_host_bridge *pci_create_host_bridge(
+   struct device *parent, u32 db, struct list_head *resources)
+{
+   int error;
+   int bus = PCI_BUSNUM(db);
+   int domain = PCI_DOMAIN(db);
+   struct pci_host_bridge *host, *temp;
+   struct pci_host_bridge_window *window, *n;
+
+   host = kzalloc(sizeof(*host), GFP_KERNEL);
+   if (!host)
+   return NULL;
+
+   host-busnum = bus;
+   host-domain = domain;
+   /* If support CONFIG_PCI_DOMAINS_GENERIC, use
+* pci_host_assign_domain_nr() to assign domain
+* number instead argu u32 db.
+*/
+   pci_host_assign_domain_nr(host);
+
+   mutex_lock(phb_mutex);
+   list_for_each_entry(temp, pci_host_bridge_list, list)
+   if (temp-domain == host-domain
+host-busnum == temp-busnum) {
+   dev_dbg(host-dev, pci host bridge pci%04x:%02x 
exist\n,
+   host-domain, host-busnum);
+   mutex_unlock(phb_mutex);
+   kfree(host);
+   return NULL;
+   }
+   mutex_unlock(phb_mutex);
+
+   host-dev.parent = parent;
+   INIT_LIST_HEAD(host-windows);
+   host-dev.release = pci_release_host_bridge_dev;
+   dev_set_name(host-dev, pci%04x:%02x, host-domain,
+   host-busnum);
+
+   error = device_register(host-dev);
+   if (error) {
+   put_device(host-dev);
+   return NULL;
+   }
+
+   list_for_each_entry_safe(window, n, resources, list)
+   list_move_tail(window-list, host-windows);
+
+   mutex_lock(phb_mutex);
+   list_add_tail(host-list, pci_host_bridge_list);
+   mutex_unlock(phb_mutex);
+   return host;
+}
+EXPORT_SYMBOL(pci_create_host_bridge);
+
+void pci_free_host_bridge(struct pci_host_bridge *host)
+{
+   mutex_lock(phb_mutex);
+   list_del(host-list);
+   mutex_unlock(phb_mutex);
+
+   device_unregister(host-dev);
+}
+
 static struct pci_bus *find_pci_root_bus(struct pci_bus *bus)
 {
while (bus-parent)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 50f58b3..2e0b952 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -502,31 +502,6 @@ static struct pci_bus *pci_alloc_bus(struct pci_bus 
*parent)
return b;
 }
 
-static void pci_release_host_bridge_dev(struct device *dev)
-{
-   struct pci_host_bridge *bridge = to_pci_host_bridge(dev);
-
-   if (bridge-release_fn)
-   bridge-release_fn(bridge);
-
-   pci_free_resource_list(bridge-windows);
-
-   kfree(bridge);
-}
-
-static struct pci_host_bridge *pci_alloc_host_bridge(struct pci_bus *b)
-{
-   struct pci_host_bridge *bridge;
-
-   bridge = kzalloc(sizeof(*bridge), GFP_KERNEL);
-   if (!bridge)
-   return NULL;
-
-   INIT_LIST_HEAD(bridge-windows);
-   bridge-bus = b;
-   return bridge;
-}
-
 static const unsigned char pcix_bus_speed[] = {
PCI_SPEED_UNKNOWN,  /* 0 */
PCI_SPEED_66MHz_PCIX,   /* 1 */
@@ -1889,54 +1864,35 @@ void __weak pcibios_remove_bus(struct pci_bus *bus)
 {
 }
 
-struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
-   struct pci_ops *ops, void *sysdata, struct list_head *resources)
+static struct pci_bus *__pci_create_root_bus(
+   struct pci_host_bridge *bridge, struct pci_ops *ops,
+   void *sysdata)
 {
int error;
-   struct pci_host_bridge *bridge;
-   struct pci_bus *b, *b2;
-   struct pci_host_bridge_window *window, *n;
+   struct pci_bus *b;
+   struct pci_host_bridge_window *window;
+   struct device *parent;
struct 

[PATCH 15/28] PCI/powerpc: Rename pcibios_root_bridge_prepare() for better readability

2015-01-15 Thread Yijing Wang
Pcibios_root_bridge_prepare() in powerpc is used
to set root bus speed. So rename it to
pcibios_set_root_bus_speed() for better readability.

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 arch/powerpc/include/asm/machdep.h   |2 +-
 arch/powerpc/kernel/pci-common.c |4 ++--
 arch/powerpc/platforms/pseries/pci.c |2 +-
 arch/powerpc/platforms/pseries/pseries.h |2 +-
 arch/powerpc/platforms/pseries/setup.c   |2 +-
 5 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/powerpc/include/asm/machdep.h 
b/arch/powerpc/include/asm/machdep.h
index c8175a3..8e7f2a8 100644
--- a/arch/powerpc/include/asm/machdep.h
+++ b/arch/powerpc/include/asm/machdep.h
@@ -129,7 +129,7 @@ struct machdep_calls {
void(*pcibios_fixup)(void);
int (*pci_probe_mode)(struct pci_bus *);
void(*pci_irq_fixup)(struct pci_dev *dev);
-   int (*pcibios_root_bridge_prepare)(struct pci_host_bridge
+   int (*pcibios_set_root_bus_speed)(struct pci_host_bridge
*bridge);
 
/* To setup PHBs when using automatic OF platform driver for PCI */
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index 927c3dd..2cf941e 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -769,8 +769,8 @@ int pci_proc_domain(struct pci_bus *bus)
 
 int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
 {
-   if (ppc_md.pcibios_root_bridge_prepare)
-   return ppc_md.pcibios_root_bridge_prepare(bridge);
+   if (ppc_md.pcibios_set_root_bus_speed)
+   return ppc_md.pcibios_set_root_bus_speed(bridge);
 
return 0;
 }
diff --git a/arch/powerpc/platforms/pseries/pci.c 
b/arch/powerpc/platforms/pseries/pci.c
index fe16a50..af685d6 100644
--- a/arch/powerpc/platforms/pseries/pci.c
+++ b/arch/powerpc/platforms/pseries/pci.c
@@ -110,7 +110,7 @@ static void fixup_winbond_82c105(struct pci_dev* dev)
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105,
 fixup_winbond_82c105);
 
-int pseries_root_bridge_prepare(struct pci_host_bridge *bridge)
+int pseries_set_root_bus_speed(struct pci_host_bridge *bridge)
 {
struct device_node *dn, *pdn;
struct pci_bus *bus;
diff --git a/arch/powerpc/platforms/pseries/pseries.h 
b/arch/powerpc/platforms/pseries/pseries.h
index 1796c54..5d0be3a 100644
--- a/arch/powerpc/platforms/pseries/pseries.h
+++ b/arch/powerpc/platforms/pseries/pseries.h
@@ -63,7 +63,7 @@ extern int dlpar_detach_node(struct device_node *);
 
 /* PCI root bridge prepare function override for pseries */
 struct pci_host_bridge;
-int pseries_root_bridge_prepare(struct pci_host_bridge *bridge);
+int pseries_set_root_bus_speed(struct pci_host_bridge *bridge);
 
 unsigned long pseries_memory_block_size(void);
 
diff --git a/arch/powerpc/platforms/pseries/setup.c 
b/arch/powerpc/platforms/pseries/setup.c
index e445b67..b196c0d 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -496,7 +496,7 @@ static void __init pSeries_setup_arch(void)
ppc_md.enable_pmcs = power4_enable_pmcs;
}
 
-   ppc_md.pcibios_root_bridge_prepare = pseries_root_bridge_prepare;
+   ppc_md.pcibios_set_root_bus_speed = pseries_set_root_bus_speed;
 
if (firmware_has_feature(FW_FEATURE_SET_MODE)) {
long rc;
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 12/28] PCI: Introduce new scan function pci_scan_root_bridge()

2015-01-15 Thread Yijing Wang
Introduce new scan function pci_scan_root_bridge() to
support host bridge drivers that need to provide platform
own pci_host_bridge_ops.

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 drivers/pci/probe.c |   21 +
 include/linux/pci.h |3 +++
 2 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 5f748ed..51d69c3 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -2068,6 +2068,27 @@ static struct pci_bus *__pci_scan_root_bus(
return b;
 }
 
+struct pci_host_bridge *pci_scan_root_bridge(struct device *parent,
+   u32 db, struct pci_ops *ops, void *sysdata,
+   struct list_head *resources, struct pci_host_bridge_ops 
*phb_ops)
+{
+   struct pci_host_bridge *host;
+   struct pci_bus *bus;
+
+   host = pci_create_host_bridge(parent, db, resources,
+   sysdata, phb_ops);
+   if (!host)
+   return NULL;
+
+   bus = __pci_scan_root_bus(host, ops);
+   if (!bus)
+   pci_free_host_bridge(host);
+
+   return host;
+}
+EXPORT_SYMBOL(pci_scan_root_bridge);
+
+
 struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
struct pci_ops *ops, void *sysdata, struct list_head *resources)
 {
diff --git a/include/linux/pci.h b/include/linux/pci.h
index c06b95d..5592737 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -797,6 +797,9 @@ void pci_bus_release_busn_res(struct pci_bus *b);
 struct pci_bus *pci_scan_root_bus(struct device *parent, u32 dombus,
 struct pci_ops *ops, void *sysdata,
 struct list_head *resources);
+struct pci_host_bridge *pci_scan_root_bridge(struct device *parent,
+   u32 dombus, struct pci_ops *ops, void *sysdata,
+   struct list_head *resources, struct pci_host_bridge_ops 
*phb_ops);
 struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev,
int busnr);
 void pcie_update_link_speed(struct pci_bus *bus, u16 link_status);
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 14/28] PCI/IA64: Refine pci_acpi_scan_root() with generic pci_host_bridge

2015-01-15 Thread Yijing Wang
From: Yijing Wang wangyijing0...@gmail.com

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 arch/ia64/pci/pci.c |   34 ++
 1 files changed, 18 insertions(+), 16 deletions(-)

diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c
index e457015..7736c02 100644
--- a/arch/ia64/pci/pci.c
+++ b/arch/ia64/pci/pci.c
@@ -420,6 +420,18 @@ probe_pci_root_info(struct pci_root_info *info, struct 
acpi_device *device,
return 0;
 }
 
+static int pci_host_bridge_prepare(struct pci_host_bridge *bridge)
+{
+   struct pci_sysdata *sd = dev_get_drvdata(bridge-dev);
+
+   ACPI_COMPANION_SET(bridge-dev, sd-companion);
+   return 0;
+}
+
+static struct pci_host_bridge_ops phb_ops = {
+   .phb_prepare = pci_host_bridge_prepare,
+};
+
 struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
 {
struct acpi_device *device = root-device;
@@ -428,7 +440,7 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root 
*root)
struct pci_controller *controller;
struct pci_root_info *info = NULL;
int busnum = root-secondary.start;
-   struct pci_bus *pbus;
+   struct pci_host_bridge *host;
int ret;
 
controller = alloc_pci_controller(domain);
@@ -465,26 +477,16 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root 
*root)
 * should handle the case here, but it appears that IA64 hasn't
 * such quirk. So we just ignore the case now.
 */
-   pbus = pci_create_root_bus(NULL, PCI_DOMBUS(domain, bus), 
-   pci_root_ops, controller, info-resources);
-   if (!pbus) {
+   host = pci_scan_root_bridge(NULL, PCI_DOMBUS(domain, bus),
+   pci_root_ops, controller, info-resources, phb_ops);
+   if (!host) {
pci_free_resource_list(info-resources);
__release_pci_root_info(info);
return NULL;
}
 
-   pci_set_host_bridge_release(to_pci_host_bridge(pbus-bridge),
-   release_pci_root_info, info);
-   pci_scan_child_bus(pbus);
-   return pbus;
-}
-
-int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
-{
-   struct pci_controller *controller = bridge-bus-sysdata;
-
-   ACPI_COMPANION_SET(bridge-dev, controller-companion);
-   return 0;
+   pci_set_host_bridge_release(host, release_pci_root_info, info);
+   return host-bus;
 }
 
 static int is_valid_resource(struct pci_dev *dev, int idx)
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 11/28] PCI: Introduce pci_host_bridge_ops to setup host bridge

2015-01-15 Thread Yijing Wang
Now we have weak functions like pcibios_root_bridge_prepare()
to setup pci host bridge, We could introduce pci_host_bridge_ops
which contain host bridge specific ops to setup pci_host_bridge.
Then host bridge driver could add pci_host_bridge_ops hooks
intead of weak function to setup pci_host_bridge.
This patch add following pci_host_bridge_ops hooks:

pci_host_bridge_ops {
/* set root bus speed, some platform need this like powerpc */
void (*phb_set_root_bus_speed)(struct pci_host_bridge *host);
/* setup pci_host_bridge before pci_host_bridge be added to driver core 
*/
int (*phb_prepare)(struct pci_host_bridge *host);
/* probe whether pci_host_bridge scan mode is of mode */
void (*phb_probe_mode)(struct pci_host_bridge *);
/* platform specific of scan hook to scan pci device */
void (*phb_of_scan_bus)(struct pci_host_bridge *);
}

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 drivers/pci/host-bridge.c |   12 ++--
 drivers/pci/probe.c   |   19 ++-
 include/linux/pci.h   |   16 ++--
 3 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
index 0b6ba5c..ccbf168 100644
--- a/drivers/pci/host-bridge.c
+++ b/drivers/pci/host-bridge.c
@@ -23,8 +23,8 @@ static void pci_release_host_bridge_dev(struct device *dev)
 }
 
 struct pci_host_bridge *pci_create_host_bridge(
-   struct device *parent, u32 db, 
-   struct list_head *resources, void *sysdata)
+   struct device *parent, u32 db, struct list_head *resources,
+   void *sysdata, struct pci_host_bridge_ops *ops)
 {
int error;
int bus = PCI_BUSNUM(db);
@@ -56,6 +56,7 @@ struct pci_host_bridge *pci_create_host_bridge(
}
mutex_unlock(phb_mutex);
 
+   host-ops = ops;
host-dev.parent = parent;
INIT_LIST_HEAD(host-windows);
host-dev.release = pci_release_host_bridge_dev;
@@ -63,6 +64,13 @@ struct pci_host_bridge *pci_create_host_bridge(
dev_set_name(host-dev, pci%04x:%02x, host-domain, 
host-busnum);
 
+   if (host-ops  host-ops-phb_prepare) {
+   error = host-ops-phb_prepare(host);
+   if(error) {
+   kfree(host);
+   return NULL;
+   }
+   }
error = device_register(host-dev);
if (error) {
put_device(host-dev);
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 98a8d97..5f748ed 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1888,6 +1888,8 @@ static struct pci_bus *__pci_create_root_bus(
 
bridge-bus = b;
b-bridge = get_device(bridge-dev);
+   if (bridge-ops  bridge-ops-phb_set_root_bus_speed)
+   bridge-ops-phb_set_root_bus_speed(bridge);
error = pcibios_root_bridge_prepare(bridge);
if (error)
goto err_out;
@@ -1953,7 +1955,7 @@ struct pci_bus *pci_create_root_bus(struct device 
*parent, u32 db,
 {
struct pci_host_bridge *host;
 
-   host = pci_create_host_bridge(parent, db, resources, sysdata);
+   host = pci_create_host_bridge(parent, db, resources, sysdata, NULL);
if (!host)
return NULL;

@@ -2051,10 +2053,17 @@ static struct pci_bus *__pci_scan_root_bus(
pci_bus_insert_busn_res(b, host-busnum, 255);
}
 
-   max = pci_scan_child_bus(b);
+   if (host-ops  host-ops-phb_probe_mode)
+   host-ops-phb_probe_mode(host);
 
-   if (!found)
-   pci_bus_update_busn_res_end(b, max);
+   if (host-of_scan) {
+   if (host-ops host-ops-phb_of_scan_bus)
+   host-ops-phb_of_scan_bus(host);
+   } else {
+   max = pci_scan_child_bus(b);
+   if (!found)
+   pci_bus_update_busn_res_end(b, max);
+   }
 
return b;
 }
@@ -2064,7 +2073,7 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, 
u32 db,
 {
struct pci_host_bridge *host;
 
-   host = pci_create_host_bridge(parent, db, resources, sysdata);
+   host = pci_create_host_bridge(parent, db, resources, sysdata, NULL);
if (!host)
return NULL;
 
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 3ee8436..c06b95d 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -401,13 +401,25 @@ struct pci_host_bridge_window {
resource_size_t offset; /* bus address + offset = CPU address */
 };
 
+struct pci_host_bridge;
+struct pci_host_bridge_ops {
+   void (*phb_set_root_bus_speed)(struct pci_host_bridge *host);
+   int (*phb_prepare)(struct pci_host_bridge *host);
+   /* Override domain number by host specific .phv_assign_domain_nr()  */
+   void (*phb_assign_domain_nr)(struct pci_host_bridge *);
+   void 

[PATCH 19/28] PCI: Introduce pci_bus_child_max_busnr()

2015-01-15 Thread Yijing Wang
Sometimes, we need to know the highest reserved
busnr for children bus. Because parent's
bus-busn_res could have padding in it.
This function return the max child busnr as
pci_scan_child_bus().

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 drivers/pci/hotplug/acpiphp_glue.c |   29 +
 drivers/pci/pci.c  |   25 -
 include/linux/pci.h|2 +-
 3 files changed, 26 insertions(+), 30 deletions(-)

diff --git a/drivers/pci/hotplug/acpiphp_glue.c 
b/drivers/pci/hotplug/acpiphp_glue.c
index bcb90e4..84f2584 100644
--- a/drivers/pci/hotplug/acpiphp_glue.c
+++ b/drivers/pci/hotplug/acpiphp_glue.c
@@ -397,33 +397,6 @@ static void cleanup_bridge(struct acpiphp_bridge *bridge)
acpi_unlock_hp_context();
 }
 
-/**
- * acpiphp_max_busnr - return the highest reserved bus number under the given 
bus.
- * @bus: bus to start search with
- */
-static unsigned char acpiphp_max_busnr(struct pci_bus *bus)
-{
-   struct pci_bus *tmp;
-   unsigned char max, n;
-
-   /*
-* pci_bus_max_busnr will return the highest
-* reserved busnr for all these children.
-* that is equivalent to the bus-subordinate
-* value.  We don't want to use the parent's
-* bus-subordinate value because it could have
-* padding in it.
-*/
-   max = bus-busn_res.start;
-
-   list_for_each_entry(tmp, bus-children, node) {
-   n = pci_bus_max_busnr(tmp);
-   if (n  max)
-   max = n;
-   }
-   return max;
-}
-
 static void acpiphp_set_acpi_region(struct acpiphp_slot *slot)
 {
struct acpiphp_func *func;
@@ -489,7 +462,7 @@ static void enable_slot(struct acpiphp_slot *slot)
LIST_HEAD(add_list);
 
acpiphp_rescan_slot(slot);
-   max = acpiphp_max_busnr(bus);
+   max = pci_bus_child_max_busnr(bus);
for (pass = 0; pass  2; pass++) {
list_for_each_entry(dev, bus-devices, bus_list) {
if (PCI_SLOT(dev-devfn) != slot-device)
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 8b35e8e..a05f406 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -121,7 +121,30 @@ unsigned char pci_bus_max_busnr(struct pci_bus *bus)
}
return max;
 }
-EXPORT_SYMBOL_GPL(pci_bus_max_busnr);
+
+unsigned char pci_bus_child_max_busnr(struct pci_bus *bus)
+{
+   struct pci_bus *tmp;
+   unsigned char max, n;
+
+   /*
+* pci_bus_max_busnr will return the highest
+* reserved busnr for all these children.
+* that is equivalent to the bus-subordinate
+* value.  We don't want to use the parent's
+* bus-subordinate value because it could have
+* padding in it.
+*/
+   max = bus-busn_res.start;
+
+   list_for_each_entry(tmp, bus-children, node) {
+   n = pci_bus_max_busnr(tmp);
+   if (n  max)
+   max = n;
+   }
+   return max;
+}
+EXPORT_SYMBOL_GPL(pci_bus_child_max_busnr);
 
 #ifdef CONFIG_HAS_IOMEM
 void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar)
diff --git a/include/linux/pci.h b/include/linux/pci.h
index da3a071..2970a84 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1176,7 +1176,7 @@ int pci_scan_bridge(struct pci_bus *bus, struct pci_dev 
*dev, int max,
 void pci_walk_bus(struct pci_bus *top, int (*cb)(struct pci_dev *, void *),
  void *userdata);
 int pci_cfg_space_size(struct pci_dev *dev);
-unsigned char pci_bus_max_busnr(struct pci_bus *bus);
+unsigned char pci_bus_child_max_busnr(struct pci_bus *bus);
 void pci_setup_bridge(struct pci_bus *bus);
 resource_size_t pcibios_window_alignment(struct pci_bus *bus,
 unsigned long type);
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 16/28] PCI/powerpc: Use pci_scan_root_bridge() for simplicity

2015-01-15 Thread Yijing Wang
Now we could use pci_scan_root_bridge() to scan
pci buses, provide powerpc specific pci_host_bridge_ops.

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 arch/powerpc/kernel/pci-common.c |   57 --
 1 files changed, 36 insertions(+), 21 deletions(-)

diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index 2cf941e..0c7fb81 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -767,7 +767,8 @@ int pci_proc_domain(struct pci_bus *bus)
return 1;
 }
 
-int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
+static int pci_host_bridge_set_root_bus_speed(
+   struct pci_host_bridge *bridge)
 {
if (ppc_md.pcibios_set_root_bus_speed)
return ppc_md.pcibios_set_root_bus_speed(bridge);
@@ -775,6 +776,27 @@ int pcibios_root_bridge_prepare(struct pci_host_bridge 
*bridge)
return 0;
 }
 
+static void pci_host_bridge_probe_mode(struct pci_host_bridge *host)
+{
+   int mode = PCI_PROBE_NORMAL;
+   struct pci_bus *bus = host-bus;
+   struct pci_controller *hose = dev_get_drvdata(host-dev);
+
+   /* Get probe mode and perform scan */
+   if (hose-dn  ppc_md.pci_probe_mode)
+   mode = ppc_md.pci_probe_mode(bus);
+
+   pr_debug(probe mode: %d\n, mode);
+   if (mode == PCI_PROBE_DEVTREE)
+   host-of_scan = true;
+}
+
+static void pci_host_bridge_of_scan_bus(struct pci_host_bridge *host)
+{
+   struct pci_controller *hose = dev_get_drvdata(host-dev);
+
+   of_scan_bus(host-dn, bus);
+}
 /* This header fixup will do the resource fixup for all devices as they are
  * probed, but not for bridge ranges
  */
@@ -1577,6 +1599,12 @@ struct device_node *pcibios_get_phb_of_node(struct 
pci_bus *bus)
return of_node_get(hose-dn);
 }
 
+static struct pci_host_bridge_ops *phb_ops = {
+   .phb_set_root_bus_speed = pci_host_bridge_set_root_bus_speed,
+   .phb_probe_mode = pci_host_bridge_probe_mode,
+   .phb_of_scan_bus = pci_host_bridge_of_scan_bus,
+};
+
 /**
  * pci_scan_phb - Given a pci_controller, setup and scan the PCI bus
  * @hose: Pointer to the PCI host controller instance structure
@@ -1584,9 +1612,9 @@ struct device_node *pcibios_get_phb_of_node(struct 
pci_bus *bus)
 void pcibios_scan_phb(struct pci_controller *hose)
 {
LIST_HEAD(resources);
+   struct pci_host_bridge *host;
struct pci_bus *bus;
struct device_node *node = hose-dn;
-   int mode;
 
pr_debug(PCI: Scanning PHB %s\n, of_node_full_name(node));
 
@@ -1602,30 +1630,17 @@ void pcibios_scan_phb(struct pci_controller *hose)
pci_add_resource(resources, hose-busn);
 
/* Create an empty bus for the toplevel */
-   bus = pci_create_root_bus(hose-parent, 
+   host = pci_scan_root_bridge(hose-parent,
PCI_DOMBUS(hose-global_number, hose-first_busno),
-   hose-ops, hose, resources);
-   if (bus == NULL) {
-   pr_err(Failed to create bus for PCI domain %04x\n,
+   hose-ops, hose, resources, phb_ops);
+   if (host == NULL) {
+   pr_err(Failed to create host bridge for PCI domain %04x\n,
hose-global_number);
pci_free_resource_list(resources);
return;
}
-   hose-bus = bus;
-
-   /* Get probe mode and perform scan */
-   mode = PCI_PROBE_NORMAL;
-   if (node  ppc_md.pci_probe_mode)
-   mode = ppc_md.pci_probe_mode(bus);
-   pr_debug(probe mode: %d\n, mode);
-   if (mode == PCI_PROBE_DEVTREE)
-   of_scan_bus(node, bus);
-
-   if (mode == PCI_PROBE_NORMAL) {
-   pci_bus_update_busn_res_end(bus, 255);
-   hose-last_busno = pci_scan_child_bus(bus);
-   pci_bus_update_busn_res_end(bus, hose-last_busno);
-   }
+   hose-bus = host-bus;
+   hose-last_busno = host-bus-busn_res.end;
 
/* Platform gets a chance to do some global fixups before
 * we proceed to resource allocation
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 17/28] PCI: Remove weak pcibios_root_bridge_prepare()

2015-01-15 Thread Yijing Wang
Now no one use weak pcibios_root_bridge_prepare(),
we could remove it.

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 drivers/pci/probe.c |   15 ---
 include/linux/pci.h |2 --
 2 files changed, 0 insertions(+), 17 deletions(-)

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 51d69c3..30323ac 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1844,18 +1844,6 @@ unsigned int pci_scan_child_bus(struct pci_bus *bus)
 }
 EXPORT_SYMBOL_GPL(pci_scan_child_bus);
 
-/**
- * pcibios_root_bridge_prepare - Platform-specific host bridge setup.
- * @bridge: Host bridge to set up.
- *
- * Default empty implementation.  Replace with an architecture-specific setup
- * routine, if necessary.
- */
-int __weak pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
-{
-   return 0;
-}
-
 void __weak pcibios_add_bus(struct pci_bus *bus)
 {
 }
@@ -1890,9 +1878,6 @@ static struct pci_bus *__pci_create_root_bus(
b-bridge = get_device(bridge-dev);
if (bridge-ops  bridge-ops-phb_set_root_bus_speed)
bridge-ops-phb_set_root_bus_speed(bridge);
-   error = pcibios_root_bridge_prepare(bridge);
-   if (error)
-   goto err_out;
 
device_enable_async_suspend(b-bridge);
pci_set_bus_of_node(b);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 5592737..da3a071 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -428,8 +428,6 @@ struct pci_host_bridge {
 void pci_set_host_bridge_release(struct pci_host_bridge *bridge,
 void (*release_fn)(struct pci_host_bridge *),
 void *release_data);
-
-int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge);
 struct pci_host_bridge *pci_create_host_bridge(
struct device *parent, u32 dombus, struct list_head *resources, 
void *sysdata, struct pci_host_bridge_ops *ops);
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 10/28] PCI: Save sysdata in pci_host_bridge drvdata

2015-01-15 Thread Yijing Wang
Save platform specific sysdata in pci_host_bridge
drvdata, host bridge specific operation need to
access it before the pci bus creation.

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 drivers/pci/host-bridge.c |4 +++-
 drivers/pci/probe.c   |   18 --
 include/linux/pci.h   |3 ++-
 3 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
index c9ee582..0b6ba5c 100644
--- a/drivers/pci/host-bridge.c
+++ b/drivers/pci/host-bridge.c
@@ -23,7 +23,8 @@ static void pci_release_host_bridge_dev(struct device *dev)
 }
 
 struct pci_host_bridge *pci_create_host_bridge(
-   struct device *parent, u32 db, struct list_head *resources)
+   struct device *parent, u32 db,
+   struct list_head *resources, void *sysdata)
 {
int error;
int bus = PCI_BUSNUM(db);
@@ -58,6 +59,7 @@ struct pci_host_bridge *pci_create_host_bridge(
host-dev.parent = parent;
INIT_LIST_HEAD(host-windows);
host-dev.release = pci_release_host_bridge_dev;
+   dev_set_drvdata(host-dev, sysdata);
dev_set_name(host-dev, pci%04x:%02x, host-domain, 
host-busnum);
 
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 2e0b952..98a8d97 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1865,8 +1865,7 @@ void __weak pcibios_remove_bus(struct pci_bus *bus)
 }
 
 static struct pci_bus *__pci_create_root_bus(
-   struct pci_host_bridge *bridge, struct pci_ops *ops,
-   void *sysdata)
+   struct pci_host_bridge *bridge, struct pci_ops *ops)
 {
int error;
struct pci_bus *b;
@@ -1882,7 +1881,7 @@ static struct pci_bus *__pci_create_root_bus(
if (!b)
return NULL;
 
-   b-sysdata = sysdata;
+   b-sysdata = dev_get_drvdata(bridge-dev);
b-ops = ops;
b-number = b-busn_res.start = bridge-busnum;
pci_bus_assign_domain_nr(b, parent);
@@ -1954,11 +1953,11 @@ struct pci_bus *pci_create_root_bus(struct device 
*parent, u32 db,
 {
struct pci_host_bridge *host;
 
-   host = pci_create_host_bridge(parent, db, resources);
+   host = pci_create_host_bridge(parent, db, resources, sysdata);
if (!host)
return NULL;

-   return __pci_create_root_bus(host, ops, sysdata);
+   return __pci_create_root_bus(host, ops);
 }
 
 int pci_bus_insert_busn_res(struct pci_bus *b, int bus, int bus_max)
@@ -2025,8 +2024,7 @@ void pci_bus_release_busn_res(struct pci_bus *b)
 }
 
 static struct pci_bus *__pci_scan_root_bus(
-   struct pci_host_bridge *host, struct pci_ops *ops,
-   void *sysdata)
+   struct pci_host_bridge *host, struct pci_ops *ops)
 {
 
struct pci_host_bridge_window *window;
@@ -2040,7 +2038,7 @@ static struct pci_bus *__pci_scan_root_bus(
break;
}
 
-   b = __pci_create_root_bus(host, ops, sysdata);
+   b = __pci_create_root_bus(host, ops);
if (!b) {
pci_free_host_bridge(host);
return NULL;
@@ -2066,11 +2064,11 @@ struct pci_bus *pci_scan_root_bus(struct device 
*parent, u32 db,
 {
struct pci_host_bridge *host;
 
-   host = pci_create_host_bridge(parent, db, resources);
+   host = pci_create_host_bridge(parent, db, resources, sysdata);
if (!host)
return NULL;
 
-   return __pci_scan_root_bus(host, ops, sysdata);
+   return __pci_scan_root_bus(host, ops);
 }
 EXPORT_SYMBOL(pci_scan_root_bus);
 
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 5ee0033..3ee8436 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -419,7 +419,8 @@ void pci_set_host_bridge_release(struct pci_host_bridge 
*bridge,
 
 int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge);
 struct pci_host_bridge *pci_create_host_bridge(
-   struct device *parent, u32 dombus, struct list_head *resources);
+   struct device *parent, u32 dombus,
+   struct list_head *resources, void *sysdata);
 /*
  * The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond
  * to P2P or CardBus bridge windows) go in a table.  Additional ones (for
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 25/28] PCI: Rename __pci_create_root_bus() to pci_create_root_bus()

2015-01-15 Thread Yijing Wang
Now no one use pci_create_root_bus(), we could remove it
and rename __pci_create_root_bus() to pci_create_root_bus().

Signed-off-by: wangyij...@huawei.com
---
 drivers/pci/probe.c |   27 ---
 include/linux/pci.h |3 ---
 2 files changed, 8 insertions(+), 22 deletions(-)

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 30323ac..0817910 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1852,7 +1852,7 @@ void __weak pcibios_remove_bus(struct pci_bus *bus)
 {
 }
 
-static struct pci_bus *__pci_create_root_bus(
+static struct pci_bus *pci_create_root_bus(
struct pci_host_bridge *bridge, struct pci_ops *ops)
 {
int error;
@@ -1935,18 +1935,6 @@ err_out:
return NULL;
 }
 
-struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
-   struct pci_ops *ops, void *sysdata, struct list_head *resources)
-{
-   struct pci_host_bridge *host;
-
-   host = pci_create_host_bridge(parent, db, resources, sysdata, NULL);
-   if (!host)
-   return NULL;
-   
-   return __pci_create_root_bus(host, ops);
-}
-
 int pci_bus_insert_busn_res(struct pci_bus *b, int bus, int bus_max)
 {
struct resource *res = b-busn_res;
@@ -2025,7 +2013,7 @@ static struct pci_bus *__pci_scan_root_bus(
break;
}
 
-   b = __pci_create_root_bus(host, ops);
+   b = pci_create_root_bus(host, ops);
if (!b) {
pci_free_host_bridge(host);
return NULL;
@@ -2091,18 +2079,19 @@ struct pci_bus *pci_scan_bus_legacy(u32 db, struct 
pci_ops *ops,
void *sysdata)
 {
LIST_HEAD(resources);
-   struct pci_bus *b;
+   struct pci_host_bridge *host;
 
pci_add_resource(resources, ioport_resource);
pci_add_resource(resources, iomem_resource);
pci_add_resource(resources, busn_resource);
-   b = pci_create_root_bus(NULL, db, ops, sysdata, resources);
-   if (b) {
-   pci_scan_child_bus(b);
+   host = pci_create_host_bridge(NULL, db, sysdata, resources, NULL);
+   if (host) {
+   __pci_scan_root_bus(host, ops);
+   return host-bus;
} else {
pci_free_resource_list(resources);
}
-   return b;
+   return NULL;
 }
 EXPORT_SYMBOL(pci_scan_bus_legacy);
 
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 2970a84..9ddca3b 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -785,9 +785,6 @@ void pcibios_scan_specific_bus(int busn);
 struct pci_bus *pci_find_bus(int domain, int busnr);
 void pci_bus_add_devices(const struct pci_bus *bus);
 struct pci_bus *pci_scan_bus_legacy(u32 dombus, struct pci_ops *ops, void 
*sysdata);
-struct pci_bus *pci_create_root_bus(struct device *parent, u32 dombus,
-   struct pci_ops *ops, void *sysdata,
-   struct list_head *resources);
 void pci_free_host_bridge(struct pci_host_bridge *host);
 int pci_bus_insert_busn_res(struct pci_bus *b, int bus, int busmax);
 int pci_bus_update_busn_res_end(struct pci_bus *b, int busmax);
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 23/28] PCI/designware: Use pci_scan_root_bus() for simplicity

2015-01-15 Thread Yijing Wang
Use pci_scan_root_bus() instead of pci_create_root_bus() +
pci_scan_child_bus() for simplicity.

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 drivers/pci/host/pcie-designware.c |4 +---
 1 files changed, 1 insertions(+), 3 deletions(-)

diff --git a/drivers/pci/host/pcie-designware.c 
b/drivers/pci/host/pcie-designware.c
index eef3111..d37fe27 100644
--- a/drivers/pci/host/pcie-designware.c
+++ b/drivers/pci/host/pcie-designware.c
@@ -725,13 +725,11 @@ static struct pci_bus *dw_pcie_scan_bus(int nr, struct 
pci_sys_data *sys)
struct pcie_port *pp = sys_to_pcie(sys);
 
pp-root_bus_nr = sys-busnr;
-   bus = pci_create_root_bus(pp-dev, sys-busnr,
+   bus = pci_scan_root_bus(pp-dev, sys-busnr,
  dw_pcie_ops, sys, sys-resources);
if (!bus)
return NULL;
 
-   pci_scan_child_bus(bus);
-
if (bus  pp-ops-scan_bus)
pp-ops-scan_bus(pp);
 
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 03/28] xen/PCI: Don't use deprecated function pci_scan_bus_parented()

2015-01-15 Thread Yijing Wang
From: Arnd Bergmann a...@arndb.de

Use pci_scan_root_bus() instead of deprecated function
pci_scan_bus_parented().

Signed-off-by: Arnd Bergmann a...@arndb.de
Signed-off-by: Yijing Wang wangyij...@huawei.com
CC: Konrad Rzeszutek Wilk konrad.w...@oracle.com
CC: xen-de...@lists.xenproject.org
---
 drivers/pci/xen-pcifront.c |   10 +++---
 1 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c
index b1ffebe..240ddbc 100644
--- a/drivers/pci/xen-pcifront.c
+++ b/drivers/pci/xen-pcifront.c
@@ -446,6 +446,7 @@ static int pcifront_scan_root(struct pcifront_device *pdev,
 unsigned int domain, unsigned int bus)
 {
struct pci_bus *b;
+   LIST_HEAD(resources);
struct pcifront_sd *sd = NULL;
struct pci_bus_entry *bus_entry = NULL;
int err = 0;
@@ -470,17 +471,20 @@ static int pcifront_scan_root(struct pcifront_device 
*pdev,
err = -ENOMEM;
goto err_out;
}
+   pci_add_resource(resources, ioport_resource);
+   pci_add_resource(resources, iomem_resource);
pcifront_init_sd(sd, domain, bus, pdev);
 
pci_lock_rescan_remove();
 
-   b = pci_scan_bus_parented(pdev-xdev-dev, bus,
- pcifront_bus_ops, sd);
+   b = pci_scan_root_bus(pdev-xdev-dev, bus,
+ pcifront_bus_ops, sd, resources);
if (!b) {
dev_err(pdev-xdev-dev,
Error creating PCI Frontend Bus!\n);
err = -ENOMEM;
pci_unlock_rescan_remove();
+   pci_free_resource_list(resources);
goto err_out;
}
 
@@ -488,7 +492,7 @@ static int pcifront_scan_root(struct pcifront_device *pdev,
 
list_add(bus_entry-list, pdev-root_buses);
 
-   /* pci_scan_bus_parented skips devices which do not have a have
+   /* pci_scan_root_bus skips devices which do not have a have
* devfn==0. The pcifront_scan_bus enumerates all devfn. */
err = pcifront_scan_bus(pdev, domain, bus, b);
 
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 24/28] PCI/xgene: Use pci_scan_root_bus() instead of pci_create_root_bus()

2015-01-15 Thread Yijing Wang
Use pci_scan_root_bus() instead of pci_create_root_bus() +
pci_scan_child_bus() for simplicity.

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 drivers/pci/host/pci-xgene.c |3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)

diff --git a/drivers/pci/host/pci-xgene.c b/drivers/pci/host/pci-xgene.c
index b1d0596..7e46a39 100644
--- a/drivers/pci/host/pci-xgene.c
+++ b/drivers/pci/host/pci-xgene.c
@@ -631,12 +631,11 @@ static int xgene_pcie_probe_bridge(struct platform_device 
*pdev)
if (ret)
return ret;
 
-   bus = pci_create_root_bus(pdev-dev, 0,
+   bus = pci_scan_root_bus(pdev-dev, 0,
xgene_pcie_ops, port, res);
if (!bus)
return -ENOMEM;
 
-   pci_scan_child_bus(bus);
pci_assign_unassigned_bus_resources(bus);
pci_bus_add_devices(bus);
 
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 26/28] PCI: Export find_pci_host_bridge()

2015-01-15 Thread Yijing Wang
Export find_pci_host_bridge().

Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 drivers/pci/host-bridge.c |2 +-
 include/linux/pci.h   |1 +
 2 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
index ccbf168..74f7572 100644
--- a/drivers/pci/host-bridge.c
+++ b/drivers/pci/host-bridge.c
@@ -104,7 +104,7 @@ static struct pci_bus *find_pci_root_bus(struct pci_bus 
*bus)
return bus;
 }
 
-static struct pci_host_bridge *find_pci_host_bridge(struct pci_bus *bus)
+struct pci_host_bridge *find_pci_host_bridge(struct pci_bus *bus)
 {
struct pci_bus *root_bus = find_pci_root_bus(bus);
 
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 9ddca3b..3ebee9d 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -431,6 +431,7 @@ void pci_set_host_bridge_release(struct pci_host_bridge 
*bridge,
 struct pci_host_bridge *pci_create_host_bridge(
struct device *parent, u32 dombus, struct list_head *resources, 
void *sysdata, struct pci_host_bridge_ops *ops);
+struct pci_host_bridge *find_pci_host_bridge(struct pci_bus* bus);
 /*
  * The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond
  * to P2P or CardBus bridge windows) go in a table.  Additional ones (for
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 13/28] PCI/x86: Refine pci_acpi_scan_root() with generic pci_host_bridge

2015-01-15 Thread Yijing Wang
Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 arch/x86/pci/acpi.c |   36 
 1 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
index 8edea63..f9a55c2 100644
--- a/arch/x86/pci/acpi.c
+++ b/arch/x86/pci/acpi.c
@@ -467,6 +467,18 @@ static void probe_pci_root_info(struct pci_root_info *info,
info);
 }
 
+static int pci_host_bridge_prepare(struct pci_host_bridge *bridge)
+{
+   struct pci_sysdata *sd = dev_get_drvdata(bridge-dev);
+
+   ACPI_COMPANION_SET(bridge-dev, sd-companion);
+   return 0;
+}
+
+static struct pci_host_bridge_ops phb_ops = {
+   .phb_prepare = pci_host_bridge_prepare,
+};
+
 struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
 {
struct acpi_device *device = root-device;
@@ -475,6 +487,7 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root 
*root)
int busnum = root-secondary.start;
LIST_HEAD(resources);
struct pci_bus *bus;
+   struct pci_host_bridge *host = NULL;
struct pci_sysdata *sd;
int node;
 
@@ -537,14 +550,13 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root 
*root)
 
if (!setup_mcfg_map(info, domain, (u8)root-secondary.start,
(u8)root-secondary.end, 
root-mcfg_addr)) 
-   bus = pci_create_root_bus(NULL, PCI_DOMBUS(domain, 
busnum), 
-   pci_root_ops, sd, resources);
-
-   if (bus) {
-   pci_scan_child_bus(bus);
-   pci_set_host_bridge_release(
-   to_pci_host_bridge(bus-bridge),
-   release_pci_root_info, info);
+   host = pci_scan_root_bridge(NULL, PCI_DOMBUS(domain, 
busnum),
+   pci_root_ops, sd, resources, 
phb_ops);
+
+   if (host) {
+   bus = host-bus;
+   pci_set_host_bridge_release(host, release_pci_root_info,
+   info);
} else {
pci_free_resource_list(resources);
__release_pci_root_info(info);
@@ -566,14 +578,6 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root 
*root)
return bus;
 }
 
-int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
-{
-   struct pci_sysdata *sd = bridge-bus-sysdata;
-
-   ACPI_COMPANION_SET(bridge-dev, sd-companion);
-   return 0;
-}
-
 int __init pci_acpi_init(void)
 {
struct pci_dev *dev = NULL;
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-m68k in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html