Commit bf68a812 authored by Guennadi Liakhovetski's avatar Guennadi Liakhovetski Committed by Chris Ball

mmc: sh-mmcif: add OF support, make platform data optional

Add primitive OF support to the sh-mmcif driver, which also makes it
necessary to be able to run without platform data.
Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: default avatarChris Ball <cjb@laptop.org>
parent c7bb4487
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
#include <linux/mmc/mmc.h> #include <linux/mmc/mmc.h>
#include <linux/mmc/sdio.h> #include <linux/mmc/sdio.h>
#include <linux/mmc/sh_mmcif.h> #include <linux/mmc/sh_mmcif.h>
#include <linux/mod_devicetable.h>
#include <linux/pagemap.h> #include <linux/pagemap.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm_qos.h> #include <linux/pm_qos.h>
...@@ -384,6 +385,9 @@ static void sh_mmcif_request_dma(struct sh_mmcif_host *host, ...@@ -384,6 +385,9 @@ static void sh_mmcif_request_dma(struct sh_mmcif_host *host,
struct sh_dmae_slave *tx, *rx; struct sh_dmae_slave *tx, *rx;
host->dma_active = false; host->dma_active = false;
if (!pdata)
return;
/* We can only either use DMA for both Tx and Rx or not use it at all */ /* We can only either use DMA for both Tx and Rx or not use it at all */
if (pdata->dma) { if (pdata->dma) {
dev_warn(&host->pd->dev, dev_warn(&host->pd->dev,
...@@ -444,13 +448,14 @@ static void sh_mmcif_release_dma(struct sh_mmcif_host *host) ...@@ -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) 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; 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_ENABLE);
sh_mmcif_bitclr(host, MMCIF_CE_CLK_CTRL, CLK_CLEAR); sh_mmcif_bitclr(host, MMCIF_CE_CLK_CTRL, CLK_CLEAR);
if (!clk) if (!clk)
return; 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); sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_SUP_PCLK);
else else
sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_CLEAR & 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) ...@@ -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 sh_mmcif_plat_data *pd = host->pd->dev.platform_data;
struct mmc_host *mmc = host->mmc; 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); pd->set_pwr(host->pd, ios->power_mode != MMC_POWER_OFF);
if (!IS_ERR(mmc->supply.vmmc)) if (!IS_ERR(mmc->supply.vmmc))
/* Errors ignored... */ /* Errors ignored... */
...@@ -996,7 +1001,7 @@ static int sh_mmcif_get_cd(struct mmc_host *mmc) ...@@ -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_host *host = mmc_priv(mmc);
struct sh_mmcif_plat_data *p = host->pd->dev.platform_data; struct sh_mmcif_plat_data *p = host->pd->dev.platform_data;
if (!p->get_cd) if (!p || !p->get_cd)
return -ENOSYS; return -ENOSYS;
else else
return p->get_cd(host->pd); return p->get_cd(host->pd);
...@@ -1269,6 +1274,9 @@ static void sh_mmcif_init_ocr(struct sh_mmcif_host *host) ...@@ -1269,6 +1274,9 @@ static void sh_mmcif_init_ocr(struct sh_mmcif_host *host)
mmc_regulator_get_supply(mmc); mmc_regulator_get_supply(mmc);
if (!pd)
return;
if (!mmc->ocr_avail) if (!mmc->ocr_avail)
mmc->ocr_avail = pd->ocr; mmc->ocr_avail = pd->ocr;
else if (pd->ocr) else if (pd->ocr)
...@@ -1285,11 +1293,6 @@ static int __devinit sh_mmcif_probe(struct platform_device *pdev) ...@@ -1285,11 +1293,6 @@ static int __devinit sh_mmcif_probe(struct platform_device *pdev)
void __iomem *reg; void __iomem *reg;
char clk_name[8]; 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[0] = platform_get_irq(pdev, 0);
irq[1] = platform_get_irq(pdev, 1); irq[1] = platform_get_irq(pdev, 1);
if (irq[0] < 0 || irq[1] < 0) { if (irq[0] < 0 || irq[1] < 0) {
...@@ -1325,7 +1328,7 @@ static int __devinit sh_mmcif_probe(struct platform_device *pdev) ...@@ -1325,7 +1328,7 @@ static int __devinit sh_mmcif_probe(struct platform_device *pdev)
sh_mmcif_init_ocr(host); sh_mmcif_init_ocr(host);
mmc->caps = MMC_CAP_MMC_HIGHSPEED; mmc->caps = MMC_CAP_MMC_HIGHSPEED;
if (pd->caps) if (pd && pd->caps)
mmc->caps |= pd->caps; mmc->caps |= pd->caps;
mmc->max_segs = 32; mmc->max_segs = 32;
mmc->max_blk_size = 512; mmc->max_blk_size = 512;
...@@ -1462,6 +1465,12 @@ static int sh_mmcif_resume(struct device *dev) ...@@ -1462,6 +1465,12 @@ static int sh_mmcif_resume(struct device *dev)
#define sh_mmcif_resume NULL #define sh_mmcif_resume NULL
#endif /* CONFIG_PM */ #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 = { static const struct dev_pm_ops sh_mmcif_dev_pm_ops = {
.suspend = sh_mmcif_suspend, .suspend = sh_mmcif_suspend,
.resume = sh_mmcif_resume, .resume = sh_mmcif_resume,
...@@ -1473,6 +1482,8 @@ static struct platform_driver sh_mmcif_driver = { ...@@ -1473,6 +1482,8 @@ static struct platform_driver sh_mmcif_driver = {
.driver = { .driver = {
.name = DRIVER_NAME, .name = DRIVER_NAME,
.pm = &sh_mmcif_dev_pm_ops, .pm = &sh_mmcif_dev_pm_ops,
.owner = THIS_MODULE,
.of_match_table = mmcif_of_match,
}, },
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment