blob: eecf6b272d3fa01791959375101a74467a8799a7 [file] [log] [blame]
David Brownell1abb0dc2006-06-25 05:48:17 -07001/*
2 * rtc-ds1307.c - RTC driver for some mostly-compatible I2C chips.
3 *
4 * Copyright (C) 2005 James Chapman (ds1337 core)
5 * Copyright (C) 2006 David Brownell
Matthias Fuchsa2166852009-03-31 15:24:58 -07006 * Copyright (C) 2009 Matthias Fuchs (rx8025 support)
Bertrand Achardbc48b902013-04-29 16:19:26 -07007 * Copyright (C) 2012 Bertrand Achard (nvram access fixes)
David Brownell1abb0dc2006-06-25 05:48:17 -07008 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 */
13
Tin Huynh9c19b892016-11-30 09:57:31 +070014#include <linux/acpi.h>
David Brownell1abb0dc2006-06-25 05:48:17 -070015#include <linux/bcd.h>
Nishanth Menoneac72372015-06-23 11:15:12 -050016#include <linux/i2c.h>
17#include <linux/init.h>
18#include <linux/module.h>
Javier Martinez Canillas7ef6d2c2017-03-03 11:29:15 -030019#include <linux/of_device.h>
Wolfram Sangeb86c302012-05-29 15:07:38 -070020#include <linux/rtc/ds1307.h>
Nishanth Menoneac72372015-06-23 11:15:12 -050021#include <linux/rtc.h>
22#include <linux/slab.h>
23#include <linux/string.h>
Akinobu Mita445c0202016-01-25 00:22:16 +090024#include <linux/hwmon.h>
25#include <linux/hwmon-sysfs.h>
Akinobu Mita6c6ff142016-01-31 23:10:10 +090026#include <linux/clk-provider.h>
Heiner Kallweit11e58902017-03-10 18:52:34 +010027#include <linux/regmap.h>
David Brownell1abb0dc2006-06-25 05:48:17 -070028
David Anders40ce9722012-03-23 15:02:37 -070029/*
30 * We can't determine type by probing, but if we expect pre-Linux code
David Brownell1abb0dc2006-06-25 05:48:17 -070031 * to have set the chip up as a clock (turning on the oscillator and
32 * setting the date and time), Linux can ignore the non-clock features.
33 * That's a natural job for a factory or repair bench.
David Brownell1abb0dc2006-06-25 05:48:17 -070034 */
35enum ds_type {
David Brownell045e0e82007-07-17 04:04:55 -070036 ds_1307,
Sean Nyekjaer300a7732017-06-08 12:36:54 +020037 ds_1308,
David Brownell045e0e82007-07-17 04:04:55 -070038 ds_1337,
39 ds_1338,
40 ds_1339,
41 ds_1340,
Joakim Tjernlund33df2ee2009-06-17 16:26:08 -070042 ds_1388,
Wolfram Sang97f902b2009-06-17 16:26:10 -070043 ds_3231,
Stefan Agner8566f702017-03-23 16:54:57 -070044 m41t0,
David Brownell045e0e82007-07-17 04:04:55 -070045 m41t00,
Tomas Novotnyf4199f82014-12-10 15:53:57 -080046 mcp794xx,
Matthias Fuchsa2166852009-03-31 15:24:58 -070047 rx_8025,
Marek Vasutee0981b2017-06-18 22:55:28 +020048 rx_8130,
Wolfram Sang32d322b2012-03-23 15:02:36 -070049 last_ds_type /* always last */
David Anders40ce9722012-03-23 15:02:37 -070050 /* rs5c372 too? different address... */
David Brownell1abb0dc2006-06-25 05:48:17 -070051};
52
David Brownell1abb0dc2006-06-25 05:48:17 -070053
54/* RTC registers don't differ much, except for the century flag */
55#define DS1307_REG_SECS 0x00 /* 00-59 */
56# define DS1307_BIT_CH 0x80
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -070057# define DS1340_BIT_nEOSC 0x80
Tomas Novotnyf4199f82014-12-10 15:53:57 -080058# define MCP794XX_BIT_ST 0x80
David Brownell1abb0dc2006-06-25 05:48:17 -070059#define DS1307_REG_MIN 0x01 /* 00-59 */
Stefan Agner8566f702017-03-23 16:54:57 -070060# define M41T0_BIT_OF 0x80
David Brownell1abb0dc2006-06-25 05:48:17 -070061#define DS1307_REG_HOUR 0x02 /* 00-23, or 1-12{am,pm} */
David Brownellc065f352007-07-17 04:05:10 -070062# define DS1307_BIT_12HR 0x40 /* in REG_HOUR */
63# define DS1307_BIT_PM 0x20 /* in REG_HOUR */
David Brownell1abb0dc2006-06-25 05:48:17 -070064# define DS1340_BIT_CENTURY_EN 0x80 /* in REG_HOUR */
65# define DS1340_BIT_CENTURY 0x40 /* in REG_HOUR */
66#define DS1307_REG_WDAY 0x03 /* 01-07 */
Tomas Novotnyf4199f82014-12-10 15:53:57 -080067# define MCP794XX_BIT_VBATEN 0x08
David Brownell1abb0dc2006-06-25 05:48:17 -070068#define DS1307_REG_MDAY 0x04 /* 01-31 */
69#define DS1307_REG_MONTH 0x05 /* 01-12 */
70# define DS1337_BIT_CENTURY 0x80 /* in REG_MONTH */
71#define DS1307_REG_YEAR 0x06 /* 00-99 */
72
David Anders40ce9722012-03-23 15:02:37 -070073/*
74 * Other registers (control, status, alarms, trickle charge, NVRAM, etc)
David Brownell045e0e82007-07-17 04:04:55 -070075 * start at 7, and they differ a LOT. Only control and status matter for
76 * basic RTC date and time functionality; be careful using them.
David Brownell1abb0dc2006-06-25 05:48:17 -070077 */
David Brownell045e0e82007-07-17 04:04:55 -070078#define DS1307_REG_CONTROL 0x07 /* or ds1338 */
David Brownell1abb0dc2006-06-25 05:48:17 -070079# define DS1307_BIT_OUT 0x80
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -070080# define DS1338_BIT_OSF 0x20
David Brownell1abb0dc2006-06-25 05:48:17 -070081# define DS1307_BIT_SQWE 0x10
82# define DS1307_BIT_RS1 0x02
83# define DS1307_BIT_RS0 0x01
84#define DS1337_REG_CONTROL 0x0e
85# define DS1337_BIT_nEOSC 0x80
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -070086# define DS1339_BIT_BBSQI 0x20
Wolfram Sang97f902b2009-06-17 16:26:10 -070087# define DS3231_BIT_BBSQW 0x40 /* same as BBSQI */
David Brownell1abb0dc2006-06-25 05:48:17 -070088# define DS1337_BIT_RS2 0x10
89# define DS1337_BIT_RS1 0x08
90# define DS1337_BIT_INTCN 0x04
91# define DS1337_BIT_A2IE 0x02
92# define DS1337_BIT_A1IE 0x01
David Brownell045e0e82007-07-17 04:04:55 -070093#define DS1340_REG_CONTROL 0x07
94# define DS1340_BIT_OUT 0x80
95# define DS1340_BIT_FT 0x40
96# define DS1340_BIT_CALIB_SIGN 0x20
97# define DS1340_M_CALIBRATION 0x1f
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -070098#define DS1340_REG_FLAG 0x09
99# define DS1340_BIT_OSF 0x80
David Brownell1abb0dc2006-06-25 05:48:17 -0700100#define DS1337_REG_STATUS 0x0f
101# define DS1337_BIT_OSF 0x80
Akinobu Mita6c6ff142016-01-31 23:10:10 +0900102# define DS3231_BIT_EN32KHZ 0x08
David Brownell1abb0dc2006-06-25 05:48:17 -0700103# define DS1337_BIT_A2I 0x02
104# define DS1337_BIT_A1I 0x01
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700105#define DS1339_REG_ALARM1_SECS 0x07
Wolfram Sangeb86c302012-05-29 15:07:38 -0700106
107#define DS13XX_TRICKLE_CHARGER_MAGIC 0xa0
David Brownell1abb0dc2006-06-25 05:48:17 -0700108
Matthias Fuchsa2166852009-03-31 15:24:58 -0700109#define RX8025_REG_CTRL1 0x0e
110# define RX8025_BIT_2412 0x20
111#define RX8025_REG_CTRL2 0x0f
112# define RX8025_BIT_PON 0x10
113# define RX8025_BIT_VDET 0x40
114# define RX8025_BIT_XST 0x20
David Brownell1abb0dc2006-06-25 05:48:17 -0700115
116
117struct ds1307 {
Joakim Tjernlund33df2ee2009-06-17 16:26:08 -0700118 u8 offset; /* register's offset */
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700119 u8 regs[11];
Austin Boyle9eab0a72012-03-23 15:02:38 -0700120 u16 nvram_offset;
Alexandre Belloniabc925f2017-07-06 11:42:07 +0200121 struct nvmem_config nvmem_cfg;
David Brownell1abb0dc2006-06-25 05:48:17 -0700122 enum ds_type type;
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700123 unsigned long flags;
124#define HAS_NVRAM 0 /* bit 0 == sysfs file active */
125#define HAS_ALARM 1 /* bit 1 == irq claimed */
Heiner Kallweit11e58902017-03-10 18:52:34 +0100126 struct device *dev;
127 struct regmap *regmap;
128 const char *name;
David Brownell1abb0dc2006-06-25 05:48:17 -0700129 struct rtc_device *rtc;
Akinobu Mita6c6ff142016-01-31 23:10:10 +0900130#ifdef CONFIG_COMMON_CLK
131 struct clk_hw clks[2];
132#endif
David Brownell1abb0dc2006-06-25 05:48:17 -0700133};
134
David Brownell045e0e82007-07-17 04:04:55 -0700135struct chip_desc {
David Brownell045e0e82007-07-17 04:04:55 -0700136 unsigned alarm:1;
Austin Boyle9eab0a72012-03-23 15:02:38 -0700137 u16 nvram_offset;
138 u16 nvram_size;
Heiner Kallweite48585d2017-06-05 17:57:33 +0200139 u8 century_reg;
140 u8 century_enable_bit;
141 u8 century_bit;
Heiner Kallweit0b6ee802017-07-12 07:49:22 +0200142 u8 bbsqi_bit;
Wolfram Sangeb86c302012-05-29 15:07:38 -0700143 u16 trickle_charger_reg;
Matti Vaittinen33b04b72014-10-13 15:52:48 -0700144 u8 trickle_charger_setup;
Heiner Kallweit11e58902017-03-10 18:52:34 +0100145 u8 (*do_trickle_setup)(struct ds1307 *, uint32_t,
146 bool);
David Brownell045e0e82007-07-17 04:04:55 -0700147};
148
Heiner Kallweit11e58902017-03-10 18:52:34 +0100149static u8 do_trickle_setup_ds1339(struct ds1307 *, uint32_t ohms, bool diode);
Matti Vaittinen33b04b72014-10-13 15:52:48 -0700150
151static struct chip_desc chips[last_ds_type] = {
Wolfram Sang32d322b2012-03-23 15:02:36 -0700152 [ds_1307] = {
Austin Boyle9eab0a72012-03-23 15:02:38 -0700153 .nvram_offset = 8,
154 .nvram_size = 56,
Wolfram Sang32d322b2012-03-23 15:02:36 -0700155 },
Sean Nyekjaer300a7732017-06-08 12:36:54 +0200156 [ds_1308] = {
157 .nvram_offset = 8,
158 .nvram_size = 56,
159 },
Wolfram Sang32d322b2012-03-23 15:02:36 -0700160 [ds_1337] = {
161 .alarm = 1,
Heiner Kallweite48585d2017-06-05 17:57:33 +0200162 .century_reg = DS1307_REG_MONTH,
163 .century_bit = DS1337_BIT_CENTURY,
Wolfram Sang32d322b2012-03-23 15:02:36 -0700164 },
165 [ds_1338] = {
Austin Boyle9eab0a72012-03-23 15:02:38 -0700166 .nvram_offset = 8,
167 .nvram_size = 56,
Wolfram Sang32d322b2012-03-23 15:02:36 -0700168 },
169 [ds_1339] = {
170 .alarm = 1,
Heiner Kallweite48585d2017-06-05 17:57:33 +0200171 .century_reg = DS1307_REG_MONTH,
172 .century_bit = DS1337_BIT_CENTURY,
Heiner Kallweit0b6ee802017-07-12 07:49:22 +0200173 .bbsqi_bit = DS1339_BIT_BBSQI,
Wolfram Sangeb86c302012-05-29 15:07:38 -0700174 .trickle_charger_reg = 0x10,
Matti Vaittinen33b04b72014-10-13 15:52:48 -0700175 .do_trickle_setup = &do_trickle_setup_ds1339,
Wolfram Sangeb86c302012-05-29 15:07:38 -0700176 },
177 [ds_1340] = {
Heiner Kallweite48585d2017-06-05 17:57:33 +0200178 .century_reg = DS1307_REG_HOUR,
179 .century_enable_bit = DS1340_BIT_CENTURY_EN,
180 .century_bit = DS1340_BIT_CENTURY,
Wolfram Sangeb86c302012-05-29 15:07:38 -0700181 .trickle_charger_reg = 0x08,
182 },
183 [ds_1388] = {
184 .trickle_charger_reg = 0x0a,
Wolfram Sang32d322b2012-03-23 15:02:36 -0700185 },
186 [ds_3231] = {
187 .alarm = 1,
Heiner Kallweite48585d2017-06-05 17:57:33 +0200188 .century_reg = DS1307_REG_MONTH,
189 .century_bit = DS1337_BIT_CENTURY,
Heiner Kallweit0b6ee802017-07-12 07:49:22 +0200190 .bbsqi_bit = DS3231_BIT_BBSQW,
Wolfram Sang32d322b2012-03-23 15:02:36 -0700191 },
Marek Vasutee0981b2017-06-18 22:55:28 +0200192 [rx_8130] = {
193 .alarm = 1,
194 /* this is battery backed SRAM */
195 .nvram_offset = 0x20,
196 .nvram_size = 4, /* 32bit (4 word x 8 bit) */
197 },
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800198 [mcp794xx] = {
Simon Guinot1d1945d2014-04-03 14:49:55 -0700199 .alarm = 1,
Austin Boyle9eab0a72012-03-23 15:02:38 -0700200 /* this is battery backed SRAM */
201 .nvram_offset = 0x20,
202 .nvram_size = 0x40,
203 },
Wolfram Sang32d322b2012-03-23 15:02:36 -0700204};
David Brownell045e0e82007-07-17 04:04:55 -0700205
Jean Delvare3760f732008-04-29 23:11:40 +0200206static const struct i2c_device_id ds1307_id[] = {
207 { "ds1307", ds_1307 },
Sean Nyekjaer300a7732017-06-08 12:36:54 +0200208 { "ds1308", ds_1308 },
Jean Delvare3760f732008-04-29 23:11:40 +0200209 { "ds1337", ds_1337 },
210 { "ds1338", ds_1338 },
211 { "ds1339", ds_1339 },
Joakim Tjernlund33df2ee2009-06-17 16:26:08 -0700212 { "ds1388", ds_1388 },
Jean Delvare3760f732008-04-29 23:11:40 +0200213 { "ds1340", ds_1340 },
Wolfram Sang97f902b2009-06-17 16:26:10 -0700214 { "ds3231", ds_3231 },
Stefan Agner8566f702017-03-23 16:54:57 -0700215 { "m41t0", m41t0 },
Jean Delvare3760f732008-04-29 23:11:40 +0200216 { "m41t00", m41t00 },
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800217 { "mcp7940x", mcp794xx },
218 { "mcp7941x", mcp794xx },
Priyanka Jain31c17712011-06-27 16:18:04 -0700219 { "pt7c4338", ds_1307 },
Matthias Fuchsa2166852009-03-31 15:24:58 -0700220 { "rx8025", rx_8025 },
Alexandre Belloni78aaa062016-07-13 02:36:41 +0200221 { "isl12057", ds_1337 },
Marek Vasutee0981b2017-06-18 22:55:28 +0200222 { "rx8130", rx_8130 },
Jean Delvare3760f732008-04-29 23:11:40 +0200223 { }
224};
225MODULE_DEVICE_TABLE(i2c, ds1307_id);
David Brownell1abb0dc2006-06-25 05:48:17 -0700226
Javier Martinez Canillas7ef6d2c2017-03-03 11:29:15 -0300227#ifdef CONFIG_OF
228static const struct of_device_id ds1307_of_match[] = {
229 {
230 .compatible = "dallas,ds1307",
231 .data = (void *)ds_1307
232 },
233 {
Sean Nyekjaer300a7732017-06-08 12:36:54 +0200234 .compatible = "dallas,ds1308",
235 .data = (void *)ds_1308
236 },
237 {
Javier Martinez Canillas7ef6d2c2017-03-03 11:29:15 -0300238 .compatible = "dallas,ds1337",
239 .data = (void *)ds_1337
240 },
241 {
242 .compatible = "dallas,ds1338",
243 .data = (void *)ds_1338
244 },
245 {
246 .compatible = "dallas,ds1339",
247 .data = (void *)ds_1339
248 },
249 {
250 .compatible = "dallas,ds1388",
251 .data = (void *)ds_1388
252 },
253 {
254 .compatible = "dallas,ds1340",
255 .data = (void *)ds_1340
256 },
257 {
258 .compatible = "maxim,ds3231",
259 .data = (void *)ds_3231
260 },
261 {
Alexandre Bellonidb2f8142017-04-08 17:22:02 +0200262 .compatible = "st,m41t0",
263 .data = (void *)m41t00
264 },
265 {
Javier Martinez Canillas7ef6d2c2017-03-03 11:29:15 -0300266 .compatible = "st,m41t00",
267 .data = (void *)m41t00
268 },
269 {
270 .compatible = "microchip,mcp7940x",
271 .data = (void *)mcp794xx
272 },
273 {
274 .compatible = "microchip,mcp7941x",
275 .data = (void *)mcp794xx
276 },
277 {
278 .compatible = "pericom,pt7c4338",
279 .data = (void *)ds_1307
280 },
281 {
282 .compatible = "epson,rx8025",
283 .data = (void *)rx_8025
284 },
285 {
286 .compatible = "isil,isl12057",
287 .data = (void *)ds_1337
288 },
289 { }
290};
291MODULE_DEVICE_TABLE(of, ds1307_of_match);
292#endif
293
Tin Huynh9c19b892016-11-30 09:57:31 +0700294#ifdef CONFIG_ACPI
295static const struct acpi_device_id ds1307_acpi_ids[] = {
296 { .id = "DS1307", .driver_data = ds_1307 },
Sean Nyekjaer300a7732017-06-08 12:36:54 +0200297 { .id = "DS1308", .driver_data = ds_1308 },
Tin Huynh9c19b892016-11-30 09:57:31 +0700298 { .id = "DS1337", .driver_data = ds_1337 },
299 { .id = "DS1338", .driver_data = ds_1338 },
300 { .id = "DS1339", .driver_data = ds_1339 },
301 { .id = "DS1388", .driver_data = ds_1388 },
302 { .id = "DS1340", .driver_data = ds_1340 },
303 { .id = "DS3231", .driver_data = ds_3231 },
Stefan Agner8566f702017-03-23 16:54:57 -0700304 { .id = "M41T0", .driver_data = m41t0 },
Tin Huynh9c19b892016-11-30 09:57:31 +0700305 { .id = "M41T00", .driver_data = m41t00 },
306 { .id = "MCP7940X", .driver_data = mcp794xx },
307 { .id = "MCP7941X", .driver_data = mcp794xx },
308 { .id = "PT7C4338", .driver_data = ds_1307 },
309 { .id = "RX8025", .driver_data = rx_8025 },
310 { .id = "ISL12057", .driver_data = ds_1337 },
311 { }
312};
313MODULE_DEVICE_TABLE(acpi, ds1307_acpi_ids);
314#endif
315
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700316/*
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700317 * The ds1337 and ds1339 both have two alarms, but we only use the first
318 * one (with a "seconds" field). For ds1337 we expect nINTA is our alarm
319 * signal; ds1339 chips have only one alarm signal.
320 */
Felipe Balbi2fb07a12015-06-23 11:15:10 -0500321static irqreturn_t ds1307_irq(int irq, void *dev_id)
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700322{
Heiner Kallweit11e58902017-03-10 18:52:34 +0100323 struct ds1307 *ds1307 = dev_id;
Felipe Balbi2fb07a12015-06-23 11:15:10 -0500324 struct mutex *lock = &ds1307->rtc->ops_lock;
Heiner Kallweit078f3f62017-06-05 17:57:29 +0200325 int stat, ret;
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700326
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700327 mutex_lock(lock);
Heiner Kallweit11e58902017-03-10 18:52:34 +0100328 ret = regmap_read(ds1307->regmap, DS1337_REG_STATUS, &stat);
329 if (ret)
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700330 goto out;
331
332 if (stat & DS1337_BIT_A1I) {
333 stat &= ~DS1337_BIT_A1I;
Heiner Kallweit11e58902017-03-10 18:52:34 +0100334 regmap_write(ds1307->regmap, DS1337_REG_STATUS, stat);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700335
Heiner Kallweit078f3f62017-06-05 17:57:29 +0200336 ret = regmap_update_bits(ds1307->regmap, DS1337_REG_CONTROL,
337 DS1337_BIT_A1IE, 0);
Heiner Kallweit11e58902017-03-10 18:52:34 +0100338 if (ret)
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700339 goto out;
340
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700341 rtc_update_irq(ds1307->rtc, 1, RTC_AF | RTC_IRQF);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700342 }
343
344out:
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700345 mutex_unlock(lock);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700346
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700347 return IRQ_HANDLED;
348}
349
350/*----------------------------------------------------------------------*/
351
David Brownell1abb0dc2006-06-25 05:48:17 -0700352static int ds1307_get_time(struct device *dev, struct rtc_time *t)
353{
354 struct ds1307 *ds1307 = dev_get_drvdata(dev);
Heiner Kallweit11e58902017-03-10 18:52:34 +0100355 int tmp, ret;
Heiner Kallweite48585d2017-06-05 17:57:33 +0200356 const struct chip_desc *chip = &chips[ds1307->type];
David Brownell1abb0dc2006-06-25 05:48:17 -0700357
David Brownell045e0e82007-07-17 04:04:55 -0700358 /* read the RTC date and time registers all at once */
Heiner Kallweit11e58902017-03-10 18:52:34 +0100359 ret = regmap_bulk_read(ds1307->regmap, ds1307->offset, ds1307->regs, 7);
360 if (ret) {
361 dev_err(dev, "%s error %d\n", "read", ret);
362 return ret;
David Brownell1abb0dc2006-06-25 05:48:17 -0700363 }
364
Andy Shevchenko01a4ca12013-02-21 16:44:22 -0800365 dev_dbg(dev, "%s: %7ph\n", "read", ds1307->regs);
David Brownell1abb0dc2006-06-25 05:48:17 -0700366
Stefan Agner8566f702017-03-23 16:54:57 -0700367 /* if oscillator fail bit is set, no data can be trusted */
368 if (ds1307->type == m41t0 &&
369 ds1307->regs[DS1307_REG_MIN] & M41T0_BIT_OF) {
370 dev_warn_once(dev, "oscillator failed, set time!\n");
371 return -EINVAL;
372 }
373
Adrian Bunkfe20ba72008-10-18 20:28:41 -0700374 t->tm_sec = bcd2bin(ds1307->regs[DS1307_REG_SECS] & 0x7f);
375 t->tm_min = bcd2bin(ds1307->regs[DS1307_REG_MIN] & 0x7f);
David Brownell1abb0dc2006-06-25 05:48:17 -0700376 tmp = ds1307->regs[DS1307_REG_HOUR] & 0x3f;
Adrian Bunkfe20ba72008-10-18 20:28:41 -0700377 t->tm_hour = bcd2bin(tmp);
378 t->tm_wday = bcd2bin(ds1307->regs[DS1307_REG_WDAY] & 0x07) - 1;
379 t->tm_mday = bcd2bin(ds1307->regs[DS1307_REG_MDAY] & 0x3f);
David Brownell1abb0dc2006-06-25 05:48:17 -0700380 tmp = ds1307->regs[DS1307_REG_MONTH] & 0x1f;
Adrian Bunkfe20ba72008-10-18 20:28:41 -0700381 t->tm_mon = bcd2bin(tmp) - 1;
Adrian Bunkfe20ba72008-10-18 20:28:41 -0700382 t->tm_year = bcd2bin(ds1307->regs[DS1307_REG_YEAR]) + 100;
David Brownell1abb0dc2006-06-25 05:48:17 -0700383
Heiner Kallweite48585d2017-06-05 17:57:33 +0200384 if (ds1307->regs[chip->century_reg] & chip->century_bit &&
385 IS_ENABLED(CONFIG_RTC_DRV_DS1307_CENTURY))
386 t->tm_year += 100;
Alexandre Belloni50d6c0e2016-07-13 02:26:08 +0200387
David Brownell1abb0dc2006-06-25 05:48:17 -0700388 dev_dbg(dev, "%s secs=%d, mins=%d, "
389 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
390 "read", t->tm_sec, t->tm_min,
391 t->tm_hour, t->tm_mday,
392 t->tm_mon, t->tm_year, t->tm_wday);
393
David Brownell045e0e82007-07-17 04:04:55 -0700394 /* initial clock setting can be undefined */
395 return rtc_valid_tm(t);
David Brownell1abb0dc2006-06-25 05:48:17 -0700396}
397
398static int ds1307_set_time(struct device *dev, struct rtc_time *t)
399{
400 struct ds1307 *ds1307 = dev_get_drvdata(dev);
Heiner Kallweite48585d2017-06-05 17:57:33 +0200401 const struct chip_desc *chip = &chips[ds1307->type];
David Brownell1abb0dc2006-06-25 05:48:17 -0700402 int result;
403 int tmp;
404 u8 *buf = ds1307->regs;
405
406 dev_dbg(dev, "%s secs=%d, mins=%d, "
407 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
Jeff Garzik11966ad2006-10-04 04:41:53 -0400408 "write", t->tm_sec, t->tm_min,
409 t->tm_hour, t->tm_mday,
410 t->tm_mon, t->tm_year, t->tm_wday);
David Brownell1abb0dc2006-06-25 05:48:17 -0700411
Alexandre Belloni50d6c0e2016-07-13 02:26:08 +0200412 if (t->tm_year < 100)
413 return -EINVAL;
414
Heiner Kallweite48585d2017-06-05 17:57:33 +0200415#ifdef CONFIG_RTC_DRV_DS1307_CENTURY
416 if (t->tm_year > (chip->century_bit ? 299 : 199))
417 return -EINVAL;
Alexandre Belloni50d6c0e2016-07-13 02:26:08 +0200418#else
Heiner Kallweite48585d2017-06-05 17:57:33 +0200419 if (t->tm_year > 199)
Alexandre Belloni50d6c0e2016-07-13 02:26:08 +0200420 return -EINVAL;
421#endif
422
Adrian Bunkfe20ba72008-10-18 20:28:41 -0700423 buf[DS1307_REG_SECS] = bin2bcd(t->tm_sec);
424 buf[DS1307_REG_MIN] = bin2bcd(t->tm_min);
425 buf[DS1307_REG_HOUR] = bin2bcd(t->tm_hour);
426 buf[DS1307_REG_WDAY] = bin2bcd(t->tm_wday + 1);
427 buf[DS1307_REG_MDAY] = bin2bcd(t->tm_mday);
428 buf[DS1307_REG_MONTH] = bin2bcd(t->tm_mon + 1);
David Brownell1abb0dc2006-06-25 05:48:17 -0700429
430 /* assume 20YY not 19YY */
431 tmp = t->tm_year - 100;
Adrian Bunkfe20ba72008-10-18 20:28:41 -0700432 buf[DS1307_REG_YEAR] = bin2bcd(tmp);
David Brownell1abb0dc2006-06-25 05:48:17 -0700433
Heiner Kallweite48585d2017-06-05 17:57:33 +0200434 if (chip->century_enable_bit)
435 buf[chip->century_reg] |= chip->century_enable_bit;
436 if (t->tm_year > 199 && chip->century_bit)
437 buf[chip->century_reg] |= chip->century_bit;
438
439 if (ds1307->type == mcp794xx) {
David Anders40ce9722012-03-23 15:02:37 -0700440 /*
441 * these bits were cleared when preparing the date/time
442 * values and need to be set again before writing the
443 * buffer out to the device.
444 */
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800445 buf[DS1307_REG_SECS] |= MCP794XX_BIT_ST;
446 buf[DS1307_REG_WDAY] |= MCP794XX_BIT_VBATEN;
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -0700447 }
David Brownell1abb0dc2006-06-25 05:48:17 -0700448
Andy Shevchenko01a4ca12013-02-21 16:44:22 -0800449 dev_dbg(dev, "%s: %7ph\n", "write", buf);
David Brownell1abb0dc2006-06-25 05:48:17 -0700450
Heiner Kallweit11e58902017-03-10 18:52:34 +0100451 result = regmap_bulk_write(ds1307->regmap, ds1307->offset, buf, 7);
452 if (result) {
BARRE Sebastienfed40b72009-01-07 18:07:13 -0800453 dev_err(dev, "%s error %d\n", "write", result);
454 return result;
David Brownell1abb0dc2006-06-25 05:48:17 -0700455 }
456 return 0;
457}
458
Jüri Reitel74d88eb2009-01-07 18:07:16 -0800459static int ds1337_read_alarm(struct device *dev, struct rtc_wkalrm *t)
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700460{
Heiner Kallweit11e58902017-03-10 18:52:34 +0100461 struct ds1307 *ds1307 = dev_get_drvdata(dev);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700462 int ret;
463
464 if (!test_bit(HAS_ALARM, &ds1307->flags))
465 return -EINVAL;
466
467 /* read all ALARM1, ALARM2, and status registers at once */
Heiner Kallweit11e58902017-03-10 18:52:34 +0100468 ret = regmap_bulk_read(ds1307->regmap, DS1339_REG_ALARM1_SECS,
469 ds1307->regs, 9);
470 if (ret) {
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700471 dev_err(dev, "%s error %d\n", "alarm read", ret);
Heiner Kallweit11e58902017-03-10 18:52:34 +0100472 return ret;
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700473 }
474
Rasmus Villemoesff67abd2015-11-24 14:51:23 +0100475 dev_dbg(dev, "%s: %4ph, %3ph, %2ph\n", "alarm read",
476 &ds1307->regs[0], &ds1307->regs[4], &ds1307->regs[7]);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700477
David Anders40ce9722012-03-23 15:02:37 -0700478 /*
479 * report alarm time (ALARM1); assume 24 hour and day-of-month modes,
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700480 * and that all four fields are checked matches
481 */
482 t->time.tm_sec = bcd2bin(ds1307->regs[0] & 0x7f);
483 t->time.tm_min = bcd2bin(ds1307->regs[1] & 0x7f);
484 t->time.tm_hour = bcd2bin(ds1307->regs[2] & 0x3f);
485 t->time.tm_mday = bcd2bin(ds1307->regs[3] & 0x3f);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700486
487 /* ... and status */
488 t->enabled = !!(ds1307->regs[7] & DS1337_BIT_A1IE);
489 t->pending = !!(ds1307->regs[8] & DS1337_BIT_A1I);
490
491 dev_dbg(dev, "%s secs=%d, mins=%d, "
492 "hours=%d, mday=%d, enabled=%d, pending=%d\n",
493 "alarm read", t->time.tm_sec, t->time.tm_min,
494 t->time.tm_hour, t->time.tm_mday,
495 t->enabled, t->pending);
496
497 return 0;
498}
499
Jüri Reitel74d88eb2009-01-07 18:07:16 -0800500static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700501{
Heiner Kallweit11e58902017-03-10 18:52:34 +0100502 struct ds1307 *ds1307 = dev_get_drvdata(dev);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700503 unsigned char *buf = ds1307->regs;
504 u8 control, status;
505 int ret;
506
507 if (!test_bit(HAS_ALARM, &ds1307->flags))
508 return -EINVAL;
509
510 dev_dbg(dev, "%s secs=%d, mins=%d, "
511 "hours=%d, mday=%d, enabled=%d, pending=%d\n",
512 "alarm set", t->time.tm_sec, t->time.tm_min,
513 t->time.tm_hour, t->time.tm_mday,
514 t->enabled, t->pending);
515
516 /* read current status of both alarms and the chip */
Heiner Kallweit11e58902017-03-10 18:52:34 +0100517 ret = regmap_bulk_read(ds1307->regmap, DS1339_REG_ALARM1_SECS, buf, 9);
518 if (ret) {
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700519 dev_err(dev, "%s error %d\n", "alarm write", ret);
Heiner Kallweit11e58902017-03-10 18:52:34 +0100520 return ret;
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700521 }
522 control = ds1307->regs[7];
523 status = ds1307->regs[8];
524
Rasmus Villemoesff67abd2015-11-24 14:51:23 +0100525 dev_dbg(dev, "%s: %4ph, %3ph, %02x %02x\n", "alarm set (old status)",
526 &ds1307->regs[0], &ds1307->regs[4], control, status);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700527
528 /* set ALARM1, using 24 hour and day-of-month modes */
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700529 buf[0] = bin2bcd(t->time.tm_sec);
530 buf[1] = bin2bcd(t->time.tm_min);
531 buf[2] = bin2bcd(t->time.tm_hour);
532 buf[3] = bin2bcd(t->time.tm_mday);
533
534 /* set ALARM2 to non-garbage */
535 buf[4] = 0;
536 buf[5] = 0;
537 buf[6] = 0;
538
Nicolas Boullis5919fb92016-04-10 13:23:05 +0200539 /* disable alarms */
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700540 buf[7] = control & ~(DS1337_BIT_A1IE | DS1337_BIT_A2IE);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700541 buf[8] = status & ~(DS1337_BIT_A1I | DS1337_BIT_A2I);
542
Heiner Kallweit11e58902017-03-10 18:52:34 +0100543 ret = regmap_bulk_write(ds1307->regmap, DS1339_REG_ALARM1_SECS, buf, 9);
544 if (ret) {
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700545 dev_err(dev, "can't set alarm time\n");
BARRE Sebastienfed40b72009-01-07 18:07:13 -0800546 return ret;
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700547 }
548
Nicolas Boullis5919fb92016-04-10 13:23:05 +0200549 /* optionally enable ALARM1 */
550 if (t->enabled) {
551 dev_dbg(dev, "alarm IRQ armed\n");
552 buf[7] |= DS1337_BIT_A1IE; /* only ALARM1 is used */
Heiner Kallweit11e58902017-03-10 18:52:34 +0100553 regmap_write(ds1307->regmap, DS1337_REG_CONTROL, buf[7]);
Nicolas Boullis5919fb92016-04-10 13:23:05 +0200554 }
555
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700556 return 0;
557}
558
John Stultz16380c12011-02-02 17:02:41 -0800559static int ds1307_alarm_irq_enable(struct device *dev, unsigned int enabled)
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700560{
Heiner Kallweit11e58902017-03-10 18:52:34 +0100561 struct ds1307 *ds1307 = dev_get_drvdata(dev);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700562
John Stultz16380c12011-02-02 17:02:41 -0800563 if (!test_bit(HAS_ALARM, &ds1307->flags))
564 return -ENOTTY;
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700565
Heiner Kallweit078f3f62017-06-05 17:57:29 +0200566 return regmap_update_bits(ds1307->regmap, DS1337_REG_CONTROL,
567 DS1337_BIT_A1IE,
568 enabled ? DS1337_BIT_A1IE : 0);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700569}
570
David Brownellff8371a2006-09-30 23:28:17 -0700571static const struct rtc_class_ops ds13xx_rtc_ops = {
David Brownell1abb0dc2006-06-25 05:48:17 -0700572 .read_time = ds1307_get_time,
573 .set_time = ds1307_set_time,
Jüri Reitel74d88eb2009-01-07 18:07:16 -0800574 .read_alarm = ds1337_read_alarm,
575 .set_alarm = ds1337_set_alarm,
John Stultz16380c12011-02-02 17:02:41 -0800576 .alarm_irq_enable = ds1307_alarm_irq_enable,
David Brownell1abb0dc2006-06-25 05:48:17 -0700577};
578
David Brownell682d73f2007-11-14 16:58:32 -0800579/*----------------------------------------------------------------------*/
580
Simon Guinot1d1945d2014-04-03 14:49:55 -0700581/*
Marek Vasutee0981b2017-06-18 22:55:28 +0200582 * Alarm support for rx8130 devices.
583 */
584
585#define RX8130_REG_ALARM_MIN 0x07
586#define RX8130_REG_ALARM_HOUR 0x08
587#define RX8130_REG_ALARM_WEEK_OR_DAY 0x09
588#define RX8130_REG_EXTENSION 0x0c
589#define RX8130_REG_EXTENSION_WADA (1 << 3)
590#define RX8130_REG_FLAG 0x0d
591#define RX8130_REG_FLAG_AF (1 << 3)
592#define RX8130_REG_CONTROL0 0x0e
593#define RX8130_REG_CONTROL0_AIE (1 << 3)
594
595static irqreturn_t rx8130_irq(int irq, void *dev_id)
596{
597 struct ds1307 *ds1307 = dev_id;
598 struct mutex *lock = &ds1307->rtc->ops_lock;
599 u8 ctl[3];
600 int ret;
601
602 mutex_lock(lock);
603
604 /* Read control registers. */
605 ret = regmap_bulk_read(ds1307->regmap, RX8130_REG_EXTENSION, ctl, 3);
606 if (ret < 0)
607 goto out;
608 if (!(ctl[1] & RX8130_REG_FLAG_AF))
609 goto out;
610 ctl[1] &= ~RX8130_REG_FLAG_AF;
611 ctl[2] &= ~RX8130_REG_CONTROL0_AIE;
612
613 ret = regmap_bulk_write(ds1307->regmap, RX8130_REG_EXTENSION, ctl, 3);
614 if (ret < 0)
615 goto out;
616
617 rtc_update_irq(ds1307->rtc, 1, RTC_AF | RTC_IRQF);
618
619out:
620 mutex_unlock(lock);
621
622 return IRQ_HANDLED;
623}
624
625static int rx8130_read_alarm(struct device *dev, struct rtc_wkalrm *t)
626{
627 struct ds1307 *ds1307 = dev_get_drvdata(dev);
628 u8 ald[3], ctl[3];
629 int ret;
630
631 if (!test_bit(HAS_ALARM, &ds1307->flags))
632 return -EINVAL;
633
634 /* Read alarm registers. */
635 ret = regmap_bulk_read(ds1307->regmap, RX8130_REG_ALARM_MIN, ald, 3);
636 if (ret < 0)
637 return ret;
638
639 /* Read control registers. */
640 ret = regmap_bulk_read(ds1307->regmap, RX8130_REG_EXTENSION, ctl, 3);
641 if (ret < 0)
642 return ret;
643
644 t->enabled = !!(ctl[2] & RX8130_REG_CONTROL0_AIE);
645 t->pending = !!(ctl[1] & RX8130_REG_FLAG_AF);
646
647 /* Report alarm 0 time assuming 24-hour and day-of-month modes. */
648 t->time.tm_sec = -1;
649 t->time.tm_min = bcd2bin(ald[0] & 0x7f);
650 t->time.tm_hour = bcd2bin(ald[1] & 0x7f);
651 t->time.tm_wday = -1;
652 t->time.tm_mday = bcd2bin(ald[2] & 0x7f);
653 t->time.tm_mon = -1;
654 t->time.tm_year = -1;
655 t->time.tm_yday = -1;
656 t->time.tm_isdst = -1;
657
658 dev_dbg(dev, "%s, sec=%d min=%d hour=%d wday=%d mday=%d mon=%d enabled=%d\n",
659 __func__, t->time.tm_sec, t->time.tm_min, t->time.tm_hour,
660 t->time.tm_wday, t->time.tm_mday, t->time.tm_mon, t->enabled);
661
662 return 0;
663}
664
665static int rx8130_set_alarm(struct device *dev, struct rtc_wkalrm *t)
666{
667 struct ds1307 *ds1307 = dev_get_drvdata(dev);
668 u8 ald[3], ctl[3];
669 int ret;
670
671 if (!test_bit(HAS_ALARM, &ds1307->flags))
672 return -EINVAL;
673
674 dev_dbg(dev, "%s, sec=%d min=%d hour=%d wday=%d mday=%d mon=%d "
675 "enabled=%d pending=%d\n", __func__,
676 t->time.tm_sec, t->time.tm_min, t->time.tm_hour,
677 t->time.tm_wday, t->time.tm_mday, t->time.tm_mon,
678 t->enabled, t->pending);
679
680 /* Read control registers. */
681 ret = regmap_bulk_read(ds1307->regmap, RX8130_REG_EXTENSION, ctl, 3);
682 if (ret < 0)
683 return ret;
684
685 ctl[0] &= ~RX8130_REG_EXTENSION_WADA;
686 ctl[1] |= RX8130_REG_FLAG_AF;
687 ctl[2] &= ~RX8130_REG_CONTROL0_AIE;
688
689 ret = regmap_bulk_write(ds1307->regmap, RX8130_REG_EXTENSION, ctl, 3);
690 if (ret < 0)
691 return ret;
692
693 /* Hardware alarm precision is 1 minute! */
694 ald[0] = bin2bcd(t->time.tm_min);
695 ald[1] = bin2bcd(t->time.tm_hour);
696 ald[2] = bin2bcd(t->time.tm_mday);
697
698 ret = regmap_bulk_write(ds1307->regmap, RX8130_REG_ALARM_MIN, ald, 3);
699 if (ret < 0)
700 return ret;
701
702 if (!t->enabled)
703 return 0;
704
705 ctl[2] |= RX8130_REG_CONTROL0_AIE;
706
707 return regmap_bulk_write(ds1307->regmap, RX8130_REG_EXTENSION, ctl, 3);
708}
709
710static int rx8130_alarm_irq_enable(struct device *dev, unsigned int enabled)
711{
712 struct ds1307 *ds1307 = dev_get_drvdata(dev);
713 int ret, reg;
714
715 if (!test_bit(HAS_ALARM, &ds1307->flags))
716 return -EINVAL;
717
718 ret = regmap_read(ds1307->regmap, RX8130_REG_CONTROL0, &reg);
719 if (ret < 0)
720 return ret;
721
722 if (enabled)
723 reg |= RX8130_REG_CONTROL0_AIE;
724 else
725 reg &= ~RX8130_REG_CONTROL0_AIE;
726
727 return regmap_write(ds1307->regmap, RX8130_REG_CONTROL0, reg);
728}
729
730static const struct rtc_class_ops rx8130_rtc_ops = {
731 .read_time = ds1307_get_time,
732 .set_time = ds1307_set_time,
733 .read_alarm = rx8130_read_alarm,
734 .set_alarm = rx8130_set_alarm,
735 .alarm_irq_enable = rx8130_alarm_irq_enable,
736};
737
738/*----------------------------------------------------------------------*/
739
740/*
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800741 * Alarm support for mcp794xx devices.
Simon Guinot1d1945d2014-04-03 14:49:55 -0700742 */
743
Keerthye29385f2016-06-01 16:19:07 +0530744#define MCP794XX_REG_WEEKDAY 0x3
745#define MCP794XX_REG_WEEKDAY_WDAY_MASK 0x7
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800746#define MCP794XX_REG_CONTROL 0x07
747# define MCP794XX_BIT_ALM0_EN 0x10
748# define MCP794XX_BIT_ALM1_EN 0x20
749#define MCP794XX_REG_ALARM0_BASE 0x0a
750#define MCP794XX_REG_ALARM0_CTRL 0x0d
751#define MCP794XX_REG_ALARM1_BASE 0x11
752#define MCP794XX_REG_ALARM1_CTRL 0x14
753# define MCP794XX_BIT_ALMX_IF (1 << 3)
754# define MCP794XX_BIT_ALMX_C0 (1 << 4)
755# define MCP794XX_BIT_ALMX_C1 (1 << 5)
756# define MCP794XX_BIT_ALMX_C2 (1 << 6)
757# define MCP794XX_BIT_ALMX_POL (1 << 7)
758# define MCP794XX_MSK_ALMX_MATCH (MCP794XX_BIT_ALMX_C0 | \
759 MCP794XX_BIT_ALMX_C1 | \
760 MCP794XX_BIT_ALMX_C2)
Simon Guinot1d1945d2014-04-03 14:49:55 -0700761
Felipe Balbi2fb07a12015-06-23 11:15:10 -0500762static irqreturn_t mcp794xx_irq(int irq, void *dev_id)
Simon Guinot1d1945d2014-04-03 14:49:55 -0700763{
Heiner Kallweit11e58902017-03-10 18:52:34 +0100764 struct ds1307 *ds1307 = dev_id;
Felipe Balbi2fb07a12015-06-23 11:15:10 -0500765 struct mutex *lock = &ds1307->rtc->ops_lock;
Simon Guinot1d1945d2014-04-03 14:49:55 -0700766 int reg, ret;
767
Felipe Balbi2fb07a12015-06-23 11:15:10 -0500768 mutex_lock(lock);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700769
770 /* Check and clear alarm 0 interrupt flag. */
Heiner Kallweit11e58902017-03-10 18:52:34 +0100771 ret = regmap_read(ds1307->regmap, MCP794XX_REG_ALARM0_CTRL, &reg);
772 if (ret)
Simon Guinot1d1945d2014-04-03 14:49:55 -0700773 goto out;
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800774 if (!(reg & MCP794XX_BIT_ALMX_IF))
Simon Guinot1d1945d2014-04-03 14:49:55 -0700775 goto out;
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800776 reg &= ~MCP794XX_BIT_ALMX_IF;
Heiner Kallweit11e58902017-03-10 18:52:34 +0100777 ret = regmap_write(ds1307->regmap, MCP794XX_REG_ALARM0_CTRL, reg);
778 if (ret)
Simon Guinot1d1945d2014-04-03 14:49:55 -0700779 goto out;
780
781 /* Disable alarm 0. */
Heiner Kallweit078f3f62017-06-05 17:57:29 +0200782 ret = regmap_update_bits(ds1307->regmap, MCP794XX_REG_CONTROL,
783 MCP794XX_BIT_ALM0_EN, 0);
Heiner Kallweit11e58902017-03-10 18:52:34 +0100784 if (ret)
Simon Guinot1d1945d2014-04-03 14:49:55 -0700785 goto out;
786
787 rtc_update_irq(ds1307->rtc, 1, RTC_AF | RTC_IRQF);
788
789out:
Felipe Balbi2fb07a12015-06-23 11:15:10 -0500790 mutex_unlock(lock);
791
792 return IRQ_HANDLED;
Simon Guinot1d1945d2014-04-03 14:49:55 -0700793}
794
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800795static int mcp794xx_read_alarm(struct device *dev, struct rtc_wkalrm *t)
Simon Guinot1d1945d2014-04-03 14:49:55 -0700796{
Heiner Kallweit11e58902017-03-10 18:52:34 +0100797 struct ds1307 *ds1307 = dev_get_drvdata(dev);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700798 u8 *regs = ds1307->regs;
799 int ret;
800
801 if (!test_bit(HAS_ALARM, &ds1307->flags))
802 return -EINVAL;
803
804 /* Read control and alarm 0 registers. */
Heiner Kallweit11e58902017-03-10 18:52:34 +0100805 ret = regmap_bulk_read(ds1307->regmap, MCP794XX_REG_CONTROL, regs, 10);
806 if (ret)
Simon Guinot1d1945d2014-04-03 14:49:55 -0700807 return ret;
808
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800809 t->enabled = !!(regs[0] & MCP794XX_BIT_ALM0_EN);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700810
811 /* Report alarm 0 time assuming 24-hour and day-of-month modes. */
812 t->time.tm_sec = bcd2bin(ds1307->regs[3] & 0x7f);
813 t->time.tm_min = bcd2bin(ds1307->regs[4] & 0x7f);
814 t->time.tm_hour = bcd2bin(ds1307->regs[5] & 0x3f);
815 t->time.tm_wday = bcd2bin(ds1307->regs[6] & 0x7) - 1;
816 t->time.tm_mday = bcd2bin(ds1307->regs[7] & 0x3f);
817 t->time.tm_mon = bcd2bin(ds1307->regs[8] & 0x1f) - 1;
818 t->time.tm_year = -1;
819 t->time.tm_yday = -1;
820 t->time.tm_isdst = -1;
821
822 dev_dbg(dev, "%s, sec=%d min=%d hour=%d wday=%d mday=%d mon=%d "
823 "enabled=%d polarity=%d irq=%d match=%d\n", __func__,
824 t->time.tm_sec, t->time.tm_min, t->time.tm_hour,
825 t->time.tm_wday, t->time.tm_mday, t->time.tm_mon, t->enabled,
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800826 !!(ds1307->regs[6] & MCP794XX_BIT_ALMX_POL),
827 !!(ds1307->regs[6] & MCP794XX_BIT_ALMX_IF),
828 (ds1307->regs[6] & MCP794XX_MSK_ALMX_MATCH) >> 4);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700829
830 return 0;
831}
832
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800833static int mcp794xx_set_alarm(struct device *dev, struct rtc_wkalrm *t)
Simon Guinot1d1945d2014-04-03 14:49:55 -0700834{
Heiner Kallweit11e58902017-03-10 18:52:34 +0100835 struct ds1307 *ds1307 = dev_get_drvdata(dev);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700836 unsigned char *regs = ds1307->regs;
837 int ret;
838
839 if (!test_bit(HAS_ALARM, &ds1307->flags))
840 return -EINVAL;
841
842 dev_dbg(dev, "%s, sec=%d min=%d hour=%d wday=%d mday=%d mon=%d "
843 "enabled=%d pending=%d\n", __func__,
844 t->time.tm_sec, t->time.tm_min, t->time.tm_hour,
845 t->time.tm_wday, t->time.tm_mday, t->time.tm_mon,
846 t->enabled, t->pending);
847
848 /* Read control and alarm 0 registers. */
Heiner Kallweit11e58902017-03-10 18:52:34 +0100849 ret = regmap_bulk_read(ds1307->regmap, MCP794XX_REG_CONTROL, regs, 10);
850 if (ret)
Simon Guinot1d1945d2014-04-03 14:49:55 -0700851 return ret;
852
853 /* Set alarm 0, using 24-hour and day-of-month modes. */
854 regs[3] = bin2bcd(t->time.tm_sec);
855 regs[4] = bin2bcd(t->time.tm_min);
856 regs[5] = bin2bcd(t->time.tm_hour);
Tero Kristo62c8c202015-10-23 09:29:57 +0300857 regs[6] = bin2bcd(t->time.tm_wday + 1);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700858 regs[7] = bin2bcd(t->time.tm_mday);
Tero Kristo62c8c202015-10-23 09:29:57 +0300859 regs[8] = bin2bcd(t->time.tm_mon + 1);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700860
861 /* Clear the alarm 0 interrupt flag. */
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800862 regs[6] &= ~MCP794XX_BIT_ALMX_IF;
Simon Guinot1d1945d2014-04-03 14:49:55 -0700863 /* Set alarm match: second, minute, hour, day, date, month. */
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800864 regs[6] |= MCP794XX_MSK_ALMX_MATCH;
Nishanth Menone3edd672015-04-20 19:51:34 -0500865 /* Disable interrupt. We will not enable until completely programmed */
866 regs[0] &= ~MCP794XX_BIT_ALM0_EN;
Simon Guinot1d1945d2014-04-03 14:49:55 -0700867
Heiner Kallweit11e58902017-03-10 18:52:34 +0100868 ret = regmap_bulk_write(ds1307->regmap, MCP794XX_REG_CONTROL, regs, 10);
869 if (ret)
Simon Guinot1d1945d2014-04-03 14:49:55 -0700870 return ret;
871
Nishanth Menone3edd672015-04-20 19:51:34 -0500872 if (!t->enabled)
873 return 0;
874 regs[0] |= MCP794XX_BIT_ALM0_EN;
Heiner Kallweit11e58902017-03-10 18:52:34 +0100875 return regmap_write(ds1307->regmap, MCP794XX_REG_CONTROL, regs[0]);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700876}
877
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800878static int mcp794xx_alarm_irq_enable(struct device *dev, unsigned int enabled)
Simon Guinot1d1945d2014-04-03 14:49:55 -0700879{
Heiner Kallweit11e58902017-03-10 18:52:34 +0100880 struct ds1307 *ds1307 = dev_get_drvdata(dev);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700881
882 if (!test_bit(HAS_ALARM, &ds1307->flags))
883 return -EINVAL;
884
Heiner Kallweit078f3f62017-06-05 17:57:29 +0200885 return regmap_update_bits(ds1307->regmap, MCP794XX_REG_CONTROL,
886 MCP794XX_BIT_ALM0_EN,
887 enabled ? MCP794XX_BIT_ALM0_EN : 0);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700888}
889
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800890static const struct rtc_class_ops mcp794xx_rtc_ops = {
Simon Guinot1d1945d2014-04-03 14:49:55 -0700891 .read_time = ds1307_get_time,
892 .set_time = ds1307_set_time,
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800893 .read_alarm = mcp794xx_read_alarm,
894 .set_alarm = mcp794xx_set_alarm,
895 .alarm_irq_enable = mcp794xx_alarm_irq_enable,
Simon Guinot1d1945d2014-04-03 14:49:55 -0700896};
897
898/*----------------------------------------------------------------------*/
899
Alexandre Belloniabc925f2017-07-06 11:42:07 +0200900static int ds1307_nvram_read(void *priv, unsigned int offset, void *val,
901 size_t bytes)
David Brownell682d73f2007-11-14 16:58:32 -0800902{
Alexandre Belloniabc925f2017-07-06 11:42:07 +0200903 struct ds1307 *ds1307 = priv;
David Brownell682d73f2007-11-14 16:58:32 -0800904
Alexandre Belloniabc925f2017-07-06 11:42:07 +0200905 return regmap_bulk_read(ds1307->regmap, ds1307->nvram_offset + offset,
906 val, bytes);
David Brownell682d73f2007-11-14 16:58:32 -0800907}
908
Alexandre Belloniabc925f2017-07-06 11:42:07 +0200909static int ds1307_nvram_write(void *priv, unsigned int offset, void *val,
910 size_t bytes)
David Brownell682d73f2007-11-14 16:58:32 -0800911{
Alexandre Belloniabc925f2017-07-06 11:42:07 +0200912 struct ds1307 *ds1307 = priv;
David Brownell682d73f2007-11-14 16:58:32 -0800913
Alexandre Belloniabc925f2017-07-06 11:42:07 +0200914 return regmap_bulk_write(ds1307->regmap, ds1307->nvram_offset + offset,
915 val, bytes);
David Brownell682d73f2007-11-14 16:58:32 -0800916}
917
David Brownell682d73f2007-11-14 16:58:32 -0800918/*----------------------------------------------------------------------*/
919
Heiner Kallweit11e58902017-03-10 18:52:34 +0100920static u8 do_trickle_setup_ds1339(struct ds1307 *ds1307,
Matti Vaittinen33b04b72014-10-13 15:52:48 -0700921 uint32_t ohms, bool diode)
922{
923 u8 setup = (diode) ? DS1307_TRICKLE_CHARGER_DIODE :
924 DS1307_TRICKLE_CHARGER_NO_DIODE;
925
926 switch (ohms) {
927 case 250:
928 setup |= DS1307_TRICKLE_CHARGER_250_OHM;
929 break;
930 case 2000:
931 setup |= DS1307_TRICKLE_CHARGER_2K_OHM;
932 break;
933 case 4000:
934 setup |= DS1307_TRICKLE_CHARGER_4K_OHM;
935 break;
936 default:
Heiner Kallweit11e58902017-03-10 18:52:34 +0100937 dev_warn(ds1307->dev,
Matti Vaittinen33b04b72014-10-13 15:52:48 -0700938 "Unsupported ohm value %u in dt\n", ohms);
939 return 0;
940 }
941 return setup;
942}
943
Heiner Kallweit11e58902017-03-10 18:52:34 +0100944static void ds1307_trickle_init(struct ds1307 *ds1307,
Tin Huynh9c19b892016-11-30 09:57:31 +0700945 struct chip_desc *chip)
Matti Vaittinen33b04b72014-10-13 15:52:48 -0700946{
947 uint32_t ohms = 0;
948 bool diode = true;
949
950 if (!chip->do_trickle_setup)
951 goto out;
Heiner Kallweit11e58902017-03-10 18:52:34 +0100952 if (device_property_read_u32(ds1307->dev, "trickle-resistor-ohms",
953 &ohms))
Matti Vaittinen33b04b72014-10-13 15:52:48 -0700954 goto out;
Heiner Kallweit11e58902017-03-10 18:52:34 +0100955 if (device_property_read_bool(ds1307->dev, "trickle-diode-disable"))
Matti Vaittinen33b04b72014-10-13 15:52:48 -0700956 diode = false;
Heiner Kallweit11e58902017-03-10 18:52:34 +0100957 chip->trickle_charger_setup = chip->do_trickle_setup(ds1307,
Matti Vaittinen33b04b72014-10-13 15:52:48 -0700958 ohms, diode);
959out:
960 return;
961}
962
Akinobu Mita445c0202016-01-25 00:22:16 +0900963/*----------------------------------------------------------------------*/
964
965#ifdef CONFIG_RTC_DRV_DS1307_HWMON
966
967/*
968 * Temperature sensor support for ds3231 devices.
969 */
970
971#define DS3231_REG_TEMPERATURE 0x11
972
973/*
974 * A user-initiated temperature conversion is not started by this function,
975 * so the temperature is updated once every 64 seconds.
976 */
Zhuang Yuyao9a3dce62016-04-18 09:21:42 +0900977static int ds3231_hwmon_read_temp(struct device *dev, s32 *mC)
Akinobu Mita445c0202016-01-25 00:22:16 +0900978{
979 struct ds1307 *ds1307 = dev_get_drvdata(dev);
980 u8 temp_buf[2];
981 s16 temp;
982 int ret;
983
Heiner Kallweit11e58902017-03-10 18:52:34 +0100984 ret = regmap_bulk_read(ds1307->regmap, DS3231_REG_TEMPERATURE,
985 temp_buf, sizeof(temp_buf));
986 if (ret)
Akinobu Mita445c0202016-01-25 00:22:16 +0900987 return ret;
Akinobu Mita445c0202016-01-25 00:22:16 +0900988 /*
989 * Temperature is represented as a 10-bit code with a resolution of
990 * 0.25 degree celsius and encoded in two's complement format.
991 */
992 temp = (temp_buf[0] << 8) | temp_buf[1];
993 temp >>= 6;
994 *mC = temp * 250;
995
996 return 0;
997}
998
999static ssize_t ds3231_hwmon_show_temp(struct device *dev,
1000 struct device_attribute *attr, char *buf)
1001{
1002 int ret;
Zhuang Yuyao9a3dce62016-04-18 09:21:42 +09001003 s32 temp;
Akinobu Mita445c0202016-01-25 00:22:16 +09001004
1005 ret = ds3231_hwmon_read_temp(dev, &temp);
1006 if (ret)
1007 return ret;
1008
1009 return sprintf(buf, "%d\n", temp);
1010}
1011static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, ds3231_hwmon_show_temp,
1012 NULL, 0);
1013
1014static struct attribute *ds3231_hwmon_attrs[] = {
1015 &sensor_dev_attr_temp1_input.dev_attr.attr,
1016 NULL,
1017};
1018ATTRIBUTE_GROUPS(ds3231_hwmon);
1019
1020static void ds1307_hwmon_register(struct ds1307 *ds1307)
1021{
1022 struct device *dev;
1023
1024 if (ds1307->type != ds_3231)
1025 return;
1026
Heiner Kallweit11e58902017-03-10 18:52:34 +01001027 dev = devm_hwmon_device_register_with_groups(ds1307->dev, ds1307->name,
Akinobu Mita445c0202016-01-25 00:22:16 +09001028 ds1307, ds3231_hwmon_groups);
1029 if (IS_ERR(dev)) {
Heiner Kallweit11e58902017-03-10 18:52:34 +01001030 dev_warn(ds1307->dev, "unable to register hwmon device %ld\n",
1031 PTR_ERR(dev));
Akinobu Mita445c0202016-01-25 00:22:16 +09001032 }
1033}
1034
1035#else
1036
1037static void ds1307_hwmon_register(struct ds1307 *ds1307)
1038{
1039}
1040
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001041#endif /* CONFIG_RTC_DRV_DS1307_HWMON */
1042
1043/*----------------------------------------------------------------------*/
1044
1045/*
1046 * Square-wave output support for DS3231
1047 * Datasheet: https://datasheets.maximintegrated.com/en/ds/DS3231.pdf
1048 */
1049#ifdef CONFIG_COMMON_CLK
1050
1051enum {
1052 DS3231_CLK_SQW = 0,
1053 DS3231_CLK_32KHZ,
1054};
1055
1056#define clk_sqw_to_ds1307(clk) \
1057 container_of(clk, struct ds1307, clks[DS3231_CLK_SQW])
1058#define clk_32khz_to_ds1307(clk) \
1059 container_of(clk, struct ds1307, clks[DS3231_CLK_32KHZ])
1060
1061static int ds3231_clk_sqw_rates[] = {
1062 1,
1063 1024,
1064 4096,
1065 8192,
1066};
1067
1068static int ds1337_write_control(struct ds1307 *ds1307, u8 mask, u8 value)
1069{
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001070 struct mutex *lock = &ds1307->rtc->ops_lock;
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001071 int ret;
1072
1073 mutex_lock(lock);
Heiner Kallweit078f3f62017-06-05 17:57:29 +02001074 ret = regmap_update_bits(ds1307->regmap, DS1337_REG_CONTROL,
1075 mask, value);
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001076 mutex_unlock(lock);
1077
1078 return ret;
1079}
1080
1081static unsigned long ds3231_clk_sqw_recalc_rate(struct clk_hw *hw,
1082 unsigned long parent_rate)
1083{
1084 struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
Heiner Kallweit11e58902017-03-10 18:52:34 +01001085 int control, ret;
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001086 int rate_sel = 0;
1087
Heiner Kallweit11e58902017-03-10 18:52:34 +01001088 ret = regmap_read(ds1307->regmap, DS1337_REG_CONTROL, &control);
1089 if (ret)
1090 return ret;
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001091 if (control & DS1337_BIT_RS1)
1092 rate_sel += 1;
1093 if (control & DS1337_BIT_RS2)
1094 rate_sel += 2;
1095
1096 return ds3231_clk_sqw_rates[rate_sel];
1097}
1098
1099static long ds3231_clk_sqw_round_rate(struct clk_hw *hw, unsigned long rate,
1100 unsigned long *prate)
1101{
1102 int i;
1103
1104 for (i = ARRAY_SIZE(ds3231_clk_sqw_rates) - 1; i >= 0; i--) {
1105 if (ds3231_clk_sqw_rates[i] <= rate)
1106 return ds3231_clk_sqw_rates[i];
1107 }
1108
1109 return 0;
1110}
1111
1112static int ds3231_clk_sqw_set_rate(struct clk_hw *hw, unsigned long rate,
1113 unsigned long parent_rate)
1114{
1115 struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
1116 int control = 0;
1117 int rate_sel;
1118
1119 for (rate_sel = 0; rate_sel < ARRAY_SIZE(ds3231_clk_sqw_rates);
1120 rate_sel++) {
1121 if (ds3231_clk_sqw_rates[rate_sel] == rate)
1122 break;
1123 }
1124
1125 if (rate_sel == ARRAY_SIZE(ds3231_clk_sqw_rates))
1126 return -EINVAL;
1127
1128 if (rate_sel & 1)
1129 control |= DS1337_BIT_RS1;
1130 if (rate_sel & 2)
1131 control |= DS1337_BIT_RS2;
1132
1133 return ds1337_write_control(ds1307, DS1337_BIT_RS1 | DS1337_BIT_RS2,
1134 control);
1135}
1136
1137static int ds3231_clk_sqw_prepare(struct clk_hw *hw)
1138{
1139 struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
1140
1141 return ds1337_write_control(ds1307, DS1337_BIT_INTCN, 0);
1142}
1143
1144static void ds3231_clk_sqw_unprepare(struct clk_hw *hw)
1145{
1146 struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
1147
1148 ds1337_write_control(ds1307, DS1337_BIT_INTCN, DS1337_BIT_INTCN);
1149}
1150
1151static int ds3231_clk_sqw_is_prepared(struct clk_hw *hw)
1152{
1153 struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
Heiner Kallweit11e58902017-03-10 18:52:34 +01001154 int control, ret;
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001155
Heiner Kallweit11e58902017-03-10 18:52:34 +01001156 ret = regmap_read(ds1307->regmap, DS1337_REG_CONTROL, &control);
1157 if (ret)
1158 return ret;
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001159
1160 return !(control & DS1337_BIT_INTCN);
1161}
1162
1163static const struct clk_ops ds3231_clk_sqw_ops = {
1164 .prepare = ds3231_clk_sqw_prepare,
1165 .unprepare = ds3231_clk_sqw_unprepare,
1166 .is_prepared = ds3231_clk_sqw_is_prepared,
1167 .recalc_rate = ds3231_clk_sqw_recalc_rate,
1168 .round_rate = ds3231_clk_sqw_round_rate,
1169 .set_rate = ds3231_clk_sqw_set_rate,
1170};
1171
1172static unsigned long ds3231_clk_32khz_recalc_rate(struct clk_hw *hw,
1173 unsigned long parent_rate)
1174{
1175 return 32768;
1176}
1177
1178static int ds3231_clk_32khz_control(struct ds1307 *ds1307, bool enable)
1179{
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001180 struct mutex *lock = &ds1307->rtc->ops_lock;
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001181 int ret;
1182
1183 mutex_lock(lock);
Heiner Kallweit078f3f62017-06-05 17:57:29 +02001184 ret = regmap_update_bits(ds1307->regmap, DS1337_REG_STATUS,
1185 DS3231_BIT_EN32KHZ,
1186 enable ? DS3231_BIT_EN32KHZ : 0);
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001187 mutex_unlock(lock);
1188
1189 return ret;
1190}
1191
1192static int ds3231_clk_32khz_prepare(struct clk_hw *hw)
1193{
1194 struct ds1307 *ds1307 = clk_32khz_to_ds1307(hw);
1195
1196 return ds3231_clk_32khz_control(ds1307, true);
1197}
1198
1199static void ds3231_clk_32khz_unprepare(struct clk_hw *hw)
1200{
1201 struct ds1307 *ds1307 = clk_32khz_to_ds1307(hw);
1202
1203 ds3231_clk_32khz_control(ds1307, false);
1204}
1205
1206static int ds3231_clk_32khz_is_prepared(struct clk_hw *hw)
1207{
1208 struct ds1307 *ds1307 = clk_32khz_to_ds1307(hw);
Heiner Kallweit11e58902017-03-10 18:52:34 +01001209 int status, ret;
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001210
Heiner Kallweit11e58902017-03-10 18:52:34 +01001211 ret = regmap_read(ds1307->regmap, DS1337_REG_STATUS, &status);
1212 if (ret)
1213 return ret;
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001214
1215 return !!(status & DS3231_BIT_EN32KHZ);
1216}
1217
1218static const struct clk_ops ds3231_clk_32khz_ops = {
1219 .prepare = ds3231_clk_32khz_prepare,
1220 .unprepare = ds3231_clk_32khz_unprepare,
1221 .is_prepared = ds3231_clk_32khz_is_prepared,
1222 .recalc_rate = ds3231_clk_32khz_recalc_rate,
1223};
1224
1225static struct clk_init_data ds3231_clks_init[] = {
1226 [DS3231_CLK_SQW] = {
1227 .name = "ds3231_clk_sqw",
1228 .ops = &ds3231_clk_sqw_ops,
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001229 },
1230 [DS3231_CLK_32KHZ] = {
1231 .name = "ds3231_clk_32khz",
1232 .ops = &ds3231_clk_32khz_ops,
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001233 },
1234};
1235
1236static int ds3231_clks_register(struct ds1307 *ds1307)
1237{
Heiner Kallweit11e58902017-03-10 18:52:34 +01001238 struct device_node *node = ds1307->dev->of_node;
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001239 struct clk_onecell_data *onecell;
1240 int i;
1241
Heiner Kallweit11e58902017-03-10 18:52:34 +01001242 onecell = devm_kzalloc(ds1307->dev, sizeof(*onecell), GFP_KERNEL);
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001243 if (!onecell)
1244 return -ENOMEM;
1245
1246 onecell->clk_num = ARRAY_SIZE(ds3231_clks_init);
Heiner Kallweit11e58902017-03-10 18:52:34 +01001247 onecell->clks = devm_kcalloc(ds1307->dev, onecell->clk_num,
1248 sizeof(onecell->clks[0]), GFP_KERNEL);
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001249 if (!onecell->clks)
1250 return -ENOMEM;
1251
1252 for (i = 0; i < ARRAY_SIZE(ds3231_clks_init); i++) {
1253 struct clk_init_data init = ds3231_clks_init[i];
1254
1255 /*
1256 * Interrupt signal due to alarm conditions and square-wave
1257 * output share same pin, so don't initialize both.
1258 */
1259 if (i == DS3231_CLK_SQW && test_bit(HAS_ALARM, &ds1307->flags))
1260 continue;
1261
1262 /* optional override of the clockname */
1263 of_property_read_string_index(node, "clock-output-names", i,
1264 &init.name);
1265 ds1307->clks[i].init = &init;
1266
Heiner Kallweit11e58902017-03-10 18:52:34 +01001267 onecell->clks[i] = devm_clk_register(ds1307->dev,
1268 &ds1307->clks[i]);
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001269 if (IS_ERR(onecell->clks[i]))
1270 return PTR_ERR(onecell->clks[i]);
1271 }
1272
1273 if (!node)
1274 return 0;
1275
1276 of_clk_add_provider(node, of_clk_src_onecell_get, onecell);
1277
1278 return 0;
1279}
1280
1281static void ds1307_clks_register(struct ds1307 *ds1307)
1282{
1283 int ret;
1284
1285 if (ds1307->type != ds_3231)
1286 return;
1287
1288 ret = ds3231_clks_register(ds1307);
1289 if (ret) {
Heiner Kallweit11e58902017-03-10 18:52:34 +01001290 dev_warn(ds1307->dev, "unable to register clock device %d\n",
1291 ret);
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001292 }
1293}
1294
1295#else
1296
1297static void ds1307_clks_register(struct ds1307 *ds1307)
1298{
1299}
1300
1301#endif /* CONFIG_COMMON_CLK */
Akinobu Mita445c0202016-01-25 00:22:16 +09001302
Heiner Kallweit11e58902017-03-10 18:52:34 +01001303static const struct regmap_config regmap_config = {
1304 .reg_bits = 8,
1305 .val_bits = 8,
1306 .max_register = 0x12,
1307};
1308
Greg Kroah-Hartman5a167f42012-12-21 13:09:38 -08001309static int ds1307_probe(struct i2c_client *client,
1310 const struct i2c_device_id *id)
David Brownell1abb0dc2006-06-25 05:48:17 -07001311{
1312 struct ds1307 *ds1307;
1313 int err = -ENODEV;
Keerthye29385f2016-06-01 16:19:07 +05301314 int tmp, wday;
Tin Huynh9c19b892016-11-30 09:57:31 +07001315 struct chip_desc *chip;
Peter Senna Tschudinc8b18da2013-11-12 15:10:59 -08001316 bool want_irq = false;
Michael Lange8bc2a402016-01-21 18:10:16 +01001317 bool ds1307_can_wakeup_device = false;
BARRE Sebastienfed40b72009-01-07 18:07:13 -08001318 unsigned char *buf;
Jingoo Han01ce8932013-11-12 15:10:41 -08001319 struct ds1307_platform_data *pdata = dev_get_platdata(&client->dev);
Keerthye29385f2016-06-01 16:19:07 +05301320 struct rtc_time tm;
1321 unsigned long timestamp;
1322
Felipe Balbi2fb07a12015-06-23 11:15:10 -05001323 irq_handler_t irq_handler = ds1307_irq;
1324
Simon Guinot1d1945d2014-04-03 14:49:55 -07001325 const struct rtc_class_ops *rtc_ops = &ds13xx_rtc_ops;
David Brownell1abb0dc2006-06-25 05:48:17 -07001326
Jingoo Hanedca66d2013-07-03 15:07:05 -07001327 ds1307 = devm_kzalloc(&client->dev, sizeof(struct ds1307), GFP_KERNEL);
David Anders40ce9722012-03-23 15:02:37 -07001328 if (!ds1307)
David Brownellc065f352007-07-17 04:05:10 -07001329 return -ENOMEM;
David Brownell045e0e82007-07-17 04:04:55 -07001330
Heiner Kallweit11e58902017-03-10 18:52:34 +01001331 dev_set_drvdata(&client->dev, ds1307);
1332 ds1307->dev = &client->dev;
1333 ds1307->name = client->name;
Joakim Tjernlund33df2ee2009-06-17 16:26:08 -07001334
Heiner Kallweit11e58902017-03-10 18:52:34 +01001335 ds1307->regmap = devm_regmap_init_i2c(client, &regmap_config);
1336 if (IS_ERR(ds1307->regmap)) {
1337 dev_err(ds1307->dev, "regmap allocation failed\n");
1338 return PTR_ERR(ds1307->regmap);
1339 }
1340
1341 i2c_set_clientdata(client, ds1307);
Javier Martinez Canillas7ef6d2c2017-03-03 11:29:15 -03001342
1343 if (client->dev.of_node) {
1344 ds1307->type = (enum ds_type)
1345 of_device_get_match_data(&client->dev);
1346 chip = &chips[ds1307->type];
1347 } else if (id) {
Tin Huynh9c19b892016-11-30 09:57:31 +07001348 chip = &chips[id->driver_data];
1349 ds1307->type = id->driver_data;
1350 } else {
1351 const struct acpi_device_id *acpi_id;
Joakim Tjernlund33df2ee2009-06-17 16:26:08 -07001352
Tin Huynh9c19b892016-11-30 09:57:31 +07001353 acpi_id = acpi_match_device(ACPI_PTR(ds1307_acpi_ids),
Heiner Kallweit11e58902017-03-10 18:52:34 +01001354 ds1307->dev);
Tin Huynh9c19b892016-11-30 09:57:31 +07001355 if (!acpi_id)
1356 return -ENODEV;
1357 chip = &chips[acpi_id->driver_data];
1358 ds1307->type = acpi_id->driver_data;
1359 }
1360
1361 if (!pdata)
Heiner Kallweit11e58902017-03-10 18:52:34 +01001362 ds1307_trickle_init(ds1307, chip);
Tin Huynh9c19b892016-11-30 09:57:31 +07001363 else if (pdata->trickle_charger_setup)
Matti Vaittinen33b04b72014-10-13 15:52:48 -07001364 chip->trickle_charger_setup = pdata->trickle_charger_setup;
1365
1366 if (chip->trickle_charger_setup && chip->trickle_charger_reg) {
Heiner Kallweit11e58902017-03-10 18:52:34 +01001367 dev_dbg(ds1307->dev,
1368 "writing trickle charger info 0x%x to 0x%x\n",
Matti Vaittinen33b04b72014-10-13 15:52:48 -07001369 DS13XX_TRICKLE_CHARGER_MAGIC | chip->trickle_charger_setup,
1370 chip->trickle_charger_reg);
Heiner Kallweit11e58902017-03-10 18:52:34 +01001371 regmap_write(ds1307->regmap, chip->trickle_charger_reg,
Matti Vaittinen33b04b72014-10-13 15:52:48 -07001372 DS13XX_TRICKLE_CHARGER_MAGIC |
1373 chip->trickle_charger_setup);
1374 }
Wolfram Sangeb86c302012-05-29 15:07:38 -07001375
BARRE Sebastienfed40b72009-01-07 18:07:13 -08001376 buf = ds1307->regs;
David Brownell045e0e82007-07-17 04:04:55 -07001377
Michael Lange8bc2a402016-01-21 18:10:16 +01001378#ifdef CONFIG_OF
1379/*
1380 * For devices with no IRQ directly connected to the SoC, the RTC chip
1381 * can be forced as a wakeup source by stating that explicitly in
1382 * the device's .dts file using the "wakeup-source" boolean property.
1383 * If the "wakeup-source" property is set, don't request an IRQ.
1384 * This will guarantee the 'wakealarm' sysfs entry is available on the device,
1385 * if supported by the RTC.
1386 */
Heiner Kallweit11909f02017-07-06 22:40:03 +02001387 if (of_property_read_bool(client->dev.of_node, "wakeup-source"))
Michael Lange8bc2a402016-01-21 18:10:16 +01001388 ds1307_can_wakeup_device = true;
Michael Lange8bc2a402016-01-21 18:10:16 +01001389#endif
1390
David Brownell045e0e82007-07-17 04:04:55 -07001391 switch (ds1307->type) {
1392 case ds_1337:
1393 case ds_1339:
Wolfram Sang97f902b2009-06-17 16:26:10 -07001394 case ds_3231:
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -07001395 /* get registers that the "rtc" read below won't read... */
Heiner Kallweit11e58902017-03-10 18:52:34 +01001396 err = regmap_bulk_read(ds1307->regmap, DS1337_REG_CONTROL,
1397 buf, 2);
1398 if (err) {
1399 dev_dbg(ds1307->dev, "read error %d\n", err);
Jingoo Hanedca66d2013-07-03 15:07:05 -07001400 goto exit;
David Brownell1abb0dc2006-06-25 05:48:17 -07001401 }
1402
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -07001403 /* oscillator off? turn it on, so clock can tick. */
1404 if (ds1307->regs[0] & DS1337_BIT_nEOSC)
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -07001405 ds1307->regs[0] &= ~DS1337_BIT_nEOSC;
1406
David Anders40ce9722012-03-23 15:02:37 -07001407 /*
Michael Lange8bc2a402016-01-21 18:10:16 +01001408 * Using IRQ or defined as wakeup-source?
1409 * Disable the square wave and both alarms.
Wolfram Sang97f902b2009-06-17 16:26:10 -07001410 * For some variants, be sure alarms can trigger when we're
1411 * running on Vbackup (BBSQI/BBSQW)
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -07001412 */
Heiner Kallweit340fd7b2017-07-12 07:49:14 +02001413 if (chip->alarm && (client->irq > 0 ||
Heiner Kallweit11e58902017-03-10 18:52:34 +01001414 ds1307_can_wakeup_device)) {
Heiner Kallweit0b6ee802017-07-12 07:49:22 +02001415 ds1307->regs[0] |= DS1337_BIT_INTCN | chip->bbsqi_bit;
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -07001416 ds1307->regs[0] &= ~(DS1337_BIT_A2IE | DS1337_BIT_A1IE);
Wolfram Sangb24a7262012-03-23 15:02:37 -07001417
1418 want_irq = true;
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -07001419 }
1420
Heiner Kallweit11e58902017-03-10 18:52:34 +01001421 regmap_write(ds1307->regmap, DS1337_REG_CONTROL,
1422 ds1307->regs[0]);
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -07001423
1424 /* oscillator fault? clear flag, and warn */
1425 if (ds1307->regs[1] & DS1337_BIT_OSF) {
Heiner Kallweit11e58902017-03-10 18:52:34 +01001426 regmap_write(ds1307->regmap, DS1337_REG_STATUS,
1427 ds1307->regs[1] & ~DS1337_BIT_OSF);
1428 dev_warn(ds1307->dev, "SET TIME!\n");
David Brownell1abb0dc2006-06-25 05:48:17 -07001429 }
David Brownell045e0e82007-07-17 04:04:55 -07001430 break;
Matthias Fuchsa2166852009-03-31 15:24:58 -07001431
1432 case rx_8025:
Heiner Kallweit11e58902017-03-10 18:52:34 +01001433 err = regmap_bulk_read(ds1307->regmap,
1434 RX8025_REG_CTRL1 << 4 | 0x08, buf, 2);
1435 if (err) {
1436 dev_dbg(ds1307->dev, "read error %d\n", err);
Jingoo Hanedca66d2013-07-03 15:07:05 -07001437 goto exit;
Matthias Fuchsa2166852009-03-31 15:24:58 -07001438 }
1439
1440 /* oscillator off? turn it on, so clock can tick. */
1441 if (!(ds1307->regs[1] & RX8025_BIT_XST)) {
1442 ds1307->regs[1] |= RX8025_BIT_XST;
Heiner Kallweit11e58902017-03-10 18:52:34 +01001443 regmap_write(ds1307->regmap,
1444 RX8025_REG_CTRL2 << 4 | 0x08,
1445 ds1307->regs[1]);
1446 dev_warn(ds1307->dev,
Matthias Fuchsa2166852009-03-31 15:24:58 -07001447 "oscillator stop detected - SET TIME!\n");
1448 }
1449
1450 if (ds1307->regs[1] & RX8025_BIT_PON) {
1451 ds1307->regs[1] &= ~RX8025_BIT_PON;
Heiner Kallweit11e58902017-03-10 18:52:34 +01001452 regmap_write(ds1307->regmap,
1453 RX8025_REG_CTRL2 << 4 | 0x08,
1454 ds1307->regs[1]);
1455 dev_warn(ds1307->dev, "power-on detected\n");
Matthias Fuchsa2166852009-03-31 15:24:58 -07001456 }
1457
1458 if (ds1307->regs[1] & RX8025_BIT_VDET) {
1459 ds1307->regs[1] &= ~RX8025_BIT_VDET;
Heiner Kallweit11e58902017-03-10 18:52:34 +01001460 regmap_write(ds1307->regmap,
1461 RX8025_REG_CTRL2 << 4 | 0x08,
1462 ds1307->regs[1]);
1463 dev_warn(ds1307->dev, "voltage drop detected\n");
Matthias Fuchsa2166852009-03-31 15:24:58 -07001464 }
1465
1466 /* make sure we are running in 24hour mode */
1467 if (!(ds1307->regs[0] & RX8025_BIT_2412)) {
1468 u8 hour;
1469
1470 /* switch to 24 hour mode */
Heiner Kallweit11e58902017-03-10 18:52:34 +01001471 regmap_write(ds1307->regmap,
1472 RX8025_REG_CTRL1 << 4 | 0x08,
1473 ds1307->regs[0] | RX8025_BIT_2412);
Matthias Fuchsa2166852009-03-31 15:24:58 -07001474
Heiner Kallweit11e58902017-03-10 18:52:34 +01001475 err = regmap_bulk_read(ds1307->regmap,
1476 RX8025_REG_CTRL1 << 4 | 0x08,
1477 buf, 2);
1478 if (err) {
1479 dev_dbg(ds1307->dev, "read error %d\n", err);
Jingoo Hanedca66d2013-07-03 15:07:05 -07001480 goto exit;
Matthias Fuchsa2166852009-03-31 15:24:58 -07001481 }
1482
1483 /* correct hour */
1484 hour = bcd2bin(ds1307->regs[DS1307_REG_HOUR]);
1485 if (hour == 12)
1486 hour = 0;
1487 if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
1488 hour += 12;
1489
Heiner Kallweit11e58902017-03-10 18:52:34 +01001490 regmap_write(ds1307->regmap,
1491 DS1307_REG_HOUR << 4 | 0x08, hour);
Matthias Fuchsa2166852009-03-31 15:24:58 -07001492 }
1493 break;
Marek Vasutee0981b2017-06-18 22:55:28 +02001494 case rx_8130:
1495 ds1307->offset = 0x10; /* Seconds starts at 0x10 */
1496 rtc_ops = &rx8130_rtc_ops;
Heiner Kallweit340fd7b2017-07-12 07:49:14 +02001497 if (chip->alarm && client->irq > 0) {
Marek Vasutee0981b2017-06-18 22:55:28 +02001498 irq_handler = rx8130_irq;
1499 want_irq = true;
1500 }
1501 break;
Joakim Tjernlund33df2ee2009-06-17 16:26:08 -07001502 case ds_1388:
1503 ds1307->offset = 1; /* Seconds starts at 1 */
1504 break;
Tomas Novotnyf4199f82014-12-10 15:53:57 -08001505 case mcp794xx:
1506 rtc_ops = &mcp794xx_rtc_ops;
Heiner Kallweit340fd7b2017-07-12 07:49:14 +02001507 if (chip->alarm && (client->irq > 0 ||
David Lowe80663602017-04-22 18:28:00 +01001508 ds1307_can_wakeup_device)) {
Felipe Balbi2fb07a12015-06-23 11:15:10 -05001509 irq_handler = mcp794xx_irq;
Simon Guinot1d1945d2014-04-03 14:49:55 -07001510 want_irq = true;
1511 }
1512 break;
David Brownell045e0e82007-07-17 04:04:55 -07001513 default:
1514 break;
1515 }
David Brownell1abb0dc2006-06-25 05:48:17 -07001516
1517read_rtc:
1518 /* read RTC registers */
Heiner Kallweit11e58902017-03-10 18:52:34 +01001519 err = regmap_bulk_read(ds1307->regmap, ds1307->offset, buf, 8);
1520 if (err) {
1521 dev_dbg(ds1307->dev, "read error %d\n", err);
Jingoo Hanedca66d2013-07-03 15:07:05 -07001522 goto exit;
David Brownell1abb0dc2006-06-25 05:48:17 -07001523 }
1524
David Anders40ce9722012-03-23 15:02:37 -07001525 /*
1526 * minimal sanity checking; some chips (like DS1340) don't
David Brownell1abb0dc2006-06-25 05:48:17 -07001527 * specify the extra bits as must-be-zero, but there are
1528 * still a few values that are clearly out-of-range.
1529 */
1530 tmp = ds1307->regs[DS1307_REG_SECS];
David Brownell045e0e82007-07-17 04:04:55 -07001531 switch (ds1307->type) {
1532 case ds_1307:
Stefan Agner8566f702017-03-23 16:54:57 -07001533 case m41t0:
David Brownell045e0e82007-07-17 04:04:55 -07001534 case m41t00:
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -07001535 /* clock halted? turn it on, so clock can tick. */
David Brownell045e0e82007-07-17 04:04:55 -07001536 if (tmp & DS1307_BIT_CH) {
Heiner Kallweit11e58902017-03-10 18:52:34 +01001537 regmap_write(ds1307->regmap, DS1307_REG_SECS, 0);
1538 dev_warn(ds1307->dev, "SET TIME!\n");
David Brownell045e0e82007-07-17 04:04:55 -07001539 goto read_rtc;
David Brownell1abb0dc2006-06-25 05:48:17 -07001540 }
David Brownell045e0e82007-07-17 04:04:55 -07001541 break;
Sean Nyekjaer300a7732017-06-08 12:36:54 +02001542 case ds_1308:
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -07001543 case ds_1338:
1544 /* clock halted? turn it on, so clock can tick. */
David Brownell045e0e82007-07-17 04:04:55 -07001545 if (tmp & DS1307_BIT_CH)
Heiner Kallweit11e58902017-03-10 18:52:34 +01001546 regmap_write(ds1307->regmap, DS1307_REG_SECS, 0);
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -07001547
1548 /* oscillator fault? clear flag, and warn */
1549 if (ds1307->regs[DS1307_REG_CONTROL] & DS1338_BIT_OSF) {
Heiner Kallweit11e58902017-03-10 18:52:34 +01001550 regmap_write(ds1307->regmap, DS1307_REG_CONTROL,
1551 ds1307->regs[DS1307_REG_CONTROL] &
1552 ~DS1338_BIT_OSF);
1553 dev_warn(ds1307->dev, "SET TIME!\n");
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -07001554 goto read_rtc;
1555 }
David Brownell045e0e82007-07-17 04:04:55 -07001556 break;
frederic Rodofcd8db02008-02-06 01:38:55 -08001557 case ds_1340:
1558 /* clock halted? turn it on, so clock can tick. */
1559 if (tmp & DS1340_BIT_nEOSC)
Heiner Kallweit11e58902017-03-10 18:52:34 +01001560 regmap_write(ds1307->regmap, DS1307_REG_SECS, 0);
frederic Rodofcd8db02008-02-06 01:38:55 -08001561
Heiner Kallweit11e58902017-03-10 18:52:34 +01001562 err = regmap_read(ds1307->regmap, DS1340_REG_FLAG, &tmp);
1563 if (err) {
1564 dev_dbg(ds1307->dev, "read error %d\n", err);
Jingoo Hanedca66d2013-07-03 15:07:05 -07001565 goto exit;
frederic Rodofcd8db02008-02-06 01:38:55 -08001566 }
1567
1568 /* oscillator fault? clear flag, and warn */
1569 if (tmp & DS1340_BIT_OSF) {
Heiner Kallweit11e58902017-03-10 18:52:34 +01001570 regmap_write(ds1307->regmap, DS1340_REG_FLAG, 0);
1571 dev_warn(ds1307->dev, "SET TIME!\n");
frederic Rodofcd8db02008-02-06 01:38:55 -08001572 }
1573 break;
Tomas Novotnyf4199f82014-12-10 15:53:57 -08001574 case mcp794xx:
David Anders43fcb812011-11-02 13:37:53 -07001575 /* make sure that the backup battery is enabled */
Tomas Novotnyf4199f82014-12-10 15:53:57 -08001576 if (!(ds1307->regs[DS1307_REG_WDAY] & MCP794XX_BIT_VBATEN)) {
Heiner Kallweit11e58902017-03-10 18:52:34 +01001577 regmap_write(ds1307->regmap, DS1307_REG_WDAY,
1578 ds1307->regs[DS1307_REG_WDAY] |
1579 MCP794XX_BIT_VBATEN);
David Anders43fcb812011-11-02 13:37:53 -07001580 }
1581
1582 /* clock halted? turn it on, so clock can tick. */
Tomas Novotnyf4199f82014-12-10 15:53:57 -08001583 if (!(tmp & MCP794XX_BIT_ST)) {
Heiner Kallweit11e58902017-03-10 18:52:34 +01001584 regmap_write(ds1307->regmap, DS1307_REG_SECS,
1585 MCP794XX_BIT_ST);
1586 dev_warn(ds1307->dev, "SET TIME!\n");
David Anders43fcb812011-11-02 13:37:53 -07001587 goto read_rtc;
1588 }
1589
1590 break;
Wolfram Sang32d322b2012-03-23 15:02:36 -07001591 default:
David Brownell045e0e82007-07-17 04:04:55 -07001592 break;
David Brownell1abb0dc2006-06-25 05:48:17 -07001593 }
David Brownell045e0e82007-07-17 04:04:55 -07001594
David Brownell1abb0dc2006-06-25 05:48:17 -07001595 tmp = ds1307->regs[DS1307_REG_HOUR];
David Brownellc065f352007-07-17 04:05:10 -07001596 switch (ds1307->type) {
1597 case ds_1340:
Stefan Agner8566f702017-03-23 16:54:57 -07001598 case m41t0:
David Brownellc065f352007-07-17 04:05:10 -07001599 case m41t00:
David Anders40ce9722012-03-23 15:02:37 -07001600 /*
1601 * NOTE: ignores century bits; fix before deploying
David Brownellc065f352007-07-17 04:05:10 -07001602 * systems that will run through year 2100.
1603 */
1604 break;
Matthias Fuchsa2166852009-03-31 15:24:58 -07001605 case rx_8025:
1606 break;
David Brownellc065f352007-07-17 04:05:10 -07001607 default:
1608 if (!(tmp & DS1307_BIT_12HR))
1609 break;
1610
David Anders40ce9722012-03-23 15:02:37 -07001611 /*
1612 * Be sure we're in 24 hour mode. Multi-master systems
David Brownellc065f352007-07-17 04:05:10 -07001613 * take note...
1614 */
Adrian Bunkfe20ba72008-10-18 20:28:41 -07001615 tmp = bcd2bin(tmp & 0x1f);
David Brownellc065f352007-07-17 04:05:10 -07001616 if (tmp == 12)
1617 tmp = 0;
1618 if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
1619 tmp += 12;
Heiner Kallweit11e58902017-03-10 18:52:34 +01001620 regmap_write(ds1307->regmap, ds1307->offset + DS1307_REG_HOUR,
1621 bin2bcd(tmp));
David Brownell1abb0dc2006-06-25 05:48:17 -07001622 }
1623
Keerthye29385f2016-06-01 16:19:07 +05301624 /*
1625 * Some IPs have weekday reset value = 0x1 which might not correct
1626 * hence compute the wday using the current date/month/year values
1627 */
Heiner Kallweit11e58902017-03-10 18:52:34 +01001628 ds1307_get_time(ds1307->dev, &tm);
Keerthye29385f2016-06-01 16:19:07 +05301629 wday = tm.tm_wday;
1630 timestamp = rtc_tm_to_time64(&tm);
1631 rtc_time64_to_tm(timestamp, &tm);
1632
1633 /*
1634 * Check if reset wday is different from the computed wday
1635 * If different then set the wday which we computed using
1636 * timestamp
1637 */
Heiner Kallweit078f3f62017-06-05 17:57:29 +02001638 if (wday != tm.tm_wday)
1639 regmap_update_bits(ds1307->regmap, MCP794XX_REG_WEEKDAY,
1640 MCP794XX_REG_WEEKDAY_WDAY_MASK,
1641 tm.tm_wday + 1);
Keerthye29385f2016-06-01 16:19:07 +05301642
Simon Guinot3abb1ad2015-11-26 15:37:13 +01001643 if (want_irq) {
Heiner Kallweit11e58902017-03-10 18:52:34 +01001644 device_set_wakeup_capable(ds1307->dev, true);
Simon Guinot3abb1ad2015-11-26 15:37:13 +01001645 set_bit(HAS_ALARM, &ds1307->flags);
1646 }
Alexandre Belloni69b119a2017-07-06 11:42:06 +02001647
1648 ds1307->rtc = devm_rtc_allocate_device(ds1307->dev);
David Brownell1abb0dc2006-06-25 05:48:17 -07001649 if (IS_ERR(ds1307->rtc)) {
Alessandro Zummo4071ea22014-04-03 14:49:36 -07001650 return PTR_ERR(ds1307->rtc);
David Brownell1abb0dc2006-06-25 05:48:17 -07001651 }
1652
Heiner Kallweit340fd7b2017-07-12 07:49:14 +02001653 if (ds1307_can_wakeup_device && client->irq <= 0) {
Michael Lange8bc2a402016-01-21 18:10:16 +01001654 /* Disable request for an IRQ */
1655 want_irq = false;
Heiner Kallweit11e58902017-03-10 18:52:34 +01001656 dev_info(ds1307->dev,
1657 "'wakeup-source' is set, request for an IRQ is disabled!\n");
Michael Lange8bc2a402016-01-21 18:10:16 +01001658 /* We cannot support UIE mode if we do not have an IRQ line */
1659 ds1307->rtc->uie_unsupported = 1;
1660 }
1661
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -07001662 if (want_irq) {
Heiner Kallweit11e58902017-03-10 18:52:34 +01001663 err = devm_request_threaded_irq(ds1307->dev,
Heiner Kallweit340fd7b2017-07-12 07:49:14 +02001664 client->irq, NULL, irq_handler,
Nishanth Menonc5983192015-06-23 11:15:11 -05001665 IRQF_SHARED | IRQF_ONESHOT,
Alexandre Belloni4b9e2a02017-06-02 14:13:21 +02001666 ds1307->name, ds1307);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -07001667 if (err) {
Alessandro Zummo4071ea22014-04-03 14:49:36 -07001668 client->irq = 0;
Heiner Kallweit11e58902017-03-10 18:52:34 +01001669 device_set_wakeup_capable(ds1307->dev, false);
Simon Guinot3abb1ad2015-11-26 15:37:13 +01001670 clear_bit(HAS_ALARM, &ds1307->flags);
Heiner Kallweit11e58902017-03-10 18:52:34 +01001671 dev_err(ds1307->dev, "unable to request IRQ!\n");
Simon Guinot3abb1ad2015-11-26 15:37:13 +01001672 } else
Heiner Kallweit11e58902017-03-10 18:52:34 +01001673 dev_dbg(ds1307->dev, "got IRQ %d\n", client->irq);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -07001674 }
1675
Austin Boyle9eab0a72012-03-23 15:02:38 -07001676 if (chip->nvram_size) {
Alexandre Belloniabc925f2017-07-06 11:42:07 +02001677 ds1307->nvmem_cfg.name = "ds1307_nvram";
1678 ds1307->nvmem_cfg.word_size = 1;
1679 ds1307->nvmem_cfg.stride = 1;
1680 ds1307->nvmem_cfg.size = chip->nvram_size;
1681 ds1307->nvmem_cfg.reg_read = ds1307_nvram_read;
1682 ds1307->nvmem_cfg.reg_write = ds1307_nvram_write;
1683 ds1307->nvmem_cfg.priv = ds1307;
1684 ds1307->nvram_offset = chip->nvram_offset;
Alessandro Zummo4071ea22014-04-03 14:49:36 -07001685
Alexandre Belloniabc925f2017-07-06 11:42:07 +02001686 ds1307->rtc->nvmem_config = &ds1307->nvmem_cfg;
1687 ds1307->rtc->nvram_old_abi = true;
David Brownell682d73f2007-11-14 16:58:32 -08001688 }
1689
Alexandre Belloni69b119a2017-07-06 11:42:06 +02001690 ds1307->rtc->ops = rtc_ops;
1691 err = rtc_register_device(ds1307->rtc);
1692 if (err)
1693 return err;
1694
Akinobu Mita445c0202016-01-25 00:22:16 +09001695 ds1307_hwmon_register(ds1307);
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001696 ds1307_clks_register(ds1307);
Akinobu Mita445c0202016-01-25 00:22:16 +09001697
David Brownell1abb0dc2006-06-25 05:48:17 -07001698 return 0;
1699
Jingoo Hanedca66d2013-07-03 15:07:05 -07001700exit:
David Brownell1abb0dc2006-06-25 05:48:17 -07001701 return err;
1702}
1703
David Brownell1abb0dc2006-06-25 05:48:17 -07001704static struct i2c_driver ds1307_driver = {
1705 .driver = {
David Brownellc065f352007-07-17 04:05:10 -07001706 .name = "rtc-ds1307",
Javier Martinez Canillas7ef6d2c2017-03-03 11:29:15 -03001707 .of_match_table = of_match_ptr(ds1307_of_match),
Tin Huynh9c19b892016-11-30 09:57:31 +07001708 .acpi_match_table = ACPI_PTR(ds1307_acpi_ids),
David Brownell1abb0dc2006-06-25 05:48:17 -07001709 },
David Brownellc065f352007-07-17 04:05:10 -07001710 .probe = ds1307_probe,
Jean Delvare3760f732008-04-29 23:11:40 +02001711 .id_table = ds1307_id,
David Brownell1abb0dc2006-06-25 05:48:17 -07001712};
1713
Axel Lin0abc9202012-03-23 15:02:31 -07001714module_i2c_driver(ds1307_driver);
David Brownell1abb0dc2006-06-25 05:48:17 -07001715
1716MODULE_DESCRIPTION("RTC driver for DS1307 and similar chips");
1717MODULE_LICENSE("GPL");