• Douglas Anderson's avatar
    mmc: dw_mmc: rockchip: Set the drive phase properly · d4aa908c
    Douglas Anderson authored
    Historically for Rockchip devices we've relied on the power-on
    default (or perhaps the firmware setting) to get the correct drive
    phase for dw_mmc devices.  This worked OK for the most part, but:
    
    * Relying on the setting just "being right" is a bit fragile.
    
    * As soon as there is an instance where the power on default is wrong or
      where the firmware didn't configure this properly then we'll get a
      mysterious failure.
    
    In commit 7a03fe6f ("clk: rockchip: reset init state before mmc card
    initialization") we actually started setting this explicitly in the
    kernel, but that commit wasn't quite right and also wasn't quite
    enough.  See <https://patchwork.kernel.org/patch/9085311/> for some
    details.
    
    Let's explicitly set this phase in dw_mmc.
    
    The comments inside this patch try to explain the situation quite
    throughly, but the high level overview of this is:
    
    Before this patch on rk3288 devices tested (after revert of the clock
    patch described above):
    * eMMC: 180 degrees
    * SDMMC/SDIO0/SDIO1: 90 degrees
    
    After this patch:
    * Use 90 degree phase offset usually.
    * Use 180 degree phase offset for MMC_DDR52, SDR104, HS200.
    
    That means we are _changing_ behavior for those devices in this way:
    
    * If we have HS200 eMMC or DDR52 eMMC, we'll run ID mode at 90
      degrees (vs 180) but otherwise have no change.
    
    * For any non-HS200 / non-DDR52 eMMC devices we'll now _always_ run at
      90 degrees (vs 180).  It seems fairly unlikely that building modern
      hardware is using an eMMC that isn't using DDR52 or HS200, of course.
    
    * For SDR104 cards we'll now run with 180 degree phase offset (vs 90).
      It's expected that 90 degree phase offset would have worked OK, but
      this gives us extra margin.
    
    I have tested this by inserting my collection of uSD cards (mostly UHS,
    though a few not) into a veyron_minnie and confirmed that they still
    seem to enumerate properly.  For a subset of them I tried putting a
    filesystem on them and also tried running mmc_test.
    
    Fixes: 7a03fe6f ("clk: rockchip: reset init state before mmc card initialization")
    Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
    Reviewed-by: default avatarShawn Lin <shawn.lin@rock-chips.com>
    Tested-by: default avatarHeiko Stuebner <heiko@sntech.de>
    Tested-by: default avatarEnric Balletbo i Serra <enric.balletbo@collabora.com>
    Signed-off-by: default avatarJaehoon Chung <jh80.chung@samsung.com>
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    d4aa908c
dw_mmc-rockchip.c 9.69 KB