linux/drivers/rtc/rtc-at91rm9200.c
<<
>>
Prefs
   1/*
   2 *      Real Time Clock interface for Linux on Atmel AT91RM9200
   3 *
   4 *      Copyright (C) 2002 Rick Bronson
   5 *
   6 *      Converted to RTC class model by Andrew Victor
   7 *
   8 *      Ported to Linux 2.6 by Steven Scholz
   9 *      Based on s3c2410-rtc.c Simtec Electronics
  10 *
  11 *      Based on sa1100-rtc.c by Nils Faerber
  12 *      Based on rtc.c by Paul Gortmaker
  13 *
  14 *      This program is free software; you can redistribute it and/or
  15 *      modify it under the terms of the GNU General Public License
  16 *      as published by the Free Software Foundation; either version
  17 *      2 of the License, or (at your option) any later version.
  18 *
  19 */
  20
  21#include <linux/bcd.h>
  22#include <linux/clk.h>
  23#include <linux/completion.h>
  24#include <linux/interrupt.h>
  25#include <linux/ioctl.h>
  26#include <linux/io.h>
  27#include <linux/kernel.h>
  28#include <linux/module.h>
  29#include <linux/of_device.h>
  30#include <linux/of.h>
  31#include <linux/platform_device.h>
  32#include <linux/rtc.h>
  33#include <linux/spinlock.h>
  34#include <linux/suspend.h>
  35#include <linux/time.h>
  36#include <linux/uaccess.h>
  37
  38#include "rtc-at91rm9200.h"
  39
  40#define at91_rtc_read(field) \
  41        readl_relaxed(at91_rtc_regs + field)
  42#define at91_rtc_write(field, val) \
  43        writel_relaxed((val), at91_rtc_regs + field)
  44
  45struct at91_rtc_config {
  46        bool use_shadow_imr;
  47};
  48
  49static const struct at91_rtc_config *at91_rtc_config;
  50static DECLARE_COMPLETION(at91_rtc_updated);
  51static DECLARE_COMPLETION(at91_rtc_upd_rdy);
  52static void __iomem *at91_rtc_regs;
  53static int irq;
  54static DEFINE_SPINLOCK(at91_rtc_lock);
  55static u32 at91_rtc_shadow_imr;
  56static bool suspended;
  57static DEFINE_SPINLOCK(suspended_lock);
  58static unsigned long cached_events;
  59static u32 at91_rtc_imr;
  60static struct clk *sclk;
  61
  62static void at91_rtc_write_ier(u32 mask)
  63{
  64        unsigned long flags;
  65
  66        spin_lock_irqsave(&at91_rtc_lock, flags);
  67        at91_rtc_shadow_imr |= mask;
  68        at91_rtc_write(AT91_RTC_IER, mask);
  69        spin_unlock_irqrestore(&at91_rtc_lock, flags);
  70}
  71
  72static void at91_rtc_write_idr(u32 mask)
  73{
  74        unsigned long flags;
  75
  76        spin_lock_irqsave(&at91_rtc_lock, flags);
  77        at91_rtc_write(AT91_RTC_IDR, mask);
  78        /*
  79         * Register read back (of any RTC-register) needed to make sure
  80         * IDR-register write has reached the peripheral before updating
  81         * shadow mask.
  82         *
  83         * Note that there is still a possibility that the mask is updated
  84         * before interrupts have actually been disabled in hardware. The only
  85         * way to be certain would be to poll the IMR-register, which is is
  86         * the very register we are trying to emulate. The register read back
  87         * is a reasonable heuristic.
  88         */
  89        at91_rtc_read(AT91_RTC_SR);
  90        at91_rtc_shadow_imr &= ~mask;
  91        spin_unlock_irqrestore(&at91_rtc_lock, flags);
  92}
  93
  94static u32 at91_rtc_read_imr(void)
  95{
  96        unsigned long flags;
  97        u32 mask;
  98
  99        if (at91_rtc_config->use_shadow_imr) {
 100                spin_lock_irqsave(&at91_rtc_lock, flags);
 101                mask = at91_rtc_shadow_imr;
 102                spin_unlock_irqrestore(&at91_rtc_lock, flags);
 103        } else {
 104                mask = at91_rtc_read(AT91_RTC_IMR);
 105        }
 106
 107        return mask;
 108}
 109
 110/*
 111 * Decode time/date into rtc_time structure
 112 */
 113static void at91_rtc_decodetime(unsigned int timereg, unsigned int calreg,
 114                                struct rtc_time *tm)
 115{
 116        unsigned int time, date;
 117
 118        /* must read twice in case it changes */
 119        do {
 120                time = at91_rtc_read(timereg);
 121                date = at91_rtc_read(calreg);
 122        } while ((time != at91_rtc_read(timereg)) ||
 123                        (date != at91_rtc_read(calreg)));
 124
 125        tm->tm_sec  = bcd2bin((time & AT91_RTC_SEC) >> 0);
 126        tm->tm_min  = bcd2bin((time & AT91_RTC_MIN) >> 8);
 127        tm->tm_hour = bcd2bin((time & AT91_RTC_HOUR) >> 16);
 128
 129        /*
 130         * The Calendar Alarm register does not have a field for
 131         * the year - so these will return an invalid value.
 132         */
 133        tm->tm_year  = bcd2bin(date & AT91_RTC_CENT) * 100;     /* century */
 134        tm->tm_year += bcd2bin((date & AT91_RTC_YEAR) >> 8);    /* year */
 135
 136        tm->tm_wday = bcd2bin((date & AT91_RTC_DAY) >> 21) - 1; /* day of the week [0-6], Sunday=0 */
 137        tm->tm_mon  = bcd2bin((date & AT91_RTC_MONTH) >> 16) - 1;
 138        tm->tm_mday = bcd2bin((date & AT91_RTC_DATE) >> 24);
 139}
 140
 141/*
 142 * Read current time and date in RTC
 143 */
 144static int at91_rtc_readtime(struct device *dev, struct rtc_time *tm)
 145{
 146        at91_rtc_decodetime(AT91_RTC_TIMR, AT91_RTC_CALR, tm);
 147        tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year);
 148        tm->tm_year = tm->tm_year - 1900;
 149
 150        dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__,
 151                1900 + tm->tm_year, tm->tm_mon, tm->tm_mday,
 152                tm->tm_hour, tm->tm_min, tm->tm_sec);
 153
 154        return 0;
 155}
 156
 157/*
 158 * Set current time and date in RTC
 159 */
 160static int at91_rtc_settime(struct device *dev, struct rtc_time *tm)
 161{
 162        unsigned long cr;
 163
 164        dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__,
 165                1900 + tm->tm_year, tm->tm_mon, tm->tm_mday,
 166                tm->tm_hour, tm->tm_min, tm->tm_sec);
 167
 168        wait_for_completion(&at91_rtc_upd_rdy);
 169
 170        /* Stop Time/Calendar from counting */
 171        cr = at91_rtc_read(AT91_RTC_CR);
 172        at91_rtc_write(AT91_RTC_CR, cr | AT91_RTC_UPDCAL | AT91_RTC_UPDTIM);
 173
 174        at91_rtc_write_ier(AT91_RTC_ACKUPD);
 175        wait_for_completion(&at91_rtc_updated); /* wait for ACKUPD interrupt */
 176        at91_rtc_write_idr(AT91_RTC_ACKUPD);
 177
 178        at91_rtc_write(AT91_RTC_TIMR,
 179                          bin2bcd(tm->tm_sec) << 0
 180                        | bin2bcd(tm->tm_min) << 8
 181                        | bin2bcd(tm->tm_hour) << 16);
 182
 183        at91_rtc_write(AT91_RTC_CALR,
 184                          bin2bcd((tm->tm_year + 1900) / 100)   /* century */
 185                        | bin2bcd(tm->tm_year % 100) << 8       /* year */
 186                        | bin2bcd(tm->tm_mon + 1) << 16         /* tm_mon starts at zero */
 187                        | bin2bcd(tm->tm_wday + 1) << 21        /* day of the week [0-6], Sunday=0 */
 188                        | bin2bcd(tm->tm_mday) << 24);
 189
 190        /* Restart Time/Calendar */
 191        cr = at91_rtc_read(AT91_RTC_CR);
 192        at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_SECEV);
 193        at91_rtc_write(AT91_RTC_CR, cr & ~(AT91_RTC_UPDCAL | AT91_RTC_UPDTIM));
 194        at91_rtc_write_ier(AT91_RTC_SECEV);
 195
 196        return 0;
 197}
 198
 199/*
 200 * Read alarm time and date in RTC
 201 */
 202static int at91_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
 203{
 204        struct rtc_time *tm = &alrm->time;
 205
 206        at91_rtc_decodetime(AT91_RTC_TIMALR, AT91_RTC_CALALR, tm);
 207        tm->tm_year = -1;
 208
 209        alrm->enabled = (at91_rtc_read_imr() & AT91_RTC_ALARM)
 210                        ? 1 : 0;
 211
 212        dev_dbg(dev, "%s(): %02d-%02d %02d:%02d:%02d %sabled\n", __func__,
 213                tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec,
 214                alrm->enabled ? "en" : "dis");
 215
 216        return 0;
 217}
 218
 219/*
 220 * Set alarm time and date in RTC
 221 */
 222static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
 223{
 224        struct rtc_time tm;
 225
 226        at91_rtc_decodetime(AT91_RTC_TIMR, AT91_RTC_CALR, &tm);
 227
 228        tm.tm_mon = alrm->time.tm_mon;
 229        tm.tm_mday = alrm->time.tm_mday;
 230        tm.tm_hour = alrm->time.tm_hour;
 231        tm.tm_min = alrm->time.tm_min;
 232        tm.tm_sec = alrm->time.tm_sec;
 233
 234        at91_rtc_write_idr(AT91_RTC_ALARM);
 235        at91_rtc_write(AT91_RTC_TIMALR,
 236                  bin2bcd(tm.tm_sec) << 0
 237                | bin2bcd(tm.tm_min) << 8
 238                | bin2bcd(tm.tm_hour) << 16
 239                | AT91_RTC_HOUREN | AT91_RTC_MINEN | AT91_RTC_SECEN);
 240        at91_rtc_write(AT91_RTC_CALALR,
 241                  bin2bcd(tm.tm_mon + 1) << 16          /* tm_mon starts at zero */
 242                | bin2bcd(tm.tm_mday) << 24
 243                | AT91_RTC_DATEEN | AT91_RTC_MTHEN);
 244
 245        if (alrm->enabled) {
 246                at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM);
 247                at91_rtc_write_ier(AT91_RTC_ALARM);
 248        }
 249
 250        dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__,
 251                tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour,
 252                tm.tm_min, tm.tm_sec);
 253
 254        return 0;
 255}
 256
 257static int at91_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
 258{
 259        dev_dbg(dev, "%s(): cmd=%08x\n", __func__, enabled);
 260
 261        if (enabled) {
 262                at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM);
 263                at91_rtc_write_ier(AT91_RTC_ALARM);
 264        } else
 265                at91_rtc_write_idr(AT91_RTC_ALARM);
 266
 267        return 0;
 268}
 269/*
 270 * Provide additional RTC information in /proc/driver/rtc
 271 */
 272static int at91_rtc_proc(struct device *dev, struct seq_file *seq)
 273{
 274        unsigned long imr = at91_rtc_read_imr();
 275
 276        seq_printf(seq, "update_IRQ\t: %s\n",
 277                        (imr & AT91_RTC_ACKUPD) ? "yes" : "no");
 278        seq_printf(seq, "periodic_IRQ\t: %s\n",
 279                        (imr & AT91_RTC_SECEV) ? "yes" : "no");
 280
 281        return 0;
 282}
 283
 284/*
 285 * IRQ handler for the RTC
 286 */
 287static irqreturn_t at91_rtc_interrupt(int irq, void *dev_id)
 288{
 289        struct platform_device *pdev = dev_id;
 290        struct rtc_device *rtc = platform_get_drvdata(pdev);
 291        unsigned int rtsr;
 292        unsigned long events = 0;
 293        int ret = IRQ_NONE;
 294
 295        spin_lock(&suspended_lock);
 296        rtsr = at91_rtc_read(AT91_RTC_SR) & at91_rtc_read_imr();
 297        if (rtsr) {             /* this interrupt is shared!  Is it ours? */
 298                if (rtsr & AT91_RTC_ALARM)
 299                        events |= (RTC_AF | RTC_IRQF);
 300                if (rtsr & AT91_RTC_SECEV) {
 301                        complete(&at91_rtc_upd_rdy);
 302                        at91_rtc_write_idr(AT91_RTC_SECEV);
 303                }
 304                if (rtsr & AT91_RTC_ACKUPD)
 305                        complete(&at91_rtc_updated);
 306
 307                at91_rtc_write(AT91_RTC_SCCR, rtsr);    /* clear status reg */
 308
 309                if (!suspended) {
 310                        rtc_update_irq(rtc, 1, events);
 311
 312                        dev_dbg(&pdev->dev, "%s(): num=%ld, events=0x%02lx\n",
 313                                __func__, events >> 8, events & 0x000000FF);
 314                } else {
 315                        cached_events |= events;
 316                        at91_rtc_write_idr(at91_rtc_imr);
 317                        pm_system_wakeup();
 318                }
 319
 320                ret = IRQ_HANDLED;
 321        }
 322        spin_unlock(&suspended_lock);
 323
 324        return ret;
 325}
 326
 327static const struct at91_rtc_config at91rm9200_config = {
 328};
 329
 330static const struct at91_rtc_config at91sam9x5_config = {
 331        .use_shadow_imr = true,
 332};
 333
 334#ifdef CONFIG_OF
 335static const struct of_device_id at91_rtc_dt_ids[] = {
 336        {
 337                .compatible = "atmel,at91rm9200-rtc",
 338                .data = &at91rm9200_config,
 339        }, {
 340                .compatible = "atmel,at91sam9x5-rtc",
 341                .data = &at91sam9x5_config,
 342        }, {
 343                /* sentinel */
 344        }
 345};
 346MODULE_DEVICE_TABLE(of, at91_rtc_dt_ids);
 347#endif
 348
 349static const struct at91_rtc_config *
 350at91_rtc_get_config(struct platform_device *pdev)
 351{
 352        const struct of_device_id *match;
 353
 354        if (pdev->dev.of_node) {
 355                match = of_match_node(at91_rtc_dt_ids, pdev->dev.of_node);
 356                if (!match)
 357                        return NULL;
 358                return (const struct at91_rtc_config *)match->data;
 359        }
 360
 361        return &at91rm9200_config;
 362}
 363
 364static const struct rtc_class_ops at91_rtc_ops = {
 365        .read_time      = at91_rtc_readtime,
 366        .set_time       = at91_rtc_settime,
 367        .read_alarm     = at91_rtc_readalarm,
 368        .set_alarm      = at91_rtc_setalarm,
 369        .proc           = at91_rtc_proc,
 370        .alarm_irq_enable = at91_rtc_alarm_irq_enable,
 371};
 372
 373/*
 374 * Initialize and install RTC driver
 375 */
 376static int __init at91_rtc_probe(struct platform_device *pdev)
 377{
 378        struct rtc_device *rtc;
 379        struct resource *regs;
 380        int ret = 0;
 381
 382        at91_rtc_config = at91_rtc_get_config(pdev);
 383        if (!at91_rtc_config)
 384                return -ENODEV;
 385
 386        regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 387        if (!regs) {
 388                dev_err(&pdev->dev, "no mmio resource defined\n");
 389                return -ENXIO;
 390        }
 391
 392        irq = platform_get_irq(pdev, 0);
 393        if (irq < 0) {
 394                dev_err(&pdev->dev, "no irq resource defined\n");
 395                return -ENXIO;
 396        }
 397
 398        at91_rtc_regs = devm_ioremap(&pdev->dev, regs->start,
 399                                     resource_size(regs));
 400        if (!at91_rtc_regs) {
 401                dev_err(&pdev->dev, "failed to map registers, aborting.\n");
 402                return -ENOMEM;
 403        }
 404
 405        rtc = devm_rtc_allocate_device(&pdev->dev);
 406        if (IS_ERR(rtc))
 407                return PTR_ERR(rtc);
 408        platform_set_drvdata(pdev, rtc);
 409
 410        sclk = devm_clk_get(&pdev->dev, NULL);
 411        if (IS_ERR(sclk))
 412                return PTR_ERR(sclk);
 413
 414        ret = clk_prepare_enable(sclk);
 415        if (ret) {
 416                dev_err(&pdev->dev, "Could not enable slow clock\n");
 417                return ret;
 418        }
 419
 420        at91_rtc_write(AT91_RTC_CR, 0);
 421        at91_rtc_write(AT91_RTC_MR, 0);         /* 24 hour mode */
 422
 423        /* Disable all interrupts */
 424        at91_rtc_write_idr(AT91_RTC_ACKUPD | AT91_RTC_ALARM |
 425                                        AT91_RTC_SECEV | AT91_RTC_TIMEV |
 426                                        AT91_RTC_CALEV);
 427
 428        ret = devm_request_irq(&pdev->dev, irq, at91_rtc_interrupt,
 429                               IRQF_SHARED | IRQF_COND_SUSPEND,
 430                               "at91_rtc", pdev);
 431        if (ret) {
 432                dev_err(&pdev->dev, "IRQ %d already in use.\n", irq);
 433                goto err_clk;
 434        }
 435
 436        /* cpu init code should really have flagged this device as
 437         * being wake-capable; if it didn't, do that here.
 438         */
 439        if (!device_can_wakeup(&pdev->dev))
 440                device_init_wakeup(&pdev->dev, 1);
 441
 442        rtc->ops = &at91_rtc_ops;
 443        ret = rtc_register_device(rtc);
 444        if (ret)
 445                goto err_clk;
 446
 447        /* enable SECEV interrupt in order to initialize at91_rtc_upd_rdy
 448         * completion.
 449         */
 450        at91_rtc_write_ier(AT91_RTC_SECEV);
 451
 452        dev_info(&pdev->dev, "AT91 Real Time Clock driver.\n");
 453        return 0;
 454
 455err_clk:
 456        clk_disable_unprepare(sclk);
 457
 458        return ret;
 459}
 460
 461/*
 462 * Disable and remove the RTC driver
 463 */
 464static int __exit at91_rtc_remove(struct platform_device *pdev)
 465{
 466        /* Disable all interrupts */
 467        at91_rtc_write_idr(AT91_RTC_ACKUPD | AT91_RTC_ALARM |
 468                                        AT91_RTC_SECEV | AT91_RTC_TIMEV |
 469                                        AT91_RTC_CALEV);
 470
 471        clk_disable_unprepare(sclk);
 472
 473        return 0;
 474}
 475
 476static void at91_rtc_shutdown(struct platform_device *pdev)
 477{
 478        /* Disable all interrupts */
 479        at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM |
 480                                        AT91_RTC_SECEV | AT91_RTC_TIMEV |
 481                                        AT91_RTC_CALEV);
 482}
 483
 484#ifdef CONFIG_PM_SLEEP
 485
 486/* AT91RM9200 RTC Power management control */
 487
 488static int at91_rtc_suspend(struct device *dev)
 489{
 490        /* this IRQ is shared with DBGU and other hardware which isn't
 491         * necessarily doing PM like we are...
 492         */
 493        at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM);
 494
 495        at91_rtc_imr = at91_rtc_read_imr()
 496                        & (AT91_RTC_ALARM|AT91_RTC_SECEV);
 497        if (at91_rtc_imr) {
 498                if (device_may_wakeup(dev)) {
 499                        unsigned long flags;
 500
 501                        enable_irq_wake(irq);
 502
 503                        spin_lock_irqsave(&suspended_lock, flags);
 504                        suspended = true;
 505                        spin_unlock_irqrestore(&suspended_lock, flags);
 506                } else {
 507                        at91_rtc_write_idr(at91_rtc_imr);
 508                }
 509        }
 510        return 0;
 511}
 512
 513static int at91_rtc_resume(struct device *dev)
 514{
 515        struct rtc_device *rtc = dev_get_drvdata(dev);
 516
 517        if (at91_rtc_imr) {
 518                if (device_may_wakeup(dev)) {
 519                        unsigned long flags;
 520
 521                        spin_lock_irqsave(&suspended_lock, flags);
 522
 523                        if (cached_events) {
 524                                rtc_update_irq(rtc, 1, cached_events);
 525                                cached_events = 0;
 526                        }
 527
 528                        suspended = false;
 529                        spin_unlock_irqrestore(&suspended_lock, flags);
 530
 531                        disable_irq_wake(irq);
 532                }
 533                at91_rtc_write_ier(at91_rtc_imr);
 534        }
 535        return 0;
 536}
 537#endif
 538
 539static SIMPLE_DEV_PM_OPS(at91_rtc_pm_ops, at91_rtc_suspend, at91_rtc_resume);
 540
 541static struct platform_driver at91_rtc_driver = {
 542        .remove         = __exit_p(at91_rtc_remove),
 543        .shutdown       = at91_rtc_shutdown,
 544        .driver         = {
 545                .name   = "at91_rtc",
 546                .pm     = &at91_rtc_pm_ops,
 547                .of_match_table = of_match_ptr(at91_rtc_dt_ids),
 548        },
 549};
 550
 551module_platform_driver_probe(at91_rtc_driver, at91_rtc_probe);
 552
 553MODULE_AUTHOR("Rick Bronson");
 554MODULE_DESCRIPTION("RTC driver for Atmel AT91RM9200");
 555MODULE_LICENSE("GPL");
 556MODULE_ALIAS("platform:at91_rtc");
 557