Merge tag 'rtc-5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux
[sfrench/cifs-2.6.git] / drivers / rtc / rtc-s35390a.c
index 8c37acb4a0078f3b26ce3f80e6c984c0fcd2e1da..84806ff763cf708fada1a8af80a453980052ab71 100644 (file)
 #define S35390A_ALRM_BYTE_MINS 2
 
 /* flags for STATUS1 */
-#define S35390A_FLAG_POC       0x01
-#define S35390A_FLAG_BLD       0x02
-#define S35390A_FLAG_INT2      0x04
-#define S35390A_FLAG_24H       0x40
-#define S35390A_FLAG_RESET     0x80
+#define S35390A_FLAG_POC       BIT(0)
+#define S35390A_FLAG_BLD       BIT(1)
+#define S35390A_FLAG_INT2      BIT(2)
+#define S35390A_FLAG_24H       BIT(6)
+#define S35390A_FLAG_RESET     BIT(7)
 
 /* flag for STATUS2 */
-#define S35390A_FLAG_TEST      0x01
-
-#define S35390A_INT2_MODE_MASK         0xF0
+#define S35390A_FLAG_TEST      BIT(0)
 
+/* INT2 pin output mode */
+#define S35390A_INT2_MODE_MASK         0x0E
 #define S35390A_INT2_MODE_NOINTR       0x00
-#define S35390A_INT2_MODE_FREQ         0x10
-#define S35390A_INT2_MODE_ALARM                0x40
-#define S35390A_INT2_MODE_PMIN_EDG     0x20
+#define S35390A_INT2_MODE_ALARM                BIT(1) /* INT2AE */
+#define S35390A_INT2_MODE_PMIN_EDG     BIT(2) /* INT2ME */
+#define S35390A_INT2_MODE_FREQ         BIT(3) /* INT2FE */
+#define S35390A_INT2_MODE_PMIN         (BIT(3) | BIT(2)) /* INT2FE | INT2ME */
 
 static const struct i2c_device_id s35390a_id[] = {
        { "s35390a", 0 },
@@ -284,6 +285,9 @@ static int s35390a_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
                alm->time.tm_min, alm->time.tm_hour, alm->time.tm_mday,
                alm->time.tm_mon, alm->time.tm_year, alm->time.tm_wday);
 
+       if (alm->time.tm_sec != 0)
+               dev_warn(&client->dev, "Alarms are only supported on a per minute basis!\n");
+
        /* disable interrupt (which deasserts the irq line) */
        err = s35390a_set_reg(s35390a, S35390A_CMD_STATUS2, &sts, sizeof(sts));
        if (err < 0)
@@ -299,9 +303,6 @@ static int s35390a_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
        else
                sts = S35390A_INT2_MODE_NOINTR;
 
-       /* This chip expects the bits of each byte to be in reverse order */
-       sts = bitrev8(sts);
-
        /* set interupt mode*/
        err = s35390a_set_reg(s35390a, S35390A_CMD_STATUS2, &sts, sizeof(sts));
        if (err < 0)
@@ -339,7 +340,7 @@ static int s35390a_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
        if (err < 0)
                return err;
 
-       if ((bitrev8(sts) & S35390A_INT2_MODE_MASK) != S35390A_INT2_MODE_ALARM) {
+       if ((sts & S35390A_INT2_MODE_MASK) != S35390A_INT2_MODE_ALARM) {
                /*
                 * When the alarm isn't enabled, the register to configure
                 * the alarm time isn't accessible.
@@ -431,14 +432,14 @@ static int s35390a_probe(struct i2c_client *client,
        unsigned int i;
        struct s35390a *s35390a;
        char buf, status1;
+       struct device *dev = &client->dev;
 
        if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
                err = -ENODEV;
                goto exit;
        }
 
-       s35390a = devm_kzalloc(&client->dev, sizeof(struct s35390a),
-                               GFP_KERNEL);
+       s35390a = devm_kzalloc(dev, sizeof(struct s35390a), GFP_KERNEL);
        if (!s35390a) {
                err = -ENOMEM;
                goto exit;
@@ -452,8 +453,8 @@ static int s35390a_probe(struct i2c_client *client,
                s35390a->client[i] = i2c_new_dummy(client->adapter,
                                        client->addr + i);
                if (!s35390a->client[i]) {
-                       dev_err(&client->dev, "Address %02x unavailable\n",
-                                               client->addr + i);
+                       dev_err(dev, "Address %02x unavailable\n",
+                               client->addr + i);
                        err = -EBUSY;
                        goto exit_dummy;
                }
@@ -462,7 +463,7 @@ static int s35390a_probe(struct i2c_client *client,
        err_read = s35390a_read_status(s35390a, &status1);
        if (err_read < 0) {
                err = err_read;
-               dev_err(&client->dev, "error resetting chip\n");
+               dev_err(dev, "error resetting chip\n");
                goto exit_dummy;
        }
 
@@ -476,28 +477,30 @@ static int s35390a_probe(struct i2c_client *client,
                buf = 0;
                err = s35390a_set_reg(s35390a, S35390A_CMD_STATUS2, &buf, 1);
                if (err < 0) {
-                       dev_err(&client->dev, "error disabling alarm");
+                       dev_err(dev, "error disabling alarm");
                        goto exit_dummy;
                }
        } else {
                err = s35390a_disable_test_mode(s35390a);
                if (err < 0) {
-                       dev_err(&client->dev, "error disabling test mode\n");
+                       dev_err(dev, "error disabling test mode\n");
                        goto exit_dummy;
                }
        }
 
-       device_set_wakeup_capable(&client->dev, 1);
+       device_set_wakeup_capable(dev, 1);
 
-       s35390a->rtc = devm_rtc_device_register(&client->dev,
-                                       s35390a_driver.driver.name,
-                                       &s35390a_rtc_ops, THIS_MODULE);
+       s35390a->rtc = devm_rtc_device_register(dev, s35390a_driver.driver.name,
+                                               &s35390a_rtc_ops, THIS_MODULE);
 
        if (IS_ERR(s35390a->rtc)) {
                err = PTR_ERR(s35390a->rtc);
                goto exit_dummy;
        }
 
+       /* supports per-minute alarms only, therefore set uie_unsupported */
+       s35390a->rtc->uie_unsupported = 1;
+
        if (status1 & S35390A_FLAG_INT2)
                rtc_update_irq(s35390a->rtc, 1, RTC_AF);