summaryrefslogtreecommitdiffstats
path: root/drivers/mci/omap_hsmmc.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2013-01-07 10:09:22 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2013-01-08 10:02:13 +0100
commit04cb446c9a1bdddae41b20df5de8825df44e8dfe (patch)
tree686fb705d4b92f085c020e40962f580b9e1c33e5 /drivers/mci/omap_hsmmc.c
parentd43bcb9987f47fd1cd575a4b965ddb743b5b7ca6 (diff)
downloadbarebox-04cb446c9a1bdddae41b20df5de8825df44e8dfe.tar.gz
barebox-04cb446c9a1bdddae41b20df5de8825df44e8dfe.tar.xz
ARM omap / mci: Fix register offsets
Only the OMAP4 has a register offset of 0x100 in the register space. Fix this by using the device id mechanism. This became broken when the device register convenience functions were introduced. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/mci/omap_hsmmc.c')
-rw-r--r--drivers/mci/omap_hsmmc.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/drivers/mci/omap_hsmmc.c b/drivers/mci/omap_hsmmc.c
index 888cba93a2..ffcb4ae75c 100644
--- a/drivers/mci/omap_hsmmc.c
+++ b/drivers/mci/omap_hsmmc.c
@@ -59,6 +59,18 @@ struct hsmmc {
unsigned int capa; /* 0x140 */
};
+struct omap_mmc_driver_data {
+ unsigned long reg_ofs;
+};
+
+static struct omap_mmc_driver_data omap3_data = {
+ .reg_ofs = 0,
+};
+
+static struct omap_mmc_driver_data omap4_data = {
+ .reg_ofs = 0x100,
+};
+
/*
* OMAP HS MMC Bit definitions
*/
@@ -566,6 +578,13 @@ static int omap_mmc_probe(struct device_d *dev)
{
struct omap_hsmmc *hsmmc;
struct omap_hsmmc_platform_data *pdata;
+ struct omap_mmc_driver_data *drvdata;
+ unsigned long reg_ofs = 0;
+ int ret;
+
+ ret = dev_get_drvdata(dev, (unsigned long *)&drvdata);
+ if (!ret)
+ reg_ofs = drvdata->reg_ofs;
hsmmc = xzalloc(sizeof(*hsmmc));
@@ -577,7 +596,7 @@ static int omap_mmc_probe(struct device_d *dev)
hsmmc->mci.hw_dev = dev;
hsmmc->iobase = dev_request_mem_region(dev, 0);
- hsmmc->base = hsmmc->iobase + 0x100;
+ hsmmc->base = hsmmc->iobase + reg_ofs;
hsmmc->mci.voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
@@ -594,9 +613,22 @@ static int omap_mmc_probe(struct device_d *dev)
return 0;
}
+static struct platform_device_id omap_mmc_ids[] = {
+ {
+ .name = "omap3-hsmmc",
+ .driver_data = (unsigned long)&omap3_data,
+ }, {
+ .name = "omap4-hsmmc",
+ .driver_data = (unsigned long)&omap4_data,
+ }, {
+ /* sentinel */
+ },
+};
+
static struct driver_d omap_mmc_driver = {
.name = "omap-hsmmc",
.probe = omap_mmc_probe,
+ .id_table = omap_mmc_ids,
};
static int omap_mmc_init_driver(void)