1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * An I2C driver for the PCF85063 RTC
4*4882a593Smuzhiyun * Copyright 2014 Rose Technology
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Author: Søren Andersen <san@rosetechnology.dk>
7*4882a593Smuzhiyun * Maintainers: http://www.nslu2-linux.org/
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * Copyright (C) 2019 Micro Crystal AG
10*4882a593Smuzhiyun * Author: Alexandre Belloni <alexandre.belloni@bootlin.com>
11*4882a593Smuzhiyun */
12*4882a593Smuzhiyun #include <linux/clk-provider.h>
13*4882a593Smuzhiyun #include <linux/i2c.h>
14*4882a593Smuzhiyun #include <linux/bcd.h>
15*4882a593Smuzhiyun #include <linux/rtc.h>
16*4882a593Smuzhiyun #include <linux/module.h>
17*4882a593Smuzhiyun #include <linux/of_device.h>
18*4882a593Smuzhiyun #include <linux/pm_wakeirq.h>
19*4882a593Smuzhiyun #include <linux/regmap.h>
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun /*
22*4882a593Smuzhiyun * Information for this driver was pulled from the following datasheets.
23*4882a593Smuzhiyun *
24*4882a593Smuzhiyun * https://www.nxp.com/documents/data_sheet/PCF85063A.pdf
25*4882a593Smuzhiyun * https://www.nxp.com/documents/data_sheet/PCF85063TP.pdf
26*4882a593Smuzhiyun *
27*4882a593Smuzhiyun * PCF85063A -- Rev. 6 — 18 November 2015
28*4882a593Smuzhiyun * PCF85063TP -- Rev. 4 — 6 May 2015
29*4882a593Smuzhiyun *
30*4882a593Smuzhiyun * https://www.microcrystal.com/fileadmin/Media/Products/RTC/App.Manual/RV-8263-C7_App-Manual.pdf
31*4882a593Smuzhiyun * RV8263 -- Rev. 1.0 — January 2019
32*4882a593Smuzhiyun */
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun #define PCF85063_REG_CTRL1 0x00 /* status */
35*4882a593Smuzhiyun #define PCF85063_REG_CTRL1_CAP_SEL BIT(0)
36*4882a593Smuzhiyun #define PCF85063_REG_CTRL1_STOP BIT(5)
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun #define PCF85063_REG_CTRL2 0x01
39*4882a593Smuzhiyun #define PCF85063_CTRL2_AF BIT(6)
40*4882a593Smuzhiyun #define PCF85063_CTRL2_AIE BIT(7)
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun #define PCF85063_REG_OFFSET 0x02
43*4882a593Smuzhiyun #define PCF85063_OFFSET_SIGN_BIT 6 /* 2's complement sign bit */
44*4882a593Smuzhiyun #define PCF85063_OFFSET_MODE BIT(7)
45*4882a593Smuzhiyun #define PCF85063_OFFSET_STEP0 4340
46*4882a593Smuzhiyun #define PCF85063_OFFSET_STEP1 4069
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun #define PCF85063_REG_CLKO_F_MASK 0x07 /* frequency mask */
49*4882a593Smuzhiyun #define PCF85063_REG_CLKO_F_32768HZ 0x00
50*4882a593Smuzhiyun #define PCF85063_REG_CLKO_F_OFF 0x07
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun #define PCF85063_REG_RAM 0x03
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun #define PCF85063_REG_SC 0x04 /* datetime */
55*4882a593Smuzhiyun #define PCF85063_REG_SC_OS 0x80
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun #define PCF85063_REG_ALM_S 0x0b
58*4882a593Smuzhiyun #define PCF85063_AEN BIT(7)
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun struct pcf85063_config {
61*4882a593Smuzhiyun struct regmap_config regmap;
62*4882a593Smuzhiyun unsigned has_alarms:1;
63*4882a593Smuzhiyun unsigned force_cap_7000:1;
64*4882a593Smuzhiyun };
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun struct pcf85063 {
67*4882a593Smuzhiyun struct rtc_device *rtc;
68*4882a593Smuzhiyun struct regmap *regmap;
69*4882a593Smuzhiyun #ifdef CONFIG_COMMON_CLK
70*4882a593Smuzhiyun struct clk_hw clkout_hw;
71*4882a593Smuzhiyun #endif
72*4882a593Smuzhiyun };
73*4882a593Smuzhiyun
pcf85063_rtc_read_time(struct device * dev,struct rtc_time * tm)74*4882a593Smuzhiyun static int pcf85063_rtc_read_time(struct device *dev, struct rtc_time *tm)
75*4882a593Smuzhiyun {
76*4882a593Smuzhiyun struct pcf85063 *pcf85063 = dev_get_drvdata(dev);
77*4882a593Smuzhiyun int rc;
78*4882a593Smuzhiyun u8 regs[7];
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun /*
81*4882a593Smuzhiyun * while reading, the time/date registers are blocked and not updated
82*4882a593Smuzhiyun * anymore until the access is finished. To not lose a second
83*4882a593Smuzhiyun * event, the access must be finished within one second. So, read all
84*4882a593Smuzhiyun * time/date registers in one turn.
85*4882a593Smuzhiyun */
86*4882a593Smuzhiyun rc = regmap_bulk_read(pcf85063->regmap, PCF85063_REG_SC, regs,
87*4882a593Smuzhiyun sizeof(regs));
88*4882a593Smuzhiyun if (rc)
89*4882a593Smuzhiyun return rc;
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun /* if the clock has lost its power it makes no sense to use its time */
92*4882a593Smuzhiyun if (regs[0] & PCF85063_REG_SC_OS) {
93*4882a593Smuzhiyun dev_warn(&pcf85063->rtc->dev, "Power loss detected, invalid time\n");
94*4882a593Smuzhiyun return -EINVAL;
95*4882a593Smuzhiyun }
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun tm->tm_sec = bcd2bin(regs[0] & 0x7F);
98*4882a593Smuzhiyun tm->tm_min = bcd2bin(regs[1] & 0x7F);
99*4882a593Smuzhiyun tm->tm_hour = bcd2bin(regs[2] & 0x3F); /* rtc hr 0-23 */
100*4882a593Smuzhiyun tm->tm_mday = bcd2bin(regs[3] & 0x3F);
101*4882a593Smuzhiyun tm->tm_wday = regs[4] & 0x07;
102*4882a593Smuzhiyun tm->tm_mon = bcd2bin(regs[5] & 0x1F) - 1; /* rtc mn 1-12 */
103*4882a593Smuzhiyun tm->tm_year = bcd2bin(regs[6]);
104*4882a593Smuzhiyun tm->tm_year += 100;
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun return 0;
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun
pcf85063_rtc_set_time(struct device * dev,struct rtc_time * tm)109*4882a593Smuzhiyun static int pcf85063_rtc_set_time(struct device *dev, struct rtc_time *tm)
110*4882a593Smuzhiyun {
111*4882a593Smuzhiyun struct pcf85063 *pcf85063 = dev_get_drvdata(dev);
112*4882a593Smuzhiyun int rc;
113*4882a593Smuzhiyun u8 regs[7];
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun /*
116*4882a593Smuzhiyun * to accurately set the time, reset the divider chain and keep it in
117*4882a593Smuzhiyun * reset state until all time/date registers are written
118*4882a593Smuzhiyun */
119*4882a593Smuzhiyun rc = regmap_update_bits(pcf85063->regmap, PCF85063_REG_CTRL1,
120*4882a593Smuzhiyun PCF85063_REG_CTRL1_STOP,
121*4882a593Smuzhiyun PCF85063_REG_CTRL1_STOP);
122*4882a593Smuzhiyun if (rc)
123*4882a593Smuzhiyun return rc;
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun /* hours, minutes and seconds */
126*4882a593Smuzhiyun regs[0] = bin2bcd(tm->tm_sec) & 0x7F; /* clear OS flag */
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun regs[1] = bin2bcd(tm->tm_min);
129*4882a593Smuzhiyun regs[2] = bin2bcd(tm->tm_hour);
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun /* Day of month, 1 - 31 */
132*4882a593Smuzhiyun regs[3] = bin2bcd(tm->tm_mday);
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun /* Day, 0 - 6 */
135*4882a593Smuzhiyun regs[4] = tm->tm_wday & 0x07;
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun /* month, 1 - 12 */
138*4882a593Smuzhiyun regs[5] = bin2bcd(tm->tm_mon + 1);
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun /* year and century */
141*4882a593Smuzhiyun regs[6] = bin2bcd(tm->tm_year - 100);
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun /* write all registers at once */
144*4882a593Smuzhiyun rc = regmap_bulk_write(pcf85063->regmap, PCF85063_REG_SC,
145*4882a593Smuzhiyun regs, sizeof(regs));
146*4882a593Smuzhiyun if (rc)
147*4882a593Smuzhiyun return rc;
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun /*
150*4882a593Smuzhiyun * Write the control register as a separate action since the size of
151*4882a593Smuzhiyun * the register space is different between the PCF85063TP and
152*4882a593Smuzhiyun * PCF85063A devices. The rollover point can not be used.
153*4882a593Smuzhiyun */
154*4882a593Smuzhiyun return regmap_update_bits(pcf85063->regmap, PCF85063_REG_CTRL1,
155*4882a593Smuzhiyun PCF85063_REG_CTRL1_STOP, 0);
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun
pcf85063_rtc_read_alarm(struct device * dev,struct rtc_wkalrm * alrm)158*4882a593Smuzhiyun static int pcf85063_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun struct pcf85063 *pcf85063 = dev_get_drvdata(dev);
161*4882a593Smuzhiyun u8 buf[4];
162*4882a593Smuzhiyun unsigned int val;
163*4882a593Smuzhiyun int ret;
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun ret = regmap_bulk_read(pcf85063->regmap, PCF85063_REG_ALM_S,
166*4882a593Smuzhiyun buf, sizeof(buf));
167*4882a593Smuzhiyun if (ret)
168*4882a593Smuzhiyun return ret;
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun alrm->time.tm_sec = bcd2bin(buf[0]);
171*4882a593Smuzhiyun alrm->time.tm_min = bcd2bin(buf[1]);
172*4882a593Smuzhiyun alrm->time.tm_hour = bcd2bin(buf[2]);
173*4882a593Smuzhiyun alrm->time.tm_mday = bcd2bin(buf[3]);
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun ret = regmap_read(pcf85063->regmap, PCF85063_REG_CTRL2, &val);
176*4882a593Smuzhiyun if (ret)
177*4882a593Smuzhiyun return ret;
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun alrm->enabled = !!(val & PCF85063_CTRL2_AIE);
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun return 0;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun
pcf85063_rtc_set_alarm(struct device * dev,struct rtc_wkalrm * alrm)184*4882a593Smuzhiyun static int pcf85063_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
185*4882a593Smuzhiyun {
186*4882a593Smuzhiyun struct pcf85063 *pcf85063 = dev_get_drvdata(dev);
187*4882a593Smuzhiyun u8 buf[5];
188*4882a593Smuzhiyun int ret;
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun buf[0] = bin2bcd(alrm->time.tm_sec);
191*4882a593Smuzhiyun buf[1] = bin2bcd(alrm->time.tm_min);
192*4882a593Smuzhiyun buf[2] = bin2bcd(alrm->time.tm_hour);
193*4882a593Smuzhiyun buf[3] = bin2bcd(alrm->time.tm_mday);
194*4882a593Smuzhiyun buf[4] = PCF85063_AEN; /* Do not match on week day */
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun ret = regmap_update_bits(pcf85063->regmap, PCF85063_REG_CTRL2,
197*4882a593Smuzhiyun PCF85063_CTRL2_AIE | PCF85063_CTRL2_AF, 0);
198*4882a593Smuzhiyun if (ret)
199*4882a593Smuzhiyun return ret;
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun ret = regmap_bulk_write(pcf85063->regmap, PCF85063_REG_ALM_S,
202*4882a593Smuzhiyun buf, sizeof(buf));
203*4882a593Smuzhiyun if (ret)
204*4882a593Smuzhiyun return ret;
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun return regmap_update_bits(pcf85063->regmap, PCF85063_REG_CTRL2,
207*4882a593Smuzhiyun PCF85063_CTRL2_AIE | PCF85063_CTRL2_AF,
208*4882a593Smuzhiyun alrm->enabled ? PCF85063_CTRL2_AIE | PCF85063_CTRL2_AF : PCF85063_CTRL2_AF);
209*4882a593Smuzhiyun }
210*4882a593Smuzhiyun
pcf85063_rtc_alarm_irq_enable(struct device * dev,unsigned int enabled)211*4882a593Smuzhiyun static int pcf85063_rtc_alarm_irq_enable(struct device *dev,
212*4882a593Smuzhiyun unsigned int enabled)
213*4882a593Smuzhiyun {
214*4882a593Smuzhiyun struct pcf85063 *pcf85063 = dev_get_drvdata(dev);
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun return regmap_update_bits(pcf85063->regmap, PCF85063_REG_CTRL2,
217*4882a593Smuzhiyun PCF85063_CTRL2_AIE,
218*4882a593Smuzhiyun enabled ? PCF85063_CTRL2_AIE : 0);
219*4882a593Smuzhiyun }
220*4882a593Smuzhiyun
pcf85063_rtc_handle_irq(int irq,void * dev_id)221*4882a593Smuzhiyun static irqreturn_t pcf85063_rtc_handle_irq(int irq, void *dev_id)
222*4882a593Smuzhiyun {
223*4882a593Smuzhiyun struct pcf85063 *pcf85063 = dev_id;
224*4882a593Smuzhiyun unsigned int val;
225*4882a593Smuzhiyun int err;
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun err = regmap_read(pcf85063->regmap, PCF85063_REG_CTRL2, &val);
228*4882a593Smuzhiyun if (err)
229*4882a593Smuzhiyun return IRQ_NONE;
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun if (val & PCF85063_CTRL2_AF) {
232*4882a593Smuzhiyun rtc_update_irq(pcf85063->rtc, 1, RTC_IRQF | RTC_AF);
233*4882a593Smuzhiyun regmap_update_bits(pcf85063->regmap, PCF85063_REG_CTRL2,
234*4882a593Smuzhiyun PCF85063_CTRL2_AIE | PCF85063_CTRL2_AF,
235*4882a593Smuzhiyun 0);
236*4882a593Smuzhiyun return IRQ_HANDLED;
237*4882a593Smuzhiyun }
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun return IRQ_NONE;
240*4882a593Smuzhiyun }
241*4882a593Smuzhiyun
pcf85063_read_offset(struct device * dev,long * offset)242*4882a593Smuzhiyun static int pcf85063_read_offset(struct device *dev, long *offset)
243*4882a593Smuzhiyun {
244*4882a593Smuzhiyun struct pcf85063 *pcf85063 = dev_get_drvdata(dev);
245*4882a593Smuzhiyun long val;
246*4882a593Smuzhiyun u32 reg;
247*4882a593Smuzhiyun int ret;
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun ret = regmap_read(pcf85063->regmap, PCF85063_REG_OFFSET, ®);
250*4882a593Smuzhiyun if (ret < 0)
251*4882a593Smuzhiyun return ret;
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun val = sign_extend32(reg & ~PCF85063_OFFSET_MODE,
254*4882a593Smuzhiyun PCF85063_OFFSET_SIGN_BIT);
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun if (reg & PCF85063_OFFSET_MODE)
257*4882a593Smuzhiyun *offset = val * PCF85063_OFFSET_STEP1;
258*4882a593Smuzhiyun else
259*4882a593Smuzhiyun *offset = val * PCF85063_OFFSET_STEP0;
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun return 0;
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun
pcf85063_set_offset(struct device * dev,long offset)264*4882a593Smuzhiyun static int pcf85063_set_offset(struct device *dev, long offset)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun struct pcf85063 *pcf85063 = dev_get_drvdata(dev);
267*4882a593Smuzhiyun s8 mode0, mode1, reg;
268*4882a593Smuzhiyun unsigned int error0, error1;
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun if (offset > PCF85063_OFFSET_STEP0 * 63)
271*4882a593Smuzhiyun return -ERANGE;
272*4882a593Smuzhiyun if (offset < PCF85063_OFFSET_STEP0 * -64)
273*4882a593Smuzhiyun return -ERANGE;
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun mode0 = DIV_ROUND_CLOSEST(offset, PCF85063_OFFSET_STEP0);
276*4882a593Smuzhiyun mode1 = DIV_ROUND_CLOSEST(offset, PCF85063_OFFSET_STEP1);
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun error0 = abs(offset - (mode0 * PCF85063_OFFSET_STEP0));
279*4882a593Smuzhiyun error1 = abs(offset - (mode1 * PCF85063_OFFSET_STEP1));
280*4882a593Smuzhiyun if (mode1 > 63 || mode1 < -64 || error0 < error1)
281*4882a593Smuzhiyun reg = mode0 & ~PCF85063_OFFSET_MODE;
282*4882a593Smuzhiyun else
283*4882a593Smuzhiyun reg = mode1 | PCF85063_OFFSET_MODE;
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun return regmap_write(pcf85063->regmap, PCF85063_REG_OFFSET, reg);
286*4882a593Smuzhiyun }
287*4882a593Smuzhiyun
pcf85063_ioctl(struct device * dev,unsigned int cmd,unsigned long arg)288*4882a593Smuzhiyun static int pcf85063_ioctl(struct device *dev, unsigned int cmd,
289*4882a593Smuzhiyun unsigned long arg)
290*4882a593Smuzhiyun {
291*4882a593Smuzhiyun struct pcf85063 *pcf85063 = dev_get_drvdata(dev);
292*4882a593Smuzhiyun int status, ret = 0;
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun switch (cmd) {
295*4882a593Smuzhiyun case RTC_VL_READ:
296*4882a593Smuzhiyun ret = regmap_read(pcf85063->regmap, PCF85063_REG_SC, &status);
297*4882a593Smuzhiyun if (ret < 0)
298*4882a593Smuzhiyun return ret;
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun status = status & PCF85063_REG_SC_OS ? RTC_VL_DATA_INVALID : 0;
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun return put_user(status, (unsigned int __user *)arg);
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun default:
305*4882a593Smuzhiyun return -ENOIOCTLCMD;
306*4882a593Smuzhiyun }
307*4882a593Smuzhiyun }
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun static const struct rtc_class_ops pcf85063_rtc_ops = {
310*4882a593Smuzhiyun .read_time = pcf85063_rtc_read_time,
311*4882a593Smuzhiyun .set_time = pcf85063_rtc_set_time,
312*4882a593Smuzhiyun .read_offset = pcf85063_read_offset,
313*4882a593Smuzhiyun .set_offset = pcf85063_set_offset,
314*4882a593Smuzhiyun .ioctl = pcf85063_ioctl,
315*4882a593Smuzhiyun };
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun static const struct rtc_class_ops pcf85063_rtc_ops_alarm = {
318*4882a593Smuzhiyun .read_time = pcf85063_rtc_read_time,
319*4882a593Smuzhiyun .set_time = pcf85063_rtc_set_time,
320*4882a593Smuzhiyun .read_offset = pcf85063_read_offset,
321*4882a593Smuzhiyun .set_offset = pcf85063_set_offset,
322*4882a593Smuzhiyun .read_alarm = pcf85063_rtc_read_alarm,
323*4882a593Smuzhiyun .set_alarm = pcf85063_rtc_set_alarm,
324*4882a593Smuzhiyun .alarm_irq_enable = pcf85063_rtc_alarm_irq_enable,
325*4882a593Smuzhiyun .ioctl = pcf85063_ioctl,
326*4882a593Smuzhiyun };
327*4882a593Smuzhiyun
pcf85063_nvmem_read(void * priv,unsigned int offset,void * val,size_t bytes)328*4882a593Smuzhiyun static int pcf85063_nvmem_read(void *priv, unsigned int offset,
329*4882a593Smuzhiyun void *val, size_t bytes)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun return regmap_read(priv, PCF85063_REG_RAM, val);
332*4882a593Smuzhiyun }
333*4882a593Smuzhiyun
pcf85063_nvmem_write(void * priv,unsigned int offset,void * val,size_t bytes)334*4882a593Smuzhiyun static int pcf85063_nvmem_write(void *priv, unsigned int offset,
335*4882a593Smuzhiyun void *val, size_t bytes)
336*4882a593Smuzhiyun {
337*4882a593Smuzhiyun return regmap_write(priv, PCF85063_REG_RAM, *(u8 *)val);
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun
pcf85063_load_capacitance(struct pcf85063 * pcf85063,const struct device_node * np,unsigned int force_cap)340*4882a593Smuzhiyun static int pcf85063_load_capacitance(struct pcf85063 *pcf85063,
341*4882a593Smuzhiyun const struct device_node *np,
342*4882a593Smuzhiyun unsigned int force_cap)
343*4882a593Smuzhiyun {
344*4882a593Smuzhiyun u32 load = 7000;
345*4882a593Smuzhiyun u8 reg = 0;
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun if (force_cap)
348*4882a593Smuzhiyun load = force_cap;
349*4882a593Smuzhiyun else
350*4882a593Smuzhiyun of_property_read_u32(np, "quartz-load-femtofarads", &load);
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun switch (load) {
353*4882a593Smuzhiyun default:
354*4882a593Smuzhiyun dev_warn(&pcf85063->rtc->dev, "Unknown quartz-load-femtofarads value: %d. Assuming 7000",
355*4882a593Smuzhiyun load);
356*4882a593Smuzhiyun fallthrough;
357*4882a593Smuzhiyun case 7000:
358*4882a593Smuzhiyun break;
359*4882a593Smuzhiyun case 12500:
360*4882a593Smuzhiyun reg = PCF85063_REG_CTRL1_CAP_SEL;
361*4882a593Smuzhiyun break;
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun return regmap_update_bits(pcf85063->regmap, PCF85063_REG_CTRL1,
365*4882a593Smuzhiyun PCF85063_REG_CTRL1_CAP_SEL, reg);
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun #ifdef CONFIG_COMMON_CLK
369*4882a593Smuzhiyun /*
370*4882a593Smuzhiyun * Handling of the clkout
371*4882a593Smuzhiyun */
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun #define clkout_hw_to_pcf85063(_hw) container_of(_hw, struct pcf85063, clkout_hw)
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun static int clkout_rates[] = {
376*4882a593Smuzhiyun 32768,
377*4882a593Smuzhiyun 16384,
378*4882a593Smuzhiyun 8192,
379*4882a593Smuzhiyun 4096,
380*4882a593Smuzhiyun 2048,
381*4882a593Smuzhiyun 1024,
382*4882a593Smuzhiyun 1,
383*4882a593Smuzhiyun 0
384*4882a593Smuzhiyun };
385*4882a593Smuzhiyun
pcf85063_clkout_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)386*4882a593Smuzhiyun static unsigned long pcf85063_clkout_recalc_rate(struct clk_hw *hw,
387*4882a593Smuzhiyun unsigned long parent_rate)
388*4882a593Smuzhiyun {
389*4882a593Smuzhiyun struct pcf85063 *pcf85063 = clkout_hw_to_pcf85063(hw);
390*4882a593Smuzhiyun unsigned int buf;
391*4882a593Smuzhiyun int ret = regmap_read(pcf85063->regmap, PCF85063_REG_CTRL2, &buf);
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun if (ret < 0)
394*4882a593Smuzhiyun return 0;
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun buf &= PCF85063_REG_CLKO_F_MASK;
397*4882a593Smuzhiyun return clkout_rates[buf];
398*4882a593Smuzhiyun }
399*4882a593Smuzhiyun
pcf85063_clkout_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * prate)400*4882a593Smuzhiyun static long pcf85063_clkout_round_rate(struct clk_hw *hw, unsigned long rate,
401*4882a593Smuzhiyun unsigned long *prate)
402*4882a593Smuzhiyun {
403*4882a593Smuzhiyun int i;
404*4882a593Smuzhiyun
405*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(clkout_rates); i++)
406*4882a593Smuzhiyun if (clkout_rates[i] <= rate)
407*4882a593Smuzhiyun return clkout_rates[i];
408*4882a593Smuzhiyun
409*4882a593Smuzhiyun return 0;
410*4882a593Smuzhiyun }
411*4882a593Smuzhiyun
pcf85063_clkout_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)412*4882a593Smuzhiyun static int pcf85063_clkout_set_rate(struct clk_hw *hw, unsigned long rate,
413*4882a593Smuzhiyun unsigned long parent_rate)
414*4882a593Smuzhiyun {
415*4882a593Smuzhiyun struct pcf85063 *pcf85063 = clkout_hw_to_pcf85063(hw);
416*4882a593Smuzhiyun int i;
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(clkout_rates); i++)
419*4882a593Smuzhiyun if (clkout_rates[i] == rate)
420*4882a593Smuzhiyun return regmap_update_bits(pcf85063->regmap,
421*4882a593Smuzhiyun PCF85063_REG_CTRL2,
422*4882a593Smuzhiyun PCF85063_REG_CLKO_F_MASK, i);
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun return -EINVAL;
425*4882a593Smuzhiyun }
426*4882a593Smuzhiyun
pcf85063_clkout_control(struct clk_hw * hw,bool enable)427*4882a593Smuzhiyun static int pcf85063_clkout_control(struct clk_hw *hw, bool enable)
428*4882a593Smuzhiyun {
429*4882a593Smuzhiyun struct pcf85063 *pcf85063 = clkout_hw_to_pcf85063(hw);
430*4882a593Smuzhiyun unsigned int buf;
431*4882a593Smuzhiyun int ret;
432*4882a593Smuzhiyun
433*4882a593Smuzhiyun ret = regmap_read(pcf85063->regmap, PCF85063_REG_OFFSET, &buf);
434*4882a593Smuzhiyun if (ret < 0)
435*4882a593Smuzhiyun return ret;
436*4882a593Smuzhiyun buf &= PCF85063_REG_CLKO_F_MASK;
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun if (enable) {
439*4882a593Smuzhiyun if (buf == PCF85063_REG_CLKO_F_OFF)
440*4882a593Smuzhiyun buf = PCF85063_REG_CLKO_F_32768HZ;
441*4882a593Smuzhiyun else
442*4882a593Smuzhiyun return 0;
443*4882a593Smuzhiyun } else {
444*4882a593Smuzhiyun if (buf != PCF85063_REG_CLKO_F_OFF)
445*4882a593Smuzhiyun buf = PCF85063_REG_CLKO_F_OFF;
446*4882a593Smuzhiyun else
447*4882a593Smuzhiyun return 0;
448*4882a593Smuzhiyun }
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun return regmap_update_bits(pcf85063->regmap, PCF85063_REG_CTRL2,
451*4882a593Smuzhiyun PCF85063_REG_CLKO_F_MASK, buf);
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun
pcf85063_clkout_prepare(struct clk_hw * hw)454*4882a593Smuzhiyun static int pcf85063_clkout_prepare(struct clk_hw *hw)
455*4882a593Smuzhiyun {
456*4882a593Smuzhiyun return pcf85063_clkout_control(hw, 1);
457*4882a593Smuzhiyun }
458*4882a593Smuzhiyun
pcf85063_clkout_unprepare(struct clk_hw * hw)459*4882a593Smuzhiyun static void pcf85063_clkout_unprepare(struct clk_hw *hw)
460*4882a593Smuzhiyun {
461*4882a593Smuzhiyun pcf85063_clkout_control(hw, 0);
462*4882a593Smuzhiyun }
463*4882a593Smuzhiyun
pcf85063_clkout_is_prepared(struct clk_hw * hw)464*4882a593Smuzhiyun static int pcf85063_clkout_is_prepared(struct clk_hw *hw)
465*4882a593Smuzhiyun {
466*4882a593Smuzhiyun struct pcf85063 *pcf85063 = clkout_hw_to_pcf85063(hw);
467*4882a593Smuzhiyun unsigned int buf;
468*4882a593Smuzhiyun int ret = regmap_read(pcf85063->regmap, PCF85063_REG_CTRL2, &buf);
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun if (ret < 0)
471*4882a593Smuzhiyun return 0;
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun return (buf & PCF85063_REG_CLKO_F_MASK) != PCF85063_REG_CLKO_F_OFF;
474*4882a593Smuzhiyun }
475*4882a593Smuzhiyun
476*4882a593Smuzhiyun static const struct clk_ops pcf85063_clkout_ops = {
477*4882a593Smuzhiyun .prepare = pcf85063_clkout_prepare,
478*4882a593Smuzhiyun .unprepare = pcf85063_clkout_unprepare,
479*4882a593Smuzhiyun .is_prepared = pcf85063_clkout_is_prepared,
480*4882a593Smuzhiyun .recalc_rate = pcf85063_clkout_recalc_rate,
481*4882a593Smuzhiyun .round_rate = pcf85063_clkout_round_rate,
482*4882a593Smuzhiyun .set_rate = pcf85063_clkout_set_rate,
483*4882a593Smuzhiyun };
484*4882a593Smuzhiyun
pcf85063_clkout_register_clk(struct pcf85063 * pcf85063)485*4882a593Smuzhiyun static struct clk *pcf85063_clkout_register_clk(struct pcf85063 *pcf85063)
486*4882a593Smuzhiyun {
487*4882a593Smuzhiyun struct clk *clk;
488*4882a593Smuzhiyun struct clk_init_data init;
489*4882a593Smuzhiyun struct device_node *node = pcf85063->rtc->dev.parent->of_node;
490*4882a593Smuzhiyun
491*4882a593Smuzhiyun init.name = "pcf85063-clkout";
492*4882a593Smuzhiyun init.ops = &pcf85063_clkout_ops;
493*4882a593Smuzhiyun init.flags = 0;
494*4882a593Smuzhiyun init.parent_names = NULL;
495*4882a593Smuzhiyun init.num_parents = 0;
496*4882a593Smuzhiyun pcf85063->clkout_hw.init = &init;
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun /* optional override of the clockname */
499*4882a593Smuzhiyun of_property_read_string(node, "clock-output-names", &init.name);
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun /* register the clock */
502*4882a593Smuzhiyun clk = devm_clk_register(&pcf85063->rtc->dev, &pcf85063->clkout_hw);
503*4882a593Smuzhiyun
504*4882a593Smuzhiyun if (!IS_ERR(clk))
505*4882a593Smuzhiyun of_clk_add_provider(node, of_clk_src_simple_get, clk);
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun return clk;
508*4882a593Smuzhiyun }
509*4882a593Smuzhiyun #endif
510*4882a593Smuzhiyun
511*4882a593Smuzhiyun static const struct pcf85063_config pcf85063a_config = {
512*4882a593Smuzhiyun .regmap = {
513*4882a593Smuzhiyun .reg_bits = 8,
514*4882a593Smuzhiyun .val_bits = 8,
515*4882a593Smuzhiyun .max_register = 0x11,
516*4882a593Smuzhiyun },
517*4882a593Smuzhiyun .has_alarms = 1,
518*4882a593Smuzhiyun };
519*4882a593Smuzhiyun
520*4882a593Smuzhiyun static const struct pcf85063_config pcf85063tp_config = {
521*4882a593Smuzhiyun .regmap = {
522*4882a593Smuzhiyun .reg_bits = 8,
523*4882a593Smuzhiyun .val_bits = 8,
524*4882a593Smuzhiyun .max_register = 0x0a,
525*4882a593Smuzhiyun },
526*4882a593Smuzhiyun };
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun static const struct pcf85063_config rv8263_config = {
529*4882a593Smuzhiyun .regmap = {
530*4882a593Smuzhiyun .reg_bits = 8,
531*4882a593Smuzhiyun .val_bits = 8,
532*4882a593Smuzhiyun .max_register = 0x11,
533*4882a593Smuzhiyun },
534*4882a593Smuzhiyun .has_alarms = 1,
535*4882a593Smuzhiyun .force_cap_7000 = 1,
536*4882a593Smuzhiyun };
537*4882a593Smuzhiyun
pcf85063_probe(struct i2c_client * client)538*4882a593Smuzhiyun static int pcf85063_probe(struct i2c_client *client)
539*4882a593Smuzhiyun {
540*4882a593Smuzhiyun struct pcf85063 *pcf85063;
541*4882a593Smuzhiyun unsigned int tmp;
542*4882a593Smuzhiyun int err;
543*4882a593Smuzhiyun const struct pcf85063_config *config = &pcf85063tp_config;
544*4882a593Smuzhiyun const void *data = of_device_get_match_data(&client->dev);
545*4882a593Smuzhiyun struct nvmem_config nvmem_cfg = {
546*4882a593Smuzhiyun .name = "pcf85063_nvram",
547*4882a593Smuzhiyun .reg_read = pcf85063_nvmem_read,
548*4882a593Smuzhiyun .reg_write = pcf85063_nvmem_write,
549*4882a593Smuzhiyun .type = NVMEM_TYPE_BATTERY_BACKED,
550*4882a593Smuzhiyun .size = 1,
551*4882a593Smuzhiyun };
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun dev_dbg(&client->dev, "%s\n", __func__);
554*4882a593Smuzhiyun
555*4882a593Smuzhiyun pcf85063 = devm_kzalloc(&client->dev, sizeof(struct pcf85063),
556*4882a593Smuzhiyun GFP_KERNEL);
557*4882a593Smuzhiyun if (!pcf85063)
558*4882a593Smuzhiyun return -ENOMEM;
559*4882a593Smuzhiyun
560*4882a593Smuzhiyun if (data)
561*4882a593Smuzhiyun config = data;
562*4882a593Smuzhiyun
563*4882a593Smuzhiyun pcf85063->regmap = devm_regmap_init_i2c(client, &config->regmap);
564*4882a593Smuzhiyun if (IS_ERR(pcf85063->regmap))
565*4882a593Smuzhiyun return PTR_ERR(pcf85063->regmap);
566*4882a593Smuzhiyun
567*4882a593Smuzhiyun i2c_set_clientdata(client, pcf85063);
568*4882a593Smuzhiyun
569*4882a593Smuzhiyun err = regmap_read(pcf85063->regmap, PCF85063_REG_CTRL1, &tmp);
570*4882a593Smuzhiyun if (err) {
571*4882a593Smuzhiyun dev_err(&client->dev, "RTC chip is not present\n");
572*4882a593Smuzhiyun return err;
573*4882a593Smuzhiyun }
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun pcf85063->rtc = devm_rtc_allocate_device(&client->dev);
576*4882a593Smuzhiyun if (IS_ERR(pcf85063->rtc))
577*4882a593Smuzhiyun return PTR_ERR(pcf85063->rtc);
578*4882a593Smuzhiyun
579*4882a593Smuzhiyun err = pcf85063_load_capacitance(pcf85063, client->dev.of_node,
580*4882a593Smuzhiyun config->force_cap_7000 ? 7000 : 0);
581*4882a593Smuzhiyun if (err < 0)
582*4882a593Smuzhiyun dev_warn(&client->dev, "failed to set xtal load capacitance: %d",
583*4882a593Smuzhiyun err);
584*4882a593Smuzhiyun
585*4882a593Smuzhiyun pcf85063->rtc->ops = &pcf85063_rtc_ops;
586*4882a593Smuzhiyun pcf85063->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
587*4882a593Smuzhiyun pcf85063->rtc->range_max = RTC_TIMESTAMP_END_2099;
588*4882a593Smuzhiyun pcf85063->rtc->uie_unsupported = 1;
589*4882a593Smuzhiyun
590*4882a593Smuzhiyun if (config->has_alarms && client->irq > 0) {
591*4882a593Smuzhiyun err = devm_request_threaded_irq(&client->dev, client->irq,
592*4882a593Smuzhiyun NULL, pcf85063_rtc_handle_irq,
593*4882a593Smuzhiyun IRQF_TRIGGER_LOW | IRQF_ONESHOT,
594*4882a593Smuzhiyun "pcf85063", pcf85063);
595*4882a593Smuzhiyun if (err) {
596*4882a593Smuzhiyun dev_warn(&pcf85063->rtc->dev,
597*4882a593Smuzhiyun "unable to request IRQ, alarms disabled\n");
598*4882a593Smuzhiyun } else {
599*4882a593Smuzhiyun pcf85063->rtc->ops = &pcf85063_rtc_ops_alarm;
600*4882a593Smuzhiyun device_init_wakeup(&client->dev, true);
601*4882a593Smuzhiyun err = dev_pm_set_wake_irq(&client->dev, client->irq);
602*4882a593Smuzhiyun if (err)
603*4882a593Smuzhiyun dev_err(&pcf85063->rtc->dev,
604*4882a593Smuzhiyun "failed to enable irq wake\n");
605*4882a593Smuzhiyun }
606*4882a593Smuzhiyun }
607*4882a593Smuzhiyun
608*4882a593Smuzhiyun nvmem_cfg.priv = pcf85063->regmap;
609*4882a593Smuzhiyun rtc_nvmem_register(pcf85063->rtc, &nvmem_cfg);
610*4882a593Smuzhiyun
611*4882a593Smuzhiyun #ifdef CONFIG_COMMON_CLK
612*4882a593Smuzhiyun /* register clk in common clk framework */
613*4882a593Smuzhiyun pcf85063_clkout_register_clk(pcf85063);
614*4882a593Smuzhiyun #endif
615*4882a593Smuzhiyun
616*4882a593Smuzhiyun return rtc_register_device(pcf85063->rtc);
617*4882a593Smuzhiyun }
618*4882a593Smuzhiyun
619*4882a593Smuzhiyun #ifdef CONFIG_OF
620*4882a593Smuzhiyun static const struct of_device_id pcf85063_of_match[] = {
621*4882a593Smuzhiyun { .compatible = "nxp,pcf85063", .data = &pcf85063tp_config },
622*4882a593Smuzhiyun { .compatible = "nxp,pcf85063tp", .data = &pcf85063tp_config },
623*4882a593Smuzhiyun { .compatible = "nxp,pcf85063a", .data = &pcf85063a_config },
624*4882a593Smuzhiyun { .compatible = "microcrystal,rv8263", .data = &rv8263_config },
625*4882a593Smuzhiyun {}
626*4882a593Smuzhiyun };
627*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, pcf85063_of_match);
628*4882a593Smuzhiyun #endif
629*4882a593Smuzhiyun
630*4882a593Smuzhiyun static struct i2c_driver pcf85063_driver = {
631*4882a593Smuzhiyun .driver = {
632*4882a593Smuzhiyun .name = "rtc-pcf85063",
633*4882a593Smuzhiyun .of_match_table = of_match_ptr(pcf85063_of_match),
634*4882a593Smuzhiyun },
635*4882a593Smuzhiyun .probe_new = pcf85063_probe,
636*4882a593Smuzhiyun };
637*4882a593Smuzhiyun
638*4882a593Smuzhiyun module_i2c_driver(pcf85063_driver);
639*4882a593Smuzhiyun
640*4882a593Smuzhiyun MODULE_AUTHOR("Søren Andersen <san@rosetechnology.dk>");
641*4882a593Smuzhiyun MODULE_DESCRIPTION("PCF85063 RTC driver");
642*4882a593Smuzhiyun MODULE_LICENSE("GPL");
643