xref: /openbmc/linux/drivers/rtc/rtc-mt2712.c (revision cdd38c5f1ce4398ec58fec95904b75824daab7b5)
164823360SRan Bi // SPDX-License-Identifier: GPL-2.0
264823360SRan Bi /*
364823360SRan Bi  * Copyright (c) 2019 MediaTek Inc.
464823360SRan Bi  * Author: Ran Bi <ran.bi@mediatek.com>
564823360SRan Bi  */
664823360SRan Bi 
764823360SRan Bi #include <linux/delay.h>
864823360SRan Bi #include <linux/init.h>
964823360SRan Bi #include <linux/io.h>
1064823360SRan Bi #include <linux/irqdomain.h>
1164823360SRan Bi #include <linux/module.h>
1264823360SRan Bi #include <linux/of_address.h>
1364823360SRan Bi #include <linux/of_irq.h>
1464823360SRan Bi #include <linux/platform_device.h>
1564823360SRan Bi #include <linux/rtc.h>
1664823360SRan Bi 
1764823360SRan Bi #define MT2712_BBPU		0x0000
1864823360SRan Bi #define MT2712_BBPU_CLRPKY	BIT(4)
1964823360SRan Bi #define MT2712_BBPU_RELOAD	BIT(5)
2064823360SRan Bi #define MT2712_BBPU_CBUSY	BIT(6)
2164823360SRan Bi #define MT2712_BBPU_KEY		(0x43 << 8)
2264823360SRan Bi 
2364823360SRan Bi #define MT2712_IRQ_STA		0x0004
2464823360SRan Bi #define MT2712_IRQ_STA_AL	BIT(0)
2564823360SRan Bi #define MT2712_IRQ_STA_TC	BIT(1)
2664823360SRan Bi 
2764823360SRan Bi #define MT2712_IRQ_EN		0x0008
2864823360SRan Bi #define MT2712_IRQ_EN_AL	BIT(0)
2964823360SRan Bi #define MT2712_IRQ_EN_TC	BIT(1)
3064823360SRan Bi #define MT2712_IRQ_EN_ONESHOT	BIT(2)
3164823360SRan Bi 
3264823360SRan Bi #define MT2712_CII_EN		0x000c
3364823360SRan Bi 
3464823360SRan Bi #define MT2712_AL_MASK		0x0010
3564823360SRan Bi #define MT2712_AL_MASK_DOW	BIT(4)
3664823360SRan Bi 
3764823360SRan Bi #define MT2712_TC_SEC		0x0014
3864823360SRan Bi #define MT2712_TC_MIN		0x0018
3964823360SRan Bi #define MT2712_TC_HOU		0x001c
4064823360SRan Bi #define MT2712_TC_DOM		0x0020
4164823360SRan Bi #define MT2712_TC_DOW		0x0024
4264823360SRan Bi #define MT2712_TC_MTH		0x0028
4364823360SRan Bi #define MT2712_TC_YEA		0x002c
4464823360SRan Bi 
4564823360SRan Bi #define MT2712_AL_SEC		0x0030
4664823360SRan Bi #define MT2712_AL_MIN		0x0034
4764823360SRan Bi #define MT2712_AL_HOU		0x0038
4864823360SRan Bi #define MT2712_AL_DOM		0x003c
4964823360SRan Bi #define MT2712_AL_DOW		0x0040
5064823360SRan Bi #define MT2712_AL_MTH		0x0044
5164823360SRan Bi #define MT2712_AL_YEA		0x0048
5264823360SRan Bi 
5364823360SRan Bi #define MT2712_SEC_MASK		0x003f
5464823360SRan Bi #define MT2712_MIN_MASK		0x003f
5564823360SRan Bi #define MT2712_HOU_MASK		0x001f
5664823360SRan Bi #define MT2712_DOM_MASK		0x001f
5764823360SRan Bi #define MT2712_DOW_MASK		0x0007
5864823360SRan Bi #define MT2712_MTH_MASK		0x000f
5964823360SRan Bi #define MT2712_YEA_MASK		0x007f
6064823360SRan Bi 
6164823360SRan Bi #define MT2712_POWERKEY1	0x004c
6264823360SRan Bi #define MT2712_POWERKEY2	0x0050
6364823360SRan Bi #define MT2712_POWERKEY1_KEY	0xa357
6464823360SRan Bi #define MT2712_POWERKEY2_KEY	0x67d2
6564823360SRan Bi 
6664823360SRan Bi #define MT2712_CON0		0x005c
6764823360SRan Bi #define MT2712_CON1		0x0060
6864823360SRan Bi 
6964823360SRan Bi #define MT2712_PROT		0x0070
7064823360SRan Bi #define MT2712_PROT_UNLOCK1	0x9136
7164823360SRan Bi #define MT2712_PROT_UNLOCK2	0x586a
7264823360SRan Bi 
7364823360SRan Bi #define MT2712_WRTGR		0x0078
7464823360SRan Bi 
7564823360SRan Bi #define MT2712_RTC_TIMESTAMP_END_2127	4985971199LL
7664823360SRan Bi 
7764823360SRan Bi struct mt2712_rtc {
7864823360SRan Bi 	struct rtc_device	*rtc;
7964823360SRan Bi 	void __iomem		*base;
8064823360SRan Bi 	int			irq;
8164823360SRan Bi 	u8			irq_wake_enabled;
8264823360SRan Bi 	u8			powerlost;
8364823360SRan Bi };
8464823360SRan Bi 
mt2712_readl(struct mt2712_rtc * mt2712_rtc,u32 reg)8564823360SRan Bi static inline u32 mt2712_readl(struct mt2712_rtc *mt2712_rtc, u32 reg)
8664823360SRan Bi {
8764823360SRan Bi 	return readl(mt2712_rtc->base + reg);
8864823360SRan Bi }
8964823360SRan Bi 
mt2712_writel(struct mt2712_rtc * mt2712_rtc,u32 reg,u32 val)9064823360SRan Bi static inline void mt2712_writel(struct mt2712_rtc *mt2712_rtc,
9164823360SRan Bi 				 u32 reg, u32 val)
9264823360SRan Bi {
9364823360SRan Bi 	writel(val, mt2712_rtc->base + reg);
9464823360SRan Bi }
9564823360SRan Bi 
mt2712_rtc_write_trigger(struct mt2712_rtc * mt2712_rtc)9664823360SRan Bi static void mt2712_rtc_write_trigger(struct mt2712_rtc *mt2712_rtc)
9764823360SRan Bi {
9864823360SRan Bi 	unsigned long timeout = jiffies + HZ / 10;
9964823360SRan Bi 
10064823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_WRTGR, 1);
10164823360SRan Bi 	while (1) {
10264823360SRan Bi 		if (!(mt2712_readl(mt2712_rtc, MT2712_BBPU)
10364823360SRan Bi 					& MT2712_BBPU_CBUSY))
10464823360SRan Bi 			break;
10564823360SRan Bi 
10664823360SRan Bi 		if (time_after(jiffies, timeout)) {
10764823360SRan Bi 			dev_err(&mt2712_rtc->rtc->dev,
10864823360SRan Bi 				"%s time out!\n", __func__);
10964823360SRan Bi 			break;
11064823360SRan Bi 		}
11164823360SRan Bi 		cpu_relax();
11264823360SRan Bi 	}
11364823360SRan Bi }
11464823360SRan Bi 
mt2712_rtc_writeif_unlock(struct mt2712_rtc * mt2712_rtc)11564823360SRan Bi static void mt2712_rtc_writeif_unlock(struct mt2712_rtc *mt2712_rtc)
11664823360SRan Bi {
11764823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_PROT, MT2712_PROT_UNLOCK1);
11864823360SRan Bi 	mt2712_rtc_write_trigger(mt2712_rtc);
11964823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_PROT, MT2712_PROT_UNLOCK2);
12064823360SRan Bi 	mt2712_rtc_write_trigger(mt2712_rtc);
12164823360SRan Bi }
12264823360SRan Bi 
rtc_irq_handler_thread(int irq,void * data)12364823360SRan Bi static irqreturn_t rtc_irq_handler_thread(int irq, void *data)
12464823360SRan Bi {
12564823360SRan Bi 	struct mt2712_rtc *mt2712_rtc = data;
12664823360SRan Bi 	u16 irqsta;
12764823360SRan Bi 
12864823360SRan Bi 	/* Clear interrupt */
12964823360SRan Bi 	irqsta = mt2712_readl(mt2712_rtc, MT2712_IRQ_STA);
13064823360SRan Bi 	if (irqsta & MT2712_IRQ_STA_AL) {
13164823360SRan Bi 		rtc_update_irq(mt2712_rtc->rtc, 1, RTC_IRQF | RTC_AF);
13264823360SRan Bi 		return IRQ_HANDLED;
13364823360SRan Bi 	}
13464823360SRan Bi 
13564823360SRan Bi 	return IRQ_NONE;
13664823360SRan Bi }
13764823360SRan Bi 
__mt2712_rtc_read_time(struct mt2712_rtc * mt2712_rtc,struct rtc_time * tm,int * sec)13864823360SRan Bi static void __mt2712_rtc_read_time(struct mt2712_rtc *mt2712_rtc,
13964823360SRan Bi 				   struct rtc_time *tm, int *sec)
14064823360SRan Bi {
14164823360SRan Bi 	tm->tm_sec  = mt2712_readl(mt2712_rtc, MT2712_TC_SEC)
14264823360SRan Bi 			& MT2712_SEC_MASK;
14364823360SRan Bi 	tm->tm_min  = mt2712_readl(mt2712_rtc, MT2712_TC_MIN)
14464823360SRan Bi 			& MT2712_MIN_MASK;
14564823360SRan Bi 	tm->tm_hour = mt2712_readl(mt2712_rtc, MT2712_TC_HOU)
14664823360SRan Bi 			& MT2712_HOU_MASK;
14764823360SRan Bi 	tm->tm_mday = mt2712_readl(mt2712_rtc, MT2712_TC_DOM)
14864823360SRan Bi 			& MT2712_DOM_MASK;
14964823360SRan Bi 	tm->tm_mon  = (mt2712_readl(mt2712_rtc, MT2712_TC_MTH) - 1)
15064823360SRan Bi 			& MT2712_MTH_MASK;
15164823360SRan Bi 	tm->tm_year = (mt2712_readl(mt2712_rtc, MT2712_TC_YEA) + 100)
15264823360SRan Bi 			& MT2712_YEA_MASK;
15364823360SRan Bi 
15464823360SRan Bi 	*sec = mt2712_readl(mt2712_rtc, MT2712_TC_SEC) & MT2712_SEC_MASK;
15564823360SRan Bi }
15664823360SRan Bi 
mt2712_rtc_read_time(struct device * dev,struct rtc_time * tm)15764823360SRan Bi static int mt2712_rtc_read_time(struct device *dev, struct rtc_time *tm)
15864823360SRan Bi {
15964823360SRan Bi 	struct mt2712_rtc *mt2712_rtc = dev_get_drvdata(dev);
16064823360SRan Bi 	int sec;
16164823360SRan Bi 
16264823360SRan Bi 	if (mt2712_rtc->powerlost)
16364823360SRan Bi 		return -EINVAL;
16464823360SRan Bi 
16564823360SRan Bi 	do {
16664823360SRan Bi 		__mt2712_rtc_read_time(mt2712_rtc, tm, &sec);
16764823360SRan Bi 	} while (sec < tm->tm_sec);	/* SEC has carried */
16864823360SRan Bi 
16964823360SRan Bi 	return 0;
17064823360SRan Bi }
17164823360SRan Bi 
mt2712_rtc_set_time(struct device * dev,struct rtc_time * tm)17264823360SRan Bi static int mt2712_rtc_set_time(struct device *dev, struct rtc_time *tm)
17364823360SRan Bi {
17464823360SRan Bi 	struct mt2712_rtc *mt2712_rtc = dev_get_drvdata(dev);
17564823360SRan Bi 
17664823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_TC_SEC, tm->tm_sec  & MT2712_SEC_MASK);
17764823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_TC_MIN, tm->tm_min  & MT2712_MIN_MASK);
17864823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_TC_HOU, tm->tm_hour & MT2712_HOU_MASK);
17964823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_TC_DOM, tm->tm_mday & MT2712_DOM_MASK);
18064823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_TC_MTH,
18164823360SRan Bi 		      (tm->tm_mon + 1) & MT2712_MTH_MASK);
18264823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_TC_YEA,
18364823360SRan Bi 		      (tm->tm_year - 100) & MT2712_YEA_MASK);
18464823360SRan Bi 
18564823360SRan Bi 	mt2712_rtc_write_trigger(mt2712_rtc);
18664823360SRan Bi 
18764823360SRan Bi 	if (mt2712_rtc->powerlost)
18864823360SRan Bi 		mt2712_rtc->powerlost = false;
18964823360SRan Bi 
19064823360SRan Bi 	return 0;
19164823360SRan Bi }
19264823360SRan Bi 
mt2712_rtc_read_alarm(struct device * dev,struct rtc_wkalrm * alm)19364823360SRan Bi static int mt2712_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
19464823360SRan Bi {
19564823360SRan Bi 	struct mt2712_rtc *mt2712_rtc = dev_get_drvdata(dev);
19664823360SRan Bi 	struct rtc_time *tm = &alm->time;
19764823360SRan Bi 	u16 irqen;
19864823360SRan Bi 
19964823360SRan Bi 	irqen = mt2712_readl(mt2712_rtc, MT2712_IRQ_EN);
20064823360SRan Bi 	alm->enabled = !!(irqen & MT2712_IRQ_EN_AL);
20164823360SRan Bi 
20264823360SRan Bi 	tm->tm_sec  = mt2712_readl(mt2712_rtc, MT2712_AL_SEC) & MT2712_SEC_MASK;
20364823360SRan Bi 	tm->tm_min  = mt2712_readl(mt2712_rtc, MT2712_AL_MIN) & MT2712_MIN_MASK;
20464823360SRan Bi 	tm->tm_hour = mt2712_readl(mt2712_rtc, MT2712_AL_HOU) & MT2712_HOU_MASK;
20564823360SRan Bi 	tm->tm_mday = mt2712_readl(mt2712_rtc, MT2712_AL_DOM) & MT2712_DOM_MASK;
20664823360SRan Bi 	tm->tm_mon  = (mt2712_readl(mt2712_rtc, MT2712_AL_MTH) - 1)
20764823360SRan Bi 		      & MT2712_MTH_MASK;
20864823360SRan Bi 	tm->tm_year = (mt2712_readl(mt2712_rtc, MT2712_AL_YEA) + 100)
20964823360SRan Bi 		      & MT2712_YEA_MASK;
21064823360SRan Bi 
21164823360SRan Bi 	return 0;
21264823360SRan Bi }
21364823360SRan Bi 
mt2712_rtc_alarm_irq_enable(struct device * dev,unsigned int enabled)21464823360SRan Bi static int mt2712_rtc_alarm_irq_enable(struct device *dev,
21564823360SRan Bi 				       unsigned int enabled)
21664823360SRan Bi {
21764823360SRan Bi 	struct mt2712_rtc *mt2712_rtc = dev_get_drvdata(dev);
21864823360SRan Bi 	u16 irqen;
21964823360SRan Bi 
22064823360SRan Bi 	irqen = mt2712_readl(mt2712_rtc, MT2712_IRQ_EN);
22164823360SRan Bi 	if (enabled)
22264823360SRan Bi 		irqen |= MT2712_IRQ_EN_AL;
22364823360SRan Bi 	else
22464823360SRan Bi 		irqen &= ~MT2712_IRQ_EN_AL;
22564823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_IRQ_EN, irqen);
22664823360SRan Bi 	mt2712_rtc_write_trigger(mt2712_rtc);
22764823360SRan Bi 
22864823360SRan Bi 	return 0;
22964823360SRan Bi }
23064823360SRan Bi 
mt2712_rtc_set_alarm(struct device * dev,struct rtc_wkalrm * alm)23164823360SRan Bi static int mt2712_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
23264823360SRan Bi {
23364823360SRan Bi 	struct mt2712_rtc *mt2712_rtc = dev_get_drvdata(dev);
23464823360SRan Bi 	struct rtc_time *tm = &alm->time;
23564823360SRan Bi 
23664823360SRan Bi 	dev_dbg(&mt2712_rtc->rtc->dev, "set al time: %ptR, alm en: %d\n",
23764823360SRan Bi 		tm, alm->enabled);
23864823360SRan Bi 
23964823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_AL_SEC,
24064823360SRan Bi 		      (mt2712_readl(mt2712_rtc, MT2712_AL_SEC)
24164823360SRan Bi 		       & ~(MT2712_SEC_MASK)) | (tm->tm_sec  & MT2712_SEC_MASK));
24264823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_AL_MIN,
24364823360SRan Bi 		      (mt2712_readl(mt2712_rtc, MT2712_AL_MIN)
24464823360SRan Bi 		       & ~(MT2712_MIN_MASK)) | (tm->tm_min  & MT2712_MIN_MASK));
24564823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_AL_HOU,
24664823360SRan Bi 		      (mt2712_readl(mt2712_rtc, MT2712_AL_HOU)
24764823360SRan Bi 		       & ~(MT2712_HOU_MASK)) | (tm->tm_hour & MT2712_HOU_MASK));
24864823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_AL_DOM,
24964823360SRan Bi 		      (mt2712_readl(mt2712_rtc, MT2712_AL_DOM)
25064823360SRan Bi 		       & ~(MT2712_DOM_MASK)) | (tm->tm_mday & MT2712_DOM_MASK));
25164823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_AL_MTH,
25264823360SRan Bi 		      (mt2712_readl(mt2712_rtc, MT2712_AL_MTH)
25364823360SRan Bi 		       & ~(MT2712_MTH_MASK))
25464823360SRan Bi 		      | ((tm->tm_mon + 1) & MT2712_MTH_MASK));
25564823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_AL_YEA,
25664823360SRan Bi 		      (mt2712_readl(mt2712_rtc, MT2712_AL_YEA)
25764823360SRan Bi 		       & ~(MT2712_YEA_MASK))
25864823360SRan Bi 		      | ((tm->tm_year - 100) & MT2712_YEA_MASK));
25964823360SRan Bi 
26064823360SRan Bi 	/* mask day of week */
26164823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_AL_MASK, MT2712_AL_MASK_DOW);
26264823360SRan Bi 	mt2712_rtc_write_trigger(mt2712_rtc);
26364823360SRan Bi 
26464823360SRan Bi 	mt2712_rtc_alarm_irq_enable(dev, alm->enabled);
26564823360SRan Bi 
26664823360SRan Bi 	return 0;
26764823360SRan Bi }
26864823360SRan Bi 
26964823360SRan Bi /* Init RTC register */
mt2712_rtc_hw_init(struct mt2712_rtc * mt2712_rtc)27064823360SRan Bi static void mt2712_rtc_hw_init(struct mt2712_rtc *mt2712_rtc)
27164823360SRan Bi {
27264823360SRan Bi 	u32 p1, p2;
27364823360SRan Bi 
27464823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_BBPU,
27564823360SRan Bi 		      MT2712_BBPU_KEY | MT2712_BBPU_RELOAD);
27664823360SRan Bi 
27764823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_CII_EN, 0);
27864823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_AL_MASK, 0);
27964823360SRan Bi 	/* necessary before set MT2712_POWERKEY */
28064823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_CON0, 0x4848);
28164823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_CON1, 0x0048);
28264823360SRan Bi 
28364823360SRan Bi 	mt2712_rtc_write_trigger(mt2712_rtc);
28464823360SRan Bi 
28564823360SRan Bi 	p1 = mt2712_readl(mt2712_rtc, MT2712_POWERKEY1);
28664823360SRan Bi 	p2 = mt2712_readl(mt2712_rtc, MT2712_POWERKEY2);
28764823360SRan Bi 	if (p1 != MT2712_POWERKEY1_KEY || p2 != MT2712_POWERKEY2_KEY) {
28864823360SRan Bi 		mt2712_rtc->powerlost = true;
28964823360SRan Bi 		dev_dbg(&mt2712_rtc->rtc->dev,
29064823360SRan Bi 			"powerkey not set (lost power)\n");
29164823360SRan Bi 	} else {
29264823360SRan Bi 		mt2712_rtc->powerlost = false;
29364823360SRan Bi 	}
29464823360SRan Bi 
29564823360SRan Bi 	/* RTC need POWERKEY1/2 match, then goto normal work mode */
29664823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_POWERKEY1, MT2712_POWERKEY1_KEY);
29764823360SRan Bi 	mt2712_writel(mt2712_rtc, MT2712_POWERKEY2, MT2712_POWERKEY2_KEY);
29864823360SRan Bi 	mt2712_rtc_write_trigger(mt2712_rtc);
29964823360SRan Bi 
30064823360SRan Bi 	mt2712_rtc_writeif_unlock(mt2712_rtc);
30164823360SRan Bi }
30264823360SRan Bi 
30364823360SRan Bi static const struct rtc_class_ops mt2712_rtc_ops = {
30464823360SRan Bi 	.read_time	= mt2712_rtc_read_time,
30564823360SRan Bi 	.set_time	= mt2712_rtc_set_time,
30664823360SRan Bi 	.read_alarm	= mt2712_rtc_read_alarm,
30764823360SRan Bi 	.set_alarm	= mt2712_rtc_set_alarm,
30864823360SRan Bi 	.alarm_irq_enable = mt2712_rtc_alarm_irq_enable,
30964823360SRan Bi };
31064823360SRan Bi 
mt2712_rtc_probe(struct platform_device * pdev)31164823360SRan Bi static int mt2712_rtc_probe(struct platform_device *pdev)
31264823360SRan Bi {
31364823360SRan Bi 	struct mt2712_rtc *mt2712_rtc;
31464823360SRan Bi 	int ret;
31564823360SRan Bi 
31664823360SRan Bi 	mt2712_rtc = devm_kzalloc(&pdev->dev,
31764823360SRan Bi 				  sizeof(struct mt2712_rtc), GFP_KERNEL);
31864823360SRan Bi 	if (!mt2712_rtc)
31964823360SRan Bi 		return -ENOMEM;
32064823360SRan Bi 
32106030d50SAlexandre Belloni 	mt2712_rtc->base = devm_platform_ioremap_resource(pdev, 0);
32264823360SRan Bi 	if (IS_ERR(mt2712_rtc->base))
32364823360SRan Bi 		return PTR_ERR(mt2712_rtc->base);
32464823360SRan Bi 
32564823360SRan Bi 	/* rtc hw init */
32664823360SRan Bi 	mt2712_rtc_hw_init(mt2712_rtc);
32764823360SRan Bi 
32864823360SRan Bi 	mt2712_rtc->irq = platform_get_irq(pdev, 0);
329944ed452SMarkus Elfring 	if (mt2712_rtc->irq < 0)
33064823360SRan Bi 		return mt2712_rtc->irq;
33164823360SRan Bi 
33264823360SRan Bi 	platform_set_drvdata(pdev, mt2712_rtc);
33364823360SRan Bi 
33464823360SRan Bi 	mt2712_rtc->rtc = devm_rtc_allocate_device(&pdev->dev);
33564823360SRan Bi 	if (IS_ERR(mt2712_rtc->rtc))
33664823360SRan Bi 		return PTR_ERR(mt2712_rtc->rtc);
33764823360SRan Bi 
33864823360SRan Bi 	ret = devm_request_threaded_irq(&pdev->dev, mt2712_rtc->irq, NULL,
33964823360SRan Bi 					rtc_irq_handler_thread,
34064823360SRan Bi 					IRQF_ONESHOT | IRQF_TRIGGER_LOW,
34164823360SRan Bi 					dev_name(&mt2712_rtc->rtc->dev),
34264823360SRan Bi 					mt2712_rtc);
34364823360SRan Bi 	if (ret) {
34464823360SRan Bi 		dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
34564823360SRan Bi 			mt2712_rtc->irq, ret);
34664823360SRan Bi 		return ret;
34764823360SRan Bi 	}
34864823360SRan Bi 
34964823360SRan Bi 	device_init_wakeup(&pdev->dev, true);
35064823360SRan Bi 
35164823360SRan Bi 	mt2712_rtc->rtc->ops = &mt2712_rtc_ops;
35264823360SRan Bi 	mt2712_rtc->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
35364823360SRan Bi 	mt2712_rtc->rtc->range_max = MT2712_RTC_TIMESTAMP_END_2127;
35464823360SRan Bi 
355*fdcfd854SBartosz Golaszewski 	return devm_rtc_register_device(mt2712_rtc->rtc);
35664823360SRan Bi }
35764823360SRan Bi 
35864823360SRan Bi #ifdef CONFIG_PM_SLEEP
mt2712_rtc_suspend(struct device * dev)35964823360SRan Bi static int mt2712_rtc_suspend(struct device *dev)
36064823360SRan Bi {
36164823360SRan Bi 	int wake_status = 0;
36264823360SRan Bi 	struct mt2712_rtc *mt2712_rtc = dev_get_drvdata(dev);
36364823360SRan Bi 
36464823360SRan Bi 	if (device_may_wakeup(dev)) {
36564823360SRan Bi 		wake_status = enable_irq_wake(mt2712_rtc->irq);
36664823360SRan Bi 		if (!wake_status)
36764823360SRan Bi 			mt2712_rtc->irq_wake_enabled = true;
36864823360SRan Bi 	}
36964823360SRan Bi 
37064823360SRan Bi 	return 0;
37164823360SRan Bi }
37264823360SRan Bi 
mt2712_rtc_resume(struct device * dev)37364823360SRan Bi static int mt2712_rtc_resume(struct device *dev)
37464823360SRan Bi {
37564823360SRan Bi 	int wake_status = 0;
37664823360SRan Bi 	struct mt2712_rtc *mt2712_rtc = dev_get_drvdata(dev);
37764823360SRan Bi 
37864823360SRan Bi 	if (device_may_wakeup(dev) && mt2712_rtc->irq_wake_enabled) {
37964823360SRan Bi 		wake_status = disable_irq_wake(mt2712_rtc->irq);
38064823360SRan Bi 		if (!wake_status)
38164823360SRan Bi 			mt2712_rtc->irq_wake_enabled = false;
38264823360SRan Bi 	}
38364823360SRan Bi 
38464823360SRan Bi 	return 0;
38564823360SRan Bi }
38664823360SRan Bi 
38764823360SRan Bi static SIMPLE_DEV_PM_OPS(mt2712_pm_ops, mt2712_rtc_suspend,
38864823360SRan Bi 			 mt2712_rtc_resume);
38964823360SRan Bi #endif
39064823360SRan Bi 
39164823360SRan Bi static const struct of_device_id mt2712_rtc_of_match[] = {
39264823360SRan Bi 	{ .compatible = "mediatek,mt2712-rtc", },
39364823360SRan Bi 	{ },
39464823360SRan Bi };
39564823360SRan Bi 
39664823360SRan Bi MODULE_DEVICE_TABLE(of, mt2712_rtc_of_match);
39764823360SRan Bi 
39864823360SRan Bi static struct platform_driver mt2712_rtc_driver = {
39964823360SRan Bi 	.driver = {
40064823360SRan Bi 		.name = "mt2712-rtc",
40164823360SRan Bi 		.of_match_table = mt2712_rtc_of_match,
40230a79065SAlexandre Belloni #ifdef CONFIG_PM_SLEEP
40364823360SRan Bi 		.pm = &mt2712_pm_ops,
40430a79065SAlexandre Belloni #endif
40564823360SRan Bi 	},
40664823360SRan Bi 	.probe  = mt2712_rtc_probe,
40764823360SRan Bi };
40864823360SRan Bi 
40964823360SRan Bi module_platform_driver(mt2712_rtc_driver);
41064823360SRan Bi 
41164823360SRan Bi MODULE_DESCRIPTION("MediaTek MT2712 SoC based RTC Driver");
41264823360SRan Bi MODULE_AUTHOR("Ran Bi <ran.bi@mediatek.com>");
41364823360SRan Bi MODULE_LICENSE("GPL");
414