mmc: sdhci: Add size for caller in init+register
authorChristian Daudt <csd@broadcom.com>
Wed, 29 May 2013 20:50:05 +0000 (13:50 -0700)
committerChris Ball <cjb@laptop.org>
Fri, 31 May 2013 15:59:29 +0000 (11:59 -0400)
Add a param to allow users of sdhci_pltfm to allocate private space
in calls to sdhci_pltfm_init+sdhci_pltfm_register. This is implemented
in the same way as sdhci does for its users.
 None of the users have been migrated yet and are passing in zero to
retain their private allocation.

- todo: migrate clients to using allocation this way
- todo: remove priv variable once migration is complete

Also removed unused variable in sdhci_pltfm_init fn

Signed-off-by: Christian Daudt <csd@broadcom.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/host/sdhci-bcm2835.c
drivers/mmc/host/sdhci-cns3xxx.c
drivers/mmc/host/sdhci-dove.c
drivers/mmc/host/sdhci-esdhc-imx.c
drivers/mmc/host/sdhci-of-esdhc.c
drivers/mmc/host/sdhci-of-hlwd.c
drivers/mmc/host/sdhci-pltfm.c
drivers/mmc/host/sdhci-pltfm.h
drivers/mmc/host/sdhci-pxav2.c
drivers/mmc/host/sdhci-pxav3.c
drivers/mmc/host/sdhci-tegra.c

index d49bc958c8ba07f6574c7a477de62d6581fd526e..0584a1c788b8f93326a79ec5f332ef6958f2f52e 100644 (file)
@@ -148,7 +148,7 @@ static int bcm2835_sdhci_probe(struct platform_device *pdev)
        struct sdhci_pltfm_host *pltfm_host;
        int ret;
 
-       host = sdhci_pltfm_init(pdev, &bcm2835_sdhci_pdata);
+       host = sdhci_pltfm_init(pdev, &bcm2835_sdhci_pdata, 0);
        if (IS_ERR(host))
                return PTR_ERR(host);
 
index 8ebb6b650f3f8fe8eee06033dba8c29b23abd8c8..f2cc26633cb2442bc67e1d46bb52ab044be02598 100644 (file)
@@ -96,7 +96,7 @@ static const struct sdhci_pltfm_data sdhci_cns3xxx_pdata = {
 
 static int sdhci_cns3xxx_probe(struct platform_device *pdev)
 {
-       return sdhci_pltfm_register(pdev, &sdhci_cns3xxx_pdata);
+       return sdhci_pltfm_register(pdev, &sdhci_cns3xxx_pdata, 0);
 }
 
 static int sdhci_cns3xxx_remove(struct platform_device *pdev)
index 15e7803040f1ef48374afd974ff06210e8b47209..8424839660f844b748f7960a46a5e9cf5df88e56 100644 (file)
@@ -130,7 +130,7 @@ static int sdhci_dove_probe(struct platform_device *pdev)
                gpio_direction_input(priv->gpio_cd);
        }
 
-       host = sdhci_pltfm_init(pdev, &sdhci_dove_pdata);
+       host = sdhci_pltfm_init(pdev, &sdhci_dove_pdata, 0);
        if (IS_ERR(host)) {
                ret = PTR_ERR(host);
                goto err_sdhci_pltfm_init;
index d5f0d59e13104957b7539f28ec743b5713f6bb2e..98f46704baa64df2bfb73db6dfcb6870b813baab 100644 (file)
@@ -503,7 +503,7 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev)
        int err;
        struct pltfm_imx_data *imx_data;
 
-       host = sdhci_pltfm_init(pdev, &sdhci_esdhc_imx_pdata);
+       host = sdhci_pltfm_init(pdev, &sdhci_esdhc_imx_pdata, 0);
        if (IS_ERR(host))
                return PTR_ERR(host);
 
index 5e68adc2461e3d43e03a0634c3a2b0c1b2fd482a..37e668f5b9922e8a3f288f62c9ac5e0bad590a2a 100644 (file)
@@ -262,7 +262,7 @@ static const struct sdhci_pltfm_data sdhci_esdhc_pdata = {
 
 static int sdhci_esdhc_probe(struct platform_device *pdev)
 {
-       return sdhci_pltfm_register(pdev, &sdhci_esdhc_pdata);
+       return sdhci_pltfm_register(pdev, &sdhci_esdhc_pdata, 0);
 }
 
 static int sdhci_esdhc_remove(struct platform_device *pdev)
index 200a6a9fa805d35d8731fcdd5740c6557acaa781..57c514a81ca558777474c699a2cac27fcc265ec9 100644 (file)
@@ -68,7 +68,7 @@ static const struct sdhci_pltfm_data sdhci_hlwd_pdata = {
 
 static int sdhci_hlwd_probe(struct platform_device *pdev)
 {
-       return sdhci_pltfm_register(pdev, &sdhci_hlwd_pdata);
+       return sdhci_pltfm_register(pdev, &sdhci_hlwd_pdata, 0);
 }
 
 static int sdhci_hlwd_remove(struct platform_device *pdev)
index e7762e5e90486b0f790c955d0bcdd1e664b8c87b..e2065a44dffcbe42da8c156534a7f2f7151fe2cd 100644 (file)
@@ -115,10 +115,10 @@ void sdhci_get_of_property(struct platform_device *pdev) {}
 EXPORT_SYMBOL_GPL(sdhci_get_of_property);
 
 struct sdhci_host *sdhci_pltfm_init(struct platform_device *pdev,
-                                   const struct sdhci_pltfm_data *pdata)
+                                   const struct sdhci_pltfm_data *pdata,
+                                   size_t priv_size)
 {
        struct sdhci_host *host;
-       struct sdhci_pltfm_host *pltfm_host;
        struct device_node *np = pdev->dev.of_node;
        struct resource *iomem;
        int ret;
@@ -134,17 +134,17 @@ struct sdhci_host *sdhci_pltfm_init(struct platform_device *pdev,
 
        /* Some PCI-based MFD need the parent here */
        if (pdev->dev.parent != &platform_bus && !np)
-               host = sdhci_alloc_host(pdev->dev.parent, sizeof(*pltfm_host));
+               host = sdhci_alloc_host(pdev->dev.parent,
+                       sizeof(struct sdhci_pltfm_host) + priv_size);
        else
-               host = sdhci_alloc_host(&pdev->dev, sizeof(*pltfm_host));
+               host = sdhci_alloc_host(&pdev->dev,
+                       sizeof(struct sdhci_pltfm_host) + priv_size);
 
        if (IS_ERR(host)) {
                ret = PTR_ERR(host);
                goto err;
        }
 
-       pltfm_host = sdhci_priv(host);
-
        host->hw_name = dev_name(&pdev->dev);
        if (pdata && pdata->ops)
                host->ops = pdata->ops;
@@ -204,12 +204,13 @@ void sdhci_pltfm_free(struct platform_device *pdev)
 EXPORT_SYMBOL_GPL(sdhci_pltfm_free);
 
 int sdhci_pltfm_register(struct platform_device *pdev,
-                        const struct sdhci_pltfm_data *pdata)
+                       const struct sdhci_pltfm_data *pdata,
+                       size_t priv_size)
 {
        struct sdhci_host *host;
        int ret = 0;
 
-       host = sdhci_pltfm_init(pdev, pdata);
+       host = sdhci_pltfm_init(pdev, pdata, priv_size);
        if (IS_ERR(host))
                return PTR_ERR(host);
 
index 83d42c60a06f62b258e5511caa668377b3adad1e..e15ced79f7ede521c49bc0c068a78a81324e6ada 100644 (file)
@@ -28,6 +28,8 @@ struct sdhci_pltfm_host {
        /* migrate from sdhci_of_host */
        unsigned int clock;
        u16 xfer_mode_shadow;
+
+       unsigned long private[0] ____cacheline_aligned;
 };
 
 #ifdef CONFIG_MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER
@@ -92,15 +94,22 @@ static inline void sdhci_be32bs_writeb(struct sdhci_host *host, u8 val, int reg)
 extern void sdhci_get_of_property(struct platform_device *pdev);
 
 extern struct sdhci_host *sdhci_pltfm_init(struct platform_device *pdev,
-                                         const struct sdhci_pltfm_data *pdata);
+                                         const struct sdhci_pltfm_data *pdata,
+                                         size_t priv_size);
 extern void sdhci_pltfm_free(struct platform_device *pdev);
 
 extern int sdhci_pltfm_register(struct platform_device *pdev,
-                               const struct sdhci_pltfm_data *pdata);
+                               const struct sdhci_pltfm_data *pdata,
+                               size_t priv_size);
 extern int sdhci_pltfm_unregister(struct platform_device *pdev);
 
 extern unsigned int sdhci_pltfm_clk_get_max_clock(struct sdhci_host *host);
 
+static inline void *sdhci_pltfm_priv(struct sdhci_pltfm_host *host)
+{
+       return (void *)host->private;
+}
+
 #ifdef CONFIG_PM
 extern const struct dev_pm_ops sdhci_pltfm_pmops;
 #define SDHCI_PLTFM_PMOPS (&sdhci_pltfm_pmops)
index 98b5145cef7c80a94e9896481185872c86efac48..d51e061ec576a666cb2fa19edf77725ef0905cdf 100644 (file)
@@ -175,7 +175,7 @@ static int sdhci_pxav2_probe(struct platform_device *pdev)
        if (!pxa)
                return -ENOMEM;
 
-       host = sdhci_pltfm_init(pdev, NULL);
+       host = sdhci_pltfm_init(pdev, NULL, 0);
        if (IS_ERR(host)) {
                kfree(pxa);
                return PTR_ERR(host);
index 90ee262def69dc4fd73140e8d2f9ef3ddf984e9a..56d9bee93d8ff4310abf19458159fa99cbd6f5f7 100644 (file)
@@ -230,7 +230,7 @@ static int sdhci_pxav3_probe(struct platform_device *pdev)
        if (!pxa)
                return -ENOMEM;
 
-       host = sdhci_pltfm_init(pdev, &sdhci_pxav3_pdata);
+       host = sdhci_pltfm_init(pdev, &sdhci_pxav3_pdata, 0);
        if (IS_ERR(host)) {
                kfree(pxa);
                return PTR_ERR(host);
index e0dba74cff983234895f5c43ae65881268d91d30..c8b058283a06fd43f64a09da6f5b0835318db264 100644 (file)
@@ -231,7 +231,7 @@ static int sdhci_tegra_probe(struct platform_device *pdev)
                return -EINVAL;
        soc_data = match->data;
 
-       host = sdhci_pltfm_init(pdev, soc_data->pdata);
+       host = sdhci_pltfm_init(pdev, soc_data->pdata, 0);
        if (IS_ERR(host))
                return PTR_ERR(host);
        pltfm_host = sdhci_priv(host);