Skip to content
711 changes: 357 additions & 354 deletions components/drivers/include/drivers/dev_sdhci.h

Large diffs are not rendered by default.

56 changes: 43 additions & 13 deletions components/drivers/sdio/dev_regulator.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@

#include "dev_sdio_dm.h"

#define DBG_TAG "SDIO"
#define DBG_TAG "SDIO"
#ifdef RT_SDIO_DEBUG
#define DBG_LVL DBG_LOG
#define DBG_LVL DBG_LOG
#else
#define DBG_LVL DBG_INFO
#define DBG_LVL DBG_INFO
#endif /* RT_SDIO_DEBUG */
#include <rtdbg.h>

Expand Down Expand Up @@ -44,7 +44,7 @@ static rt_err_t ocrbitnum_to_vdd(int vdd_bit, int *min_uvolt, int *max_uvolt)
}

rt_err_t sdio_regulator_set_ocr(struct rt_mmcsd_host *host,
struct rt_regulator *supply, rt_uint16_t vdd_bit)
struct rt_regulator *supply, rt_uint16_t vdd_bit)
{
rt_err_t err = RT_EOK;

Expand Down Expand Up @@ -94,10 +94,26 @@ rt_err_t sdio_regulator_set_ocr(struct rt_mmcsd_host *host,
return err;
}

rt_bool_t sdio_regulator_supports_vqmmc_voltage(struct rt_regulator *regulator,
int min_uvolt, int target_uvolt, int max_uvolt)
{
if (!regulator)
{
return RT_FALSE;
}

if (rt_regulator_is_supported_voltage(regulator, min_uvolt, max_uvolt))
{
return RT_TRUE;
}

return rt_regulator_is_supported_voltage(regulator, target_uvolt, target_uvolt);
}

static int regulator_set_voltage_if_supported(struct rt_regulator *regulator,
int min_uvolt, int target_uvolt, int max_uvolt)
int min_uvolt, int target_uvolt, int max_uvolt)
{
if (!rt_regulator_is_supported_voltage(regulator, min_uvolt, max_uvolt))
if (!regulator)
{
return -RT_EINVAL;
}
Expand All @@ -107,12 +123,26 @@ static int regulator_set_voltage_if_supported(struct rt_regulator *regulator,
return RT_EOK;
}

return rt_regulator_set_voltage_triplet(regulator, min_uvolt, target_uvolt,
max_uvolt);
if (rt_regulator_is_supported_voltage(regulator, min_uvolt, max_uvolt))
{
return rt_regulator_set_voltage_triplet(regulator, min_uvolt, target_uvolt,
max_uvolt);
}

/*
* gpio regulator may declare min above the SDHCI nominal range
* (e.g. 1.8V only) while still supporting the target voltage.
*/
if (rt_regulator_is_supported_voltage(regulator, target_uvolt, target_uvolt))
{
return rt_regulator_set_voltage(regulator, target_uvolt, target_uvolt);
}

return -RT_EINVAL;
}

rt_err_t sdio_regulator_set_vqmmc(struct rt_mmcsd_host *host,
struct rt_mmcsd_io_cfg *ios)
struct rt_mmcsd_io_cfg *ios)
{
rt_err_t err;
int uvolt, min_uvolt, max_uvolt;
Expand All @@ -126,11 +156,11 @@ rt_err_t sdio_regulator_set_vqmmc(struct rt_mmcsd_host *host,
{
case MMCSD_SIGNAL_VOLTAGE_120:
return regulator_set_voltage_if_supported(host->supply.vqmmc,
1100000, 1200000, 1300000);
1100000, 1200000, 1300000);

case MMCSD_SIGNAL_VOLTAGE_180:
return regulator_set_voltage_if_supported(host->supply.vqmmc,
1700000, 1800000, 1950000);
1700000, 1800000, 1950000);

case MMCSD_SIGNAL_VOLTAGE_330:
err = ocrbitnum_to_vdd(host->io_cfg.vdd, &uvolt, &max_uvolt);
Expand All @@ -144,14 +174,14 @@ rt_err_t sdio_regulator_set_vqmmc(struct rt_mmcsd_host *host,
max_uvolt = rt_min(max_uvolt + 200000, 3600000);

err = regulator_set_voltage_if_supported(host->supply.vqmmc,
min_uvolt, uvolt, max_uvolt);
min_uvolt, uvolt, max_uvolt);
if (err >= 0)
{
return err;
}

return regulator_set_voltage_if_supported(host->supply.vqmmc,
2700000, uvolt, 3600000);
2700000, uvolt, 3600000);

default:
return -RT_EINVAL;
Expand Down
Loading
Loading