diff options
| -rw-r--r-- | drivers/mmc/core/core.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 63ffc65f84af..b27b94078c21 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c | |||
| @@ -728,15 +728,17 @@ static inline void mmc_set_ios(struct mmc_host *host) | |||
| 728 | */ | 728 | */ |
| 729 | void mmc_set_chip_select(struct mmc_host *host, int mode) | 729 | void mmc_set_chip_select(struct mmc_host *host, int mode) |
| 730 | { | 730 | { |
| 731 | mmc_host_clk_hold(host); | ||
| 731 | host->ios.chip_select = mode; | 732 | host->ios.chip_select = mode; |
| 732 | mmc_set_ios(host); | 733 | mmc_set_ios(host); |
| 734 | mmc_host_clk_release(host); | ||
| 733 | } | 735 | } |
| 734 | 736 | ||
| 735 | /* | 737 | /* |
| 736 | * Sets the host clock to the highest possible frequency that | 738 | * Sets the host clock to the highest possible frequency that |
| 737 | * is below "hz". | 739 | * is below "hz". |
| 738 | */ | 740 | */ |
| 739 | void mmc_set_clock(struct mmc_host *host, unsigned int hz) | 741 | static void __mmc_set_clock(struct mmc_host *host, unsigned int hz) |
| 740 | { | 742 | { |
| 741 | WARN_ON(hz < host->f_min); | 743 | WARN_ON(hz < host->f_min); |
| 742 | 744 | ||
| @@ -747,6 +749,13 @@ void mmc_set_clock(struct mmc_host *host, unsigned int hz) | |||
| 747 | mmc_set_ios(host); | 749 | mmc_set_ios(host); |
| 748 | } | 750 | } |
| 749 | 751 | ||
| 752 | void mmc_set_clock(struct mmc_host *host, unsigned int hz) | ||
| 753 | { | ||
| 754 | mmc_host_clk_hold(host); | ||
| 755 | __mmc_set_clock(host, hz); | ||
| 756 | mmc_host_clk_release(host); | ||
| 757 | } | ||
| 758 | |||
| 750 | #ifdef CONFIG_MMC_CLKGATE | 759 | #ifdef CONFIG_MMC_CLKGATE |
| 751 | /* | 760 | /* |
| 752 | * This gates the clock by setting it to 0 Hz. | 761 | * This gates the clock by setting it to 0 Hz. |
| @@ -779,7 +788,7 @@ void mmc_ungate_clock(struct mmc_host *host) | |||
| 779 | if (host->clk_old) { | 788 | if (host->clk_old) { |
| 780 | BUG_ON(host->ios.clock); | 789 | BUG_ON(host->ios.clock); |
| 781 | /* This call will also set host->clk_gated to false */ | 790 | /* This call will also set host->clk_gated to false */ |
| 782 | mmc_set_clock(host, host->clk_old); | 791 | __mmc_set_clock(host, host->clk_old); |
| 783 | } | 792 | } |
| 784 | } | 793 | } |
| 785 | 794 | ||
| @@ -807,8 +816,10 @@ void mmc_set_ungated(struct mmc_host *host) | |||
| 807 | */ | 816 | */ |
| 808 | void mmc_set_bus_mode(struct mmc_host *host, unsigned int mode) | 817 | void mmc_set_bus_mode(struct mmc_host *host, unsigned int mode) |
| 809 | { | 818 | { |
| 819 | mmc_host_clk_hold(host); | ||
| 810 | host->ios.bus_mode = mode; | 820 | host->ios.bus_mode = mode; |
| 811 | mmc_set_ios(host); | 821 | mmc_set_ios(host); |
| 822 | mmc_host_clk_release(host); | ||
| 812 | } | 823 | } |
| 813 | 824 | ||
| 814 | /* | 825 | /* |
| @@ -816,8 +827,10 @@ void mmc_set_bus_mode(struct mmc_host *host, unsigned int mode) | |||
| 816 | */ | 827 | */ |
| 817 | void mmc_set_bus_width(struct mmc_host *host, unsigned int width) | 828 | void mmc_set_bus_width(struct mmc_host *host, unsigned int width) |
| 818 | { | 829 | { |
| 830 | mmc_host_clk_hold(host); | ||
| 819 | host->ios.bus_width = width; | 831 | host->ios.bus_width = width; |
| 820 | mmc_set_ios(host); | 832 | mmc_set_ios(host); |
| 833 | mmc_host_clk_release(host); | ||
| 821 | } | 834 | } |
| 822 | 835 | ||
| 823 | /** | 836 | /** |
| @@ -1015,8 +1028,10 @@ u32 mmc_select_voltage(struct mmc_host *host, u32 ocr) | |||
| 1015 | 1028 | ||
| 1016 | ocr &= 3 << bit; | 1029 | ocr &= 3 << bit; |
| 1017 | 1030 | ||
| 1031 | mmc_host_clk_hold(host); | ||
| 1018 | host->ios.vdd = bit; | 1032 | host->ios.vdd = bit; |
| 1019 | mmc_set_ios(host); | 1033 | mmc_set_ios(host); |
| 1034 | mmc_host_clk_release(host); | ||
| 1020 | } else { | 1035 | } else { |
| 1021 | pr_warning("%s: host doesn't support card's voltages\n", | 1036 | pr_warning("%s: host doesn't support card's voltages\n", |
| 1022 | mmc_hostname(host)); | 1037 | mmc_hostname(host)); |
| @@ -1063,8 +1078,10 @@ int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage, bool cmd11 | |||
| 1063 | */ | 1078 | */ |
| 1064 | void mmc_set_timing(struct mmc_host *host, unsigned int timing) | 1079 | void mmc_set_timing(struct mmc_host *host, unsigned int timing) |
| 1065 | { | 1080 | { |
| 1081 | mmc_host_clk_hold(host); | ||
| 1066 | host->ios.timing = timing; | 1082 | host->ios.timing = timing; |
| 1067 | mmc_set_ios(host); | 1083 | mmc_set_ios(host); |
| 1084 | mmc_host_clk_release(host); | ||
| 1068 | } | 1085 | } |
| 1069 | 1086 | ||
| 1070 | /* | 1087 | /* |
| @@ -1072,8 +1089,10 @@ void mmc_set_timing(struct mmc_host *host, unsigned int timing) | |||
| 1072 | */ | 1089 | */ |
| 1073 | void mmc_set_driver_type(struct mmc_host *host, unsigned int drv_type) | 1090 | void mmc_set_driver_type(struct mmc_host *host, unsigned int drv_type) |
| 1074 | { | 1091 | { |
| 1092 | mmc_host_clk_hold(host); | ||
| 1075 | host->ios.drv_type = drv_type; | 1093 | host->ios.drv_type = drv_type; |
| 1076 | mmc_set_ios(host); | 1094 | mmc_set_ios(host); |
| 1095 | mmc_host_clk_release(host); | ||
| 1077 | } | 1096 | } |
| 1078 | 1097 | ||
| 1079 | /* | 1098 | /* |
| @@ -1091,6 +1110,8 @@ static void mmc_power_up(struct mmc_host *host) | |||
| 1091 | { | 1110 | { |
| 1092 | int bit; | 1111 | int bit; |
| 1093 | 1112 | ||
| 1113 | mmc_host_clk_hold(host); | ||
| 1114 | |||
| 1094 | /* If ocr is set, we use it */ | 1115 | /* If ocr is set, we use it */ |
| 1095 | if (host->ocr) | 1116 | if (host->ocr) |
| 1096 | bit = ffs(host->ocr) - 1; | 1117 | bit = ffs(host->ocr) - 1; |
| @@ -1126,10 +1147,14 @@ static void mmc_power_up(struct mmc_host *host) | |||
| 1126 | * time required to reach a stable voltage. | 1147 | * time required to reach a stable voltage. |
| 1127 | */ | 1148 | */ |
| 1128 | mmc_delay(10); | 1149 | mmc_delay(10); |
| 1150 | |||
| 1151 | mmc_host_clk_release(host); | ||
| 1129 | } | 1152 | } |
| 1130 | 1153 | ||
| 1131 | static void mmc_power_off(struct mmc_host *host) | 1154 | static void mmc_power_off(struct mmc_host *host) |
| 1132 | { | 1155 | { |
| 1156 | mmc_host_clk_hold(host); | ||
| 1157 | |||
| 1133 | host->ios.clock = 0; | 1158 | host->ios.clock = 0; |
| 1134 | host->ios.vdd = 0; | 1159 | host->ios.vdd = 0; |
| 1135 | 1160 | ||
| @@ -1147,6 +1172,8 @@ static void mmc_power_off(struct mmc_host *host) | |||
| 1147 | host->ios.bus_width = MMC_BUS_WIDTH_1; | 1172 | host->ios.bus_width = MMC_BUS_WIDTH_1; |
| 1148 | host->ios.timing = MMC_TIMING_LEGACY; | 1173 | host->ios.timing = MMC_TIMING_LEGACY; |
| 1149 | mmc_set_ios(host); | 1174 | mmc_set_ios(host); |
| 1175 | |||
| 1176 | mmc_host_clk_release(host); | ||
| 1150 | } | 1177 | } |
| 1151 | 1178 | ||
| 1152 | /* | 1179 | /* |
