linux/drivers/rtc/rtc-m41t80.c
<<
>>
Prefs
   1/*
   2 * I2C client/driver for the ST M41T80 family of i2c rtc chips.
   3 *
   4 * Author: Alexander Bigga <ab@mycable.de>
   5 *
   6 * Based on m41t00.c by Mark A. Greer <mgreer@mvista.com>
   7 *
   8 * 2006 (c) mycable GmbH
   9 *
  10 * This program is free software; you can redistribute it and/or modify
  11 * it under the terms of the GNU General Public License version 2 as
  12 * published by the Free Software Foundation.
  13 *
  14 */
  15
  16#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  17
  18#include <linux/bcd.h>
  19#include <linux/i2c.h>
  20#include <linux/init.h>
  21#include <linux/kernel.h>
  22#include <linux/module.h>
  23#include <linux/rtc.h>
  24#include <linux/slab.h>
  25#include <linux/mutex.h>
  26#include <linux/string.h>
  27#ifdef CONFIG_RTC_DRV_M41T80_WDT
  28#include <linux/fs.h>
  29#include <linux/ioctl.h>
  30#include <linux/miscdevice.h>
  31#include <linux/reboot.h>
  32#include <linux/watchdog.h>
  33#endif
  34
  35#define M41T80_REG_SSEC         0x00
  36#define M41T80_REG_SEC          0x01
  37#define M41T80_REG_MIN          0x02
  38#define M41T80_REG_HOUR         0x03
  39#define M41T80_REG_WDAY         0x04
  40#define M41T80_REG_DAY          0x05
  41#define M41T80_REG_MON          0x06
  42#define M41T80_REG_YEAR         0x07
  43#define M41T80_REG_ALARM_MON    0x0a
  44#define M41T80_REG_ALARM_DAY    0x0b
  45#define M41T80_REG_ALARM_HOUR   0x0c
  46#define M41T80_REG_ALARM_MIN    0x0d
  47#define M41T80_REG_ALARM_SEC    0x0e
  48#define M41T80_REG_FLAGS        0x0f
  49#define M41T80_REG_SQW          0x13
  50
  51#define M41T80_DATETIME_REG_SIZE        (M41T80_REG_YEAR + 1)
  52#define M41T80_ALARM_REG_SIZE   \
  53        (M41T80_REG_ALARM_SEC + 1 - M41T80_REG_ALARM_MON)
  54
  55#define M41T80_SEC_ST           BIT(7)  /* ST: Stop Bit */
  56#define M41T80_ALMON_AFE        BIT(7)  /* AFE: AF Enable Bit */
  57#define M41T80_ALMON_SQWE       BIT(6)  /* SQWE: SQW Enable Bit */
  58#define M41T80_ALHOUR_HT        BIT(6)  /* HT: Halt Update Bit */
  59#define M41T80_FLAGS_OF         BIT(2)  /* OF: Oscillator Failure Bit */
  60#define M41T80_FLAGS_AF         BIT(6)  /* AF: Alarm Flag Bit */
  61#define M41T80_FLAGS_BATT_LOW   BIT(4)  /* BL: Battery Low Bit */
  62#define M41T80_WATCHDOG_RB2     BIT(7)  /* RB: Watchdog resolution */
  63#define M41T80_WATCHDOG_RB1     BIT(1)  /* RB: Watchdog resolution */
  64#define M41T80_WATCHDOG_RB0     BIT(0)  /* RB: Watchdog resolution */
  65
  66#define M41T80_FEATURE_HT       BIT(0)  /* Halt feature */
  67#define M41T80_FEATURE_BL       BIT(1)  /* Battery low indicator */
  68#define M41T80_FEATURE_SQ       BIT(2)  /* Squarewave feature */
  69#define M41T80_FEATURE_WD       BIT(3)  /* Extra watchdog resolution */
  70#define M41T80_FEATURE_SQ_ALT   BIT(4)  /* RSx bits are in reg 4 */
  71
  72static DEFINE_MUTEX(m41t80_rtc_mutex);
  73static const struct i2c_device_id m41t80_id[] = {
  74        { "m41t62", M41T80_FEATURE_SQ | M41T80_FEATURE_SQ_ALT },
  75        { "m41t65", M41T80_FEATURE_HT | M41T80_FEATURE_WD },
  76        { "m41t80", M41T80_FEATURE_SQ },
  77        { "m41t81", M41T80_FEATURE_HT | M41T80_FEATURE_SQ},
  78        { "m41t81s", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
  79        { "m41t82", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
  80        { "m41t83", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
  81        { "m41st84", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
  82        { "m41st85", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
  83        { "m41st87", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
  84        { "rv4162", M41T80_FEATURE_SQ | M41T80_FEATURE_WD | M41T80_FEATURE_SQ_ALT },
  85        { }
  86};
  87MODULE_DEVICE_TABLE(i2c, m41t80_id);
  88
  89struct m41t80_data {
  90        u8 features;
  91        struct rtc_device *rtc;
  92};
  93
  94static irqreturn_t m41t80_handle_irq(int irq, void *dev_id)
  95{
  96        struct i2c_client *client = dev_id;
  97        struct m41t80_data *m41t80 = i2c_get_clientdata(client);
  98        struct mutex *lock = &m41t80->rtc->ops_lock;
  99        unsigned long events = 0;
 100        int flags, flags_afe;
 101
 102        mutex_lock(lock);
 103
 104        flags_afe = i2c_smbus_read_byte_data(client, M41T80_REG_ALARM_MON);
 105        if (flags_afe < 0) {
 106                mutex_unlock(lock);
 107                return IRQ_NONE;
 108        }
 109
 110        flags = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS);
 111        if (flags <= 0) {
 112                mutex_unlock(lock);
 113                return IRQ_NONE;
 114        }
 115
 116        if (flags & M41T80_FLAGS_AF) {
 117                flags &= ~M41T80_FLAGS_AF;
 118                flags_afe &= ~M41T80_ALMON_AFE;
 119                events |= RTC_AF;
 120        }
 121
 122        if (events) {
 123                rtc_update_irq(m41t80->rtc, 1, events);
 124                i2c_smbus_write_byte_data(client, M41T80_REG_FLAGS, flags);
 125                i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_MON,
 126                                          flags_afe);
 127        }
 128
 129        mutex_unlock(lock);
 130
 131        return IRQ_HANDLED;
 132}
 133
 134static int m41t80_get_datetime(struct i2c_client *client,
 135                               struct rtc_time *tm)
 136{
 137        unsigned char buf[8];
 138        int err, flags;
 139
 140        flags = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS);
 141        if (flags < 0)
 142                return flags;
 143
 144        if (flags & M41T80_FLAGS_OF) {
 145                dev_err(&client->dev, "Oscillator failure, data is invalid.\n");
 146                return -EINVAL;
 147        }
 148
 149        err = i2c_smbus_read_i2c_block_data(client, M41T80_REG_SSEC,
 150                                            sizeof(buf), buf);
 151        if (err < 0) {
 152                dev_err(&client->dev, "Unable to read date\n");
 153                return -EIO;
 154        }
 155
 156        tm->tm_sec = bcd2bin(buf[M41T80_REG_SEC] & 0x7f);
 157        tm->tm_min = bcd2bin(buf[M41T80_REG_MIN] & 0x7f);
 158        tm->tm_hour = bcd2bin(buf[M41T80_REG_HOUR] & 0x3f);
 159        tm->tm_mday = bcd2bin(buf[M41T80_REG_DAY] & 0x3f);
 160        tm->tm_wday = buf[M41T80_REG_WDAY] & 0x07;
 161        tm->tm_mon = bcd2bin(buf[M41T80_REG_MON] & 0x1f) - 1;
 162
 163        /* assume 20YY not 19YY, and ignore the Century Bit */
 164        tm->tm_year = bcd2bin(buf[M41T80_REG_YEAR]) + 100;
 165        return rtc_valid_tm(tm);
 166}
 167
 168/* Sets the given date and time to the real time clock. */
 169static int m41t80_set_datetime(struct i2c_client *client, struct rtc_time *tm)
 170{
 171        unsigned char buf[8];
 172        int err, flags;
 173
 174        if (tm->tm_year < 100 || tm->tm_year > 199)
 175                return -EINVAL;
 176
 177        buf[M41T80_REG_SSEC] = 0;
 178        buf[M41T80_REG_SEC] = bin2bcd(tm->tm_sec);
 179        buf[M41T80_REG_MIN] = bin2bcd(tm->tm_min);
 180        buf[M41T80_REG_HOUR] = bin2bcd(tm->tm_hour);
 181        buf[M41T80_REG_DAY] = bin2bcd(tm->tm_mday);
 182        buf[M41T80_REG_MON] = bin2bcd(tm->tm_mon + 1);
 183        buf[M41T80_REG_YEAR] = bin2bcd(tm->tm_year - 100);
 184        buf[M41T80_REG_WDAY] = tm->tm_wday;
 185
 186        err = i2c_smbus_write_i2c_block_data(client, M41T80_REG_SSEC,
 187                                             sizeof(buf), buf);
 188        if (err < 0) {
 189                dev_err(&client->dev, "Unable to write to date registers\n");
 190                return err;
 191        }
 192
 193        /* Clear the OF bit of Flags Register */
 194        flags = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS);
 195        if (flags < 0)
 196                return flags;
 197
 198        if (i2c_smbus_write_byte_data(client, M41T80_REG_FLAGS,
 199                                      flags & ~M41T80_FLAGS_OF)) {
 200                dev_err(&client->dev, "Unable to write flags register\n");
 201                return -EIO;
 202        }
 203
 204        return err;
 205}
 206
 207static int m41t80_rtc_proc(struct device *dev, struct seq_file *seq)
 208{
 209        struct i2c_client *client = to_i2c_client(dev);
 210        struct m41t80_data *clientdata = i2c_get_clientdata(client);
 211        u8 reg;
 212
 213        if (clientdata->features & M41T80_FEATURE_BL) {
 214                reg = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS);
 215                seq_printf(seq, "battery\t\t: %s\n",
 216                           (reg & M41T80_FLAGS_BATT_LOW) ? "exhausted" : "ok");
 217        }
 218        return 0;
 219}
 220
 221static int m41t80_rtc_read_time(struct device *dev, struct rtc_time *tm)
 222{
 223        return m41t80_get_datetime(to_i2c_client(dev), tm);
 224}
 225
 226static int m41t80_rtc_set_time(struct device *dev, struct rtc_time *tm)
 227{
 228        return m41t80_set_datetime(to_i2c_client(dev), tm);
 229}
 230
 231static int m41t80_alarm_irq_enable(struct device *dev, unsigned int enabled)
 232{
 233        struct i2c_client *client = to_i2c_client(dev);
 234        int flags, retval;
 235
 236        flags = i2c_smbus_read_byte_data(client, M41T80_REG_ALARM_MON);
 237        if (flags < 0)
 238                return flags;
 239
 240        if (enabled)
 241                flags |= M41T80_ALMON_AFE;
 242        else
 243                flags &= ~M41T80_ALMON_AFE;
 244
 245        retval = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_MON, flags);
 246        if (retval < 0) {
 247                dev_err(dev, "Unable to enable alarm IRQ %d\n", retval);
 248                return retval;
 249        }
 250        return 0;
 251}
 252
 253static int m41t80_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
 254{
 255        struct i2c_client *client = to_i2c_client(dev);
 256        u8 alarmvals[5];
 257        int ret, err;
 258
 259        alarmvals[0] = bin2bcd(alrm->time.tm_mon + 1);
 260        alarmvals[1] = bin2bcd(alrm->time.tm_mday);
 261        alarmvals[2] = bin2bcd(alrm->time.tm_hour);
 262        alarmvals[3] = bin2bcd(alrm->time.tm_min);
 263        alarmvals[4] = bin2bcd(alrm->time.tm_sec);
 264
 265        /* Clear AF and AFE flags */
 266        ret = i2c_smbus_read_byte_data(client, M41T80_REG_ALARM_MON);
 267        if (ret < 0)
 268                return ret;
 269        err = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_MON,
 270                                        ret & ~(M41T80_ALMON_AFE));
 271        if (err < 0) {
 272                dev_err(dev, "Unable to clear AFE bit\n");
 273                return err;
 274        }
 275
 276        ret = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS);
 277        if (ret < 0)
 278                return ret;
 279
 280        err = i2c_smbus_write_byte_data(client, M41T80_REG_FLAGS,
 281                                        ret & ~(M41T80_FLAGS_AF));
 282        if (err < 0) {
 283                dev_err(dev, "Unable to clear AF bit\n");
 284                return err;
 285        }
 286
 287        /* Write the alarm */
 288        err = i2c_smbus_write_i2c_block_data(client, M41T80_REG_ALARM_MON,
 289                                             5, alarmvals);
 290        if (err)
 291                return err;
 292
 293        /* Enable the alarm interrupt */
 294        if (alrm->enabled) {
 295                alarmvals[0] |= M41T80_ALMON_AFE;
 296                err = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_MON,
 297                                                alarmvals[0]);
 298                if (err)
 299                        return err;
 300        }
 301
 302        return 0;
 303}
 304
 305static int m41t80_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
 306{
 307        struct i2c_client *client = to_i2c_client(dev);
 308        u8 alarmvals[5];
 309        int flags, ret;
 310
 311        ret = i2c_smbus_read_i2c_block_data(client, M41T80_REG_ALARM_MON,
 312                                            5, alarmvals);
 313        if (ret != 5)
 314                return ret < 0 ? ret : -EIO;
 315
 316        flags = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS);
 317        if (flags < 0)
 318                return flags;
 319
 320        alrm->time.tm_sec  = bcd2bin(alarmvals[4] & 0x7f);
 321        alrm->time.tm_min  = bcd2bin(alarmvals[3] & 0x7f);
 322        alrm->time.tm_hour = bcd2bin(alarmvals[2] & 0x3f);
 323        alrm->time.tm_mday = bcd2bin(alarmvals[1] & 0x3f);
 324        alrm->time.tm_mon  = bcd2bin(alarmvals[0] & 0x3f);
 325
 326        alrm->enabled = !!(alarmvals[0] & M41T80_ALMON_AFE);
 327        alrm->pending = (flags & M41T80_FLAGS_AF) && alrm->enabled;
 328
 329        return 0;
 330}
 331
 332static struct rtc_class_ops m41t80_rtc_ops = {
 333        .read_time = m41t80_rtc_read_time,
 334        .set_time = m41t80_rtc_set_time,
 335        .proc = m41t80_rtc_proc,
 336};
 337
 338#ifdef CONFIG_PM_SLEEP
 339static int m41t80_suspend(struct device *dev)
 340{
 341        struct i2c_client *client = to_i2c_client(dev);
 342
 343        if (client->irq >= 0 && device_may_wakeup(dev))
 344                enable_irq_wake(client->irq);
 345
 346        return 0;
 347}
 348
 349static int m41t80_resume(struct device *dev)
 350{
 351        struct i2c_client *client = to_i2c_client(dev);
 352
 353        if (client->irq >= 0 && device_may_wakeup(dev))
 354                disable_irq_wake(client->irq);
 355
 356        return 0;
 357}
 358#endif
 359
 360static SIMPLE_DEV_PM_OPS(m41t80_pm, m41t80_suspend, m41t80_resume);
 361
 362static ssize_t flags_show(struct device *dev,
 363                          struct device_attribute *attr, char *buf)
 364{
 365        struct i2c_client *client = to_i2c_client(dev);
 366        int val;
 367
 368        val = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS);
 369        if (val < 0)
 370                return val;
 371        return sprintf(buf, "%#x\n", val);
 372}
 373static DEVICE_ATTR_RO(flags);
 374
 375static ssize_t sqwfreq_show(struct device *dev,
 376                            struct device_attribute *attr, char *buf)
 377{
 378        struct i2c_client *client = to_i2c_client(dev);
 379        struct m41t80_data *clientdata = i2c_get_clientdata(client);
 380        int val, reg_sqw;
 381
 382        if (!(clientdata->features & M41T80_FEATURE_SQ))
 383                return -EINVAL;
 384
 385        reg_sqw = M41T80_REG_SQW;
 386        if (clientdata->features & M41T80_FEATURE_SQ_ALT)
 387                reg_sqw = M41T80_REG_WDAY;
 388        val = i2c_smbus_read_byte_data(client, reg_sqw);
 389        if (val < 0)
 390                return val;
 391        val = (val >> 4) & 0xf;
 392        switch (val) {
 393        case 0:
 394                break;
 395        case 1:
 396                val = 32768;
 397                break;
 398        default:
 399                val = 32768 >> val;
 400        }
 401        return sprintf(buf, "%d\n", val);
 402}
 403
 404static ssize_t sqwfreq_store(struct device *dev,
 405                             struct device_attribute *attr,
 406                             const char *buf, size_t count)
 407{
 408        struct i2c_client *client = to_i2c_client(dev);
 409        struct m41t80_data *clientdata = i2c_get_clientdata(client);
 410        int almon, sqw, reg_sqw, rc;
 411        unsigned long val;
 412
 413        rc = kstrtoul(buf, 0, &val);
 414        if (rc < 0)
 415                return rc;
 416
 417        if (!(clientdata->features & M41T80_FEATURE_SQ))
 418                return -EINVAL;
 419
 420        if (val) {
 421                if (!is_power_of_2(val))
 422                        return -EINVAL;
 423                val = ilog2(val);
 424                if (val == 15)
 425                        val = 1;
 426                else if (val < 14)
 427                        val = 15 - val;
 428                else
 429                        return -EINVAL;
 430        }
 431        /* disable SQW, set SQW frequency & re-enable */
 432        almon = i2c_smbus_read_byte_data(client, M41T80_REG_ALARM_MON);
 433        if (almon < 0)
 434                return almon;
 435        reg_sqw = M41T80_REG_SQW;
 436        if (clientdata->features & M41T80_FEATURE_SQ_ALT)
 437                reg_sqw = M41T80_REG_WDAY;
 438        sqw = i2c_smbus_read_byte_data(client, reg_sqw);
 439        if (sqw < 0)
 440                return sqw;
 441        sqw = (sqw & 0x0f) | (val << 4);
 442
 443        rc = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_MON,
 444                                       almon & ~M41T80_ALMON_SQWE);
 445        if (rc < 0)
 446                return rc;
 447
 448        if (val) {
 449                rc = i2c_smbus_write_byte_data(client, reg_sqw, sqw);
 450                if (rc < 0)
 451                        return rc;
 452
 453                rc = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_MON,
 454                                               almon | M41T80_ALMON_SQWE);
 455                if (rc < 0)
 456                        return rc;
 457        }
 458        return count;
 459}
 460static DEVICE_ATTR_RW(sqwfreq);
 461
 462static struct attribute *attrs[] = {
 463        &dev_attr_flags.attr,
 464        &dev_attr_sqwfreq.attr,
 465        NULL,
 466};
 467
 468static struct attribute_group attr_group = {
 469        .attrs = attrs,
 470};
 471
 472#ifdef CONFIG_RTC_DRV_M41T80_WDT
 473/*
 474 *****************************************************************************
 475 *
 476 * Watchdog Driver
 477 *
 478 *****************************************************************************
 479 */
 480static struct i2c_client *save_client;
 481
 482/* Default margin */
 483#define WD_TIMO 60              /* 1..31 seconds */
 484
 485static int wdt_margin = WD_TIMO;
 486module_param(wdt_margin, int, 0);
 487MODULE_PARM_DESC(wdt_margin, "Watchdog timeout in seconds (default 60s)");
 488
 489static unsigned long wdt_is_open;
 490static int boot_flag;
 491
 492/**
 493 *      wdt_ping:
 494 *
 495 *      Reload counter one with the watchdog timeout. We don't bother reloading
 496 *      the cascade counter.
 497 */
 498static void wdt_ping(void)
 499{
 500        unsigned char i2c_data[2];
 501        struct i2c_msg msgs1[1] = {
 502                {
 503                        .addr   = save_client->addr,
 504                        .flags  = 0,
 505                        .len    = 2,
 506                        .buf    = i2c_data,
 507                },
 508        };
 509        struct m41t80_data *clientdata = i2c_get_clientdata(save_client);
 510
 511        i2c_data[0] = 0x09;             /* watchdog register */
 512
 513        if (wdt_margin > 31)
 514                i2c_data[1] = (wdt_margin & 0xFC) | 0x83; /* resolution = 4s */
 515        else
 516                /*
 517                 * WDS = 1 (0x80), mulitplier = WD_TIMO, resolution = 1s (0x02)
 518                 */
 519                i2c_data[1] = wdt_margin << 2 | 0x82;
 520
 521        /*
 522         * M41T65 has three bits for watchdog resolution.  Don't set bit 7, as
 523         * that would be an invalid resolution.
 524         */
 525        if (clientdata->features & M41T80_FEATURE_WD)
 526                i2c_data[1] &= ~M41T80_WATCHDOG_RB2;
 527
 528        i2c_transfer(save_client->adapter, msgs1, 1);
 529}
 530
 531/**
 532 *      wdt_disable:
 533 *
 534 *      disables watchdog.
 535 */
 536static void wdt_disable(void)
 537{
 538        unsigned char i2c_data[2], i2c_buf[0x10];
 539        struct i2c_msg msgs0[2] = {
 540                {
 541                        .addr   = save_client->addr,
 542                        .flags  = 0,
 543                        .len    = 1,
 544                        .buf    = i2c_data,
 545                },
 546                {
 547                        .addr   = save_client->addr,
 548                        .flags  = I2C_M_RD,
 549                        .len    = 1,
 550                        .buf    = i2c_buf,
 551                },
 552        };
 553        struct i2c_msg msgs1[1] = {
 554                {
 555                        .addr   = save_client->addr,
 556                        .flags  = 0,
 557                        .len    = 2,
 558                        .buf    = i2c_data,
 559                },
 560        };
 561
 562        i2c_data[0] = 0x09;
 563        i2c_transfer(save_client->adapter, msgs0, 2);
 564
 565        i2c_data[0] = 0x09;
 566        i2c_data[1] = 0x00;
 567        i2c_transfer(save_client->adapter, msgs1, 1);
 568}
 569
 570/**
 571 *      wdt_write:
 572 *      @file: file handle to the watchdog
 573 *      @buf: buffer to write (unused as data does not matter here
 574 *      @count: count of bytes
 575 *      @ppos: pointer to the position to write. No seeks allowed
 576 *
 577 *      A write to a watchdog device is defined as a keepalive signal. Any
 578 *      write of data will do, as we we don't define content meaning.
 579 */
 580static ssize_t wdt_write(struct file *file, const char __user *buf,
 581                         size_t count, loff_t *ppos)
 582{
 583        if (count) {
 584                wdt_ping();
 585                return 1;
 586        }
 587        return 0;
 588}
 589
 590static ssize_t wdt_read(struct file *file, char __user *buf,
 591                        size_t count, loff_t *ppos)
 592{
 593        return 0;
 594}
 595
 596/**
 597 *      wdt_ioctl:
 598 *      @inode: inode of the device
 599 *      @file: file handle to the device
 600 *      @cmd: watchdog command
 601 *      @arg: argument pointer
 602 *
 603 *      The watchdog API defines a common set of functions for all watchdogs
 604 *      according to their available features. We only actually usefully support
 605 *      querying capabilities and current status.
 606 */
 607static int wdt_ioctl(struct file *file, unsigned int cmd,
 608                     unsigned long arg)
 609{
 610        int new_margin, rv;
 611        static struct watchdog_info ident = {
 612                .options = WDIOF_POWERUNDER | WDIOF_KEEPALIVEPING |
 613                        WDIOF_SETTIMEOUT,
 614                .firmware_version = 1,
 615                .identity = "M41T80 WTD"
 616        };
 617
 618        switch (cmd) {
 619        case WDIOC_GETSUPPORT:
 620                return copy_to_user((struct watchdog_info __user *)arg, &ident,
 621                                    sizeof(ident)) ? -EFAULT : 0;
 622
 623        case WDIOC_GETSTATUS:
 624        case WDIOC_GETBOOTSTATUS:
 625                return put_user(boot_flag, (int __user *)arg);
 626        case WDIOC_KEEPALIVE:
 627                wdt_ping();
 628                return 0;
 629        case WDIOC_SETTIMEOUT:
 630                if (get_user(new_margin, (int __user *)arg))
 631                        return -EFAULT;
 632                /* Arbitrary, can't find the card's limits */
 633                if (new_margin < 1 || new_margin > 124)
 634                        return -EINVAL;
 635                wdt_margin = new_margin;
 636                wdt_ping();
 637                /* Fall */
 638        case WDIOC_GETTIMEOUT:
 639                return put_user(wdt_margin, (int __user *)arg);
 640
 641        case WDIOC_SETOPTIONS:
 642                if (copy_from_user(&rv, (int __user *)arg, sizeof(int)))
 643                        return -EFAULT;
 644
 645                if (rv & WDIOS_DISABLECARD) {
 646                        pr_info("disable watchdog\n");
 647                        wdt_disable();
 648                }
 649
 650                if (rv & WDIOS_ENABLECARD) {
 651                        pr_info("enable watchdog\n");
 652                        wdt_ping();
 653                }
 654
 655                return -EINVAL;
 656        }
 657        return -ENOTTY;
 658}
 659
 660static long wdt_unlocked_ioctl(struct file *file, unsigned int cmd,
 661                               unsigned long arg)
 662{
 663        int ret;
 664
 665        mutex_lock(&m41t80_rtc_mutex);
 666        ret = wdt_ioctl(file, cmd, arg);
 667        mutex_unlock(&m41t80_rtc_mutex);
 668
 669        return ret;
 670}
 671
 672/**
 673 *      wdt_open:
 674 *      @inode: inode of device
 675 *      @file: file handle to device
 676 *
 677 */
 678static int wdt_open(struct inode *inode, struct file *file)
 679{
 680        if (MINOR(inode->i_rdev) == WATCHDOG_MINOR) {
 681                mutex_lock(&m41t80_rtc_mutex);
 682                if (test_and_set_bit(0, &wdt_is_open)) {
 683                        mutex_unlock(&m41t80_rtc_mutex);
 684                        return -EBUSY;
 685                }
 686                /*
 687                 *      Activate
 688                 */
 689                wdt_is_open = 1;
 690                mutex_unlock(&m41t80_rtc_mutex);
 691                return nonseekable_open(inode, file);
 692        }
 693        return -ENODEV;
 694}
 695
 696/**
 697 *      wdt_close:
 698 *      @inode: inode to board
 699 *      @file: file handle to board
 700 *
 701 */
 702static int wdt_release(struct inode *inode, struct file *file)
 703{
 704        if (MINOR(inode->i_rdev) == WATCHDOG_MINOR)
 705                clear_bit(0, &wdt_is_open);
 706        return 0;
 707}
 708
 709/**
 710 *      notify_sys:
 711 *      @this: our notifier block
 712 *      @code: the event being reported
 713 *      @unused: unused
 714 *
 715 *      Our notifier is called on system shutdowns. We want to turn the card
 716 *      off at reboot otherwise the machine will reboot again during memory
 717 *      test or worse yet during the following fsck. This would suck, in fact
 718 *      trust me - if it happens it does suck.
 719 */
 720static int wdt_notify_sys(struct notifier_block *this, unsigned long code,
 721                          void *unused)
 722{
 723        if (code == SYS_DOWN || code == SYS_HALT)
 724                /* Disable Watchdog */
 725                wdt_disable();
 726        return NOTIFY_DONE;
 727}
 728
 729static const struct file_operations wdt_fops = {
 730        .owner  = THIS_MODULE,
 731        .read   = wdt_read,
 732        .unlocked_ioctl = wdt_unlocked_ioctl,
 733        .write  = wdt_write,
 734        .open   = wdt_open,
 735        .release = wdt_release,
 736        .llseek = no_llseek,
 737};
 738
 739static struct miscdevice wdt_dev = {
 740        .minor = WATCHDOG_MINOR,
 741        .name = "watchdog",
 742        .fops = &wdt_fops,
 743};
 744
 745/*
 746 *      The WDT card needs to learn about soft shutdowns in order to
 747 *      turn the timebomb registers off.
 748 */
 749static struct notifier_block wdt_notifier = {
 750        .notifier_call = wdt_notify_sys,
 751};
 752#endif /* CONFIG_RTC_DRV_M41T80_WDT */
 753
 754/*
 755 *****************************************************************************
 756 *
 757 *      Driver Interface
 758 *
 759 *****************************************************************************
 760 */
 761
 762static void m41t80_remove_sysfs_group(void *_dev)
 763{
 764        struct device *dev = _dev;
 765
 766        sysfs_remove_group(&dev->kobj, &attr_group);
 767}
 768
 769static int m41t80_probe(struct i2c_client *client,
 770                        const struct i2c_device_id *id)
 771{
 772        struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
 773        int rc = 0;
 774        struct rtc_device *rtc = NULL;
 775        struct rtc_time tm;
 776        struct m41t80_data *m41t80_data = NULL;
 777
 778        if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK |
 779                                     I2C_FUNC_SMBUS_BYTE_DATA)) {
 780                dev_err(&adapter->dev, "doesn't support I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_I2C_BLOCK\n");
 781                return -ENODEV;
 782        }
 783
 784        m41t80_data = devm_kzalloc(&client->dev, sizeof(*m41t80_data),
 785                                   GFP_KERNEL);
 786        if (!m41t80_data)
 787                return -ENOMEM;
 788
 789        m41t80_data->features = id->driver_data;
 790        i2c_set_clientdata(client, m41t80_data);
 791
 792        if (client->irq > 0) {
 793                rc = devm_request_threaded_irq(&client->dev, client->irq,
 794                                               NULL, m41t80_handle_irq,
 795                                               IRQF_TRIGGER_LOW | IRQF_ONESHOT,
 796                                               "m41t80", client);
 797                if (rc) {
 798                        dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n");
 799                        client->irq = 0;
 800                } else {
 801                        m41t80_rtc_ops.read_alarm = m41t80_read_alarm;
 802                        m41t80_rtc_ops.set_alarm = m41t80_set_alarm;
 803                        m41t80_rtc_ops.alarm_irq_enable = m41t80_alarm_irq_enable;
 804                        /* Enable the wakealarm */
 805                        device_init_wakeup(&client->dev, true);
 806                }
 807        }
 808
 809        rtc = devm_rtc_device_register(&client->dev, client->name,
 810                                       &m41t80_rtc_ops, THIS_MODULE);
 811        if (IS_ERR(rtc))
 812                return PTR_ERR(rtc);
 813
 814        m41t80_data->rtc = rtc;
 815
 816        /* Make sure HT (Halt Update) bit is cleared */
 817        rc = i2c_smbus_read_byte_data(client, M41T80_REG_ALARM_HOUR);
 818
 819        if (rc >= 0 && rc & M41T80_ALHOUR_HT) {
 820                if (m41t80_data->features & M41T80_FEATURE_HT) {
 821                        m41t80_get_datetime(client, &tm);
 822                        dev_info(&client->dev, "HT bit was set!\n");
 823                        dev_info(&client->dev,
 824                                 "Power Down at %04i-%02i-%02i %02i:%02i:%02i\n",
 825                                 tm.tm_year + 1900,
 826                                 tm.tm_mon + 1, tm.tm_mday, tm.tm_hour,
 827                                 tm.tm_min, tm.tm_sec);
 828                }
 829                rc = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_HOUR,
 830                                               rc & ~M41T80_ALHOUR_HT);
 831        }
 832
 833        if (rc < 0) {
 834                dev_err(&client->dev, "Can't clear HT bit\n");
 835                return rc;
 836        }
 837
 838        /* Make sure ST (stop) bit is cleared */
 839        rc = i2c_smbus_read_byte_data(client, M41T80_REG_SEC);
 840
 841        if (rc >= 0 && rc & M41T80_SEC_ST)
 842                rc = i2c_smbus_write_byte_data(client, M41T80_REG_SEC,
 843                                               rc & ~M41T80_SEC_ST);
 844        if (rc < 0) {
 845                dev_err(&client->dev, "Can't clear ST bit\n");
 846                return rc;
 847        }
 848
 849        /* Export sysfs entries */
 850        rc = sysfs_create_group(&(&client->dev)->kobj, &attr_group);
 851        if (rc) {
 852                dev_err(&client->dev, "Failed to create sysfs group: %d\n", rc);
 853                return rc;
 854        }
 855
 856        rc = devm_add_action_or_reset(&client->dev, m41t80_remove_sysfs_group,
 857                                      &client->dev);
 858        if (rc) {
 859                dev_err(&client->dev,
 860                        "Failed to add sysfs cleanup action: %d\n", rc);
 861                return rc;
 862        }
 863
 864#ifdef CONFIG_RTC_DRV_M41T80_WDT
 865        if (m41t80_data->features & M41T80_FEATURE_HT) {
 866                save_client = client;
 867                rc = misc_register(&wdt_dev);
 868                if (rc)
 869                        return rc;
 870                rc = register_reboot_notifier(&wdt_notifier);
 871                if (rc) {
 872                        misc_deregister(&wdt_dev);
 873                        return rc;
 874                }
 875        }
 876#endif
 877        return 0;
 878}
 879
 880static int m41t80_remove(struct i2c_client *client)
 881{
 882#ifdef CONFIG_RTC_DRV_M41T80_WDT
 883        struct m41t80_data *clientdata = i2c_get_clientdata(client);
 884
 885        if (clientdata->features & M41T80_FEATURE_HT) {
 886                misc_deregister(&wdt_dev);
 887                unregister_reboot_notifier(&wdt_notifier);
 888        }
 889#endif
 890
 891        return 0;
 892}
 893
 894static struct i2c_driver m41t80_driver = {
 895        .driver = {
 896                .name = "rtc-m41t80",
 897                .pm = &m41t80_pm,
 898        },
 899        .probe = m41t80_probe,
 900        .remove = m41t80_remove,
 901        .id_table = m41t80_id,
 902};
 903
 904module_i2c_driver(m41t80_driver);
 905
 906MODULE_AUTHOR("Alexander Bigga <ab@mycable.de>");
 907MODULE_DESCRIPTION("ST Microelectronics M41T80 series RTC I2C Client Driver");
 908MODULE_LICENSE("GPL");
 909