diff options
| author | Adrian Hunter <adrian.hunter@nokia.com> | 2009-09-22 19:44:39 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-23 10:39:34 -0400 |
| commit | 5e2ea6173d71cee81e53da00911dcab8cc092acc (patch) | |
| tree | a94aee4db6354470ccaabc77ab83d9e297e2b083 /drivers | |
| parent | d900f7128cf73d77467209672db2dcf0ff02dde6 (diff) | |
omap_hsmmc: make use of new enable/disable interface
For the moment enable / disable just turns the fclk on and off.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
Acked-by: Matt Fleming <matt@console-pimps.org>
Cc: Ian Molton <ian@mnementh.co.uk>
Cc: "Roberto A. Foglietta" <roberto.foglietta@gmail.com>
Cc: Jarkko Lavinen <jarkko.lavinen@nokia.com>
Cc: Denis Karpov <ext-denis.2.karpov@nokia.com>
Cc: Pierre Ossman <pierre@ossman.eu>
Cc: Philip Langdale <philipl@overt.org>
Cc: "Madhusudhan" <madhu.cr@ti.com>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/mmc/host/omap_hsmmc.c | 68 |
1 files changed, 58 insertions, 10 deletions
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 259c07d61a81..7699f0aeb58d 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c | |||
| @@ -605,7 +605,9 @@ static void mmc_omap_detect(struct work_struct *work) | |||
| 605 | if (host->carddetect) { | 605 | if (host->carddetect) { |
| 606 | mmc_detect_change(host->mmc, (HZ * 200) / 1000); | 606 | mmc_detect_change(host->mmc, (HZ * 200) / 1000); |
| 607 | } else { | 607 | } else { |
| 608 | mmc_host_enable(host->mmc); | ||
| 608 | mmc_omap_reset_controller_fsm(host, SRD); | 609 | mmc_omap_reset_controller_fsm(host, SRD); |
| 610 | mmc_host_lazy_disable(host->mmc); | ||
| 609 | mmc_detect_change(host->mmc, (HZ * 50) / 1000); | 611 | mmc_detect_change(host->mmc, (HZ * 50) / 1000); |
| 610 | } | 612 | } |
| 611 | } | 613 | } |
| @@ -818,6 +820,27 @@ mmc_omap_prepare_data(struct mmc_omap_host *host, struct mmc_request *req) | |||
| 818 | return 0; | 820 | return 0; |
| 819 | } | 821 | } |
| 820 | 822 | ||
| 823 | static int omap_mmc_enable(struct mmc_host *mmc) | ||
| 824 | { | ||
| 825 | struct mmc_omap_host *host = mmc_priv(mmc); | ||
| 826 | int err; | ||
| 827 | |||
| 828 | err = clk_enable(host->fclk); | ||
| 829 | if (err) | ||
| 830 | return err; | ||
| 831 | dev_dbg(mmc_dev(host->mmc), "mmc_fclk: enabled\n"); | ||
| 832 | return 0; | ||
| 833 | } | ||
| 834 | |||
| 835 | static int omap_mmc_disable(struct mmc_host *mmc, int lazy) | ||
| 836 | { | ||
| 837 | struct mmc_omap_host *host = mmc_priv(mmc); | ||
| 838 | |||
| 839 | clk_disable(host->fclk); | ||
| 840 | dev_dbg(mmc_dev(host->mmc), "mmc_fclk: disabled\n"); | ||
| 841 | return 0; | ||
| 842 | } | ||
| 843 | |||
| 821 | /* | 844 | /* |
| 822 | * Request function. for read/write operation | 845 | * Request function. for read/write operation |
| 823 | */ | 846 | */ |
| @@ -841,6 +864,8 @@ static void omap_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 841 | unsigned long timeout; | 864 | unsigned long timeout; |
| 842 | u32 con; | 865 | u32 con; |
| 843 | 866 | ||
| 867 | mmc_host_enable(host->mmc); | ||
| 868 | |||
| 844 | switch (ios->power_mode) { | 869 | switch (ios->power_mode) { |
| 845 | case MMC_POWER_OFF: | 870 | case MMC_POWER_OFF: |
| 846 | mmc_slot(host).set_power(host->dev, host->slot_id, 0, 0); | 871 | mmc_slot(host).set_power(host->dev, host->slot_id, 0, 0); |
| @@ -919,6 +944,8 @@ static void omap_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 919 | if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN) | 944 | if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN) |
| 920 | OMAP_HSMMC_WRITE(host->base, CON, | 945 | OMAP_HSMMC_WRITE(host->base, CON, |
| 921 | OMAP_HSMMC_READ(host->base, CON) | OD); | 946 | OMAP_HSMMC_READ(host->base, CON) | OD); |
| 947 | |||
| 948 | mmc_host_lazy_disable(host->mmc); | ||
| 922 | } | 949 | } |
| 923 | 950 | ||
| 924 | static int omap_hsmmc_get_cd(struct mmc_host *mmc) | 951 | static int omap_hsmmc_get_cd(struct mmc_host *mmc) |
| @@ -969,6 +996,8 @@ static void omap_hsmmc_init(struct mmc_omap_host *host) | |||
| 969 | } | 996 | } |
| 970 | 997 | ||
| 971 | static struct mmc_host_ops mmc_omap_ops = { | 998 | static struct mmc_host_ops mmc_omap_ops = { |
| 999 | .enable = omap_mmc_enable, | ||
| 1000 | .disable = omap_mmc_disable, | ||
| 972 | .request = omap_mmc_request, | 1001 | .request = omap_mmc_request, |
| 973 | .set_ios = omap_mmc_set_ios, | 1002 | .set_ios = omap_mmc_set_ios, |
| 974 | .get_cd = omap_hsmmc_get_cd, | 1003 | .get_cd = omap_hsmmc_get_cd, |
| @@ -983,7 +1012,16 @@ static int mmc_regs_show(struct seq_file *s, void *data) | |||
| 983 | struct mmc_host *mmc = s->private; | 1012 | struct mmc_host *mmc = s->private; |
| 984 | struct mmc_omap_host *host = mmc_priv(mmc); | 1013 | struct mmc_omap_host *host = mmc_priv(mmc); |
| 985 | 1014 | ||
| 986 | seq_printf(s, "mmc%d regs:\n", mmc->index); | 1015 | seq_printf(s, "mmc%d:\n" |
| 1016 | " enabled:\t%d\n" | ||
| 1017 | " nesting_cnt:\t%d\n" | ||
| 1018 | "\nregs:\n", | ||
| 1019 | mmc->index, mmc->enabled ? 1 : 0, mmc->nesting_cnt); | ||
| 1020 | |||
| 1021 | if (clk_enable(host->fclk) != 0) { | ||
| 1022 | seq_printf(s, "can't read the regs\n"); | ||
| 1023 | goto err; | ||
| 1024 | } | ||
| 987 | 1025 | ||
| 988 | seq_printf(s, "SYSCONFIG:\t0x%08x\n", | 1026 | seq_printf(s, "SYSCONFIG:\t0x%08x\n", |
| 989 | OMAP_HSMMC_READ(host->base, SYSCONFIG)); | 1027 | OMAP_HSMMC_READ(host->base, SYSCONFIG)); |
| @@ -999,6 +1037,9 @@ static int mmc_regs_show(struct seq_file *s, void *data) | |||
| 999 | OMAP_HSMMC_READ(host->base, ISE)); | 1037 | OMAP_HSMMC_READ(host->base, ISE)); |
| 1000 | seq_printf(s, "CAPA:\t\t0x%08x\n", | 1038 | seq_printf(s, "CAPA:\t\t0x%08x\n", |
| 1001 | OMAP_HSMMC_READ(host->base, CAPA)); | 1039 | OMAP_HSMMC_READ(host->base, CAPA)); |
| 1040 | |||
| 1041 | clk_disable(host->fclk); | ||
| 1042 | err: | ||
| 1002 | return 0; | 1043 | return 0; |
| 1003 | } | 1044 | } |
| 1004 | 1045 | ||
| @@ -1099,14 +1140,16 @@ static int __init omap_mmc_probe(struct platform_device *pdev) | |||
| 1099 | goto err1; | 1140 | goto err1; |
| 1100 | } | 1141 | } |
| 1101 | 1142 | ||
| 1102 | if (clk_enable(host->fclk) != 0) { | 1143 | mmc->caps |= MMC_CAP_DISABLE; |
| 1144 | mmc_set_disable_delay(mmc, 100); | ||
| 1145 | if (mmc_host_enable(host->mmc) != 0) { | ||
| 1103 | clk_put(host->iclk); | 1146 | clk_put(host->iclk); |
| 1104 | clk_put(host->fclk); | 1147 | clk_put(host->fclk); |
| 1105 | goto err1; | 1148 | goto err1; |
| 1106 | } | 1149 | } |
| 1107 | 1150 | ||
| 1108 | if (clk_enable(host->iclk) != 0) { | 1151 | if (clk_enable(host->iclk) != 0) { |
| 1109 | clk_disable(host->fclk); | 1152 | mmc_host_disable(host->mmc); |
| 1110 | clk_put(host->iclk); | 1153 | clk_put(host->iclk); |
| 1111 | clk_put(host->fclk); | 1154 | clk_put(host->fclk); |
| 1112 | goto err1; | 1155 | goto err1; |
| @@ -1197,6 +1240,8 @@ static int __init omap_mmc_probe(struct platform_device *pdev) | |||
| 1197 | OMAP_HSMMC_WRITE(host->base, ISE, INT_EN_MASK); | 1240 | OMAP_HSMMC_WRITE(host->base, ISE, INT_EN_MASK); |
| 1198 | OMAP_HSMMC_WRITE(host->base, IE, INT_EN_MASK); | 1241 | OMAP_HSMMC_WRITE(host->base, IE, INT_EN_MASK); |
| 1199 | 1242 | ||
| 1243 | mmc_host_lazy_disable(host->mmc); | ||
| 1244 | |||
| 1200 | mmc_add_host(mmc); | 1245 | mmc_add_host(mmc); |
| 1201 | 1246 | ||
| 1202 | if (host->pdata->slots[host->slot_id].name != NULL) { | 1247 | if (host->pdata->slots[host->slot_id].name != NULL) { |
| @@ -1225,7 +1270,7 @@ err_irq_cd: | |||
| 1225 | err_irq_cd_init: | 1270 | err_irq_cd_init: |
| 1226 | free_irq(host->irq, host); | 1271 | free_irq(host->irq, host); |
| 1227 | err_irq: | 1272 | err_irq: |
| 1228 | clk_disable(host->fclk); | 1273 | mmc_host_disable(host->mmc); |
| 1229 | clk_disable(host->iclk); | 1274 | clk_disable(host->iclk); |
| 1230 | clk_put(host->fclk); | 1275 | clk_put(host->fclk); |
| 1231 | clk_put(host->iclk); | 1276 | clk_put(host->iclk); |
| @@ -1250,6 +1295,7 @@ static int omap_mmc_remove(struct platform_device *pdev) | |||
| 1250 | struct resource *res; | 1295 | struct resource *res; |
| 1251 | 1296 | ||
| 1252 | if (host) { | 1297 | if (host) { |
| 1298 | mmc_host_enable(host->mmc); | ||
| 1253 | mmc_remove_host(host->mmc); | 1299 | mmc_remove_host(host->mmc); |
| 1254 | if (host->pdata->cleanup) | 1300 | if (host->pdata->cleanup) |
| 1255 | host->pdata->cleanup(&pdev->dev); | 1301 | host->pdata->cleanup(&pdev->dev); |
| @@ -1258,7 +1304,7 @@ static int omap_mmc_remove(struct platform_device *pdev) | |||
| 1258 | free_irq(mmc_slot(host).card_detect_irq, host); | 1304 | free_irq(mmc_slot(host).card_detect_irq, host); |
| 1259 | flush_scheduled_work(); | 1305 | flush_scheduled_work(); |
| 1260 | 1306 | ||
| 1261 | clk_disable(host->fclk); | 1307 | mmc_host_disable(host->mmc); |
| 1262 | clk_disable(host->iclk); | 1308 | clk_disable(host->iclk); |
| 1263 | clk_put(host->fclk); | 1309 | clk_put(host->fclk); |
| 1264 | clk_put(host->iclk); | 1310 | clk_put(host->iclk); |
| @@ -1289,6 +1335,7 @@ static int omap_mmc_suspend(struct platform_device *pdev, pm_message_t state) | |||
| 1289 | return 0; | 1335 | return 0; |
| 1290 | 1336 | ||
| 1291 | if (host) { | 1337 | if (host) { |
| 1338 | mmc_host_enable(host->mmc); | ||
| 1292 | ret = mmc_suspend_host(host->mmc, state); | 1339 | ret = mmc_suspend_host(host->mmc, state); |
| 1293 | if (ret == 0) { | 1340 | if (ret == 0) { |
| 1294 | host->suspended = 1; | 1341 | host->suspended = 1; |
| @@ -1307,10 +1354,11 @@ static int omap_mmc_suspend(struct platform_device *pdev, pm_message_t state) | |||
| 1307 | 1354 | ||
| 1308 | OMAP_HSMMC_WRITE(host->base, HCTL, | 1355 | OMAP_HSMMC_WRITE(host->base, HCTL, |
| 1309 | OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP); | 1356 | OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP); |
| 1310 | clk_disable(host->fclk); | 1357 | mmc_host_disable(host->mmc); |
| 1311 | clk_disable(host->iclk); | 1358 | clk_disable(host->iclk); |
| 1312 | clk_disable(host->dbclk); | 1359 | clk_disable(host->dbclk); |
| 1313 | } | 1360 | } else |
| 1361 | mmc_host_disable(host->mmc); | ||
| 1314 | 1362 | ||
| 1315 | } | 1363 | } |
| 1316 | return ret; | 1364 | return ret; |
| @@ -1327,13 +1375,12 @@ static int omap_mmc_resume(struct platform_device *pdev) | |||
| 1327 | 1375 | ||
| 1328 | if (host) { | 1376 | if (host) { |
| 1329 | 1377 | ||
| 1330 | ret = clk_enable(host->fclk); | 1378 | if (mmc_host_enable(host->mmc) != 0) |
| 1331 | if (ret) | ||
| 1332 | goto clk_en_err; | 1379 | goto clk_en_err; |
| 1333 | 1380 | ||
| 1334 | ret = clk_enable(host->iclk); | 1381 | ret = clk_enable(host->iclk); |
| 1335 | if (ret) { | 1382 | if (ret) { |
| 1336 | clk_disable(host->fclk); | 1383 | mmc_host_disable(host->mmc); |
| 1337 | clk_put(host->fclk); | 1384 | clk_put(host->fclk); |
| 1338 | goto clk_en_err; | 1385 | goto clk_en_err; |
| 1339 | } | 1386 | } |
| @@ -1355,6 +1402,7 @@ static int omap_mmc_resume(struct platform_device *pdev) | |||
| 1355 | ret = mmc_resume_host(host->mmc); | 1402 | ret = mmc_resume_host(host->mmc); |
| 1356 | if (ret == 0) | 1403 | if (ret == 0) |
| 1357 | host->suspended = 0; | 1404 | host->suspended = 0; |
| 1405 | mmc_host_lazy_disable(host->mmc); | ||
| 1358 | } | 1406 | } |
| 1359 | 1407 | ||
| 1360 | return ret; | 1408 | return ret; |
