Lines Matching +full:pxa +full:- +full:rtc
1 // SPDX-License-Identifier: GPL-2.0-only
3 * drivers/rtc/rtc-vt8500.c
7 * Based on rtc-pxa.c
11 #include <linux/rtc.h>
64 #define VT8500_RTC_CR_ENABLE (1 << 0) /* Enable RTC */
75 struct rtc_device *rtc; member
85 spin_lock(&vt8500_rtc->lock); in vt8500_rtc_irq()
88 isr = readl(vt8500_rtc->regbase + VT8500_RTC_IS); in vt8500_rtc_irq()
89 writel(isr, vt8500_rtc->regbase + VT8500_RTC_IS); in vt8500_rtc_irq()
91 spin_unlock(&vt8500_rtc->lock); in vt8500_rtc_irq()
96 rtc_update_irq(vt8500_rtc->rtc, 1, events); in vt8500_rtc_irq()
106 date = readl(vt8500_rtc->regbase + VT8500_RTC_DR); in vt8500_rtc_read_time()
107 time = readl(vt8500_rtc->regbase + VT8500_RTC_TR); in vt8500_rtc_read_time()
109 tm->tm_sec = bcd2bin(time & TIME_SEC_MASK); in vt8500_rtc_read_time()
110 tm->tm_min = bcd2bin((time & TIME_MIN_MASK) >> TIME_MIN_S); in vt8500_rtc_read_time()
111 tm->tm_hour = bcd2bin((time & TIME_HOUR_MASK) >> TIME_HOUR_S); in vt8500_rtc_read_time()
112 tm->tm_mday = bcd2bin(date & DATE_DAY_MASK); in vt8500_rtc_read_time()
113 tm->tm_mon = bcd2bin((date & DATE_MONTH_MASK) >> DATE_MONTH_S) - 1; in vt8500_rtc_read_time()
114 tm->tm_year = bcd2bin((date & DATE_YEAR_MASK) >> DATE_YEAR_S) in vt8500_rtc_read_time()
116 tm->tm_wday = (time & TIME_DOW_MASK) >> TIME_DOW_S; in vt8500_rtc_read_time()
125 writel((bin2bcd(tm->tm_year % 100) << DATE_YEAR_S) in vt8500_rtc_set_time()
126 | (bin2bcd(tm->tm_mon + 1) << DATE_MONTH_S) in vt8500_rtc_set_time()
127 | (bin2bcd(tm->tm_mday)) in vt8500_rtc_set_time()
128 | ((tm->tm_year >= 200) << DATE_CENTURY_S), in vt8500_rtc_set_time()
129 vt8500_rtc->regbase + VT8500_RTC_DS); in vt8500_rtc_set_time()
130 writel((bin2bcd(tm->tm_wday) << TIME_DOW_S) in vt8500_rtc_set_time()
131 | (bin2bcd(tm->tm_hour) << TIME_HOUR_S) in vt8500_rtc_set_time()
132 | (bin2bcd(tm->tm_min) << TIME_MIN_S) in vt8500_rtc_set_time()
133 | (bin2bcd(tm->tm_sec)), in vt8500_rtc_set_time()
134 vt8500_rtc->regbase + VT8500_RTC_TS); in vt8500_rtc_set_time()
144 alarm = readl(vt8500_rtc->regbase + VT8500_RTC_AS); in vt8500_rtc_read_alarm()
145 isr = readl(vt8500_rtc->regbase + VT8500_RTC_IS); in vt8500_rtc_read_alarm()
147 alrm->time.tm_mday = bcd2bin((alarm & ALARM_DAY_MASK) >> ALARM_DAY_S); in vt8500_rtc_read_alarm()
148 alrm->time.tm_hour = bcd2bin((alarm & TIME_HOUR_MASK) >> TIME_HOUR_S); in vt8500_rtc_read_alarm()
149 alrm->time.tm_min = bcd2bin((alarm & TIME_MIN_MASK) >> TIME_MIN_S); in vt8500_rtc_read_alarm()
150 alrm->time.tm_sec = bcd2bin((alarm & TIME_SEC_MASK)); in vt8500_rtc_read_alarm()
152 alrm->enabled = (alarm & ALARM_ENABLE_MASK) ? 1 : 0; in vt8500_rtc_read_alarm()
153 alrm->pending = (isr & VT8500_RTC_IS_ALARM) ? 1 : 0; in vt8500_rtc_read_alarm()
155 return rtc_valid_tm(&alrm->time); in vt8500_rtc_read_alarm()
162 writel((alrm->enabled ? ALARM_ENABLE_MASK : 0) in vt8500_rtc_set_alarm()
163 | (bin2bcd(alrm->time.tm_mday) << ALARM_DAY_S) in vt8500_rtc_set_alarm()
164 | (bin2bcd(alrm->time.tm_hour) << TIME_HOUR_S) in vt8500_rtc_set_alarm()
165 | (bin2bcd(alrm->time.tm_min) << TIME_MIN_S) in vt8500_rtc_set_alarm()
166 | (bin2bcd(alrm->time.tm_sec)), in vt8500_rtc_set_alarm()
167 vt8500_rtc->regbase + VT8500_RTC_AS); in vt8500_rtc_set_alarm()
175 unsigned long tmp = readl(vt8500_rtc->regbase + VT8500_RTC_AS); in vt8500_alarm_irq_enable()
182 writel(tmp, vt8500_rtc->regbase + VT8500_RTC_AS); in vt8500_alarm_irq_enable()
199 vt8500_rtc = devm_kzalloc(&pdev->dev, in vt8500_rtc_probe()
202 return -ENOMEM; in vt8500_rtc_probe()
204 spin_lock_init(&vt8500_rtc->lock); in vt8500_rtc_probe()
207 vt8500_rtc->irq_alarm = platform_get_irq(pdev, 0); in vt8500_rtc_probe()
208 if (vt8500_rtc->irq_alarm < 0) in vt8500_rtc_probe()
209 return vt8500_rtc->irq_alarm; in vt8500_rtc_probe()
211 vt8500_rtc->regbase = devm_platform_ioremap_resource(pdev, 0); in vt8500_rtc_probe()
212 if (IS_ERR(vt8500_rtc->regbase)) in vt8500_rtc_probe()
213 return PTR_ERR(vt8500_rtc->regbase); in vt8500_rtc_probe()
215 /* Enable RTC and set it to 24-hour mode */ in vt8500_rtc_probe()
217 vt8500_rtc->regbase + VT8500_RTC_CR); in vt8500_rtc_probe()
219 vt8500_rtc->rtc = devm_rtc_allocate_device(&pdev->dev); in vt8500_rtc_probe()
220 if (IS_ERR(vt8500_rtc->rtc)) in vt8500_rtc_probe()
221 return PTR_ERR(vt8500_rtc->rtc); in vt8500_rtc_probe()
223 vt8500_rtc->rtc->ops = &vt8500_rtc_ops; in vt8500_rtc_probe()
224 vt8500_rtc->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; in vt8500_rtc_probe()
225 vt8500_rtc->rtc->range_max = RTC_TIMESTAMP_END_2199; in vt8500_rtc_probe()
227 ret = devm_request_irq(&pdev->dev, vt8500_rtc->irq_alarm, in vt8500_rtc_probe()
228 vt8500_rtc_irq, 0, "rtc alarm", vt8500_rtc); in vt8500_rtc_probe()
230 dev_err(&pdev->dev, "can't get irq %i, err %d\n", in vt8500_rtc_probe()
231 vt8500_rtc->irq_alarm, ret); in vt8500_rtc_probe()
235 return devm_rtc_register_device(vt8500_rtc->rtc); in vt8500_rtc_probe()
243 writel(0, vt8500_rtc->regbase + VT8500_RTC_IS); in vt8500_rtc_remove()
247 { .compatible = "via,vt8500-rtc", },
256 .name = "vt8500-rtc",
264 MODULE_DESCRIPTION("VIA VT8500 SoC Realtime Clock Driver (RTC)");
266 MODULE_ALIAS("platform:vt8500-rtc");