Hi Paul,
RTC Driver for Dialog Semiconductor DA9052 PMICs.
Changes made since last submission:
. read and write operation moved to MFD
Linux Kernel Version: 2.6.37
Signed-off-by: D. Chen <[email protected]>
---
diff -Naur orig_linux-2.6.37/drivers/rtc/Kconfig linux-2.6.37/drivers/rtc/Kconfig
--- orig_linux-2.6.37/drivers/rtc/Kconfig 2011-01-05 05:50:19.000000000 +0500
+++ linux-2.6.37/drivers/rtc/Kconfig 2011-03-31 21:07:39.000000000 +0500
@@ -664,6 +664,13 @@
help
If you say yes here you get support for the RTC subsystem of the
NUC910/NUC920 used in embedded systems.
+
+config RTC_DRV_DA9052
+ tristate "Dialog DA9052 RTC"
+ depends on PMIC_DA9052
+ help
+ Say y here to support the RTC driver for
+ Dialog Semiconductor DA9052 PMIC.
comment "on-CPU RTC drivers"
diff -Naur orig_linux-2.6.37/drivers/rtc/Makefile linux-2.6.37/drivers/rtc/Makefile
--- orig_linux-2.6.37/drivers/rtc/Makefile 2011-01-05 05:50:19.000000000 +0500
+++ linux-2.6.37/drivers/rtc/Makefile 2011-03-31 21:07:34.000000000 +0500
@@ -28,6 +28,7 @@
obj-$(CONFIG_RTC_DRV_BQ4802) += rtc-bq4802.o
obj-$(CONFIG_RTC_DRV_CMOS) += rtc-cmos.o
obj-$(CONFIG_RTC_DRV_COH901331) += rtc-coh901331.o
+obj-$(CONFIG_RTC_DRV_DA9052) += rtc-da9052.o
obj-$(CONFIG_RTC_DRV_DAVINCI) += rtc-davinci.o
obj-$(CONFIG_RTC_DRV_DM355EVM) += rtc-dm355evm.o
obj-$(CONFIG_RTC_DRV_DS1216) += rtc-ds1216.o
diff -Naur orig_linux-2.6.37/drivers/rtc/rtc-da9052.c linux-2.6.37/drivers/rtc/rtc-da9052.c
--- orig_linux-2.6.37/drivers/rtc/rtc-da9052.c 1970-01-01 05:00:00.000000000 +0500
+++ linux-2.6.37/drivers/rtc/rtc-da9052.c 2011-03-31 21:07:47.000000000 +0500
@@ -0,0 +1,338 @@
+/*
+ *rtc-da9052.c: Real time clock driver for DA9052
+ *
+ *Copyright(c) 2009 Dialog Semiconductor Ltd.
+ *
+ *Author: Dajun Chen <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ */
+
+#include <linux/platform_device.h>
+#include <linux/rtc.h>
+
+#include <linux/mfd/da9052/da9052.h>
+#include <linux/mfd/da9052/reg.h>
+
+struct da9052_rtc {
+ struct rtc_device *rtc;
+ struct da9052 *da9052;
+ int irq;
+};
+
+static int da9052_rtc_enable_alarm(struct da9052 *da9052, unsigned char flag)
+{
+ int ret = 0;
+ if (flag) {
+ ret = da9052_set_bits(da9052, DA9052_ALARM_Y_REG,
+ DA9052_ALARM_Y_ALARM_ON);
+ if (ret != 0)
+ dev_err(da9052->dev, "Failed to enable ALM: %d\n", ret);
+ } else {
+ ret = da9052_clear_bits(da9052, DA9052_ALARM_Y_REG,
+ DA9052_ALARM_Y_ALARM_ON);
+ if (ret != 0)
+ dev_err(da9052->dev, "da9052_rtc_enable_alarm -> \
+ da9052_clear_bits error %d\n", ret);
+ }
+ return ret;
+}
+
+static irqreturn_t da9052_rtc_irq(int irq, void *data)
+{
+ struct da9052_rtc *rtc = (struct da9052_rtc *)data;
+ int ret = 0;
+
+ ret = da9052_reg_read(rtc->da9052, DA9052_ALARM_MI_REG);
+ if (ret < 0) {
+ dev_err(rtc->da9052->dev, "da9052_rtc_notifier -> \
+ da9052_reg_read error %d\n", ret);
+ return IRQ_NONE;
+ }
+ if (ret & DA9052_ALARMMI_ALARMTYPE)
+ da9052_rtc_enable_alarm(rtc->da9052, 0);
+
+ return IRQ_HANDLED;
+}
+
+static int da9052_read_alarm(struct da9052 *da9052, struct rtc_time *rtc_tm)
+{
+
+ int ret = 0;
+ uint8_t v[5] = {0, 0, 0, 0, 0};
+ ret = da9052_group_read(da9052, DA9052_ALARM_MI_REG, 5, v);
+ if (ret != 0) {
+ dev_err(da9052->dev, "Failed to group read ALM: %d\n", ret);
+ return ret;
+ }
+
+ rtc_tm->tm_year = v[4] & DA9052_RTC_YEAR;
+ rtc_tm->tm_mon = v[3] & DA9052_RTC_MONTH;
+ rtc_tm->tm_mday = v[2] & DA9052_RTC_DAY;
+ rtc_tm->tm_hour = v[1] & DA9052_RTC_HOUR;
+ rtc_tm->tm_min = v[0] & DA9052_RTC_MIN;
+
+ ret = rtc_valid_tm(rtc_tm);
+ if (ret != 0)
+ return ret;
+
+ rtc_tm->tm_year += 100;
+ rtc_tm->tm_mon -= 1;
+
+ return ret;
+}
+
+static int da9052_set_alarm(struct da9052 *da9052, struct rtc_time *rtc_tm)
+{
+ int ret = 0;
+ uint8_t v[3] = {0, 0, 0};
+
+ rtc_tm->tm_sec = 0;
+ rtc_tm->tm_year -= 100;
+ rtc_tm->tm_mon += 1;
+
+ ret = rtc_valid_tm(rtc_tm);
+ if (ret)
+ return ret;
+
+ ret = da9052_reg_update(da9052, DA9052_ALARM_MI_REG,
+ DA9052_RTC_MIN, rtc_tm->tm_min);
+ if (ret != 0) {
+ dev_err(da9052->dev, "Failed to write ALRM MIN: %d\n", ret);
+ return ret;
+ }
+
+ ret = da9052_reg_update(da9052, DA9052_ALARM_Y_REG,
+ DA9052_RTC_YEAR, rtc_tm->tm_year);
+ if (ret != 0) {
+ dev_err(da9052->dev, "Failed to write ALRM YEAR: %d\n", ret);
+ return ret;
+ }
+
+ v[0] = rtc_tm->tm_hour;
+ v[1] = rtc_tm->tm_mday;
+ v[2] = rtc_tm->tm_mon;
+
+ return da9052_group_write(da9052, DA9052_ALARM_H_REG, 3, v);
+}
+
+static int da9052_rtc_get_alarm_status(struct da9052 *da9052)
+{
+ int ret = 0;
+ ret = da9052_reg_read(da9052, DA9052_ALARM_Y_REG);
+ if (ret < 0) {
+ dev_err(da9052->dev, "Failed to read ALM: %d\n", ret);
+ return ret;
+ }
+ ret &= DA9052_ALARM_Y_ALARM_ON;
+ return (ret > 0) ? 1 : 0;
+}
+
+static int da9052_rtc_read_time
+ (struct device *dev, struct rtc_time *rtc_tm)
+{
+ struct da9052_rtc *rtc = dev_get_drvdata(dev);
+ uint8_t v[6] = {0, 0, 0, 0, 0, 0};
+ int ret;
+
+ ret = da9052_group_read(rtc->da9052, DA9052_COUNT_S_REG, 6, v);
+ if (ret != 0) {
+ dev_err(rtc->da9052->dev, "Failed to read \
+ RTC time : %d\n", ret);
+ return ret;
+ }
+
+ rtc_tm->tm_year = v[5] & DA9052_RTC_YEAR;
+ rtc_tm->tm_mon = v[4] & DA9052_RTC_MONTH;
+ rtc_tm->tm_mday = v[3] & DA9052_RTC_DAY;
+ rtc_tm->tm_hour = v[2] & DA9052_RTC_HOUR;
+ rtc_tm->tm_min = v[1] & DA9052_RTC_MIN;
+ rtc_tm->tm_sec = v[0] & DA9052_RTC_SEC;
+
+ ret = rtc_valid_tm(rtc_tm);
+ if (ret != 0) {
+ dev_err(rtc->da9052->dev,
+ "da9052_rtc_read_time -> rtc_valid_tm failed %d\n", ret);
+ return ret;
+ }
+
+ rtc_tm->tm_year += 100;
+ rtc_tm->tm_mon -= 1;
+
+ return 0;
+}
+
+
+static int da9052_rtc_set_time(struct device *dev, struct rtc_time *tm)
+{
+ int ret;
+ struct da9052_rtc *rtc;
+ uint8_t v[6] = {0, 0, 0, 0, 0, 0};
+// struct rtc *rtc = dev_get_drvdata(dev);
+
+ rtc = dev_get_drvdata(dev);
+ // rtc->da9052 = rtc->dev.parent;
+
+
+ tm->tm_year -= 100;
+ tm->tm_mon += 1;
+
+ ret = rtc_valid_tm(tm);
+ if (ret != 0)
+ return ret;
+
+ v[0] = tm->tm_sec;
+ v[1] = tm->tm_min;
+ v[2] = tm->tm_hour;
+ v[3] = tm->tm_mday;
+ v[4] = tm->tm_mon;
+ v[5] = tm->tm_year;
+ return da9052_group_write(rtc->da9052, DA9052_COUNT_S_REG, 6, v);
+}
+
+static int da9052_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
+{
+ int ret = 0;
+ struct rtc_time *tm = &alrm->time;
+ struct da9052_rtc *rtc = dev_get_drvdata(dev);
+
+ ret = da9052_read_alarm(rtc->da9052, tm);
+
+ if (ret)
+ return ret;
+
+ alrm->enabled = da9052_rtc_get_alarm_status(rtc->da9052);
+
+ return 0;
+}
+
+static int da9052_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
+{
+ int ret = 0;
+ struct rtc_time *tm = &alrm->time;
+ struct da9052_rtc *rtc = dev_get_drvdata(dev);
+
+ ret = da9052_set_alarm(rtc->da9052, tm);
+
+ if (ret)
+ return ret;
+
+ ret = da9052_rtc_enable_alarm(rtc->da9052, 1);
+
+ return ret;
+}
+
+static int da9052_rtc_update_irq_enable(struct device *dev,
+ unsigned int enabled)
+{
+ struct da9052_rtc *rtc = dev_get_drvdata(dev);
+
+ if (enabled)
+ return da9052_set_bits(rtc->da9052, DA9052_ALARM_Y_REG,
+ DA9052_ALARM_Y_TICK_ON);
+ else
+ return da9052_clear_bits(rtc->da9052, DA9052_ALARM_Y_REG,
+ DA9052_ALARM_Y_TICK_ON);
+}
+
+static int da9052_rtc_alarm_irq_enable(struct device *dev,
+ unsigned int enabled)
+{
+ struct da9052_rtc *rtc = dev_get_drvdata(dev);
+
+ if (enabled)
+ return da9052_rtc_enable_alarm(rtc->da9052, enabled);
+ else
+ return da9052_rtc_enable_alarm(rtc->da9052, enabled);
+}
+
+static const struct rtc_class_ops da9052_rtc_ops = {
+ .read_time = da9052_rtc_read_time,
+ .set_time = da9052_rtc_set_time,
+ .read_alarm = da9052_rtc_read_alarm,
+ .set_alarm = da9052_rtc_set_alarm,
+ .update_irq_enable = da9052_rtc_update_irq_enable,
+ .alarm_irq_enable = da9052_rtc_alarm_irq_enable,
+};
+
+static int __devinit da9052_rtc_probe(struct platform_device *pdev)
+{
+ struct da9052_rtc *rtc;
+ int ret = 0;
+
+ rtc = kzalloc(sizeof(struct da9052_rtc), GFP_KERNEL);
+ if (!rtc)
+ return -ENOMEM;
+
+ rtc->da9052 = dev_get_drvdata(pdev->dev.parent);
+ rtc->irq = platform_get_irq_byname(pdev, "ALM");
+
+ ret = da9052_request_irq(rtc->da9052, rtc->irq,
+ da9052_rtc_irq, "ALM", rtc);
+ if (ret != 0) {
+ dev_err(rtc->da9052->dev,
+ "Da9052 RTC failed irq registration: %d\n", ret);
+ goto err_mem;
+ }
+
+ da9052_set_bits(rtc->da9052, DA9052_ALARM_Y_REG,
+ DA9052_ALARM_Y_TICK_ON);
+
+ rtc->rtc = rtc_device_register(pdev->name, &pdev->dev,
+ &da9052_rtc_ops, THIS_MODULE);
+ if (IS_ERR(rtc->rtc)) {
+ ret = PTR_ERR(rtc->rtc);
+ goto err_free_irq;
+ }
+
+ platform_set_drvdata(pdev, rtc);
+
+ return 0;
+
+err_free_irq:
+ da9052_free_irq(rtc->da9052, rtc->irq, NULL);
+err_mem:
+ kfree(rtc);
+ return ret;
+}
+
+static int __devexit da9052_rtc_remove(struct platform_device *pdev)
+{
+ struct da9052_rtc *rtc = pdev->dev.platform_data;
+
+ rtc_device_unregister(rtc->rtc);
+ da9052_free_irq(rtc->da9052, rtc->irq, NULL);
+ platform_set_drvdata(pdev, NULL);
+ kfree(rtc);
+
+ return 0;
+}
+
+static struct platform_driver da9052_rtc_driver = {
+ .driver.name = "da9052-rtc",
+ .driver.owner = THIS_MODULE,
+ .probe = da9052_rtc_probe,
+ .remove = __devexit_p(da9052_rtc_remove),
+};
+
+static int __init da9052_rtc_init(void)
+{
+ return platform_driver_register(&da9052_rtc_driver);
+}
+module_init(da9052_rtc_init);
+
+static void __exit da9052_rtc_exit(void)
+{
+ platform_driver_unregister(&da9052_rtc_driver);
+}
+module_exit(da9052_rtc_exit);
+
+MODULE_AUTHOR("Dialog Semiconductor Ltd <[email protected]>");
+MODULE_DESCRIPTION("RTC driver for Dialog DA9052 PMIC");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:da9052-rtc");
+
Regards,
Ashish
????{.n?+???????+%?????ݶ??w??{.n?+????{??G?????{ay?ʇڙ?,j??f???h?????????z_??(?階?ݢj"???m??????G????????????&???~???iO???z??v?^?m????????????I?
On Wed, 6 Apr 2011 18:47:29 +0530
Ashish Jangam <[email protected]> wrote:
> Hi Paul,
>
> RTC Driver for Dialog Semiconductor DA9052 PMICs.
>
> Changes made since last submission:
> . read and write operation moved to MFD
>
> Linux Kernel Version: 2.6.37
The patch looks OK(ish) to me from a quick read.
> --- orig_linux-2.6.37/drivers/rtc/Kconfig 2011-01-05 05:50:19.000000000 +0500
> +++ linux-2.6.37/drivers/rtc/Kconfig 2011-03-31 21:07:39.000000000 +0500
> @@ -664,6 +664,13 @@
> help
> If you say yes here you get support for the RTC subsystem of the
> NUC910/NUC920 used in embedded systems.
> +
> +config RTC_DRV_DA9052
> + tristate "Dialog DA9052 RTC"
> + depends on PMIC_DA9052
> + help
> + Say y here to support the RTC driver for
> + Dialog Semiconductor DA9052 PMIC.
But there's not much I can do with it because PMIC_DA9052 does not
exist in mainline or in linux-next.
What is a PMIC_DA9052, anyway? What CPU architectures support it, etc?
Have you identified a maintainer who will be merging the main patch
which enables PMIC_DA9052?
Please feed all the patches through scritps/checkpatch.pl if you haven't
already done so, to clean up lots of trivial errors.
For example, "MFD: MFD module of DA9052 PMIC driver":
total: 449 errors, 832 warnings, 2326 lines checked
A couple of minor comments:
> +static int da9052_rtc_enable_alarm(struct da9052 *da9052, unsigned char flag)
> +{
> + int ret = 0;
> + if (flag) {
> + ret = da9052_set_bits(da9052, DA9052_ALARM_Y_REG,
> + DA9052_ALARM_Y_ALARM_ON);
> + if (ret != 0)
> + dev_err(da9052->dev, "Failed to enable ALM: %d\n", ret);
> + } else {
> + ret = da9052_clear_bits(da9052, DA9052_ALARM_Y_REG,
> + DA9052_ALARM_Y_ALARM_ON);
> + if (ret != 0)
> + dev_err(da9052->dev, "da9052_rtc_enable_alarm -> \
> + da9052_clear_bits error %d\n", ret);
> + }
> + return ret;
> +}
"flag" is a poor identifier - it's largely meaningless. Perhaps
"enable" would be a better choice in this case. Making it have the
bool type wouild make sense also.
> +static irqreturn_t da9052_rtc_irq(int irq, void *data)
> +{
> + struct da9052_rtc *rtc = (struct da9052_rtc *)data;
typecasting a void* like this is unneeded and is in fact undesirable,
as it will suppress possibly-useful warnings.
> + int ret = 0;
> +
> + ret = da9052_reg_read(rtc->da9052, DA9052_ALARM_MI_REG);
> + if (ret < 0) {
> + dev_err(rtc->da9052->dev, "da9052_rtc_notifier -> \
> + da9052_reg_read error %d\n", ret);
> + return IRQ_NONE;
> + }
> + if (ret & DA9052_ALARMMI_ALARMTYPE)
> + da9052_rtc_enable_alarm(rtc->da9052, 0);
> +
> + return IRQ_HANDLED;
> +}
On Tue, 2011-04-12 at 16:37 -0700, Andrew Morton wrote:
> On Wed, 6 Apr 2011 18:47:29 +0530
> Ashish Jangam <[email protected]> wrote:
> Please feed all the patches through scritps/checkpatch.pl if you haven't
> already done so, to clean up lots of trivial errors.
> For example, "MFD: MFD module of DA9052 PMIC driver":
> total: 449 errors, 832 warnings, 2326 lines checked
And a couple of more comments...
> > +static int da9052_rtc_enable_alarm(struct da9052 *da9052, unsigned char flag)
[]
> > + if (ret != 0)
> > + dev_err(da9052->dev, "da9052_rtc_enable_alarm -> \
> > + da9052_clear_bits error %d\n", ret);
[]
> > + ret = da9052_reg_read(rtc->da9052, DA9052_ALARM_MI_REG);
> > + if (ret < 0) {
> > + dev_err(rtc->da9052->dev, "da9052_rtc_notifier -> \
> > + da9052_reg_read error %d\n", ret);
Line continuations in the middle a format string are very
error prone to whitespace errors, just like these introduce
bad whitespace after the ->.
These are better as:
dev_err(rtc->da9052->dev, "%s: da9052_reg_read error: %d\n",
__func__, ret);
Or maybe use some new macro/function(s) like
#define rtc_err(rtc, fmt, ...) \
dev_err((rtc)->da9052->dev, "%s: " fmt, __func__, ##__VA_ARGS__)
so these can be:
rtc_err(rtc, "da9052_reg_read error: %d\n, ret);
Add a warning for unterminated quoted strings with line continuations
as these frequently add unwanted whitespace.
Signed-off-by: Joe Perches <[email protected]>
---
scripts/checkpatch.pl | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index d867081..f3f907b 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -2748,6 +2748,11 @@ sub process {
WARN("sizeof(& should be avoided\n" . $herecurr);
}
+# check for line continuations in quoted strings with odd counts of "
+ if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
+ WARN("Avoid line continuations in quoted strings\n" . $herecurr);
+ }
+
# check for new externs in .c files.
if ($realfile =~ /\.c$/ && defined $stat &&
$stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
Hi Andrew,
Thanks for the review comments. We have addresses most of the comments in the posting done recently. For some of your queries, kindly see our response below.
Regards,
Ashish J
> -----Original Message-----
> From: Andrew Morton [mailto:[email protected]]
> Sent: Wednesday, April 13, 2011 5:08 AM
> To: Ashish Jangam
> Cc: Paul Gortmaker; [email protected]
> Subject: Re: [PATCHv1 3/11] RTC: RTC module of DA9052 PMIC driver
>
> On Wed, 6 Apr 2011 18:47:29 +0530
> Ashish Jangam <[email protected]> wrote:
>
> > Hi Paul,
> >
> > RTC Driver for Dialog Semiconductor DA9052 PMICs.
> >
> > Changes made since last submission:
> > . read and write operation moved to MFD
> >
> > Linux Kernel Version: 2.6.37
>
> The patch looks OK(ish) to me from a quick read.
>
> > --- orig_linux-2.6.37/drivers/rtc/Kconfig 2011-01-05 05:50:19.000000000
> +0500
> > +++ linux-2.6.37/drivers/rtc/Kconfig 2011-03-31 21:07:39.000000000 +0500
> > @@ -664,6 +664,13 @@
> > help
> > If you say yes here you get support for the RTC subsystem of the
> > NUC910/NUC920 used in embedded systems.
> > +
> > +config RTC_DRV_DA9052
> > + tristate "Dialog DA9052 RTC"
> > + depends on PMIC_DA9052
> > + help
> > + Say y here to support the RTC driver for
> > + Dialog Semiconductor DA9052 PMIC.
>
> But there's not much I can do with it because PMIC_DA9052 does not
> exist in mainline or in linux-next.
DA9052 RTC has been placed under the "comment "Platform RTC drivers" section of drivers\rtc\Kconfig as the DA9052 MFD supports both the SPI and I2C serial protocols.
>
> What is a PMIC_DA9052, anyway? What CPU architectures support it, etc?
The DA9052 are designed to support application processors and associated peripherals. The DA9052 provides 11 LDO's and 4 high efficiency programmable Buck Converters which deliver high efficiency across a wide range of line and load conditions. DA9052 PMIC is widely used in portable navigation devices and other handhelds for efficient power management.
> Have you identified a maintainer who will be merging the main patch
> which enables PMIC_DA9052?
We have sent the DA9052 MFD patch which will enable the PMIC DA9052 for review comments to Mark Brown and the LKML mailing list community for their views on it.
>
>
> Please feed all the patches through scritps/checkpatch.pl if you haven't
> already done so, to clean up lots of trivial errors.
>
> For example, "MFD: MFD module of DA9052 PMIC driver":
>
> total: 449 errors, 832 warnings, 2326 lines checked
>
>
> A couple of minor comments:
>
> > +static int da9052_rtc_enable_alarm(struct da9052 *da9052, unsigned char
> flag)
> > +{
> > + int ret = 0;
> > + if (flag) {
> > + ret = da9052_set_bits(da9052, DA9052_ALARM_Y_REG,
> > + DA9052_ALARM_Y_ALARM_ON);
> > + if (ret != 0)
> > + dev_err(da9052->dev, "Failed to enable ALM: %d\n", ret);
> > + } else {
> > + ret = da9052_clear_bits(da9052, DA9052_ALARM_Y_REG,
> > + DA9052_ALARM_Y_ALARM_ON);
> > + if (ret != 0)
> > + dev_err(da9052->dev, "da9052_rtc_enable_alarm -> \
> > + da9052_clear_bits error %d\n", ret);
> > + }
> > + return ret;
> > +}
>
> "flag" is a poor identifier - it's largely meaningless. Perhaps
> "enable" would be a better choice in this case. Making it have the
> bool type wouild make sense also.
>
> > +static irqreturn_t da9052_rtc_irq(int irq, void *data)
> > +{
> > + struct da9052_rtc *rtc = (struct da9052_rtc *)data;
>
> typecasting a void* like this is unneeded and is in fact undesirable,
> as it will suppress possibly-useful warnings.
>
>
> > + int ret = 0;
> > +
> > + ret = da9052_reg_read(rtc->da9052, DA9052_ALARM_MI_REG);
> > + if (ret < 0) {
> > + dev_err(rtc->da9052->dev, "da9052_rtc_notifier -> \
> > + da9052_reg_read error %d\n", ret);
> > + return IRQ_NONE;
> > + }
> > + if (ret & DA9052_ALARMMI_ALARMTYPE)
> > + da9052_rtc_enable_alarm(rtc->da9052, 0);
> > +
> > + return IRQ_HANDLED;
> > +}
>
????{.n?+???????+%?????ݶ??w??{.n?+????{??G?????{ay?ʇڙ?,j??f???h?????????z_??(?階?ݢj"???m??????G????????????&???~???iO???z??v?^?m????????????I?