Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /* drivers/rtc/rtc-rx4581.c
0003  *
0004  * written by Torben Hohn <torbenh@linutronix.de>
0005  *
0006  * Based on:
0007  * drivers/rtc/rtc-max6902.c
0008  *
0009  * Copyright (C) 2006 8D Technologies inc.
0010  * Copyright (C) 2004 Compulab Ltd.
0011  *
0012  * Driver for MAX6902 spi RTC
0013  *
0014  * and based on:
0015  * drivers/rtc/rtc-rx8581.c
0016  *
0017  * An I2C driver for the Epson RX8581 RTC
0018  *
0019  * Author: Martyn Welch <martyn.welch@ge.com>
0020  * Copyright 2008 GE Intelligent Platforms Embedded Systems, Inc.
0021  *
0022  * Based on: rtc-pcf8563.c (An I2C driver for the Philips PCF8563 RTC)
0023  * Copyright 2005-06 Tower Technologies
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 /* Second in BCD */
0035 #define RX4581_REG_MN       0x01 /* Minute in BCD */
0036 #define RX4581_REG_HR       0x02 /* Hour in BCD */
0037 #define RX4581_REG_DW       0x03 /* Day of Week */
0038 #define RX4581_REG_DM       0x04 /* Day of Month in BCD */
0039 #define RX4581_REG_MO       0x05 /* Month in BCD */
0040 #define RX4581_REG_YR       0x06 /* Year in BCD */
0041 #define RX4581_REG_RAM      0x07 /* RAM */
0042 #define RX4581_REG_AMN      0x08 /* Alarm Min in BCD*/
0043 #define RX4581_REG_AHR      0x09 /* Alarm Hour in BCD */
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 /* Extension Register */
0049 #define RX4581_REG_FLAG     0x0E /* Flag Register */
0050 #define RX4581_REG_CTRL     0x0F /* Control Register */
0051 
0052 
0053 /* Flag Register bit definitions */
0054 #define RX4581_FLAG_UF      0x20 /* Update */
0055 #define RX4581_FLAG_TF      0x10 /* Timer */
0056 #define RX4581_FLAG_AF      0x08 /* Alarm */
0057 #define RX4581_FLAG_VLF     0x02 /* Voltage Low */
0058 
0059 /* Control Register bit definitions */
0060 #define RX4581_CTRL_UIE     0x20 /* Update Interrupt Enable */
0061 #define RX4581_CTRL_TIE     0x10 /* Timer Interrupt Enable */
0062 #define RX4581_CTRL_AIE     0x08 /* Alarm Interrupt Enable */
0063 #define RX4581_CTRL_STOP    0x02 /* STOP bit */
0064 #define RX4581_CTRL_RESET   0x01 /* RESET bit */
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     /* high nibble must be '0' to write */
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     /* Set MSB to indicate read */
0085     *data = address | 0x80;
0086 
0087     return spi_write_then_read(spi, data, 1, data, 1);
0088 }
0089 
0090 /*
0091  * In the routines that deal directly with the rx8581 hardware, we use
0092  * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch.
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     /* First we ensure that the "update flag" is not set, we read the
0102      * time and date then re-read the "update flag". If the update flag
0103      * has been set, we know that the time has changed during the read so
0104      * we repeat the whole process again.
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         /* If update flag set, clear it */
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         /* Now read time and date */
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         /* Check flag register */
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); /* rtc hr 0-23 */
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; /* rtc mn 1-12 */
0156     tm->tm_year = bcd2bin(date[RX4581_REG_YR]);
0157     if (tm->tm_year < 70)
0158         tm->tm_year += 100; /* assume we are in 1970...2069 */
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     /* hours, minutes and seconds */
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     /* month, 1 - 12 */
0191     buf[RX4581_REG_MO+1] = bin2bcd(tm->tm_mon + 1);
0192 
0193     /* year and century */
0194     buf[RX4581_REG_YR+1] = bin2bcd(tm->tm_year % 100);
0195     buf[RX4581_REG_DW+1] = (0x1 << tm->tm_wday);
0196 
0197     /* Stop the clock */
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     /* write register's data */
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     /* get VLF and clear it */
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     /* Restart the clock */
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");