diff options
Diffstat (limited to 'drivers/mmc/tifm_sd.c')
-rw-r--r-- | drivers/mmc/tifm_sd.c | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/drivers/mmc/tifm_sd.c b/drivers/mmc/tifm_sd.c index 2adfe3467019..ce19b045ca6a 100644 --- a/drivers/mmc/tifm_sd.c +++ b/drivers/mmc/tifm_sd.c | |||
@@ -921,6 +921,41 @@ static void tifm_sd_remove(struct tifm_dev *sock) | |||
921 | mmc_free_host(mmc); | 921 | mmc_free_host(mmc); |
922 | } | 922 | } |
923 | 923 | ||
924 | #ifdef CONFIG_PM | ||
925 | |||
926 | static int tifm_sd_suspend(struct tifm_dev *sock, pm_message_t state) | ||
927 | { | ||
928 | struct mmc_host *mmc = tifm_get_drvdata(sock); | ||
929 | int rc; | ||
930 | |||
931 | rc = mmc_suspend_host(mmc, state); | ||
932 | /* The meaning of the bit majority in this constant is unknown. */ | ||
933 | writel(0xfff8 & readl(sock->addr + SOCK_CONTROL), | ||
934 | sock->addr + SOCK_CONTROL); | ||
935 | return rc; | ||
936 | } | ||
937 | |||
938 | static int tifm_sd_resume(struct tifm_dev *sock) | ||
939 | { | ||
940 | struct mmc_host *mmc = tifm_get_drvdata(sock); | ||
941 | struct tifm_sd *host = mmc_priv(mmc); | ||
942 | |||
943 | if (sock->media_id != FM_SD | ||
944 | || tifm_sd_initialize_host(host)) { | ||
945 | tifm_eject(sock); | ||
946 | return 0; | ||
947 | } else { | ||
948 | return mmc_resume_host(mmc); | ||
949 | } | ||
950 | } | ||
951 | |||
952 | #else | ||
953 | |||
954 | #define tifm_sd_suspend NULL | ||
955 | #define tifm_sd_resume NULL | ||
956 | |||
957 | #endif /* CONFIG_PM */ | ||
958 | |||
924 | static tifm_media_id tifm_sd_id_tbl[] = { | 959 | static tifm_media_id tifm_sd_id_tbl[] = { |
925 | FM_SD, 0 | 960 | FM_SD, 0 |
926 | }; | 961 | }; |
@@ -932,7 +967,9 @@ static struct tifm_driver tifm_sd_driver = { | |||
932 | }, | 967 | }, |
933 | .id_table = tifm_sd_id_tbl, | 968 | .id_table = tifm_sd_id_tbl, |
934 | .probe = tifm_sd_probe, | 969 | .probe = tifm_sd_probe, |
935 | .remove = tifm_sd_remove | 970 | .remove = tifm_sd_remove, |
971 | .suspend = tifm_sd_suspend, | ||
972 | .resume = tifm_sd_resume | ||
936 | }; | 973 | }; |
937 | 974 | ||
938 | static int __init tifm_sd_init(void) | 975 | static int __init tifm_sd_init(void) |