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