blob: 712e221d2415f32108938083641f09b41a4e433f [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
David Brownell1abb0dc2006-06-25 05:48:17 -070014#include <linux/bcd.h>
Nishanth Menoneac72372015-06-23 11:15:12 -050015#include <linux/i2c.h>
16#include <linux/init.h>
17#include <linux/module.h>
Wolfram Sangeb86c302012-05-29 15:07:38 -070018#include <linux/rtc/ds1307.h>
Nishanth Menoneac72372015-06-23 11:15:12 -050019#include <linux/rtc.h>
20#include <linux/slab.h>
21#include <linux/string.h>
Akinobu Mita445c0202016-01-25 00:22:16 +090022#include <linux/hwmon.h>
23#include <linux/hwmon-sysfs.h>
Akinobu Mita6c6ff142016-01-31 23:10:10 +090024#include <linux/clk-provider.h>
David Brownell1abb0dc2006-06-25 05:48:17 -070025
David Anders40ce9722012-03-23 15:02:37 -070026/*
27 * We can't determine type by probing, but if we expect pre-Linux code
David Brownell1abb0dc2006-06-25 05:48:17 -070028 * to have set the chip up as a clock (turning on the oscillator and
29 * setting the date and time), Linux can ignore the non-clock features.
30 * That's a natural job for a factory or repair bench.
David Brownell1abb0dc2006-06-25 05:48:17 -070031 */
32enum ds_type {
David Brownell045e0e82007-07-17 04:04:55 -070033 ds_1307,
34 ds_1337,
35 ds_1338,
36 ds_1339,
37 ds_1340,
Joakim Tjernlund33df2ee2009-06-17 16:26:08 -070038 ds_1388,
Wolfram Sang97f902b2009-06-17 16:26:10 -070039 ds_3231,
David Brownell045e0e82007-07-17 04:04:55 -070040 m41t00,
Tomas Novotnyf4199f82014-12-10 15:53:57 -080041 mcp794xx,
Matthias Fuchsa2166852009-03-31 15:24:58 -070042 rx_8025,
Wolfram Sang32d322b2012-03-23 15:02:36 -070043 last_ds_type /* always last */
David Anders40ce9722012-03-23 15:02:37 -070044 /* rs5c372 too? different address... */
David Brownell1abb0dc2006-06-25 05:48:17 -070045};
46
David Brownell1abb0dc2006-06-25 05:48:17 -070047
48/* RTC registers don't differ much, except for the century flag */
49#define DS1307_REG_SECS 0x00 /* 00-59 */
50# define DS1307_BIT_CH 0x80
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -070051# define DS1340_BIT_nEOSC 0x80
Tomas Novotnyf4199f82014-12-10 15:53:57 -080052# define MCP794XX_BIT_ST 0x80
David Brownell1abb0dc2006-06-25 05:48:17 -070053#define DS1307_REG_MIN 0x01 /* 00-59 */
54#define DS1307_REG_HOUR 0x02 /* 00-23, or 1-12{am,pm} */
David Brownellc065f352007-07-17 04:05:10 -070055# define DS1307_BIT_12HR 0x40 /* in REG_HOUR */
56# define DS1307_BIT_PM 0x20 /* in REG_HOUR */
David Brownell1abb0dc2006-06-25 05:48:17 -070057# define DS1340_BIT_CENTURY_EN 0x80 /* in REG_HOUR */
58# define DS1340_BIT_CENTURY 0x40 /* in REG_HOUR */
59#define DS1307_REG_WDAY 0x03 /* 01-07 */
Tomas Novotnyf4199f82014-12-10 15:53:57 -080060# define MCP794XX_BIT_VBATEN 0x08
David Brownell1abb0dc2006-06-25 05:48:17 -070061#define DS1307_REG_MDAY 0x04 /* 01-31 */
62#define DS1307_REG_MONTH 0x05 /* 01-12 */
63# define DS1337_BIT_CENTURY 0x80 /* in REG_MONTH */
64#define DS1307_REG_YEAR 0x06 /* 00-99 */
65
David Anders40ce9722012-03-23 15:02:37 -070066/*
67 * Other registers (control, status, alarms, trickle charge, NVRAM, etc)
David Brownell045e0e82007-07-17 04:04:55 -070068 * start at 7, and they differ a LOT. Only control and status matter for
69 * basic RTC date and time functionality; be careful using them.
David Brownell1abb0dc2006-06-25 05:48:17 -070070 */
David Brownell045e0e82007-07-17 04:04:55 -070071#define DS1307_REG_CONTROL 0x07 /* or ds1338 */
David Brownell1abb0dc2006-06-25 05:48:17 -070072# define DS1307_BIT_OUT 0x80
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -070073# define DS1338_BIT_OSF 0x20
David Brownell1abb0dc2006-06-25 05:48:17 -070074# define DS1307_BIT_SQWE 0x10
75# define DS1307_BIT_RS1 0x02
76# define DS1307_BIT_RS0 0x01
77#define DS1337_REG_CONTROL 0x0e
78# define DS1337_BIT_nEOSC 0x80
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -070079# define DS1339_BIT_BBSQI 0x20
Wolfram Sang97f902b2009-06-17 16:26:10 -070080# define DS3231_BIT_BBSQW 0x40 /* same as BBSQI */
David Brownell1abb0dc2006-06-25 05:48:17 -070081# define DS1337_BIT_RS2 0x10
82# define DS1337_BIT_RS1 0x08
83# define DS1337_BIT_INTCN 0x04
84# define DS1337_BIT_A2IE 0x02
85# define DS1337_BIT_A1IE 0x01
David Brownell045e0e82007-07-17 04:04:55 -070086#define DS1340_REG_CONTROL 0x07
87# define DS1340_BIT_OUT 0x80
88# define DS1340_BIT_FT 0x40
89# define DS1340_BIT_CALIB_SIGN 0x20
90# define DS1340_M_CALIBRATION 0x1f
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -070091#define DS1340_REG_FLAG 0x09
92# define DS1340_BIT_OSF 0x80
David Brownell1abb0dc2006-06-25 05:48:17 -070093#define DS1337_REG_STATUS 0x0f
94# define DS1337_BIT_OSF 0x80
Akinobu Mita6c6ff142016-01-31 23:10:10 +090095# define DS3231_BIT_EN32KHZ 0x08
David Brownell1abb0dc2006-06-25 05:48:17 -070096# define DS1337_BIT_A2I 0x02
97# define DS1337_BIT_A1I 0x01
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -070098#define DS1339_REG_ALARM1_SECS 0x07
Wolfram Sangeb86c302012-05-29 15:07:38 -070099
100#define DS13XX_TRICKLE_CHARGER_MAGIC 0xa0
David Brownell1abb0dc2006-06-25 05:48:17 -0700101
Matthias Fuchsa2166852009-03-31 15:24:58 -0700102#define RX8025_REG_CTRL1 0x0e
103# define RX8025_BIT_2412 0x20
104#define RX8025_REG_CTRL2 0x0f
105# define RX8025_BIT_PON 0x10
106# define RX8025_BIT_VDET 0x40
107# define RX8025_BIT_XST 0x20
David Brownell1abb0dc2006-06-25 05:48:17 -0700108
109
110struct ds1307 {
Joakim Tjernlund33df2ee2009-06-17 16:26:08 -0700111 u8 offset; /* register's offset */
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700112 u8 regs[11];
Austin Boyle9eab0a72012-03-23 15:02:38 -0700113 u16 nvram_offset;
114 struct bin_attribute *nvram;
David Brownell1abb0dc2006-06-25 05:48:17 -0700115 enum ds_type type;
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700116 unsigned long flags;
117#define HAS_NVRAM 0 /* bit 0 == sysfs file active */
118#define HAS_ALARM 1 /* bit 1 == irq claimed */
David Brownell045e0e82007-07-17 04:04:55 -0700119 struct i2c_client *client;
David Brownell1abb0dc2006-06-25 05:48:17 -0700120 struct rtc_device *rtc;
Jean Delvare0cc43a12011-01-10 22:11:23 +0100121 s32 (*read_block_data)(const struct i2c_client *client, u8 command,
Ed Swierk30e7b032009-03-31 15:24:56 -0700122 u8 length, u8 *values);
Jean Delvare0cc43a12011-01-10 22:11:23 +0100123 s32 (*write_block_data)(const struct i2c_client *client, u8 command,
Ed Swierk30e7b032009-03-31 15:24:56 -0700124 u8 length, const u8 *values);
Akinobu Mita6c6ff142016-01-31 23:10:10 +0900125#ifdef CONFIG_COMMON_CLK
126 struct clk_hw clks[2];
127#endif
David Brownell1abb0dc2006-06-25 05:48:17 -0700128};
129
David Brownell045e0e82007-07-17 04:04:55 -0700130struct chip_desc {
David Brownell045e0e82007-07-17 04:04:55 -0700131 unsigned alarm:1;
Austin Boyle9eab0a72012-03-23 15:02:38 -0700132 u16 nvram_offset;
133 u16 nvram_size;
Wolfram Sangeb86c302012-05-29 15:07:38 -0700134 u16 trickle_charger_reg;
Matti Vaittinen33b04b72014-10-13 15:52:48 -0700135 u8 trickle_charger_setup;
136 u8 (*do_trickle_setup)(struct i2c_client *, uint32_t, bool);
David Brownell045e0e82007-07-17 04:04:55 -0700137};
138
Matti Vaittinen33b04b72014-10-13 15:52:48 -0700139static u8 do_trickle_setup_ds1339(struct i2c_client *,
140 uint32_t ohms, bool diode);
141
142static struct chip_desc chips[last_ds_type] = {
Wolfram Sang32d322b2012-03-23 15:02:36 -0700143 [ds_1307] = {
Austin Boyle9eab0a72012-03-23 15:02:38 -0700144 .nvram_offset = 8,
145 .nvram_size = 56,
Wolfram Sang32d322b2012-03-23 15:02:36 -0700146 },
147 [ds_1337] = {
148 .alarm = 1,
149 },
150 [ds_1338] = {
Austin Boyle9eab0a72012-03-23 15:02:38 -0700151 .nvram_offset = 8,
152 .nvram_size = 56,
Wolfram Sang32d322b2012-03-23 15:02:36 -0700153 },
154 [ds_1339] = {
155 .alarm = 1,
Wolfram Sangeb86c302012-05-29 15:07:38 -0700156 .trickle_charger_reg = 0x10,
Matti Vaittinen33b04b72014-10-13 15:52:48 -0700157 .do_trickle_setup = &do_trickle_setup_ds1339,
Wolfram Sangeb86c302012-05-29 15:07:38 -0700158 },
159 [ds_1340] = {
160 .trickle_charger_reg = 0x08,
161 },
162 [ds_1388] = {
163 .trickle_charger_reg = 0x0a,
Wolfram Sang32d322b2012-03-23 15:02:36 -0700164 },
165 [ds_3231] = {
166 .alarm = 1,
167 },
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800168 [mcp794xx] = {
Simon Guinot1d1945d2014-04-03 14:49:55 -0700169 .alarm = 1,
Austin Boyle9eab0a72012-03-23 15:02:38 -0700170 /* this is battery backed SRAM */
171 .nvram_offset = 0x20,
172 .nvram_size = 0x40,
173 },
Wolfram Sang32d322b2012-03-23 15:02:36 -0700174};
David Brownell045e0e82007-07-17 04:04:55 -0700175
Jean Delvare3760f732008-04-29 23:11:40 +0200176static const struct i2c_device_id ds1307_id[] = {
177 { "ds1307", ds_1307 },
178 { "ds1337", ds_1337 },
179 { "ds1338", ds_1338 },
180 { "ds1339", ds_1339 },
Joakim Tjernlund33df2ee2009-06-17 16:26:08 -0700181 { "ds1388", ds_1388 },
Jean Delvare3760f732008-04-29 23:11:40 +0200182 { "ds1340", ds_1340 },
Wolfram Sang97f902b2009-06-17 16:26:10 -0700183 { "ds3231", ds_3231 },
Jean Delvare3760f732008-04-29 23:11:40 +0200184 { "m41t00", m41t00 },
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800185 { "mcp7940x", mcp794xx },
186 { "mcp7941x", mcp794xx },
Priyanka Jain31c17712011-06-27 16:18:04 -0700187 { "pt7c4338", ds_1307 },
Matthias Fuchsa2166852009-03-31 15:24:58 -0700188 { "rx8025", rx_8025 },
Jean Delvare3760f732008-04-29 23:11:40 +0200189 { }
190};
191MODULE_DEVICE_TABLE(i2c, ds1307_id);
David Brownell1abb0dc2006-06-25 05:48:17 -0700192
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700193/*----------------------------------------------------------------------*/
194
Ed Swierk30e7b032009-03-31 15:24:56 -0700195#define BLOCK_DATA_MAX_TRIES 10
196
Jean Delvare0cc43a12011-01-10 22:11:23 +0100197static s32 ds1307_read_block_data_once(const struct i2c_client *client,
198 u8 command, u8 length, u8 *values)
Ed Swierk30e7b032009-03-31 15:24:56 -0700199{
200 s32 i, data;
201
202 for (i = 0; i < length; i++) {
203 data = i2c_smbus_read_byte_data(client, command + i);
204 if (data < 0)
205 return data;
206 values[i] = data;
207 }
208 return i;
209}
210
Jean Delvare0cc43a12011-01-10 22:11:23 +0100211static s32 ds1307_read_block_data(const struct i2c_client *client, u8 command,
Ed Swierk30e7b032009-03-31 15:24:56 -0700212 u8 length, u8 *values)
213{
Bertrand Achardbc48b902013-04-29 16:19:26 -0700214 u8 oldvalues[255];
Ed Swierk30e7b032009-03-31 15:24:56 -0700215 s32 ret;
216 int tries = 0;
217
218 dev_dbg(&client->dev, "ds1307_read_block_data (length=%d)\n", length);
219 ret = ds1307_read_block_data_once(client, command, length, values);
220 if (ret < 0)
221 return ret;
222 do {
223 if (++tries > BLOCK_DATA_MAX_TRIES) {
224 dev_err(&client->dev,
225 "ds1307_read_block_data failed\n");
226 return -EIO;
227 }
228 memcpy(oldvalues, values, length);
229 ret = ds1307_read_block_data_once(client, command, length,
230 values);
231 if (ret < 0)
232 return ret;
233 } while (memcmp(oldvalues, values, length));
234 return length;
235}
236
Jean Delvare0cc43a12011-01-10 22:11:23 +0100237static s32 ds1307_write_block_data(const struct i2c_client *client, u8 command,
Ed Swierk30e7b032009-03-31 15:24:56 -0700238 u8 length, const u8 *values)
239{
Bertrand Achardbc48b902013-04-29 16:19:26 -0700240 u8 currvalues[255];
Ed Swierk30e7b032009-03-31 15:24:56 -0700241 int tries = 0;
242
243 dev_dbg(&client->dev, "ds1307_write_block_data (length=%d)\n", length);
244 do {
245 s32 i, ret;
246
247 if (++tries > BLOCK_DATA_MAX_TRIES) {
248 dev_err(&client->dev,
249 "ds1307_write_block_data failed\n");
250 return -EIO;
251 }
252 for (i = 0; i < length; i++) {
253 ret = i2c_smbus_write_byte_data(client, command + i,
254 values[i]);
255 if (ret < 0)
256 return ret;
257 }
258 ret = ds1307_read_block_data_once(client, command, length,
259 currvalues);
260 if (ret < 0)
261 return ret;
262 } while (memcmp(currvalues, values, length));
263 return length;
264}
265
266/*----------------------------------------------------------------------*/
267
Bertrand Achardbc48b902013-04-29 16:19:26 -0700268/* These RTC devices are not designed to be connected to a SMbus adapter.
269 SMbus limits block operations length to 32 bytes, whereas it's not
270 limited on I2C buses. As a result, accesses may exceed 32 bytes;
271 in that case, split them into smaller blocks */
272
273static s32 ds1307_native_smbus_write_block_data(const struct i2c_client *client,
274 u8 command, u8 length, const u8 *values)
275{
276 u8 suboffset = 0;
277
Nicolas Boullis1d879512016-04-03 00:10:37 +0200278 if (length <= I2C_SMBUS_BLOCK_MAX) {
279 s32 retval = i2c_smbus_write_i2c_block_data(client,
Bertrand Achardbc48b902013-04-29 16:19:26 -0700280 command, length, values);
Nicolas Boullis1d879512016-04-03 00:10:37 +0200281 if (retval < 0)
282 return retval;
283 return length;
284 }
Bertrand Achardbc48b902013-04-29 16:19:26 -0700285
286 while (suboffset < length) {
287 s32 retval = i2c_smbus_write_i2c_block_data(client,
288 command + suboffset,
289 min(I2C_SMBUS_BLOCK_MAX, length - suboffset),
290 values + suboffset);
291 if (retval < 0)
292 return retval;
293
294 suboffset += I2C_SMBUS_BLOCK_MAX;
295 }
296 return length;
297}
298
299static s32 ds1307_native_smbus_read_block_data(const struct i2c_client *client,
300 u8 command, u8 length, u8 *values)
301{
302 u8 suboffset = 0;
303
304 if (length <= I2C_SMBUS_BLOCK_MAX)
305 return i2c_smbus_read_i2c_block_data(client,
306 command, length, values);
307
308 while (suboffset < length) {
309 s32 retval = i2c_smbus_read_i2c_block_data(client,
310 command + suboffset,
311 min(I2C_SMBUS_BLOCK_MAX, length - suboffset),
312 values + suboffset);
313 if (retval < 0)
314 return retval;
315
316 suboffset += I2C_SMBUS_BLOCK_MAX;
317 }
318 return length;
319}
320
321/*----------------------------------------------------------------------*/
322
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700323/*
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700324 * The ds1337 and ds1339 both have two alarms, but we only use the first
325 * one (with a "seconds" field). For ds1337 we expect nINTA is our alarm
326 * signal; ds1339 chips have only one alarm signal.
327 */
Felipe Balbi2fb07a12015-06-23 11:15:10 -0500328static irqreturn_t ds1307_irq(int irq, void *dev_id)
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700329{
Felipe Balbi2fb07a12015-06-23 11:15:10 -0500330 struct i2c_client *client = dev_id;
331 struct ds1307 *ds1307 = i2c_get_clientdata(client);
332 struct mutex *lock = &ds1307->rtc->ops_lock;
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700333 int stat, control;
334
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700335 mutex_lock(lock);
336 stat = i2c_smbus_read_byte_data(client, DS1337_REG_STATUS);
337 if (stat < 0)
338 goto out;
339
340 if (stat & DS1337_BIT_A1I) {
341 stat &= ~DS1337_BIT_A1I;
342 i2c_smbus_write_byte_data(client, DS1337_REG_STATUS, stat);
343
344 control = i2c_smbus_read_byte_data(client, DS1337_REG_CONTROL);
345 if (control < 0)
346 goto out;
347
348 control &= ~DS1337_BIT_A1IE;
349 i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL, control);
350
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700351 rtc_update_irq(ds1307->rtc, 1, RTC_AF | RTC_IRQF);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700352 }
353
354out:
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700355 mutex_unlock(lock);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700356
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700357 return IRQ_HANDLED;
358}
359
360/*----------------------------------------------------------------------*/
361
David Brownell1abb0dc2006-06-25 05:48:17 -0700362static int ds1307_get_time(struct device *dev, struct rtc_time *t)
363{
364 struct ds1307 *ds1307 = dev_get_drvdata(dev);
365 int tmp;
366
David Brownell045e0e82007-07-17 04:04:55 -0700367 /* read the RTC date and time registers all at once */
Ed Swierk30e7b032009-03-31 15:24:56 -0700368 tmp = ds1307->read_block_data(ds1307->client,
Joakim Tjernlund33df2ee2009-06-17 16:26:08 -0700369 ds1307->offset, 7, ds1307->regs);
BARRE Sebastienfed40b72009-01-07 18:07:13 -0800370 if (tmp != 7) {
David Brownell1abb0dc2006-06-25 05:48:17 -0700371 dev_err(dev, "%s error %d\n", "read", tmp);
372 return -EIO;
373 }
374
Andy Shevchenko01a4ca12013-02-21 16:44:22 -0800375 dev_dbg(dev, "%s: %7ph\n", "read", ds1307->regs);
David Brownell1abb0dc2006-06-25 05:48:17 -0700376
Adrian Bunkfe20ba72008-10-18 20:28:41 -0700377 t->tm_sec = bcd2bin(ds1307->regs[DS1307_REG_SECS] & 0x7f);
378 t->tm_min = bcd2bin(ds1307->regs[DS1307_REG_MIN] & 0x7f);
David Brownell1abb0dc2006-06-25 05:48:17 -0700379 tmp = ds1307->regs[DS1307_REG_HOUR] & 0x3f;
Adrian Bunkfe20ba72008-10-18 20:28:41 -0700380 t->tm_hour = bcd2bin(tmp);
381 t->tm_wday = bcd2bin(ds1307->regs[DS1307_REG_WDAY] & 0x07) - 1;
382 t->tm_mday = bcd2bin(ds1307->regs[DS1307_REG_MDAY] & 0x3f);
David Brownell1abb0dc2006-06-25 05:48:17 -0700383 tmp = ds1307->regs[DS1307_REG_MONTH] & 0x1f;
Adrian Bunkfe20ba72008-10-18 20:28:41 -0700384 t->tm_mon = bcd2bin(tmp) - 1;
Adrian Bunkfe20ba72008-10-18 20:28:41 -0700385 t->tm_year = bcd2bin(ds1307->regs[DS1307_REG_YEAR]) + 100;
David Brownell1abb0dc2006-06-25 05:48:17 -0700386
Alexandre Belloni50d6c0e2016-07-13 02:26:08 +0200387#ifdef CONFIG_RTC_DRV_DS1307_CENTURY
388 switch (ds1307->type) {
389 case ds_1337:
390 case ds_1339:
391 case ds_3231:
392 if (ds1307->regs[DS1307_REG_MONTH] & DS1337_BIT_CENTURY)
393 t->tm_year += 100;
394 break;
395 case ds_1340:
396 if (ds1307->regs[DS1307_REG_HOUR] & DS1340_BIT_CENTURY)
397 t->tm_year += 100;
398 break;
399 default:
400 break;
401 }
402#endif
403
David Brownell1abb0dc2006-06-25 05:48:17 -0700404 dev_dbg(dev, "%s secs=%d, mins=%d, "
405 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
406 "read", t->tm_sec, t->tm_min,
407 t->tm_hour, t->tm_mday,
408 t->tm_mon, t->tm_year, t->tm_wday);
409
David Brownell045e0e82007-07-17 04:04:55 -0700410 /* initial clock setting can be undefined */
411 return rtc_valid_tm(t);
David Brownell1abb0dc2006-06-25 05:48:17 -0700412}
413
414static int ds1307_set_time(struct device *dev, struct rtc_time *t)
415{
416 struct ds1307 *ds1307 = dev_get_drvdata(dev);
417 int result;
418 int tmp;
419 u8 *buf = ds1307->regs;
420
421 dev_dbg(dev, "%s secs=%d, mins=%d, "
422 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
Jeff Garzik11966ad2006-10-04 04:41:53 -0400423 "write", t->tm_sec, t->tm_min,
424 t->tm_hour, t->tm_mday,
425 t->tm_mon, t->tm_year, t->tm_wday);
David Brownell1abb0dc2006-06-25 05:48:17 -0700426
Alexandre Belloni50d6c0e2016-07-13 02:26:08 +0200427#ifdef CONFIG_RTC_DRV_DS1307_CENTURY
428 if (t->tm_year < 100)
429 return -EINVAL;
430
431 switch (ds1307->type) {
432 case ds_1337:
433 case ds_1339:
434 case ds_3231:
435 case ds_1340:
436 if (t->tm_year > 299)
437 return -EINVAL;
438 default:
439 if (t->tm_year > 199)
440 return -EINVAL;
441 break;
442 }
443#else
444 if (t->tm_year < 100 || t->tm_year > 199)
445 return -EINVAL;
446#endif
447
Adrian Bunkfe20ba72008-10-18 20:28:41 -0700448 buf[DS1307_REG_SECS] = bin2bcd(t->tm_sec);
449 buf[DS1307_REG_MIN] = bin2bcd(t->tm_min);
450 buf[DS1307_REG_HOUR] = bin2bcd(t->tm_hour);
451 buf[DS1307_REG_WDAY] = bin2bcd(t->tm_wday + 1);
452 buf[DS1307_REG_MDAY] = bin2bcd(t->tm_mday);
453 buf[DS1307_REG_MONTH] = bin2bcd(t->tm_mon + 1);
David Brownell1abb0dc2006-06-25 05:48:17 -0700454
455 /* assume 20YY not 19YY */
456 tmp = t->tm_year - 100;
Adrian Bunkfe20ba72008-10-18 20:28:41 -0700457 buf[DS1307_REG_YEAR] = bin2bcd(tmp);
David Brownell1abb0dc2006-06-25 05:48:17 -0700458
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -0700459 switch (ds1307->type) {
460 case ds_1337:
461 case ds_1339:
Wolfram Sang97f902b2009-06-17 16:26:10 -0700462 case ds_3231:
Alexandre Belloni50d6c0e2016-07-13 02:26:08 +0200463 if (t->tm_year > 199)
464 buf[DS1307_REG_MONTH] |= DS1337_BIT_CENTURY;
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -0700465 break;
466 case ds_1340:
Alexandre Belloni50d6c0e2016-07-13 02:26:08 +0200467 buf[DS1307_REG_HOUR] |= DS1340_BIT_CENTURY_EN;
468 if (t->tm_year > 199)
469 buf[DS1307_REG_HOUR] |= DS1340_BIT_CENTURY;
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -0700470 break;
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800471 case mcp794xx:
David Anders40ce9722012-03-23 15:02:37 -0700472 /*
473 * these bits were cleared when preparing the date/time
474 * values and need to be set again before writing the
475 * buffer out to the device.
476 */
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800477 buf[DS1307_REG_SECS] |= MCP794XX_BIT_ST;
478 buf[DS1307_REG_WDAY] |= MCP794XX_BIT_VBATEN;
David Anders43fcb812011-11-02 13:37:53 -0700479 break;
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -0700480 default:
481 break;
482 }
David Brownell1abb0dc2006-06-25 05:48:17 -0700483
Andy Shevchenko01a4ca12013-02-21 16:44:22 -0800484 dev_dbg(dev, "%s: %7ph\n", "write", buf);
David Brownell1abb0dc2006-06-25 05:48:17 -0700485
Joakim Tjernlund33df2ee2009-06-17 16:26:08 -0700486 result = ds1307->write_block_data(ds1307->client,
487 ds1307->offset, 7, buf);
BARRE Sebastienfed40b72009-01-07 18:07:13 -0800488 if (result < 0) {
489 dev_err(dev, "%s error %d\n", "write", result);
490 return result;
David Brownell1abb0dc2006-06-25 05:48:17 -0700491 }
492 return 0;
493}
494
Jüri Reitel74d88eb2009-01-07 18:07:16 -0800495static int ds1337_read_alarm(struct device *dev, struct rtc_wkalrm *t)
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700496{
497 struct i2c_client *client = to_i2c_client(dev);
498 struct ds1307 *ds1307 = i2c_get_clientdata(client);
499 int ret;
500
501 if (!test_bit(HAS_ALARM, &ds1307->flags))
502 return -EINVAL;
503
504 /* read all ALARM1, ALARM2, and status registers at once */
Ed Swierk30e7b032009-03-31 15:24:56 -0700505 ret = ds1307->read_block_data(client,
BARRE Sebastienfed40b72009-01-07 18:07:13 -0800506 DS1339_REG_ALARM1_SECS, 9, ds1307->regs);
507 if (ret != 9) {
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700508 dev_err(dev, "%s error %d\n", "alarm read", ret);
509 return -EIO;
510 }
511
Rasmus Villemoesff67abd2015-11-24 14:51:23 +0100512 dev_dbg(dev, "%s: %4ph, %3ph, %2ph\n", "alarm read",
513 &ds1307->regs[0], &ds1307->regs[4], &ds1307->regs[7]);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700514
David Anders40ce9722012-03-23 15:02:37 -0700515 /*
516 * report alarm time (ALARM1); assume 24 hour and day-of-month modes,
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700517 * and that all four fields are checked matches
518 */
519 t->time.tm_sec = bcd2bin(ds1307->regs[0] & 0x7f);
520 t->time.tm_min = bcd2bin(ds1307->regs[1] & 0x7f);
521 t->time.tm_hour = bcd2bin(ds1307->regs[2] & 0x3f);
522 t->time.tm_mday = bcd2bin(ds1307->regs[3] & 0x3f);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700523
524 /* ... and status */
525 t->enabled = !!(ds1307->regs[7] & DS1337_BIT_A1IE);
526 t->pending = !!(ds1307->regs[8] & DS1337_BIT_A1I);
527
528 dev_dbg(dev, "%s secs=%d, mins=%d, "
529 "hours=%d, mday=%d, enabled=%d, pending=%d\n",
530 "alarm read", t->time.tm_sec, t->time.tm_min,
531 t->time.tm_hour, t->time.tm_mday,
532 t->enabled, t->pending);
533
534 return 0;
535}
536
Jüri Reitel74d88eb2009-01-07 18:07:16 -0800537static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700538{
David Anders40ce9722012-03-23 15:02:37 -0700539 struct i2c_client *client = to_i2c_client(dev);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700540 struct ds1307 *ds1307 = i2c_get_clientdata(client);
541 unsigned char *buf = ds1307->regs;
542 u8 control, status;
543 int ret;
544
545 if (!test_bit(HAS_ALARM, &ds1307->flags))
546 return -EINVAL;
547
548 dev_dbg(dev, "%s secs=%d, mins=%d, "
549 "hours=%d, mday=%d, enabled=%d, pending=%d\n",
550 "alarm set", t->time.tm_sec, t->time.tm_min,
551 t->time.tm_hour, t->time.tm_mday,
552 t->enabled, t->pending);
553
554 /* read current status of both alarms and the chip */
Ed Swierk30e7b032009-03-31 15:24:56 -0700555 ret = ds1307->read_block_data(client,
BARRE Sebastienfed40b72009-01-07 18:07:13 -0800556 DS1339_REG_ALARM1_SECS, 9, buf);
557 if (ret != 9) {
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700558 dev_err(dev, "%s error %d\n", "alarm write", ret);
559 return -EIO;
560 }
561 control = ds1307->regs[7];
562 status = ds1307->regs[8];
563
Rasmus Villemoesff67abd2015-11-24 14:51:23 +0100564 dev_dbg(dev, "%s: %4ph, %3ph, %02x %02x\n", "alarm set (old status)",
565 &ds1307->regs[0], &ds1307->regs[4], control, status);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700566
567 /* set ALARM1, using 24 hour and day-of-month modes */
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700568 buf[0] = bin2bcd(t->time.tm_sec);
569 buf[1] = bin2bcd(t->time.tm_min);
570 buf[2] = bin2bcd(t->time.tm_hour);
571 buf[3] = bin2bcd(t->time.tm_mday);
572
573 /* set ALARM2 to non-garbage */
574 buf[4] = 0;
575 buf[5] = 0;
576 buf[6] = 0;
577
Nicolas Boullis5919fb92016-04-10 13:23:05 +0200578 /* disable alarms */
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700579 buf[7] = control & ~(DS1337_BIT_A1IE | DS1337_BIT_A2IE);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700580 buf[8] = status & ~(DS1337_BIT_A1I | DS1337_BIT_A2I);
581
Ed Swierk30e7b032009-03-31 15:24:56 -0700582 ret = ds1307->write_block_data(client,
BARRE Sebastienfed40b72009-01-07 18:07:13 -0800583 DS1339_REG_ALARM1_SECS, 9, buf);
584 if (ret < 0) {
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700585 dev_err(dev, "can't set alarm time\n");
BARRE Sebastienfed40b72009-01-07 18:07:13 -0800586 return ret;
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700587 }
588
Nicolas Boullis5919fb92016-04-10 13:23:05 +0200589 /* optionally enable ALARM1 */
590 if (t->enabled) {
591 dev_dbg(dev, "alarm IRQ armed\n");
592 buf[7] |= DS1337_BIT_A1IE; /* only ALARM1 is used */
593 i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL, buf[7]);
594 }
595
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700596 return 0;
597}
598
John Stultz16380c12011-02-02 17:02:41 -0800599static int ds1307_alarm_irq_enable(struct device *dev, unsigned int enabled)
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700600{
601 struct i2c_client *client = to_i2c_client(dev);
602 struct ds1307 *ds1307 = i2c_get_clientdata(client);
603 int ret;
604
John Stultz16380c12011-02-02 17:02:41 -0800605 if (!test_bit(HAS_ALARM, &ds1307->flags))
606 return -ENOTTY;
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700607
John Stultz16380c12011-02-02 17:02:41 -0800608 ret = i2c_smbus_read_byte_data(client, DS1337_REG_CONTROL);
609 if (ret < 0)
610 return ret;
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700611
John Stultz16380c12011-02-02 17:02:41 -0800612 if (enabled)
613 ret |= DS1337_BIT_A1IE;
614 else
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700615 ret &= ~DS1337_BIT_A1IE;
616
John Stultz16380c12011-02-02 17:02:41 -0800617 ret = i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL, ret);
618 if (ret < 0)
619 return ret;
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -0700620
621 return 0;
622}
623
David Brownellff8371a2006-09-30 23:28:17 -0700624static const struct rtc_class_ops ds13xx_rtc_ops = {
David Brownell1abb0dc2006-06-25 05:48:17 -0700625 .read_time = ds1307_get_time,
626 .set_time = ds1307_set_time,
Jüri Reitel74d88eb2009-01-07 18:07:16 -0800627 .read_alarm = ds1337_read_alarm,
628 .set_alarm = ds1337_set_alarm,
John Stultz16380c12011-02-02 17:02:41 -0800629 .alarm_irq_enable = ds1307_alarm_irq_enable,
David Brownell1abb0dc2006-06-25 05:48:17 -0700630};
631
David Brownell682d73f2007-11-14 16:58:32 -0800632/*----------------------------------------------------------------------*/
633
Simon Guinot1d1945d2014-04-03 14:49:55 -0700634/*
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800635 * Alarm support for mcp794xx devices.
Simon Guinot1d1945d2014-04-03 14:49:55 -0700636 */
637
Keerthye29385f2016-06-01 16:19:07 +0530638#define MCP794XX_REG_WEEKDAY 0x3
639#define MCP794XX_REG_WEEKDAY_WDAY_MASK 0x7
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800640#define MCP794XX_REG_CONTROL 0x07
641# define MCP794XX_BIT_ALM0_EN 0x10
642# define MCP794XX_BIT_ALM1_EN 0x20
643#define MCP794XX_REG_ALARM0_BASE 0x0a
644#define MCP794XX_REG_ALARM0_CTRL 0x0d
645#define MCP794XX_REG_ALARM1_BASE 0x11
646#define MCP794XX_REG_ALARM1_CTRL 0x14
647# define MCP794XX_BIT_ALMX_IF (1 << 3)
648# define MCP794XX_BIT_ALMX_C0 (1 << 4)
649# define MCP794XX_BIT_ALMX_C1 (1 << 5)
650# define MCP794XX_BIT_ALMX_C2 (1 << 6)
651# define MCP794XX_BIT_ALMX_POL (1 << 7)
652# define MCP794XX_MSK_ALMX_MATCH (MCP794XX_BIT_ALMX_C0 | \
653 MCP794XX_BIT_ALMX_C1 | \
654 MCP794XX_BIT_ALMX_C2)
Simon Guinot1d1945d2014-04-03 14:49:55 -0700655
Felipe Balbi2fb07a12015-06-23 11:15:10 -0500656static irqreturn_t mcp794xx_irq(int irq, void *dev_id)
Simon Guinot1d1945d2014-04-03 14:49:55 -0700657{
Felipe Balbi2fb07a12015-06-23 11:15:10 -0500658 struct i2c_client *client = dev_id;
659 struct ds1307 *ds1307 = i2c_get_clientdata(client);
660 struct mutex *lock = &ds1307->rtc->ops_lock;
Simon Guinot1d1945d2014-04-03 14:49:55 -0700661 int reg, ret;
662
Felipe Balbi2fb07a12015-06-23 11:15:10 -0500663 mutex_lock(lock);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700664
665 /* Check and clear alarm 0 interrupt flag. */
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800666 reg = i2c_smbus_read_byte_data(client, MCP794XX_REG_ALARM0_CTRL);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700667 if (reg < 0)
668 goto out;
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800669 if (!(reg & MCP794XX_BIT_ALMX_IF))
Simon Guinot1d1945d2014-04-03 14:49:55 -0700670 goto out;
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800671 reg &= ~MCP794XX_BIT_ALMX_IF;
672 ret = i2c_smbus_write_byte_data(client, MCP794XX_REG_ALARM0_CTRL, reg);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700673 if (ret < 0)
674 goto out;
675
676 /* Disable alarm 0. */
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800677 reg = i2c_smbus_read_byte_data(client, MCP794XX_REG_CONTROL);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700678 if (reg < 0)
679 goto out;
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800680 reg &= ~MCP794XX_BIT_ALM0_EN;
681 ret = i2c_smbus_write_byte_data(client, MCP794XX_REG_CONTROL, reg);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700682 if (ret < 0)
683 goto out;
684
685 rtc_update_irq(ds1307->rtc, 1, RTC_AF | RTC_IRQF);
686
687out:
Felipe Balbi2fb07a12015-06-23 11:15:10 -0500688 mutex_unlock(lock);
689
690 return IRQ_HANDLED;
Simon Guinot1d1945d2014-04-03 14:49:55 -0700691}
692
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800693static int mcp794xx_read_alarm(struct device *dev, struct rtc_wkalrm *t)
Simon Guinot1d1945d2014-04-03 14:49:55 -0700694{
695 struct i2c_client *client = to_i2c_client(dev);
696 struct ds1307 *ds1307 = i2c_get_clientdata(client);
697 u8 *regs = ds1307->regs;
698 int ret;
699
700 if (!test_bit(HAS_ALARM, &ds1307->flags))
701 return -EINVAL;
702
703 /* Read control and alarm 0 registers. */
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800704 ret = ds1307->read_block_data(client, MCP794XX_REG_CONTROL, 10, regs);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700705 if (ret < 0)
706 return ret;
707
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800708 t->enabled = !!(regs[0] & MCP794XX_BIT_ALM0_EN);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700709
710 /* Report alarm 0 time assuming 24-hour and day-of-month modes. */
711 t->time.tm_sec = bcd2bin(ds1307->regs[3] & 0x7f);
712 t->time.tm_min = bcd2bin(ds1307->regs[4] & 0x7f);
713 t->time.tm_hour = bcd2bin(ds1307->regs[5] & 0x3f);
714 t->time.tm_wday = bcd2bin(ds1307->regs[6] & 0x7) - 1;
715 t->time.tm_mday = bcd2bin(ds1307->regs[7] & 0x3f);
716 t->time.tm_mon = bcd2bin(ds1307->regs[8] & 0x1f) - 1;
717 t->time.tm_year = -1;
718 t->time.tm_yday = -1;
719 t->time.tm_isdst = -1;
720
721 dev_dbg(dev, "%s, sec=%d min=%d hour=%d wday=%d mday=%d mon=%d "
722 "enabled=%d polarity=%d irq=%d match=%d\n", __func__,
723 t->time.tm_sec, t->time.tm_min, t->time.tm_hour,
724 t->time.tm_wday, t->time.tm_mday, t->time.tm_mon, t->enabled,
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800725 !!(ds1307->regs[6] & MCP794XX_BIT_ALMX_POL),
726 !!(ds1307->regs[6] & MCP794XX_BIT_ALMX_IF),
727 (ds1307->regs[6] & MCP794XX_MSK_ALMX_MATCH) >> 4);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700728
729 return 0;
730}
731
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800732static int mcp794xx_set_alarm(struct device *dev, struct rtc_wkalrm *t)
Simon Guinot1d1945d2014-04-03 14:49:55 -0700733{
734 struct i2c_client *client = to_i2c_client(dev);
735 struct ds1307 *ds1307 = i2c_get_clientdata(client);
736 unsigned char *regs = ds1307->regs;
737 int ret;
738
739 if (!test_bit(HAS_ALARM, &ds1307->flags))
740 return -EINVAL;
741
742 dev_dbg(dev, "%s, sec=%d min=%d hour=%d wday=%d mday=%d mon=%d "
743 "enabled=%d pending=%d\n", __func__,
744 t->time.tm_sec, t->time.tm_min, t->time.tm_hour,
745 t->time.tm_wday, t->time.tm_mday, t->time.tm_mon,
746 t->enabled, t->pending);
747
748 /* Read control and alarm 0 registers. */
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800749 ret = ds1307->read_block_data(client, MCP794XX_REG_CONTROL, 10, regs);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700750 if (ret < 0)
751 return ret;
752
753 /* Set alarm 0, using 24-hour and day-of-month modes. */
754 regs[3] = bin2bcd(t->time.tm_sec);
755 regs[4] = bin2bcd(t->time.tm_min);
756 regs[5] = bin2bcd(t->time.tm_hour);
Tero Kristo62c8c202015-10-23 09:29:57 +0300757 regs[6] = bin2bcd(t->time.tm_wday + 1);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700758 regs[7] = bin2bcd(t->time.tm_mday);
Tero Kristo62c8c202015-10-23 09:29:57 +0300759 regs[8] = bin2bcd(t->time.tm_mon + 1);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700760
761 /* Clear the alarm 0 interrupt flag. */
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800762 regs[6] &= ~MCP794XX_BIT_ALMX_IF;
Simon Guinot1d1945d2014-04-03 14:49:55 -0700763 /* Set alarm match: second, minute, hour, day, date, month. */
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800764 regs[6] |= MCP794XX_MSK_ALMX_MATCH;
Nishanth Menone3edd672015-04-20 19:51:34 -0500765 /* Disable interrupt. We will not enable until completely programmed */
766 regs[0] &= ~MCP794XX_BIT_ALM0_EN;
Simon Guinot1d1945d2014-04-03 14:49:55 -0700767
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800768 ret = ds1307->write_block_data(client, MCP794XX_REG_CONTROL, 10, regs);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700769 if (ret < 0)
770 return ret;
771
Nishanth Menone3edd672015-04-20 19:51:34 -0500772 if (!t->enabled)
773 return 0;
774 regs[0] |= MCP794XX_BIT_ALM0_EN;
775 return i2c_smbus_write_byte_data(client, MCP794XX_REG_CONTROL, regs[0]);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700776}
777
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800778static int mcp794xx_alarm_irq_enable(struct device *dev, unsigned int enabled)
Simon Guinot1d1945d2014-04-03 14:49:55 -0700779{
780 struct i2c_client *client = to_i2c_client(dev);
781 struct ds1307 *ds1307 = i2c_get_clientdata(client);
782 int reg;
783
784 if (!test_bit(HAS_ALARM, &ds1307->flags))
785 return -EINVAL;
786
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800787 reg = i2c_smbus_read_byte_data(client, MCP794XX_REG_CONTROL);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700788 if (reg < 0)
789 return reg;
790
791 if (enabled)
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800792 reg |= MCP794XX_BIT_ALM0_EN;
Simon Guinot1d1945d2014-04-03 14:49:55 -0700793 else
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800794 reg &= ~MCP794XX_BIT_ALM0_EN;
Simon Guinot1d1945d2014-04-03 14:49:55 -0700795
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800796 return i2c_smbus_write_byte_data(client, MCP794XX_REG_CONTROL, reg);
Simon Guinot1d1945d2014-04-03 14:49:55 -0700797}
798
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800799static const struct rtc_class_ops mcp794xx_rtc_ops = {
Simon Guinot1d1945d2014-04-03 14:49:55 -0700800 .read_time = ds1307_get_time,
801 .set_time = ds1307_set_time,
Tomas Novotnyf4199f82014-12-10 15:53:57 -0800802 .read_alarm = mcp794xx_read_alarm,
803 .set_alarm = mcp794xx_set_alarm,
804 .alarm_irq_enable = mcp794xx_alarm_irq_enable,
Simon Guinot1d1945d2014-04-03 14:49:55 -0700805};
806
807/*----------------------------------------------------------------------*/
808
David Brownell682d73f2007-11-14 16:58:32 -0800809static ssize_t
Chris Wright2c3c8be2010-05-12 18:28:57 -0700810ds1307_nvram_read(struct file *filp, struct kobject *kobj,
811 struct bin_attribute *attr,
David Brownell682d73f2007-11-14 16:58:32 -0800812 char *buf, loff_t off, size_t count)
813{
814 struct i2c_client *client;
815 struct ds1307 *ds1307;
David Brownell682d73f2007-11-14 16:58:32 -0800816 int result;
817
frederic Rodofcd8db02008-02-06 01:38:55 -0800818 client = kobj_to_i2c_client(kobj);
David Brownell682d73f2007-11-14 16:58:32 -0800819 ds1307 = i2c_get_clientdata(client);
820
Austin Boyle9eab0a72012-03-23 15:02:38 -0700821 result = ds1307->read_block_data(client, ds1307->nvram_offset + off,
822 count, buf);
BARRE Sebastienfed40b72009-01-07 18:07:13 -0800823 if (result < 0)
David Brownell682d73f2007-11-14 16:58:32 -0800824 dev_err(&client->dev, "%s error %d\n", "nvram read", result);
BARRE Sebastienfed40b72009-01-07 18:07:13 -0800825 return result;
David Brownell682d73f2007-11-14 16:58:32 -0800826}
827
828static ssize_t
Chris Wright2c3c8be2010-05-12 18:28:57 -0700829ds1307_nvram_write(struct file *filp, struct kobject *kobj,
830 struct bin_attribute *attr,
David Brownell682d73f2007-11-14 16:58:32 -0800831 char *buf, loff_t off, size_t count)
832{
833 struct i2c_client *client;
Ed Swierk30e7b032009-03-31 15:24:56 -0700834 struct ds1307 *ds1307;
BARRE Sebastienfed40b72009-01-07 18:07:13 -0800835 int result;
David Brownell682d73f2007-11-14 16:58:32 -0800836
frederic Rodofcd8db02008-02-06 01:38:55 -0800837 client = kobj_to_i2c_client(kobj);
Ed Swierk30e7b032009-03-31 15:24:56 -0700838 ds1307 = i2c_get_clientdata(client);
David Brownell682d73f2007-11-14 16:58:32 -0800839
Austin Boyle9eab0a72012-03-23 15:02:38 -0700840 result = ds1307->write_block_data(client, ds1307->nvram_offset + off,
841 count, buf);
BARRE Sebastienfed40b72009-01-07 18:07:13 -0800842 if (result < 0) {
843 dev_err(&client->dev, "%s error %d\n", "nvram write", result);
844 return result;
845 }
846 return count;
David Brownell682d73f2007-11-14 16:58:32 -0800847}
848
Matti Vaittinen33b04b72014-10-13 15:52:48 -0700849
David Brownell682d73f2007-11-14 16:58:32 -0800850/*----------------------------------------------------------------------*/
851
Matti Vaittinen33b04b72014-10-13 15:52:48 -0700852static u8 do_trickle_setup_ds1339(struct i2c_client *client,
853 uint32_t ohms, bool diode)
854{
855 u8 setup = (diode) ? DS1307_TRICKLE_CHARGER_DIODE :
856 DS1307_TRICKLE_CHARGER_NO_DIODE;
857
858 switch (ohms) {
859 case 250:
860 setup |= DS1307_TRICKLE_CHARGER_250_OHM;
861 break;
862 case 2000:
863 setup |= DS1307_TRICKLE_CHARGER_2K_OHM;
864 break;
865 case 4000:
866 setup |= DS1307_TRICKLE_CHARGER_4K_OHM;
867 break;
868 default:
869 dev_warn(&client->dev,
870 "Unsupported ohm value %u in dt\n", ohms);
871 return 0;
872 }
873 return setup;
874}
875
876static void ds1307_trickle_of_init(struct i2c_client *client,
877 struct chip_desc *chip)
878{
879 uint32_t ohms = 0;
880 bool diode = true;
881
882 if (!chip->do_trickle_setup)
883 goto out;
884 if (of_property_read_u32(client->dev.of_node, "trickle-resistor-ohms" , &ohms))
885 goto out;
886 if (of_property_read_bool(client->dev.of_node, "trickle-diode-disable"))
887 diode = false;
888 chip->trickle_charger_setup = chip->do_trickle_setup(client,
889 ohms, diode);
890out:
891 return;
892}
893
Akinobu Mita445c0202016-01-25 00:22:16 +0900894/*----------------------------------------------------------------------*/
895
896#ifdef CONFIG_RTC_DRV_DS1307_HWMON
897
898/*
899 * Temperature sensor support for ds3231 devices.
900 */
901
902#define DS3231_REG_TEMPERATURE 0x11
903
904/*
905 * A user-initiated temperature conversion is not started by this function,
906 * so the temperature is updated once every 64 seconds.
907 */
Zhuang Yuyao9a3dce62016-04-18 09:21:42 +0900908static int ds3231_hwmon_read_temp(struct device *dev, s32 *mC)
Akinobu Mita445c0202016-01-25 00:22:16 +0900909{
910 struct ds1307 *ds1307 = dev_get_drvdata(dev);
911 u8 temp_buf[2];
912 s16 temp;
913 int ret;
914
915 ret = ds1307->read_block_data(ds1307->client, DS3231_REG_TEMPERATURE,
916 sizeof(temp_buf), temp_buf);
917 if (ret < 0)
918 return ret;
919 if (ret != sizeof(temp_buf))
920 return -EIO;
921
922 /*
923 * Temperature is represented as a 10-bit code with a resolution of
924 * 0.25 degree celsius and encoded in two's complement format.
925 */
926 temp = (temp_buf[0] << 8) | temp_buf[1];
927 temp >>= 6;
928 *mC = temp * 250;
929
930 return 0;
931}
932
933static ssize_t ds3231_hwmon_show_temp(struct device *dev,
934 struct device_attribute *attr, char *buf)
935{
936 int ret;
Zhuang Yuyao9a3dce62016-04-18 09:21:42 +0900937 s32 temp;
Akinobu Mita445c0202016-01-25 00:22:16 +0900938
939 ret = ds3231_hwmon_read_temp(dev, &temp);
940 if (ret)
941 return ret;
942
943 return sprintf(buf, "%d\n", temp);
944}
945static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, ds3231_hwmon_show_temp,
946 NULL, 0);
947
948static struct attribute *ds3231_hwmon_attrs[] = {
949 &sensor_dev_attr_temp1_input.dev_attr.attr,
950 NULL,
951};
952ATTRIBUTE_GROUPS(ds3231_hwmon);
953
954static void ds1307_hwmon_register(struct ds1307 *ds1307)
955{
956 struct device *dev;
957
958 if (ds1307->type != ds_3231)
959 return;
960
961 dev = devm_hwmon_device_register_with_groups(&ds1307->client->dev,
962 ds1307->client->name,
963 ds1307, ds3231_hwmon_groups);
964 if (IS_ERR(dev)) {
965 dev_warn(&ds1307->client->dev,
966 "unable to register hwmon device %ld\n", PTR_ERR(dev));
967 }
968}
969
970#else
971
972static void ds1307_hwmon_register(struct ds1307 *ds1307)
973{
974}
975
Akinobu Mita6c6ff142016-01-31 23:10:10 +0900976#endif /* CONFIG_RTC_DRV_DS1307_HWMON */
977
978/*----------------------------------------------------------------------*/
979
980/*
981 * Square-wave output support for DS3231
982 * Datasheet: https://datasheets.maximintegrated.com/en/ds/DS3231.pdf
983 */
984#ifdef CONFIG_COMMON_CLK
985
986enum {
987 DS3231_CLK_SQW = 0,
988 DS3231_CLK_32KHZ,
989};
990
991#define clk_sqw_to_ds1307(clk) \
992 container_of(clk, struct ds1307, clks[DS3231_CLK_SQW])
993#define clk_32khz_to_ds1307(clk) \
994 container_of(clk, struct ds1307, clks[DS3231_CLK_32KHZ])
995
996static int ds3231_clk_sqw_rates[] = {
997 1,
998 1024,
999 4096,
1000 8192,
1001};
1002
1003static int ds1337_write_control(struct ds1307 *ds1307, u8 mask, u8 value)
1004{
1005 struct i2c_client *client = ds1307->client;
1006 struct mutex *lock = &ds1307->rtc->ops_lock;
1007 int control;
1008 int ret;
1009
1010 mutex_lock(lock);
1011
1012 control = i2c_smbus_read_byte_data(client, DS1337_REG_CONTROL);
1013 if (control < 0) {
1014 ret = control;
1015 goto out;
1016 }
1017
1018 control &= ~mask;
1019 control |= value;
1020
1021 ret = i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL, control);
1022out:
1023 mutex_unlock(lock);
1024
1025 return ret;
1026}
1027
1028static unsigned long ds3231_clk_sqw_recalc_rate(struct clk_hw *hw,
1029 unsigned long parent_rate)
1030{
1031 struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
1032 int control;
1033 int rate_sel = 0;
1034
1035 control = i2c_smbus_read_byte_data(ds1307->client, DS1337_REG_CONTROL);
1036 if (control < 0)
1037 return control;
1038 if (control & DS1337_BIT_RS1)
1039 rate_sel += 1;
1040 if (control & DS1337_BIT_RS2)
1041 rate_sel += 2;
1042
1043 return ds3231_clk_sqw_rates[rate_sel];
1044}
1045
1046static long ds3231_clk_sqw_round_rate(struct clk_hw *hw, unsigned long rate,
1047 unsigned long *prate)
1048{
1049 int i;
1050
1051 for (i = ARRAY_SIZE(ds3231_clk_sqw_rates) - 1; i >= 0; i--) {
1052 if (ds3231_clk_sqw_rates[i] <= rate)
1053 return ds3231_clk_sqw_rates[i];
1054 }
1055
1056 return 0;
1057}
1058
1059static int ds3231_clk_sqw_set_rate(struct clk_hw *hw, unsigned long rate,
1060 unsigned long parent_rate)
1061{
1062 struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
1063 int control = 0;
1064 int rate_sel;
1065
1066 for (rate_sel = 0; rate_sel < ARRAY_SIZE(ds3231_clk_sqw_rates);
1067 rate_sel++) {
1068 if (ds3231_clk_sqw_rates[rate_sel] == rate)
1069 break;
1070 }
1071
1072 if (rate_sel == ARRAY_SIZE(ds3231_clk_sqw_rates))
1073 return -EINVAL;
1074
1075 if (rate_sel & 1)
1076 control |= DS1337_BIT_RS1;
1077 if (rate_sel & 2)
1078 control |= DS1337_BIT_RS2;
1079
1080 return ds1337_write_control(ds1307, DS1337_BIT_RS1 | DS1337_BIT_RS2,
1081 control);
1082}
1083
1084static int ds3231_clk_sqw_prepare(struct clk_hw *hw)
1085{
1086 struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
1087
1088 return ds1337_write_control(ds1307, DS1337_BIT_INTCN, 0);
1089}
1090
1091static void ds3231_clk_sqw_unprepare(struct clk_hw *hw)
1092{
1093 struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
1094
1095 ds1337_write_control(ds1307, DS1337_BIT_INTCN, DS1337_BIT_INTCN);
1096}
1097
1098static int ds3231_clk_sqw_is_prepared(struct clk_hw *hw)
1099{
1100 struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
1101 int control;
1102
1103 control = i2c_smbus_read_byte_data(ds1307->client, DS1337_REG_CONTROL);
1104 if (control < 0)
1105 return control;
1106
1107 return !(control & DS1337_BIT_INTCN);
1108}
1109
1110static const struct clk_ops ds3231_clk_sqw_ops = {
1111 .prepare = ds3231_clk_sqw_prepare,
1112 .unprepare = ds3231_clk_sqw_unprepare,
1113 .is_prepared = ds3231_clk_sqw_is_prepared,
1114 .recalc_rate = ds3231_clk_sqw_recalc_rate,
1115 .round_rate = ds3231_clk_sqw_round_rate,
1116 .set_rate = ds3231_clk_sqw_set_rate,
1117};
1118
1119static unsigned long ds3231_clk_32khz_recalc_rate(struct clk_hw *hw,
1120 unsigned long parent_rate)
1121{
1122 return 32768;
1123}
1124
1125static int ds3231_clk_32khz_control(struct ds1307 *ds1307, bool enable)
1126{
1127 struct i2c_client *client = ds1307->client;
1128 struct mutex *lock = &ds1307->rtc->ops_lock;
1129 int status;
1130 int ret;
1131
1132 mutex_lock(lock);
1133
1134 status = i2c_smbus_read_byte_data(client, DS1337_REG_STATUS);
1135 if (status < 0) {
1136 ret = status;
1137 goto out;
1138 }
1139
1140 if (enable)
1141 status |= DS3231_BIT_EN32KHZ;
1142 else
1143 status &= ~DS3231_BIT_EN32KHZ;
1144
1145 ret = i2c_smbus_write_byte_data(client, DS1337_REG_STATUS, status);
1146out:
1147 mutex_unlock(lock);
1148
1149 return ret;
1150}
1151
1152static int ds3231_clk_32khz_prepare(struct clk_hw *hw)
1153{
1154 struct ds1307 *ds1307 = clk_32khz_to_ds1307(hw);
1155
1156 return ds3231_clk_32khz_control(ds1307, true);
1157}
1158
1159static void ds3231_clk_32khz_unprepare(struct clk_hw *hw)
1160{
1161 struct ds1307 *ds1307 = clk_32khz_to_ds1307(hw);
1162
1163 ds3231_clk_32khz_control(ds1307, false);
1164}
1165
1166static int ds3231_clk_32khz_is_prepared(struct clk_hw *hw)
1167{
1168 struct ds1307 *ds1307 = clk_32khz_to_ds1307(hw);
1169 int status;
1170
1171 status = i2c_smbus_read_byte_data(ds1307->client, DS1337_REG_STATUS);
1172 if (status < 0)
1173 return status;
1174
1175 return !!(status & DS3231_BIT_EN32KHZ);
1176}
1177
1178static const struct clk_ops ds3231_clk_32khz_ops = {
1179 .prepare = ds3231_clk_32khz_prepare,
1180 .unprepare = ds3231_clk_32khz_unprepare,
1181 .is_prepared = ds3231_clk_32khz_is_prepared,
1182 .recalc_rate = ds3231_clk_32khz_recalc_rate,
1183};
1184
1185static struct clk_init_data ds3231_clks_init[] = {
1186 [DS3231_CLK_SQW] = {
1187 .name = "ds3231_clk_sqw",
1188 .ops = &ds3231_clk_sqw_ops,
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001189 },
1190 [DS3231_CLK_32KHZ] = {
1191 .name = "ds3231_clk_32khz",
1192 .ops = &ds3231_clk_32khz_ops,
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001193 },
1194};
1195
1196static int ds3231_clks_register(struct ds1307 *ds1307)
1197{
1198 struct i2c_client *client = ds1307->client;
1199 struct device_node *node = client->dev.of_node;
1200 struct clk_onecell_data *onecell;
1201 int i;
1202
1203 onecell = devm_kzalloc(&client->dev, sizeof(*onecell), GFP_KERNEL);
1204 if (!onecell)
1205 return -ENOMEM;
1206
1207 onecell->clk_num = ARRAY_SIZE(ds3231_clks_init);
1208 onecell->clks = devm_kcalloc(&client->dev, onecell->clk_num,
1209 sizeof(onecell->clks[0]), GFP_KERNEL);
1210 if (!onecell->clks)
1211 return -ENOMEM;
1212
1213 for (i = 0; i < ARRAY_SIZE(ds3231_clks_init); i++) {
1214 struct clk_init_data init = ds3231_clks_init[i];
1215
1216 /*
1217 * Interrupt signal due to alarm conditions and square-wave
1218 * output share same pin, so don't initialize both.
1219 */
1220 if (i == DS3231_CLK_SQW && test_bit(HAS_ALARM, &ds1307->flags))
1221 continue;
1222
1223 /* optional override of the clockname */
1224 of_property_read_string_index(node, "clock-output-names", i,
1225 &init.name);
1226 ds1307->clks[i].init = &init;
1227
1228 onecell->clks[i] = devm_clk_register(&client->dev,
1229 &ds1307->clks[i]);
1230 if (IS_ERR(onecell->clks[i]))
1231 return PTR_ERR(onecell->clks[i]);
1232 }
1233
1234 if (!node)
1235 return 0;
1236
1237 of_clk_add_provider(node, of_clk_src_onecell_get, onecell);
1238
1239 return 0;
1240}
1241
1242static void ds1307_clks_register(struct ds1307 *ds1307)
1243{
1244 int ret;
1245
1246 if (ds1307->type != ds_3231)
1247 return;
1248
1249 ret = ds3231_clks_register(ds1307);
1250 if (ret) {
1251 dev_warn(&ds1307->client->dev,
1252 "unable to register clock device %d\n", ret);
1253 }
1254}
1255
1256#else
1257
1258static void ds1307_clks_register(struct ds1307 *ds1307)
1259{
1260}
1261
1262#endif /* CONFIG_COMMON_CLK */
Akinobu Mita445c0202016-01-25 00:22:16 +09001263
Greg Kroah-Hartman5a167f42012-12-21 13:09:38 -08001264static int ds1307_probe(struct i2c_client *client,
1265 const struct i2c_device_id *id)
David Brownell1abb0dc2006-06-25 05:48:17 -07001266{
1267 struct ds1307 *ds1307;
1268 int err = -ENODEV;
Keerthye29385f2016-06-01 16:19:07 +05301269 int tmp, wday;
Matti Vaittinen33b04b72014-10-13 15:52:48 -07001270 struct chip_desc *chip = &chips[id->driver_data];
David Brownellc065f352007-07-17 04:05:10 -07001271 struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
Peter Senna Tschudinc8b18da2013-11-12 15:10:59 -08001272 bool want_irq = false;
Michael Lange8bc2a402016-01-21 18:10:16 +01001273 bool ds1307_can_wakeup_device = false;
BARRE Sebastienfed40b72009-01-07 18:07:13 -08001274 unsigned char *buf;
Jingoo Han01ce8932013-11-12 15:10:41 -08001275 struct ds1307_platform_data *pdata = dev_get_platdata(&client->dev);
Keerthye29385f2016-06-01 16:19:07 +05301276 struct rtc_time tm;
1277 unsigned long timestamp;
1278
Felipe Balbi2fb07a12015-06-23 11:15:10 -05001279 irq_handler_t irq_handler = ds1307_irq;
1280
Wolfram Sang97f902b2009-06-17 16:26:10 -07001281 static const int bbsqi_bitpos[] = {
1282 [ds_1337] = 0,
1283 [ds_1339] = DS1339_BIT_BBSQI,
1284 [ds_3231] = DS3231_BIT_BBSQW,
1285 };
Simon Guinot1d1945d2014-04-03 14:49:55 -07001286 const struct rtc_class_ops *rtc_ops = &ds13xx_rtc_ops;
David Brownell1abb0dc2006-06-25 05:48:17 -07001287
Ed Swierk30e7b032009-03-31 15:24:56 -07001288 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)
1289 && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_I2C_BLOCK))
David Brownellc065f352007-07-17 04:05:10 -07001290 return -EIO;
David Brownell1abb0dc2006-06-25 05:48:17 -07001291
Jingoo Hanedca66d2013-07-03 15:07:05 -07001292 ds1307 = devm_kzalloc(&client->dev, sizeof(struct ds1307), GFP_KERNEL);
David Anders40ce9722012-03-23 15:02:37 -07001293 if (!ds1307)
David Brownellc065f352007-07-17 04:05:10 -07001294 return -ENOMEM;
David Brownell045e0e82007-07-17 04:04:55 -07001295
David Brownell1abb0dc2006-06-25 05:48:17 -07001296 i2c_set_clientdata(client, ds1307);
Joakim Tjernlund33df2ee2009-06-17 16:26:08 -07001297
1298 ds1307->client = client;
1299 ds1307->type = id->driver_data;
Joakim Tjernlund33df2ee2009-06-17 16:26:08 -07001300
Matti Vaittinen33b04b72014-10-13 15:52:48 -07001301 if (!pdata && client->dev.of_node)
1302 ds1307_trickle_of_init(client, chip);
1303 else if (pdata && pdata->trickle_charger_setup)
1304 chip->trickle_charger_setup = pdata->trickle_charger_setup;
1305
1306 if (chip->trickle_charger_setup && chip->trickle_charger_reg) {
1307 dev_dbg(&client->dev, "writing trickle charger info 0x%x to 0x%x\n",
1308 DS13XX_TRICKLE_CHARGER_MAGIC | chip->trickle_charger_setup,
1309 chip->trickle_charger_reg);
Wolfram Sangeb86c302012-05-29 15:07:38 -07001310 i2c_smbus_write_byte_data(client, chip->trickle_charger_reg,
Matti Vaittinen33b04b72014-10-13 15:52:48 -07001311 DS13XX_TRICKLE_CHARGER_MAGIC |
1312 chip->trickle_charger_setup);
1313 }
Wolfram Sangeb86c302012-05-29 15:07:38 -07001314
BARRE Sebastienfed40b72009-01-07 18:07:13 -08001315 buf = ds1307->regs;
Ed Swierk30e7b032009-03-31 15:24:56 -07001316 if (i2c_check_functionality(adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) {
Bertrand Achardbc48b902013-04-29 16:19:26 -07001317 ds1307->read_block_data = ds1307_native_smbus_read_block_data;
1318 ds1307->write_block_data = ds1307_native_smbus_write_block_data;
Ed Swierk30e7b032009-03-31 15:24:56 -07001319 } else {
1320 ds1307->read_block_data = ds1307_read_block_data;
1321 ds1307->write_block_data = ds1307_write_block_data;
1322 }
David Brownell045e0e82007-07-17 04:04:55 -07001323
Michael Lange8bc2a402016-01-21 18:10:16 +01001324#ifdef CONFIG_OF
1325/*
1326 * For devices with no IRQ directly connected to the SoC, the RTC chip
1327 * can be forced as a wakeup source by stating that explicitly in
1328 * the device's .dts file using the "wakeup-source" boolean property.
1329 * If the "wakeup-source" property is set, don't request an IRQ.
1330 * This will guarantee the 'wakealarm' sysfs entry is available on the device,
1331 * if supported by the RTC.
1332 */
1333 if (of_property_read_bool(client->dev.of_node, "wakeup-source")) {
1334 ds1307_can_wakeup_device = true;
1335 }
1336#endif
1337
David Brownell045e0e82007-07-17 04:04:55 -07001338 switch (ds1307->type) {
1339 case ds_1337:
1340 case ds_1339:
Wolfram Sang97f902b2009-06-17 16:26:10 -07001341 case ds_3231:
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -07001342 /* get registers that the "rtc" read below won't read... */
Ed Swierk30e7b032009-03-31 15:24:56 -07001343 tmp = ds1307->read_block_data(ds1307->client,
BARRE Sebastienfed40b72009-01-07 18:07:13 -08001344 DS1337_REG_CONTROL, 2, buf);
David Brownell1abb0dc2006-06-25 05:48:17 -07001345 if (tmp != 2) {
Jingoo Han6df80e22013-04-29 16:19:28 -07001346 dev_dbg(&client->dev, "read error %d\n", tmp);
David Brownell1abb0dc2006-06-25 05:48:17 -07001347 err = -EIO;
Jingoo Hanedca66d2013-07-03 15:07:05 -07001348 goto exit;
David Brownell1abb0dc2006-06-25 05:48:17 -07001349 }
1350
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -07001351 /* oscillator off? turn it on, so clock can tick. */
1352 if (ds1307->regs[0] & DS1337_BIT_nEOSC)
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -07001353 ds1307->regs[0] &= ~DS1337_BIT_nEOSC;
1354
David Anders40ce9722012-03-23 15:02:37 -07001355 /*
Michael Lange8bc2a402016-01-21 18:10:16 +01001356 * Using IRQ or defined as wakeup-source?
1357 * Disable the square wave and both alarms.
Wolfram Sang97f902b2009-06-17 16:26:10 -07001358 * For some variants, be sure alarms can trigger when we're
1359 * running on Vbackup (BBSQI/BBSQW)
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -07001360 */
Michael Lange8bc2a402016-01-21 18:10:16 +01001361 if (chip->alarm && (ds1307->client->irq > 0 ||
1362 ds1307_can_wakeup_device)) {
Wolfram Sang97f902b2009-06-17 16:26:10 -07001363 ds1307->regs[0] |= DS1337_BIT_INTCN
1364 | bbsqi_bitpos[ds1307->type];
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -07001365 ds1307->regs[0] &= ~(DS1337_BIT_A2IE | DS1337_BIT_A1IE);
Wolfram Sangb24a7262012-03-23 15:02:37 -07001366
1367 want_irq = true;
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -07001368 }
1369
1370 i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL,
1371 ds1307->regs[0]);
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -07001372
1373 /* oscillator fault? clear flag, and warn */
1374 if (ds1307->regs[1] & DS1337_BIT_OSF) {
1375 i2c_smbus_write_byte_data(client, DS1337_REG_STATUS,
1376 ds1307->regs[1] & ~DS1337_BIT_OSF);
1377 dev_warn(&client->dev, "SET TIME!\n");
David Brownell1abb0dc2006-06-25 05:48:17 -07001378 }
David Brownell045e0e82007-07-17 04:04:55 -07001379 break;
Matthias Fuchsa2166852009-03-31 15:24:58 -07001380
1381 case rx_8025:
1382 tmp = i2c_smbus_read_i2c_block_data(ds1307->client,
1383 RX8025_REG_CTRL1 << 4 | 0x08, 2, buf);
1384 if (tmp != 2) {
Jingoo Han6df80e22013-04-29 16:19:28 -07001385 dev_dbg(&client->dev, "read error %d\n", tmp);
Matthias Fuchsa2166852009-03-31 15:24:58 -07001386 err = -EIO;
Jingoo Hanedca66d2013-07-03 15:07:05 -07001387 goto exit;
Matthias Fuchsa2166852009-03-31 15:24:58 -07001388 }
1389
1390 /* oscillator off? turn it on, so clock can tick. */
1391 if (!(ds1307->regs[1] & RX8025_BIT_XST)) {
1392 ds1307->regs[1] |= RX8025_BIT_XST;
1393 i2c_smbus_write_byte_data(client,
1394 RX8025_REG_CTRL2 << 4 | 0x08,
1395 ds1307->regs[1]);
1396 dev_warn(&client->dev,
1397 "oscillator stop detected - SET TIME!\n");
1398 }
1399
1400 if (ds1307->regs[1] & RX8025_BIT_PON) {
1401 ds1307->regs[1] &= ~RX8025_BIT_PON;
1402 i2c_smbus_write_byte_data(client,
1403 RX8025_REG_CTRL2 << 4 | 0x08,
1404 ds1307->regs[1]);
1405 dev_warn(&client->dev, "power-on detected\n");
1406 }
1407
1408 if (ds1307->regs[1] & RX8025_BIT_VDET) {
1409 ds1307->regs[1] &= ~RX8025_BIT_VDET;
1410 i2c_smbus_write_byte_data(client,
1411 RX8025_REG_CTRL2 << 4 | 0x08,
1412 ds1307->regs[1]);
1413 dev_warn(&client->dev, "voltage drop detected\n");
1414 }
1415
1416 /* make sure we are running in 24hour mode */
1417 if (!(ds1307->regs[0] & RX8025_BIT_2412)) {
1418 u8 hour;
1419
1420 /* switch to 24 hour mode */
1421 i2c_smbus_write_byte_data(client,
1422 RX8025_REG_CTRL1 << 4 | 0x08,
1423 ds1307->regs[0] |
1424 RX8025_BIT_2412);
1425
1426 tmp = i2c_smbus_read_i2c_block_data(ds1307->client,
1427 RX8025_REG_CTRL1 << 4 | 0x08, 2, buf);
1428 if (tmp != 2) {
Jingoo Han6df80e22013-04-29 16:19:28 -07001429 dev_dbg(&client->dev, "read error %d\n", tmp);
Matthias Fuchsa2166852009-03-31 15:24:58 -07001430 err = -EIO;
Jingoo Hanedca66d2013-07-03 15:07:05 -07001431 goto exit;
Matthias Fuchsa2166852009-03-31 15:24:58 -07001432 }
1433
1434 /* correct hour */
1435 hour = bcd2bin(ds1307->regs[DS1307_REG_HOUR]);
1436 if (hour == 12)
1437 hour = 0;
1438 if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
1439 hour += 12;
1440
1441 i2c_smbus_write_byte_data(client,
1442 DS1307_REG_HOUR << 4 | 0x08,
1443 hour);
1444 }
1445 break;
Joakim Tjernlund33df2ee2009-06-17 16:26:08 -07001446 case ds_1388:
1447 ds1307->offset = 1; /* Seconds starts at 1 */
1448 break;
Tomas Novotnyf4199f82014-12-10 15:53:57 -08001449 case mcp794xx:
1450 rtc_ops = &mcp794xx_rtc_ops;
Simon Guinot1d1945d2014-04-03 14:49:55 -07001451 if (ds1307->client->irq > 0 && chip->alarm) {
Felipe Balbi2fb07a12015-06-23 11:15:10 -05001452 irq_handler = mcp794xx_irq;
Simon Guinot1d1945d2014-04-03 14:49:55 -07001453 want_irq = true;
1454 }
1455 break;
David Brownell045e0e82007-07-17 04:04:55 -07001456 default:
1457 break;
1458 }
David Brownell1abb0dc2006-06-25 05:48:17 -07001459
1460read_rtc:
1461 /* read RTC registers */
Joakim Tjernlund96fc3a42010-06-29 15:05:34 -07001462 tmp = ds1307->read_block_data(ds1307->client, ds1307->offset, 8, buf);
BARRE Sebastienfed40b72009-01-07 18:07:13 -08001463 if (tmp != 8) {
Jingoo Han6df80e22013-04-29 16:19:28 -07001464 dev_dbg(&client->dev, "read error %d\n", tmp);
David Brownell1abb0dc2006-06-25 05:48:17 -07001465 err = -EIO;
Jingoo Hanedca66d2013-07-03 15:07:05 -07001466 goto exit;
David Brownell1abb0dc2006-06-25 05:48:17 -07001467 }
1468
David Anders40ce9722012-03-23 15:02:37 -07001469 /*
1470 * minimal sanity checking; some chips (like DS1340) don't
David Brownell1abb0dc2006-06-25 05:48:17 -07001471 * specify the extra bits as must-be-zero, but there are
1472 * still a few values that are clearly out-of-range.
1473 */
1474 tmp = ds1307->regs[DS1307_REG_SECS];
David Brownell045e0e82007-07-17 04:04:55 -07001475 switch (ds1307->type) {
1476 case ds_1307:
David Brownell045e0e82007-07-17 04:04:55 -07001477 case m41t00:
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -07001478 /* clock halted? turn it on, so clock can tick. */
David Brownell045e0e82007-07-17 04:04:55 -07001479 if (tmp & DS1307_BIT_CH) {
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -07001480 i2c_smbus_write_byte_data(client, DS1307_REG_SECS, 0);
1481 dev_warn(&client->dev, "SET TIME!\n");
David Brownell045e0e82007-07-17 04:04:55 -07001482 goto read_rtc;
David Brownell1abb0dc2006-06-25 05:48:17 -07001483 }
David Brownell045e0e82007-07-17 04:04:55 -07001484 break;
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -07001485 case ds_1338:
1486 /* clock halted? turn it on, so clock can tick. */
David Brownell045e0e82007-07-17 04:04:55 -07001487 if (tmp & DS1307_BIT_CH)
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -07001488 i2c_smbus_write_byte_data(client, DS1307_REG_SECS, 0);
1489
1490 /* oscillator fault? clear flag, and warn */
1491 if (ds1307->regs[DS1307_REG_CONTROL] & DS1338_BIT_OSF) {
1492 i2c_smbus_write_byte_data(client, DS1307_REG_CONTROL,
David Brownellbd16f9e2007-07-26 10:41:00 -07001493 ds1307->regs[DS1307_REG_CONTROL]
Rodolfo Giomettibe5f59f2007-07-17 04:05:06 -07001494 & ~DS1338_BIT_OSF);
1495 dev_warn(&client->dev, "SET TIME!\n");
1496 goto read_rtc;
1497 }
David Brownell045e0e82007-07-17 04:04:55 -07001498 break;
frederic Rodofcd8db02008-02-06 01:38:55 -08001499 case ds_1340:
1500 /* clock halted? turn it on, so clock can tick. */
1501 if (tmp & DS1340_BIT_nEOSC)
1502 i2c_smbus_write_byte_data(client, DS1307_REG_SECS, 0);
1503
1504 tmp = i2c_smbus_read_byte_data(client, DS1340_REG_FLAG);
1505 if (tmp < 0) {
Jingoo Han6df80e22013-04-29 16:19:28 -07001506 dev_dbg(&client->dev, "read error %d\n", tmp);
frederic Rodofcd8db02008-02-06 01:38:55 -08001507 err = -EIO;
Jingoo Hanedca66d2013-07-03 15:07:05 -07001508 goto exit;
frederic Rodofcd8db02008-02-06 01:38:55 -08001509 }
1510
1511 /* oscillator fault? clear flag, and warn */
1512 if (tmp & DS1340_BIT_OSF) {
1513 i2c_smbus_write_byte_data(client, DS1340_REG_FLAG, 0);
1514 dev_warn(&client->dev, "SET TIME!\n");
1515 }
1516 break;
Tomas Novotnyf4199f82014-12-10 15:53:57 -08001517 case mcp794xx:
David Anders43fcb812011-11-02 13:37:53 -07001518 /* make sure that the backup battery is enabled */
Tomas Novotnyf4199f82014-12-10 15:53:57 -08001519 if (!(ds1307->regs[DS1307_REG_WDAY] & MCP794XX_BIT_VBATEN)) {
David Anders43fcb812011-11-02 13:37:53 -07001520 i2c_smbus_write_byte_data(client, DS1307_REG_WDAY,
1521 ds1307->regs[DS1307_REG_WDAY]
Tomas Novotnyf4199f82014-12-10 15:53:57 -08001522 | MCP794XX_BIT_VBATEN);
David Anders43fcb812011-11-02 13:37:53 -07001523 }
1524
1525 /* clock halted? turn it on, so clock can tick. */
Tomas Novotnyf4199f82014-12-10 15:53:57 -08001526 if (!(tmp & MCP794XX_BIT_ST)) {
David Anders43fcb812011-11-02 13:37:53 -07001527 i2c_smbus_write_byte_data(client, DS1307_REG_SECS,
Tomas Novotnyf4199f82014-12-10 15:53:57 -08001528 MCP794XX_BIT_ST);
David Anders43fcb812011-11-02 13:37:53 -07001529 dev_warn(&client->dev, "SET TIME!\n");
1530 goto read_rtc;
1531 }
1532
1533 break;
Wolfram Sang32d322b2012-03-23 15:02:36 -07001534 default:
David Brownell045e0e82007-07-17 04:04:55 -07001535 break;
David Brownell1abb0dc2006-06-25 05:48:17 -07001536 }
David Brownell045e0e82007-07-17 04:04:55 -07001537
David Brownell1abb0dc2006-06-25 05:48:17 -07001538 tmp = ds1307->regs[DS1307_REG_HOUR];
David Brownellc065f352007-07-17 04:05:10 -07001539 switch (ds1307->type) {
1540 case ds_1340:
1541 case m41t00:
David Anders40ce9722012-03-23 15:02:37 -07001542 /*
1543 * NOTE: ignores century bits; fix before deploying
David Brownellc065f352007-07-17 04:05:10 -07001544 * systems that will run through year 2100.
1545 */
1546 break;
Matthias Fuchsa2166852009-03-31 15:24:58 -07001547 case rx_8025:
1548 break;
David Brownellc065f352007-07-17 04:05:10 -07001549 default:
1550 if (!(tmp & DS1307_BIT_12HR))
1551 break;
1552
David Anders40ce9722012-03-23 15:02:37 -07001553 /*
1554 * Be sure we're in 24 hour mode. Multi-master systems
David Brownellc065f352007-07-17 04:05:10 -07001555 * take note...
1556 */
Adrian Bunkfe20ba72008-10-18 20:28:41 -07001557 tmp = bcd2bin(tmp & 0x1f);
David Brownellc065f352007-07-17 04:05:10 -07001558 if (tmp == 12)
1559 tmp = 0;
1560 if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
1561 tmp += 12;
David Brownell1abb0dc2006-06-25 05:48:17 -07001562 i2c_smbus_write_byte_data(client,
Joakim Tjernlund96fc3a42010-06-29 15:05:34 -07001563 ds1307->offset + DS1307_REG_HOUR,
Adrian Bunkfe20ba72008-10-18 20:28:41 -07001564 bin2bcd(tmp));
David Brownell1abb0dc2006-06-25 05:48:17 -07001565 }
1566
Keerthye29385f2016-06-01 16:19:07 +05301567 /*
1568 * Some IPs have weekday reset value = 0x1 which might not correct
1569 * hence compute the wday using the current date/month/year values
1570 */
1571 ds1307_get_time(&client->dev, &tm);
1572 wday = tm.tm_wday;
1573 timestamp = rtc_tm_to_time64(&tm);
1574 rtc_time64_to_tm(timestamp, &tm);
1575
1576 /*
1577 * Check if reset wday is different from the computed wday
1578 * If different then set the wday which we computed using
1579 * timestamp
1580 */
1581 if (wday != tm.tm_wday) {
1582 wday = i2c_smbus_read_byte_data(client, MCP794XX_REG_WEEKDAY);
1583 wday = wday & ~MCP794XX_REG_WEEKDAY_WDAY_MASK;
1584 wday = wday | (tm.tm_wday + 1);
1585 i2c_smbus_write_byte_data(client, MCP794XX_REG_WEEKDAY, wday);
1586 }
1587
Simon Guinot3abb1ad2015-11-26 15:37:13 +01001588 if (want_irq) {
1589 device_set_wakeup_capable(&client->dev, true);
1590 set_bit(HAS_ALARM, &ds1307->flags);
1591 }
Jingoo Hanedca66d2013-07-03 15:07:05 -07001592 ds1307->rtc = devm_rtc_device_register(&client->dev, client->name,
Simon Guinot1d1945d2014-04-03 14:49:55 -07001593 rtc_ops, THIS_MODULE);
David Brownell1abb0dc2006-06-25 05:48:17 -07001594 if (IS_ERR(ds1307->rtc)) {
Alessandro Zummo4071ea22014-04-03 14:49:36 -07001595 return PTR_ERR(ds1307->rtc);
David Brownell1abb0dc2006-06-25 05:48:17 -07001596 }
1597
Nishanth Menon38a7a732016-04-19 11:23:54 -05001598 if (ds1307_can_wakeup_device && ds1307->client->irq <= 0) {
Michael Lange8bc2a402016-01-21 18:10:16 +01001599 /* Disable request for an IRQ */
1600 want_irq = false;
1601 dev_info(&client->dev, "'wakeup-source' is set, request for an IRQ is disabled!\n");
1602 /* We cannot support UIE mode if we do not have an IRQ line */
1603 ds1307->rtc->uie_unsupported = 1;
1604 }
1605
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -07001606 if (want_irq) {
Nishanth Menonc5983192015-06-23 11:15:11 -05001607 err = devm_request_threaded_irq(&client->dev,
1608 client->irq, NULL, irq_handler,
1609 IRQF_SHARED | IRQF_ONESHOT,
1610 ds1307->rtc->name, client);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -07001611 if (err) {
Alessandro Zummo4071ea22014-04-03 14:49:36 -07001612 client->irq = 0;
Simon Guinot3abb1ad2015-11-26 15:37:13 +01001613 device_set_wakeup_capable(&client->dev, false);
1614 clear_bit(HAS_ALARM, &ds1307->flags);
Alessandro Zummo4071ea22014-04-03 14:49:36 -07001615 dev_err(&client->dev, "unable to request IRQ!\n");
Simon Guinot3abb1ad2015-11-26 15:37:13 +01001616 } else
Felipe Balbi51c4cfe2015-11-11 10:11:01 -06001617 dev_dbg(&client->dev, "got IRQ %d\n", client->irq);
Rodolfo Giometticb49a5e2008-10-15 22:02:58 -07001618 }
1619
Austin Boyle9eab0a72012-03-23 15:02:38 -07001620 if (chip->nvram_size) {
Alessandro Zummo4071ea22014-04-03 14:49:36 -07001621
Jingoo Hanedca66d2013-07-03 15:07:05 -07001622 ds1307->nvram = devm_kzalloc(&client->dev,
1623 sizeof(struct bin_attribute),
1624 GFP_KERNEL);
Austin Boyle9eab0a72012-03-23 15:02:38 -07001625 if (!ds1307->nvram) {
Alessandro Zummo4071ea22014-04-03 14:49:36 -07001626 dev_err(&client->dev, "cannot allocate memory for nvram sysfs\n");
1627 } else {
1628
1629 ds1307->nvram->attr.name = "nvram";
1630 ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR;
1631
1632 sysfs_bin_attr_init(ds1307->nvram);
1633
1634 ds1307->nvram->read = ds1307_nvram_read;
1635 ds1307->nvram->write = ds1307_nvram_write;
1636 ds1307->nvram->size = chip->nvram_size;
1637 ds1307->nvram_offset = chip->nvram_offset;
1638
1639 err = sysfs_create_bin_file(&client->dev.kobj,
1640 ds1307->nvram);
1641 if (err) {
1642 dev_err(&client->dev,
1643 "unable to create sysfs file: %s\n",
1644 ds1307->nvram->attr.name);
1645 } else {
1646 set_bit(HAS_NVRAM, &ds1307->flags);
1647 dev_info(&client->dev, "%zu bytes nvram\n",
1648 ds1307->nvram->size);
1649 }
David Brownell682d73f2007-11-14 16:58:32 -08001650 }
1651 }
1652
Akinobu Mita445c0202016-01-25 00:22:16 +09001653 ds1307_hwmon_register(ds1307);
Akinobu Mita6c6ff142016-01-31 23:10:10 +09001654 ds1307_clks_register(ds1307);
Akinobu Mita445c0202016-01-25 00:22:16 +09001655
David Brownell1abb0dc2006-06-25 05:48:17 -07001656 return 0;
1657
Jingoo Hanedca66d2013-07-03 15:07:05 -07001658exit:
David Brownell1abb0dc2006-06-25 05:48:17 -07001659 return err;
1660}
1661
Greg Kroah-Hartman5a167f42012-12-21 13:09:38 -08001662static int ds1307_remove(struct i2c_client *client)
David Brownell1abb0dc2006-06-25 05:48:17 -07001663{
David Anders40ce9722012-03-23 15:02:37 -07001664 struct ds1307 *ds1307 = i2c_get_clientdata(client);
David Brownell1abb0dc2006-06-25 05:48:17 -07001665
Jingoo Hanedca66d2013-07-03 15:07:05 -07001666 if (test_and_clear_bit(HAS_NVRAM, &ds1307->flags))
Austin Boyle9eab0a72012-03-23 15:02:38 -07001667 sysfs_remove_bin_file(&client->dev.kobj, ds1307->nvram);
David Brownell682d73f2007-11-14 16:58:32 -08001668
David Brownell1abb0dc2006-06-25 05:48:17 -07001669 return 0;
1670}
1671
1672static struct i2c_driver ds1307_driver = {
1673 .driver = {
David Brownellc065f352007-07-17 04:05:10 -07001674 .name = "rtc-ds1307",
David Brownell1abb0dc2006-06-25 05:48:17 -07001675 },
David Brownellc065f352007-07-17 04:05:10 -07001676 .probe = ds1307_probe,
Greg Kroah-Hartman5a167f42012-12-21 13:09:38 -08001677 .remove = ds1307_remove,
Jean Delvare3760f732008-04-29 23:11:40 +02001678 .id_table = ds1307_id,
David Brownell1abb0dc2006-06-25 05:48:17 -07001679};
1680
Axel Lin0abc9202012-03-23 15:02:31 -07001681module_i2c_driver(ds1307_driver);
David Brownell1abb0dc2006-06-25 05:48:17 -07001682
1683MODULE_DESCRIPTION("RTC driver for DS1307 and similar chips");
1684MODULE_LICENSE("GPL");