@@ -723,21 +723,21 @@ static void msdc_unprepare_data(struct msdc_host *host, struct mmc_request *mrq)
723
723
}
724
724
}
725
725
726
- /* clock control primitives */
727
- static void msdc_set_timeout (struct msdc_host * host , u32 ns , u32 clks )
726
+ static u64 msdc_timeout_cal (struct msdc_host * host , u64 ns , u64 clks )
728
727
{
729
- u32 timeout , clk_ns ;
728
+ u64 timeout , clk_ns ;
730
729
u32 mode = 0 ;
731
730
732
- host -> timeout_ns = ns ;
733
- host -> timeout_clks = clks ;
734
731
if (host -> mmc -> actual_clock == 0 ) {
735
732
timeout = 0 ;
736
733
} else {
737
- clk_ns = 1000000000UL / host -> mmc -> actual_clock ;
738
- timeout = (ns + clk_ns - 1 ) / clk_ns + clks ;
734
+ clk_ns = 1000000000ULL ;
735
+ do_div (clk_ns , host -> mmc -> actual_clock );
736
+ timeout = ns + clk_ns - 1 ;
737
+ do_div (timeout , clk_ns );
738
+ timeout += clks ;
739
739
/* in 1048576 sclk cycle unit */
740
- timeout = (timeout + (0x1 << 20 ) - 1 ) >> 20 ;
740
+ timeout = DIV_ROUND_UP (timeout , (0x1 << 20 )) ;
741
741
if (host -> dev_comp -> clk_div_bits == 8 )
742
742
sdr_get_field (host -> base + MSDC_CFG ,
743
743
MSDC_CFG_CKMOD , & mode );
@@ -747,9 +747,21 @@ static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks)
747
747
/*DDR mode will double the clk cycles for data timeout */
748
748
timeout = mode >= 2 ? timeout * 2 : timeout ;
749
749
timeout = timeout > 1 ? timeout - 1 : 0 ;
750
- timeout = timeout > 255 ? 255 : timeout ;
751
750
}
752
- sdr_set_field (host -> base + SDC_CFG , SDC_CFG_DTOC , timeout );
751
+ return timeout ;
752
+ }
753
+
754
+ /* clock control primitives */
755
+ static void msdc_set_timeout (struct msdc_host * host , u64 ns , u64 clks )
756
+ {
757
+ u64 timeout ;
758
+
759
+ host -> timeout_ns = ns ;
760
+ host -> timeout_clks = clks ;
761
+
762
+ timeout = msdc_timeout_cal (host , ns , clks );
763
+ sdr_set_field (host -> base + SDC_CFG , SDC_CFG_DTOC ,
764
+ (u32 )(timeout > 255 ? 255 : timeout ));
753
765
}
754
766
755
767
static void msdc_gate_clock (struct msdc_host * host )
0 commit comments