Multiple mapping table entries could reference the same pin, and hence"own" it. This would be unusual now that pinctrl_get() represents a singlestate for a client device, but in the future when it represents all knownstates for a device, this is quite likely. Implement reference countingfor pin ownership to handle this.

diff --git a/drivers/pinctrl/core.h b/drivers/pinctrl/core.hindex 5f258b7..0bc52ec 100644--- a/drivers/pinctrl/core.h+++ b/drivers/pinctrl/core.h@@ -82,7 +82,14 @@ struct pinctrl_setting { * @name: a name for the pin, e.g. the name of the pin/pad/finger on a * datasheet or such * @dynamic_name: if the name of this pin was dynamically allocated- * @owner: the device holding this pin or NULL of no device has claimed it+ * @usecount: If zero, the pin is not claimed, and @owner should be NULL.+ * If non-zero, this pin is claimed by @owner. This field is an integer+ * rather than a boolean, since pinctrl_get() might process multiple+ * mapping table entries that refer to, and hence claim, the same group+ * or pin, and each of these will increment the @usecount.+ * @owner: The name of the entity owning the pin. Typically, this is the name+ * of the device that called pinctrl_get(). Alternatively, it may be the+ * name of the GPIO passed to pinctrl_request_gpio(). */ struct pin_desc { struct pinctrl_dev *pctldev;@@ -90,6 +97,7 @@ struct pin_desc { bool dynamic_name; /* These fields only added when supporting pinmux drivers */ #ifdef CONFIG_PINMUX+ unsigned usecount; const char *owner; #endif };diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.cindex f0fb98d..56ca42e 100644--- a/drivers/pinctrl/pinmux.c+++ b/drivers/pinctrl/pinmux.c@@ -83,11 +83,16 @@ static int pin_request(struct pinctrl_dev *pctldev, goto out; }