• Douglas Anderson's avatar
    mmc: core: Add mmc_regulator_set_vqmmc() · 2086f801
    Douglas Anderson authored
    This adds logic to the MMC core to set VQMMC.  This is expected to be
    called by MMC drivers like dw_mmc as part of (or instead of) their
    start_signal_voltage_switch() callback.
    A few notes:
    * When setting the signal voltage to 3.3V we do our best to make VQMMC
      and VMMC match.  It's been reported that this makes some old cards
      happy since they were tested back in the day before UHS when VQMMC
      and VMMC were provided by the same regulator.  A nice side effect of
      this is that we don't end up on the hairy edge of VQMMC (2.7V),
      which some EEs claim is a little too close to the minimum for
      This is done in two steps. At first we try to find a VQMMC within
      a 0.3V tolerance of VMMC and if this is not supported by the
      supplying regulator we try to find a suitable voltage within the
      whole 2.7V-3.6V area of the spec.
    * The two step approach is currently necessary, as the used
      regulator_set_voltage_triplet(min, target, max) uses a simple
      implementation that just tries two basic steps:
    	regulator_set_voltage(target, max);
    	regulator_set_voltage(min, target);
      So with only one step with 2.7-3.6V borders, if a suitable voltage
      is a bit below VMMC, we would directly get the lowest 2.7V
      which some boards (like Rockchips) don't like at all.
    * When setting the signal voltage to 1.8V or 1.2V we aim for that
      specific voltage instead of picking the lowest one in the range.
    * We very purposely don't print errors in mmc_regulator_set_vqmmc().
      There are cases where the MMC core will try several different
      voltages and we don't want to pollute the logs.
    Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
    Signed-off-by: default avatarHeiko Stuebner <heiko@sntech.de>
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
core.c 70.4 KB