|
@@ -461,6 +461,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
|
|
|
{
|
|
|
int ret = 0;
|
|
|
struct brcmf_sdio_dev *sdiodev;
|
|
|
+ struct brcmf_bus *bus_if;
|
|
|
brcmf_dbg(TRACE, "Enter\n");
|
|
|
brcmf_dbg(TRACE, "func->class=%x\n", func->class);
|
|
|
brcmf_dbg(TRACE, "sdio_vendor: 0x%04x\n", func->vendor);
|
|
@@ -472,12 +473,18 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
|
|
|
brcmf_dbg(ERROR, "card private drvdata occupied\n");
|
|
|
return -ENXIO;
|
|
|
}
|
|
|
+ bus_if = kzalloc(sizeof(struct brcmf_bus), GFP_KERNEL);
|
|
|
+ if (!bus_if)
|
|
|
+ return -ENOMEM;
|
|
|
sdiodev = kzalloc(sizeof(struct brcmf_sdio_dev), GFP_KERNEL);
|
|
|
if (!sdiodev)
|
|
|
return -ENOMEM;
|
|
|
+ sdiodev->dev = &func->card->dev;
|
|
|
sdiodev->func[0] = func->card->sdio_func[0];
|
|
|
sdiodev->func[1] = func;
|
|
|
- dev_set_drvdata(&func->card->dev, sdiodev);
|
|
|
+ bus_if->bus_priv = sdiodev;
|
|
|
+ bus_if->type = SDIO_BUS;
|
|
|
+ dev_set_drvdata(&func->card->dev, bus_if);
|
|
|
|
|
|
atomic_set(&sdiodev->suspend, false);
|
|
|
init_waitqueue_head(&sdiodev->request_byte_wait);
|
|
@@ -487,7 +494,8 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
|
|
|
}
|
|
|
|
|
|
if (func->num == 2) {
|
|
|
- sdiodev = dev_get_drvdata(&func->card->dev);
|
|
|
+ bus_if = dev_get_drvdata(&func->card->dev);
|
|
|
+ sdiodev = bus_if->bus_priv;
|
|
|
if ((!sdiodev) || (sdiodev->func[1]->card != func->card))
|
|
|
return -ENODEV;
|
|
|
sdiodev->func[2] = func;
|
|
@@ -501,6 +509,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
|
|
|
|
|
|
static void brcmf_ops_sdio_remove(struct sdio_func *func)
|
|
|
{
|
|
|
+ struct brcmf_bus *bus_if;
|
|
|
struct brcmf_sdio_dev *sdiodev;
|
|
|
brcmf_dbg(TRACE, "Enter\n");
|
|
|
brcmf_dbg(INFO, "func->class=%x\n", func->class);
|
|
@@ -509,10 +518,12 @@ static void brcmf_ops_sdio_remove(struct sdio_func *func)
|
|
|
brcmf_dbg(INFO, "Function#: 0x%04x\n", func->num);
|
|
|
|
|
|
if (func->num == 2) {
|
|
|
- sdiodev = dev_get_drvdata(&func->card->dev);
|
|
|
+ bus_if = dev_get_drvdata(&func->card->dev);
|
|
|
+ sdiodev = bus_if->bus_priv;
|
|
|
brcmf_dbg(TRACE, "F2 found, calling brcmf_sdio_remove...\n");
|
|
|
brcmf_sdio_remove(sdiodev);
|
|
|
dev_set_drvdata(&func->card->dev, NULL);
|
|
|
+ kfree(bus_if);
|
|
|
kfree(sdiodev);
|
|
|
}
|
|
|
}
|
|
@@ -523,11 +534,12 @@ static int brcmf_sdio_suspend(struct device *dev)
|
|
|
mmc_pm_flag_t sdio_flags;
|
|
|
struct brcmf_sdio_dev *sdiodev;
|
|
|
struct sdio_func *func = dev_to_sdio_func(dev);
|
|
|
+ struct brcmf_bus *bus_if = dev_get_drvdata(&func->card->dev);
|
|
|
int ret = 0;
|
|
|
|
|
|
brcmf_dbg(TRACE, "\n");
|
|
|
|
|
|
- sdiodev = dev_get_drvdata(&func->card->dev);
|
|
|
+ sdiodev = bus_if->bus_priv;
|
|
|
|
|
|
atomic_set(&sdiodev->suspend, true);
|
|
|
|
|
@@ -552,8 +564,9 @@ static int brcmf_sdio_resume(struct device *dev)
|
|
|
{
|
|
|
struct brcmf_sdio_dev *sdiodev;
|
|
|
struct sdio_func *func = dev_to_sdio_func(dev);
|
|
|
+ struct brcmf_bus *bus_if = dev_get_drvdata(&func->card->dev);
|
|
|
|
|
|
- sdiodev = dev_get_drvdata(&func->card->dev);
|
|
|
+ sdiodev = bus_if->bus_priv;
|
|
|
brcmf_sdio_wdtmr_enable(sdiodev, true);
|
|
|
atomic_set(&sdiodev->suspend, false);
|
|
|
return 0;
|