aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-pcap.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rtc/rtc-pcap.c')
-rw-r--r--drivers/rtc/rtc-pcap.c28
1 files changed, 12 insertions, 16 deletions
diff --git a/drivers/rtc/rtc-pcap.c b/drivers/rtc/rtc-pcap.c
index f176cb9d0dbc..178bfb1dea21 100644
--- a/drivers/rtc/rtc-pcap.c
+++ b/drivers/rtc/rtc-pcap.c
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0
1/* 2/*
2 * pcap rtc code for Motorola EZX phones 3 * pcap rtc code for Motorola EZX phones
3 * 4 *
@@ -5,11 +6,6 @@
5 * Copyright (c) 2009 Daniel Ribeiro <drwyrm@gmail.com> 6 * Copyright (c) 2009 Daniel Ribeiro <drwyrm@gmail.com>
6 * 7 *
7 * Based on Motorola's rtc.c Copyright (c) 2003-2005 Motorola 8 * Based on Motorola's rtc.c Copyright (c) 2003-2005 Motorola
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 *
13 */ 9 */
14 10
15#include <linux/kernel.h> 11#include <linux/kernel.h>
@@ -55,7 +51,7 @@ static int pcap_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
55 ezx_pcap_read(pcap_rtc->pcap, PCAP_REG_RTC_DAYA, &days); 51 ezx_pcap_read(pcap_rtc->pcap, PCAP_REG_RTC_DAYA, &days);
56 secs += (days & PCAP_RTC_DAY_MASK) * SEC_PER_DAY; 52 secs += (days & PCAP_RTC_DAY_MASK) * SEC_PER_DAY;
57 53
58 rtc_time_to_tm(secs, tm); 54 rtc_time64_to_tm(secs, tm);
59 55
60 return 0; 56 return 0;
61} 57}
@@ -63,12 +59,9 @@ static int pcap_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
63static int pcap_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) 59static int pcap_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
64{ 60{
65 struct pcap_rtc *pcap_rtc = dev_get_drvdata(dev); 61 struct pcap_rtc *pcap_rtc = dev_get_drvdata(dev);
66 struct rtc_time *tm = &alrm->time; 62 unsigned long secs = rtc_tm_to_time64(&alrm->time);
67 unsigned long secs;
68 u32 tod, days; 63 u32 tod, days;
69 64
70 rtc_tm_to_time(tm, &secs);
71
72 tod = secs % SEC_PER_DAY; 65 tod = secs % SEC_PER_DAY;
73 ezx_pcap_write(pcap_rtc->pcap, PCAP_REG_RTC_TODA, tod); 66 ezx_pcap_write(pcap_rtc->pcap, PCAP_REG_RTC_TODA, tod);
74 67
@@ -90,14 +83,15 @@ static int pcap_rtc_read_time(struct device *dev, struct rtc_time *tm)
90 ezx_pcap_read(pcap_rtc->pcap, PCAP_REG_RTC_DAY, &days); 83 ezx_pcap_read(pcap_rtc->pcap, PCAP_REG_RTC_DAY, &days);
91 secs += (days & PCAP_RTC_DAY_MASK) * SEC_PER_DAY; 84 secs += (days & PCAP_RTC_DAY_MASK) * SEC_PER_DAY;
92 85
93 rtc_time_to_tm(secs, tm); 86 rtc_time64_to_tm(secs, tm);
94 87
95 return 0; 88 return 0;
96} 89}
97 90
98static int pcap_rtc_set_mmss(struct device *dev, unsigned long secs) 91static int pcap_rtc_set_time(struct device *dev, struct rtc_time *tm)
99{ 92{
100 struct pcap_rtc *pcap_rtc = dev_get_drvdata(dev); 93 struct pcap_rtc *pcap_rtc = dev_get_drvdata(dev);
94 unsigned long secs = rtc_tm_to_time64(tm);
101 u32 tod, days; 95 u32 tod, days;
102 96
103 tod = secs % SEC_PER_DAY; 97 tod = secs % SEC_PER_DAY;
@@ -128,9 +122,9 @@ static int pcap_rtc_alarm_irq_enable(struct device *dev, unsigned int en)
128 122
129static const struct rtc_class_ops pcap_rtc_ops = { 123static const struct rtc_class_ops pcap_rtc_ops = {
130 .read_time = pcap_rtc_read_time, 124 .read_time = pcap_rtc_read_time,
125 .set_time = pcap_rtc_set_time,
131 .read_alarm = pcap_rtc_read_alarm, 126 .read_alarm = pcap_rtc_read_alarm,
132 .set_alarm = pcap_rtc_set_alarm, 127 .set_alarm = pcap_rtc_set_alarm,
133 .set_mmss = pcap_rtc_set_mmss,
134 .alarm_irq_enable = pcap_rtc_alarm_irq_enable, 128 .alarm_irq_enable = pcap_rtc_alarm_irq_enable,
135}; 129};
136 130
@@ -149,11 +143,13 @@ static int __init pcap_rtc_probe(struct platform_device *pdev)
149 143
150 platform_set_drvdata(pdev, pcap_rtc); 144 platform_set_drvdata(pdev, pcap_rtc);
151 145
152 pcap_rtc->rtc = devm_rtc_device_register(&pdev->dev, "pcap", 146 pcap_rtc->rtc = devm_rtc_allocate_device(&pdev->dev);
153 &pcap_rtc_ops, THIS_MODULE);
154 if (IS_ERR(pcap_rtc->rtc)) 147 if (IS_ERR(pcap_rtc->rtc))
155 return PTR_ERR(pcap_rtc->rtc); 148 return PTR_ERR(pcap_rtc->rtc);
156 149
150 pcap_rtc->rtc->ops = &pcap_rtc_ops;
151 pcap_rtc->rtc->range_max = (1 << 14) * 86400ULL - 1;
152
157 timer_irq = pcap_to_irq(pcap_rtc->pcap, PCAP_IRQ_1HZ); 153 timer_irq = pcap_to_irq(pcap_rtc->pcap, PCAP_IRQ_1HZ);
158 alarm_irq = pcap_to_irq(pcap_rtc->pcap, PCAP_IRQ_TODA); 154 alarm_irq = pcap_to_irq(pcap_rtc->pcap, PCAP_IRQ_TODA);
159 155
@@ -167,7 +163,7 @@ static int __init pcap_rtc_probe(struct platform_device *pdev)
167 if (err) 163 if (err)
168 return err; 164 return err;
169 165
170 return 0; 166 return rtc_register_device(pcap_rtc->rtc);
171} 167}
172 168
173static int __exit pcap_rtc_remove(struct platform_device *pdev) 169static int __exit pcap_rtc_remove(struct platform_device *pdev)