]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
rtc: ds3232: use rtc->ops_lock to protect alarm operations
authorAkinobu Mita <akinobu.mita@gmail.com>
Sun, 6 Mar 2016 15:27:53 +0000 (00:27 +0900)
committerAlexandre Belloni <alexandre.belloni@free-electrons.com>
Mon, 14 Mar 2016 16:08:38 +0000 (17:08 +0100)
ds3232->mutex is used to protect for alarm operations which
need to access status and control registers.

But we can use rtc->ops_lock instead.  rtc->ops_lock is held when most
of rtc_class_ops methods are called, so we only need to explicitly
acquire it from irq handler in order to protect form concurrent
accesses.

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
drivers/rtc/rtc-ds3232.c

index 9857287215a94d7795f8231c371df2443215122a..7edc889729c51f0db0c2b7c3c231258ead1bb6b0 100644 (file)
@@ -52,11 +52,6 @@ struct ds3232 {
        int irq;
        struct rtc_device *rtc;
 
-       /* The mutex protects alarm operations, and prevents a race
-        * between the enable_irq() in the workqueue and the free_irq()
-        * in the remove function.
-        */
-       struct mutex mutex;
        bool suspended;
 };
 
@@ -187,8 +182,6 @@ static int ds3232_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
        int ret;
        u8 buf[4];
 
-       mutex_lock(&ds3232->mutex);
-
        ret = regmap_read(ds3232->regmap, DS3232_REG_SR, &stat);
        if (ret)
                goto out;
@@ -215,7 +208,6 @@ static int ds3232_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
 
        ret = 0;
 out:
-       mutex_unlock(&ds3232->mutex);
        return ret;
 }
 
@@ -233,8 +225,6 @@ static int ds3232_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
        if (ds3232->irq <= 0)
                return -EINVAL;
 
-       mutex_lock(&ds3232->mutex);
-
        buf[0] = bin2bcd(alarm->time.tm_sec);
        buf[1] = bin2bcd(alarm->time.tm_min);
        buf[2] = bin2bcd(alarm->time.tm_hour);
@@ -267,7 +257,6 @@ static int ds3232_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
                ret = regmap_write(ds3232->regmap, DS3232_REG_CR, control);
        }
 out:
-       mutex_unlock(&ds3232->mutex);
        return ret;
 }
 
@@ -277,11 +266,9 @@ static int ds3232_update_alarm(struct device *dev, unsigned int enabled)
        int control;
        int ret;
 
-       mutex_lock(&ds3232->mutex);
-
        ret = regmap_read(ds3232->regmap, DS3232_REG_CR, &control);
        if (ret)
-               goto unlock;
+               return ret;
 
        if (enabled)
                /* enable alarm1 interrupt */
@@ -291,9 +278,6 @@ static int ds3232_update_alarm(struct device *dev, unsigned int enabled)
                control &= ~(DS3232_REG_CR_A1IE);
        ret = regmap_write(ds3232->regmap, DS3232_REG_CR, control);
 
-unlock:
-       mutex_unlock(&ds3232->mutex);
-
        return ret;
 }
 
@@ -311,10 +295,11 @@ static irqreturn_t ds3232_irq(int irq, void *dev_id)
 {
        struct device *dev = dev_id;
        struct ds3232 *ds3232 = dev_get_drvdata(dev);
+       struct mutex *lock = &ds3232->rtc->ops_lock;
        int ret;
        int stat, control;
 
-       mutex_lock(&ds3232->mutex);
+       mutex_lock(lock);
 
        ret = regmap_read(ds3232->regmap, DS3232_REG_SR, &stat);
        if (ret)
@@ -352,7 +337,7 @@ static irqreturn_t ds3232_irq(int irq, void *dev_id)
        }
 
 unlock:
-       mutex_unlock(&ds3232->mutex);
+       mutex_unlock(lock);
 
        return IRQ_HANDLED;
 }
@@ -380,8 +365,6 @@ static int ds3232_probe(struct device *dev, struct regmap *regmap, int irq,
        ds3232->dev = dev;
        dev_set_drvdata(dev, ds3232);
 
-       mutex_init(&ds3232->mutex);
-
        ret = ds3232_check_rtc_status(dev);
        if (ret)
                return ret;