[RFC PATCH 1/3] pinctrl/core: check that can_sleep is true in pinctrl_gpio_direction()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Since pinctrl_gpio_direction() takes a mutex, the gpio driver must
have can_sleep set to true. If not, then this function will call
WARN_ON (only once per pin controller) to tell the developer that
something must be done: either set can_sleep to true, or set the
direction in the combine gpio/pinctrl driver itself without calling
pinctrl_gpio_direction_input/output.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xxxxxxxxx>
---
 drivers/pinctrl/core.c | 11 +++++++++++
 drivers/pinctrl/core.h |  4 ++++
 2 files changed, 15 insertions(+)

diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
index ffe39336fcac..886242d08dcf 100644
--- a/drivers/pinctrl/core.c
+++ b/drivers/pinctrl/core.c
@@ -845,6 +845,17 @@ static int pinctrl_gpio_direction(unsigned gpio, bool input)
 
 	mutex_lock(&pctldev->mutex);
 
+	if (!pctldev->checked_can_sleep) {
+		struct gpio_chip *chip = gpio_to_chip(gpio);
+
+		pctldev->checked_can_sleep = true;
+		/*
+		 * This pin controller can sleep, so check that the gpio
+		 * controller sets can_sleep to true.
+		 */
+		WARN_ON(chip && !chip->can_sleep);
+	}
+
 	/* Convert to the pin controllers number space */
 	pin = gpio_to_pin(range, gpio);
 	ret = pinmux_gpio_direction(pctldev, range, pin, input);
diff --git a/drivers/pinctrl/core.h b/drivers/pinctrl/core.h
index 840103c40c14..ae14b4e69b7b 100644
--- a/drivers/pinctrl/core.h
+++ b/drivers/pinctrl/core.h
@@ -38,6 +38,9 @@ struct pinctrl_gpio_range;
  * @hog_sleep: sleep state for pins hogged by this device
  * @mutex: mutex taken on each pin controller specific action
  * @device_root: debugfs root for this device
+ * @checked_can_sleep: used internally to warn once if pinctrl_gpio_direction()
+ *	is called from a gpio driver that didn't set @can_sleep to true.
+ *	pinctrl_gpio_direction() uses mutexes, so it can sleep.
  */
 struct pinctrl_dev {
 	struct list_head node;
@@ -62,6 +65,7 @@ struct pinctrl_dev {
 #ifdef CONFIG_DEBUG_FS
 	struct dentry *device_root;
 #endif
+	bool checked_can_sleep;
 };
 
 /**
-- 
2.33.0




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux