bcma: fix access to host_pdev for PCIe devices
bus->host_pdev is part of a union so bus->host_pdev != NULL is probably
also true for PCIe devices, because there it accesses bus->host_pci. If
we access the dev member at the offset defined in struct
platform_device in struct pci_dev instead we probably get something
else.
This patch adds a new function which returns the host dev struct and
NULL if we do not have a host dev. When this gets registered on MIPS
brcm47xx we do not have a host dev in some situations.
This function could also be used in other places.
This problem was introduced in this commit:
commit cae761b5a6
Author: Rafa? Mi?ecki <zajec5@gmail.com>
Date: Sun Jun 28 17:17:13 2015 +0200
bcma: populate bus DT subnodes as platform_device-s
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
78623bfb6f
commit
53cd2fdb00
2 changed files with 28 additions and 3 deletions
|
@ -34,6 +34,7 @@ int __init bcma_bus_early_register(struct bcma_bus *bus);
|
||||||
int bcma_bus_suspend(struct bcma_bus *bus);
|
int bcma_bus_suspend(struct bcma_bus *bus);
|
||||||
int bcma_bus_resume(struct bcma_bus *bus);
|
int bcma_bus_resume(struct bcma_bus *bus);
|
||||||
#endif
|
#endif
|
||||||
|
struct device *bcma_bus_get_host_dev(struct bcma_bus *bus);
|
||||||
|
|
||||||
/* scan.c */
|
/* scan.c */
|
||||||
void bcma_detect_chip(struct bcma_bus *bus);
|
void bcma_detect_chip(struct bcma_bus *bus);
|
||||||
|
|
|
@ -7,7 +7,9 @@
|
||||||
|
|
||||||
#include "bcma_private.h"
|
#include "bcma_private.h"
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/mmc/sdio_func.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/pci.h>
|
||||||
#include <linux/bcma/bcma.h>
|
#include <linux/bcma/bcma.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/of_address.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)
|
void bcma_init_bus(struct bcma_bus *bus)
|
||||||
{
|
{
|
||||||
mutex_lock(&bcma_buses_mutex);
|
mutex_lock(&bcma_buses_mutex);
|
||||||
|
@ -388,6 +412,7 @@ int bcma_bus_register(struct bcma_bus *bus)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
struct bcma_device *core;
|
struct bcma_device *core;
|
||||||
|
struct device *dev;
|
||||||
|
|
||||||
/* Scan for devices (cores) */
|
/* Scan for devices (cores) */
|
||||||
err = bcma_bus_scan(bus);
|
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]);
|
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
|
/* TODO: remove check for IS_BUILTIN(CONFIG_BCMA) check when
|
||||||
* of_default_bus_match_table is exported or in some other way
|
* of_default_bus_match_table is exported or in some other way
|
||||||
* accessible. This is just a temporary workaround.
|
* accessible. This is just a temporary workaround.
|
||||||
*/
|
*/
|
||||||
if (IS_BUILTIN(CONFIG_BCMA) && bus->host_pdev) {
|
if (IS_BUILTIN(CONFIG_BCMA) && dev) {
|
||||||
struct device *dev = &bus->host_pdev->dev;
|
|
||||||
|
|
||||||
of_platform_populate(dev->of_node, of_default_bus_match_table,
|
of_platform_populate(dev->of_node, of_default_bus_match_table,
|
||||||
NULL, dev);
|
NULL, dev);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue