xref: /OK3568_Linux_fs/kernel/drivers/rtc/rtc-ab-b5ze-s3.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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, &reg);
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, &reg);
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, &regs[0], &regs[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, &reg);
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, &reg);
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