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