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>
24 /* MCP795 Instructions, see datasheet table 3-1 */
25 #define MCP795_EEREAD 0x03
26 #define MCP795_EEWRITE 0x02
27 #define MCP795_EEWRDI 0x04
28 #define MCP795_EEWREN 0x06
29 #define MCP795_SRREAD 0x05
30 #define MCP795_SRWRITE 0x01
31 #define MCP795_READ 0x13
32 #define MCP795_WRITE 0x12
33 #define MCP795_UNLOCK 0x14
34 #define MCP795_IDWRITE 0x32
35 #define MCP795_IDREAD 0x33
36 #define MCP795_CLRWDT 0x44
37 #define MCP795_CLRRAM 0x54
39 #define MCP795_ST_BIT 0x80
40 #define MCP795_24_BIT 0x40
42 static int mcp795_rtcc_read(struct device
*dev
, u8 addr
, u8
*buf
, u8 count
)
44 struct spi_device
*spi
= to_spi_device(dev
);
50 ret
= spi_write_then_read(spi
, tx
, sizeof(tx
), buf
, count
);
53 dev_err(dev
, "Failed reading %d bytes from address %x.\n",
59 static int mcp795_rtcc_write(struct device
*dev
, u8 addr
, u8
*data
, u8 count
)
61 struct spi_device
*spi
= to_spi_device(dev
);
67 memcpy(&tx
[2], data
, count
);
69 ret
= spi_write(spi
, tx
, 2 + count
);
72 dev_err(dev
, "Failed to write %d bytes to address %x.\n",
78 static int mcp795_rtcc_set_bits(struct device
*dev
, u8 addr
, u8 mask
, u8 state
)
83 ret
= mcp795_rtcc_read(dev
, addr
, &tmp
, 1);
87 if ((tmp
& mask
) != state
) {
88 tmp
= (tmp
& ~mask
) | state
;
89 ret
= mcp795_rtcc_write(dev
, addr
, &tmp
, 1);
95 static int mcp795_set_time(struct device
*dev
, struct rtc_time
*tim
)
100 /* Read first, so we can leave config bits untouched */
101 ret
= mcp795_rtcc_read(dev
, 0x01, data
, sizeof(data
));
106 data
[0] = (data
[0] & 0x80) | ((tim
->tm_sec
/ 10) << 4) | (tim
->tm_sec
% 10);
107 data
[1] = (data
[1] & 0x80) | ((tim
->tm_min
/ 10) << 4) | (tim
->tm_min
% 10);
108 data
[2] = ((tim
->tm_hour
/ 10) << 4) | (tim
->tm_hour
% 10);
109 data
[4] = ((tim
->tm_mday
/ 10) << 4) | ((tim
->tm_mday
) % 10);
110 data
[5] = (data
[5] & 0x10) | (tim
->tm_mon
/ 10) | (tim
->tm_mon
% 10);
112 if (tim
->tm_year
> 100)
115 data
[6] = ((tim
->tm_year
/ 10) << 4) | (tim
->tm_year
% 10);
117 ret
= mcp795_rtcc_write(dev
, 0x01, data
, sizeof(data
));
122 dev_dbg(dev
, "Set mcp795: %04d-%02d-%02d %02d:%02d:%02d\n",
123 tim
->tm_year
+ 1900, tim
->tm_mon
, tim
->tm_mday
,
124 tim
->tm_hour
, tim
->tm_min
, tim
->tm_sec
);
129 static int mcp795_read_time(struct device
*dev
, struct rtc_time
*tim
)
134 ret
= mcp795_rtcc_read(dev
, 0x01, data
, sizeof(data
));
139 tim
->tm_sec
= ((data
[0] & 0x70) >> 4) * 10 + (data
[0] & 0x0f);
140 tim
->tm_min
= ((data
[1] & 0x70) >> 4) * 10 + (data
[1] & 0x0f);
141 tim
->tm_hour
= ((data
[2] & 0x30) >> 4) * 10 + (data
[2] & 0x0f);
142 tim
->tm_mday
= ((data
[4] & 0x30) >> 4) * 10 + (data
[4] & 0x0f);
143 tim
->tm_mon
= ((data
[5] & 0x10) >> 4) * 10 + (data
[5] & 0x0f);
144 tim
->tm_year
= ((data
[6] & 0xf0) >> 4) * 10 + (data
[6] & 0x0f) + 100; /* Assume we are in 20xx */
146 dev_dbg(dev
, "Read from mcp795: %04d-%02d-%02d %02d:%02d:%02d\n",
147 tim
->tm_year
+ 1900, tim
->tm_mon
, tim
->tm_mday
,
148 tim
->tm_hour
, tim
->tm_min
, tim
->tm_sec
);
150 return rtc_valid_tm(tim
);
153 static struct rtc_class_ops mcp795_rtc_ops
= {
154 .read_time
= mcp795_read_time
,
155 .set_time
= mcp795_set_time
158 static int mcp795_probe(struct spi_device
*spi
)
160 struct rtc_device
*rtc
;
163 spi
->mode
= SPI_MODE_0
;
164 spi
->bits_per_word
= 8;
165 ret
= spi_setup(spi
);
167 dev_err(&spi
->dev
, "Unable to setup SPI\n");
171 /* Start the oscillator */
172 mcp795_rtcc_set_bits(&spi
->dev
, 0x01, MCP795_ST_BIT
, MCP795_ST_BIT
);
173 /* Clear the 12 hour mode flag*/
174 mcp795_rtcc_set_bits(&spi
->dev
, 0x03, MCP795_24_BIT
, 0);
176 rtc
= devm_rtc_device_register(&spi
->dev
, "rtc-mcp795",
177 &mcp795_rtc_ops
, THIS_MODULE
);
181 spi_set_drvdata(spi
, rtc
);
186 static struct spi_driver mcp795_driver
= {
188 .name
= "rtc-mcp795",
190 .probe
= mcp795_probe
,
193 module_spi_driver(mcp795_driver
);
195 MODULE_DESCRIPTION("MCP795 RTC SPI Driver");
196 MODULE_AUTHOR("Josef Gajdusek <atx@atx.name>");
197 MODULE_LICENSE("GPL");
198 MODULE_ALIAS("spi:mcp795");