diff options
author | Alexandre Belloni <alexandre.belloni@bootlin.com> | 2019-04-07 23:05:35 +0200 |
---|---|---|
committer | Alexandre Belloni <alexandre.belloni@bootlin.com> | 2019-04-08 14:35:20 +0200 |
commit | 10e3efc16569a126456c413274b90b00e60454ca (patch) | |
tree | cb11bf06cfd73e69a0ed1abb6fd86422e1d317cc /drivers/rtc/rtc-ds1672.c | |
parent | d1fbe695d889959e2430379cc989cd399fa9e253 (diff) | |
download | linux-10e3efc16569a126456c413274b90b00e60454ca.tar.bz2 |
rtc: ds1672: move oscillator handling to .read_time
Return -EINVAL when trying to read an invalid time instead of just probe
because this is a useful information for userspace.
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Diffstat (limited to 'drivers/rtc/rtc-ds1672.c')
-rw-r--r-- | drivers/rtc/rtc-ds1672.c | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/drivers/rtc/rtc-ds1672.c b/drivers/rtc/rtc-ds1672.c index b9860820cc90..71645f009e04 100644 --- a/drivers/rtc/rtc-ds1672.c +++ b/drivers/rtc/rtc-ds1672.c @@ -29,7 +29,7 @@ static int ds1672_get_datetime(struct i2c_client *client, struct rtc_time *tm) { unsigned long time; - unsigned char addr = DS1672_REG_CNT_BASE; + unsigned char addr = DS1672_REG_CONTROL; unsigned char buf[4]; struct i2c_msg msgs[] = { @@ -41,11 +41,25 @@ static int ds1672_get_datetime(struct i2c_client *client, struct rtc_time *tm) {/* read date */ .addr = client->addr, .flags = I2C_M_RD, - .len = 4, + .len = 1, .buf = buf }, }; + /* read control register */ + if ((i2c_transfer(client->adapter, &msgs[0], 2)) != 2) { + dev_warn(&client->dev, "Unable to read the control register\n"); + return -EIO; + } + + if (buf[0] & DS1672_REG_CONTROL_EOSC) { + dev_warn(&client->dev, "Oscillator not enabled. Set time to enable.\n"); + return -EINVAL; + } + + addr = DS1672_REG_CNT_BASE; + msgs[1].len = 4; + /* read date registers */ if ((i2c_transfer(client->adapter, &msgs[0], 2)) != 2) { dev_err(&client->dev, "%s: read error\n", __func__); @@ -154,7 +168,6 @@ static int ds1672_probe(struct i2c_client *client, const struct i2c_device_id *id) { int err = 0; - u8 control; struct rtc_device *rtc; dev_dbg(&client->dev, "%s\n", __func__); @@ -178,16 +191,6 @@ static int ds1672_probe(struct i2c_client *client, i2c_set_clientdata(client, rtc); - /* read control register */ - err = ds1672_get_control(client, &control); - if (err) { - dev_warn(&client->dev, "Unable to read the control register\n"); - } - - if (control & DS1672_REG_CONTROL_EOSC) - dev_warn(&client->dev, "Oscillator not enabled. " - "Set time to enable.\n"); - /* Register sysfs hooks */ err = device_create_file(&client->dev, &dev_attr_control); if (err) |