2 * SPI Driver for Microchip MCP795 RTC
4 * Copyright (C) Josef Gajdusek <atx@atx.name>
6 * based on other Linux RTC drivers
9 * http://ww1.microchip.com/downloads/en/DeviceDoc/22280A.pdf
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
17 #include <linux/module.h>
18 #include <linux/kernel.h>
19 #include <linux/device.h>
20 #include <linux/printk.h>
21 #include <linux/spi/spi.h>
22 #include <linux/rtc.h>
25 /* MCP795 Instructions, see datasheet table 3-1 */
26 #define MCP795_EEREAD 0x03
27 #define MCP795_EEWRITE 0x02
28 #define MCP795_EEWRDI 0x04
29 #define MCP795_EEWREN 0x06
30 #define MCP795_SRREAD 0x05
31 #define MCP795_SRWRITE 0x01
32 #define MCP795_READ 0x13
33 #define MCP795_WRITE 0x12
34 #define MCP795_UNLOCK 0x14
35 #define MCP795_IDWRITE 0x32
36 #define MCP795_IDREAD 0x33
37 #define MCP795_CLRWDT 0x44
38 #define MCP795_CLRRAM 0x54
40 #define MCP795_ST_BIT 0x80
41 #define MCP795_24_BIT 0x40
43 static int mcp795_rtcc_read(struct device
*dev
, u8 addr
, u8
*buf
, u8 count
)
45 struct spi_device
*spi
= to_spi_device(dev
);
51 ret
= spi_write_then_read(spi
, tx
, sizeof(tx
), buf
, count
);
54 dev_err(dev
, "Failed reading %d bytes from address %x.\n",
60 static int mcp795_rtcc_write(struct device
*dev
, u8 addr
, u8
*data
, u8 count
)
62 struct spi_device
*spi
= to_spi_device(dev
);
68 memcpy(&tx
[2], data
, count
);
70 ret
= spi_write(spi
, tx
, 2 + count
);
73 dev_err(dev
, "Failed to write %d bytes to address %x.\n",
79 static int mcp795_rtcc_set_bits(struct device
*dev
, u8 addr
, u8 mask
, u8 state
)
84 ret
= mcp795_rtcc_read(dev
, addr
, &tmp
, 1);
88 if ((tmp
& mask
) != state
) {
89 tmp
= (tmp
& ~mask
) | state
;
90 ret
= mcp795_rtcc_write(dev
, addr
, &tmp
, 1);
96 static int mcp795_set_time(struct device
*dev
, struct rtc_time
*tim
)
101 /* Read first, so we can leave config bits untouched */
102 ret
= mcp795_rtcc_read(dev
, 0x01, data
, sizeof(data
));
107 data
[0] = (data
[0] & 0x80) | ((tim
->tm_sec
/ 10) << 4) | (tim
->tm_sec
% 10);
108 data
[1] = (data
[1] & 0x80) | ((tim
->tm_min
/ 10) << 4) | (tim
->tm_min
% 10);
109 data
[2] = ((tim
->tm_hour
/ 10) << 4) | (tim
->tm_hour
% 10);
110 data
[4] = ((tim
->tm_mday
/ 10) << 4) | ((tim
->tm_mday
) % 10);
111 data
[5] = (data
[5] & 0x10) | (tim
->tm_mon
/ 10) | (tim
->tm_mon
% 10);
113 if (tim
->tm_year
> 100)
116 data
[6] = ((tim
->tm_year
/ 10) << 4) | (tim
->tm_year
% 10);
118 ret
= mcp795_rtcc_write(dev
, 0x01, data
, sizeof(data
));
123 dev_dbg(dev
, "Set mcp795: %04d-%02d-%02d %02d:%02d:%02d\n",
124 tim
->tm_year
+ 1900, tim
->tm_mon
, tim
->tm_mday
,
125 tim
->tm_hour
, tim
->tm_min
, tim
->tm_sec
);
130 static int mcp795_read_time(struct device
*dev
, struct rtc_time
*tim
)
135 ret
= mcp795_rtcc_read(dev
, 0x01, data
, sizeof(data
));
140 tim
->tm_sec
= ((data
[0] & 0x70) >> 4) * 10 + (data
[0] & 0x0f);
141 tim
->tm_min
= ((data
[1] & 0x70) >> 4) * 10 + (data
[1] & 0x0f);
142 tim
->tm_hour
= ((data
[2] & 0x30) >> 4) * 10 + (data
[2] & 0x0f);
143 tim
->tm_mday
= ((data
[4] & 0x30) >> 4) * 10 + (data
[4] & 0x0f);
144 tim
->tm_mon
= ((data
[5] & 0x10) >> 4) * 10 + (data
[5] & 0x0f);
145 tim
->tm_year
= ((data
[6] & 0xf0) >> 4) * 10 + (data
[6] & 0x0f) + 100; /* Assume we are in 20xx */
147 dev_dbg(dev
, "Read from mcp795: %04d-%02d-%02d %02d:%02d:%02d\n",
148 tim
->tm_year
+ 1900, tim
->tm_mon
, tim
->tm_mday
,
149 tim
->tm_hour
, tim
->tm_min
, tim
->tm_sec
);
151 return rtc_valid_tm(tim
);
154 static struct rtc_class_ops mcp795_rtc_ops
= {
155 .read_time
= mcp795_read_time
,
156 .set_time
= mcp795_set_time
159 static int mcp795_probe(struct spi_device
*spi
)
161 struct rtc_device
*rtc
;
164 spi
->mode
= SPI_MODE_0
;
165 spi
->bits_per_word
= 8;
166 ret
= spi_setup(spi
);
168 dev_err(&spi
->dev
, "Unable to setup SPI\n");
172 /* Start the oscillator */
173 mcp795_rtcc_set_bits(&spi
->dev
, 0x01, MCP795_ST_BIT
, MCP795_ST_BIT
);
174 /* Clear the 12 hour mode flag*/
175 mcp795_rtcc_set_bits(&spi
->dev
, 0x03, MCP795_24_BIT
, 0);
177 rtc
= devm_rtc_device_register(&spi
->dev
, "rtc-mcp795",
178 &mcp795_rtc_ops
, THIS_MODULE
);
182 spi_set_drvdata(spi
, rtc
);
188 static const struct of_device_id mcp795_of_match
[] = {
189 { .compatible
= "maxim,mcp795" },
192 MODULE_DEVICE_TABLE(of
, mcp795_of_match
);
195 static struct spi_driver mcp795_driver
= {
197 .name
= "rtc-mcp795",
198 .of_match_table
= of_match_ptr(mcp795_of_match
),
200 .probe
= mcp795_probe
,
203 module_spi_driver(mcp795_driver
);
205 MODULE_DESCRIPTION("MCP795 RTC SPI Driver");
206 MODULE_AUTHOR("Josef Gajdusek <atx@atx.name>");
207 MODULE_LICENSE("GPL");
208 MODULE_ALIAS("spi:mcp795");