Implement procfs interface for polling battery status of the RTC via /proc/driver/rtc . Signed-off-by: Marek Vasut <marex@xxxxxxx> Cc: Alexandre Belloni <alexandre.belloni@xxxxxxxxxxxxxxxxxx> --- drivers/rtc/rtc-abx80x.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index 73830670a41f..4fab024fb508 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c @@ -78,6 +78,10 @@ #define ABX8XX_REG_ID0 0x28 +#define ABX8XX_REG_ANA_STATUS 0x2f +#define ABX8XX_ANA_BREFD BIT(7) +#define ABX8XX_ANA_BMIN BIT(6) + #define ABX8XX_REG_OUT_CTRL 0x30 #define ABX8XX_OUT_CTRL_EXDS BIT(4) @@ -548,6 +552,25 @@ static int abx80x_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) } } +static int abx80x_proc(struct device *dev, struct seq_file *seq) +{ + struct i2c_client *client = to_i2c_client(dev); + int status, tmp; + + status = i2c_smbus_read_byte_data(client, ABX8XX_REG_ANA_STATUS); + if (status < 0) + return status; + + if (status & ABX8XX_ANA_BREFD) + seq_printf(seq, "battery\t\t: ok\n"); + else if (status & ABX8XX_ANA_BMIN) + seq_printf(seq, "battery\t\t: low\n"); + else + seq_printf(seq, "battery\t\t: exhausted\n"); + + return 0; +} + static const struct rtc_class_ops abx80x_rtc_ops = { .read_time = abx80x_rtc_read_time, .set_time = abx80x_rtc_set_time, @@ -555,6 +578,7 @@ static const struct rtc_class_ops abx80x_rtc_ops = { .set_alarm = abx80x_set_alarm, .alarm_irq_enable = abx80x_alarm_irq_enable, .ioctl = abx80x_ioctl, + .proc = abx80x_proc, }; static int abx80x_dt_trickle_cfg(struct device_node *np) -- 2.20.1