Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 12a9ee3c authored by Krzysztof Helt's avatar Krzysztof Helt Committed by David S. Miller
Browse files

rtc-m48t59: shift zero year to 1968 on sparc (rev 2)



Shift the first year to 1968 for Sun SPARC machines.

Move this logic from platform specific files to rtc driver
as this fixes problems with calculating a century bit.

Signed-off-by: default avatarKrzysztof Helt <krzysztof.h1@wp.pl>
Tested-by: Alexander Beregalov
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent be376649
Loading
Loading
Loading
Loading
+4 −23
Original line number Original line Diff line number Diff line
@@ -119,35 +119,16 @@ static unsigned char mostek_read_byte(struct device *dev, u32 ofs)
{
{
	struct platform_device *pdev = to_platform_device(dev);
	struct platform_device *pdev = to_platform_device(dev);
	struct m48t59_plat_data *pdata = pdev->dev.platform_data;
	struct m48t59_plat_data *pdata = pdev->dev.platform_data;
	void __iomem *regs = pdata->ioaddr;

	unsigned char val = readb(regs + ofs);
	return readb(pdata->ioaddr + ofs);

	/* the year 0 is 1968 */
	if (ofs == pdata->offset + M48T59_YEAR) {
		val += 0x68;
		if ((val & 0xf) > 9)
			val += 6;
	}
	return val;
}
}


static void mostek_write_byte(struct device *dev, u32 ofs, u8 val)
static void mostek_write_byte(struct device *dev, u32 ofs, u8 val)
{
{
	struct platform_device *pdev = to_platform_device(dev);
	struct platform_device *pdev = to_platform_device(dev);
	struct m48t59_plat_data *pdata = pdev->dev.platform_data;
	struct m48t59_plat_data *pdata = pdev->dev.platform_data;
	void __iomem *regs = pdata->ioaddr;


	if (ofs == pdata->offset + M48T59_YEAR) {
	writeb(val, pdata->ioaddr + ofs);
		if (val < 0x68)
			val += 0x32;
		else
			val -= 0x68;
		if ((val & 0xf) > 9)
			val += 6;
		if ((val & 0xf0) > 0x9A)
			val += 0x60;
	}
	writeb(val, regs + ofs);
}
}


static struct m48t59_plat_data m48t59_data = {
static struct m48t59_plat_data m48t59_data = {
+5 −28
Original line number Original line Diff line number Diff line
@@ -503,39 +503,16 @@ static struct of_platform_driver bq4802_driver = {
static unsigned char mostek_read_byte(struct device *dev, u32 ofs)
static unsigned char mostek_read_byte(struct device *dev, u32 ofs)
{
{
	struct platform_device *pdev = to_platform_device(dev);
	struct platform_device *pdev = to_platform_device(dev);
	struct m48t59_plat_data *pdata = pdev->dev.platform_data;
	void __iomem *regs = (void __iomem *) pdev->resource[0].start;
	void __iomem *regs;
	unsigned char val;


	regs = (void __iomem *) pdev->resource[0].start;
	return readb(regs + ofs);
	val = readb(regs + ofs);

	/* the year 0 is 1968 */
	if (ofs == pdata->offset + M48T59_YEAR) {
		val += 0x68;
		if ((val & 0xf) > 9)
			val += 6;
	}
	return val;
}
}


static void mostek_write_byte(struct device *dev, u32 ofs, u8 val)
static void mostek_write_byte(struct device *dev, u32 ofs, u8 val)
{
{
	struct platform_device *pdev = to_platform_device(dev);
	struct platform_device *pdev = to_platform_device(dev);
	struct m48t59_plat_data *pdata = pdev->dev.platform_data;
	void __iomem *regs = (void __iomem *) pdev->resource[0].start;
	void __iomem *regs;


	regs = (void __iomem *) pdev->resource[0].start;
	if (ofs == pdata->offset + M48T59_YEAR) {
		if (val < 0x68)
			val += 0x32;
		else
			val -= 0x68;
		if ((val & 0xf) > 9)
			val += 6;
		if ((val & 0xf0) > 0x9A)
			val += 0x60;
	}
	writeb(val, regs + ofs);
	writeb(val, regs + ofs);
}
}


+30 −4
Original line number Original line Diff line number Diff line
@@ -87,6 +87,10 @@ static int m48t59_rtc_read_time(struct device *dev, struct rtc_time *tm)
		dev_dbg(dev, "Century bit is enabled\n");
		dev_dbg(dev, "Century bit is enabled\n");
		tm->tm_year += 100;	/* one century */
		tm->tm_year += 100;	/* one century */
	}
	}
#ifdef CONFIG_SPARC
	/* Sun SPARC machines count years since 1968 */
	tm->tm_year += 68;
#endif


	tm->tm_wday	= bcd2bin(val & 0x07);
	tm->tm_wday	= bcd2bin(val & 0x07);
	tm->tm_hour	= bcd2bin(M48T59_READ(M48T59_HOUR) & 0x3F);
	tm->tm_hour	= bcd2bin(M48T59_READ(M48T59_HOUR) & 0x3F);
@@ -110,11 +114,20 @@ static int m48t59_rtc_set_time(struct device *dev, struct rtc_time *tm)
	struct m48t59_private *m48t59 = platform_get_drvdata(pdev);
	struct m48t59_private *m48t59 = platform_get_drvdata(pdev);
	unsigned long flags;
	unsigned long flags;
	u8 val = 0;
	u8 val = 0;
	int year = tm->tm_year;

#ifdef CONFIG_SPARC
	/* Sun SPARC machines count years since 1968 */
	year -= 68;
#endif


	dev_dbg(dev, "RTC set time %04d-%02d-%02d %02d/%02d/%02d\n",
	dev_dbg(dev, "RTC set time %04d-%02d-%02d %02d/%02d/%02d\n",
		tm->tm_year + 1900, tm->tm_mon, tm->tm_mday,
		year + 1900, tm->tm_mon, tm->tm_mday,
		tm->tm_hour, tm->tm_min, tm->tm_sec);
		tm->tm_hour, tm->tm_min, tm->tm_sec);


	if (year < 0)
		return -EINVAL;

	spin_lock_irqsave(&m48t59->lock, flags);
	spin_lock_irqsave(&m48t59->lock, flags);
	/* Issue the WRITE command */
	/* Issue the WRITE command */
	M48T59_SET_BITS(M48T59_CNTL_WRITE, M48T59_CNTL);
	M48T59_SET_BITS(M48T59_CNTL_WRITE, M48T59_CNTL);
@@ -125,9 +138,9 @@ static int m48t59_rtc_set_time(struct device *dev, struct rtc_time *tm)
	M48T59_WRITE((bin2bcd(tm->tm_mday) & 0x3F), M48T59_MDAY);
	M48T59_WRITE((bin2bcd(tm->tm_mday) & 0x3F), M48T59_MDAY);
	/* tm_mon is 0-11 */
	/* tm_mon is 0-11 */
	M48T59_WRITE((bin2bcd(tm->tm_mon + 1) & 0x1F), M48T59_MONTH);
	M48T59_WRITE((bin2bcd(tm->tm_mon + 1) & 0x1F), M48T59_MONTH);
	M48T59_WRITE(bin2bcd(tm->tm_year % 100), M48T59_YEAR);
	M48T59_WRITE(bin2bcd(year % 100), M48T59_YEAR);


	if (pdata->type == M48T59RTC_TYPE_M48T59 && (tm->tm_year / 100))
	if (pdata->type == M48T59RTC_TYPE_M48T59 && (year / 100))
		val = (M48T59_WDAY_CEB | M48T59_WDAY_CB);
		val = (M48T59_WDAY_CEB | M48T59_WDAY_CB);
	val |= (bin2bcd(tm->tm_wday) & 0x07);
	val |= (bin2bcd(tm->tm_wday) & 0x07);
	M48T59_WRITE(val, M48T59_WDAY);
	M48T59_WRITE(val, M48T59_WDAY);
@@ -159,6 +172,10 @@ static int m48t59_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
	M48T59_SET_BITS(M48T59_CNTL_READ, M48T59_CNTL);
	M48T59_SET_BITS(M48T59_CNTL_READ, M48T59_CNTL);


	tm->tm_year = bcd2bin(M48T59_READ(M48T59_YEAR));
	tm->tm_year = bcd2bin(M48T59_READ(M48T59_YEAR));
#ifdef CONFIG_SPARC
	/* Sun SPARC machines count years since 1968 */
	tm->tm_year += 68;
#endif
	/* tm_mon is 0-11 */
	/* tm_mon is 0-11 */
	tm->tm_mon = bcd2bin(M48T59_READ(M48T59_MONTH)) - 1;
	tm->tm_mon = bcd2bin(M48T59_READ(M48T59_MONTH)) - 1;


@@ -192,11 +209,20 @@ static int m48t59_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
	struct rtc_time *tm = &alrm->time;
	struct rtc_time *tm = &alrm->time;
	u8 mday, hour, min, sec;
	u8 mday, hour, min, sec;
	unsigned long flags;
	unsigned long flags;
	int year = tm->tm_year;

#ifdef CONFIG_SPARC
	/* Sun SPARC machines count years since 1968 */
	year -= 68;
#endif


	/* If no irq, we don't support ALARM */
	/* If no irq, we don't support ALARM */
	if (m48t59->irq == NO_IRQ)
	if (m48t59->irq == NO_IRQ)
		return -EIO;
		return -EIO;


	if (year < 0)
		return -EINVAL;

	/*
	/*
	 * 0xff means "always match"
	 * 0xff means "always match"
	 */
	 */
@@ -228,7 +254,7 @@ static int m48t59_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
	spin_unlock_irqrestore(&m48t59->lock, flags);
	spin_unlock_irqrestore(&m48t59->lock, flags);


	dev_dbg(dev, "RTC set alarm time %04d-%02d-%02d %02d/%02d/%02d\n",
	dev_dbg(dev, "RTC set alarm time %04d-%02d-%02d %02d/%02d/%02d\n",
		tm->tm_year + 1900, tm->tm_mon, tm->tm_mday,
		year + 1900, tm->tm_mon, tm->tm_mday,
		tm->tm_hour, tm->tm_min, tm->tm_sec);
		tm->tm_hour, tm->tm_min, tm->tm_sec);
	return 0;
	return 0;
}
}