diff --git a/arch/mips/ath79/mach-ubnt-xm.c b/arch/mips/ath79/mach-ubnt-xm.c index 1e6b986cb470..ca47ba57a206 100644 --- a/arch/mips/ath79/mach-ubnt-xm.c +++ b/arch/mips/ath79/mach-ubnt-xm.c @@ -85,16 +85,27 @@ static struct ath9k_platform_data ubnt_xm_eeprom_data; static struct ar724x_pci_data ubnt_xm_pci_data[] = { { .irq = ATH79_PCI_IRQ(0), - .pdata = &ubnt_xm_eeprom_data, }, }; +static int ubnt_xm_pci_plat_dev_init(struct pci_dev *dev) +{ + switch (PCI_SLOT(dev->devfn)) { + case 0: + dev->dev.platform_data = &ubnt_xm_eeprom_data; + break; + } + + return 0; +} + static void __init ubnt_xm_pci_init(void) { memcpy(ubnt_xm_eeprom_data.eeprom_data, UBNT_XM_EEPROM_ADDR, sizeof(ubnt_xm_eeprom_data.eeprom_data)); ar724x_pci_add_data(ubnt_xm_pci_data, ARRAY_SIZE(ubnt_xm_pci_data)); + ath79_pci_set_plat_dev_init(ubnt_xm_pci_plat_dev_init); ath79_register_pci(); } #else diff --git a/arch/mips/ath79/pci.c b/arch/mips/ath79/pci.c index 14f981c295d2..2b4c730ccbcb 100644 --- a/arch/mips/ath79/pci.c +++ b/arch/mips/ath79/pci.c @@ -14,6 +14,7 @@ #include #include "pci.h" +static int (*ath79_pci_plat_dev_init)(struct pci_dev *dev); static struct ar724x_pci_data *pci_data; static int pci_data_size; @@ -38,14 +39,15 @@ int __init pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin) int pcibios_plat_dev_init(struct pci_dev *dev) { - unsigned int devfn = dev->devfn; + if (ath79_pci_plat_dev_init) + return ath79_pci_plat_dev_init(dev); - if (devfn > pci_data_size - 1) - return PCIBIOS_DEVICE_NOT_FOUND; + return 0; +} - dev->dev.platform_data = pci_data[devfn].pdata; - - return PCIBIOS_SUCCESSFUL; +void __init ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *dev)) +{ + ath79_pci_plat_dev_init = func; } int __init ath79_register_pci(void) diff --git a/arch/mips/ath79/pci.h b/arch/mips/ath79/pci.h index e0601c4a7fc6..de30e158932d 100644 --- a/arch/mips/ath79/pci.h +++ b/arch/mips/ath79/pci.h @@ -13,14 +13,16 @@ struct ar724x_pci_data { int irq; - void *pdata; }; void ar724x_pci_add_data(struct ar724x_pci_data *data, int size); #ifdef CONFIG_PCI +void ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *dev)); int ath79_register_pci(void); #else +static inline void +ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *)) {} static inline int ath79_register_pci(void) { return 0; } #endif