diff options
author | Akinobu Mita <akinobu.mita@gmail.com> | 2016-03-07 00:27:53 +0900 |
---|---|---|
committer | Alexandre Belloni <alexandre.belloni@free-electrons.com> | 2016-03-14 17:08:38 +0100 |
commit | fc1dcb0b39dbb10d3290f2fcd6e154670f699166 (patch) | |
tree | fc0252ddaa4eada3cb9150607bbddf80bfffa68d | |
parent | 95c60c1c8f51521e7f2174fd0fff4dae6d522b83 (diff) |
rtc: ds3232: use rtc->ops_lock to protect alarm operations
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>
-rw-r--r-- | drivers/rtc/rtc-ds3232.c | 25 |
1 files changed, 4 insertions, 21 deletions
diff --git a/drivers/rtc/rtc-ds3232.c b/drivers/rtc/rtc-ds3232.c index 9857287215a9..7edc889729c5 100644 --- a/drivers/rtc/rtc-ds3232.c +++ b/drivers/rtc/rtc-ds3232.c @@ -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; |