diff options
Diffstat (limited to 'drivers/rtc')
-rw-r--r-- | drivers/rtc/Makefile | 6 | ||||
-rw-r--r-- | drivers/rtc/rv3028.c | 32 |
2 files changed, 35 insertions, 3 deletions
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 03a424c31a5..99b5a2a346a 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -4,7 +4,7 @@ # Wolfgang Denk, DENX Software Engineering, wd@denx.de. #ccflags-y += -DDEBUG -obj-$(CONFIG_$(SPL_TPL_)DM_RTC) += rtc-uclass.o +obj-$(CONFIG_$(PHASE_)DM_RTC) += rtc-uclass.o obj-$(CONFIG_RTC_ARMADA38X) += armada38x.o obj-$(CONFIG_RTC_DAVINCI) += davinci.o @@ -17,7 +17,7 @@ obj-$(CONFIG_RTC_DS3232) += ds3232.o obj-$(CONFIG_RTC_EMULATION) += emul_rtc.o obj-$(CONFIG_RTC_GOLDFISH) += goldfish_rtc.o obj-$(CONFIG_RTC_HT1380) += ht1380.o -obj-$(CONFIG_$(SPL_TPL_)RTC_SANDBOX) += i2c_rtc_emul.o +obj-$(CONFIG_$(PHASE_)RTC_SANDBOX) += i2c_rtc_emul.o obj-$(CONFIG_RTC_ISL1208) += isl1208.o obj-$(CONFIG_RTC_M41T62) += m41t62.o obj-$(CONFIG_RTC_MAX313XX) += max313xx.o @@ -37,6 +37,6 @@ obj-$(CONFIG_RTC_RX8025) += rx8025.o obj-$(CONFIG_RTC_RX8010SJ) += rx8010sj.o obj-$(CONFIG_RTC_S35392A) += s35392a.o obj-$(CONFIG_RTC_STM32) += stm32_rtc.o -obj-$(CONFIG_$(SPL_TPL_)RTC_SANDBOX) += sandbox_rtc.o +obj-$(CONFIG_$(PHASE_)RTC_SANDBOX) += sandbox_rtc.o obj-$(CONFIG_RTC_ABX80X) += abx80x.o obj-$(CONFIG_RTC_ZYNQMP) += zynqmp_rtc.o diff --git a/drivers/rtc/rv3028.c b/drivers/rtc/rv3028.c index 9f63afc14a8..b14d2a246ff 100644 --- a/drivers/rtc/rv3028.c +++ b/drivers/rtc/rv3028.c @@ -12,6 +12,9 @@ #include <dm.h> #include <i2c.h> #include <rtc.h> +#include <dm/device_compat.h> +#include <linux/delay.h> +#include <power/regulator.h> #define RV3028_SEC 0x00 #define RV3028_MIN 0x01 @@ -78,6 +81,12 @@ #define RTC_RV3028_LEN 7 +#define VDD_START_TIME_US 200000 + +struct rv3028_priv { + struct udevice *vdd; +}; + static int rv3028_rtc_get(struct udevice *dev, struct rtc_time *tm) { u8 regs[RTC_RV3028_LEN]; @@ -180,6 +189,28 @@ static int rv3028_rtc_write8(struct udevice *dev, unsigned int reg, int val) static int rv3028_probe(struct udevice *dev) { + struct rv3028_priv *priv = dev_get_priv(dev); + int ret; + + if (IS_ENABLED(CONFIG_DM_REGULATOR)) { + ret = device_get_supply_regulator(dev, "vdd-supply", &priv->vdd); + if (ret && ret != -ENOENT) { + dev_err(dev, "Warning: cannot get VDD supply\n"); + return ret; + } + + if (priv->vdd) { + ret = regulator_set_enable_if_allowed(priv->vdd, true); + if (ret) { + dev_err(dev, "failed to enable vdd-supply\n"); + return ret; + } + + /* We must wait Tstart = 0.2s before access to I2C */ + udelay(VDD_START_TIME_US); + } + } + i2c_set_chip_flags(dev, DM_I2C_CHIP_RD_ADDRESS | DM_I2C_CHIP_WR_ADDRESS); @@ -205,4 +236,5 @@ U_BOOT_DRIVER(rtc_rv3028) = { .probe = rv3028_probe, .of_match = rv3028_rtc_ids, .ops = &rv3028_rtc_ops, + .priv_auto = sizeof(struct rv3028_priv), }; |