Commit 322539a0 authored by Emmanuel Gil Peyrot's avatar Emmanuel Gil Peyrot Committed by Alexandre Belloni
Browse files

rtc: gamecube: Report low battery as invalid data



I haven’t been able to test this patch as all of my consoles have a
working RTC battery, but according to the documentation it should work
like that.

Signed-off-by: default avatarEmmanuel Gil Peyrot <linkmauve@linkmauve.fr>
Acked-by: Michael Ellerman <mpe@ellerman.id.au> (powerpc)
Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
Link: https://lore.kernel.org/r/20211215175501.6761-3-linkmauve@linkmauve.fr
parent 86559400
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -83,6 +83,10 @@
#define RTC_CONTROL0	0x21000c
#define RTC_CONTROL1	0x21000d

/* RTC flags */
#define RTC_CONTROL0_UNSTABLE_POWER	0x00000800
#define RTC_CONTROL0_LOW_BATTERY	0x00000200

struct priv {
	struct regmap *regmap;
	void __iomem *iob;
@@ -182,9 +186,35 @@ static int gamecube_rtc_set_time(struct device *dev, struct rtc_time *t)
	return regmap_write(d->regmap, RTC_COUNTER, timestamp - d->rtc_bias);
}

static int gamecube_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
{
	struct priv *d = dev_get_drvdata(dev);
	int value;
	int control0;
	int ret;

	switch (cmd) {
	case RTC_VL_READ:
		ret = regmap_read(d->regmap, RTC_CONTROL0, &control0);
		if (ret)
			return ret;

		value = 0;
		if (control0 & RTC_CONTROL0_UNSTABLE_POWER)
			value |= RTC_VL_DATA_INVALID;
		if (control0 & RTC_CONTROL0_LOW_BATTERY)
			value |= RTC_VL_BACKUP_LOW;
		return put_user(value, (unsigned int __user *)arg);

	default:
		return -ENOIOCTLCMD;
	}
}

static const struct rtc_class_ops gamecube_rtc_ops = {
	.read_time	= gamecube_rtc_read_time,
	.set_time	= gamecube_rtc_set_time,
	.ioctl		= gamecube_rtc_ioctl,
};

static int gamecube_rtc_read_offset_from_sram(struct priv *d)