1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * rtc-ds1305.c -- driver for DS1305 and DS1306 SPI RTC chips
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2008 David Brownell
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun #include <linux/kernel.h>
8*4882a593Smuzhiyun #include <linux/init.h>
9*4882a593Smuzhiyun #include <linux/bcd.h>
10*4882a593Smuzhiyun #include <linux/slab.h>
11*4882a593Smuzhiyun #include <linux/rtc.h>
12*4882a593Smuzhiyun #include <linux/workqueue.h>
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun #include <linux/spi/spi.h>
15*4882a593Smuzhiyun #include <linux/spi/ds1305.h>
16*4882a593Smuzhiyun #include <linux/module.h>
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun /*
20*4882a593Smuzhiyun * Registers ... mask DS1305_WRITE into register address to write,
21*4882a593Smuzhiyun * otherwise you're reading it. All non-bitmask values are BCD.
22*4882a593Smuzhiyun */
23*4882a593Smuzhiyun #define DS1305_WRITE 0x80
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun /* RTC date/time ... the main special cases are that we:
27*4882a593Smuzhiyun * - Need fancy "hours" encoding in 12hour mode
28*4882a593Smuzhiyun * - Don't rely on the "day-of-week" field (or tm_wday)
29*4882a593Smuzhiyun * - Are a 21st-century clock (2000 <= year < 2100)
30*4882a593Smuzhiyun */
31*4882a593Smuzhiyun #define DS1305_RTC_LEN 7 /* bytes for RTC regs */
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun #define DS1305_SEC 0x00 /* register addresses */
34*4882a593Smuzhiyun #define DS1305_MIN 0x01
35*4882a593Smuzhiyun #define DS1305_HOUR 0x02
36*4882a593Smuzhiyun # define DS1305_HR_12 0x40 /* set == 12 hr mode */
37*4882a593Smuzhiyun # define DS1305_HR_PM 0x20 /* set == PM (12hr mode) */
38*4882a593Smuzhiyun #define DS1305_WDAY 0x03
39*4882a593Smuzhiyun #define DS1305_MDAY 0x04
40*4882a593Smuzhiyun #define DS1305_MON 0x05
41*4882a593Smuzhiyun #define DS1305_YEAR 0x06
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun /* The two alarms have only sec/min/hour/wday fields (ALM_LEN).
45*4882a593Smuzhiyun * DS1305_ALM_DISABLE disables a match field (some combos are bad).
46*4882a593Smuzhiyun *
47*4882a593Smuzhiyun * NOTE that since we don't use WDAY, we limit ourselves to alarms
48*4882a593Smuzhiyun * only one day into the future (vs potentially up to a week).
49*4882a593Smuzhiyun *
50*4882a593Smuzhiyun * NOTE ALSO that while we could generate once-a-second IRQs (UIE), we
51*4882a593Smuzhiyun * don't currently support them. We'd either need to do it only when
52*4882a593Smuzhiyun * no alarm is pending (not the standard model), or to use the second
53*4882a593Smuzhiyun * alarm (implying that this is a DS1305 not DS1306, *and* that either
54*4882a593Smuzhiyun * it's wired up a second IRQ we know, or that INTCN is set)
55*4882a593Smuzhiyun */
56*4882a593Smuzhiyun #define DS1305_ALM_LEN 4 /* bytes for ALM regs */
57*4882a593Smuzhiyun #define DS1305_ALM_DISABLE 0x80
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun #define DS1305_ALM0(r) (0x07 + (r)) /* register addresses */
60*4882a593Smuzhiyun #define DS1305_ALM1(r) (0x0b + (r))
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun /* three control registers */
64*4882a593Smuzhiyun #define DS1305_CONTROL_LEN 3 /* bytes of control regs */
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun #define DS1305_CONTROL 0x0f /* register addresses */
67*4882a593Smuzhiyun # define DS1305_nEOSC 0x80 /* low enables oscillator */
68*4882a593Smuzhiyun # define DS1305_WP 0x40 /* write protect */
69*4882a593Smuzhiyun # define DS1305_INTCN 0x04 /* clear == only int0 used */
70*4882a593Smuzhiyun # define DS1306_1HZ 0x04 /* enable 1Hz output */
71*4882a593Smuzhiyun # define DS1305_AEI1 0x02 /* enable ALM1 IRQ */
72*4882a593Smuzhiyun # define DS1305_AEI0 0x01 /* enable ALM0 IRQ */
73*4882a593Smuzhiyun #define DS1305_STATUS 0x10
74*4882a593Smuzhiyun /* status has just AEIx bits, mirrored as IRQFx */
75*4882a593Smuzhiyun #define DS1305_TRICKLE 0x11
76*4882a593Smuzhiyun /* trickle bits are defined in <linux/spi/ds1305.h> */
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun /* a bunch of NVRAM */
79*4882a593Smuzhiyun #define DS1305_NVRAM_LEN 96 /* bytes of NVRAM */
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun #define DS1305_NVRAM 0x20 /* register addresses */
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun struct ds1305 {
85*4882a593Smuzhiyun struct spi_device *spi;
86*4882a593Smuzhiyun struct rtc_device *rtc;
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun struct work_struct work;
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun unsigned long flags;
91*4882a593Smuzhiyun #define FLAG_EXITING 0
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun bool hr12;
94*4882a593Smuzhiyun u8 ctrl[DS1305_CONTROL_LEN];
95*4882a593Smuzhiyun };
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun /*----------------------------------------------------------------------*/
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun /*
101*4882a593Smuzhiyun * Utilities ... tolerate 12-hour AM/PM notation in case of non-Linux
102*4882a593Smuzhiyun * software (like a bootloader) which may require it.
103*4882a593Smuzhiyun */
104*4882a593Smuzhiyun
bcd2hour(u8 bcd)105*4882a593Smuzhiyun static unsigned bcd2hour(u8 bcd)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun if (bcd & DS1305_HR_12) {
108*4882a593Smuzhiyun unsigned hour = 0;
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun bcd &= ~DS1305_HR_12;
111*4882a593Smuzhiyun if (bcd & DS1305_HR_PM) {
112*4882a593Smuzhiyun hour = 12;
113*4882a593Smuzhiyun bcd &= ~DS1305_HR_PM;
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun hour += bcd2bin(bcd);
116*4882a593Smuzhiyun return hour - 1;
117*4882a593Smuzhiyun }
118*4882a593Smuzhiyun return bcd2bin(bcd);
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun
hour2bcd(bool hr12,int hour)121*4882a593Smuzhiyun static u8 hour2bcd(bool hr12, int hour)
122*4882a593Smuzhiyun {
123*4882a593Smuzhiyun if (hr12) {
124*4882a593Smuzhiyun hour++;
125*4882a593Smuzhiyun if (hour <= 12)
126*4882a593Smuzhiyun return DS1305_HR_12 | bin2bcd(hour);
127*4882a593Smuzhiyun hour -= 12;
128*4882a593Smuzhiyun return DS1305_HR_12 | DS1305_HR_PM | bin2bcd(hour);
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun return bin2bcd(hour);
131*4882a593Smuzhiyun }
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun /*----------------------------------------------------------------------*/
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun /*
136*4882a593Smuzhiyun * Interface to RTC framework
137*4882a593Smuzhiyun */
138*4882a593Smuzhiyun
ds1305_alarm_irq_enable(struct device * dev,unsigned int enabled)139*4882a593Smuzhiyun static int ds1305_alarm_irq_enable(struct device *dev, unsigned int enabled)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun struct ds1305 *ds1305 = dev_get_drvdata(dev);
142*4882a593Smuzhiyun u8 buf[2];
143*4882a593Smuzhiyun long err = -EINVAL;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun buf[0] = DS1305_WRITE | DS1305_CONTROL;
146*4882a593Smuzhiyun buf[1] = ds1305->ctrl[0];
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun if (enabled) {
149*4882a593Smuzhiyun if (ds1305->ctrl[0] & DS1305_AEI0)
150*4882a593Smuzhiyun goto done;
151*4882a593Smuzhiyun buf[1] |= DS1305_AEI0;
152*4882a593Smuzhiyun } else {
153*4882a593Smuzhiyun if (!(buf[1] & DS1305_AEI0))
154*4882a593Smuzhiyun goto done;
155*4882a593Smuzhiyun buf[1] &= ~DS1305_AEI0;
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun err = spi_write_then_read(ds1305->spi, buf, sizeof(buf), NULL, 0);
158*4882a593Smuzhiyun if (err >= 0)
159*4882a593Smuzhiyun ds1305->ctrl[0] = buf[1];
160*4882a593Smuzhiyun done:
161*4882a593Smuzhiyun return err;
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun }
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun /*
167*4882a593Smuzhiyun * Get/set of date and time is pretty normal.
168*4882a593Smuzhiyun */
169*4882a593Smuzhiyun
ds1305_get_time(struct device * dev,struct rtc_time * time)170*4882a593Smuzhiyun static int ds1305_get_time(struct device *dev, struct rtc_time *time)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun struct ds1305 *ds1305 = dev_get_drvdata(dev);
173*4882a593Smuzhiyun u8 addr = DS1305_SEC;
174*4882a593Smuzhiyun u8 buf[DS1305_RTC_LEN];
175*4882a593Smuzhiyun int status;
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun /* Use write-then-read to get all the date/time registers
178*4882a593Smuzhiyun * since dma from stack is nonportable
179*4882a593Smuzhiyun */
180*4882a593Smuzhiyun status = spi_write_then_read(ds1305->spi, &addr, sizeof(addr),
181*4882a593Smuzhiyun buf, sizeof(buf));
182*4882a593Smuzhiyun if (status < 0)
183*4882a593Smuzhiyun return status;
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun dev_vdbg(dev, "%s: %3ph, %4ph\n", "read", &buf[0], &buf[3]);
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun /* Decode the registers */
188*4882a593Smuzhiyun time->tm_sec = bcd2bin(buf[DS1305_SEC]);
189*4882a593Smuzhiyun time->tm_min = bcd2bin(buf[DS1305_MIN]);
190*4882a593Smuzhiyun time->tm_hour = bcd2hour(buf[DS1305_HOUR]);
191*4882a593Smuzhiyun time->tm_wday = buf[DS1305_WDAY] - 1;
192*4882a593Smuzhiyun time->tm_mday = bcd2bin(buf[DS1305_MDAY]);
193*4882a593Smuzhiyun time->tm_mon = bcd2bin(buf[DS1305_MON]) - 1;
194*4882a593Smuzhiyun time->tm_year = bcd2bin(buf[DS1305_YEAR]) + 100;
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun dev_vdbg(dev, "%s secs=%d, mins=%d, "
197*4882a593Smuzhiyun "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
198*4882a593Smuzhiyun "read", time->tm_sec, time->tm_min,
199*4882a593Smuzhiyun time->tm_hour, time->tm_mday,
200*4882a593Smuzhiyun time->tm_mon, time->tm_year, time->tm_wday);
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun return 0;
203*4882a593Smuzhiyun }
204*4882a593Smuzhiyun
ds1305_set_time(struct device * dev,struct rtc_time * time)205*4882a593Smuzhiyun static int ds1305_set_time(struct device *dev, struct rtc_time *time)
206*4882a593Smuzhiyun {
207*4882a593Smuzhiyun struct ds1305 *ds1305 = dev_get_drvdata(dev);
208*4882a593Smuzhiyun u8 buf[1 + DS1305_RTC_LEN];
209*4882a593Smuzhiyun u8 *bp = buf;
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun dev_vdbg(dev, "%s secs=%d, mins=%d, "
212*4882a593Smuzhiyun "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
213*4882a593Smuzhiyun "write", time->tm_sec, time->tm_min,
214*4882a593Smuzhiyun time->tm_hour, time->tm_mday,
215*4882a593Smuzhiyun time->tm_mon, time->tm_year, time->tm_wday);
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun /* Write registers starting at the first time/date address. */
218*4882a593Smuzhiyun *bp++ = DS1305_WRITE | DS1305_SEC;
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun *bp++ = bin2bcd(time->tm_sec);
221*4882a593Smuzhiyun *bp++ = bin2bcd(time->tm_min);
222*4882a593Smuzhiyun *bp++ = hour2bcd(ds1305->hr12, time->tm_hour);
223*4882a593Smuzhiyun *bp++ = (time->tm_wday < 7) ? (time->tm_wday + 1) : 1;
224*4882a593Smuzhiyun *bp++ = bin2bcd(time->tm_mday);
225*4882a593Smuzhiyun *bp++ = bin2bcd(time->tm_mon + 1);
226*4882a593Smuzhiyun *bp++ = bin2bcd(time->tm_year - 100);
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun dev_dbg(dev, "%s: %3ph, %4ph\n", "write", &buf[1], &buf[4]);
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun /* use write-then-read since dma from stack is nonportable */
231*4882a593Smuzhiyun return spi_write_then_read(ds1305->spi, buf, sizeof(buf),
232*4882a593Smuzhiyun NULL, 0);
233*4882a593Smuzhiyun }
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun /*
236*4882a593Smuzhiyun * Get/set of alarm is a bit funky:
237*4882a593Smuzhiyun *
238*4882a593Smuzhiyun * - First there's the inherent raciness of getting the (partitioned)
239*4882a593Smuzhiyun * status of an alarm that could trigger while we're reading parts
240*4882a593Smuzhiyun * of that status.
241*4882a593Smuzhiyun *
242*4882a593Smuzhiyun * - Second there's its limited range (we could increase it a bit by
243*4882a593Smuzhiyun * relying on WDAY), which means it will easily roll over.
244*4882a593Smuzhiyun *
245*4882a593Smuzhiyun * - Third there's the choice of two alarms and alarm signals.
246*4882a593Smuzhiyun * Here we use ALM0 and expect that nINT0 (open drain) is used;
247*4882a593Smuzhiyun * that's the only real option for DS1306 runtime alarms, and is
248*4882a593Smuzhiyun * natural on DS1305.
249*4882a593Smuzhiyun *
250*4882a593Smuzhiyun * - Fourth, there's also ALM1, and a second interrupt signal:
251*4882a593Smuzhiyun * + On DS1305 ALM1 uses nINT1 (when INTCN=1) else nINT0;
252*4882a593Smuzhiyun * + On DS1306 ALM1 only uses INT1 (an active high pulse)
253*4882a593Smuzhiyun * and it won't work when VCC1 is active.
254*4882a593Smuzhiyun *
255*4882a593Smuzhiyun * So to be most general, we should probably set both alarms to the
256*4882a593Smuzhiyun * same value, letting ALM1 be the wakeup event source on DS1306
257*4882a593Smuzhiyun * and handling several wiring options on DS1305.
258*4882a593Smuzhiyun *
259*4882a593Smuzhiyun * - Fifth, we support the polled mode (as well as possible; why not?)
260*4882a593Smuzhiyun * even when no interrupt line is wired to an IRQ.
261*4882a593Smuzhiyun */
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun /*
264*4882a593Smuzhiyun * Context: caller holds rtc->ops_lock (to protect ds1305->ctrl)
265*4882a593Smuzhiyun */
ds1305_get_alarm(struct device * dev,struct rtc_wkalrm * alm)266*4882a593Smuzhiyun static int ds1305_get_alarm(struct device *dev, struct rtc_wkalrm *alm)
267*4882a593Smuzhiyun {
268*4882a593Smuzhiyun struct ds1305 *ds1305 = dev_get_drvdata(dev);
269*4882a593Smuzhiyun struct spi_device *spi = ds1305->spi;
270*4882a593Smuzhiyun u8 addr;
271*4882a593Smuzhiyun int status;
272*4882a593Smuzhiyun u8 buf[DS1305_ALM_LEN];
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun /* Refresh control register cache BEFORE reading ALM0 registers,
275*4882a593Smuzhiyun * since reading alarm registers acks any pending IRQ. That
276*4882a593Smuzhiyun * makes returning "pending" status a bit of a lie, but that bit
277*4882a593Smuzhiyun * of EFI status is at best fragile anyway (given IRQ handlers).
278*4882a593Smuzhiyun */
279*4882a593Smuzhiyun addr = DS1305_CONTROL;
280*4882a593Smuzhiyun status = spi_write_then_read(spi, &addr, sizeof(addr),
281*4882a593Smuzhiyun ds1305->ctrl, sizeof(ds1305->ctrl));
282*4882a593Smuzhiyun if (status < 0)
283*4882a593Smuzhiyun return status;
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun alm->enabled = !!(ds1305->ctrl[0] & DS1305_AEI0);
286*4882a593Smuzhiyun alm->pending = !!(ds1305->ctrl[1] & DS1305_AEI0);
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun /* get and check ALM0 registers */
289*4882a593Smuzhiyun addr = DS1305_ALM0(DS1305_SEC);
290*4882a593Smuzhiyun status = spi_write_then_read(spi, &addr, sizeof(addr),
291*4882a593Smuzhiyun buf, sizeof(buf));
292*4882a593Smuzhiyun if (status < 0)
293*4882a593Smuzhiyun return status;
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun dev_vdbg(dev, "%s: %02x %02x %02x %02x\n",
296*4882a593Smuzhiyun "alm0 read", buf[DS1305_SEC], buf[DS1305_MIN],
297*4882a593Smuzhiyun buf[DS1305_HOUR], buf[DS1305_WDAY]);
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun if ((DS1305_ALM_DISABLE & buf[DS1305_SEC])
300*4882a593Smuzhiyun || (DS1305_ALM_DISABLE & buf[DS1305_MIN])
301*4882a593Smuzhiyun || (DS1305_ALM_DISABLE & buf[DS1305_HOUR]))
302*4882a593Smuzhiyun return -EIO;
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun /* Stuff these values into alm->time and let RTC framework code
305*4882a593Smuzhiyun * fill in the rest ... and also handle rollover to tomorrow when
306*4882a593Smuzhiyun * that's needed.
307*4882a593Smuzhiyun */
308*4882a593Smuzhiyun alm->time.tm_sec = bcd2bin(buf[DS1305_SEC]);
309*4882a593Smuzhiyun alm->time.tm_min = bcd2bin(buf[DS1305_MIN]);
310*4882a593Smuzhiyun alm->time.tm_hour = bcd2hour(buf[DS1305_HOUR]);
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun return 0;
313*4882a593Smuzhiyun }
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun /*
316*4882a593Smuzhiyun * Context: caller holds rtc->ops_lock (to protect ds1305->ctrl)
317*4882a593Smuzhiyun */
ds1305_set_alarm(struct device * dev,struct rtc_wkalrm * alm)318*4882a593Smuzhiyun static int ds1305_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
319*4882a593Smuzhiyun {
320*4882a593Smuzhiyun struct ds1305 *ds1305 = dev_get_drvdata(dev);
321*4882a593Smuzhiyun struct spi_device *spi = ds1305->spi;
322*4882a593Smuzhiyun unsigned long now, later;
323*4882a593Smuzhiyun struct rtc_time tm;
324*4882a593Smuzhiyun int status;
325*4882a593Smuzhiyun u8 buf[1 + DS1305_ALM_LEN];
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun /* convert desired alarm to time_t */
328*4882a593Smuzhiyun later = rtc_tm_to_time64(&alm->time);
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun /* Read current time as time_t */
331*4882a593Smuzhiyun status = ds1305_get_time(dev, &tm);
332*4882a593Smuzhiyun if (status < 0)
333*4882a593Smuzhiyun return status;
334*4882a593Smuzhiyun now = rtc_tm_to_time64(&tm);
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun /* make sure alarm fires within the next 24 hours */
337*4882a593Smuzhiyun if (later <= now)
338*4882a593Smuzhiyun return -EINVAL;
339*4882a593Smuzhiyun if ((later - now) > 24 * 60 * 60)
340*4882a593Smuzhiyun return -EDOM;
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun /* disable alarm if needed */
343*4882a593Smuzhiyun if (ds1305->ctrl[0] & DS1305_AEI0) {
344*4882a593Smuzhiyun ds1305->ctrl[0] &= ~DS1305_AEI0;
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun buf[0] = DS1305_WRITE | DS1305_CONTROL;
347*4882a593Smuzhiyun buf[1] = ds1305->ctrl[0];
348*4882a593Smuzhiyun status = spi_write_then_read(ds1305->spi, buf, 2, NULL, 0);
349*4882a593Smuzhiyun if (status < 0)
350*4882a593Smuzhiyun return status;
351*4882a593Smuzhiyun }
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun /* write alarm */
354*4882a593Smuzhiyun buf[0] = DS1305_WRITE | DS1305_ALM0(DS1305_SEC);
355*4882a593Smuzhiyun buf[1 + DS1305_SEC] = bin2bcd(alm->time.tm_sec);
356*4882a593Smuzhiyun buf[1 + DS1305_MIN] = bin2bcd(alm->time.tm_min);
357*4882a593Smuzhiyun buf[1 + DS1305_HOUR] = hour2bcd(ds1305->hr12, alm->time.tm_hour);
358*4882a593Smuzhiyun buf[1 + DS1305_WDAY] = DS1305_ALM_DISABLE;
359*4882a593Smuzhiyun
360*4882a593Smuzhiyun dev_dbg(dev, "%s: %02x %02x %02x %02x\n",
361*4882a593Smuzhiyun "alm0 write", buf[1 + DS1305_SEC], buf[1 + DS1305_MIN],
362*4882a593Smuzhiyun buf[1 + DS1305_HOUR], buf[1 + DS1305_WDAY]);
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun status = spi_write_then_read(spi, buf, sizeof(buf), NULL, 0);
365*4882a593Smuzhiyun if (status < 0)
366*4882a593Smuzhiyun return status;
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun /* enable alarm if requested */
369*4882a593Smuzhiyun if (alm->enabled) {
370*4882a593Smuzhiyun ds1305->ctrl[0] |= DS1305_AEI0;
371*4882a593Smuzhiyun
372*4882a593Smuzhiyun buf[0] = DS1305_WRITE | DS1305_CONTROL;
373*4882a593Smuzhiyun buf[1] = ds1305->ctrl[0];
374*4882a593Smuzhiyun status = spi_write_then_read(ds1305->spi, buf, 2, NULL, 0);
375*4882a593Smuzhiyun }
376*4882a593Smuzhiyun
377*4882a593Smuzhiyun return status;
378*4882a593Smuzhiyun }
379*4882a593Smuzhiyun
380*4882a593Smuzhiyun #ifdef CONFIG_PROC_FS
381*4882a593Smuzhiyun
ds1305_proc(struct device * dev,struct seq_file * seq)382*4882a593Smuzhiyun static int ds1305_proc(struct device *dev, struct seq_file *seq)
383*4882a593Smuzhiyun {
384*4882a593Smuzhiyun struct ds1305 *ds1305 = dev_get_drvdata(dev);
385*4882a593Smuzhiyun char *diodes = "no";
386*4882a593Smuzhiyun char *resistors = "";
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun /* ctrl[2] is treated as read-only; no locking needed */
389*4882a593Smuzhiyun if ((ds1305->ctrl[2] & 0xf0) == DS1305_TRICKLE_MAGIC) {
390*4882a593Smuzhiyun switch (ds1305->ctrl[2] & 0x0c) {
391*4882a593Smuzhiyun case DS1305_TRICKLE_DS2:
392*4882a593Smuzhiyun diodes = "2 diodes, ";
393*4882a593Smuzhiyun break;
394*4882a593Smuzhiyun case DS1305_TRICKLE_DS1:
395*4882a593Smuzhiyun diodes = "1 diode, ";
396*4882a593Smuzhiyun break;
397*4882a593Smuzhiyun default:
398*4882a593Smuzhiyun goto done;
399*4882a593Smuzhiyun }
400*4882a593Smuzhiyun switch (ds1305->ctrl[2] & 0x03) {
401*4882a593Smuzhiyun case DS1305_TRICKLE_2K:
402*4882a593Smuzhiyun resistors = "2k Ohm";
403*4882a593Smuzhiyun break;
404*4882a593Smuzhiyun case DS1305_TRICKLE_4K:
405*4882a593Smuzhiyun resistors = "4k Ohm";
406*4882a593Smuzhiyun break;
407*4882a593Smuzhiyun case DS1305_TRICKLE_8K:
408*4882a593Smuzhiyun resistors = "8k Ohm";
409*4882a593Smuzhiyun break;
410*4882a593Smuzhiyun default:
411*4882a593Smuzhiyun diodes = "no";
412*4882a593Smuzhiyun break;
413*4882a593Smuzhiyun }
414*4882a593Smuzhiyun }
415*4882a593Smuzhiyun
416*4882a593Smuzhiyun done:
417*4882a593Smuzhiyun seq_printf(seq, "trickle_charge\t: %s%s\n", diodes, resistors);
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun return 0;
420*4882a593Smuzhiyun }
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun #else
423*4882a593Smuzhiyun #define ds1305_proc NULL
424*4882a593Smuzhiyun #endif
425*4882a593Smuzhiyun
426*4882a593Smuzhiyun static const struct rtc_class_ops ds1305_ops = {
427*4882a593Smuzhiyun .read_time = ds1305_get_time,
428*4882a593Smuzhiyun .set_time = ds1305_set_time,
429*4882a593Smuzhiyun .read_alarm = ds1305_get_alarm,
430*4882a593Smuzhiyun .set_alarm = ds1305_set_alarm,
431*4882a593Smuzhiyun .proc = ds1305_proc,
432*4882a593Smuzhiyun .alarm_irq_enable = ds1305_alarm_irq_enable,
433*4882a593Smuzhiyun };
434*4882a593Smuzhiyun
ds1305_work(struct work_struct * work)435*4882a593Smuzhiyun static void ds1305_work(struct work_struct *work)
436*4882a593Smuzhiyun {
437*4882a593Smuzhiyun struct ds1305 *ds1305 = container_of(work, struct ds1305, work);
438*4882a593Smuzhiyun struct mutex *lock = &ds1305->rtc->ops_lock;
439*4882a593Smuzhiyun struct spi_device *spi = ds1305->spi;
440*4882a593Smuzhiyun u8 buf[3];
441*4882a593Smuzhiyun int status;
442*4882a593Smuzhiyun
443*4882a593Smuzhiyun /* lock to protect ds1305->ctrl */
444*4882a593Smuzhiyun mutex_lock(lock);
445*4882a593Smuzhiyun
446*4882a593Smuzhiyun /* Disable the IRQ, and clear its status ... for now, we "know"
447*4882a593Smuzhiyun * that if more than one alarm is active, they're in sync.
448*4882a593Smuzhiyun * Note that reading ALM data registers also clears IRQ status.
449*4882a593Smuzhiyun */
450*4882a593Smuzhiyun ds1305->ctrl[0] &= ~(DS1305_AEI1 | DS1305_AEI0);
451*4882a593Smuzhiyun ds1305->ctrl[1] = 0;
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun buf[0] = DS1305_WRITE | DS1305_CONTROL;
454*4882a593Smuzhiyun buf[1] = ds1305->ctrl[0];
455*4882a593Smuzhiyun buf[2] = 0;
456*4882a593Smuzhiyun
457*4882a593Smuzhiyun status = spi_write_then_read(spi, buf, sizeof(buf),
458*4882a593Smuzhiyun NULL, 0);
459*4882a593Smuzhiyun if (status < 0)
460*4882a593Smuzhiyun dev_dbg(&spi->dev, "clear irq --> %d\n", status);
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun mutex_unlock(lock);
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun if (!test_bit(FLAG_EXITING, &ds1305->flags))
465*4882a593Smuzhiyun enable_irq(spi->irq);
466*4882a593Smuzhiyun
467*4882a593Smuzhiyun rtc_update_irq(ds1305->rtc, 1, RTC_AF | RTC_IRQF);
468*4882a593Smuzhiyun }
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun /*
471*4882a593Smuzhiyun * This "real" IRQ handler hands off to a workqueue mostly to allow
472*4882a593Smuzhiyun * mutex locking for ds1305->ctrl ... unlike I2C, we could issue async
473*4882a593Smuzhiyun * I/O requests in IRQ context (to clear the IRQ status).
474*4882a593Smuzhiyun */
ds1305_irq(int irq,void * p)475*4882a593Smuzhiyun static irqreturn_t ds1305_irq(int irq, void *p)
476*4882a593Smuzhiyun {
477*4882a593Smuzhiyun struct ds1305 *ds1305 = p;
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun disable_irq(irq);
480*4882a593Smuzhiyun schedule_work(&ds1305->work);
481*4882a593Smuzhiyun return IRQ_HANDLED;
482*4882a593Smuzhiyun }
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun /*----------------------------------------------------------------------*/
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun /*
487*4882a593Smuzhiyun * Interface for NVRAM
488*4882a593Smuzhiyun */
489*4882a593Smuzhiyun
msg_init(struct spi_message * m,struct spi_transfer * x,u8 * addr,size_t count,char * tx,char * rx)490*4882a593Smuzhiyun static void msg_init(struct spi_message *m, struct spi_transfer *x,
491*4882a593Smuzhiyun u8 *addr, size_t count, char *tx, char *rx)
492*4882a593Smuzhiyun {
493*4882a593Smuzhiyun spi_message_init(m);
494*4882a593Smuzhiyun memset(x, 0, 2 * sizeof(*x));
495*4882a593Smuzhiyun
496*4882a593Smuzhiyun x->tx_buf = addr;
497*4882a593Smuzhiyun x->len = 1;
498*4882a593Smuzhiyun spi_message_add_tail(x, m);
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun x++;
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun x->tx_buf = tx;
503*4882a593Smuzhiyun x->rx_buf = rx;
504*4882a593Smuzhiyun x->len = count;
505*4882a593Smuzhiyun spi_message_add_tail(x, m);
506*4882a593Smuzhiyun }
507*4882a593Smuzhiyun
ds1305_nvram_read(void * priv,unsigned int off,void * buf,size_t count)508*4882a593Smuzhiyun static int ds1305_nvram_read(void *priv, unsigned int off, void *buf,
509*4882a593Smuzhiyun size_t count)
510*4882a593Smuzhiyun {
511*4882a593Smuzhiyun struct ds1305 *ds1305 = priv;
512*4882a593Smuzhiyun struct spi_device *spi = ds1305->spi;
513*4882a593Smuzhiyun u8 addr;
514*4882a593Smuzhiyun struct spi_message m;
515*4882a593Smuzhiyun struct spi_transfer x[2];
516*4882a593Smuzhiyun
517*4882a593Smuzhiyun addr = DS1305_NVRAM + off;
518*4882a593Smuzhiyun msg_init(&m, x, &addr, count, NULL, buf);
519*4882a593Smuzhiyun
520*4882a593Smuzhiyun return spi_sync(spi, &m);
521*4882a593Smuzhiyun }
522*4882a593Smuzhiyun
ds1305_nvram_write(void * priv,unsigned int off,void * buf,size_t count)523*4882a593Smuzhiyun static int ds1305_nvram_write(void *priv, unsigned int off, void *buf,
524*4882a593Smuzhiyun size_t count)
525*4882a593Smuzhiyun {
526*4882a593Smuzhiyun struct ds1305 *ds1305 = priv;
527*4882a593Smuzhiyun struct spi_device *spi = ds1305->spi;
528*4882a593Smuzhiyun u8 addr;
529*4882a593Smuzhiyun struct spi_message m;
530*4882a593Smuzhiyun struct spi_transfer x[2];
531*4882a593Smuzhiyun
532*4882a593Smuzhiyun addr = (DS1305_WRITE | DS1305_NVRAM) + off;
533*4882a593Smuzhiyun msg_init(&m, x, &addr, count, buf, NULL);
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun return spi_sync(spi, &m);
536*4882a593Smuzhiyun }
537*4882a593Smuzhiyun
538*4882a593Smuzhiyun /*----------------------------------------------------------------------*/
539*4882a593Smuzhiyun
540*4882a593Smuzhiyun /*
541*4882a593Smuzhiyun * Interface to SPI stack
542*4882a593Smuzhiyun */
543*4882a593Smuzhiyun
ds1305_probe(struct spi_device * spi)544*4882a593Smuzhiyun static int ds1305_probe(struct spi_device *spi)
545*4882a593Smuzhiyun {
546*4882a593Smuzhiyun struct ds1305 *ds1305;
547*4882a593Smuzhiyun int status;
548*4882a593Smuzhiyun u8 addr, value;
549*4882a593Smuzhiyun struct ds1305_platform_data *pdata = dev_get_platdata(&spi->dev);
550*4882a593Smuzhiyun bool write_ctrl = false;
551*4882a593Smuzhiyun struct nvmem_config ds1305_nvmem_cfg = {
552*4882a593Smuzhiyun .name = "ds1305_nvram",
553*4882a593Smuzhiyun .word_size = 1,
554*4882a593Smuzhiyun .stride = 1,
555*4882a593Smuzhiyun .size = DS1305_NVRAM_LEN,
556*4882a593Smuzhiyun .reg_read = ds1305_nvram_read,
557*4882a593Smuzhiyun .reg_write = ds1305_nvram_write,
558*4882a593Smuzhiyun };
559*4882a593Smuzhiyun
560*4882a593Smuzhiyun /* Sanity check board setup data. This may be hooked up
561*4882a593Smuzhiyun * in 3wire mode, but we don't care. Note that unless
562*4882a593Smuzhiyun * there's an inverter in place, this needs SPI_CS_HIGH!
563*4882a593Smuzhiyun */
564*4882a593Smuzhiyun if ((spi->bits_per_word && spi->bits_per_word != 8)
565*4882a593Smuzhiyun || (spi->max_speed_hz > 2000000)
566*4882a593Smuzhiyun || !(spi->mode & SPI_CPHA))
567*4882a593Smuzhiyun return -EINVAL;
568*4882a593Smuzhiyun
569*4882a593Smuzhiyun /* set up driver data */
570*4882a593Smuzhiyun ds1305 = devm_kzalloc(&spi->dev, sizeof(*ds1305), GFP_KERNEL);
571*4882a593Smuzhiyun if (!ds1305)
572*4882a593Smuzhiyun return -ENOMEM;
573*4882a593Smuzhiyun ds1305->spi = spi;
574*4882a593Smuzhiyun spi_set_drvdata(spi, ds1305);
575*4882a593Smuzhiyun
576*4882a593Smuzhiyun /* read and cache control registers */
577*4882a593Smuzhiyun addr = DS1305_CONTROL;
578*4882a593Smuzhiyun status = spi_write_then_read(spi, &addr, sizeof(addr),
579*4882a593Smuzhiyun ds1305->ctrl, sizeof(ds1305->ctrl));
580*4882a593Smuzhiyun if (status < 0) {
581*4882a593Smuzhiyun dev_dbg(&spi->dev, "can't %s, %d\n",
582*4882a593Smuzhiyun "read", status);
583*4882a593Smuzhiyun return status;
584*4882a593Smuzhiyun }
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun dev_dbg(&spi->dev, "ctrl %s: %3ph\n", "read", ds1305->ctrl);
587*4882a593Smuzhiyun
588*4882a593Smuzhiyun /* Sanity check register values ... partially compensating for the
589*4882a593Smuzhiyun * fact that SPI has no device handshake. A pullup on MISO would
590*4882a593Smuzhiyun * make these tests fail; but not all systems will have one. If
591*4882a593Smuzhiyun * some register is neither 0x00 nor 0xff, a chip is likely there.
592*4882a593Smuzhiyun */
593*4882a593Smuzhiyun if ((ds1305->ctrl[0] & 0x38) != 0 || (ds1305->ctrl[1] & 0xfc) != 0) {
594*4882a593Smuzhiyun dev_dbg(&spi->dev, "RTC chip is not present\n");
595*4882a593Smuzhiyun return -ENODEV;
596*4882a593Smuzhiyun }
597*4882a593Smuzhiyun if (ds1305->ctrl[2] == 0)
598*4882a593Smuzhiyun dev_dbg(&spi->dev, "chip may not be present\n");
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun /* enable writes if needed ... if we were paranoid it would
601*4882a593Smuzhiyun * make sense to enable them only when absolutely necessary.
602*4882a593Smuzhiyun */
603*4882a593Smuzhiyun if (ds1305->ctrl[0] & DS1305_WP) {
604*4882a593Smuzhiyun u8 buf[2];
605*4882a593Smuzhiyun
606*4882a593Smuzhiyun ds1305->ctrl[0] &= ~DS1305_WP;
607*4882a593Smuzhiyun
608*4882a593Smuzhiyun buf[0] = DS1305_WRITE | DS1305_CONTROL;
609*4882a593Smuzhiyun buf[1] = ds1305->ctrl[0];
610*4882a593Smuzhiyun status = spi_write_then_read(spi, buf, sizeof(buf), NULL, 0);
611*4882a593Smuzhiyun
612*4882a593Smuzhiyun dev_dbg(&spi->dev, "clear WP --> %d\n", status);
613*4882a593Smuzhiyun if (status < 0)
614*4882a593Smuzhiyun return status;
615*4882a593Smuzhiyun }
616*4882a593Smuzhiyun
617*4882a593Smuzhiyun /* on DS1305, maybe start oscillator; like most low power
618*4882a593Smuzhiyun * oscillators, it may take a second to stabilize
619*4882a593Smuzhiyun */
620*4882a593Smuzhiyun if (ds1305->ctrl[0] & DS1305_nEOSC) {
621*4882a593Smuzhiyun ds1305->ctrl[0] &= ~DS1305_nEOSC;
622*4882a593Smuzhiyun write_ctrl = true;
623*4882a593Smuzhiyun dev_warn(&spi->dev, "SET TIME!\n");
624*4882a593Smuzhiyun }
625*4882a593Smuzhiyun
626*4882a593Smuzhiyun /* ack any pending IRQs */
627*4882a593Smuzhiyun if (ds1305->ctrl[1]) {
628*4882a593Smuzhiyun ds1305->ctrl[1] = 0;
629*4882a593Smuzhiyun write_ctrl = true;
630*4882a593Smuzhiyun }
631*4882a593Smuzhiyun
632*4882a593Smuzhiyun /* this may need one-time (re)init */
633*4882a593Smuzhiyun if (pdata) {
634*4882a593Smuzhiyun /* maybe enable trickle charge */
635*4882a593Smuzhiyun if (((ds1305->ctrl[2] & 0xf0) != DS1305_TRICKLE_MAGIC)) {
636*4882a593Smuzhiyun ds1305->ctrl[2] = DS1305_TRICKLE_MAGIC
637*4882a593Smuzhiyun | pdata->trickle;
638*4882a593Smuzhiyun write_ctrl = true;
639*4882a593Smuzhiyun }
640*4882a593Smuzhiyun
641*4882a593Smuzhiyun /* on DS1306, configure 1 Hz signal */
642*4882a593Smuzhiyun if (pdata->is_ds1306) {
643*4882a593Smuzhiyun if (pdata->en_1hz) {
644*4882a593Smuzhiyun if (!(ds1305->ctrl[0] & DS1306_1HZ)) {
645*4882a593Smuzhiyun ds1305->ctrl[0] |= DS1306_1HZ;
646*4882a593Smuzhiyun write_ctrl = true;
647*4882a593Smuzhiyun }
648*4882a593Smuzhiyun } else {
649*4882a593Smuzhiyun if (ds1305->ctrl[0] & DS1306_1HZ) {
650*4882a593Smuzhiyun ds1305->ctrl[0] &= ~DS1306_1HZ;
651*4882a593Smuzhiyun write_ctrl = true;
652*4882a593Smuzhiyun }
653*4882a593Smuzhiyun }
654*4882a593Smuzhiyun }
655*4882a593Smuzhiyun }
656*4882a593Smuzhiyun
657*4882a593Smuzhiyun if (write_ctrl) {
658*4882a593Smuzhiyun u8 buf[4];
659*4882a593Smuzhiyun
660*4882a593Smuzhiyun buf[0] = DS1305_WRITE | DS1305_CONTROL;
661*4882a593Smuzhiyun buf[1] = ds1305->ctrl[0];
662*4882a593Smuzhiyun buf[2] = ds1305->ctrl[1];
663*4882a593Smuzhiyun buf[3] = ds1305->ctrl[2];
664*4882a593Smuzhiyun status = spi_write_then_read(spi, buf, sizeof(buf), NULL, 0);
665*4882a593Smuzhiyun if (status < 0) {
666*4882a593Smuzhiyun dev_dbg(&spi->dev, "can't %s, %d\n",
667*4882a593Smuzhiyun "write", status);
668*4882a593Smuzhiyun return status;
669*4882a593Smuzhiyun }
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun dev_dbg(&spi->dev, "ctrl %s: %3ph\n", "write", ds1305->ctrl);
672*4882a593Smuzhiyun }
673*4882a593Smuzhiyun
674*4882a593Smuzhiyun /* see if non-Linux software set up AM/PM mode */
675*4882a593Smuzhiyun addr = DS1305_HOUR;
676*4882a593Smuzhiyun status = spi_write_then_read(spi, &addr, sizeof(addr),
677*4882a593Smuzhiyun &value, sizeof(value));
678*4882a593Smuzhiyun if (status < 0) {
679*4882a593Smuzhiyun dev_dbg(&spi->dev, "read HOUR --> %d\n", status);
680*4882a593Smuzhiyun return status;
681*4882a593Smuzhiyun }
682*4882a593Smuzhiyun
683*4882a593Smuzhiyun ds1305->hr12 = (DS1305_HR_12 & value) != 0;
684*4882a593Smuzhiyun if (ds1305->hr12)
685*4882a593Smuzhiyun dev_dbg(&spi->dev, "AM/PM\n");
686*4882a593Smuzhiyun
687*4882a593Smuzhiyun /* register RTC ... from here on, ds1305->ctrl needs locking */
688*4882a593Smuzhiyun ds1305->rtc = devm_rtc_allocate_device(&spi->dev);
689*4882a593Smuzhiyun if (IS_ERR(ds1305->rtc))
690*4882a593Smuzhiyun return PTR_ERR(ds1305->rtc);
691*4882a593Smuzhiyun
692*4882a593Smuzhiyun ds1305->rtc->ops = &ds1305_ops;
693*4882a593Smuzhiyun ds1305->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
694*4882a593Smuzhiyun ds1305->rtc->range_max = RTC_TIMESTAMP_END_2099;
695*4882a593Smuzhiyun
696*4882a593Smuzhiyun ds1305_nvmem_cfg.priv = ds1305;
697*4882a593Smuzhiyun ds1305->rtc->nvram_old_abi = true;
698*4882a593Smuzhiyun status = rtc_register_device(ds1305->rtc);
699*4882a593Smuzhiyun if (status)
700*4882a593Smuzhiyun return status;
701*4882a593Smuzhiyun
702*4882a593Smuzhiyun rtc_nvmem_register(ds1305->rtc, &ds1305_nvmem_cfg);
703*4882a593Smuzhiyun
704*4882a593Smuzhiyun /* Maybe set up alarm IRQ; be ready to handle it triggering right
705*4882a593Smuzhiyun * away. NOTE that we don't share this. The signal is active low,
706*4882a593Smuzhiyun * and we can't ack it before a SPI message delay. We temporarily
707*4882a593Smuzhiyun * disable the IRQ until it's acked, which lets us work with more
708*4882a593Smuzhiyun * IRQ trigger modes (not all IRQ controllers can do falling edge).
709*4882a593Smuzhiyun */
710*4882a593Smuzhiyun if (spi->irq) {
711*4882a593Smuzhiyun INIT_WORK(&ds1305->work, ds1305_work);
712*4882a593Smuzhiyun status = devm_request_irq(&spi->dev, spi->irq, ds1305_irq,
713*4882a593Smuzhiyun 0, dev_name(&ds1305->rtc->dev), ds1305);
714*4882a593Smuzhiyun if (status < 0) {
715*4882a593Smuzhiyun dev_err(&spi->dev, "request_irq %d --> %d\n",
716*4882a593Smuzhiyun spi->irq, status);
717*4882a593Smuzhiyun } else {
718*4882a593Smuzhiyun device_set_wakeup_capable(&spi->dev, 1);
719*4882a593Smuzhiyun }
720*4882a593Smuzhiyun }
721*4882a593Smuzhiyun
722*4882a593Smuzhiyun return 0;
723*4882a593Smuzhiyun }
724*4882a593Smuzhiyun
ds1305_remove(struct spi_device * spi)725*4882a593Smuzhiyun static int ds1305_remove(struct spi_device *spi)
726*4882a593Smuzhiyun {
727*4882a593Smuzhiyun struct ds1305 *ds1305 = spi_get_drvdata(spi);
728*4882a593Smuzhiyun
729*4882a593Smuzhiyun /* carefully shut down irq and workqueue, if present */
730*4882a593Smuzhiyun if (spi->irq) {
731*4882a593Smuzhiyun set_bit(FLAG_EXITING, &ds1305->flags);
732*4882a593Smuzhiyun devm_free_irq(&spi->dev, spi->irq, ds1305);
733*4882a593Smuzhiyun cancel_work_sync(&ds1305->work);
734*4882a593Smuzhiyun }
735*4882a593Smuzhiyun
736*4882a593Smuzhiyun return 0;
737*4882a593Smuzhiyun }
738*4882a593Smuzhiyun
739*4882a593Smuzhiyun static struct spi_driver ds1305_driver = {
740*4882a593Smuzhiyun .driver.name = "rtc-ds1305",
741*4882a593Smuzhiyun .probe = ds1305_probe,
742*4882a593Smuzhiyun .remove = ds1305_remove,
743*4882a593Smuzhiyun /* REVISIT add suspend/resume */
744*4882a593Smuzhiyun };
745*4882a593Smuzhiyun
746*4882a593Smuzhiyun module_spi_driver(ds1305_driver);
747*4882a593Smuzhiyun
748*4882a593Smuzhiyun MODULE_DESCRIPTION("RTC driver for DS1305 and DS1306 chips");
749*4882a593Smuzhiyun MODULE_LICENSE("GPL");
750*4882a593Smuzhiyun MODULE_ALIAS("spi:rtc-ds1305");
751