drivers/char/sonypi.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-)
From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
In all cases in which a struct acpi_driver is used for binding a driver
to an ACPI device object, a corresponding platform device is created by
the ACPI core and that device is regarded as a proper representation of
underlying hardware. Accordingly, a struct platform_driver should be
used by driver code to bind to that device. There are multiple reasons
why drivers should not bind directly to ACPI device objects [1].
Overall, it is better to bind drivers to platform devices than to their
ACPI companions, so convert the sonypi ACPI driver to a platform one.
While this is not expected to alter functionality, it changes sysfs
layout and so it will be visible to user space.
Link: https://lore.kernel.org/all/2396510.ElGaqSPkdT@rafael.j.wysocki/ [1]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
drivers/char/sonypi.c | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/drivers/char/sonypi.c b/drivers/char/sonypi.c
index 677bb5ac950a..ccda997a9098 100644
--- a/drivers/char/sonypi.c
+++ b/drivers/char/sonypi.c
@@ -1115,15 +1115,17 @@ static int sonypi_disable(void)
}
#ifdef CONFIG_ACPI
-static int sonypi_acpi_add(struct acpi_device *device)
+static int sonypi_acpi_probe(struct platform_device *pdev)
{
+ struct acpi_device *device = ACPI_COMPANION(&pdev->dev);
+
sonypi_acpi_device = device;
strcpy(acpi_device_name(device), "Sony laptop hotkeys");
strcpy(acpi_device_class(device), "sony/hotkey");
return 0;
}
-static void sonypi_acpi_remove(struct acpi_device *device)
+static void sonypi_acpi_remove(struct platform_device *pdev)
{
sonypi_acpi_device = NULL;
}
@@ -1133,13 +1135,12 @@ static const struct acpi_device_id sonypi_device_ids[] = {
{"", 0},
};
-static struct acpi_driver sonypi_acpi_driver = {
- .name = "sonypi",
- .class = "hkey",
- .ids = sonypi_device_ids,
- .ops = {
- .add = sonypi_acpi_add,
- .remove = sonypi_acpi_remove,
+static struct platform_driver sonypi_acpi_driver = {
+ .probe = sonypi_acpi_probe,
+ .remove = sonypi_acpi_remove,
+ .driver = {
+ .name = "sonypi_acpi",
+ .acpi_match_table = sonypi_device_ids,
},
};
#endif
@@ -1518,8 +1519,8 @@ static int __init sonypi_init(void)
goto err_free_device;
#ifdef CONFIG_ACPI
- if (acpi_bus_register_driver(&sonypi_acpi_driver) >= 0)
- acpi_driver_registered = 1;
+ error = platform_driver_register(&sonypi_acpi_driver);
+ acpi_driver_registered = !error;
#endif
return 0;
@@ -1535,7 +1536,7 @@ static void __exit sonypi_exit(void)
{
#ifdef CONFIG_ACPI
if (acpi_driver_registered)
- acpi_bus_unregister_driver(&sonypi_acpi_driver);
+ platform_driver_unregister(&sonypi_acpi_driver);
#endif
platform_device_unregister(sonypi_platform_device);
platform_driver_unregister(&sonypi_driver);
--
2.51.0
On Mon, Feb 23, 2026 at 4:59 PM Rafael J. Wysocki <rafael@kernel.org> wrote:
>
> From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
>
> In all cases in which a struct acpi_driver is used for binding a driver
> to an ACPI device object, a corresponding platform device is created by
> the ACPI core and that device is regarded as a proper representation of
> underlying hardware. Accordingly, a struct platform_driver should be
> used by driver code to bind to that device. There are multiple reasons
> why drivers should not bind directly to ACPI device objects [1].
>
> Overall, it is better to bind drivers to platform devices than to their
> ACPI companions, so convert the sonypi ACPI driver to a platform one.
>
> While this is not expected to alter functionality, it changes sysfs
> layout and so it will be visible to user space.
>
> Link: https://lore.kernel.org/all/2396510.ElGaqSPkdT@rafael.j.wysocki/ [1]
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> ---
> drivers/char/sonypi.c | 25 +++++++++++++------------
> 1 file changed, 13 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/char/sonypi.c b/drivers/char/sonypi.c
> index 677bb5ac950a..ccda997a9098 100644
> --- a/drivers/char/sonypi.c
> +++ b/drivers/char/sonypi.c
> @@ -1115,15 +1115,17 @@ static int sonypi_disable(void)
> }
>
> #ifdef CONFIG_ACPI
> -static int sonypi_acpi_add(struct acpi_device *device)
> +static int sonypi_acpi_probe(struct platform_device *pdev)
> {
> + struct acpi_device *device = ACPI_COMPANION(&pdev->dev);
> +
> sonypi_acpi_device = device;
> strcpy(acpi_device_name(device), "Sony laptop hotkeys");
> strcpy(acpi_device_class(device), "sony/hotkey");
> return 0;
> }
>
> -static void sonypi_acpi_remove(struct acpi_device *device)
> +static void sonypi_acpi_remove(struct platform_device *pdev)
> {
> sonypi_acpi_device = NULL;
> }
> @@ -1133,13 +1135,12 @@ static const struct acpi_device_id sonypi_device_ids[] = {
> {"", 0},
> };
>
> -static struct acpi_driver sonypi_acpi_driver = {
> - .name = "sonypi",
> - .class = "hkey",
> - .ids = sonypi_device_ids,
> - .ops = {
> - .add = sonypi_acpi_add,
> - .remove = sonypi_acpi_remove,
> +static struct platform_driver sonypi_acpi_driver = {
> + .probe = sonypi_acpi_probe,
> + .remove = sonypi_acpi_remove,
> + .driver = {
> + .name = "sonypi_acpi",
> + .acpi_match_table = sonypi_device_ids,
> },
> };
> #endif
> @@ -1518,8 +1519,8 @@ static int __init sonypi_init(void)
> goto err_free_device;
>
> #ifdef CONFIG_ACPI
> - if (acpi_bus_register_driver(&sonypi_acpi_driver) >= 0)
> - acpi_driver_registered = 1;
> + error = platform_driver_register(&sonypi_acpi_driver);
> + acpi_driver_registered = !error;
> #endif
>
> return 0;
> @@ -1535,7 +1536,7 @@ static void __exit sonypi_exit(void)
> {
> #ifdef CONFIG_ACPI
> if (acpi_driver_registered)
> - acpi_bus_unregister_driver(&sonypi_acpi_driver);
> + platform_driver_unregister(&sonypi_acpi_driver);
> #endif
> platform_device_unregister(sonypi_platform_device);
> platform_driver_unregister(&sonypi_driver);
> --
If anyone has any objections or concerns regarding this change,
please let me know.
In the absence of any, I'll queue it up for 7.1.
Thanks!
On Fri, 13 Mar 2026, Rafael J. Wysocki wrote:
> On Mon, Feb 23, 2026 at 4:59 PM Rafael J. Wysocki <rafael@kernel.org> wrote:
> >
> > From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
> >
> > In all cases in which a struct acpi_driver is used for binding a driver
> > to an ACPI device object, a corresponding platform device is created by
> > the ACPI core and that device is regarded as a proper representation of
> > underlying hardware. Accordingly, a struct platform_driver should be
> > used by driver code to bind to that device. There are multiple reasons
> > why drivers should not bind directly to ACPI device objects [1].
> >
> > Overall, it is better to bind drivers to platform devices than to their
> > ACPI companions, so convert the sonypi ACPI driver to a platform one.
> >
> > While this is not expected to alter functionality, it changes sysfs
> > layout and so it will be visible to user space.
> >
> > Link: https://lore.kernel.org/all/2396510.ElGaqSPkdT@rafael.j.wysocki/ [1]
> > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> > ---
> > drivers/char/sonypi.c | 25 +++++++++++++------------
> > 1 file changed, 13 insertions(+), 12 deletions(-)
> >
> > diff --git a/drivers/char/sonypi.c b/drivers/char/sonypi.c
> > index 677bb5ac950a..ccda997a9098 100644
> > --- a/drivers/char/sonypi.c
> > +++ b/drivers/char/sonypi.c
> > @@ -1115,15 +1115,17 @@ static int sonypi_disable(void)
> > }
> >
> > #ifdef CONFIG_ACPI
> > -static int sonypi_acpi_add(struct acpi_device *device)
> > +static int sonypi_acpi_probe(struct platform_device *pdev)
> > {
> > + struct acpi_device *device = ACPI_COMPANION(&pdev->dev);
> > +
> > sonypi_acpi_device = device;
> > strcpy(acpi_device_name(device), "Sony laptop hotkeys");
> > strcpy(acpi_device_class(device), "sony/hotkey");
> > return 0;
> > }
> >
> > -static void sonypi_acpi_remove(struct acpi_device *device)
> > +static void sonypi_acpi_remove(struct platform_device *pdev)
> > {
> > sonypi_acpi_device = NULL;
> > }
> > @@ -1133,13 +1135,12 @@ static const struct acpi_device_id sonypi_device_ids[] = {
> > {"", 0},
> > };
> >
> > -static struct acpi_driver sonypi_acpi_driver = {
> > - .name = "sonypi",
> > - .class = "hkey",
> > - .ids = sonypi_device_ids,
> > - .ops = {
> > - .add = sonypi_acpi_add,
> > - .remove = sonypi_acpi_remove,
> > +static struct platform_driver sonypi_acpi_driver = {
> > + .probe = sonypi_acpi_probe,
> > + .remove = sonypi_acpi_remove,
> > + .driver = {
> > + .name = "sonypi_acpi",
> > + .acpi_match_table = sonypi_device_ids,
> > },
> > };
> > #endif
> > @@ -1518,8 +1519,8 @@ static int __init sonypi_init(void)
> > goto err_free_device;
> >
> > #ifdef CONFIG_ACPI
> > - if (acpi_bus_register_driver(&sonypi_acpi_driver) >= 0)
> > - acpi_driver_registered = 1;
> > + error = platform_driver_register(&sonypi_acpi_driver);
> > + acpi_driver_registered = !error;
> > #endif
> >
> > return 0;
> > @@ -1535,7 +1536,7 @@ static void __exit sonypi_exit(void)
> > {
> > #ifdef CONFIG_ACPI
> > if (acpi_driver_registered)
> > - acpi_bus_unregister_driver(&sonypi_acpi_driver);
> > + platform_driver_unregister(&sonypi_acpi_driver);
> > #endif
> > platform_device_unregister(sonypi_platform_device);
> > platform_driver_unregister(&sonypi_driver);
> > --
>
>
> If anyone has any objections or concerns regarding this change,
> please let me know.
>
> In the absence of any, I'll queue it up for 7.1.
I did check it earlier, it seemed fine to me.
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
--
i.
© 2016 - 2026 Red Hat, Inc.