| From b037d60a3b1d1227609fd858fa34321f41829911 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= <mirq-linux@rere.qmqm.pl> |
| Date: Wed, 24 Jun 2020 13:35:41 +0200 |
| Subject: misc: atmel-ssc: lock with mutex instead of spinlock |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Michał Mirosław <mirq-linux@rere.qmqm.pl> |
| |
| commit b037d60a3b1d1227609fd858fa34321f41829911 upstream. |
| |
| Uninterruptible context is not needed in the driver and causes lockdep |
| warning because of mutex taken in of_alias_get_id(). Convert the lock to |
| mutex to avoid the issue. |
| |
| Cc: stable@vger.kernel.org |
| Fixes: 099343c64e16 ("ARM: at91: atmel-ssc: add device tree support") |
| Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl> |
| Link: https://lore.kernel.org/r/50f0d7fa107f318296afb49477c3571e4d6978c5.1592998403.git.mirq-linux@rere.qmqm.pl |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/misc/atmel-ssc.c | 24 ++++++++++++------------ |
| 1 file changed, 12 insertions(+), 12 deletions(-) |
| |
| --- a/drivers/misc/atmel-ssc.c |
| +++ b/drivers/misc/atmel-ssc.c |
| @@ -13,7 +13,7 @@ |
| #include <linux/clk.h> |
| #include <linux/err.h> |
| #include <linux/io.h> |
| -#include <linux/spinlock.h> |
| +#include <linux/mutex.h> |
| #include <linux/atmel-ssc.h> |
| #include <linux/slab.h> |
| #include <linux/module.h> |
| @@ -21,7 +21,7 @@ |
| #include <linux/of.h> |
| |
| /* Serialize access to ssc_list and user count */ |
| -static DEFINE_SPINLOCK(user_lock); |
| +static DEFINE_MUTEX(user_lock); |
| static LIST_HEAD(ssc_list); |
| |
| struct ssc_device *ssc_request(unsigned int ssc_num) |
| @@ -29,7 +29,7 @@ struct ssc_device *ssc_request(unsigned |
| int ssc_valid = 0; |
| struct ssc_device *ssc; |
| |
| - spin_lock(&user_lock); |
| + mutex_lock(&user_lock); |
| list_for_each_entry(ssc, &ssc_list, list) { |
| if (ssc->pdev->dev.of_node) { |
| if (of_alias_get_id(ssc->pdev->dev.of_node, "ssc") |
| @@ -45,18 +45,18 @@ struct ssc_device *ssc_request(unsigned |
| } |
| |
| if (!ssc_valid) { |
| - spin_unlock(&user_lock); |
| + mutex_unlock(&user_lock); |
| pr_err("ssc: ssc%d platform device is missing\n", ssc_num); |
| return ERR_PTR(-ENODEV); |
| } |
| |
| if (ssc->user) { |
| - spin_unlock(&user_lock); |
| + mutex_unlock(&user_lock); |
| dev_dbg(&ssc->pdev->dev, "module busy\n"); |
| return ERR_PTR(-EBUSY); |
| } |
| ssc->user++; |
| - spin_unlock(&user_lock); |
| + mutex_unlock(&user_lock); |
| |
| clk_prepare(ssc->clk); |
| |
| @@ -68,14 +68,14 @@ void ssc_free(struct ssc_device *ssc) |
| { |
| bool disable_clk = true; |
| |
| - spin_lock(&user_lock); |
| + mutex_lock(&user_lock); |
| if (ssc->user) |
| ssc->user--; |
| else { |
| disable_clk = false; |
| dev_dbg(&ssc->pdev->dev, "device already free\n"); |
| } |
| - spin_unlock(&user_lock); |
| + mutex_unlock(&user_lock); |
| |
| if (disable_clk) |
| clk_unprepare(ssc->clk); |
| @@ -195,9 +195,9 @@ static int ssc_probe(struct platform_dev |
| return -ENXIO; |
| } |
| |
| - spin_lock(&user_lock); |
| + mutex_lock(&user_lock); |
| list_add_tail(&ssc->list, &ssc_list); |
| - spin_unlock(&user_lock); |
| + mutex_unlock(&user_lock); |
| |
| platform_set_drvdata(pdev, ssc); |
| |
| @@ -211,9 +211,9 @@ static int ssc_remove(struct platform_de |
| { |
| struct ssc_device *ssc = platform_get_drvdata(pdev); |
| |
| - spin_lock(&user_lock); |
| + mutex_lock(&user_lock); |
| list_del(&ssc->list); |
| - spin_unlock(&user_lock); |
| + mutex_unlock(&user_lock); |
| |
| return 0; |
| } |