mmc: sh_mobile_sdhi: add a callback for board specific init code
authorBastian Hecht <hechtb@googlemail.com>
Fri, 16 Mar 2012 16:19:29 +0000 (12:19 -0400)
committerChris Ball <cjb@laptop.org>
Tue, 27 Mar 2012 16:20:19 +0000 (12:20 -0400)
Some boards need a preliminary setup stage to prepare the sdhi
controller.

Signed-off-by: Bastian Hecht <hechtb@gmail.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/host/sh_mobile_sdhi.c
include/linux/mmc/sh_mobile_sdhi.h

index f91c3aa40d1dca7b80e6b41cf422d9c68dd2d685..07ff3fee77b35c3a81fc0efd325afb448299eed1 100644 (file)
@@ -109,6 +109,12 @@ static int __devinit sh_mobile_sdhi_probe(struct platform_device *pdev)
        mmc_data = &priv->mmc_data;
        p->pdata = mmc_data;
 
+       if (p->init) {
+               ret = p->init(pdev);
+               if (ret)
+                       goto einit;
+       }
+
        snprintf(clk_name, sizeof(clk_name), "sdhi%d", pdev->id);
        priv->clk = clk_get(&pdev->dev, clk_name);
        if (IS_ERR(priv->clk)) {
@@ -233,6 +239,9 @@ eirq_card_detect:
 eprobe:
        clk_put(priv->clk);
 eclkget:
+       if (p->cleanup)
+               p->cleanup(pdev);
+einit:
        kfree(priv);
        return ret;
 }
@@ -257,6 +266,10 @@ static int sh_mobile_sdhi_remove(struct platform_device *pdev)
        }
 
        clk_put(priv->clk);
+
+       if (p->cleanup)
+               p->cleanup(pdev);
+
        kfree(priv);
 
        return 0;
index 082a736a9bfb3e7e31ed018e6036c4e033af9359..686b85bfb7a5d508d15c6c2828a31313dbe198ad 100644 (file)
@@ -20,6 +20,10 @@ struct sh_mobile_sdhi_info {
        struct tmio_mmc_data *pdata;
        void (*set_pwr)(struct platform_device *pdev, int state);
        int (*get_cd)(struct platform_device *pdev);
+
+       /* callbacks for board specific setup code */
+       int (*init)(struct platform_device *pdev);
+       void (*cleanup)(struct platform_device *pdev);
 };
 
 #endif /* LINUX_MMC_SH_MOBILE_SDHI_H */