|
@@ -58,6 +58,12 @@ static int rockchip_mmc_get_phase(struct clk_hw *hw)
|
|
u16 degrees;
|
|
u16 degrees;
|
|
u32 delay_num = 0;
|
|
u32 delay_num = 0;
|
|
|
|
|
|
|
|
+ /* See the comment for rockchip_mmc_set_phase below */
|
|
|
|
+ if (!rate) {
|
|
|
|
+ pr_err("%s: invalid clk rate\n", __func__);
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+
|
|
raw_value = readl(mmc_clock->reg) >> (mmc_clock->shift);
|
|
raw_value = readl(mmc_clock->reg) >> (mmc_clock->shift);
|
|
|
|
|
|
degrees = (raw_value & ROCKCHIP_MMC_DEGREE_MASK) * 90;
|
|
degrees = (raw_value & ROCKCHIP_MMC_DEGREE_MASK) * 90;
|
|
@@ -84,6 +90,23 @@ static int rockchip_mmc_set_phase(struct clk_hw *hw, int degrees)
|
|
u32 raw_value;
|
|
u32 raw_value;
|
|
u32 delay;
|
|
u32 delay;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * The below calculation is based on the output clock from
|
|
|
|
+ * MMC host to the card, which expects the phase clock inherits
|
|
|
|
+ * the clock rate from its parent, namely the output clock
|
|
|
|
+ * provider of MMC host. However, things may go wrong if
|
|
|
|
+ * (1) It is orphan.
|
|
|
|
+ * (2) It is assigned to the wrong parent.
|
|
|
|
+ *
|
|
|
|
+ * This check help debug the case (1), which seems to be the
|
|
|
|
+ * most likely problem we often face and which makes it difficult
|
|
|
|
+ * for people to debug unstable mmc tuning results.
|
|
|
|
+ */
|
|
|
|
+ if (!rate) {
|
|
|
|
+ pr_err("%s: invalid clk rate\n", __func__);
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+
|
|
nineties = degrees / 90;
|
|
nineties = degrees / 90;
|
|
remainder = (degrees % 90);
|
|
remainder = (degrees % 90);
|
|
|
|
|