#include <linux/array_size.h>
 #include <linux/ctype.h>
+#include <linux/cleanup.h>
 #include <linux/debugfs.h>
 #include <linux/device.h>
 #include <linux/err.h>
        if (!desc || !ops)
                return true;
 
+       guard(mutex)(&desc->mux_lock);
        if (ops->strict && desc->mux_usecount)
                return false;
 
        dev_dbg(pctldev->dev, "request pin %d (%s) for %s\n",
                pin, desc->name, owner);
 
-       if ((!gpio_range || ops->strict) &&
-           desc->mux_usecount && strcmp(desc->mux_owner, owner)) {
-               dev_err(pctldev->dev,
-                       "pin %s already requested by %s; cannot claim for %s\n",
-                       desc->name, desc->mux_owner, owner);
-               goto out;
-       }
+       scoped_guard(mutex, &desc->mux_lock) {
+               if ((!gpio_range || ops->strict) &&
+                   desc->mux_usecount && strcmp(desc->mux_owner, owner)) {
+                       dev_err(pctldev->dev,
+                               "pin %s already requested by %s; cannot claim for %s\n",
+                               desc->name, desc->mux_owner, owner);
+                       goto out;
+               }
 
-       if ((gpio_range || ops->strict) && desc->gpio_owner) {
-               dev_err(pctldev->dev,
-                       "pin %s already requested by %s; cannot claim for %s\n",
-                       desc->name, desc->gpio_owner, owner);
-               goto out;
-       }
+               if ((gpio_range || ops->strict) && desc->gpio_owner) {
+                       dev_err(pctldev->dev,
+                               "pin %s already requested by %s; cannot claim for %s\n",
+                               desc->name, desc->gpio_owner, owner);
+                       goto out;
+               }
 
-       if (gpio_range) {
-               desc->gpio_owner = owner;
-       } else {
-               desc->mux_usecount++;
-               if (desc->mux_usecount > 1)
-                       return 0;
+               if (gpio_range) {
+                       desc->gpio_owner = owner;
+               } else {
+                       desc->mux_usecount++;
+                       if (desc->mux_usecount > 1)
+                               return 0;
 
-               desc->mux_owner = owner;
+                       desc->mux_owner = owner;
+               }
        }
 
        /* Let each pin increase references to this module */
 
 out_free_pin:
        if (status) {
-               if (gpio_range) {
-                       desc->gpio_owner = NULL;
-               } else {
-                       desc->mux_usecount--;
-                       if (!desc->mux_usecount)
-                               desc->mux_owner = NULL;
+               scoped_guard(mutex, &desc->mux_lock) {
+                       if (gpio_range) {
+                               desc->gpio_owner = NULL;
+                       } else {
+                               desc->mux_usecount--;
+                               if (!desc->mux_usecount)
+                                       desc->mux_owner = NULL;
+                       }
                }
        }
 out:
                return NULL;
        }
 
-       if (!gpio_range) {
-               /*
-                * A pin should not be freed more times than allocated.
-                */
-               if (WARN_ON(!desc->mux_usecount))
-                       return NULL;
-               desc->mux_usecount--;
-               if (desc->mux_usecount)
-                       return NULL;
+       scoped_guard(mutex, &desc->mux_lock) {
+               if (!gpio_range) {
+                       /*
+                        * A pin should not be freed more times than allocated.
+                        */
+                       if (WARN_ON(!desc->mux_usecount))
+                               return NULL;
+                       desc->mux_usecount--;
+                       if (desc->mux_usecount)
+                               return NULL;
+               }
        }
 
        /*
        else if (ops->free)
                ops->free(pctldev, pin);
 
-       if (gpio_range) {
-               owner = desc->gpio_owner;
-               desc->gpio_owner = NULL;
-       } else {
-               owner = desc->mux_owner;
-               desc->mux_owner = NULL;
-               desc->mux_setting = NULL;
+       scoped_guard(mutex, &desc->mux_lock) {
+               if (gpio_range) {
+                       owner = desc->gpio_owner;
+                       desc->gpio_owner = NULL;
+               } else {
+                       owner = desc->mux_owner;
+                       desc->mux_owner = NULL;
+                       desc->mux_setting = NULL;
+               }
        }
 
        module_put(pctldev->owner);
                                 pins[i]);
                        continue;
                }
-               desc->mux_setting = &(setting->data.mux);
+               scoped_guard(mutex, &desc->mux_lock)
+                       desc->mux_setting = &(setting->data.mux);
        }
 
        ret = ops->set_mux(pctldev, setting->data.mux.func,
 err_set_mux:
        for (i = 0; i < num_pins; i++) {
                desc = pin_desc_get(pctldev, pins[i]);
-               if (desc)
-                       desc->mux_setting = NULL;
+               if (desc) {
+                       scoped_guard(mutex, &desc->mux_lock)
+                               desc->mux_setting = NULL;
+               }
        }
 err_pin_request:
        /* On error release all taken pins */
        unsigned int num_pins = 0;
        int i;
        struct pin_desc *desc;
+       bool is_equal;
 
        if (pctlops->get_group_pins)
                ret = pctlops->get_group_pins(pctldev, setting->data.mux.group,
                                 pins[i]);
                        continue;
                }
-               if (desc->mux_setting == &(setting->data.mux)) {
+               scoped_guard(mutex, &desc->mux_lock)
+                       is_equal = (desc->mux_setting == &(setting->data.mux));
+
+               if (is_equal) {
                        pin_free(pctldev, pins[i], NULL);
                } else {
                        const char *gname;
                if (desc == NULL)
                        continue;
 
-               if (desc->mux_owner &&
-                   !strcmp(desc->mux_owner, pinctrl_dev_get_name(pctldev)))
-                       is_hog = true;
-
-               if (pmxops->strict) {
-                       if (desc->mux_owner)
-                               seq_printf(s, "pin %d (%s): device %s%s",
-                                          pin, desc->name, desc->mux_owner,
+               scoped_guard(mutex, &desc->mux_lock) {
+                       if (desc->mux_owner &&
+                           !strcmp(desc->mux_owner, pinctrl_dev_get_name(pctldev)))
+                               is_hog = true;
+
+                       if (pmxops->strict) {
+                               if (desc->mux_owner)
+                                       seq_printf(s, "pin %d (%s): device %s%s",
+                                                  pin, desc->name, desc->mux_owner,
+                                                  is_hog ? " (HOG)" : "");
+                               else if (desc->gpio_owner)
+                                       seq_printf(s, "pin %d (%s): GPIO %s",
+                                                  pin, desc->name, desc->gpio_owner);
+                               else
+                                       seq_printf(s, "pin %d (%s): UNCLAIMED",
+                                                  pin, desc->name);
+                       } else {
+                               /* For non-strict controllers */
+                               seq_printf(s, "pin %d (%s): %s %s%s", pin, desc->name,
+                                          desc->mux_owner ? desc->mux_owner
+                                          : "(MUX UNCLAIMED)",
+                                          desc->gpio_owner ? desc->gpio_owner
+                                          : "(GPIO UNCLAIMED)",
                                           is_hog ? " (HOG)" : "");
-                       else if (desc->gpio_owner)
-                               seq_printf(s, "pin %d (%s): GPIO %s",
-                                          pin, desc->name, desc->gpio_owner);
+                       }
+
+                       /* If mux: print function+group claiming the pin */
+                       if (desc->mux_setting)
+                               seq_printf(s, " function %s group %s\n",
+                                          pmxops->get_function_name(pctldev,
+                                               desc->mux_setting->func),
+                                          pctlops->get_group_name(pctldev,
+                                               desc->mux_setting->group));
                        else
-                               seq_printf(s, "pin %d (%s): UNCLAIMED",
-                                          pin, desc->name);
-               } else {
-                       /* For non-strict controllers */
-                       seq_printf(s, "pin %d (%s): %s %s%s", pin, desc->name,
-                                  desc->mux_owner ? desc->mux_owner
-                                  : "(MUX UNCLAIMED)",
-                                  desc->gpio_owner ? desc->gpio_owner
-                                  : "(GPIO UNCLAIMED)",
-                                  is_hog ? " (HOG)" : "");
+                               seq_putc(s, '\n');
                }
-
-               /* If mux: print function+group claiming the pin */
-               if (desc->mux_setting)
-                       seq_printf(s, " function %s group %s\n",
-                                  pmxops->get_function_name(pctldev,
-                                       desc->mux_setting->func),
-                                  pctlops->get_group_name(pctldev,
-                                       desc->mux_setting->group));
-               else
-                       seq_putc(s, '\n');
        }
 
        mutex_unlock(&pctldev->mutex);