1 // SPDX-License-Identifier: GPL-2.0-only
4 * Driver for Dallas Semiconductor DS1343 Low Current, SPI Compatible
7 * Author : Raghavendra Chandra Ganiga <ravi23ganiga@gmail.com>
8 * Ankur Srivastava <sankurece@gmail.com> : DS1343 Nvram Support
11 #include <linux/init.h>
12 #include <linux/module.h>
13 #include <linux/interrupt.h>
14 #include <linux/device.h>
15 #include <linux/spi/spi.h>
16 #include <linux/regmap.h>
17 #include <linux/rtc.h>
18 #include <linux/bcd.h>
20 #include <linux/pm_wakeirq.h>
21 #include <linux/slab.h>
23 #define DALLAS_MAXIM_DS1343 0
24 #define DALLAS_MAXIM_DS1344 1
26 /* RTC DS1343 Registers */
27 #define DS1343_SECONDS_REG 0x00
28 #define DS1343_MINUTES_REG 0x01
29 #define DS1343_HOURS_REG 0x02
30 #define DS1343_DAY_REG 0x03
31 #define DS1343_DATE_REG 0x04
32 #define DS1343_MONTH_REG 0x05
33 #define DS1343_YEAR_REG 0x06
34 #define DS1343_ALM0_SEC_REG 0x07
35 #define DS1343_ALM0_MIN_REG 0x08
36 #define DS1343_ALM0_HOUR_REG 0x09
37 #define DS1343_ALM0_DAY_REG 0x0A
38 #define DS1343_ALM1_SEC_REG 0x0B
39 #define DS1343_ALM1_MIN_REG 0x0C
40 #define DS1343_ALM1_HOUR_REG 0x0D
41 #define DS1343_ALM1_DAY_REG 0x0E
42 #define DS1343_CONTROL_REG 0x0F
43 #define DS1343_STATUS_REG 0x10
44 #define DS1343_TRICKLE_REG 0x11
45 #define DS1343_NVRAM 0x20
47 #define DS1343_NVRAM_LEN 96
49 /* DS1343 Control Registers bits */
50 #define DS1343_EOSC 0x80
51 #define DS1343_DOSF 0x20
52 #define DS1343_EGFIL 0x10
53 #define DS1343_SQW 0x08
54 #define DS1343_INTCN 0x04
55 #define DS1343_A1IE 0x02
56 #define DS1343_A0IE 0x01
58 /* DS1343 Status Registers bits */
59 #define DS1343_OSF 0x80
60 #define DS1343_IRQF1 0x02
61 #define DS1343_IRQF0 0x01
63 /* DS1343 Trickle Charger Registers bits */
64 #define DS1343_TRICKLE_MAGIC 0xa0
65 #define DS1343_TRICKLE_DS1 0x08
66 #define DS1343_TRICKLE_1K 0x01
67 #define DS1343_TRICKLE_2K 0x02
68 #define DS1343_TRICKLE_4K 0x03
70 static const struct spi_device_id ds1343_id
[] = {
71 { "ds1343", DALLAS_MAXIM_DS1343
},
72 { "ds1344", DALLAS_MAXIM_DS1344
},
75 MODULE_DEVICE_TABLE(spi
, ds1343_id
);
78 struct spi_device
*spi
;
79 struct rtc_device
*rtc
;
84 static ssize_t
ds1343_show_glitchfilter(struct device
*dev
,
85 struct device_attribute
*attr
, char *buf
)
87 struct ds1343_priv
*priv
= dev_get_drvdata(dev
->parent
);
88 int glitch_filt_status
, data
;
91 res
= regmap_read(priv
->map
, DS1343_CONTROL_REG
, &data
);
95 glitch_filt_status
= !!(data
& DS1343_EGFIL
);
97 if (glitch_filt_status
)
98 return sprintf(buf
, "enabled\n");
100 return sprintf(buf
, "disabled\n");
103 static ssize_t
ds1343_store_glitchfilter(struct device
*dev
,
104 struct device_attribute
*attr
,
105 const char *buf
, size_t count
)
107 struct ds1343_priv
*priv
= dev_get_drvdata(dev
->parent
);
111 if (strncmp(buf
, "enabled", 7) == 0)
113 else if (strncmp(buf
, "disabled", 8))
116 res
= regmap_update_bits(priv
->map
, DS1343_CONTROL_REG
,
124 static DEVICE_ATTR(glitch_filter
, S_IRUGO
| S_IWUSR
, ds1343_show_glitchfilter
,
125 ds1343_store_glitchfilter
);
127 static int ds1343_nvram_write(void *priv
, unsigned int off
, void *val
,
130 struct ds1343_priv
*ds1343
= priv
;
132 return regmap_bulk_write(ds1343
->map
, DS1343_NVRAM
+ off
, val
, bytes
);
135 static int ds1343_nvram_read(void *priv
, unsigned int off
, void *val
,
138 struct ds1343_priv
*ds1343
= priv
;
140 return regmap_bulk_read(ds1343
->map
, DS1343_NVRAM
+ off
, val
, bytes
);
143 static ssize_t
ds1343_show_tricklecharger(struct device
*dev
,
144 struct device_attribute
*attr
, char *buf
)
146 struct ds1343_priv
*priv
= dev_get_drvdata(dev
->parent
);
148 char *diodes
= "disabled", *resistors
= " ";
150 res
= regmap_read(priv
->map
, DS1343_TRICKLE_REG
, &data
);
154 if ((data
& 0xf0) == DS1343_TRICKLE_MAGIC
) {
155 switch (data
& 0x0c) {
156 case DS1343_TRICKLE_DS1
:
157 diodes
= "one diode,";
161 diodes
= "no diode,";
165 switch (data
& 0x03) {
166 case DS1343_TRICKLE_1K
:
167 resistors
= "1k Ohm";
170 case DS1343_TRICKLE_2K
:
171 resistors
= "2k Ohm";
174 case DS1343_TRICKLE_4K
:
175 resistors
= "4k Ohm";
184 return sprintf(buf
, "%s %s\n", diodes
, resistors
);
187 static DEVICE_ATTR(trickle_charger
, S_IRUGO
, ds1343_show_tricklecharger
, NULL
);
189 static struct attribute
*ds1343_attrs
[] = {
190 &dev_attr_glitch_filter
.attr
,
191 &dev_attr_trickle_charger
.attr
,
195 static const struct attribute_group ds1343_attr_group
= {
196 .attrs
= ds1343_attrs
,
199 static int ds1343_read_time(struct device
*dev
, struct rtc_time
*dt
)
201 struct ds1343_priv
*priv
= dev_get_drvdata(dev
);
202 unsigned char buf
[7];
205 res
= regmap_bulk_read(priv
->map
, DS1343_SECONDS_REG
, buf
, 7);
209 dt
->tm_sec
= bcd2bin(buf
[0]);
210 dt
->tm_min
= bcd2bin(buf
[1]);
211 dt
->tm_hour
= bcd2bin(buf
[2] & 0x3F);
212 dt
->tm_wday
= bcd2bin(buf
[3]) - 1;
213 dt
->tm_mday
= bcd2bin(buf
[4]);
214 dt
->tm_mon
= bcd2bin(buf
[5] & 0x1F) - 1;
215 dt
->tm_year
= bcd2bin(buf
[6]) + 100; /* year offset from 1900 */
220 static int ds1343_set_time(struct device
*dev
, struct rtc_time
*dt
)
222 struct ds1343_priv
*priv
= dev_get_drvdata(dev
);
225 buf
[0] = bin2bcd(dt
->tm_sec
);
226 buf
[1] = bin2bcd(dt
->tm_min
);
227 buf
[2] = bin2bcd(dt
->tm_hour
) & 0x3F;
228 buf
[3] = bin2bcd(dt
->tm_wday
+ 1);
229 buf
[4] = bin2bcd(dt
->tm_mday
);
230 buf
[5] = bin2bcd(dt
->tm_mon
+ 1);
231 buf
[6] = bin2bcd(dt
->tm_year
- 100);
233 return regmap_bulk_write(priv
->map
, DS1343_SECONDS_REG
,
237 static int ds1343_read_alarm(struct device
*dev
, struct rtc_wkalrm
*alarm
)
239 struct ds1343_priv
*priv
= dev_get_drvdata(dev
);
240 unsigned char buf
[4];
247 res
= regmap_read(priv
->map
, DS1343_STATUS_REG
, &val
);
251 alarm
->pending
= !!(val
& DS1343_IRQF0
);
253 res
= regmap_read(priv
->map
, DS1343_CONTROL_REG
, &val
);
256 alarm
->enabled
= !!(val
& DS1343_A0IE
);
258 res
= regmap_bulk_read(priv
->map
, DS1343_ALM0_SEC_REG
, buf
, 4);
262 alarm
->time
.tm_sec
= bcd2bin(buf
[0]) & 0x7f;
263 alarm
->time
.tm_min
= bcd2bin(buf
[1]) & 0x7f;
264 alarm
->time
.tm_hour
= bcd2bin(buf
[2]) & 0x3f;
265 alarm
->time
.tm_mday
= bcd2bin(buf
[3]) & 0x3f;
270 static int ds1343_set_alarm(struct device
*dev
, struct rtc_wkalrm
*alarm
)
272 struct ds1343_priv
*priv
= dev_get_drvdata(dev
);
273 unsigned char buf
[4];
279 res
= regmap_update_bits(priv
->map
, DS1343_CONTROL_REG
, DS1343_A0IE
, 0);
283 buf
[0] = bin2bcd(alarm
->time
.tm_sec
);
284 buf
[1] = bin2bcd(alarm
->time
.tm_min
);
285 buf
[2] = bin2bcd(alarm
->time
.tm_hour
);
286 buf
[3] = bin2bcd(alarm
->time
.tm_mday
);
288 res
= regmap_bulk_write(priv
->map
, DS1343_ALM0_SEC_REG
, buf
, 4);
293 res
= regmap_update_bits(priv
->map
, DS1343_CONTROL_REG
,
294 DS1343_A0IE
, DS1343_A0IE
);
299 static int ds1343_alarm_irq_enable(struct device
*dev
, unsigned int enabled
)
301 struct ds1343_priv
*priv
= dev_get_drvdata(dev
);
306 return regmap_update_bits(priv
->map
, DS1343_CONTROL_REG
,
307 DS1343_A0IE
, enabled
? DS1343_A0IE
: 0);
310 static irqreturn_t
ds1343_thread(int irq
, void *dev_id
)
312 struct ds1343_priv
*priv
= dev_id
;
318 res
= regmap_read(priv
->map
, DS1343_STATUS_REG
, &stat
);
322 if (stat
& DS1343_IRQF0
) {
323 stat
&= ~DS1343_IRQF0
;
324 regmap_write(priv
->map
, DS1343_STATUS_REG
, stat
);
326 rtc_update_irq(priv
->rtc
, 1, RTC_AF
| RTC_IRQF
);
328 regmap_update_bits(priv
->map
, DS1343_CONTROL_REG
,
333 rtc_unlock(priv
->rtc
);
337 static const struct rtc_class_ops ds1343_rtc_ops
= {
338 .read_time
= ds1343_read_time
,
339 .set_time
= ds1343_set_time
,
340 .read_alarm
= ds1343_read_alarm
,
341 .set_alarm
= ds1343_set_alarm
,
342 .alarm_irq_enable
= ds1343_alarm_irq_enable
,
345 static int ds1343_probe(struct spi_device
*spi
)
347 struct ds1343_priv
*priv
;
348 struct regmap_config config
= { .reg_bits
= 8, .val_bits
= 8,
349 .write_flag_mask
= 0x80, };
352 struct nvmem_config nvmem_cfg
= {
356 .size
= DS1343_NVRAM_LEN
,
357 .reg_read
= ds1343_nvram_read
,
358 .reg_write
= ds1343_nvram_write
,
361 priv
= devm_kzalloc(&spi
->dev
, sizeof(struct ds1343_priv
), GFP_KERNEL
);
367 /* RTC DS1347 works in spi mode 3 and
368 * its chip select is active high
370 spi
->mode
= SPI_MODE_3
| SPI_CS_HIGH
;
371 spi
->bits_per_word
= 8;
372 res
= spi_setup(spi
);
376 spi_set_drvdata(spi
, priv
);
378 priv
->map
= devm_regmap_init_spi(spi
, &config
);
380 if (IS_ERR(priv
->map
)) {
381 dev_err(&spi
->dev
, "spi regmap init failed for rtc ds1343\n");
382 return PTR_ERR(priv
->map
);
385 res
= regmap_read(priv
->map
, DS1343_SECONDS_REG
, &data
);
389 regmap_read(priv
->map
, DS1343_CONTROL_REG
, &data
);
390 data
|= DS1343_INTCN
;
391 data
&= ~(DS1343_EOSC
| DS1343_A1IE
| DS1343_A0IE
);
392 regmap_write(priv
->map
, DS1343_CONTROL_REG
, data
);
394 regmap_read(priv
->map
, DS1343_STATUS_REG
, &data
);
395 data
&= ~(DS1343_OSF
| DS1343_IRQF1
| DS1343_IRQF0
);
396 regmap_write(priv
->map
, DS1343_STATUS_REG
, data
);
398 priv
->rtc
= devm_rtc_allocate_device(&spi
->dev
);
399 if (IS_ERR(priv
->rtc
))
400 return PTR_ERR(priv
->rtc
);
402 priv
->rtc
->nvram_old_abi
= true;
403 priv
->rtc
->ops
= &ds1343_rtc_ops
;
404 priv
->rtc
->range_min
= RTC_TIMESTAMP_BEGIN_2000
;
405 priv
->rtc
->range_max
= RTC_TIMESTAMP_END_2099
;
407 res
= rtc_add_group(priv
->rtc
, &ds1343_attr_group
);
410 "unable to create sysfs entries for rtc ds1343\n");
412 res
= rtc_register_device(priv
->rtc
);
416 nvmem_cfg
.priv
= priv
;
417 rtc_nvmem_register(priv
->rtc
, &nvmem_cfg
);
419 priv
->irq
= spi
->irq
;
421 if (priv
->irq
>= 0) {
422 res
= devm_request_threaded_irq(&spi
->dev
, spi
->irq
, NULL
,
423 ds1343_thread
, IRQF_ONESHOT
,
428 "unable to request irq for rtc ds1343\n");
430 device_init_wakeup(&spi
->dev
, true);
431 dev_pm_set_wake_irq(&spi
->dev
, spi
->irq
);
438 static int ds1343_remove(struct spi_device
*spi
)
440 dev_pm_clear_wake_irq(&spi
->dev
);
445 #ifdef CONFIG_PM_SLEEP
447 static int ds1343_suspend(struct device
*dev
)
449 struct spi_device
*spi
= to_spi_device(dev
);
451 if (spi
->irq
>= 0 && device_may_wakeup(dev
))
452 enable_irq_wake(spi
->irq
);
457 static int ds1343_resume(struct device
*dev
)
459 struct spi_device
*spi
= to_spi_device(dev
);
461 if (spi
->irq
>= 0 && device_may_wakeup(dev
))
462 disable_irq_wake(spi
->irq
);
469 static SIMPLE_DEV_PM_OPS(ds1343_pm
, ds1343_suspend
, ds1343_resume
);
471 static struct spi_driver ds1343_driver
= {
476 .probe
= ds1343_probe
,
477 .remove
= ds1343_remove
,
478 .id_table
= ds1343_id
,
481 module_spi_driver(ds1343_driver
);
483 MODULE_DESCRIPTION("DS1343 RTC SPI Driver");
484 MODULE_AUTHOR("Raghavendra Chandra Ganiga <ravi23ganiga@gmail.com>,"
485 "Ankur Srivastava <sankurece@gmail.com>");
486 MODULE_LICENSE("GPL v2");