|
@@ -7,7 +7,9 @@
|
|
|
|
|
|
#include "bcma_private.h"
|
|
|
#include <linux/module.h>
|
|
|
+#include <linux/mmc/sdio_func.h>
|
|
|
#include <linux/platform_device.h>
|
|
|
+#include <linux/pci.h>
|
|
|
#include <linux/bcma/bcma.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/of_address.h>
|
|
@@ -269,6 +271,28 @@ void bcma_prepare_core(struct bcma_bus *bus, struct bcma_device *core)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+struct device *bcma_bus_get_host_dev(struct bcma_bus *bus)
|
|
|
+{
|
|
|
+ switch (bus->hosttype) {
|
|
|
+ case BCMA_HOSTTYPE_PCI:
|
|
|
+ if (bus->host_pci)
|
|
|
+ return &bus->host_pci->dev;
|
|
|
+ else
|
|
|
+ return NULL;
|
|
|
+ case BCMA_HOSTTYPE_SOC:
|
|
|
+ if (bus->host_pdev)
|
|
|
+ return &bus->host_pdev->dev;
|
|
|
+ else
|
|
|
+ return NULL;
|
|
|
+ case BCMA_HOSTTYPE_SDIO:
|
|
|
+ if (bus->host_sdio)
|
|
|
+ return &bus->host_sdio->dev;
|
|
|
+ else
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
void bcma_init_bus(struct bcma_bus *bus)
|
|
|
{
|
|
|
mutex_lock(&bcma_buses_mutex);
|
|
@@ -388,6 +412,7 @@ int bcma_bus_register(struct bcma_bus *bus)
|
|
|
{
|
|
|
int err;
|
|
|
struct bcma_device *core;
|
|
|
+ struct device *dev;
|
|
|
|
|
|
/* Scan for devices (cores) */
|
|
|
err = bcma_bus_scan(bus);
|
|
@@ -410,13 +435,12 @@ int bcma_bus_register(struct bcma_bus *bus)
|
|
|
bcma_core_pci_early_init(&bus->drv_pci[0]);
|
|
|
}
|
|
|
|
|
|
+ dev = bcma_bus_get_host_dev(bus);
|
|
|
/* TODO: remove check for IS_BUILTIN(CONFIG_BCMA) check when
|
|
|
* of_default_bus_match_table is exported or in some other way
|
|
|
* accessible. This is just a temporary workaround.
|
|
|
*/
|
|
|
- if (IS_BUILTIN(CONFIG_BCMA) && bus->host_pdev) {
|
|
|
- struct device *dev = &bus->host_pdev->dev;
|
|
|
-
|
|
|
+ if (IS_BUILTIN(CONFIG_BCMA) && dev) {
|
|
|
of_platform_populate(dev->of_node, of_default_bus_match_table,
|
|
|
NULL, dev);
|
|
|
}
|