[PATCH v1 2/3] platform/surface: surfacepro3_button: Register ACPI notify handler

Rafael J. Wysocki posted 1 patch 1 month ago
drivers/platform/surface/surfacepro3_button.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
[PATCH v1 2/3] platform/surface: surfacepro3_button: Register ACPI notify handler
Posted by Rafael J. Wysocki 1 month ago
From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>

To facilitate subsequent conversion of the driver to a platform one,
make it install an ACPI notify handler directly instead of using
a .notify() callback in struct acpi_driver.

No intentional functional impact.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
 drivers/platform/surface/surfacepro3_button.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/drivers/platform/surface/surfacepro3_button.c b/drivers/platform/surface/surfacepro3_button.c
index a6c9d4d370be..6d394daf5bc4 100644
--- a/drivers/platform/surface/surfacepro3_button.c
+++ b/drivers/platform/surface/surfacepro3_button.c
@@ -72,8 +72,9 @@ struct surface_button {
 	bool suspended;
 };
 
-static void surface_button_notify(struct acpi_device *device, u32 event)
+static void surface_button_notify(acpi_handle handle, u32 event, void *data)
 {
+	struct acpi_device *device = data;
 	struct surface_button *button = acpi_driver_data(device);
 	struct input_dev *input;
 	int key_code = KEY_RESERVED;
@@ -227,6 +228,15 @@ static int surface_button_add(struct acpi_device *device)
 		goto err_free_input;
 
 	device_init_wakeup(&device->dev, true);
+
+	error = acpi_dev_install_notify_handler(device, ACPI_DEVICE_NOTIFY,
+						surface_button_notify, device);
+	if (error) {
+		device_init_wakeup(&device->dev, false);
+		input_unregister_device(input);
+		goto err_free_button;
+	}
+
 	dev_info(&device->dev, "%s [%s]\n", acpi_device_name(device),
 		 acpi_device_bid(device));
 	return 0;
@@ -242,6 +252,8 @@ static void surface_button_remove(struct acpi_device *device)
 {
 	struct surface_button *button = acpi_driver_data(device);
 
+	acpi_dev_remove_notify_handler(device, ACPI_DEVICE_NOTIFY,
+				       surface_button_notify);
 	device_init_wakeup(&device->dev, false);
 	input_unregister_device(button->input);
 	kfree(button);
@@ -257,7 +269,6 @@ static struct acpi_driver surface_button_driver = {
 	.ops = {
 		.add = surface_button_add,
 		.remove = surface_button_remove,
-		.notify = surface_button_notify,
 	},
 	.drv.pm = &surface_button_pm,
 };
-- 
2.51.0
Re: [PATCH v1 2/3] platform/surface: surfacepro3_button: Register ACPI notify handler
Posted by Ilpo Järvinen 1 month ago
On Wed, 4 Mar 2026, Rafael J. Wysocki wrote:

> From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
> 
> To facilitate subsequent conversion of the driver to a platform one,
> make it install an ACPI notify handler directly instead of using
> a .notify() callback in struct acpi_driver.
> 
> No intentional functional impact.
> 
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> ---
>  drivers/platform/surface/surfacepro3_button.c | 15 +++++++++++++--
>  1 file changed, 13 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/platform/surface/surfacepro3_button.c b/drivers/platform/surface/surfacepro3_button.c
> index a6c9d4d370be..6d394daf5bc4 100644
> --- a/drivers/platform/surface/surfacepro3_button.c
> +++ b/drivers/platform/surface/surfacepro3_button.c
> @@ -72,8 +72,9 @@ struct surface_button {
>  	bool suspended;
>  };
>  
> -static void surface_button_notify(struct acpi_device *device, u32 event)
> +static void surface_button_notify(acpi_handle handle, u32 event, void *data)
>  {
> +	struct acpi_device *device = data;
>  	struct surface_button *button = acpi_driver_data(device);
>  	struct input_dev *input;
>  	int key_code = KEY_RESERVED;
> @@ -227,6 +228,15 @@ static int surface_button_add(struct acpi_device *device)
>  		goto err_free_input;
>  
>  	device_init_wakeup(&device->dev, true);
> +
> +	error = acpi_dev_install_notify_handler(device, ACPI_DEVICE_NOTIFY,
> +						surface_button_notify, device);
> +	if (error) {
> +		device_init_wakeup(&device->dev, false);
> +		input_unregister_device(input);

Add a new label to rollback path instead.

> +		goto err_free_button;
> +	}
> +
>  	dev_info(&device->dev, "%s [%s]\n", acpi_device_name(device),
>  		 acpi_device_bid(device));
>  	return 0;
> @@ -242,6 +252,8 @@ static void surface_button_remove(struct acpi_device *device)
>  {
>  	struct surface_button *button = acpi_driver_data(device);
>  
> +	acpi_dev_remove_notify_handler(device, ACPI_DEVICE_NOTIFY,
> +				       surface_button_notify);
>  	device_init_wakeup(&device->dev, false);
>  	input_unregister_device(button->input);
>  	kfree(button);
> @@ -257,7 +269,6 @@ static struct acpi_driver surface_button_driver = {
>  	.ops = {
>  		.add = surface_button_add,
>  		.remove = surface_button_remove,
> -		.notify = surface_button_notify,
>  	},
>  	.drv.pm = &surface_button_pm,
>  };
> 

-- 
 i.
Re: [PATCH v1 2/3] platform/surface: surfacepro3_button: Register ACPI notify handler
Posted by Ilpo Järvinen 1 month ago
On Mon, 9 Mar 2026, Ilpo Järvinen wrote:

> On Wed, 4 Mar 2026, Rafael J. Wysocki wrote:
> 
> > From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
> > 
> > To facilitate subsequent conversion of the driver to a platform one,
> > make it install an ACPI notify handler directly instead of using
> > a .notify() callback in struct acpi_driver.
> > 
> > No intentional functional impact.
> > 
> > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> > ---
> >  drivers/platform/surface/surfacepro3_button.c | 15 +++++++++++++--
> >  1 file changed, 13 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/platform/surface/surfacepro3_button.c b/drivers/platform/surface/surfacepro3_button.c
> > index a6c9d4d370be..6d394daf5bc4 100644
> > --- a/drivers/platform/surface/surfacepro3_button.c
> > +++ b/drivers/platform/surface/surfacepro3_button.c
> > @@ -72,8 +72,9 @@ struct surface_button {
> >  	bool suspended;
> >  };
> >  
> > -static void surface_button_notify(struct acpi_device *device, u32 event)
> > +static void surface_button_notify(acpi_handle handle, u32 event, void *data)
> >  {
> > +	struct acpi_device *device = data;
> >  	struct surface_button *button = acpi_driver_data(device);
> >  	struct input_dev *input;
> >  	int key_code = KEY_RESERVED;
> > @@ -227,6 +228,15 @@ static int surface_button_add(struct acpi_device *device)
> >  		goto err_free_input;
> >  
> >  	device_init_wakeup(&device->dev, true);
> > +
> > +	error = acpi_dev_install_notify_handler(device, ACPI_DEVICE_NOTIFY,
> > +						surface_button_notify, device);
> > +	if (error) {
> > +		device_init_wakeup(&device->dev, false);
> > +		input_unregister_device(input);
> 
> Add a new label to rollback path instead.

Nevermind.

-- 
 i.

> > +		goto err_free_button;
> > +	}
> > +
> >  	dev_info(&device->dev, "%s [%s]\n", acpi_device_name(device),
> >  		 acpi_device_bid(device));
> >  	return 0;
> > @@ -242,6 +252,8 @@ static void surface_button_remove(struct acpi_device *device)
> >  {
> >  	struct surface_button *button = acpi_driver_data(device);
> >  
> > +	acpi_dev_remove_notify_handler(device, ACPI_DEVICE_NOTIFY,
> > +				       surface_button_notify);
> >  	device_init_wakeup(&device->dev, false);
> >  	input_unregister_device(button->input);
> >  	kfree(button);
> > @@ -257,7 +269,6 @@ static struct acpi_driver surface_button_driver = {
> >  	.ops = {
> >  		.add = surface_button_add,
> >  		.remove = surface_button_remove,
> > -		.notify = surface_button_notify,
> >  	},
> >  	.drv.pm = &surface_button_pm,
> >  };
> > 
> 
>