1 // SPDX-License-Identifier: GPL-2.0-only
4 * Driver for Dallas Semiconductor DS1347 Low Current, SPI Compatible
7 * Author : Raghavendra Chandra Ganiga <ravi23ganiga@gmail.com>
10 #include <linux/init.h>
11 #include <linux/module.h>
12 #include <linux/device.h>
13 #include <linux/platform_device.h>
14 #include <linux/rtc.h>
15 #include <linux/spi/spi.h>
16 #include <linux/bcd.h>
17 #include <linux/regmap.h>
19 /* Registers in ds1347 rtc */
21 #define DS1347_SECONDS_REG 0x01
22 #define DS1347_MINUTES_REG 0x03
23 #define DS1347_HOURS_REG 0x05
24 #define DS1347_DATE_REG 0x07
25 #define DS1347_MONTH_REG 0x09
26 #define DS1347_DAY_REG 0x0B
27 #define DS1347_YEAR_REG 0x0D
28 #define DS1347_CONTROL_REG 0x0F
29 #define DS1347_CENTURY_REG 0x13
30 #define DS1347_STATUS_REG 0x17
31 #define DS1347_CLOCK_BURST 0x3F
33 #define DS1347_WP_BIT BIT(7)
35 #define DS1347_NEOSC_BIT BIT(7)
36 #define DS1347_OSF_BIT BIT(2)
38 static const struct regmap_range ds1347_ranges
[] = {
40 .range_min
= DS1347_SECONDS_REG
,
41 .range_max
= DS1347_STATUS_REG
,
45 static const struct regmap_access_table ds1347_access_table
= {
46 .yes_ranges
= ds1347_ranges
,
47 .n_yes_ranges
= ARRAY_SIZE(ds1347_ranges
),
50 static int ds1347_read_time(struct device
*dev
, struct rtc_time
*dt
)
52 struct regmap
*map
= dev_get_drvdata(dev
);
53 unsigned int status
, century
, secs
;
57 err
= regmap_read(map
, DS1347_STATUS_REG
, &status
);
61 if (status
& DS1347_OSF_BIT
)
65 err
= regmap_bulk_read(map
, DS1347_CLOCK_BURST
, buf
, 8);
69 err
= regmap_read(map
, DS1347_CENTURY_REG
, ¢ury
);
73 err
= regmap_read(map
, DS1347_SECONDS_REG
, &secs
);
76 } while (buf
[0] != secs
);
78 dt
->tm_sec
= bcd2bin(buf
[0]);
79 dt
->tm_min
= bcd2bin(buf
[1] & 0x7f);
80 dt
->tm_hour
= bcd2bin(buf
[2] & 0x3F);
81 dt
->tm_mday
= bcd2bin(buf
[3]);
82 dt
->tm_mon
= bcd2bin(buf
[4]) - 1;
83 dt
->tm_wday
= bcd2bin(buf
[5]) - 1;
84 dt
->tm_year
= (bcd2bin(century
) * 100) + bcd2bin(buf
[6]) - 1900;
89 static int ds1347_set_time(struct device
*dev
, struct rtc_time
*dt
)
91 struct regmap
*map
= dev_get_drvdata(dev
);
96 err
= regmap_update_bits(map
, DS1347_STATUS_REG
,
97 DS1347_NEOSC_BIT
, DS1347_NEOSC_BIT
);
101 buf
[0] = bin2bcd(dt
->tm_sec
);
102 buf
[1] = bin2bcd(dt
->tm_min
);
103 buf
[2] = (bin2bcd(dt
->tm_hour
) & 0x3F);
104 buf
[3] = bin2bcd(dt
->tm_mday
);
105 buf
[4] = bin2bcd(dt
->tm_mon
+ 1);
106 buf
[5] = bin2bcd(dt
->tm_wday
+ 1);
107 buf
[6] = bin2bcd(dt
->tm_year
% 100);
108 buf
[7] = bin2bcd(0x00);
110 err
= regmap_bulk_write(map
, DS1347_CLOCK_BURST
, buf
, 8);
114 century
= (dt
->tm_year
/ 100) + 19;
115 err
= regmap_write(map
, DS1347_CENTURY_REG
, century
);
119 return regmap_update_bits(map
, DS1347_STATUS_REG
,
120 DS1347_NEOSC_BIT
| DS1347_OSF_BIT
, 0);
123 static const struct rtc_class_ops ds1347_rtc_ops
= {
124 .read_time
= ds1347_read_time
,
125 .set_time
= ds1347_set_time
,
128 static int ds1347_probe(struct spi_device
*spi
)
130 struct rtc_device
*rtc
;
131 struct regmap_config config
;
135 memset(&config
, 0, sizeof(config
));
138 config
.read_flag_mask
= 0x80;
139 config
.max_register
= 0x3F;
140 config
.wr_table
= &ds1347_access_table
;
142 /* spi setup with ds1347 in mode 3 and bits per word as 8 */
143 spi
->mode
= SPI_MODE_3
;
144 spi
->bits_per_word
= 8;
147 map
= devm_regmap_init_spi(spi
, &config
);
150 dev_err(&spi
->dev
, "ds1347 regmap init spi failed\n");
154 spi_set_drvdata(spi
, map
);
156 /* Disable the write protect of rtc */
157 err
= regmap_update_bits(map
, DS1347_CONTROL_REG
, DS1347_WP_BIT
, 0);
161 rtc
= devm_rtc_allocate_device(&spi
->dev
);
165 rtc
->ops
= &ds1347_rtc_ops
;
166 rtc
->range_min
= RTC_TIMESTAMP_BEGIN_0000
;
167 rtc
->range_max
= RTC_TIMESTAMP_END_9999
;
169 return rtc_register_device(rtc
);
172 static struct spi_driver ds1347_driver
= {
176 .probe
= ds1347_probe
,
179 module_spi_driver(ds1347_driver
);
181 MODULE_DESCRIPTION("DS1347 SPI RTC DRIVER");
182 MODULE_AUTHOR("Raghavendra C Ganiga <ravi23ganiga@gmail.com>");
183 MODULE_LICENSE("GPL v2");