|
@@ -54,6 +54,7 @@
|
|
|
#include <linux/mmc/mmc.h>
|
|
|
#include <linux/mmc/sdio.h>
|
|
|
#include <linux/mmc/sh_mmcif.h>
|
|
|
+#include <linux/mod_devicetable.h>
|
|
|
#include <linux/pagemap.h>
|
|
|
#include <linux/platform_device.h>
|
|
|
#include <linux/pm_qos.h>
|
|
@@ -384,6 +385,9 @@ static void sh_mmcif_request_dma(struct sh_mmcif_host *host,
|
|
|
struct sh_dmae_slave *tx, *rx;
|
|
|
host->dma_active = false;
|
|
|
|
|
|
+ if (!pdata)
|
|
|
+ return;
|
|
|
+
|
|
|
/* We can only either use DMA for both Tx and Rx or not use it at all */
|
|
|
if (pdata->dma) {
|
|
|
dev_warn(&host->pd->dev,
|
|
@@ -444,13 +448,14 @@ static void sh_mmcif_release_dma(struct sh_mmcif_host *host)
|
|
|
static void sh_mmcif_clock_control(struct sh_mmcif_host *host, unsigned int clk)
|
|
|
{
|
|
|
struct sh_mmcif_plat_data *p = host->pd->dev.platform_data;
|
|
|
+ bool sup_pclk = p ? p->sup_pclk : false;
|
|
|
|
|
|
sh_mmcif_bitclr(host, MMCIF_CE_CLK_CTRL, CLK_ENABLE);
|
|
|
sh_mmcif_bitclr(host, MMCIF_CE_CLK_CTRL, CLK_CLEAR);
|
|
|
|
|
|
if (!clk)
|
|
|
return;
|
|
|
- if (p->sup_pclk && clk == host->clk)
|
|
|
+ if (sup_pclk && clk == host->clk)
|
|
|
sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_SUP_PCLK);
|
|
|
else
|
|
|
sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_CLEAR &
|
|
@@ -928,7 +933,7 @@ static void sh_mmcif_set_power(struct sh_mmcif_host *host, struct mmc_ios *ios)
|
|
|
struct sh_mmcif_plat_data *pd = host->pd->dev.platform_data;
|
|
|
struct mmc_host *mmc = host->mmc;
|
|
|
|
|
|
- if (pd->set_pwr)
|
|
|
+ if (pd && pd->set_pwr)
|
|
|
pd->set_pwr(host->pd, ios->power_mode != MMC_POWER_OFF);
|
|
|
if (!IS_ERR(mmc->supply.vmmc))
|
|
|
/* Errors ignored... */
|
|
@@ -996,7 +1001,7 @@ static int sh_mmcif_get_cd(struct mmc_host *mmc)
|
|
|
struct sh_mmcif_host *host = mmc_priv(mmc);
|
|
|
struct sh_mmcif_plat_data *p = host->pd->dev.platform_data;
|
|
|
|
|
|
- if (!p->get_cd)
|
|
|
+ if (!p || !p->get_cd)
|
|
|
return -ENOSYS;
|
|
|
else
|
|
|
return p->get_cd(host->pd);
|
|
@@ -1269,6 +1274,9 @@ static void sh_mmcif_init_ocr(struct sh_mmcif_host *host)
|
|
|
|
|
|
mmc_regulator_get_supply(mmc);
|
|
|
|
|
|
+ if (!pd)
|
|
|
+ return;
|
|
|
+
|
|
|
if (!mmc->ocr_avail)
|
|
|
mmc->ocr_avail = pd->ocr;
|
|
|
else if (pd->ocr)
|
|
@@ -1285,11 +1293,6 @@ static int __devinit sh_mmcif_probe(struct platform_device *pdev)
|
|
|
void __iomem *reg;
|
|
|
char clk_name[8];
|
|
|
|
|
|
- if (!pd) {
|
|
|
- dev_err(&pdev->dev, "sh_mmcif plat data error.\n");
|
|
|
- return -ENXIO;
|
|
|
- }
|
|
|
-
|
|
|
irq[0] = platform_get_irq(pdev, 0);
|
|
|
irq[1] = platform_get_irq(pdev, 1);
|
|
|
if (irq[0] < 0 || irq[1] < 0) {
|
|
@@ -1325,7 +1328,7 @@ static int __devinit sh_mmcif_probe(struct platform_device *pdev)
|
|
|
sh_mmcif_init_ocr(host);
|
|
|
|
|
|
mmc->caps = MMC_CAP_MMC_HIGHSPEED;
|
|
|
- if (pd->caps)
|
|
|
+ if (pd && pd->caps)
|
|
|
mmc->caps |= pd->caps;
|
|
|
mmc->max_segs = 32;
|
|
|
mmc->max_blk_size = 512;
|
|
@@ -1462,6 +1465,12 @@ static int sh_mmcif_resume(struct device *dev)
|
|
|
#define sh_mmcif_resume NULL
|
|
|
#endif /* CONFIG_PM */
|
|
|
|
|
|
+static const struct of_device_id mmcif_of_match[] = {
|
|
|
+ { .compatible = "renesas,sh-mmcif" },
|
|
|
+ { }
|
|
|
+};
|
|
|
+MODULE_DEVICE_TABLE(of, mmcif_of_match);
|
|
|
+
|
|
|
static const struct dev_pm_ops sh_mmcif_dev_pm_ops = {
|
|
|
.suspend = sh_mmcif_suspend,
|
|
|
.resume = sh_mmcif_resume,
|
|
@@ -1473,6 +1482,8 @@ static struct platform_driver sh_mmcif_driver = {
|
|
|
.driver = {
|
|
|
.name = DRIVER_NAME,
|
|
|
.pm = &sh_mmcif_dev_pm_ops,
|
|
|
+ .owner = THIS_MODULE,
|
|
|
+ .of_match_table = mmcif_of_match,
|
|
|
},
|
|
|
};
|
|
|
|