diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2013-01-07 10:09:22 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2013-01-08 10:02:13 +0100 |
commit | 04cb446c9a1bdddae41b20df5de8825df44e8dfe (patch) | |
tree | 686fb705d4b92f085c020e40962f580b9e1c33e5 /drivers/mci/omap_hsmmc.c | |
parent | d43bcb9987f47fd1cd575a4b965ddb743b5b7ca6 (diff) | |
download | barebox-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.c | 34 |
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) |