wlcore: remove if_ops from platform_data
authorLuciano Coelho <coelho@ti.com>
Fri, 25 Jan 2013 09:57:48 +0000 (11:57 +0200)
committerLuciano Coelho <coelho@ti.com>
Fri, 8 Feb 2013 08:05:02 +0000 (10:05 +0200)
We can't pass pointers from the platform data to the modules, because
with DT it cannot be done.  Those pointers are not set by the board
files anyway.  It's the bus modules that set them, so they can be
safely removed from the platform data without changing any board
files.

Create a new structure that the bus modules pass to wlcore.  This
structure contains the if_ops pointers and a pointer to the actual
platform data.

Signed-off-by: Luciano Coelho <coelho@ti.com>
Reviewed-by: Felipe Balbi <balbi@ti.com>
drivers/net/wireless/ti/wl12xx/main.c
drivers/net/wireless/ti/wlcore/main.c
drivers/net/wireless/ti/wlcore/sdio.c
drivers/net/wireless/ti/wlcore/spi.c
drivers/net/wireless/ti/wlcore/wlcore_i.h
include/linux/wl12xx.h

index 3254bfc81a2a7953f214d2dfd523fdd8ae6ebe8a..09694e39bb147dff54622c16983595029a79e4a0 100644 (file)
@@ -1703,7 +1703,8 @@ static struct ieee80211_sta_ht_cap wl12xx_ht_cap = {
 static int wl12xx_setup(struct wl1271 *wl)
 {
        struct wl12xx_priv *priv = wl->priv;
-       struct wl12xx_platform_data *pdata = wl->pdev->dev.platform_data;
+       struct wlcore_platdev_data *pdev_data = wl->pdev->dev.platform_data;
+       struct wl12xx_platform_data *pdata = pdev_data->pdata;
 
        wl->rtable = wl12xx_rtable;
        wl->num_tx_desc = WL12XX_NUM_TX_DESCRIPTORS;
index 9a66acf1205f01b8b9f4c72d5513d466aa7818f1..cd70335cd5e829d8ef5200cb953603aa1fe9739f 100644 (file)
@@ -5966,7 +5966,8 @@ static void wlcore_nvs_cb(const struct firmware *fw, void *context)
 {
        struct wl1271 *wl = context;
        struct platform_device *pdev = wl->pdev;
-       struct wl12xx_platform_data *pdata = pdev->dev.platform_data;
+       struct wlcore_platdev_data *pdev_data = pdev->dev.platform_data;
+       struct wl12xx_platform_data *pdata = pdev_data->pdata;
        unsigned long irqflags;
        int ret;
 
@@ -5995,7 +5996,7 @@ static void wlcore_nvs_cb(const struct firmware *fw, void *context)
 
        wl->irq = platform_get_irq(pdev, 0);
        wl->platform_quirks = pdata->platform_quirks;
-       wl->if_ops = pdata->ops;
+       wl->if_ops = pdev_data->if_ops;
 
        if (wl->platform_quirks & WL12XX_PLATFORM_QUIRK_EDGE_IRQ)
                irqflags = IRQF_TRIGGER_RISING;
index d4f184e2efedf576168a09012650747977a812c5..1f6f6e30daca3dd898b274d8ec0a88c9f6cf135e 100644 (file)
@@ -218,6 +218,7 @@ static int wl1271_probe(struct sdio_func *func,
                                  const struct sdio_device_id *id)
 {
        struct wl12xx_platform_data *wlan_data;
+       struct wlcore_platdev_data *pdev_data;
        struct wl12xx_sdio_glue *glue;
        struct resource res[1];
        mmc_pm_flag_t mmcflags;
@@ -228,10 +229,18 @@ static int wl1271_probe(struct sdio_func *func,
        if (func->num != 0x02)
                return -ENODEV;
 
+       pdev_data = kzalloc(sizeof(*pdev_data), GFP_KERNEL);
+       if (!pdev_data) {
+               dev_err(&func->dev, "can't allocate platdev_data\n");
+               goto out;
+       }
+
+       pdev_data->if_ops = &sdio_ops;
+
        glue = kzalloc(sizeof(*glue), GFP_KERNEL);
        if (!glue) {
                dev_err(&func->dev, "can't allocate glue\n");
-               goto out;
+               goto out_free_pdev_data;
        }
 
        glue->dev = &func->dev;
@@ -256,8 +265,6 @@ static int wl1271_probe(struct sdio_func *func,
        if (mmcflags & MMC_PM_KEEP_POWER)
                wlan_data->pwr_in_suspend = true;
 
-       wlan_data->ops = &sdio_ops;
-
        sdio_set_drvdata(func, glue);
 
        /* Tell PM core that we don't need the card to be powered now */
@@ -295,8 +302,10 @@ static int wl1271_probe(struct sdio_func *func,
                goto out_dev_put;
        }
 
-       ret = platform_device_add_data(glue->core, wlan_data,
-                                      sizeof(*wlan_data));
+       pdev_data->pdata = wlan_data;
+
+       ret = platform_device_add_data(glue->core, pdev_data,
+                                      sizeof(*pdev_data));
        if (ret) {
                dev_err(glue->dev, "can't add platform data\n");
                goto out_dev_put;
@@ -315,6 +324,9 @@ out_dev_put:
 out_free_glue:
        kfree(glue);
 
+out_free_pdev_data:
+       kfree(pdev_data);
+
 out:
        return ret;
 }
index 2d700b7ae14cab8e8cecbc729463ec8efb997d47..d437f4d28bd0e5f85204891fa39cb7722a7dd84f 100644 (file)
@@ -328,6 +328,7 @@ static int wl1271_probe(struct spi_device *spi)
 {
        struct wl12xx_spi_glue *glue;
        struct wl12xx_platform_data *pdata;
+       struct wlcore_platdev_data *pdev_data;
        struct resource res[1];
        int ret = -ENOMEM;
 
@@ -337,12 +338,18 @@ static int wl1271_probe(struct spi_device *spi)
                return -ENODEV;
        }
 
-       pdata->ops = &spi_ops;
+       pdev_data = kzalloc(sizeof(*pdev_data), GFP_KERNEL);
+       if (!pdev_data) {
+               dev_err(&spi->dev, "can't allocate platdev_data\n");
+               goto out;
+       }
+
+       pdev_data->if_ops = &spi_ops;
 
        glue = kzalloc(sizeof(*glue), GFP_KERNEL);
        if (!glue) {
                dev_err(&spi->dev, "can't allocate glue\n");
-               goto out;
+               goto out_free_pdev_data;
        }
 
        glue->dev = &spi->dev;
@@ -380,7 +387,10 @@ static int wl1271_probe(struct spi_device *spi)
                goto out_dev_put;
        }
 
-       ret = platform_device_add_data(glue->core, pdata, sizeof(*pdata));
+       pdev_data->pdata = pdata;
+
+       ret = platform_device_add_data(glue->core, pdev_data,
+                                      sizeof(*pdev_data));
        if (ret) {
                dev_err(glue->dev, "can't add platform data\n");
                goto out_dev_put;
@@ -399,6 +409,10 @@ out_dev_put:
 
 out_free_glue:
        kfree(glue);
+
+out_free_pdev_data:
+       kfree(pdev_data);
+
 out:
        return ret;
 }
index 20316ac328a28b3af0c231dd882b97decf725709..c845b0ef7f4b4fda208fbd91ba2fe4ba5383939d 100644 (file)
@@ -206,6 +206,11 @@ struct wl1271_if_operations {
        void (*set_block_size) (struct device *child, unsigned int blksz);
 };
 
+struct wlcore_platdev_data {
+       struct wl12xx_platform_data *pdata;
+       struct wl1271_if_operations *if_ops;
+};
+
 #define MAX_NUM_KEYS 14
 #define MAX_KEY_SIZE 32
 
index 0d6373195d32c115a1d0f86b2a8ebe43e9ba7f46..360c9bce665cf4473e51b23ebc3b0ed0853a9592 100644 (file)
@@ -55,8 +55,6 @@ struct wl12xx_platform_data {
        int board_tcxo_clock;
        unsigned long platform_quirks;
        bool pwr_in_suspend;
-
-       struct wl1271_if_operations *ops;
 };
 
 /* Platform does not support level trigger interrupts */