Skip to content

Commit

Permalink
misc: atmel-ssc: lock with mutex instead of spinlock
Browse files Browse the repository at this point in the history
commit b037d60 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: 099343c ("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>
  • Loading branch information
Michał Mirosław authored and Greg Kroah-Hartman committed Jul 22, 2020
1 parent c7c3366 commit 0120929
Showing 1 changed file with 12 additions and 12 deletions.
24 changes: 12 additions & 12 deletions drivers/misc/atmel-ssc.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,23 @@
#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>

#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)
{
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")
Expand All @@ -44,18 +44,18 @@ struct ssc_device *ssc_request(unsigned int ssc_num)
}

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);

Expand All @@ -67,14 +67,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);
Expand Down Expand Up @@ -194,9 +194,9 @@ static int ssc_probe(struct platform_device *pdev)
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);

Expand All @@ -210,9 +210,9 @@ static int ssc_remove(struct platform_device *pdev)
{
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;
}
Expand Down

0 comments on commit 0120929

Please sign in to comment.