linux/drivers/rtc/rtc-ds1286.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * DS1286 Real Time Clock interface for Linux
   4 *
   5 * Copyright (C) 1998, 1999, 2000 Ralf Baechle
   6 * Copyright (C) 2008 Thomas Bogendoerfer
   7 *
   8 * Based on code written by Paul Gortmaker.
   9 */
  10
  11#include <linux/module.h>
  12#include <linux/rtc.h>
  13#include <linux/platform_device.h>
  14#include <linux/bcd.h>
  15#include <linux/rtc/ds1286.h>
  16#include <linux/io.h>
  17#include <linux/slab.h>
  18
  19struct ds1286_priv {
  20        struct rtc_device *rtc;
  21        u32 __iomem *rtcregs;
  22        spinlock_t lock;
  23};
  24
  25static inline u8 ds1286_rtc_read(struct ds1286_priv *priv, int reg)
  26{
  27        return __raw_readl(&priv->rtcregs[reg]) & 0xff;
  28}
  29
  30static inline void ds1286_rtc_write(struct ds1286_priv *priv, u8 data, int reg)
  31{
  32        __raw_writel(data, &priv->rtcregs[reg]);
  33}
  34
  35
  36static int ds1286_alarm_irq_enable(struct device *dev, unsigned int enabled)
  37{
  38        struct ds1286_priv *priv = dev_get_drvdata(dev);
  39        unsigned long flags;
  40        unsigned char val;
  41
  42        /* Allow or mask alarm interrupts */
  43        spin_lock_irqsave(&priv->lock, flags);
  44        val = ds1286_rtc_read(priv, RTC_CMD);
  45        if (enabled)
  46                val &=  ~RTC_TDM;
  47        else
  48                val |=  RTC_TDM;
  49        ds1286_rtc_write(priv, val, RTC_CMD);
  50        spin_unlock_irqrestore(&priv->lock, flags);
  51
  52        return 0;
  53}
  54
  55#ifdef CONFIG_RTC_INTF_DEV
  56
  57static int ds1286_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
  58{
  59        struct ds1286_priv *priv = dev_get_drvdata(dev);
  60        unsigned long flags;
  61        unsigned char val;
  62
  63        switch (cmd) {
  64        case RTC_WIE_OFF:
  65                /* Mask watchdog int. enab. bit */
  66                spin_lock_irqsave(&priv->lock, flags);
  67                val = ds1286_rtc_read(priv, RTC_CMD);
  68                val |= RTC_WAM;
  69                ds1286_rtc_write(priv, val, RTC_CMD);
  70                spin_unlock_irqrestore(&priv->lock, flags);
  71                break;
  72        case RTC_WIE_ON:
  73                /* Allow watchdog interrupts.   */
  74                spin_lock_irqsave(&priv->lock, flags);
  75                val = ds1286_rtc_read(priv, RTC_CMD);
  76                val &= ~RTC_WAM;
  77                ds1286_rtc_write(priv, val, RTC_CMD);
  78                spin_unlock_irqrestore(&priv->lock, flags);
  79                break;
  80        default:
  81                return -ENOIOCTLCMD;
  82        }
  83        return 0;
  84}
  85
  86#else
  87#define ds1286_ioctl    NULL
  88#endif
  89
  90#ifdef CONFIG_PROC_FS
  91
  92static int ds1286_proc(struct device *dev, struct seq_file *seq)
  93{
  94        struct ds1286_priv *priv = dev_get_drvdata(dev);
  95        unsigned char month, cmd, amode;
  96        const char *s;
  97
  98        month = ds1286_rtc_read(priv, RTC_MONTH);
  99        seq_printf(seq,
 100                   "oscillator\t: %s\n"
 101                   "square_wave\t: %s\n",
 102                   (month & RTC_EOSC) ? "disabled" : "enabled",
 103                   (month & RTC_ESQW) ? "disabled" : "enabled");
 104
 105        amode = ((ds1286_rtc_read(priv, RTC_MINUTES_ALARM) & 0x80) >> 5) |
 106                ((ds1286_rtc_read(priv, RTC_HOURS_ALARM) & 0x80) >> 6) |
 107                ((ds1286_rtc_read(priv, RTC_DAY_ALARM) & 0x80) >> 7);
 108        switch (amode) {
 109        case 7:
 110                s = "each minute";
 111                break;
 112        case 3:
 113                s = "minutes match";
 114                break;
 115        case 1:
 116                s = "hours and minutes match";
 117                break;
 118        case 0:
 119                s = "days, hours and minutes match";
 120                break;
 121        default:
 122                s = "invalid";
 123                break;
 124        }
 125        seq_printf(seq, "alarm_mode\t: %s\n", s);
 126
 127        cmd = ds1286_rtc_read(priv, RTC_CMD);
 128        seq_printf(seq,
 129                   "alarm_enable\t: %s\n"
 130                   "wdog_alarm\t: %s\n"
 131                   "alarm_mask\t: %s\n"
 132                   "wdog_alarm_mask\t: %s\n"
 133                   "interrupt_mode\t: %s\n"
 134                   "INTB_mode\t: %s_active\n"
 135                   "interrupt_pins\t: %s\n",
 136                   (cmd & RTC_TDF) ? "yes" : "no",
 137                   (cmd & RTC_WAF) ? "yes" : "no",
 138                   (cmd & RTC_TDM) ? "disabled" : "enabled",
 139                   (cmd & RTC_WAM) ? "disabled" : "enabled",
 140                   (cmd & RTC_PU_LVL) ? "pulse" : "level",
 141                   (cmd & RTC_IBH_LO) ? "low" : "high",
 142                   (cmd & RTC_IPSW) ? "unswapped" : "swapped");
 143        return 0;
 144}
 145
 146#else
 147#define ds1286_proc     NULL
 148#endif
 149
 150static int ds1286_read_time(struct device *dev, struct rtc_time *tm)
 151{
 152        struct ds1286_priv *priv = dev_get_drvdata(dev);
 153        unsigned char save_control;
 154        unsigned long flags;
 155        unsigned long uip_watchdog = jiffies;
 156
 157        /*
 158         * read RTC once any update in progress is done. The update
 159         * can take just over 2ms. We wait 10 to 20ms. There is no need to
 160         * to poll-wait (up to 1s - eeccch) for the falling edge of RTC_UIP.
 161         * If you need to know *exactly* when a second has started, enable
 162         * periodic update complete interrupts, (via ioctl) and then
 163         * immediately read /dev/rtc which will block until you get the IRQ.
 164         * Once the read clears, read the RTC time (again via ioctl). Easy.
 165         */
 166
 167        if (ds1286_rtc_read(priv, RTC_CMD) & RTC_TE)
 168                while (time_before(jiffies, uip_watchdog + 2*HZ/100))
 169                        barrier();
 170
 171        /*
 172         * Only the values that we read from the RTC are set. We leave
 173         * tm_wday, tm_yday and tm_isdst untouched. Even though the
 174         * RTC has RTC_DAY_OF_WEEK, we ignore it, as it is only updated
 175         * by the RTC when initially set to a non-zero value.
 176         */
 177        spin_lock_irqsave(&priv->lock, flags);
 178        save_control = ds1286_rtc_read(priv, RTC_CMD);
 179        ds1286_rtc_write(priv, (save_control|RTC_TE), RTC_CMD);
 180
 181        tm->tm_sec = ds1286_rtc_read(priv, RTC_SECONDS);
 182        tm->tm_min = ds1286_rtc_read(priv, RTC_MINUTES);
 183        tm->tm_hour = ds1286_rtc_read(priv, RTC_HOURS) & 0x3f;
 184        tm->tm_mday = ds1286_rtc_read(priv, RTC_DATE);
 185        tm->tm_mon = ds1286_rtc_read(priv, RTC_MONTH) & 0x1f;
 186        tm->tm_year = ds1286_rtc_read(priv, RTC_YEAR);
 187
 188        ds1286_rtc_write(priv, save_control, RTC_CMD);
 189        spin_unlock_irqrestore(&priv->lock, flags);
 190
 191        tm->tm_sec = bcd2bin(tm->tm_sec);
 192        tm->tm_min = bcd2bin(tm->tm_min);
 193        tm->tm_hour = bcd2bin(tm->tm_hour);
 194        tm->tm_mday = bcd2bin(tm->tm_mday);
 195        tm->tm_mon = bcd2bin(tm->tm_mon);
 196        tm->tm_year = bcd2bin(tm->tm_year);
 197
 198        /*
 199         * Account for differences between how the RTC uses the values
 200         * and how they are defined in a struct rtc_time;
 201         */
 202        if (tm->tm_year < 45)
 203                tm->tm_year += 30;
 204        tm->tm_year += 40;
 205        if (tm->tm_year < 70)
 206                tm->tm_year += 100;
 207
 208        tm->tm_mon--;
 209
 210        return 0;
 211}
 212
 213static int ds1286_set_time(struct device *dev, struct rtc_time *tm)
 214{
 215        struct ds1286_priv *priv = dev_get_drvdata(dev);
 216        unsigned char mon, day, hrs, min, sec;
 217        unsigned char save_control;
 218        unsigned int yrs;
 219        unsigned long flags;
 220
 221        yrs = tm->tm_year + 1900;
 222        mon = tm->tm_mon + 1;   /* tm_mon starts at zero */
 223        day = tm->tm_mday;
 224        hrs = tm->tm_hour;
 225        min = tm->tm_min;
 226        sec = tm->tm_sec;
 227
 228        if (yrs < 1970)
 229                return -EINVAL;
 230
 231        yrs -= 1940;
 232        if (yrs > 255)    /* They are unsigned */
 233                return -EINVAL;
 234
 235        if (yrs >= 100)
 236                yrs -= 100;
 237
 238        sec = bin2bcd(sec);
 239        min = bin2bcd(min);
 240        hrs = bin2bcd(hrs);
 241        day = bin2bcd(day);
 242        mon = bin2bcd(mon);
 243        yrs = bin2bcd(yrs);
 244
 245        spin_lock_irqsave(&priv->lock, flags);
 246        save_control = ds1286_rtc_read(priv, RTC_CMD);
 247        ds1286_rtc_write(priv, (save_control|RTC_TE), RTC_CMD);
 248
 249        ds1286_rtc_write(priv, yrs, RTC_YEAR);
 250        ds1286_rtc_write(priv, mon, RTC_MONTH);
 251        ds1286_rtc_write(priv, day, RTC_DATE);
 252        ds1286_rtc_write(priv, hrs, RTC_HOURS);
 253        ds1286_rtc_write(priv, min, RTC_MINUTES);
 254        ds1286_rtc_write(priv, sec, RTC_SECONDS);
 255        ds1286_rtc_write(priv, 0, RTC_HUNDREDTH_SECOND);
 256
 257        ds1286_rtc_write(priv, save_control, RTC_CMD);
 258        spin_unlock_irqrestore(&priv->lock, flags);
 259        return 0;
 260}
 261
 262static int ds1286_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
 263{
 264        struct ds1286_priv *priv = dev_get_drvdata(dev);
 265        unsigned long flags;
 266
 267        /*
 268         * Only the values that we read from the RTC are set. That
 269         * means only tm_wday, tm_hour, tm_min.
 270         */
 271        spin_lock_irqsave(&priv->lock, flags);
 272        alm->time.tm_min = ds1286_rtc_read(priv, RTC_MINUTES_ALARM) & 0x7f;
 273        alm->time.tm_hour = ds1286_rtc_read(priv, RTC_HOURS_ALARM)  & 0x1f;
 274        alm->time.tm_wday = ds1286_rtc_read(priv, RTC_DAY_ALARM)    & 0x07;
 275        ds1286_rtc_read(priv, RTC_CMD);
 276        spin_unlock_irqrestore(&priv->lock, flags);
 277
 278        alm->time.tm_min = bcd2bin(alm->time.tm_min);
 279        alm->time.tm_hour = bcd2bin(alm->time.tm_hour);
 280        alm->time.tm_sec = 0;
 281        return 0;
 282}
 283
 284static int ds1286_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
 285{
 286        struct ds1286_priv *priv = dev_get_drvdata(dev);
 287        unsigned char hrs, min, sec;
 288
 289        hrs = alm->time.tm_hour;
 290        min = alm->time.tm_min;
 291        sec = alm->time.tm_sec;
 292
 293        if (hrs >= 24)
 294                hrs = 0xff;
 295
 296        if (min >= 60)
 297                min = 0xff;
 298
 299        if (sec != 0)
 300                return -EINVAL;
 301
 302        min = bin2bcd(min);
 303        hrs = bin2bcd(hrs);
 304
 305        spin_lock(&priv->lock);
 306        ds1286_rtc_write(priv, hrs, RTC_HOURS_ALARM);
 307        ds1286_rtc_write(priv, min, RTC_MINUTES_ALARM);
 308        spin_unlock(&priv->lock);
 309
 310        return 0;
 311}
 312
 313static const struct rtc_class_ops ds1286_ops = {
 314        .ioctl          = ds1286_ioctl,
 315        .proc           = ds1286_proc,
 316        .read_time      = ds1286_read_time,
 317        .set_time       = ds1286_set_time,
 318        .read_alarm     = ds1286_read_alarm,
 319        .set_alarm      = ds1286_set_alarm,
 320        .alarm_irq_enable = ds1286_alarm_irq_enable,
 321};
 322
 323static int ds1286_probe(struct platform_device *pdev)
 324{
 325        struct rtc_device *rtc;
 326        struct ds1286_priv *priv;
 327
 328        priv = devm_kzalloc(&pdev->dev, sizeof(struct ds1286_priv), GFP_KERNEL);
 329        if (!priv)
 330                return -ENOMEM;
 331
 332        priv->rtcregs = devm_platform_ioremap_resource(pdev, 0);
 333        if (IS_ERR(priv->rtcregs))
 334                return PTR_ERR(priv->rtcregs);
 335
 336        spin_lock_init(&priv->lock);
 337        platform_set_drvdata(pdev, priv);
 338        rtc = devm_rtc_device_register(&pdev->dev, "ds1286", &ds1286_ops,
 339                                        THIS_MODULE);
 340        if (IS_ERR(rtc))
 341                return PTR_ERR(rtc);
 342        priv->rtc = rtc;
 343        return 0;
 344}
 345
 346static struct platform_driver ds1286_platform_driver = {
 347        .driver         = {
 348                .name   = "rtc-ds1286",
 349        },
 350        .probe          = ds1286_probe,
 351};
 352
 353module_platform_driver(ds1286_platform_driver);
 354
 355MODULE_AUTHOR("Thomas Bogendoerfer <tsbogend@alpha.franken.de>");
 356MODULE_DESCRIPTION("DS1286 RTC driver");
 357MODULE_LICENSE("GPL");
 358MODULE_ALIAS("platform:rtc-ds1286");
 359