power: regulator: Add a driver for the AXP USB power supply

This driver reports the presence/absence of voltage on the PMIC's USB
VBUS pin. This information is used by the USB PHY driver. The
corresponding Linux driver uses the power supply class, which does not
exist in U-Boot. UCLASS_REGULATOR seems to be the closest match.

Signed-off-by: Samuel Holland <samuel@sholland.org>
Acked-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
This commit is contained in:
Samuel Holland 2023-01-22 17:46:20 -06:00 committed by Andre Przywara
parent 2a6805b5fa
commit ee6a678263
3 changed files with 57 additions and 0 deletions

View file

@ -57,6 +57,13 @@ config SPL_REGULATOR_AXP
Enable support in SPL for the regulators (DCDCs, LDOs) in the Enable support in SPL for the regulators (DCDCs, LDOs) in the
X-Powers AXP152, AXP2xx, and AXP8xx PMICs. X-Powers AXP152, AXP2xx, and AXP8xx PMICs.
config REGULATOR_AXP_USB_POWER
bool "Enable driver for X-Powers AXP PMIC USB power supply"
depends on DM_REGULATOR && PMIC_AXP
help
Enable support for reading the USB power supply status from
X-Powers AXP2xx and AXP8xx PMICs.
config DM_REGULATOR_BD71837 config DM_REGULATOR_BD71837
bool "Enable Driver Model for ROHM BD71837/BD71847 regulators" bool "Enable Driver Model for ROHM BD71837/BD71847 regulators"
depends on DM_REGULATOR && DM_PMIC_BD71837 depends on DM_REGULATOR && DM_PMIC_BD71837

View file

@ -8,6 +8,7 @@ obj-$(CONFIG_$(SPL_)DM_REGULATOR) += regulator-uclass.o
obj-$(CONFIG_REGULATOR_ACT8846) += act8846.o obj-$(CONFIG_REGULATOR_ACT8846) += act8846.o
obj-$(CONFIG_REGULATOR_AS3722) += as3722_regulator.o obj-$(CONFIG_REGULATOR_AS3722) += as3722_regulator.o
obj-$(CONFIG_$(SPL_)REGULATOR_AXP) += axp_regulator.o obj-$(CONFIG_$(SPL_)REGULATOR_AXP) += axp_regulator.o
obj-$(CONFIG_$(SPL_)REGULATOR_AXP_USB_POWER) += axp_usb_power.o
obj-$(CONFIG_$(SPL_)DM_REGULATOR_DA9063) += da9063.o obj-$(CONFIG_$(SPL_)DM_REGULATOR_DA9063) += da9063.o
obj-$(CONFIG_DM_REGULATOR_MAX77686) += max77686.o obj-$(CONFIG_DM_REGULATOR_MAX77686) += max77686.o
obj-$(CONFIG_DM_REGULATOR_NPCM8XX) += npcm8xx_regulator.o obj-$(CONFIG_DM_REGULATOR_NPCM8XX) += npcm8xx_regulator.o

View file

@ -0,0 +1,49 @@
// SPDX-License-Identifier: GPL-2.0+
#include <dm/device.h>
#include <errno.h>
#include <power/pmic.h>
#include <power/regulator.h>
#define AXP_POWER_STATUS 0x00
#define AXP_POWER_STATUS_VBUS_PRESENT BIT(5)
static int axp_usb_power_get_enable(struct udevice *dev)
{
int ret;
ret = pmic_reg_read(dev->parent, AXP_POWER_STATUS);
if (ret < 0)
return ret;
return !!(ret & AXP_POWER_STATUS_VBUS_PRESENT);
}
static const struct dm_regulator_ops axp_usb_power_ops = {
.get_enable = axp_usb_power_get_enable,
};
static int axp_usb_power_probe(struct udevice *dev)
{
struct dm_regulator_uclass_plat *uc_plat = dev_get_uclass_plat(dev);
uc_plat->type = REGULATOR_TYPE_FIXED;
return 0;
}
static const struct udevice_id axp_usb_power_ids[] = {
{ .compatible = "x-powers,axp202-usb-power-supply" },
{ .compatible = "x-powers,axp221-usb-power-supply" },
{ .compatible = "x-powers,axp223-usb-power-supply" },
{ .compatible = "x-powers,axp813-usb-power-supply" },
{ }
};
U_BOOT_DRIVER(axp_usb_power) = {
.name = "axp_usb_power",
.id = UCLASS_REGULATOR,
.of_match = axp_usb_power_ids,
.probe = axp_usb_power_probe,
.ops = &axp_usb_power_ops,
};