Commit a39cf72c authored by Kyle McMartin's avatar Kyle McMartin

[PARISC] Make superio.c initialize before any driver needs it

Convert superio_init to use PCI_FIXUP_FINAL as ohci_pci being called
before superio_probe really makes a mess. superio_init will then fail
to register irq 20 (the "SuperIO" irq) and BUG() because ohci_pci has
stolen it before superio_fixup_irq can be moved USB to irq 1.
Signed-off-by: default avatarKyle McMartin <kyle@parisc-linux.org>
parent 29a622dd
...@@ -24,6 +24,9 @@ ...@@ -24,6 +24,9 @@
* Major changes to get basic interrupt infrastructure working to * Major changes to get basic interrupt infrastructure working to
* hopefully be able to support all SuperIO devices. Currently * hopefully be able to support all SuperIO devices. Currently
* works with serial. -- John Marvin <jsm@fc.hp.com> * works with serial. -- John Marvin <jsm@fc.hp.com>
*
* Converted superio_init() to be a PCI_FIXUP_FINAL callee.
* -- Kyle McMartin <kyle@parisc-linux.org>
*/ */
...@@ -141,10 +144,10 @@ superio_interrupt(int parent_irq, void *devp, struct pt_regs *regs) ...@@ -141,10 +144,10 @@ superio_interrupt(int parent_irq, void *devp, struct pt_regs *regs)
} }
/* Initialize Super I/O device */ /* Initialize Super I/O device */
static void
static void __devinit superio_init(struct pci_dev *pcidev)
superio_init(struct superio_device *sio)
{ {
struct superio_device *sio = &sio_dev;
struct pci_dev *pdev = sio->lio_pdev; struct pci_dev *pdev = sio->lio_pdev;
u16 word; u16 word;
...@@ -160,8 +163,8 @@ superio_init(struct superio_device *sio) ...@@ -160,8 +163,8 @@ superio_init(struct superio_device *sio)
/* ...then properly fixup the USB to point at suckyio PIC */ /* ...then properly fixup the USB to point at suckyio PIC */
sio->usb_pdev->irq = superio_fixup_irq(sio->usb_pdev); sio->usb_pdev->irq = superio_fixup_irq(sio->usb_pdev);
printk (KERN_INFO "SuperIO: Found NS87560 Legacy I/O device at %s (IRQ %i) \n", printk(KERN_INFO "SuperIO: Found NS87560 Legacy I/O device at %s (IRQ %i) \n",
pci_name(pdev),pdev->irq); pci_name(pdev), pdev->irq);
pci_read_config_dword (pdev, SIO_SP1BAR, &sio->sp1_base); pci_read_config_dword (pdev, SIO_SP1BAR, &sio->sp1_base);
sio->sp1_base &= ~1; sio->sp1_base &= ~1;
...@@ -274,7 +277,7 @@ superio_init(struct superio_device *sio) ...@@ -274,7 +277,7 @@ superio_init(struct superio_device *sio)
sio->suckyio_irq_enabled = 1; sio->suckyio_irq_enabled = 1;
} }
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_LIO, superio_init);
static void superio_disable_irq(unsigned int irq) static void superio_disable_irq(unsigned int irq)
{ {
...@@ -452,8 +455,10 @@ static void superio_fixup_pci(struct pci_dev *pdev) ...@@ -452,8 +455,10 @@ static void superio_fixup_pci(struct pci_dev *pdev)
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87415, superio_fixup_pci); DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87415, superio_fixup_pci);
static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_id *id) static int __devinit
superio_probe(struct pci_dev *dev, const struct pci_device_id *id)
{ {
struct superio_device *sio = &sio_dev;
/* /*
** superio_probe(00:0e.0) ven 0x100b dev 0x2 sv 0x0 sd 0x0 class 0x1018a ** superio_probe(00:0e.0) ven 0x100b dev 0x2 sv 0x0 sd 0x0 class 0x1018a
...@@ -466,7 +471,8 @@ static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_ ...@@ -466,7 +471,8 @@ static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_
dev->subsystem_vendor, dev->subsystem_device, dev->subsystem_vendor, dev->subsystem_device,
dev->class); dev->class);
superio_init(&sio_dev); if (!sio->suckyio_irq_enabled)
BUG(); /* Enabled by PCI_FIXUP_FINAL */
if (dev->device == PCI_DEVICE_ID_NS_87560_LIO) { /* Function 1 */ if (dev->device == PCI_DEVICE_ID_NS_87560_LIO) { /* Function 1 */
superio_parport_init(); superio_parport_init();
...@@ -481,19 +487,21 @@ static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_ ...@@ -481,19 +487,21 @@ static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_
DBG_INIT("superio_probe: WTF? Fire Extinguisher?\n"); DBG_INIT("superio_probe: WTF? Fire Extinguisher?\n");
} }
/* Let appropriate other driver claim this device. */ /* Let appropriate other driver claim this device. */
return -ENODEV; return -ENODEV;
} }
static struct pci_device_id superio_tbl[] = { static struct pci_device_id superio_tbl[] = {
{ PCI_VENDOR_ID_NS, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_LIO) },
{ PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_USB) },
{ PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87415) },
{ 0, } { 0, }
}; };
static struct pci_driver superio_driver = { static struct pci_driver superio_driver = {
.name = "SuperIO", .name = "SuperIO",
.id_table = superio_tbl, .id_table = superio_tbl,
.probe = superio_probe, .probe = superio_probe,
}; };
static int __init superio_modinit(void) static int __init superio_modinit(void)
...@@ -506,6 +514,5 @@ static void __exit superio_exit(void) ...@@ -506,6 +514,5 @@ static void __exit superio_exit(void)
pci_unregister_driver(&superio_driver); pci_unregister_driver(&superio_driver);
} }
module_init(superio_modinit); module_init(superio_modinit);
module_exit(superio_exit); module_exit(superio_exit);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment