linux/drivers/rtc/rtc-pcf8563.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * An I2C driver for the Philips PCF8563 RTC
   4 * Copyright 2005-06 Tower Technologies
   5 *
   6 * Author: Alessandro Zummo <a.zummo@towertech.it>
   7 * Maintainers: http://www.nslu2-linux.org/
   8 *
   9 * based on the other drivers in this same directory.
  10 *
  11 * https://www.nxp.com/docs/en/data-sheet/PCF8563.pdf
  12 */
  13
  14#include <linux/clk-provider.h>
  15#include <linux/i2c.h>
  16#include <linux/bcd.h>
  17#include <linux/rtc.h>
  18#include <linux/slab.h>
  19#include <linux/module.h>
  20#include <linux/of.h>
  21#include <linux/err.h>
  22
  23#define PCF8563_REG_ST1         0x00 /* status */
  24#define PCF8563_REG_ST2         0x01
  25#define PCF8563_BIT_AIE         BIT(1)
  26#define PCF8563_BIT_AF          BIT(3)
  27#define PCF8563_BITS_ST2_N      (7 << 5)
  28
  29#define PCF8563_REG_SC          0x02 /* datetime */
  30#define PCF8563_REG_MN          0x03
  31#define PCF8563_REG_HR          0x04
  32#define PCF8563_REG_DM          0x05
  33#define PCF8563_REG_DW          0x06
  34#define PCF8563_REG_MO          0x07
  35#define PCF8563_REG_YR          0x08
  36
  37#define PCF8563_REG_AMN         0x09 /* alarm */
  38
  39#define PCF8563_REG_CLKO                0x0D /* clock out */
  40#define PCF8563_REG_CLKO_FE             0x80 /* clock out enabled */
  41#define PCF8563_REG_CLKO_F_MASK         0x03 /* frequenc mask */
  42#define PCF8563_REG_CLKO_F_32768HZ      0x00
  43#define PCF8563_REG_CLKO_F_1024HZ       0x01
  44#define PCF8563_REG_CLKO_F_32HZ         0x02
  45#define PCF8563_REG_CLKO_F_1HZ          0x03
  46
  47#define PCF8563_REG_TMRC        0x0E /* timer control */
  48#define PCF8563_TMRC_ENABLE     BIT(7)
  49#define PCF8563_TMRC_4096       0
  50#define PCF8563_TMRC_64         1
  51#define PCF8563_TMRC_1          2
  52#define PCF8563_TMRC_1_60       3
  53#define PCF8563_TMRC_MASK       3
  54
  55#define PCF8563_REG_TMR         0x0F /* timer */
  56
  57#define PCF8563_SC_LV           0x80 /* low voltage */
  58#define PCF8563_MO_C            0x80 /* century */
  59
  60static struct i2c_driver pcf8563_driver;
  61
  62struct pcf8563 {
  63        struct rtc_device *rtc;
  64        /*
  65         * The meaning of MO_C bit varies by the chip type.
  66         * From PCF8563 datasheet: this bit is toggled when the years
  67         * register overflows from 99 to 00
  68         *   0 indicates the century is 20xx
  69         *   1 indicates the century is 19xx
  70         * From RTC8564 datasheet: this bit indicates change of
  71         * century. When the year digit data overflows from 99 to 00,
  72         * this bit is set. By presetting it to 0 while still in the
  73         * 20th century, it will be set in year 2000, ...
  74         * There seems no reliable way to know how the system use this
  75         * bit.  So let's do it heuristically, assuming we are live in
  76         * 1970...2069.
  77         */
  78        int c_polarity; /* 0: MO_C=1 means 19xx, otherwise MO_C=1 means 20xx */
  79
  80        struct i2c_client *client;
  81#ifdef CONFIG_COMMON_CLK
  82        struct clk_hw           clkout_hw;
  83#endif
  84};
  85
  86static int pcf8563_read_block_data(struct i2c_client *client, unsigned char reg,
  87                                   unsigned char length, unsigned char *buf)
  88{
  89        struct i2c_msg msgs[] = {
  90                {/* setup read ptr */
  91                        .addr = client->addr,
  92                        .len = 1,
  93                        .buf = &reg,
  94                },
  95                {
  96                        .addr = client->addr,
  97                        .flags = I2C_M_RD,
  98                        .len = length,
  99                        .buf = buf
 100                },
 101        };
 102
 103        if ((i2c_transfer(client->adapter, msgs, 2)) != 2) {
 104                dev_err(&client->dev, "%s: read error\n", __func__);
 105                return -EIO;
 106        }
 107
 108        return 0;
 109}
 110
 111static int pcf8563_write_block_data(struct i2c_client *client,
 112                                   unsigned char reg, unsigned char length,
 113                                   unsigned char *buf)
 114{
 115        int i, err;
 116
 117        for (i = 0; i < length; i++) {
 118                unsigned char data[2] = { reg + i, buf[i] };
 119
 120                err = i2c_master_send(client, data, sizeof(data));
 121                if (err != sizeof(data)) {
 122                        dev_err(&client->dev,
 123                                "%s: err=%d addr=%02x, data=%02x\n",
 124                                __func__, err, data[0], data[1]);
 125                        return -EIO;
 126                }
 127        }
 128
 129        return 0;
 130}
 131
 132static int pcf8563_set_alarm_mode(struct i2c_client *client, bool on)
 133{
 134        unsigned char buf;
 135        int err;
 136
 137        err = pcf8563_read_block_data(client, PCF8563_REG_ST2, 1, &buf);
 138        if (err < 0)
 139                return err;
 140
 141        if (on)
 142                buf |= PCF8563_BIT_AIE;
 143        else
 144                buf &= ~PCF8563_BIT_AIE;
 145
 146        buf &= ~(PCF8563_BIT_AF | PCF8563_BITS_ST2_N);
 147
 148        err = pcf8563_write_block_data(client, PCF8563_REG_ST2, 1, &buf);
 149        if (err < 0) {
 150                dev_err(&client->dev, "%s: write error\n", __func__);
 151                return -EIO;
 152        }
 153
 154        return 0;
 155}
 156
 157static int pcf8563_get_alarm_mode(struct i2c_client *client, unsigned char *en,
 158                                  unsigned char *pen)
 159{
 160        unsigned char buf;
 161        int err;
 162
 163        err = pcf8563_read_block_data(client, PCF8563_REG_ST2, 1, &buf);
 164        if (err)
 165                return err;
 166
 167        if (en)
 168                *en = !!(buf & PCF8563_BIT_AIE);
 169        if (pen)
 170                *pen = !!(buf & PCF8563_BIT_AF);
 171
 172        return 0;
 173}
 174
 175static irqreturn_t pcf8563_irq(int irq, void *dev_id)
 176{
 177        struct pcf8563 *pcf8563 = i2c_get_clientdata(dev_id);
 178        int err;
 179        char pending;
 180
 181        err = pcf8563_get_alarm_mode(pcf8563->client, NULL, &pending);
 182        if (err)
 183                return IRQ_NONE;
 184
 185        if (pending) {
 186                rtc_update_irq(pcf8563->rtc, 1, RTC_IRQF | RTC_AF);
 187                pcf8563_set_alarm_mode(pcf8563->client, 1);
 188                return IRQ_HANDLED;
 189        }
 190
 191        return IRQ_NONE;
 192}
 193
 194/*
 195 * In the routines that deal directly with the pcf8563 hardware, we use
 196 * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch.
 197 */
 198static int pcf8563_rtc_read_time(struct device *dev, struct rtc_time *tm)
 199{
 200        struct i2c_client *client = to_i2c_client(dev);
 201        struct pcf8563 *pcf8563 = i2c_get_clientdata(client);
 202        unsigned char buf[9];
 203        int err;
 204
 205        err = pcf8563_read_block_data(client, PCF8563_REG_ST1, 9, buf);
 206        if (err)
 207                return err;
 208
 209        if (buf[PCF8563_REG_SC] & PCF8563_SC_LV) {
 210                dev_err(&client->dev,
 211                        "low voltage detected, date/time is not reliable.\n");
 212                return -EINVAL;
 213        }
 214
 215        dev_dbg(&client->dev,
 216                "%s: raw data is st1=%02x, st2=%02x, sec=%02x, min=%02x, hr=%02x, "
 217                "mday=%02x, wday=%02x, mon=%02x, year=%02x\n",
 218                __func__,
 219                buf[0], buf[1], buf[2], buf[3],
 220                buf[4], buf[5], buf[6], buf[7],
 221                buf[8]);
 222
 223
 224        tm->tm_sec = bcd2bin(buf[PCF8563_REG_SC] & 0x7F);
 225        tm->tm_min = bcd2bin(buf[PCF8563_REG_MN] & 0x7F);
 226        tm->tm_hour = bcd2bin(buf[PCF8563_REG_HR] & 0x3F); /* rtc hr 0-23 */
 227        tm->tm_mday = bcd2bin(buf[PCF8563_REG_DM] & 0x3F);
 228        tm->tm_wday = buf[PCF8563_REG_DW] & 0x07;
 229        tm->tm_mon = bcd2bin(buf[PCF8563_REG_MO] & 0x1F) - 1; /* rtc mn 1-12 */
 230        tm->tm_year = bcd2bin(buf[PCF8563_REG_YR]) + 100;
 231        /* detect the polarity heuristically. see note above. */
 232        pcf8563->c_polarity = (buf[PCF8563_REG_MO] & PCF8563_MO_C) ?
 233                (tm->tm_year >= 100) : (tm->tm_year < 100);
 234
 235        dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d, "
 236                "mday=%d, mon=%d, year=%d, wday=%d\n",
 237                __func__,
 238                tm->tm_sec, tm->tm_min, tm->tm_hour,
 239                tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
 240
 241        return 0;
 242}
 243
 244static int pcf8563_rtc_set_time(struct device *dev, struct rtc_time *tm)
 245{
 246        struct i2c_client *client = to_i2c_client(dev);
 247        struct pcf8563 *pcf8563 = i2c_get_clientdata(client);
 248        unsigned char buf[9];
 249
 250        dev_dbg(&client->dev, "%s: secs=%d, mins=%d, hours=%d, "
 251                "mday=%d, mon=%d, year=%d, wday=%d\n",
 252                __func__,
 253                tm->tm_sec, tm->tm_min, tm->tm_hour,
 254                tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
 255
 256        /* hours, minutes and seconds */
 257        buf[PCF8563_REG_SC] = bin2bcd(tm->tm_sec);
 258        buf[PCF8563_REG_MN] = bin2bcd(tm->tm_min);
 259        buf[PCF8563_REG_HR] = bin2bcd(tm->tm_hour);
 260
 261        buf[PCF8563_REG_DM] = bin2bcd(tm->tm_mday);
 262
 263        /* month, 1 - 12 */
 264        buf[PCF8563_REG_MO] = bin2bcd(tm->tm_mon + 1);
 265
 266        /* year and century */
 267        buf[PCF8563_REG_YR] = bin2bcd(tm->tm_year - 100);
 268        if (pcf8563->c_polarity ? (tm->tm_year >= 100) : (tm->tm_year < 100))
 269                buf[PCF8563_REG_MO] |= PCF8563_MO_C;
 270
 271        buf[PCF8563_REG_DW] = tm->tm_wday & 0x07;
 272
 273        return pcf8563_write_block_data(client, PCF8563_REG_SC,
 274                                9 - PCF8563_REG_SC, buf + PCF8563_REG_SC);
 275}
 276
 277static int pcf8563_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
 278{
 279        struct i2c_client *client = to_i2c_client(dev);
 280        int ret;
 281
 282        switch (cmd) {
 283        case RTC_VL_READ:
 284                ret = i2c_smbus_read_byte_data(client, PCF8563_REG_SC);
 285                if (ret < 0)
 286                        return ret;
 287
 288                return put_user(ret & PCF8563_SC_LV ? RTC_VL_DATA_INVALID : 0,
 289                                (unsigned int __user *)arg);
 290        default:
 291                return -ENOIOCTLCMD;
 292        }
 293}
 294
 295static int pcf8563_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *tm)
 296{
 297        struct i2c_client *client = to_i2c_client(dev);
 298        unsigned char buf[4];
 299        int err;
 300
 301        err = pcf8563_read_block_data(client, PCF8563_REG_AMN, 4, buf);
 302        if (err)
 303                return err;
 304
 305        dev_dbg(&client->dev,
 306                "%s: raw data is min=%02x, hr=%02x, mday=%02x, wday=%02x\n",
 307                __func__, buf[0], buf[1], buf[2], buf[3]);
 308
 309        tm->time.tm_sec = 0;
 310        tm->time.tm_min = bcd2bin(buf[0] & 0x7F);
 311        tm->time.tm_hour = bcd2bin(buf[1] & 0x3F);
 312        tm->time.tm_mday = bcd2bin(buf[2] & 0x3F);
 313        tm->time.tm_wday = bcd2bin(buf[3] & 0x7);
 314
 315        err = pcf8563_get_alarm_mode(client, &tm->enabled, &tm->pending);
 316        if (err < 0)
 317                return err;
 318
 319        dev_dbg(&client->dev, "%s: tm is mins=%d, hours=%d, mday=%d, wday=%d,"
 320                " enabled=%d, pending=%d\n", __func__, tm->time.tm_min,
 321                tm->time.tm_hour, tm->time.tm_mday, tm->time.tm_wday,
 322                tm->enabled, tm->pending);
 323
 324        return 0;
 325}
 326
 327static int pcf8563_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *tm)
 328{
 329        struct i2c_client *client = to_i2c_client(dev);
 330        unsigned char buf[4];
 331        int err;
 332
 333        /* The alarm has no seconds, round up to nearest minute */
 334        if (tm->time.tm_sec) {
 335                time64_t alarm_time = rtc_tm_to_time64(&tm->time);
 336
 337                alarm_time += 60 - tm->time.tm_sec;
 338                rtc_time64_to_tm(alarm_time, &tm->time);
 339        }
 340
 341        dev_dbg(dev, "%s, min=%d hour=%d wday=%d mday=%d "
 342                "enabled=%d pending=%d\n", __func__,
 343                tm->time.tm_min, tm->time.tm_hour, tm->time.tm_wday,
 344                tm->time.tm_mday, tm->enabled, tm->pending);
 345
 346        buf[0] = bin2bcd(tm->time.tm_min);
 347        buf[1] = bin2bcd(tm->time.tm_hour);
 348        buf[2] = bin2bcd(tm->time.tm_mday);
 349        buf[3] = tm->time.tm_wday & 0x07;
 350
 351        err = pcf8563_write_block_data(client, PCF8563_REG_AMN, 4, buf);
 352        if (err)
 353                return err;
 354
 355        return pcf8563_set_alarm_mode(client, !!tm->enabled);
 356}
 357
 358static int pcf8563_irq_enable(struct device *dev, unsigned int enabled)
 359{
 360        dev_dbg(dev, "%s: en=%d\n", __func__, enabled);
 361        return pcf8563_set_alarm_mode(to_i2c_client(dev), !!enabled);
 362}
 363
 364#ifdef CONFIG_COMMON_CLK
 365/*
 366 * Handling of the clkout
 367 */
 368
 369#define clkout_hw_to_pcf8563(_hw) container_of(_hw, struct pcf8563, clkout_hw)
 370
 371static const int clkout_rates[] = {
 372        32768,
 373        1024,
 374        32,
 375        1,
 376};
 377
 378static unsigned long pcf8563_clkout_recalc_rate(struct clk_hw *hw,
 379                                                unsigned long parent_rate)
 380{
 381        struct pcf8563 *pcf8563 = clkout_hw_to_pcf8563(hw);
 382        struct i2c_client *client = pcf8563->client;
 383        unsigned char buf;
 384        int ret = pcf8563_read_block_data(client, PCF8563_REG_CLKO, 1, &buf);
 385
 386        if (ret < 0)
 387                return 0;
 388
 389        buf &= PCF8563_REG_CLKO_F_MASK;
 390        return clkout_rates[buf];
 391}
 392
 393static long pcf8563_clkout_round_rate(struct clk_hw *hw, unsigned long rate,
 394                                      unsigned long *prate)
 395{
 396        int i;
 397
 398        for (i = 0; i < ARRAY_SIZE(clkout_rates); i++)
 399                if (clkout_rates[i] <= rate)
 400                        return clkout_rates[i];
 401
 402        return 0;
 403}
 404
 405static int pcf8563_clkout_set_rate(struct clk_hw *hw, unsigned long rate,
 406                                   unsigned long parent_rate)
 407{
 408        struct pcf8563 *pcf8563 = clkout_hw_to_pcf8563(hw);
 409        struct i2c_client *client = pcf8563->client;
 410        unsigned char buf;
 411        int ret = pcf8563_read_block_data(client, PCF8563_REG_CLKO, 1, &buf);
 412        int i;
 413
 414        if (ret < 0)
 415                return ret;
 416
 417        for (i = 0; i < ARRAY_SIZE(clkout_rates); i++)
 418                if (clkout_rates[i] == rate) {
 419                        buf &= ~PCF8563_REG_CLKO_F_MASK;
 420                        buf |= i;
 421                        ret = pcf8563_write_block_data(client,
 422                                                       PCF8563_REG_CLKO, 1,
 423                                                       &buf);
 424                        return ret;
 425                }
 426
 427        return -EINVAL;
 428}
 429
 430static int pcf8563_clkout_control(struct clk_hw *hw, bool enable)
 431{
 432        struct pcf8563 *pcf8563 = clkout_hw_to_pcf8563(hw);
 433        struct i2c_client *client = pcf8563->client;
 434        unsigned char buf;
 435        int ret = pcf8563_read_block_data(client, PCF8563_REG_CLKO, 1, &buf);
 436
 437        if (ret < 0)
 438                return ret;
 439
 440        if (enable)
 441                buf |= PCF8563_REG_CLKO_FE;
 442        else
 443                buf &= ~PCF8563_REG_CLKO_FE;
 444
 445        ret = pcf8563_write_block_data(client, PCF8563_REG_CLKO, 1, &buf);
 446        return ret;
 447}
 448
 449static int pcf8563_clkout_prepare(struct clk_hw *hw)
 450{
 451        return pcf8563_clkout_control(hw, 1);
 452}
 453
 454static void pcf8563_clkout_unprepare(struct clk_hw *hw)
 455{
 456        pcf8563_clkout_control(hw, 0);
 457}
 458
 459static int pcf8563_clkout_is_prepared(struct clk_hw *hw)
 460{
 461        struct pcf8563 *pcf8563 = clkout_hw_to_pcf8563(hw);
 462        struct i2c_client *client = pcf8563->client;
 463        unsigned char buf;
 464        int ret = pcf8563_read_block_data(client, PCF8563_REG_CLKO, 1, &buf);
 465
 466        if (ret < 0)
 467                return ret;
 468
 469        return !!(buf & PCF8563_REG_CLKO_FE);
 470}
 471
 472static const struct clk_ops pcf8563_clkout_ops = {
 473        .prepare = pcf8563_clkout_prepare,
 474        .unprepare = pcf8563_clkout_unprepare,
 475        .is_prepared = pcf8563_clkout_is_prepared,
 476        .recalc_rate = pcf8563_clkout_recalc_rate,
 477        .round_rate = pcf8563_clkout_round_rate,
 478        .set_rate = pcf8563_clkout_set_rate,
 479};
 480
 481static struct clk *pcf8563_clkout_register_clk(struct pcf8563 *pcf8563)
 482{
 483        struct i2c_client *client = pcf8563->client;
 484        struct device_node *node = client->dev.of_node;
 485        struct clk *clk;
 486        struct clk_init_data init;
 487        int ret;
 488        unsigned char buf;
 489
 490        /* disable the clkout output */
 491        buf = 0;
 492        ret = pcf8563_write_block_data(client, PCF8563_REG_CLKO, 1, &buf);
 493        if (ret < 0)
 494                return ERR_PTR(ret);
 495
 496        init.name = "pcf8563-clkout";
 497        init.ops = &pcf8563_clkout_ops;
 498        init.flags = 0;
 499        init.parent_names = NULL;
 500        init.num_parents = 0;
 501        pcf8563->clkout_hw.init = &init;
 502
 503        /* optional override of the clockname */
 504        of_property_read_string(node, "clock-output-names", &init.name);
 505
 506        /* register the clock */
 507        clk = devm_clk_register(&client->dev, &pcf8563->clkout_hw);
 508
 509        if (!IS_ERR(clk))
 510                of_clk_add_provider(node, of_clk_src_simple_get, clk);
 511
 512        return clk;
 513}
 514#endif
 515
 516static const struct rtc_class_ops pcf8563_rtc_ops = {
 517        .ioctl          = pcf8563_rtc_ioctl,
 518        .read_time      = pcf8563_rtc_read_time,
 519        .set_time       = pcf8563_rtc_set_time,
 520        .read_alarm     = pcf8563_rtc_read_alarm,
 521        .set_alarm      = pcf8563_rtc_set_alarm,
 522        .alarm_irq_enable = pcf8563_irq_enable,
 523};
 524
 525static int pcf8563_probe(struct i2c_client *client,
 526                                const struct i2c_device_id *id)
 527{
 528        struct pcf8563 *pcf8563;
 529        int err;
 530        unsigned char buf;
 531
 532        dev_dbg(&client->dev, "%s\n", __func__);
 533
 534        if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
 535                return -ENODEV;
 536
 537        pcf8563 = devm_kzalloc(&client->dev, sizeof(struct pcf8563),
 538                                GFP_KERNEL);
 539        if (!pcf8563)
 540                return -ENOMEM;
 541
 542        i2c_set_clientdata(client, pcf8563);
 543        pcf8563->client = client;
 544        device_set_wakeup_capable(&client->dev, 1);
 545
 546        /* Set timer to lowest frequency to save power (ref Haoyu datasheet) */
 547        buf = PCF8563_TMRC_1_60;
 548        err = pcf8563_write_block_data(client, PCF8563_REG_TMRC, 1, &buf);
 549        if (err < 0) {
 550                dev_err(&client->dev, "%s: write error\n", __func__);
 551                return err;
 552        }
 553
 554        /* Clear flags and disable interrupts */
 555        buf = 0;
 556        err = pcf8563_write_block_data(client, PCF8563_REG_ST2, 1, &buf);
 557        if (err < 0) {
 558                dev_err(&client->dev, "%s: write error\n", __func__);
 559                return err;
 560        }
 561
 562        pcf8563->rtc = devm_rtc_allocate_device(&client->dev);
 563        if (IS_ERR(pcf8563->rtc))
 564                return PTR_ERR(pcf8563->rtc);
 565
 566        pcf8563->rtc->ops = &pcf8563_rtc_ops;
 567        /* the pcf8563 alarm only supports a minute accuracy */
 568        pcf8563->rtc->uie_unsupported = 1;
 569        pcf8563->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
 570        pcf8563->rtc->range_max = RTC_TIMESTAMP_END_2099;
 571        pcf8563->rtc->set_start_time = true;
 572
 573        if (client->irq > 0) {
 574                err = devm_request_threaded_irq(&client->dev, client->irq,
 575                                NULL, pcf8563_irq,
 576                                IRQF_SHARED | IRQF_ONESHOT | IRQF_TRIGGER_LOW,
 577                                pcf8563_driver.driver.name, client);
 578                if (err) {
 579                        dev_err(&client->dev, "unable to request IRQ %d\n",
 580                                                                client->irq);
 581                        return err;
 582                }
 583        }
 584
 585        err = devm_rtc_register_device(pcf8563->rtc);
 586        if (err)
 587                return err;
 588
 589#ifdef CONFIG_COMMON_CLK
 590        /* register clk in common clk framework */
 591        pcf8563_clkout_register_clk(pcf8563);
 592#endif
 593
 594        return 0;
 595}
 596
 597static const struct i2c_device_id pcf8563_id[] = {
 598        { "pcf8563", 0 },
 599        { "rtc8564", 0 },
 600        { "pca8565", 0 },
 601        { }
 602};
 603MODULE_DEVICE_TABLE(i2c, pcf8563_id);
 604
 605#ifdef CONFIG_OF
 606static const struct of_device_id pcf8563_of_match[] = {
 607        { .compatible = "nxp,pcf8563" },
 608        { .compatible = "epson,rtc8564" },
 609        { .compatible = "microcrystal,rv8564" },
 610        { .compatible = "nxp,pca8565" },
 611        {}
 612};
 613MODULE_DEVICE_TABLE(of, pcf8563_of_match);
 614#endif
 615
 616static struct i2c_driver pcf8563_driver = {
 617        .driver         = {
 618                .name   = "rtc-pcf8563",
 619                .of_match_table = of_match_ptr(pcf8563_of_match),
 620        },
 621        .probe          = pcf8563_probe,
 622        .id_table       = pcf8563_id,
 623};
 624
 625module_i2c_driver(pcf8563_driver);
 626
 627MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>");
 628MODULE_DESCRIPTION("Philips PCF8563/Epson RTC8564 RTC driver");
 629MODULE_LICENSE("GPL");
 630