0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #include <linux/module.h>
0027 #include <linux/kernel.h>
0028 #include <linux/platform_device.h>
0029 #include <linux/init.h>
0030 #include <linux/rtc.h>
0031 #include <linux/spi/spi.h>
0032 #include <linux/bcd.h>
0033
0034 #define RX4581_REG_SC 0x00
0035 #define RX4581_REG_MN 0x01
0036 #define RX4581_REG_HR 0x02
0037 #define RX4581_REG_DW 0x03
0038 #define RX4581_REG_DM 0x04
0039 #define RX4581_REG_MO 0x05
0040 #define RX4581_REG_YR 0x06
0041 #define RX4581_REG_RAM 0x07
0042 #define RX4581_REG_AMN 0x08
0043 #define RX4581_REG_AHR 0x09
0044 #define RX4581_REG_ADM 0x0A
0045 #define RX4581_REG_ADW 0x0A
0046 #define RX4581_REG_TMR0 0x0B
0047 #define RX4581_REG_TMR1 0x0C
0048 #define RX4581_REG_EXT 0x0D
0049 #define RX4581_REG_FLAG 0x0E
0050 #define RX4581_REG_CTRL 0x0F
0051
0052
0053
0054 #define RX4581_FLAG_UF 0x20
0055 #define RX4581_FLAG_TF 0x10
0056 #define RX4581_FLAG_AF 0x08
0057 #define RX4581_FLAG_VLF 0x02
0058
0059
0060 #define RX4581_CTRL_UIE 0x20
0061 #define RX4581_CTRL_TIE 0x10
0062 #define RX4581_CTRL_AIE 0x08
0063 #define RX4581_CTRL_STOP 0x02
0064 #define RX4581_CTRL_RESET 0x01
0065
0066 static int rx4581_set_reg(struct device *dev, unsigned char address,
0067 unsigned char data)
0068 {
0069 struct spi_device *spi = to_spi_device(dev);
0070 unsigned char buf[2];
0071
0072
0073 buf[0] = address & 0x0f;
0074 buf[1] = data;
0075
0076 return spi_write_then_read(spi, buf, 2, NULL, 0);
0077 }
0078
0079 static int rx4581_get_reg(struct device *dev, unsigned char address,
0080 unsigned char *data)
0081 {
0082 struct spi_device *spi = to_spi_device(dev);
0083
0084
0085 *data = address | 0x80;
0086
0087 return spi_write_then_read(spi, data, 1, data, 1);
0088 }
0089
0090
0091
0092
0093
0094 static int rx4581_get_datetime(struct device *dev, struct rtc_time *tm)
0095 {
0096 struct spi_device *spi = to_spi_device(dev);
0097 unsigned char date[7];
0098 unsigned char data;
0099 int err;
0100
0101
0102
0103
0104
0105
0106 err = rx4581_get_reg(dev, RX4581_REG_FLAG, &data);
0107 if (err != 0) {
0108 dev_err(dev, "Unable to read device flags\n");
0109 return -EIO;
0110 }
0111
0112 do {
0113
0114 if (data & RX4581_FLAG_UF) {
0115 err = rx4581_set_reg(dev,
0116 RX4581_REG_FLAG, (data & ~RX4581_FLAG_UF));
0117 if (err != 0) {
0118 dev_err(dev, "Unable to write device "
0119 "flags\n");
0120 return -EIO;
0121 }
0122 }
0123
0124
0125 date[0] = 0x80;
0126 err = spi_write_then_read(spi, date, 1, date, 7);
0127 if (err < 0) {
0128 dev_err(dev, "Unable to read date\n");
0129 return -EIO;
0130 }
0131
0132
0133 err = rx4581_get_reg(dev, RX4581_REG_FLAG, &data);
0134 if (err != 0) {
0135 dev_err(dev, "Unable to read device flags\n");
0136 return -EIO;
0137 }
0138 } while (data & RX4581_FLAG_UF);
0139
0140 if (data & RX4581_FLAG_VLF)
0141 dev_info(dev,
0142 "low voltage detected, date/time is not reliable.\n");
0143
0144 dev_dbg(dev,
0145 "%s: raw data is sec=%02x, min=%02x, hr=%02x, "
0146 "wday=%02x, mday=%02x, mon=%02x, year=%02x\n",
0147 __func__,
0148 date[0], date[1], date[2], date[3], date[4], date[5], date[6]);
0149
0150 tm->tm_sec = bcd2bin(date[RX4581_REG_SC] & 0x7F);
0151 tm->tm_min = bcd2bin(date[RX4581_REG_MN] & 0x7F);
0152 tm->tm_hour = bcd2bin(date[RX4581_REG_HR] & 0x3F);
0153 tm->tm_wday = ilog2(date[RX4581_REG_DW] & 0x7F);
0154 tm->tm_mday = bcd2bin(date[RX4581_REG_DM] & 0x3F);
0155 tm->tm_mon = bcd2bin(date[RX4581_REG_MO] & 0x1F) - 1;
0156 tm->tm_year = bcd2bin(date[RX4581_REG_YR]);
0157 if (tm->tm_year < 70)
0158 tm->tm_year += 100;
0159
0160
0161 dev_dbg(dev, "%s: tm is secs=%d, mins=%d, hours=%d, "
0162 "mday=%d, mon=%d, year=%d, wday=%d\n",
0163 __func__,
0164 tm->tm_sec, tm->tm_min, tm->tm_hour,
0165 tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
0166
0167 return 0;
0168 }
0169
0170 static int rx4581_set_datetime(struct device *dev, struct rtc_time *tm)
0171 {
0172 struct spi_device *spi = to_spi_device(dev);
0173 int err;
0174 unsigned char buf[8], data;
0175
0176 dev_dbg(dev, "%s: secs=%d, mins=%d, hours=%d, "
0177 "mday=%d, mon=%d, year=%d, wday=%d\n",
0178 __func__,
0179 tm->tm_sec, tm->tm_min, tm->tm_hour,
0180 tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
0181
0182 buf[0] = 0x00;
0183
0184 buf[RX4581_REG_SC+1] = bin2bcd(tm->tm_sec);
0185 buf[RX4581_REG_MN+1] = bin2bcd(tm->tm_min);
0186 buf[RX4581_REG_HR+1] = bin2bcd(tm->tm_hour);
0187
0188 buf[RX4581_REG_DM+1] = bin2bcd(tm->tm_mday);
0189
0190
0191 buf[RX4581_REG_MO+1] = bin2bcd(tm->tm_mon + 1);
0192
0193
0194 buf[RX4581_REG_YR+1] = bin2bcd(tm->tm_year % 100);
0195 buf[RX4581_REG_DW+1] = (0x1 << tm->tm_wday);
0196
0197
0198 err = rx4581_get_reg(dev, RX4581_REG_CTRL, &data);
0199 if (err != 0) {
0200 dev_err(dev, "Unable to read control register\n");
0201 return -EIO;
0202 }
0203
0204 err = rx4581_set_reg(dev, RX4581_REG_CTRL,
0205 (data | RX4581_CTRL_STOP));
0206 if (err != 0) {
0207 dev_err(dev, "Unable to write control register\n");
0208 return -EIO;
0209 }
0210
0211
0212 err = spi_write_then_read(spi, buf, 8, NULL, 0);
0213 if (err != 0) {
0214 dev_err(dev, "Unable to write to date registers\n");
0215 return -EIO;
0216 }
0217
0218
0219 err = rx4581_get_reg(dev, RX4581_REG_FLAG, &data);
0220 if (err != 0) {
0221 dev_err(dev, "Unable to read flag register\n");
0222 return -EIO;
0223 }
0224
0225 err = rx4581_set_reg(dev, RX4581_REG_FLAG,
0226 (data & ~(RX4581_FLAG_VLF)));
0227 if (err != 0) {
0228 dev_err(dev, "Unable to write flag register\n");
0229 return -EIO;
0230 }
0231
0232
0233 err = rx4581_get_reg(dev, RX4581_REG_CTRL, &data);
0234 if (err != 0) {
0235 dev_err(dev, "Unable to read control register\n");
0236 return -EIO;
0237 }
0238
0239 err = rx4581_set_reg(dev, RX4581_REG_CTRL,
0240 (data & ~(RX4581_CTRL_STOP)));
0241 if (err != 0) {
0242 dev_err(dev, "Unable to write control register\n");
0243 return -EIO;
0244 }
0245
0246 return 0;
0247 }
0248
0249 static const struct rtc_class_ops rx4581_rtc_ops = {
0250 .read_time = rx4581_get_datetime,
0251 .set_time = rx4581_set_datetime,
0252 };
0253
0254 static int rx4581_probe(struct spi_device *spi)
0255 {
0256 struct rtc_device *rtc;
0257 unsigned char tmp;
0258 int res;
0259
0260 res = rx4581_get_reg(&spi->dev, RX4581_REG_SC, &tmp);
0261 if (res != 0)
0262 return res;
0263
0264 rtc = devm_rtc_device_register(&spi->dev, "rx4581",
0265 &rx4581_rtc_ops, THIS_MODULE);
0266 if (IS_ERR(rtc))
0267 return PTR_ERR(rtc);
0268
0269 spi_set_drvdata(spi, rtc);
0270 return 0;
0271 }
0272
0273 static const struct spi_device_id rx4581_id[] = {
0274 { "rx4581", 0 },
0275 { }
0276 };
0277 MODULE_DEVICE_TABLE(spi, rx4581_id);
0278
0279 static struct spi_driver rx4581_driver = {
0280 .driver = {
0281 .name = "rtc-rx4581",
0282 },
0283 .probe = rx4581_probe,
0284 .id_table = rx4581_id,
0285 };
0286
0287 module_spi_driver(rx4581_driver);
0288
0289 MODULE_DESCRIPTION("rx4581 spi RTC driver");
0290 MODULE_AUTHOR("Torben Hohn");
0291 MODULE_LICENSE("GPL");
0292 MODULE_ALIAS("spi:rtc-rx4581");