{
        int n_events = get_n_events_by_type(type);
        const unsigned long *bitmap = get_bm_events_by_type(ddata->input, type);
-       unsigned long *bits;
        ssize_t error;
        int i;
 
-       bits = bitmap_alloc(n_events, GFP_KERNEL);
+       unsigned long *bits __free(bitmap) = bitmap_alloc(n_events, GFP_KERNEL);
        if (!bits)
                return -ENOMEM;
 
        error = bitmap_parselist(buf, bits, n_events);
        if (error)
-               goto out;
+               return error;
 
        /* First validate */
-       if (!bitmap_subset(bits, bitmap, n_events)) {
-               error = -EINVAL;
-               goto out;
-       }
+       if (!bitmap_subset(bits, bitmap, n_events))
+               return -EINVAL;
 
        for (i = 0; i < ddata->pdata->nbuttons; i++) {
                struct gpio_button_data *bdata = &ddata->data[i];
 
                if (test_bit(*bdata->code, bits) &&
                    !bdata->button->can_disable) {
-                       error = -EINVAL;
-                       goto out;
+                       return -EINVAL;
                }
        }
 
-       mutex_lock(&ddata->disable_lock);
+       guard(mutex)(&ddata->disable_lock);
 
        for (i = 0; i < ddata->pdata->nbuttons; i++) {
                struct gpio_button_data *bdata = &ddata->data[i];
                        gpio_keys_enable_button(bdata);
        }
 
-       mutex_unlock(&ddata->disable_lock);
-
-out:
-       bitmap_free(bits);
-       return error;
+       return 0;
 }
 
 #define ATTR_SHOW_FN(name, type, only_disabled)                                \
 {
        struct gpio_button_data *bdata = dev_id;
        struct input_dev *input = bdata->input;
-       unsigned long flags;
 
        BUG_ON(irq != bdata->irq);
 
-       spin_lock_irqsave(&bdata->lock, flags);
+       guard(spinlock_irqsave)(&bdata->lock);
 
        if (!bdata->key_pressed) {
                if (bdata->button->wakeup)
                              ms_to_ktime(bdata->release_delay),
                              HRTIMER_MODE_REL_HARD);
 out:
-       spin_unlock_irqrestore(&bdata->lock, flags);
        return IRQ_HANDLED;
 }
 
                if (error)
                        return error;
        } else {
-               mutex_lock(&input->mutex);
+               guard(mutex)(&input->mutex);
+
                if (input_device_enabled(input))
                        gpio_keys_close(input);
-               mutex_unlock(&input->mutex);
        }
 
        return 0;
 {
        struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev);
        struct input_dev *input = ddata->input;
-       int error = 0;
+       int error;
 
        if (device_may_wakeup(dev)) {
                gpio_keys_disable_wakeup(ddata);
        } else {
-               mutex_lock(&input->mutex);
-               if (input_device_enabled(input))
+               guard(mutex)(&input->mutex);
+
+               if (input_device_enabled(input)) {
                        error = gpio_keys_open(input);
-               mutex_unlock(&input->mutex);
+                       if (error)
+                               return error;
+               }
        }
 
-       if (error)
-               return error;
-
        gpio_keys_report_state(ddata);
        return 0;
 }