* Copyright (c) 2022, Linaro Ltd
  */
 #include <linux/auxiliary_bus.h>
+#include <linux/cleanup.h>
 #include <linux/delay.h>
 #include <linux/module.h>
 #include <linux/of.h>
        struct pmic_glink *pg = client->pg;
        unsigned long flags;
 
-       mutex_lock(&pg->state_lock);
+       guard(mutex)(&pg->state_lock);
        spin_lock_irqsave(&pg->client_lock, flags);
 
        list_add(&client->node, &pg->clients);
        client->pdr_notify(client->priv, pg->client_state);
 
        spin_unlock_irqrestore(&pg->client_lock, flags);
-       mutex_unlock(&pg->state_lock);
-
 }
 EXPORT_SYMBOL_GPL(pmic_glink_client_register);
 
        unsigned long start;
        int ret;
 
-       mutex_lock(&pg->state_lock);
+       guard(mutex)(&pg->state_lock);
        if (!pg->ept) {
-               ret = -ECONNRESET;
-       } else {
-               start = jiffies;
-               for (;;) {
-                       ret = rpmsg_send(pg->ept, data, len);
-                       if (ret != -EAGAIN)
-                               break;
-
-                       if (timeout_reached) {
-                               ret = -ETIMEDOUT;
-                               break;
-                       }
-
-                       usleep_range(1000, 5000);
-                       timeout_reached = time_after(jiffies, start + PMIC_GLINK_SEND_TIMEOUT);
+               return -ECONNRESET;
+       }
+
+       start = jiffies;
+       for (;;) {
+               ret = rpmsg_send(pg->ept, data, len);
+               if (ret != -EAGAIN)
+                       break;
+
+               if (timeout_reached) {
+                       ret = -ETIMEDOUT;
+                       break;
                }
+
+               usleep_range(1000, 5000);
+               timeout_reached = time_after(jiffies, start + PMIC_GLINK_SEND_TIMEOUT);
        }
-       mutex_unlock(&pg->state_lock);
 
        return ret;
 }
 {
        struct pmic_glink *pg = priv;
 
-       mutex_lock(&pg->state_lock);
+       guard(mutex)(&pg->state_lock);
        pg->pdr_state = state;
 
        pmic_glink_state_notify_clients(pg);
-       mutex_unlock(&pg->state_lock);
 }
 
 static int pmic_glink_rpmsg_probe(struct rpmsg_device *rpdev)
 {
        struct pmic_glink *pg = __pmic_glink;
-       int ret = 0;
 
-       mutex_lock(&__pmic_glink_lock);
-       if (!pg) {
-               ret = dev_err_probe(&rpdev->dev, -ENODEV, "no pmic_glink device to attach to\n");
-               goto out_unlock;
-       }
+       guard(mutex)(&__pmic_glink_lock);
+       pg = __pmic_glink;
+       if (!pg)
+               return dev_err_probe(&rpdev->dev, -ENODEV, "no pmic_glink device to attach to\n");
 
        dev_set_drvdata(&rpdev->dev, pg);
 
-       mutex_lock(&pg->state_lock);
+       guard(mutex)(&pg->state_lock);
        pg->ept = rpdev->ept;
        pmic_glink_state_notify_clients(pg);
-       mutex_unlock(&pg->state_lock);
 
-out_unlock:
-       mutex_unlock(&__pmic_glink_lock);
-       return ret;
+       return 0;
 }
 
 static void pmic_glink_rpmsg_remove(struct rpmsg_device *rpdev)
 {
        struct pmic_glink *pg;
 
-       mutex_lock(&__pmic_glink_lock);
+       guard(mutex)(&__pmic_glink_lock);
        pg = __pmic_glink;
        if (!pg)
-               goto out_unlock;
+               return;
 
-       mutex_lock(&pg->state_lock);
+       guard(mutex)(&pg->state_lock);
        pg->ept = NULL;
        pmic_glink_state_notify_clients(pg);
-       mutex_unlock(&pg->state_lock);
-out_unlock:
-       mutex_unlock(&__pmic_glink_lock);
 }
 
 static const struct rpmsg_device_id pmic_glink_rpmsg_id_match[] = {
        if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI))
                pmic_glink_del_aux_device(pg, &pg->ucsi_aux);
 
-       mutex_lock(&__pmic_glink_lock);
+       guard(mutex)(&__pmic_glink_lock);
        __pmic_glink = NULL;
-       mutex_unlock(&__pmic_glink_lock);
 }
 
 static const unsigned long pmic_glink_sc8280xp_client_mask = BIT(PMIC_GLINK_CLIENT_BATT) |