Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save FlyGoat/3dd94d3bf55716fdc3c14f8bd9d80289 to your computer and use it in GitHub Desktop.
Save FlyGoat/3dd94d3bf55716fdc3c14f8bd9d80289 to your computer and use it in GitHub Desktop.
ls1x RTC fix
From 20d76cab4ab707325b42629ecebe34b9b5cb603a Mon Sep 17 00:00:00 2001
From: Jiaxun Yang <jiaxun.yang@flygoat.com>
Date: Mon, 24 Dec 2018 11:26:48 +0800
Subject: [PATCH] drivers/rtc/ls1x: Prevent RTC irq block whole system
Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
---
drivers/rtc/rtc-ls1x-toy.c | 5 +++++
drivers/rtc/rtc-ls1x.c | 11 +++++++++++
2 files changed, 16 insertions(+)
diff --git a/drivers/rtc/rtc-ls1x-toy.c b/drivers/rtc/rtc-ls1x-toy.c
index 274085ef..1bb2bb99 100644
--- a/drivers/rtc/rtc-ls1x-toy.c
+++ b/drivers/rtc/rtc-ls1x-toy.c
@@ -173,6 +173,11 @@ static int ls1x_rtc_probe(struct platform_device *pdev)
while (readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_TTS)
usleep_range(1000, 3000);
+ /* Clear TOYMATCHs to prevent irq block whole system */
+ writel(0x0, SYS_TOYMATCH0);
+ writel(0x0, SYS_TOYMATCH1);
+ writel(0x0, SYS_TOYMATCH2);
+
rtcdev = devm_rtc_device_register(&pdev->dev, "ls1x-toy",
&ls1x_rtc_ops , THIS_MODULE);
if (IS_ERR(rtcdev)) {
diff --git a/drivers/rtc/rtc-ls1x.c b/drivers/rtc/rtc-ls1x.c
index ca0b0224..31ae8843 100644
--- a/drivers/rtc/rtc-ls1x.c
+++ b/drivers/rtc/rtc-ls1x.c
@@ -189,6 +189,8 @@ static irqreturn_t ls1x_rtc0_handler(int irq, void *rtc)
events |= RTC_IRQF | RTC_AF;
rtc_update_irq(rtc, 1, events);
+ writel(0x0, SYS_RTCMATCH0);
+
return IRQ_HANDLED;
}
@@ -199,6 +201,8 @@ static irqreturn_t ls1x_rtc1_handler(int irq, void *rtc)
events |= RTC_IRQF | RTC_AF;
rtc_update_irq(rtc, 1, events);
+ writel(0x0, SYS_RTCMATCH1);
+
return IRQ_HANDLED;
}
@@ -209,6 +213,8 @@ static irqreturn_t ls1x_rtc2_handler(int irq, void *rtc)
events |= RTC_IRQF | RTC_AF;
rtc_update_irq(rtc, 1, events);
+ writel(0x0, SYS_RTCMATCH2);
+
return IRQ_HANDLED;
}
@@ -268,6 +274,11 @@ static int ls1x_rtc_probe(struct platform_device *pdev)
goto err;
}
+ /* Clear RTCMATCHs to prevent irq block whole system */
+ writel(0x0, SYS_RTCMATCH0);
+ writel(0x0, SYS_RTCMATCH1);
+ writel(0x0, SYS_RTCMATCH2);
+
platform_set_drvdata(pdev, rtcdev);
for (i = 0; i < 4; i++) {
--
2.19.2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment