mmc_fdt_helper: Add mmc_fdt_set_power

This helper can be used to enable/disable the regulator and starting
the power sequence of sd/sdio/eMMC cards.

Sponsored by:	Diablotin Systems
Differential Revision:	https://reviews.freebsd.org/D30291
This commit is contained in:
Emmanuel Vadot 2021-05-16 16:18:46 +02:00
parent 182717da88
commit 03d4e8bb65
2 changed files with 43 additions and 0 deletions

View file

@ -45,6 +45,8 @@ __FBSDID("$FreeBSD$");
#include <dev/extres/regulator/regulator.h>
#endif
#include "mmc_pwrseq_if.h"
static inline void
mmc_fdt_parse_sd_speed(phandle_t node, struct mmc_host *host)
{
@ -423,3 +425,43 @@ mmc_fdt_gpio_get_readonly(struct mmc_fdt_helper *helper)
return (pinstate ^ (helper->props & MMC_PROP_WP_INVERTED));
}
void
mmc_fdt_set_power(struct mmc_fdt_helper *helper, enum mmc_power_mode power_mode)
{
int reg_status;
int rv;
switch (power_mode) {
case power_on:
break;
case power_off:
if (helper->vmmc_supply) {
rv = regulator_status(helper->vmmc_supply, &reg_status);
if (rv == 0 && reg_status == REGULATOR_STATUS_ENABLED)
regulator_disable(helper->vmmc_supply);
}
if (helper->vqmmc_supply) {
rv = regulator_status(helper->vqmmc_supply, &reg_status);
if (rv == 0 && reg_status == REGULATOR_STATUS_ENABLED)
regulator_disable(helper->vqmmc_supply);
}
if (helper->mmc_pwrseq)
MMC_PWRSEQ_SET_POWER(helper->mmc_pwrseq, false);
break;
case power_up:
if (helper->vmmc_supply) {
rv = regulator_status(helper->vmmc_supply, &reg_status);
if (rv == 0 && reg_status != REGULATOR_STATUS_ENABLED)
regulator_enable(helper->vmmc_supply);
}
if (helper->vqmmc_supply) {
rv = regulator_status(helper->vqmmc_supply, &reg_status);
if (rv == 0 && reg_status != REGULATOR_STATUS_ENABLED)
regulator_enable(helper->vqmmc_supply);
}
if (helper->mmc_pwrseq)
MMC_PWRSEQ_SET_POWER(helper->mmc_pwrseq, true);
break;
}
}

View file

@ -74,5 +74,6 @@ int mmc_fdt_gpio_setup(device_t dev, phandle_t node, struct mmc_fdt_helper *help
void mmc_fdt_gpio_teardown(struct mmc_fdt_helper *helper);
bool mmc_fdt_gpio_get_present(struct mmc_fdt_helper *helper);
bool mmc_fdt_gpio_get_readonly(struct mmc_fdt_helper *helper);
void mmc_fdt_set_power(struct mmc_fdt_helper *helper, enum mmc_power_mode power_mode);
#endif