diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mmc/host/omap.c | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c index fc044a5ed64e..1914e65d4db1 100644 --- a/drivers/mmc/host/omap.c +++ b/drivers/mmc/host/omap.c | |||
@@ -936,33 +936,41 @@ static void mmc_omap_power(struct mmc_omap_host *host, int on) | |||
936 | } | 936 | } |
937 | } | 937 | } |
938 | 938 | ||
939 | static void mmc_omap_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | 939 | static int mmc_omap_calc_divisor(struct mmc_host *mmc, struct mmc_ios *ios) |
940 | { | 940 | { |
941 | struct mmc_omap_host *host = mmc_priv(mmc); | 941 | struct mmc_omap_host *host = mmc_priv(mmc); |
942 | int func_clk_rate = clk_get_rate(host->fclk); | ||
942 | int dsor; | 943 | int dsor; |
943 | int realclock, i; | ||
944 | |||
945 | realclock = ios->clock; | ||
946 | 944 | ||
947 | if (ios->clock == 0) | 945 | if (ios->clock == 0) |
948 | dsor = 0; | 946 | return 0; |
949 | else { | ||
950 | int func_clk_rate = clk_get_rate(host->fclk); | ||
951 | |||
952 | dsor = func_clk_rate / realclock; | ||
953 | if (dsor < 1) | ||
954 | dsor = 1; | ||
955 | 947 | ||
956 | if (func_clk_rate / dsor > realclock) | 948 | dsor = func_clk_rate / ios->clock; |
957 | dsor++; | 949 | if (dsor < 1) |
950 | dsor = 1; | ||
958 | 951 | ||
959 | if (dsor > 250) | 952 | if (func_clk_rate / dsor > ios->clock) |
960 | dsor = 250; | ||
961 | dsor++; | 953 | dsor++; |
962 | 954 | ||
963 | if (ios->bus_width == MMC_BUS_WIDTH_4) | 955 | if (dsor > 250) |
964 | dsor |= 1 << 15; | 956 | dsor = 250; |
965 | } | 957 | dsor++; |
958 | |||
959 | if (ios->bus_width == MMC_BUS_WIDTH_4) | ||
960 | dsor |= 1 << 15; | ||
961 | |||
962 | return dsor; | ||
963 | } | ||
964 | |||
965 | static void mmc_omap_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | ||
966 | { | ||
967 | struct mmc_omap_host *host = mmc_priv(mmc); | ||
968 | int dsor; | ||
969 | int i; | ||
970 | |||
971 | dsor = mmc_omap_calc_divisor(mmc, ios); | ||
972 | host->bus_mode = ios->bus_mode; | ||
973 | host->hw_bus_mode = host->bus_mode; | ||
966 | 974 | ||
967 | switch (ios->power_mode) { | 975 | switch (ios->power_mode) { |
968 | case MMC_POWER_OFF: | 976 | case MMC_POWER_OFF: |
@@ -977,9 +985,6 @@ static void mmc_omap_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
977 | break; | 985 | break; |
978 | } | 986 | } |
979 | 987 | ||
980 | host->bus_mode = ios->bus_mode; | ||
981 | host->hw_bus_mode = host->bus_mode; | ||
982 | |||
983 | clk_enable(host->fclk); | 988 | clk_enable(host->fclk); |
984 | 989 | ||
985 | /* On insanely high arm_per frequencies something sometimes | 990 | /* On insanely high arm_per frequencies something sometimes |