root/drivers/rtc/rtc-fm3130.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. fm3130_rtc_mode
  2. fm3130_get_time
  3. fm3130_set_time
  4. fm3130_read_alarm
  5. fm3130_set_alarm
  6. fm3130_alarm_irq_enable
  7. fm3130_probe

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * rtc-fm3130.c - RTC driver for Ramtron FM3130 I2C chip.
   4  *
   5  *  Copyright (C) 2008 Sergey Lapin
   6  *  Based on ds1307 driver by James Chapman and David Brownell
   7  */
   8 
   9 #include <linux/module.h>
  10 #include <linux/i2c.h>
  11 #include <linux/rtc.h>
  12 #include <linux/bcd.h>
  13 #include <linux/slab.h>
  14 
  15 #define FM3130_RTC_CONTROL      (0x0)
  16 #define FM3130_CAL_CONTROL      (0x1)
  17 #define FM3130_RTC_SECONDS      (0x2)
  18 #define FM3130_RTC_MINUTES      (0x3)
  19 #define FM3130_RTC_HOURS        (0x4)
  20 #define FM3130_RTC_DAY          (0x5)
  21 #define FM3130_RTC_DATE         (0x6)
  22 #define FM3130_RTC_MONTHS       (0x7)
  23 #define FM3130_RTC_YEARS        (0x8)
  24 
  25 #define FM3130_ALARM_SECONDS    (0x9)
  26 #define FM3130_ALARM_MINUTES    (0xa)
  27 #define FM3130_ALARM_HOURS      (0xb)
  28 #define FM3130_ALARM_DATE       (0xc)
  29 #define FM3130_ALARM_MONTHS     (0xd)
  30 #define FM3130_ALARM_WP_CONTROL (0xe)
  31 
  32 #define FM3130_CAL_CONTROL_BIT_nOSCEN (1 << 7) /* Osciallator enabled */
  33 #define FM3130_RTC_CONTROL_BIT_LB (1 << 7) /* Low battery */
  34 #define FM3130_RTC_CONTROL_BIT_AF (1 << 6) /* Alarm flag */
  35 #define FM3130_RTC_CONTROL_BIT_CF (1 << 5) /* Century overflow */
  36 #define FM3130_RTC_CONTROL_BIT_POR (1 << 4) /* Power on reset */
  37 #define FM3130_RTC_CONTROL_BIT_AEN (1 << 3) /* Alarm enable */
  38 #define FM3130_RTC_CONTROL_BIT_CAL (1 << 2) /* Calibration mode */
  39 #define FM3130_RTC_CONTROL_BIT_WRITE (1 << 1) /* W=1 -> write mode W=0 normal */
  40 #define FM3130_RTC_CONTROL_BIT_READ (1 << 0) /* R=1 -> read mode R=0 normal */
  41 
  42 #define FM3130_CLOCK_REGS 7
  43 #define FM3130_ALARM_REGS 5
  44 
  45 struct fm3130 {
  46         u8                      reg_addr_time;
  47         u8                      reg_addr_alarm;
  48         u8                      regs[15];
  49         struct i2c_msg          msg[4];
  50         struct i2c_client       *client;
  51         struct rtc_device       *rtc;
  52         int                     alarm_valid;
  53         int                     data_valid;
  54 };
  55 static const struct i2c_device_id fm3130_id[] = {
  56         { "fm3130", 0 },
  57         { }
  58 };
  59 MODULE_DEVICE_TABLE(i2c, fm3130_id);
  60 
  61 #define FM3130_MODE_NORMAL              0
  62 #define FM3130_MODE_WRITE               1
  63 #define FM3130_MODE_READ                2
  64 
  65 static void fm3130_rtc_mode(struct device *dev, int mode)
  66 {
  67         struct fm3130 *fm3130 = dev_get_drvdata(dev);
  68 
  69         fm3130->regs[FM3130_RTC_CONTROL] =
  70                 i2c_smbus_read_byte_data(fm3130->client, FM3130_RTC_CONTROL);
  71         switch (mode) {
  72         case FM3130_MODE_NORMAL:
  73                 fm3130->regs[FM3130_RTC_CONTROL] &=
  74                         ~(FM3130_RTC_CONTROL_BIT_WRITE |
  75                         FM3130_RTC_CONTROL_BIT_READ);
  76                 break;
  77         case FM3130_MODE_WRITE:
  78                 fm3130->regs[FM3130_RTC_CONTROL] |= FM3130_RTC_CONTROL_BIT_WRITE;
  79                 break;
  80         case FM3130_MODE_READ:
  81                 fm3130->regs[FM3130_RTC_CONTROL] |= FM3130_RTC_CONTROL_BIT_READ;
  82                 break;
  83         default:
  84                 dev_dbg(dev, "invalid mode %d\n", mode);
  85                 break;
  86         }
  87 
  88         i2c_smbus_write_byte_data(fm3130->client,
  89                  FM3130_RTC_CONTROL, fm3130->regs[FM3130_RTC_CONTROL]);
  90 }
  91 
  92 static int fm3130_get_time(struct device *dev, struct rtc_time *t)
  93 {
  94         struct fm3130 *fm3130 = dev_get_drvdata(dev);
  95         int             tmp;
  96 
  97         if (!fm3130->data_valid) {
  98                 /* We have invalid data in RTC, probably due
  99                 to battery faults or other problems. Return EIO
 100                 for now, it will allow us to set data later instead
 101                 of error during probing which disables device */
 102                 return -EIO;
 103         }
 104         fm3130_rtc_mode(dev, FM3130_MODE_READ);
 105 
 106         /* read the RTC date and time registers all at once */
 107         tmp = i2c_transfer(fm3130->client->adapter, fm3130->msg, 2);
 108         if (tmp != 2) {
 109                 dev_err(dev, "%s error %d\n", "read", tmp);
 110                 return -EIO;
 111         }
 112 
 113         fm3130_rtc_mode(dev, FM3130_MODE_NORMAL);
 114 
 115         dev_dbg(dev, "%s: %15ph\n", "read", fm3130->regs);
 116 
 117         t->tm_sec = bcd2bin(fm3130->regs[FM3130_RTC_SECONDS] & 0x7f);
 118         t->tm_min = bcd2bin(fm3130->regs[FM3130_RTC_MINUTES] & 0x7f);
 119         tmp = fm3130->regs[FM3130_RTC_HOURS] & 0x3f;
 120         t->tm_hour = bcd2bin(tmp);
 121         t->tm_wday = bcd2bin(fm3130->regs[FM3130_RTC_DAY] & 0x07) - 1;
 122         t->tm_mday = bcd2bin(fm3130->regs[FM3130_RTC_DATE] & 0x3f);
 123         tmp = fm3130->regs[FM3130_RTC_MONTHS] & 0x1f;
 124         t->tm_mon = bcd2bin(tmp) - 1;
 125 
 126         /* assume 20YY not 19YY, and ignore CF bit */
 127         t->tm_year = bcd2bin(fm3130->regs[FM3130_RTC_YEARS]) + 100;
 128 
 129         dev_dbg(dev, "%s secs=%d, mins=%d, "
 130                 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
 131                 "read", t->tm_sec, t->tm_min,
 132                 t->tm_hour, t->tm_mday,
 133                 t->tm_mon, t->tm_year, t->tm_wday);
 134 
 135         return 0;
 136 }
 137 
 138 
 139 static int fm3130_set_time(struct device *dev, struct rtc_time *t)
 140 {
 141         struct fm3130 *fm3130 = dev_get_drvdata(dev);
 142         int             tmp, i;
 143         u8              *buf = fm3130->regs;
 144 
 145         dev_dbg(dev, "%s secs=%d, mins=%d, "
 146                 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
 147                 "write", t->tm_sec, t->tm_min,
 148                 t->tm_hour, t->tm_mday,
 149                 t->tm_mon, t->tm_year, t->tm_wday);
 150 
 151         /* first register addr */
 152         buf[FM3130_RTC_SECONDS] = bin2bcd(t->tm_sec);
 153         buf[FM3130_RTC_MINUTES] = bin2bcd(t->tm_min);
 154         buf[FM3130_RTC_HOURS] = bin2bcd(t->tm_hour);
 155         buf[FM3130_RTC_DAY] = bin2bcd(t->tm_wday + 1);
 156         buf[FM3130_RTC_DATE] = bin2bcd(t->tm_mday);
 157         buf[FM3130_RTC_MONTHS] = bin2bcd(t->tm_mon + 1);
 158 
 159         /* assume 20YY not 19YY */
 160         tmp = t->tm_year - 100;
 161         buf[FM3130_RTC_YEARS] = bin2bcd(tmp);
 162 
 163         dev_dbg(dev, "%s: %15ph\n", "write", buf);
 164 
 165         fm3130_rtc_mode(dev, FM3130_MODE_WRITE);
 166 
 167         /* Writing time registers, we don't support multibyte transfers */
 168         for (i = 0; i < FM3130_CLOCK_REGS; i++) {
 169                 i2c_smbus_write_byte_data(fm3130->client,
 170                                         FM3130_RTC_SECONDS + i,
 171                                         fm3130->regs[FM3130_RTC_SECONDS + i]);
 172         }
 173 
 174         fm3130_rtc_mode(dev, FM3130_MODE_NORMAL);
 175 
 176         /* We assume here that data are valid once written */
 177         if (!fm3130->data_valid)
 178                 fm3130->data_valid = 1;
 179         return 0;
 180 }
 181 
 182 static int fm3130_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
 183 {
 184         struct fm3130 *fm3130 = dev_get_drvdata(dev);
 185         int tmp;
 186         struct rtc_time *tm = &alrm->time;
 187 
 188         if (!fm3130->alarm_valid) {
 189                 /*
 190                  * We have invalid alarm in RTC, probably due to battery faults
 191                  * or other problems. Return EIO for now, it will allow us to
 192                  * set alarm value later instead of error during probing which
 193                  * disables device
 194                  */
 195                 return -EIO;
 196         }
 197 
 198         /* read the RTC alarm registers all at once */
 199         tmp = i2c_transfer(fm3130->client->adapter, &fm3130->msg[2], 2);
 200         if (tmp != 2) {
 201                 dev_err(dev, "%s error %d\n", "read", tmp);
 202                 return -EIO;
 203         }
 204         dev_dbg(dev, "alarm read %02x %02x %02x %02x %02x\n",
 205                         fm3130->regs[FM3130_ALARM_SECONDS],
 206                         fm3130->regs[FM3130_ALARM_MINUTES],
 207                         fm3130->regs[FM3130_ALARM_HOURS],
 208                         fm3130->regs[FM3130_ALARM_DATE],
 209                         fm3130->regs[FM3130_ALARM_MONTHS]);
 210 
 211         tm->tm_sec      = bcd2bin(fm3130->regs[FM3130_ALARM_SECONDS] & 0x7F);
 212         tm->tm_min      = bcd2bin(fm3130->regs[FM3130_ALARM_MINUTES] & 0x7F);
 213         tm->tm_hour     = bcd2bin(fm3130->regs[FM3130_ALARM_HOURS] & 0x3F);
 214         tm->tm_mday     = bcd2bin(fm3130->regs[FM3130_ALARM_DATE] & 0x3F);
 215         tm->tm_mon      = bcd2bin(fm3130->regs[FM3130_ALARM_MONTHS] & 0x1F);
 216 
 217         if (tm->tm_mon > 0)
 218                 tm->tm_mon -= 1; /* RTC is 1-12, tm_mon is 0-11 */
 219 
 220         dev_dbg(dev, "%s secs=%d, mins=%d, "
 221                 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
 222                 "read alarm", tm->tm_sec, tm->tm_min,
 223                 tm->tm_hour, tm->tm_mday,
 224                 tm->tm_mon, tm->tm_year, tm->tm_wday);
 225 
 226         /* check if alarm enabled */
 227         fm3130->regs[FM3130_RTC_CONTROL] =
 228                 i2c_smbus_read_byte_data(fm3130->client, FM3130_RTC_CONTROL);
 229 
 230         if ((fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_AEN) &&
 231                 (~fm3130->regs[FM3130_RTC_CONTROL] &
 232                         FM3130_RTC_CONTROL_BIT_CAL)) {
 233                 alrm->enabled = 1;
 234         }
 235 
 236         return 0;
 237 }
 238 
 239 static int fm3130_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
 240 {
 241         struct fm3130 *fm3130 = dev_get_drvdata(dev);
 242         struct rtc_time *tm = &alrm->time;
 243         int i;
 244 
 245         dev_dbg(dev, "%s secs=%d, mins=%d, "
 246                 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
 247                 "write alarm", tm->tm_sec, tm->tm_min,
 248                 tm->tm_hour, tm->tm_mday,
 249                 tm->tm_mon, tm->tm_year, tm->tm_wday);
 250 
 251         fm3130->regs[FM3130_ALARM_SECONDS] =
 252                 (tm->tm_sec != -1) ? bin2bcd(tm->tm_sec) : 0x80;
 253 
 254         fm3130->regs[FM3130_ALARM_MINUTES] =
 255                 (tm->tm_min != -1) ? bin2bcd(tm->tm_min) : 0x80;
 256 
 257         fm3130->regs[FM3130_ALARM_HOURS] =
 258                 (tm->tm_hour != -1) ? bin2bcd(tm->tm_hour) : 0x80;
 259 
 260         fm3130->regs[FM3130_ALARM_DATE] =
 261                 (tm->tm_mday != -1) ? bin2bcd(tm->tm_mday) : 0x80;
 262 
 263         fm3130->regs[FM3130_ALARM_MONTHS] =
 264                 (tm->tm_mon != -1) ? bin2bcd(tm->tm_mon + 1) : 0x80;
 265 
 266         dev_dbg(dev, "alarm write %02x %02x %02x %02x %02x\n",
 267                         fm3130->regs[FM3130_ALARM_SECONDS],
 268                         fm3130->regs[FM3130_ALARM_MINUTES],
 269                         fm3130->regs[FM3130_ALARM_HOURS],
 270                         fm3130->regs[FM3130_ALARM_DATE],
 271                         fm3130->regs[FM3130_ALARM_MONTHS]);
 272         /* Writing time registers, we don't support multibyte transfers */
 273         for (i = 0; i < FM3130_ALARM_REGS; i++) {
 274                 i2c_smbus_write_byte_data(fm3130->client,
 275                                         FM3130_ALARM_SECONDS + i,
 276                                         fm3130->regs[FM3130_ALARM_SECONDS + i]);
 277         }
 278         fm3130->regs[FM3130_RTC_CONTROL] =
 279                 i2c_smbus_read_byte_data(fm3130->client, FM3130_RTC_CONTROL);
 280 
 281         /* enable or disable alarm */
 282         if (alrm->enabled) {
 283                 i2c_smbus_write_byte_data(fm3130->client, FM3130_RTC_CONTROL,
 284                         (fm3130->regs[FM3130_RTC_CONTROL] &
 285                                 ~(FM3130_RTC_CONTROL_BIT_CAL)) |
 286                                         FM3130_RTC_CONTROL_BIT_AEN);
 287         } else {
 288                 i2c_smbus_write_byte_data(fm3130->client, FM3130_RTC_CONTROL,
 289                         fm3130->regs[FM3130_RTC_CONTROL] &
 290                                 ~(FM3130_RTC_CONTROL_BIT_CAL) &
 291                                         ~(FM3130_RTC_CONTROL_BIT_AEN));
 292         }
 293 
 294         /* We assume here that data is valid once written */
 295         if (!fm3130->alarm_valid)
 296                 fm3130->alarm_valid = 1;
 297 
 298         return 0;
 299 }
 300 
 301 static int fm3130_alarm_irq_enable(struct device *dev, unsigned int enabled)
 302 {
 303         struct fm3130 *fm3130 = dev_get_drvdata(dev);
 304         int ret = 0;
 305 
 306         fm3130->regs[FM3130_RTC_CONTROL] =
 307                 i2c_smbus_read_byte_data(fm3130->client, FM3130_RTC_CONTROL);
 308 
 309         dev_dbg(dev, "alarm_irq_enable: enable=%d, FM3130_RTC_CONTROL=%02x\n",
 310                 enabled, fm3130->regs[FM3130_RTC_CONTROL]);
 311 
 312         switch (enabled) {
 313         case 0:         /* alarm off */
 314                 ret = i2c_smbus_write_byte_data(fm3130->client,
 315                         FM3130_RTC_CONTROL, fm3130->regs[FM3130_RTC_CONTROL] &
 316                                 ~(FM3130_RTC_CONTROL_BIT_CAL) &
 317                                         ~(FM3130_RTC_CONTROL_BIT_AEN));
 318                 break;
 319         case 1:         /* alarm on */
 320                 ret = i2c_smbus_write_byte_data(fm3130->client,
 321                         FM3130_RTC_CONTROL, (fm3130->regs[FM3130_RTC_CONTROL] &
 322                                 ~(FM3130_RTC_CONTROL_BIT_CAL)) |
 323                                         FM3130_RTC_CONTROL_BIT_AEN);
 324                 break;
 325         default:
 326                 ret = -EINVAL;
 327                 break;
 328         }
 329 
 330         return ret;
 331 }
 332 
 333 static const struct rtc_class_ops fm3130_rtc_ops = {
 334         .read_time      = fm3130_get_time,
 335         .set_time       = fm3130_set_time,
 336         .read_alarm     = fm3130_read_alarm,
 337         .set_alarm      = fm3130_set_alarm,
 338         .alarm_irq_enable = fm3130_alarm_irq_enable,
 339 };
 340 
 341 static struct i2c_driver fm3130_driver;
 342 
 343 static int fm3130_probe(struct i2c_client *client,
 344                         const struct i2c_device_id *id)
 345 {
 346         struct fm3130           *fm3130;
 347         int                     err = -ENODEV;
 348         int                     tmp;
 349         struct i2c_adapter      *adapter = client->adapter;
 350 
 351         if (!i2c_check_functionality(adapter,
 352                         I2C_FUNC_I2C | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
 353                 return -EIO;
 354 
 355         fm3130 = devm_kzalloc(&client->dev, sizeof(struct fm3130), GFP_KERNEL);
 356 
 357         if (!fm3130)
 358                 return -ENOMEM;
 359 
 360         fm3130->client = client;
 361         i2c_set_clientdata(client, fm3130);
 362         fm3130->reg_addr_time = FM3130_RTC_SECONDS;
 363         fm3130->reg_addr_alarm = FM3130_ALARM_SECONDS;
 364 
 365         /* Messages to read time */
 366         fm3130->msg[0].addr = client->addr;
 367         fm3130->msg[0].flags = 0;
 368         fm3130->msg[0].len = 1;
 369         fm3130->msg[0].buf = &fm3130->reg_addr_time;
 370 
 371         fm3130->msg[1].addr = client->addr;
 372         fm3130->msg[1].flags = I2C_M_RD;
 373         fm3130->msg[1].len = FM3130_CLOCK_REGS;
 374         fm3130->msg[1].buf = &fm3130->regs[FM3130_RTC_SECONDS];
 375 
 376         /* Messages to read alarm */
 377         fm3130->msg[2].addr = client->addr;
 378         fm3130->msg[2].flags = 0;
 379         fm3130->msg[2].len = 1;
 380         fm3130->msg[2].buf = &fm3130->reg_addr_alarm;
 381 
 382         fm3130->msg[3].addr = client->addr;
 383         fm3130->msg[3].flags = I2C_M_RD;
 384         fm3130->msg[3].len = FM3130_ALARM_REGS;
 385         fm3130->msg[3].buf = &fm3130->regs[FM3130_ALARM_SECONDS];
 386 
 387         fm3130->alarm_valid = 0;
 388         fm3130->data_valid = 0;
 389 
 390         tmp = i2c_transfer(adapter, fm3130->msg, 4);
 391         if (tmp != 4) {
 392                 dev_dbg(&client->dev, "read error %d\n", tmp);
 393                 err = -EIO;
 394                 goto exit_free;
 395         }
 396 
 397         fm3130->regs[FM3130_RTC_CONTROL] =
 398                 i2c_smbus_read_byte_data(client, FM3130_RTC_CONTROL);
 399         fm3130->regs[FM3130_CAL_CONTROL] =
 400                 i2c_smbus_read_byte_data(client, FM3130_CAL_CONTROL);
 401 
 402         /* Disabling calibration mode */
 403         if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_CAL) {
 404                 i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL,
 405                         fm3130->regs[FM3130_RTC_CONTROL] &
 406                                 ~(FM3130_RTC_CONTROL_BIT_CAL));
 407                 dev_warn(&client->dev, "Disabling calibration mode!\n");
 408         }
 409 
 410         /* Disabling read and write modes */
 411         if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_WRITE ||
 412             fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_READ) {
 413                 i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL,
 414                         fm3130->regs[FM3130_RTC_CONTROL] &
 415                                 ~(FM3130_RTC_CONTROL_BIT_READ |
 416                                         FM3130_RTC_CONTROL_BIT_WRITE));
 417                 dev_warn(&client->dev, "Disabling READ or WRITE mode!\n");
 418         }
 419 
 420         /* oscillator off?  turn it on, so clock can tick. */
 421         if (fm3130->regs[FM3130_CAL_CONTROL] & FM3130_CAL_CONTROL_BIT_nOSCEN)
 422                 i2c_smbus_write_byte_data(client, FM3130_CAL_CONTROL,
 423                         fm3130->regs[FM3130_CAL_CONTROL] &
 424                                 ~(FM3130_CAL_CONTROL_BIT_nOSCEN));
 425 
 426         /* low battery?  clear flag, and warn */
 427         if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_LB) {
 428                 i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL,
 429                         fm3130->regs[FM3130_RTC_CONTROL] &
 430                                 ~(FM3130_RTC_CONTROL_BIT_LB));
 431                 dev_warn(&client->dev, "Low battery!\n");
 432         }
 433 
 434         /* check if Power On Reset bit is set */
 435         if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_POR) {
 436                 i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL,
 437                         fm3130->regs[FM3130_RTC_CONTROL] &
 438                                 ~FM3130_RTC_CONTROL_BIT_POR);
 439                 dev_dbg(&client->dev, "POR bit is set\n");
 440         }
 441         /* ACS is controlled by alarm */
 442         i2c_smbus_write_byte_data(client, FM3130_ALARM_WP_CONTROL, 0x80);
 443 
 444         /* alarm registers sanity check */
 445         tmp = bcd2bin(fm3130->regs[FM3130_RTC_SECONDS] & 0x7f);
 446         if (tmp > 59)
 447                 goto bad_alarm;
 448 
 449         tmp = bcd2bin(fm3130->regs[FM3130_RTC_MINUTES] & 0x7f);
 450         if (tmp > 59)
 451                 goto bad_alarm;
 452 
 453         tmp = bcd2bin(fm3130->regs[FM3130_RTC_HOURS] & 0x3f);
 454         if (tmp > 23)
 455                 goto bad_alarm;
 456 
 457         tmp = bcd2bin(fm3130->regs[FM3130_RTC_DATE] & 0x3f);
 458         if (tmp == 0 || tmp > 31)
 459                 goto bad_alarm;
 460 
 461         tmp = bcd2bin(fm3130->regs[FM3130_RTC_MONTHS] & 0x1f);
 462         if (tmp == 0 || tmp > 12)
 463                 goto bad_alarm;
 464 
 465         fm3130->alarm_valid = 1;
 466 
 467 bad_alarm:
 468 
 469         /* clock registers sanity chek */
 470         tmp = bcd2bin(fm3130->regs[FM3130_RTC_SECONDS] & 0x7f);
 471         if (tmp > 59)
 472                 goto bad_clock;
 473 
 474         tmp = bcd2bin(fm3130->regs[FM3130_RTC_MINUTES] & 0x7f);
 475         if (tmp > 59)
 476                 goto bad_clock;
 477 
 478         tmp = bcd2bin(fm3130->regs[FM3130_RTC_HOURS] & 0x3f);
 479         if (tmp > 23)
 480                 goto bad_clock;
 481 
 482         tmp = bcd2bin(fm3130->regs[FM3130_RTC_DAY] & 0x7);
 483         if (tmp == 0 || tmp > 7)
 484                 goto bad_clock;
 485 
 486         tmp = bcd2bin(fm3130->regs[FM3130_RTC_DATE] & 0x3f);
 487         if (tmp == 0 || tmp > 31)
 488                 goto bad_clock;
 489 
 490         tmp = bcd2bin(fm3130->regs[FM3130_RTC_MONTHS] & 0x1f);
 491         if (tmp == 0 || tmp > 12)
 492                 goto bad_clock;
 493 
 494         fm3130->data_valid = 1;
 495 
 496 bad_clock:
 497 
 498         if (!fm3130->data_valid || !fm3130->alarm_valid)
 499                 dev_dbg(&client->dev, "%s: %15ph\n", "bogus registers",
 500                         fm3130->regs);
 501 
 502         /* We won't bail out here because we just got invalid data.
 503            Time setting from u-boot doesn't work anyway */
 504         fm3130->rtc = devm_rtc_device_register(&client->dev, client->name,
 505                                 &fm3130_rtc_ops, THIS_MODULE);
 506         if (IS_ERR(fm3130->rtc)) {
 507                 err = PTR_ERR(fm3130->rtc);
 508                 dev_err(&client->dev,
 509                         "unable to register the class device\n");
 510                 goto exit_free;
 511         }
 512         return 0;
 513 exit_free:
 514         return err;
 515 }
 516 
 517 static struct i2c_driver fm3130_driver = {
 518         .driver = {
 519                 .name   = "rtc-fm3130",
 520         },
 521         .probe          = fm3130_probe,
 522         .id_table       = fm3130_id,
 523 };
 524 
 525 module_i2c_driver(fm3130_driver);
 526 
 527 MODULE_DESCRIPTION("RTC driver for FM3130");
 528 MODULE_AUTHOR("Sergey Lapin <slapin@ossfans.org>");
 529 MODULE_LICENSE("GPL");
 530 

/* [<][>][^][v][top][bottom][index][help] */