1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * rtc-ab-b5ze-s3 - Driver for Abracon AB-RTCMC-32.768Khz-B5ZE-S3
4*4882a593Smuzhiyun * I2C RTC / Alarm chip
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Copyright (C) 2014, Arnaud EBALARD <arno@natisbad.org>
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * Detailed datasheet of the chip is available here:
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * https://www.abracon.com/realtimeclock/AB-RTCMC-32.768kHz-B5ZE-S3-Application-Manual.pdf
11*4882a593Smuzhiyun *
12*4882a593Smuzhiyun * This work is based on ISL12057 driver (drivers/rtc/rtc-isl12057.c).
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun */
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun #include <linux/module.h>
17*4882a593Smuzhiyun #include <linux/rtc.h>
18*4882a593Smuzhiyun #include <linux/i2c.h>
19*4882a593Smuzhiyun #include <linux/bcd.h>
20*4882a593Smuzhiyun #include <linux/of.h>
21*4882a593Smuzhiyun #include <linux/regmap.h>
22*4882a593Smuzhiyun #include <linux/interrupt.h>
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun #define DRV_NAME "rtc-ab-b5ze-s3"
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun /* Control section */
27*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL1 0x00 /* Control 1 register */
28*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL1_CIE BIT(0) /* Pulse interrupt enable */
29*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL1_AIE BIT(1) /* Alarm interrupt enable */
30*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL1_SIE BIT(2) /* Second interrupt enable */
31*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL1_PM BIT(3) /* 24h/12h mode */
32*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL1_SR BIT(4) /* Software reset */
33*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL1_STOP BIT(5) /* RTC circuit enable */
34*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL1_CAP BIT(7)
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL2 0x01 /* Control 2 register */
37*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL2_CTBIE BIT(0) /* Countdown timer B int. enable */
38*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL2_CTAIE BIT(1) /* Countdown timer A int. enable */
39*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL2_WTAIE BIT(2) /* Watchdog timer A int. enable */
40*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL2_AF BIT(3) /* Alarm interrupt status */
41*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL2_SF BIT(4) /* Second interrupt status */
42*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL2_CTBF BIT(5) /* Countdown timer B int. status */
43*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL2_CTAF BIT(6) /* Countdown timer A int. status */
44*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL2_WTAF BIT(7) /* Watchdog timer A int. status */
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL3 0x02 /* Control 3 register */
47*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL3_PM2 BIT(7) /* Power Management bit 2 */
48*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL3_PM1 BIT(6) /* Power Management bit 1 */
49*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL3_PM0 BIT(5) /* Power Management bit 0 */
50*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL3_BSF BIT(3) /* Battery switchover int. status */
51*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL3_BLF BIT(2) /* Battery low int. status */
52*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL3_BSIE BIT(1) /* Battery switchover int. enable */
53*4882a593Smuzhiyun #define ABB5ZES3_REG_CTRL3_BLIE BIT(0) /* Battery low int. enable */
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun #define ABB5ZES3_CTRL_SEC_LEN 3
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun /* RTC section */
58*4882a593Smuzhiyun #define ABB5ZES3_REG_RTC_SC 0x03 /* RTC Seconds register */
59*4882a593Smuzhiyun #define ABB5ZES3_REG_RTC_SC_OSC BIT(7) /* Clock integrity status */
60*4882a593Smuzhiyun #define ABB5ZES3_REG_RTC_MN 0x04 /* RTC Minutes register */
61*4882a593Smuzhiyun #define ABB5ZES3_REG_RTC_HR 0x05 /* RTC Hours register */
62*4882a593Smuzhiyun #define ABB5ZES3_REG_RTC_HR_PM BIT(5) /* RTC Hours PM bit */
63*4882a593Smuzhiyun #define ABB5ZES3_REG_RTC_DT 0x06 /* RTC Date register */
64*4882a593Smuzhiyun #define ABB5ZES3_REG_RTC_DW 0x07 /* RTC Day of the week register */
65*4882a593Smuzhiyun #define ABB5ZES3_REG_RTC_MO 0x08 /* RTC Month register */
66*4882a593Smuzhiyun #define ABB5ZES3_REG_RTC_YR 0x09 /* RTC Year register */
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun #define ABB5ZES3_RTC_SEC_LEN 7
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun /* Alarm section (enable bits are all active low) */
71*4882a593Smuzhiyun #define ABB5ZES3_REG_ALRM_MN 0x0A /* Alarm - minute register */
72*4882a593Smuzhiyun #define ABB5ZES3_REG_ALRM_MN_AE BIT(7) /* Minute enable */
73*4882a593Smuzhiyun #define ABB5ZES3_REG_ALRM_HR 0x0B /* Alarm - hours register */
74*4882a593Smuzhiyun #define ABB5ZES3_REG_ALRM_HR_AE BIT(7) /* Hour enable */
75*4882a593Smuzhiyun #define ABB5ZES3_REG_ALRM_DT 0x0C /* Alarm - date register */
76*4882a593Smuzhiyun #define ABB5ZES3_REG_ALRM_DT_AE BIT(7) /* Date (day of the month) enable */
77*4882a593Smuzhiyun #define ABB5ZES3_REG_ALRM_DW 0x0D /* Alarm - day of the week reg. */
78*4882a593Smuzhiyun #define ABB5ZES3_REG_ALRM_DW_AE BIT(7) /* Day of the week enable */
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun #define ABB5ZES3_ALRM_SEC_LEN 4
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun /* Frequency offset section */
83*4882a593Smuzhiyun #define ABB5ZES3_REG_FREQ_OF 0x0E /* Frequency offset register */
84*4882a593Smuzhiyun #define ABB5ZES3_REG_FREQ_OF_MODE 0x0E /* Offset mode: 2 hours / minute */
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun /* CLOCKOUT section */
87*4882a593Smuzhiyun #define ABB5ZES3_REG_TIM_CLK 0x0F /* Timer & Clockout register */
88*4882a593Smuzhiyun #define ABB5ZES3_REG_TIM_CLK_TAM BIT(7) /* Permanent/pulsed timer A/int. 2 */
89*4882a593Smuzhiyun #define ABB5ZES3_REG_TIM_CLK_TBM BIT(6) /* Permanent/pulsed timer B */
90*4882a593Smuzhiyun #define ABB5ZES3_REG_TIM_CLK_COF2 BIT(5) /* Clkout Freq bit 2 */
91*4882a593Smuzhiyun #define ABB5ZES3_REG_TIM_CLK_COF1 BIT(4) /* Clkout Freq bit 1 */
92*4882a593Smuzhiyun #define ABB5ZES3_REG_TIM_CLK_COF0 BIT(3) /* Clkout Freq bit 0 */
93*4882a593Smuzhiyun #define ABB5ZES3_REG_TIM_CLK_TAC1 BIT(2) /* Timer A: - 01 : countdown */
94*4882a593Smuzhiyun #define ABB5ZES3_REG_TIM_CLK_TAC0 BIT(1) /* - 10 : timer */
95*4882a593Smuzhiyun #define ABB5ZES3_REG_TIM_CLK_TBC BIT(0) /* Timer B enable */
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun /* Timer A Section */
98*4882a593Smuzhiyun #define ABB5ZES3_REG_TIMA_CLK 0x10 /* Timer A clock register */
99*4882a593Smuzhiyun #define ABB5ZES3_REG_TIMA_CLK_TAQ2 BIT(2) /* Freq bit 2 */
100*4882a593Smuzhiyun #define ABB5ZES3_REG_TIMA_CLK_TAQ1 BIT(1) /* Freq bit 1 */
101*4882a593Smuzhiyun #define ABB5ZES3_REG_TIMA_CLK_TAQ0 BIT(0) /* Freq bit 0 */
102*4882a593Smuzhiyun #define ABB5ZES3_REG_TIMA 0x11 /* Timer A register */
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun #define ABB5ZES3_TIMA_SEC_LEN 2
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun /* Timer B Section */
107*4882a593Smuzhiyun #define ABB5ZES3_REG_TIMB_CLK 0x12 /* Timer B clock register */
108*4882a593Smuzhiyun #define ABB5ZES3_REG_TIMB_CLK_TBW2 BIT(6)
109*4882a593Smuzhiyun #define ABB5ZES3_REG_TIMB_CLK_TBW1 BIT(5)
110*4882a593Smuzhiyun #define ABB5ZES3_REG_TIMB_CLK_TBW0 BIT(4)
111*4882a593Smuzhiyun #define ABB5ZES3_REG_TIMB_CLK_TAQ2 BIT(2)
112*4882a593Smuzhiyun #define ABB5ZES3_REG_TIMB_CLK_TAQ1 BIT(1)
113*4882a593Smuzhiyun #define ABB5ZES3_REG_TIMB_CLK_TAQ0 BIT(0)
114*4882a593Smuzhiyun #define ABB5ZES3_REG_TIMB 0x13 /* Timer B register */
115*4882a593Smuzhiyun #define ABB5ZES3_TIMB_SEC_LEN 2
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun #define ABB5ZES3_MEM_MAP_LEN 0x14
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun struct abb5zes3_rtc_data {
120*4882a593Smuzhiyun struct rtc_device *rtc;
121*4882a593Smuzhiyun struct regmap *regmap;
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun int irq;
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun bool battery_low;
126*4882a593Smuzhiyun bool timer_alarm; /* current alarm is via timer A */
127*4882a593Smuzhiyun };
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun /*
130*4882a593Smuzhiyun * Try and match register bits w/ fixed null values to see whether we
131*4882a593Smuzhiyun * are dealing with an ABB5ZES3.
132*4882a593Smuzhiyun */
abb5zes3_i2c_validate_chip(struct regmap * regmap)133*4882a593Smuzhiyun static int abb5zes3_i2c_validate_chip(struct regmap *regmap)
134*4882a593Smuzhiyun {
135*4882a593Smuzhiyun u8 regs[ABB5ZES3_MEM_MAP_LEN];
136*4882a593Smuzhiyun static const u8 mask[ABB5ZES3_MEM_MAP_LEN] = { 0x00, 0x00, 0x10, 0x00,
137*4882a593Smuzhiyun 0x80, 0xc0, 0xc0, 0xf8,
138*4882a593Smuzhiyun 0xe0, 0x00, 0x00, 0x40,
139*4882a593Smuzhiyun 0x40, 0x78, 0x00, 0x00,
140*4882a593Smuzhiyun 0xf8, 0x00, 0x88, 0x00 };
141*4882a593Smuzhiyun int ret, i;
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun ret = regmap_bulk_read(regmap, 0, regs, ABB5ZES3_MEM_MAP_LEN);
144*4882a593Smuzhiyun if (ret)
145*4882a593Smuzhiyun return ret;
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun for (i = 0; i < ABB5ZES3_MEM_MAP_LEN; ++i) {
148*4882a593Smuzhiyun if (regs[i] & mask[i]) /* check if bits are cleared */
149*4882a593Smuzhiyun return -ENODEV;
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun return 0;
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun /* Clear alarm status bit. */
_abb5zes3_rtc_clear_alarm(struct device * dev)156*4882a593Smuzhiyun static int _abb5zes3_rtc_clear_alarm(struct device *dev)
157*4882a593Smuzhiyun {
158*4882a593Smuzhiyun struct abb5zes3_rtc_data *data = dev_get_drvdata(dev);
159*4882a593Smuzhiyun int ret;
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun ret = regmap_update_bits(data->regmap, ABB5ZES3_REG_CTRL2,
162*4882a593Smuzhiyun ABB5ZES3_REG_CTRL2_AF, 0);
163*4882a593Smuzhiyun if (ret)
164*4882a593Smuzhiyun dev_err(dev, "%s: clearing alarm failed (%d)\n", __func__, ret);
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun return ret;
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun /* Enable or disable alarm (i.e. alarm interrupt generation) */
_abb5zes3_rtc_update_alarm(struct device * dev,bool enable)170*4882a593Smuzhiyun static int _abb5zes3_rtc_update_alarm(struct device *dev, bool enable)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun struct abb5zes3_rtc_data *data = dev_get_drvdata(dev);
173*4882a593Smuzhiyun int ret;
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun ret = regmap_update_bits(data->regmap, ABB5ZES3_REG_CTRL1,
176*4882a593Smuzhiyun ABB5ZES3_REG_CTRL1_AIE,
177*4882a593Smuzhiyun enable ? ABB5ZES3_REG_CTRL1_AIE : 0);
178*4882a593Smuzhiyun if (ret)
179*4882a593Smuzhiyun dev_err(dev, "%s: writing alarm INT failed (%d)\n",
180*4882a593Smuzhiyun __func__, ret);
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun return ret;
183*4882a593Smuzhiyun }
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun /* Enable or disable timer (watchdog timer A interrupt generation) */
_abb5zes3_rtc_update_timer(struct device * dev,bool enable)186*4882a593Smuzhiyun static int _abb5zes3_rtc_update_timer(struct device *dev, bool enable)
187*4882a593Smuzhiyun {
188*4882a593Smuzhiyun struct abb5zes3_rtc_data *data = dev_get_drvdata(dev);
189*4882a593Smuzhiyun int ret;
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun ret = regmap_update_bits(data->regmap, ABB5ZES3_REG_CTRL2,
192*4882a593Smuzhiyun ABB5ZES3_REG_CTRL2_WTAIE,
193*4882a593Smuzhiyun enable ? ABB5ZES3_REG_CTRL2_WTAIE : 0);
194*4882a593Smuzhiyun if (ret)
195*4882a593Smuzhiyun dev_err(dev, "%s: writing timer INT failed (%d)\n",
196*4882a593Smuzhiyun __func__, ret);
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun return ret;
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun /*
202*4882a593Smuzhiyun * Note: we only read, so regmap inner lock protection is sufficient, i.e.
203*4882a593Smuzhiyun * we do not need driver's main lock protection.
204*4882a593Smuzhiyun */
_abb5zes3_rtc_read_time(struct device * dev,struct rtc_time * tm)205*4882a593Smuzhiyun static int _abb5zes3_rtc_read_time(struct device *dev, struct rtc_time *tm)
206*4882a593Smuzhiyun {
207*4882a593Smuzhiyun struct abb5zes3_rtc_data *data = dev_get_drvdata(dev);
208*4882a593Smuzhiyun u8 regs[ABB5ZES3_REG_RTC_SC + ABB5ZES3_RTC_SEC_LEN];
209*4882a593Smuzhiyun int ret = 0;
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun /*
212*4882a593Smuzhiyun * As we need to read CTRL1 register anyway to access 24/12h
213*4882a593Smuzhiyun * mode bit, we do a single bulk read of both control and RTC
214*4882a593Smuzhiyun * sections (they are consecutive). This also ease indexing
215*4882a593Smuzhiyun * of register values after bulk read.
216*4882a593Smuzhiyun */
217*4882a593Smuzhiyun ret = regmap_bulk_read(data->regmap, ABB5ZES3_REG_CTRL1, regs,
218*4882a593Smuzhiyun sizeof(regs));
219*4882a593Smuzhiyun if (ret) {
220*4882a593Smuzhiyun dev_err(dev, "%s: reading RTC time failed (%d)\n",
221*4882a593Smuzhiyun __func__, ret);
222*4882a593Smuzhiyun return ret;
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun /* If clock integrity is not guaranteed, do not return a time value */
226*4882a593Smuzhiyun if (regs[ABB5ZES3_REG_RTC_SC] & ABB5ZES3_REG_RTC_SC_OSC)
227*4882a593Smuzhiyun return -ENODATA;
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun tm->tm_sec = bcd2bin(regs[ABB5ZES3_REG_RTC_SC] & 0x7F);
230*4882a593Smuzhiyun tm->tm_min = bcd2bin(regs[ABB5ZES3_REG_RTC_MN]);
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun if (regs[ABB5ZES3_REG_CTRL1] & ABB5ZES3_REG_CTRL1_PM) { /* 12hr mode */
233*4882a593Smuzhiyun tm->tm_hour = bcd2bin(regs[ABB5ZES3_REG_RTC_HR] & 0x1f);
234*4882a593Smuzhiyun if (regs[ABB5ZES3_REG_RTC_HR] & ABB5ZES3_REG_RTC_HR_PM) /* PM */
235*4882a593Smuzhiyun tm->tm_hour += 12;
236*4882a593Smuzhiyun } else { /* 24hr mode */
237*4882a593Smuzhiyun tm->tm_hour = bcd2bin(regs[ABB5ZES3_REG_RTC_HR]);
238*4882a593Smuzhiyun }
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun tm->tm_mday = bcd2bin(regs[ABB5ZES3_REG_RTC_DT]);
241*4882a593Smuzhiyun tm->tm_wday = bcd2bin(regs[ABB5ZES3_REG_RTC_DW]);
242*4882a593Smuzhiyun tm->tm_mon = bcd2bin(regs[ABB5ZES3_REG_RTC_MO]) - 1; /* starts at 1 */
243*4882a593Smuzhiyun tm->tm_year = bcd2bin(regs[ABB5ZES3_REG_RTC_YR]) + 100;
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun return ret;
246*4882a593Smuzhiyun }
247*4882a593Smuzhiyun
abb5zes3_rtc_set_time(struct device * dev,struct rtc_time * tm)248*4882a593Smuzhiyun static int abb5zes3_rtc_set_time(struct device *dev, struct rtc_time *tm)
249*4882a593Smuzhiyun {
250*4882a593Smuzhiyun struct abb5zes3_rtc_data *data = dev_get_drvdata(dev);
251*4882a593Smuzhiyun u8 regs[ABB5ZES3_REG_RTC_SC + ABB5ZES3_RTC_SEC_LEN];
252*4882a593Smuzhiyun int ret;
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun regs[ABB5ZES3_REG_RTC_SC] = bin2bcd(tm->tm_sec); /* MSB=0 clears OSC */
255*4882a593Smuzhiyun regs[ABB5ZES3_REG_RTC_MN] = bin2bcd(tm->tm_min);
256*4882a593Smuzhiyun regs[ABB5ZES3_REG_RTC_HR] = bin2bcd(tm->tm_hour); /* 24-hour format */
257*4882a593Smuzhiyun regs[ABB5ZES3_REG_RTC_DT] = bin2bcd(tm->tm_mday);
258*4882a593Smuzhiyun regs[ABB5ZES3_REG_RTC_DW] = bin2bcd(tm->tm_wday);
259*4882a593Smuzhiyun regs[ABB5ZES3_REG_RTC_MO] = bin2bcd(tm->tm_mon + 1);
260*4882a593Smuzhiyun regs[ABB5ZES3_REG_RTC_YR] = bin2bcd(tm->tm_year - 100);
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun ret = regmap_bulk_write(data->regmap, ABB5ZES3_REG_RTC_SC,
263*4882a593Smuzhiyun regs + ABB5ZES3_REG_RTC_SC,
264*4882a593Smuzhiyun ABB5ZES3_RTC_SEC_LEN);
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun return ret;
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun /*
270*4882a593Smuzhiyun * Set provided TAQ and Timer A registers (TIMA_CLK and TIMA) based on
271*4882a593Smuzhiyun * given number of seconds.
272*4882a593Smuzhiyun */
sec_to_timer_a(u8 secs,u8 * taq,u8 * timer_a)273*4882a593Smuzhiyun static inline void sec_to_timer_a(u8 secs, u8 *taq, u8 *timer_a)
274*4882a593Smuzhiyun {
275*4882a593Smuzhiyun *taq = ABB5ZES3_REG_TIMA_CLK_TAQ1; /* 1Hz */
276*4882a593Smuzhiyun *timer_a = secs;
277*4882a593Smuzhiyun }
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun /*
280*4882a593Smuzhiyun * Return current number of seconds in Timer A. As we only use
281*4882a593Smuzhiyun * timer A with a 1Hz freq, this is what we expect to have.
282*4882a593Smuzhiyun */
sec_from_timer_a(u8 * secs,u8 taq,u8 timer_a)283*4882a593Smuzhiyun static inline int sec_from_timer_a(u8 *secs, u8 taq, u8 timer_a)
284*4882a593Smuzhiyun {
285*4882a593Smuzhiyun if (taq != ABB5ZES3_REG_TIMA_CLK_TAQ1) /* 1Hz */
286*4882a593Smuzhiyun return -EINVAL;
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun *secs = timer_a;
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun return 0;
291*4882a593Smuzhiyun }
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun /*
294*4882a593Smuzhiyun * Read alarm currently configured via a watchdog timer using timer A. This
295*4882a593Smuzhiyun * is done by reading current RTC time and adding remaining timer time.
296*4882a593Smuzhiyun */
_abb5zes3_rtc_read_timer(struct device * dev,struct rtc_wkalrm * alarm)297*4882a593Smuzhiyun static int _abb5zes3_rtc_read_timer(struct device *dev,
298*4882a593Smuzhiyun struct rtc_wkalrm *alarm)
299*4882a593Smuzhiyun {
300*4882a593Smuzhiyun struct abb5zes3_rtc_data *data = dev_get_drvdata(dev);
301*4882a593Smuzhiyun struct rtc_time rtc_tm, *alarm_tm = &alarm->time;
302*4882a593Smuzhiyun u8 regs[ABB5ZES3_TIMA_SEC_LEN + 1];
303*4882a593Smuzhiyun unsigned long rtc_secs;
304*4882a593Smuzhiyun unsigned int reg;
305*4882a593Smuzhiyun u8 timer_secs;
306*4882a593Smuzhiyun int ret;
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun /*
309*4882a593Smuzhiyun * Instead of doing two separate calls, because they are consecutive,
310*4882a593Smuzhiyun * we grab both clockout register and Timer A section. The latter is
311*4882a593Smuzhiyun * used to decide if timer A is enabled (as a watchdog timer).
312*4882a593Smuzhiyun */
313*4882a593Smuzhiyun ret = regmap_bulk_read(data->regmap, ABB5ZES3_REG_TIM_CLK, regs,
314*4882a593Smuzhiyun ABB5ZES3_TIMA_SEC_LEN + 1);
315*4882a593Smuzhiyun if (ret) {
316*4882a593Smuzhiyun dev_err(dev, "%s: reading Timer A section failed (%d)\n",
317*4882a593Smuzhiyun __func__, ret);
318*4882a593Smuzhiyun return ret;
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun /* get current time ... */
322*4882a593Smuzhiyun ret = _abb5zes3_rtc_read_time(dev, &rtc_tm);
323*4882a593Smuzhiyun if (ret)
324*4882a593Smuzhiyun return ret;
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun /* ... convert to seconds ... */
327*4882a593Smuzhiyun rtc_secs = rtc_tm_to_time64(&rtc_tm);
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun /* ... add remaining timer A time ... */
330*4882a593Smuzhiyun ret = sec_from_timer_a(&timer_secs, regs[1], regs[2]);
331*4882a593Smuzhiyun if (ret)
332*4882a593Smuzhiyun return ret;
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun /* ... and convert back. */
335*4882a593Smuzhiyun rtc_time64_to_tm(rtc_secs + timer_secs, alarm_tm);
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun ret = regmap_read(data->regmap, ABB5ZES3_REG_CTRL2, ®);
338*4882a593Smuzhiyun if (ret) {
339*4882a593Smuzhiyun dev_err(dev, "%s: reading ctrl reg failed (%d)\n",
340*4882a593Smuzhiyun __func__, ret);
341*4882a593Smuzhiyun return ret;
342*4882a593Smuzhiyun }
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun alarm->enabled = !!(reg & ABB5ZES3_REG_CTRL2_WTAIE);
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun return 0;
347*4882a593Smuzhiyun }
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun /* Read alarm currently configured via a RTC alarm registers. */
_abb5zes3_rtc_read_alarm(struct device * dev,struct rtc_wkalrm * alarm)350*4882a593Smuzhiyun static int _abb5zes3_rtc_read_alarm(struct device *dev,
351*4882a593Smuzhiyun struct rtc_wkalrm *alarm)
352*4882a593Smuzhiyun {
353*4882a593Smuzhiyun struct abb5zes3_rtc_data *data = dev_get_drvdata(dev);
354*4882a593Smuzhiyun struct rtc_time rtc_tm, *alarm_tm = &alarm->time;
355*4882a593Smuzhiyun unsigned long rtc_secs, alarm_secs;
356*4882a593Smuzhiyun u8 regs[ABB5ZES3_ALRM_SEC_LEN];
357*4882a593Smuzhiyun unsigned int reg;
358*4882a593Smuzhiyun int ret;
359*4882a593Smuzhiyun
360*4882a593Smuzhiyun ret = regmap_bulk_read(data->regmap, ABB5ZES3_REG_ALRM_MN, regs,
361*4882a593Smuzhiyun ABB5ZES3_ALRM_SEC_LEN);
362*4882a593Smuzhiyun if (ret) {
363*4882a593Smuzhiyun dev_err(dev, "%s: reading alarm section failed (%d)\n",
364*4882a593Smuzhiyun __func__, ret);
365*4882a593Smuzhiyun return ret;
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun alarm_tm->tm_sec = 0;
369*4882a593Smuzhiyun alarm_tm->tm_min = bcd2bin(regs[0] & 0x7f);
370*4882a593Smuzhiyun alarm_tm->tm_hour = bcd2bin(regs[1] & 0x3f);
371*4882a593Smuzhiyun alarm_tm->tm_mday = bcd2bin(regs[2] & 0x3f);
372*4882a593Smuzhiyun alarm_tm->tm_wday = -1;
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun /*
375*4882a593Smuzhiyun * The alarm section does not store year/month. We use the ones in rtc
376*4882a593Smuzhiyun * section as a basis and increment month and then year if needed to get
377*4882a593Smuzhiyun * alarm after current time.
378*4882a593Smuzhiyun */
379*4882a593Smuzhiyun ret = _abb5zes3_rtc_read_time(dev, &rtc_tm);
380*4882a593Smuzhiyun if (ret)
381*4882a593Smuzhiyun return ret;
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun alarm_tm->tm_year = rtc_tm.tm_year;
384*4882a593Smuzhiyun alarm_tm->tm_mon = rtc_tm.tm_mon;
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun rtc_secs = rtc_tm_to_time64(&rtc_tm);
387*4882a593Smuzhiyun alarm_secs = rtc_tm_to_time64(alarm_tm);
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun if (alarm_secs < rtc_secs) {
390*4882a593Smuzhiyun if (alarm_tm->tm_mon == 11) {
391*4882a593Smuzhiyun alarm_tm->tm_mon = 0;
392*4882a593Smuzhiyun alarm_tm->tm_year += 1;
393*4882a593Smuzhiyun } else {
394*4882a593Smuzhiyun alarm_tm->tm_mon += 1;
395*4882a593Smuzhiyun }
396*4882a593Smuzhiyun }
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun ret = regmap_read(data->regmap, ABB5ZES3_REG_CTRL1, ®);
399*4882a593Smuzhiyun if (ret) {
400*4882a593Smuzhiyun dev_err(dev, "%s: reading ctrl reg failed (%d)\n",
401*4882a593Smuzhiyun __func__, ret);
402*4882a593Smuzhiyun return ret;
403*4882a593Smuzhiyun }
404*4882a593Smuzhiyun
405*4882a593Smuzhiyun alarm->enabled = !!(reg & ABB5ZES3_REG_CTRL1_AIE);
406*4882a593Smuzhiyun
407*4882a593Smuzhiyun return 0;
408*4882a593Smuzhiyun }
409*4882a593Smuzhiyun
410*4882a593Smuzhiyun /*
411*4882a593Smuzhiyun * As the Alarm mechanism supported by the chip is only accurate to the
412*4882a593Smuzhiyun * minute, we use the watchdog timer mechanism provided by timer A
413*4882a593Smuzhiyun * (up to 256 seconds w/ a second accuracy) for low alarm values (below
414*4882a593Smuzhiyun * 4 minutes). Otherwise, we use the common alarm mechanism provided
415*4882a593Smuzhiyun * by the chip. In order for that to work, we keep track of currently
416*4882a593Smuzhiyun * configured timer type via 'timer_alarm' flag in our private data
417*4882a593Smuzhiyun * structure.
418*4882a593Smuzhiyun */
abb5zes3_rtc_read_alarm(struct device * dev,struct rtc_wkalrm * alarm)419*4882a593Smuzhiyun static int abb5zes3_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
420*4882a593Smuzhiyun {
421*4882a593Smuzhiyun struct abb5zes3_rtc_data *data = dev_get_drvdata(dev);
422*4882a593Smuzhiyun int ret;
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun if (data->timer_alarm)
425*4882a593Smuzhiyun ret = _abb5zes3_rtc_read_timer(dev, alarm);
426*4882a593Smuzhiyun else
427*4882a593Smuzhiyun ret = _abb5zes3_rtc_read_alarm(dev, alarm);
428*4882a593Smuzhiyun
429*4882a593Smuzhiyun return ret;
430*4882a593Smuzhiyun }
431*4882a593Smuzhiyun
432*4882a593Smuzhiyun /*
433*4882a593Smuzhiyun * Set alarm using chip alarm mechanism. It is only accurate to the
434*4882a593Smuzhiyun * minute (not the second). The function expects alarm interrupt to
435*4882a593Smuzhiyun * be disabled.
436*4882a593Smuzhiyun */
_abb5zes3_rtc_set_alarm(struct device * dev,struct rtc_wkalrm * alarm)437*4882a593Smuzhiyun static int _abb5zes3_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
438*4882a593Smuzhiyun {
439*4882a593Smuzhiyun struct abb5zes3_rtc_data *data = dev_get_drvdata(dev);
440*4882a593Smuzhiyun struct rtc_time *alarm_tm = &alarm->time;
441*4882a593Smuzhiyun u8 regs[ABB5ZES3_ALRM_SEC_LEN];
442*4882a593Smuzhiyun struct rtc_time rtc_tm;
443*4882a593Smuzhiyun int ret, enable = 1;
444*4882a593Smuzhiyun
445*4882a593Smuzhiyun if (!alarm->enabled) {
446*4882a593Smuzhiyun enable = 0;
447*4882a593Smuzhiyun } else {
448*4882a593Smuzhiyun unsigned long rtc_secs, alarm_secs;
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun /*
451*4882a593Smuzhiyun * Chip only support alarms up to one month in the future. Let's
452*4882a593Smuzhiyun * return an error if we get something after that limit.
453*4882a593Smuzhiyun * Comparison is done by incrementing rtc_tm month field by one
454*4882a593Smuzhiyun * and checking alarm value is still below.
455*4882a593Smuzhiyun */
456*4882a593Smuzhiyun ret = _abb5zes3_rtc_read_time(dev, &rtc_tm);
457*4882a593Smuzhiyun if (ret)
458*4882a593Smuzhiyun return ret;
459*4882a593Smuzhiyun
460*4882a593Smuzhiyun if (rtc_tm.tm_mon == 11) { /* handle year wrapping */
461*4882a593Smuzhiyun rtc_tm.tm_mon = 0;
462*4882a593Smuzhiyun rtc_tm.tm_year += 1;
463*4882a593Smuzhiyun } else {
464*4882a593Smuzhiyun rtc_tm.tm_mon += 1;
465*4882a593Smuzhiyun }
466*4882a593Smuzhiyun
467*4882a593Smuzhiyun rtc_secs = rtc_tm_to_time64(&rtc_tm);
468*4882a593Smuzhiyun alarm_secs = rtc_tm_to_time64(alarm_tm);
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun if (alarm_secs > rtc_secs) {
471*4882a593Smuzhiyun dev_err(dev, "%s: alarm maximum is one month in the future (%d)\n",
472*4882a593Smuzhiyun __func__, ret);
473*4882a593Smuzhiyun return -EINVAL;
474*4882a593Smuzhiyun }
475*4882a593Smuzhiyun }
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun /*
478*4882a593Smuzhiyun * Program all alarm registers but DW one. For each register, setting
479*4882a593Smuzhiyun * MSB to 0 enables associated alarm.
480*4882a593Smuzhiyun */
481*4882a593Smuzhiyun regs[0] = bin2bcd(alarm_tm->tm_min) & 0x7f;
482*4882a593Smuzhiyun regs[1] = bin2bcd(alarm_tm->tm_hour) & 0x3f;
483*4882a593Smuzhiyun regs[2] = bin2bcd(alarm_tm->tm_mday) & 0x3f;
484*4882a593Smuzhiyun regs[3] = ABB5ZES3_REG_ALRM_DW_AE; /* do not match day of the week */
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun ret = regmap_bulk_write(data->regmap, ABB5ZES3_REG_ALRM_MN, regs,
487*4882a593Smuzhiyun ABB5ZES3_ALRM_SEC_LEN);
488*4882a593Smuzhiyun if (ret < 0) {
489*4882a593Smuzhiyun dev_err(dev, "%s: writing ALARM section failed (%d)\n",
490*4882a593Smuzhiyun __func__, ret);
491*4882a593Smuzhiyun return ret;
492*4882a593Smuzhiyun }
493*4882a593Smuzhiyun
494*4882a593Smuzhiyun /* Record currently configured alarm is not a timer */
495*4882a593Smuzhiyun data->timer_alarm = 0;
496*4882a593Smuzhiyun
497*4882a593Smuzhiyun /* Enable or disable alarm interrupt generation */
498*4882a593Smuzhiyun return _abb5zes3_rtc_update_alarm(dev, enable);
499*4882a593Smuzhiyun }
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun /*
502*4882a593Smuzhiyun * Set alarm using timer watchdog (via timer A) mechanism. The function expects
503*4882a593Smuzhiyun * timer A interrupt to be disabled.
504*4882a593Smuzhiyun */
_abb5zes3_rtc_set_timer(struct device * dev,struct rtc_wkalrm * alarm,u8 secs)505*4882a593Smuzhiyun static int _abb5zes3_rtc_set_timer(struct device *dev, struct rtc_wkalrm *alarm,
506*4882a593Smuzhiyun u8 secs)
507*4882a593Smuzhiyun {
508*4882a593Smuzhiyun struct abb5zes3_rtc_data *data = dev_get_drvdata(dev);
509*4882a593Smuzhiyun u8 regs[ABB5ZES3_TIMA_SEC_LEN];
510*4882a593Smuzhiyun u8 mask = ABB5ZES3_REG_TIM_CLK_TAC0 | ABB5ZES3_REG_TIM_CLK_TAC1;
511*4882a593Smuzhiyun int ret = 0;
512*4882a593Smuzhiyun
513*4882a593Smuzhiyun /* Program given number of seconds to Timer A registers */
514*4882a593Smuzhiyun sec_to_timer_a(secs, ®s[0], ®s[1]);
515*4882a593Smuzhiyun ret = regmap_bulk_write(data->regmap, ABB5ZES3_REG_TIMA_CLK, regs,
516*4882a593Smuzhiyun ABB5ZES3_TIMA_SEC_LEN);
517*4882a593Smuzhiyun if (ret < 0) {
518*4882a593Smuzhiyun dev_err(dev, "%s: writing timer section failed\n", __func__);
519*4882a593Smuzhiyun return ret;
520*4882a593Smuzhiyun }
521*4882a593Smuzhiyun
522*4882a593Smuzhiyun /* Configure Timer A as a watchdog timer */
523*4882a593Smuzhiyun ret = regmap_update_bits(data->regmap, ABB5ZES3_REG_TIM_CLK,
524*4882a593Smuzhiyun mask, ABB5ZES3_REG_TIM_CLK_TAC1);
525*4882a593Smuzhiyun if (ret)
526*4882a593Smuzhiyun dev_err(dev, "%s: failed to update timer\n", __func__);
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun /* Record currently configured alarm is a timer */
529*4882a593Smuzhiyun data->timer_alarm = 1;
530*4882a593Smuzhiyun
531*4882a593Smuzhiyun /* Enable or disable timer interrupt generation */
532*4882a593Smuzhiyun return _abb5zes3_rtc_update_timer(dev, alarm->enabled);
533*4882a593Smuzhiyun }
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun /*
536*4882a593Smuzhiyun * The chip has an alarm which is only accurate to the minute. In order to
537*4882a593Smuzhiyun * handle alarms below that limit, we use the watchdog timer function of
538*4882a593Smuzhiyun * timer A. More precisely, the timer method is used for alarms below 240
539*4882a593Smuzhiyun * seconds.
540*4882a593Smuzhiyun */
abb5zes3_rtc_set_alarm(struct device * dev,struct rtc_wkalrm * alarm)541*4882a593Smuzhiyun static int abb5zes3_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
542*4882a593Smuzhiyun {
543*4882a593Smuzhiyun struct abb5zes3_rtc_data *data = dev_get_drvdata(dev);
544*4882a593Smuzhiyun struct rtc_time *alarm_tm = &alarm->time;
545*4882a593Smuzhiyun unsigned long rtc_secs, alarm_secs;
546*4882a593Smuzhiyun struct rtc_time rtc_tm;
547*4882a593Smuzhiyun int ret;
548*4882a593Smuzhiyun
549*4882a593Smuzhiyun ret = _abb5zes3_rtc_read_time(dev, &rtc_tm);
550*4882a593Smuzhiyun if (ret)
551*4882a593Smuzhiyun return ret;
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun rtc_secs = rtc_tm_to_time64(&rtc_tm);
554*4882a593Smuzhiyun alarm_secs = rtc_tm_to_time64(alarm_tm);
555*4882a593Smuzhiyun
556*4882a593Smuzhiyun /* Let's first disable both the alarm and the timer interrupts */
557*4882a593Smuzhiyun ret = _abb5zes3_rtc_update_alarm(dev, false);
558*4882a593Smuzhiyun if (ret < 0) {
559*4882a593Smuzhiyun dev_err(dev, "%s: unable to disable alarm (%d)\n", __func__,
560*4882a593Smuzhiyun ret);
561*4882a593Smuzhiyun return ret;
562*4882a593Smuzhiyun }
563*4882a593Smuzhiyun ret = _abb5zes3_rtc_update_timer(dev, false);
564*4882a593Smuzhiyun if (ret < 0) {
565*4882a593Smuzhiyun dev_err(dev, "%s: unable to disable timer (%d)\n", __func__,
566*4882a593Smuzhiyun ret);
567*4882a593Smuzhiyun return ret;
568*4882a593Smuzhiyun }
569*4882a593Smuzhiyun
570*4882a593Smuzhiyun data->timer_alarm = 0;
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun /*
573*4882a593Smuzhiyun * Let's now configure the alarm; if we are expected to ring in
574*4882a593Smuzhiyun * more than 240s, then we setup an alarm. Otherwise, a timer.
575*4882a593Smuzhiyun */
576*4882a593Smuzhiyun if ((alarm_secs > rtc_secs) && ((alarm_secs - rtc_secs) <= 240))
577*4882a593Smuzhiyun ret = _abb5zes3_rtc_set_timer(dev, alarm,
578*4882a593Smuzhiyun alarm_secs - rtc_secs);
579*4882a593Smuzhiyun else
580*4882a593Smuzhiyun ret = _abb5zes3_rtc_set_alarm(dev, alarm);
581*4882a593Smuzhiyun
582*4882a593Smuzhiyun if (ret)
583*4882a593Smuzhiyun dev_err(dev, "%s: unable to configure alarm (%d)\n", __func__,
584*4882a593Smuzhiyun ret);
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun return ret;
587*4882a593Smuzhiyun }
588*4882a593Smuzhiyun
589*4882a593Smuzhiyun /* Enable or disable battery low irq generation */
_abb5zes3_rtc_battery_low_irq_enable(struct regmap * regmap,bool enable)590*4882a593Smuzhiyun static inline int _abb5zes3_rtc_battery_low_irq_enable(struct regmap *regmap,
591*4882a593Smuzhiyun bool enable)
592*4882a593Smuzhiyun {
593*4882a593Smuzhiyun return regmap_update_bits(regmap, ABB5ZES3_REG_CTRL3,
594*4882a593Smuzhiyun ABB5ZES3_REG_CTRL3_BLIE,
595*4882a593Smuzhiyun enable ? ABB5ZES3_REG_CTRL3_BLIE : 0);
596*4882a593Smuzhiyun }
597*4882a593Smuzhiyun
598*4882a593Smuzhiyun /*
599*4882a593Smuzhiyun * Check current RTC status and enable/disable what needs to be. Return 0 if
600*4882a593Smuzhiyun * everything went ok and a negative value upon error.
601*4882a593Smuzhiyun */
abb5zes3_rtc_check_setup(struct device * dev)602*4882a593Smuzhiyun static int abb5zes3_rtc_check_setup(struct device *dev)
603*4882a593Smuzhiyun {
604*4882a593Smuzhiyun struct abb5zes3_rtc_data *data = dev_get_drvdata(dev);
605*4882a593Smuzhiyun struct regmap *regmap = data->regmap;
606*4882a593Smuzhiyun unsigned int reg;
607*4882a593Smuzhiyun int ret;
608*4882a593Smuzhiyun u8 mask;
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun /*
611*4882a593Smuzhiyun * By default, the devices generates a 32.768KHz signal on IRQ#1 pin. It
612*4882a593Smuzhiyun * is disabled here to prevent polluting the interrupt line and
613*4882a593Smuzhiyun * uselessly triggering the IRQ handler we install for alarm and battery
614*4882a593Smuzhiyun * low events. Note: this is done before clearing int. status below
615*4882a593Smuzhiyun * in this function.
616*4882a593Smuzhiyun * We also disable all timers and set timer interrupt to permanent (not
617*4882a593Smuzhiyun * pulsed).
618*4882a593Smuzhiyun */
619*4882a593Smuzhiyun mask = (ABB5ZES3_REG_TIM_CLK_TBC | ABB5ZES3_REG_TIM_CLK_TAC0 |
620*4882a593Smuzhiyun ABB5ZES3_REG_TIM_CLK_TAC1 | ABB5ZES3_REG_TIM_CLK_COF0 |
621*4882a593Smuzhiyun ABB5ZES3_REG_TIM_CLK_COF1 | ABB5ZES3_REG_TIM_CLK_COF2 |
622*4882a593Smuzhiyun ABB5ZES3_REG_TIM_CLK_TBM | ABB5ZES3_REG_TIM_CLK_TAM);
623*4882a593Smuzhiyun ret = regmap_update_bits(regmap, ABB5ZES3_REG_TIM_CLK, mask,
624*4882a593Smuzhiyun ABB5ZES3_REG_TIM_CLK_COF0 |
625*4882a593Smuzhiyun ABB5ZES3_REG_TIM_CLK_COF1 |
626*4882a593Smuzhiyun ABB5ZES3_REG_TIM_CLK_COF2);
627*4882a593Smuzhiyun if (ret < 0) {
628*4882a593Smuzhiyun dev_err(dev, "%s: unable to initialize clkout register (%d)\n",
629*4882a593Smuzhiyun __func__, ret);
630*4882a593Smuzhiyun return ret;
631*4882a593Smuzhiyun }
632*4882a593Smuzhiyun
633*4882a593Smuzhiyun /*
634*4882a593Smuzhiyun * Each component of the alarm (MN, HR, DT, DW) can be enabled/disabled
635*4882a593Smuzhiyun * individually by clearing/setting MSB of each associated register. So,
636*4882a593Smuzhiyun * we set all alarm enable bits to disable current alarm setting.
637*4882a593Smuzhiyun */
638*4882a593Smuzhiyun mask = (ABB5ZES3_REG_ALRM_MN_AE | ABB5ZES3_REG_ALRM_HR_AE |
639*4882a593Smuzhiyun ABB5ZES3_REG_ALRM_DT_AE | ABB5ZES3_REG_ALRM_DW_AE);
640*4882a593Smuzhiyun ret = regmap_update_bits(regmap, ABB5ZES3_REG_CTRL2, mask, mask);
641*4882a593Smuzhiyun if (ret < 0) {
642*4882a593Smuzhiyun dev_err(dev, "%s: unable to disable alarm setting (%d)\n",
643*4882a593Smuzhiyun __func__, ret);
644*4882a593Smuzhiyun return ret;
645*4882a593Smuzhiyun }
646*4882a593Smuzhiyun
647*4882a593Smuzhiyun /* Set Control 1 register (RTC enabled, 24hr mode, all int. disabled) */
648*4882a593Smuzhiyun mask = (ABB5ZES3_REG_CTRL1_CIE | ABB5ZES3_REG_CTRL1_AIE |
649*4882a593Smuzhiyun ABB5ZES3_REG_CTRL1_SIE | ABB5ZES3_REG_CTRL1_PM |
650*4882a593Smuzhiyun ABB5ZES3_REG_CTRL1_CAP | ABB5ZES3_REG_CTRL1_STOP);
651*4882a593Smuzhiyun ret = regmap_update_bits(regmap, ABB5ZES3_REG_CTRL1, mask, 0);
652*4882a593Smuzhiyun if (ret < 0) {
653*4882a593Smuzhiyun dev_err(dev, "%s: unable to initialize CTRL1 register (%d)\n",
654*4882a593Smuzhiyun __func__, ret);
655*4882a593Smuzhiyun return ret;
656*4882a593Smuzhiyun }
657*4882a593Smuzhiyun
658*4882a593Smuzhiyun /*
659*4882a593Smuzhiyun * Set Control 2 register (timer int. disabled, alarm status cleared).
660*4882a593Smuzhiyun * WTAF is read-only and cleared automatically by reading the register.
661*4882a593Smuzhiyun */
662*4882a593Smuzhiyun mask = (ABB5ZES3_REG_CTRL2_CTBIE | ABB5ZES3_REG_CTRL2_CTAIE |
663*4882a593Smuzhiyun ABB5ZES3_REG_CTRL2_WTAIE | ABB5ZES3_REG_CTRL2_AF |
664*4882a593Smuzhiyun ABB5ZES3_REG_CTRL2_SF | ABB5ZES3_REG_CTRL2_CTBF |
665*4882a593Smuzhiyun ABB5ZES3_REG_CTRL2_CTAF);
666*4882a593Smuzhiyun ret = regmap_update_bits(regmap, ABB5ZES3_REG_CTRL2, mask, 0);
667*4882a593Smuzhiyun if (ret < 0) {
668*4882a593Smuzhiyun dev_err(dev, "%s: unable to initialize CTRL2 register (%d)\n",
669*4882a593Smuzhiyun __func__, ret);
670*4882a593Smuzhiyun return ret;
671*4882a593Smuzhiyun }
672*4882a593Smuzhiyun
673*4882a593Smuzhiyun /*
674*4882a593Smuzhiyun * Enable battery low detection function and battery switchover function
675*4882a593Smuzhiyun * (standard mode). Disable associated interrupts. Clear battery
676*4882a593Smuzhiyun * switchover flag but not battery low flag. The latter is checked
677*4882a593Smuzhiyun * later below.
678*4882a593Smuzhiyun */
679*4882a593Smuzhiyun mask = (ABB5ZES3_REG_CTRL3_PM0 | ABB5ZES3_REG_CTRL3_PM1 |
680*4882a593Smuzhiyun ABB5ZES3_REG_CTRL3_PM2 | ABB5ZES3_REG_CTRL3_BLIE |
681*4882a593Smuzhiyun ABB5ZES3_REG_CTRL3_BSIE | ABB5ZES3_REG_CTRL3_BSF);
682*4882a593Smuzhiyun ret = regmap_update_bits(regmap, ABB5ZES3_REG_CTRL3, mask, 0);
683*4882a593Smuzhiyun if (ret < 0) {
684*4882a593Smuzhiyun dev_err(dev, "%s: unable to initialize CTRL3 register (%d)\n",
685*4882a593Smuzhiyun __func__, ret);
686*4882a593Smuzhiyun return ret;
687*4882a593Smuzhiyun }
688*4882a593Smuzhiyun
689*4882a593Smuzhiyun /* Check oscillator integrity flag */
690*4882a593Smuzhiyun ret = regmap_read(regmap, ABB5ZES3_REG_RTC_SC, ®);
691*4882a593Smuzhiyun if (ret < 0) {
692*4882a593Smuzhiyun dev_err(dev, "%s: unable to read osc. integrity flag (%d)\n",
693*4882a593Smuzhiyun __func__, ret);
694*4882a593Smuzhiyun return ret;
695*4882a593Smuzhiyun }
696*4882a593Smuzhiyun
697*4882a593Smuzhiyun if (reg & ABB5ZES3_REG_RTC_SC_OSC) {
698*4882a593Smuzhiyun dev_err(dev, "clock integrity not guaranteed. Osc. has stopped or has been interrupted.\n");
699*4882a593Smuzhiyun dev_err(dev, "change battery (if not already done) and then set time to reset osc. failure flag.\n");
700*4882a593Smuzhiyun }
701*4882a593Smuzhiyun
702*4882a593Smuzhiyun /*
703*4882a593Smuzhiyun * Check battery low flag at startup: this allows reporting battery
704*4882a593Smuzhiyun * is low at startup when IRQ line is not connected. Note: we record
705*4882a593Smuzhiyun * current status to avoid reenabling this interrupt later in probe
706*4882a593Smuzhiyun * function if battery is low.
707*4882a593Smuzhiyun */
708*4882a593Smuzhiyun ret = regmap_read(regmap, ABB5ZES3_REG_CTRL3, ®);
709*4882a593Smuzhiyun if (ret < 0) {
710*4882a593Smuzhiyun dev_err(dev, "%s: unable to read battery low flag (%d)\n",
711*4882a593Smuzhiyun __func__, ret);
712*4882a593Smuzhiyun return ret;
713*4882a593Smuzhiyun }
714*4882a593Smuzhiyun
715*4882a593Smuzhiyun data->battery_low = reg & ABB5ZES3_REG_CTRL3_BLF;
716*4882a593Smuzhiyun if (data->battery_low) {
717*4882a593Smuzhiyun dev_err(dev, "RTC battery is low; please, consider changing it!\n");
718*4882a593Smuzhiyun
719*4882a593Smuzhiyun ret = _abb5zes3_rtc_battery_low_irq_enable(regmap, false);
720*4882a593Smuzhiyun if (ret)
721*4882a593Smuzhiyun dev_err(dev, "%s: disabling battery low interrupt generation failed (%d)\n",
722*4882a593Smuzhiyun __func__, ret);
723*4882a593Smuzhiyun }
724*4882a593Smuzhiyun
725*4882a593Smuzhiyun return ret;
726*4882a593Smuzhiyun }
727*4882a593Smuzhiyun
abb5zes3_rtc_alarm_irq_enable(struct device * dev,unsigned int enable)728*4882a593Smuzhiyun static int abb5zes3_rtc_alarm_irq_enable(struct device *dev,
729*4882a593Smuzhiyun unsigned int enable)
730*4882a593Smuzhiyun {
731*4882a593Smuzhiyun struct abb5zes3_rtc_data *rtc_data = dev_get_drvdata(dev);
732*4882a593Smuzhiyun int ret = 0;
733*4882a593Smuzhiyun
734*4882a593Smuzhiyun if (rtc_data->irq) {
735*4882a593Smuzhiyun if (rtc_data->timer_alarm)
736*4882a593Smuzhiyun ret = _abb5zes3_rtc_update_timer(dev, enable);
737*4882a593Smuzhiyun else
738*4882a593Smuzhiyun ret = _abb5zes3_rtc_update_alarm(dev, enable);
739*4882a593Smuzhiyun }
740*4882a593Smuzhiyun
741*4882a593Smuzhiyun return ret;
742*4882a593Smuzhiyun }
743*4882a593Smuzhiyun
_abb5zes3_rtc_interrupt(int irq,void * data)744*4882a593Smuzhiyun static irqreturn_t _abb5zes3_rtc_interrupt(int irq, void *data)
745*4882a593Smuzhiyun {
746*4882a593Smuzhiyun struct i2c_client *client = data;
747*4882a593Smuzhiyun struct device *dev = &client->dev;
748*4882a593Smuzhiyun struct abb5zes3_rtc_data *rtc_data = dev_get_drvdata(dev);
749*4882a593Smuzhiyun struct rtc_device *rtc = rtc_data->rtc;
750*4882a593Smuzhiyun u8 regs[ABB5ZES3_CTRL_SEC_LEN];
751*4882a593Smuzhiyun int ret, handled = IRQ_NONE;
752*4882a593Smuzhiyun
753*4882a593Smuzhiyun ret = regmap_bulk_read(rtc_data->regmap, 0, regs,
754*4882a593Smuzhiyun ABB5ZES3_CTRL_SEC_LEN);
755*4882a593Smuzhiyun if (ret) {
756*4882a593Smuzhiyun dev_err(dev, "%s: unable to read control section (%d)!\n",
757*4882a593Smuzhiyun __func__, ret);
758*4882a593Smuzhiyun return handled;
759*4882a593Smuzhiyun }
760*4882a593Smuzhiyun
761*4882a593Smuzhiyun /*
762*4882a593Smuzhiyun * Check battery low detection flag and disable battery low interrupt
763*4882a593Smuzhiyun * generation if flag is set (interrupt can only be cleared when
764*4882a593Smuzhiyun * battery is replaced).
765*4882a593Smuzhiyun */
766*4882a593Smuzhiyun if (regs[ABB5ZES3_REG_CTRL3] & ABB5ZES3_REG_CTRL3_BLF) {
767*4882a593Smuzhiyun dev_err(dev, "RTC battery is low; please change it!\n");
768*4882a593Smuzhiyun
769*4882a593Smuzhiyun _abb5zes3_rtc_battery_low_irq_enable(rtc_data->regmap, false);
770*4882a593Smuzhiyun
771*4882a593Smuzhiyun handled = IRQ_HANDLED;
772*4882a593Smuzhiyun }
773*4882a593Smuzhiyun
774*4882a593Smuzhiyun /* Check alarm flag */
775*4882a593Smuzhiyun if (regs[ABB5ZES3_REG_CTRL2] & ABB5ZES3_REG_CTRL2_AF) {
776*4882a593Smuzhiyun dev_dbg(dev, "RTC alarm!\n");
777*4882a593Smuzhiyun
778*4882a593Smuzhiyun rtc_update_irq(rtc, 1, RTC_IRQF | RTC_AF);
779*4882a593Smuzhiyun
780*4882a593Smuzhiyun /* Acknowledge and disable the alarm */
781*4882a593Smuzhiyun _abb5zes3_rtc_clear_alarm(dev);
782*4882a593Smuzhiyun _abb5zes3_rtc_update_alarm(dev, 0);
783*4882a593Smuzhiyun
784*4882a593Smuzhiyun handled = IRQ_HANDLED;
785*4882a593Smuzhiyun }
786*4882a593Smuzhiyun
787*4882a593Smuzhiyun /* Check watchdog Timer A flag */
788*4882a593Smuzhiyun if (regs[ABB5ZES3_REG_CTRL2] & ABB5ZES3_REG_CTRL2_WTAF) {
789*4882a593Smuzhiyun dev_dbg(dev, "RTC timer!\n");
790*4882a593Smuzhiyun
791*4882a593Smuzhiyun rtc_update_irq(rtc, 1, RTC_IRQF | RTC_AF);
792*4882a593Smuzhiyun
793*4882a593Smuzhiyun /*
794*4882a593Smuzhiyun * Acknowledge and disable the alarm. Note: WTAF
795*4882a593Smuzhiyun * flag had been cleared when reading CTRL2
796*4882a593Smuzhiyun */
797*4882a593Smuzhiyun _abb5zes3_rtc_update_timer(dev, 0);
798*4882a593Smuzhiyun
799*4882a593Smuzhiyun rtc_data->timer_alarm = 0;
800*4882a593Smuzhiyun
801*4882a593Smuzhiyun handled = IRQ_HANDLED;
802*4882a593Smuzhiyun }
803*4882a593Smuzhiyun
804*4882a593Smuzhiyun return handled;
805*4882a593Smuzhiyun }
806*4882a593Smuzhiyun
807*4882a593Smuzhiyun static const struct rtc_class_ops rtc_ops = {
808*4882a593Smuzhiyun .read_time = _abb5zes3_rtc_read_time,
809*4882a593Smuzhiyun .set_time = abb5zes3_rtc_set_time,
810*4882a593Smuzhiyun .read_alarm = abb5zes3_rtc_read_alarm,
811*4882a593Smuzhiyun .set_alarm = abb5zes3_rtc_set_alarm,
812*4882a593Smuzhiyun .alarm_irq_enable = abb5zes3_rtc_alarm_irq_enable,
813*4882a593Smuzhiyun };
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun static const struct regmap_config abb5zes3_rtc_regmap_config = {
816*4882a593Smuzhiyun .reg_bits = 8,
817*4882a593Smuzhiyun .val_bits = 8,
818*4882a593Smuzhiyun };
819*4882a593Smuzhiyun
abb5zes3_probe(struct i2c_client * client,const struct i2c_device_id * id)820*4882a593Smuzhiyun static int abb5zes3_probe(struct i2c_client *client,
821*4882a593Smuzhiyun const struct i2c_device_id *id)
822*4882a593Smuzhiyun {
823*4882a593Smuzhiyun struct abb5zes3_rtc_data *data = NULL;
824*4882a593Smuzhiyun struct device *dev = &client->dev;
825*4882a593Smuzhiyun struct regmap *regmap;
826*4882a593Smuzhiyun int ret;
827*4882a593Smuzhiyun
828*4882a593Smuzhiyun if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C |
829*4882a593Smuzhiyun I2C_FUNC_SMBUS_BYTE_DATA |
830*4882a593Smuzhiyun I2C_FUNC_SMBUS_I2C_BLOCK))
831*4882a593Smuzhiyun return -ENODEV;
832*4882a593Smuzhiyun
833*4882a593Smuzhiyun regmap = devm_regmap_init_i2c(client, &abb5zes3_rtc_regmap_config);
834*4882a593Smuzhiyun if (IS_ERR(regmap)) {
835*4882a593Smuzhiyun ret = PTR_ERR(regmap);
836*4882a593Smuzhiyun dev_err(dev, "%s: regmap allocation failed: %d\n",
837*4882a593Smuzhiyun __func__, ret);
838*4882a593Smuzhiyun return ret;
839*4882a593Smuzhiyun }
840*4882a593Smuzhiyun
841*4882a593Smuzhiyun ret = abb5zes3_i2c_validate_chip(regmap);
842*4882a593Smuzhiyun if (ret)
843*4882a593Smuzhiyun return ret;
844*4882a593Smuzhiyun
845*4882a593Smuzhiyun data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
846*4882a593Smuzhiyun if (!data)
847*4882a593Smuzhiyun return -ENOMEM;
848*4882a593Smuzhiyun
849*4882a593Smuzhiyun data->regmap = regmap;
850*4882a593Smuzhiyun dev_set_drvdata(dev, data);
851*4882a593Smuzhiyun
852*4882a593Smuzhiyun ret = abb5zes3_rtc_check_setup(dev);
853*4882a593Smuzhiyun if (ret)
854*4882a593Smuzhiyun return ret;
855*4882a593Smuzhiyun
856*4882a593Smuzhiyun data->rtc = devm_rtc_allocate_device(dev);
857*4882a593Smuzhiyun ret = PTR_ERR_OR_ZERO(data->rtc);
858*4882a593Smuzhiyun if (ret) {
859*4882a593Smuzhiyun dev_err(dev, "%s: unable to allocate RTC device (%d)\n",
860*4882a593Smuzhiyun __func__, ret);
861*4882a593Smuzhiyun return ret;
862*4882a593Smuzhiyun }
863*4882a593Smuzhiyun
864*4882a593Smuzhiyun if (client->irq > 0) {
865*4882a593Smuzhiyun ret = devm_request_threaded_irq(dev, client->irq, NULL,
866*4882a593Smuzhiyun _abb5zes3_rtc_interrupt,
867*4882a593Smuzhiyun IRQF_SHARED | IRQF_ONESHOT,
868*4882a593Smuzhiyun DRV_NAME, client);
869*4882a593Smuzhiyun if (!ret) {
870*4882a593Smuzhiyun device_init_wakeup(dev, true);
871*4882a593Smuzhiyun data->irq = client->irq;
872*4882a593Smuzhiyun dev_dbg(dev, "%s: irq %d used by RTC\n", __func__,
873*4882a593Smuzhiyun client->irq);
874*4882a593Smuzhiyun } else {
875*4882a593Smuzhiyun dev_err(dev, "%s: irq %d unavailable (%d)\n",
876*4882a593Smuzhiyun __func__, client->irq, ret);
877*4882a593Smuzhiyun goto err;
878*4882a593Smuzhiyun }
879*4882a593Smuzhiyun }
880*4882a593Smuzhiyun
881*4882a593Smuzhiyun data->rtc->ops = &rtc_ops;
882*4882a593Smuzhiyun data->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
883*4882a593Smuzhiyun data->rtc->range_max = RTC_TIMESTAMP_END_2099;
884*4882a593Smuzhiyun
885*4882a593Smuzhiyun /* Enable battery low detection interrupt if battery not already low */
886*4882a593Smuzhiyun if (!data->battery_low && data->irq) {
887*4882a593Smuzhiyun ret = _abb5zes3_rtc_battery_low_irq_enable(regmap, true);
888*4882a593Smuzhiyun if (ret) {
889*4882a593Smuzhiyun dev_err(dev, "%s: enabling battery low interrupt generation failed (%d)\n",
890*4882a593Smuzhiyun __func__, ret);
891*4882a593Smuzhiyun goto err;
892*4882a593Smuzhiyun }
893*4882a593Smuzhiyun }
894*4882a593Smuzhiyun
895*4882a593Smuzhiyun ret = rtc_register_device(data->rtc);
896*4882a593Smuzhiyun
897*4882a593Smuzhiyun err:
898*4882a593Smuzhiyun if (ret && data->irq)
899*4882a593Smuzhiyun device_init_wakeup(dev, false);
900*4882a593Smuzhiyun return ret;
901*4882a593Smuzhiyun }
902*4882a593Smuzhiyun
903*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
abb5zes3_rtc_suspend(struct device * dev)904*4882a593Smuzhiyun static int abb5zes3_rtc_suspend(struct device *dev)
905*4882a593Smuzhiyun {
906*4882a593Smuzhiyun struct abb5zes3_rtc_data *rtc_data = dev_get_drvdata(dev);
907*4882a593Smuzhiyun
908*4882a593Smuzhiyun if (device_may_wakeup(dev))
909*4882a593Smuzhiyun return enable_irq_wake(rtc_data->irq);
910*4882a593Smuzhiyun
911*4882a593Smuzhiyun return 0;
912*4882a593Smuzhiyun }
913*4882a593Smuzhiyun
abb5zes3_rtc_resume(struct device * dev)914*4882a593Smuzhiyun static int abb5zes3_rtc_resume(struct device *dev)
915*4882a593Smuzhiyun {
916*4882a593Smuzhiyun struct abb5zes3_rtc_data *rtc_data = dev_get_drvdata(dev);
917*4882a593Smuzhiyun
918*4882a593Smuzhiyun if (device_may_wakeup(dev))
919*4882a593Smuzhiyun return disable_irq_wake(rtc_data->irq);
920*4882a593Smuzhiyun
921*4882a593Smuzhiyun return 0;
922*4882a593Smuzhiyun }
923*4882a593Smuzhiyun #endif
924*4882a593Smuzhiyun
925*4882a593Smuzhiyun static SIMPLE_DEV_PM_OPS(abb5zes3_rtc_pm_ops, abb5zes3_rtc_suspend,
926*4882a593Smuzhiyun abb5zes3_rtc_resume);
927*4882a593Smuzhiyun
928*4882a593Smuzhiyun #ifdef CONFIG_OF
929*4882a593Smuzhiyun static const struct of_device_id abb5zes3_dt_match[] = {
930*4882a593Smuzhiyun { .compatible = "abracon,abb5zes3" },
931*4882a593Smuzhiyun { },
932*4882a593Smuzhiyun };
933*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, abb5zes3_dt_match);
934*4882a593Smuzhiyun #endif
935*4882a593Smuzhiyun
936*4882a593Smuzhiyun static const struct i2c_device_id abb5zes3_id[] = {
937*4882a593Smuzhiyun { "abb5zes3", 0 },
938*4882a593Smuzhiyun { }
939*4882a593Smuzhiyun };
940*4882a593Smuzhiyun MODULE_DEVICE_TABLE(i2c, abb5zes3_id);
941*4882a593Smuzhiyun
942*4882a593Smuzhiyun static struct i2c_driver abb5zes3_driver = {
943*4882a593Smuzhiyun .driver = {
944*4882a593Smuzhiyun .name = DRV_NAME,
945*4882a593Smuzhiyun .pm = &abb5zes3_rtc_pm_ops,
946*4882a593Smuzhiyun .of_match_table = of_match_ptr(abb5zes3_dt_match),
947*4882a593Smuzhiyun },
948*4882a593Smuzhiyun .probe = abb5zes3_probe,
949*4882a593Smuzhiyun .id_table = abb5zes3_id,
950*4882a593Smuzhiyun };
951*4882a593Smuzhiyun module_i2c_driver(abb5zes3_driver);
952*4882a593Smuzhiyun
953*4882a593Smuzhiyun MODULE_AUTHOR("Arnaud EBALARD <arno@natisbad.org>");
954*4882a593Smuzhiyun MODULE_DESCRIPTION("Abracon AB-RTCMC-32.768kHz-B5ZE-S3 RTC/Alarm driver");
955*4882a593Smuzhiyun MODULE_LICENSE("GPL");
956