]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
gpio: graniterapids: Determine if GPIO pad can be used by driver
authorAlan Borzeszkowski <alan.borzeszkowski@linux.intel.com>
Wed, 4 Dec 2024 07:04:13 +0000 (09:04 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 19 Dec 2024 17:13:03 +0000 (18:13 +0100)
commit 0588504d28dedde6789aec17a6ece6fa8e477725 upstream.

Add check of HOSTSW_MODE bit to determine if GPIO pad can be used by the
driver.

Cc: stable@vger.kernel.org
Signed-off-by: Alan Borzeszkowski <alan.borzeszkowski@linux.intel.com>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Acked-by: Andy Shevchenko <andy@kernel.org>
Link: https://lore.kernel.org/r/20241204070415.1034449-6-mika.westerberg@linux.intel.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpio/gpio-graniterapids.c

index 4b494df982b470a7ce083814e23091e69d1a4854..88b579ff5f00553b037b57683d7c8cefa9a72a82 100644 (file)
@@ -37,6 +37,7 @@
 #define GNR_GPI_STATUS_OFFSET  0x14
 #define GNR_GPI_ENABLE_OFFSET  0x24
 
+#define GNR_CFG_DW_HOSTSW_MODE BIT(27)
 #define GNR_CFG_DW_RX_MASK     GENMASK(23, 22)
 #define GNR_CFG_DW_RX_DISABLE  FIELD_PREP(GNR_CFG_DW_RX_MASK, 2)
 #define GNR_CFG_DW_RX_EDGE     FIELD_PREP(GNR_CFG_DW_RX_MASK, 1)
@@ -90,6 +91,20 @@ static int gnr_gpio_configure_line(struct gpio_chip *gc, unsigned int gpio,
        return 0;
 }
 
+static int gnr_gpio_request(struct gpio_chip *gc, unsigned int gpio)
+{
+       struct gnr_gpio *priv = gpiochip_get_data(gc);
+       u32 dw;
+
+       dw = readl(gnr_gpio_get_padcfg_addr(priv, gpio));
+       if (!(dw & GNR_CFG_DW_HOSTSW_MODE)) {
+               dev_warn(gc->parent, "GPIO %u is not owned by host", gpio);
+               return -EBUSY;
+       }
+
+       return 0;
+}
+
 static int gnr_gpio_get(struct gpio_chip *gc, unsigned int gpio)
 {
        const struct gnr_gpio *priv = gpiochip_get_data(gc);
@@ -141,6 +156,7 @@ static int gnr_gpio_direction_output(struct gpio_chip *gc, unsigned int gpio, in
 
 static const struct gpio_chip gnr_gpio_chip = {
        .owner            = THIS_MODULE,
+       .request          = gnr_gpio_request,
        .get              = gnr_gpio_get,
        .set              = gnr_gpio_set,
        .get_direction    = gnr_gpio_get_direction,