]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
platform/x86: toshiba_bluetooth: Register ACPI notify handler directly
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 24 Mar 2026 20:00:50 +0000 (21:00 +0100)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Tue, 31 Mar 2026 16:14:29 +0000 (19:14 +0300)
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>
Link: https://patch.msgid.link/3048289.e9J7NaK4W3@rafael.j.wysocki
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/toshiba_bluetooth.c

index e587beef05b976fb619d58b7d6aeacf4391ab095..3824c2beaf11e903dd4e1dd7f7517f9d3bb0dc99 100644 (file)
@@ -37,7 +37,7 @@ struct toshiba_bluetooth_dev {
 
 static int toshiba_bt_rfkill_add(struct acpi_device *device);
 static void toshiba_bt_rfkill_remove(struct acpi_device *device);
-static void toshiba_bt_rfkill_notify(struct acpi_device *device, u32 event);
+static void toshiba_bt_rfkill_notify(acpi_handle handle, u32 event, void *data);
 
 static const struct acpi_device_id bt_device_ids[] = {
        { "TOS6205", 0},
@@ -57,7 +57,6 @@ static struct acpi_driver toshiba_bt_rfkill_driver = {
        .ops =          {
                                .add =          toshiba_bt_rfkill_add,
                                .remove =       toshiba_bt_rfkill_remove,
-                               .notify =       toshiba_bt_rfkill_notify,
                        },
        .drv.pm =       &toshiba_bt_pm,
 };
@@ -203,9 +202,9 @@ static const struct rfkill_ops rfk_ops = {
 };
 
 /* ACPI driver functions */
-static void toshiba_bt_rfkill_notify(struct acpi_device *device, u32 event)
+static void toshiba_bt_rfkill_notify(acpi_handle handle, u32 event, void *data)
 {
-       struct toshiba_bluetooth_dev *bt_dev = acpi_driver_data(device);
+       struct toshiba_bluetooth_dev *bt_dev = data;
 
        if (toshiba_bluetooth_sync_status(bt_dev))
                return;
@@ -262,8 +261,8 @@ static int toshiba_bt_rfkill_add(struct acpi_device *device)
                                   bt_dev);
        if (!bt_dev->rfk) {
                pr_err("Unable to allocate rfkill device\n");
-               kfree(bt_dev);
-               return -ENOMEM;
+               result = -ENOMEM;
+               goto err_free_bt_dev;
        }
 
        rfkill_set_hw_state(bt_dev->rfk, !bt_dev->killswitch);
@@ -271,10 +270,24 @@ static int toshiba_bt_rfkill_add(struct acpi_device *device)
        result = rfkill_register(bt_dev->rfk);
        if (result) {
                pr_err("Unable to register rfkill device\n");
-               rfkill_destroy(bt_dev->rfk);
-               kfree(bt_dev);
+               goto err_rfkill_destroy;
        }
 
+       result = acpi_dev_install_notify_handler(device, ACPI_DEVICE_NOTIFY,
+                                                toshiba_bt_rfkill_notify, bt_dev);
+       if (result) {
+               pr_err("Unable to register ACPI notify handler\n");
+               goto err_rfkill_unregister;
+       }
+
+       return 0;
+
+err_rfkill_unregister:
+       rfkill_unregister(bt_dev->rfk);
+err_rfkill_destroy:
+       rfkill_destroy(bt_dev->rfk);
+err_free_bt_dev:
+       kfree(bt_dev);
        return result;
 }
 
@@ -283,6 +296,9 @@ static void toshiba_bt_rfkill_remove(struct acpi_device *device)
        struct toshiba_bluetooth_dev *bt_dev = acpi_driver_data(device);
 
        /* clean up */
+       acpi_dev_remove_notify_handler(device, ACPI_DEVICE_NOTIFY,
+                                      toshiba_bt_rfkill_notify);
+
        if (bt_dev->rfk) {
                rfkill_unregister(bt_dev->rfk);
                rfkill_destroy(bt_dev->rfk);