On Wed, 11 Dec 2024, Joe Hattori wrote: > Current code leaves the device's wakeup enabled in the error path of > .probe() and .remove(). Also, the registered input device is not > unregistered. Add a devm_add_action_or_reset() call and cleanup these > resources in the callback. > > Fixes: 3d904005f686 ("platform/x86: add support for Advantech software defined button") > Signed-off-by: Joe Hattori <joe@xxxxxxxxxxxxxxxxxxxxx> > --- > Changes in V2: > - Use devm_add_action_or_reset(). > - Call input_unregister_device(). > --- > drivers/platform/x86/adv_swbutton.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/drivers/platform/x86/adv_swbutton.c b/drivers/platform/x86/adv_swbutton.c > index 6fa60f3fc53c..5b07c42adfad 100644 > --- a/drivers/platform/x86/adv_swbutton.c > +++ b/drivers/platform/x86/adv_swbutton.c > @@ -44,6 +44,14 @@ static void adv_swbutton_notify(acpi_handle handle, u32 event, void *context) > } > } > > +static void adv_swbutton_release(void *__input) > +{ > + struct input_dev *input = __input; > + > + input_unregister_device(input); Better but the input device is managed so the unregister call is unnecessary. devm_input_allocate_device() comment says: * Managed input devices do not need to be explicitly unregistered or * freed as it will be done automatically when owner device unbinds from * its driver (or binding fails). Once managed input device is allocated, * it is ready to be set up and registered in the same fashion as regular * input device. There are no special devm_input_device_[un]register() * variants, regular ones work with both managed and unmanaged devices, * should you need them. In most cases however, managed input device need * not be explicitly unregistered or freed. -- i. > + device_init_wakeup(input->dev.parent, false); > +} > + > static int adv_swbutton_probe(struct platform_device *device) > { > struct adv_swbutton *button; > @@ -78,6 +86,9 @@ static int adv_swbutton_probe(struct platform_device *device) > > device_init_wakeup(&device->dev, true); > > + if (devm_add_action_or_reset(&device->dev, adv_swbutton_release, input)) > + return -ENOMEM; > + > status = acpi_install_notify_handler(handle, > ACPI_DEVICE_NOTIFY, > adv_swbutton_notify, >