1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Driver for TI BQ32000 RTC.
4 *
5 * Copyright (C) 2009 Semihalf.
6 * Copyright (C) 2014 Pavel Machek <pavel@denx.de>
7 *
8 * You can get hardware description at
9 * https://www.ti.com/lit/ds/symlink/bq32000.pdf
10 */
11
12 #include <linux/module.h>
13 #include <linux/i2c.h>
14 #include <linux/rtc.h>
15 #include <linux/init.h>
16 #include <linux/kstrtox.h>
17 #include <linux/errno.h>
18 #include <linux/bcd.h>
19 #include <linux/delay.h>
20
21 #define BQ32K_SECONDS 0x00 /* Seconds register address */
22 #define BQ32K_SECONDS_MASK 0x7F /* Mask over seconds value */
23 #define BQ32K_STOP 0x80 /* Oscillator Stop flat */
24
25 #define BQ32K_MINUTES 0x01 /* Minutes register address */
26 #define BQ32K_MINUTES_MASK 0x7F /* Mask over minutes value */
27 #define BQ32K_OF 0x80 /* Oscillator Failure flag */
28
29 #define BQ32K_HOURS_MASK 0x3F /* Mask over hours value */
30 #define BQ32K_CENT 0x40 /* Century flag */
31 #define BQ32K_CENT_EN 0x80 /* Century flag enable bit */
32
33 #define BQ32K_CALIBRATION 0x07 /* CAL_CFG1, calibration and control */
34 #define BQ32K_TCH2 0x08 /* Trickle charge enable */
35 #define BQ32K_CFG2 0x09 /* Trickle charger control */
36 #define BQ32K_TCFE BIT(6) /* Trickle charge FET bypass */
37
38 #define MAX_LEN 10 /* Maximum number of consecutive
39 * register for this particular RTC.
40 */
41
42 struct bq32k_regs {
43 uint8_t seconds;
44 uint8_t minutes;
45 uint8_t cent_hours;
46 uint8_t day;
47 uint8_t date;
48 uint8_t month;
49 uint8_t years;
50 };
51
52 static struct i2c_driver bq32k_driver;
53
bq32k_read(struct device * dev,void * data,uint8_t off,uint8_t len)54 static int bq32k_read(struct device *dev, void *data, uint8_t off, uint8_t len)
55 {
56 struct i2c_client *client = to_i2c_client(dev);
57 struct i2c_msg msgs[] = {
58 {
59 .addr = client->addr,
60 .flags = 0,
61 .len = 1,
62 .buf = &off,
63 }, {
64 .addr = client->addr,
65 .flags = I2C_M_RD,
66 .len = len,
67 .buf = data,
68 }
69 };
70
71 if (i2c_transfer(client->adapter, msgs, 2) == 2)
72 return 0;
73
74 return -EIO;
75 }
76
bq32k_write(struct device * dev,void * data,uint8_t off,uint8_t len)77 static int bq32k_write(struct device *dev, void *data, uint8_t off, uint8_t len)
78 {
79 struct i2c_client *client = to_i2c_client(dev);
80 uint8_t buffer[MAX_LEN + 1];
81
82 buffer[0] = off;
83 memcpy(&buffer[1], data, len);
84
85 if (i2c_master_send(client, buffer, len + 1) == len + 1)
86 return 0;
87
88 return -EIO;
89 }
90
bq32k_rtc_read_time(struct device * dev,struct rtc_time * tm)91 static int bq32k_rtc_read_time(struct device *dev, struct rtc_time *tm)
92 {
93 struct i2c_client *client = to_i2c_client(dev);
94 struct bq32k_regs regs;
95 int error;
96
97 /*
98 * When the device doesn't have the interrupt connected, prevent
99 * userpace from polling the RTC registers too frequently.
100 */
101 if (client->irq <= 0)
102 usleep_range(2000, 2500);
103
104 error = bq32k_read(dev, ®s, 0, sizeof(regs));
105 if (error)
106 return error;
107
108 /*
109 * In case of oscillator failure, the register contents should be
110 * considered invalid. The flag is cleared the next time the RTC is set.
111 */
112 if (regs.minutes & BQ32K_OF)
113 return -EINVAL;
114
115 tm->tm_sec = bcd2bin(regs.seconds & BQ32K_SECONDS_MASK);
116 tm->tm_min = bcd2bin(regs.minutes & BQ32K_MINUTES_MASK);
117 tm->tm_hour = bcd2bin(regs.cent_hours & BQ32K_HOURS_MASK);
118 tm->tm_mday = bcd2bin(regs.date);
119 tm->tm_wday = bcd2bin(regs.day) - 1;
120 tm->tm_mon = bcd2bin(regs.month) - 1;
121 tm->tm_year = bcd2bin(regs.years) +
122 ((regs.cent_hours & BQ32K_CENT) ? 100 : 0);
123
124 return 0;
125 }
126
bq32k_rtc_set_time(struct device * dev,struct rtc_time * tm)127 static int bq32k_rtc_set_time(struct device *dev, struct rtc_time *tm)
128 {
129 struct bq32k_regs regs;
130
131 regs.seconds = bin2bcd(tm->tm_sec);
132 regs.minutes = bin2bcd(tm->tm_min);
133 regs.cent_hours = bin2bcd(tm->tm_hour) | BQ32K_CENT_EN;
134 regs.day = bin2bcd(tm->tm_wday + 1);
135 regs.date = bin2bcd(tm->tm_mday);
136 regs.month = bin2bcd(tm->tm_mon + 1);
137
138 if (tm->tm_year >= 100) {
139 regs.cent_hours |= BQ32K_CENT;
140 regs.years = bin2bcd(tm->tm_year - 100);
141 } else
142 regs.years = bin2bcd(tm->tm_year);
143
144 return bq32k_write(dev, ®s, 0, sizeof(regs));
145 }
146
147 static const struct rtc_class_ops bq32k_rtc_ops = {
148 .read_time = bq32k_rtc_read_time,
149 .set_time = bq32k_rtc_set_time,
150 };
151
trickle_charger_of_init(struct device * dev,struct device_node * node)152 static int trickle_charger_of_init(struct device *dev, struct device_node *node)
153 {
154 unsigned char reg;
155 int error;
156 u32 ohms = 0;
157
158 if (of_property_read_u32(node, "trickle-resistor-ohms" , &ohms))
159 return 0;
160
161 switch (ohms) {
162 case 180+940:
163 /*
164 * TCHE[3:0] == 0x05, TCH2 == 1, TCFE == 0 (charging
165 * over diode and 940ohm resistor)
166 */
167
168 if (of_property_read_bool(node, "trickle-diode-disable")) {
169 dev_err(dev, "diode and resistor mismatch\n");
170 return -EINVAL;
171 }
172 reg = 0x05;
173 break;
174
175 case 180+20000:
176 /* diode disabled */
177
178 if (!of_property_read_bool(node, "trickle-diode-disable")) {
179 dev_err(dev, "bq32k: diode and resistor mismatch\n");
180 return -EINVAL;
181 }
182 reg = 0x45;
183 break;
184
185 default:
186 dev_err(dev, "invalid resistor value (%d)\n", ohms);
187 return -EINVAL;
188 }
189
190 error = bq32k_write(dev, ®, BQ32K_CFG2, 1);
191 if (error)
192 return error;
193
194 reg = 0x20;
195 error = bq32k_write(dev, ®, BQ32K_TCH2, 1);
196 if (error)
197 return error;
198
199 dev_info(dev, "Enabled trickle RTC battery charge.\n");
200 return 0;
201 }
202
bq32k_sysfs_show_tricklecharge_bypass(struct device * dev,struct device_attribute * attr,char * buf)203 static ssize_t bq32k_sysfs_show_tricklecharge_bypass(struct device *dev,
204 struct device_attribute *attr,
205 char *buf)
206 {
207 int reg, error;
208
209 error = bq32k_read(dev, ®, BQ32K_CFG2, 1);
210 if (error)
211 return error;
212
213 return sprintf(buf, "%d\n", (reg & BQ32K_TCFE) ? 1 : 0);
214 }
215
bq32k_sysfs_store_tricklecharge_bypass(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)216 static ssize_t bq32k_sysfs_store_tricklecharge_bypass(struct device *dev,
217 struct device_attribute *attr,
218 const char *buf, size_t count)
219 {
220 int reg, enable, error;
221
222 if (kstrtoint(buf, 0, &enable))
223 return -EINVAL;
224
225 error = bq32k_read(dev, ®, BQ32K_CFG2, 1);
226 if (error)
227 return error;
228
229 if (enable) {
230 reg |= BQ32K_TCFE;
231 error = bq32k_write(dev, ®, BQ32K_CFG2, 1);
232 if (error)
233 return error;
234
235 dev_info(dev, "Enabled trickle charge FET bypass.\n");
236 } else {
237 reg &= ~BQ32K_TCFE;
238 error = bq32k_write(dev, ®, BQ32K_CFG2, 1);
239 if (error)
240 return error;
241
242 dev_info(dev, "Disabled trickle charge FET bypass.\n");
243 }
244
245 return count;
246 }
247
248 static DEVICE_ATTR(trickle_charge_bypass, 0644,
249 bq32k_sysfs_show_tricklecharge_bypass,
250 bq32k_sysfs_store_tricklecharge_bypass);
251
bq32k_sysfs_register(struct device * dev)252 static int bq32k_sysfs_register(struct device *dev)
253 {
254 return device_create_file(dev, &dev_attr_trickle_charge_bypass);
255 }
256
bq32k_sysfs_unregister(struct device * dev)257 static void bq32k_sysfs_unregister(struct device *dev)
258 {
259 device_remove_file(dev, &dev_attr_trickle_charge_bypass);
260 }
261
bq32k_probe(struct i2c_client * client)262 static int bq32k_probe(struct i2c_client *client)
263 {
264 struct device *dev = &client->dev;
265 struct rtc_device *rtc;
266 uint8_t reg;
267 int error;
268
269 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
270 return -ENODEV;
271
272 /* Check Oscillator Stop flag */
273 error = bq32k_read(dev, ®, BQ32K_SECONDS, 1);
274 if (!error && (reg & BQ32K_STOP)) {
275 dev_warn(dev, "Oscillator was halted. Restarting...\n");
276 reg &= ~BQ32K_STOP;
277 error = bq32k_write(dev, ®, BQ32K_SECONDS, 1);
278 }
279 if (error)
280 return error;
281
282 /* Check Oscillator Failure flag */
283 error = bq32k_read(dev, ®, BQ32K_MINUTES, 1);
284 if (error)
285 return error;
286 if (reg & BQ32K_OF)
287 dev_warn(dev, "Oscillator Failure. Check RTC battery.\n");
288
289 if (client->dev.of_node)
290 trickle_charger_of_init(dev, client->dev.of_node);
291
292 rtc = devm_rtc_device_register(&client->dev, bq32k_driver.driver.name,
293 &bq32k_rtc_ops, THIS_MODULE);
294 if (IS_ERR(rtc))
295 return PTR_ERR(rtc);
296
297 error = bq32k_sysfs_register(&client->dev);
298 if (error) {
299 dev_err(&client->dev,
300 "Unable to create sysfs entries for rtc bq32000\n");
301 return error;
302 }
303
304
305 i2c_set_clientdata(client, rtc);
306
307 return 0;
308 }
309
bq32k_remove(struct i2c_client * client)310 static void bq32k_remove(struct i2c_client *client)
311 {
312 bq32k_sysfs_unregister(&client->dev);
313 }
314
315 static const struct i2c_device_id bq32k_id[] = {
316 { .name = "bq32000" },
317 { }
318 };
319 MODULE_DEVICE_TABLE(i2c, bq32k_id);
320
321 static const __maybe_unused struct of_device_id bq32k_of_match[] = {
322 { .compatible = "ti,bq32000" },
323 { }
324 };
325 MODULE_DEVICE_TABLE(of, bq32k_of_match);
326
327 static struct i2c_driver bq32k_driver = {
328 .driver = {
329 .name = "bq32k",
330 .of_match_table = of_match_ptr(bq32k_of_match),
331 },
332 .probe = bq32k_probe,
333 .remove = bq32k_remove,
334 .id_table = bq32k_id,
335 };
336
337 module_i2c_driver(bq32k_driver);
338
339 MODULE_AUTHOR("Semihalf, Piotr Ziecik <kosmo@semihalf.com>");
340 MODULE_DESCRIPTION("TI BQ32000 I2C RTC driver");
341 MODULE_LICENSE("GPL");
342