]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ACPI: platform_profile: Remove platform_profile_handler from exported symbols
authorKurt Borja <kuurtb@gmail.com>
Thu, 16 Jan 2025 00:27:17 +0000 (19:27 -0500)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Fri, 17 Jan 2025 17:15:59 +0000 (19:15 +0200)
In order to protect the platform_profile_handler from API consumers,
allocate it in platform_profile_register() and modify it's signature
accordingly.

Remove the platform_profile_handler from all consumer drivers and
replace them with a pointer to the class device, which is
now returned from platform_profile_register().

Replace *pprof with a pointer to the class device in the rest of
exported symbols.

Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Kurt Borja <kuurtb@gmail.com>
Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Tested-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Link: https://lore.kernel.org/r/20250116002721.75592-16-kuurtb@gmail.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
13 files changed:
drivers/acpi/platform_profile.c
drivers/platform/surface/surface_platform_profile.c
drivers/platform/x86/acer-wmi.c
drivers/platform/x86/amd/pmf/pmf.h
drivers/platform/x86/amd/pmf/sps.c
drivers/platform/x86/asus-wmi.c
drivers/platform/x86/dell/alienware-wmi.c
drivers/platform/x86/dell/dell-pc.c
drivers/platform/x86/hp/hp-wmi.c
drivers/platform/x86/ideapad-laptop.c
drivers/platform/x86/inspur_platform_profile.c
drivers/platform/x86/thinkpad_acpi.c
include/linux/platform_profile.h

index 120f8402facd953e2b4a3c4bccc5852c189b98ce..c0701d96c6a940aca54764a8faed2da2aa800608 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <linux/acpi.h>
 #include <linux/bits.h>
+#include <linux/cleanup.h>
 #include <linux/init.h>
 #include <linux/mutex.h>
 #include <linux/platform_profile.h>
@@ -212,9 +213,17 @@ static struct attribute *profile_attrs[] = {
 };
 ATTRIBUTE_GROUPS(profile);
 
+static void pprof_device_release(struct device *dev)
+{
+       struct platform_profile_handler *pprof = to_pprof_handler(dev);
+
+       kfree(pprof);
+}
+
 static const struct class platform_profile_class = {
        .name = "platform-profile",
        .dev_groups = profile_groups,
+       .dev_release = pprof_device_release,
 };
 
 /**
@@ -408,10 +417,10 @@ static const struct attribute_group platform_profile_group = {
        .is_visible = profile_class_is_visible,
 };
 
-void platform_profile_notify(struct platform_profile_handler *pprof)
+void platform_profile_notify(struct device *dev)
 {
        scoped_cond_guard(mutex_intr, return, &profile_lock) {
-               _notify_class_profile(&pprof->class_dev, NULL);
+               _notify_class_profile(dev, NULL);
        }
        sysfs_notify(acpi_kobj, NULL, "platform_profile");
 }
@@ -460,42 +469,54 @@ int platform_profile_cycle(void)
 }
 EXPORT_SYMBOL_GPL(platform_profile_cycle);
 
-int platform_profile_register(struct platform_profile_handler *pprof, void *drvdata)
+struct device *platform_profile_register(struct device *dev, const char *name,
+                                        void *drvdata,
+                                        const struct platform_profile_ops *ops)
 {
+       struct device *ppdev;
+       int minor;
        int err;
 
-       /* Sanity check the profile handler */
-       if (!pprof || !pprof->ops->profile_set || !pprof->ops->profile_get ||
-           !pprof->ops->probe) {
-               pr_err("platform_profile: handler is invalid\n");
-               return -EINVAL;
-       }
+       /* Sanity check */
+       if (WARN_ON_ONCE(!dev || !name || !ops || !ops->profile_get ||
+           !ops->profile_set || !ops->probe))
+               return ERR_PTR(-EINVAL);
+
+       struct platform_profile_handler *pprof __free(kfree) = kzalloc(
+               sizeof(*pprof), GFP_KERNEL);
+       if (!pprof)
+               return ERR_PTR(-ENOMEM);
 
-       err = pprof->ops->probe(drvdata, pprof->choices);
+       err = ops->probe(drvdata, pprof->choices);
        if (err) {
-               dev_err(pprof->dev, "platform_profile probe failed\n");
-               return err;
+               dev_err(dev, "platform_profile probe failed\n");
+               return ERR_PTR(err);
        }
 
        if (bitmap_empty(pprof->choices, PLATFORM_PROFILE_LAST)) {
-               dev_err(pprof->dev, "Failed to register a platform_profile class device with empty choices\n");
-               return -EINVAL;
+               dev_err(dev, "Failed to register platform_profile class device with empty choices\n");
+               return ERR_PTR(-EINVAL);
        }
 
        guard(mutex)(&profile_lock);
 
        /* create class interface for individual handler */
-       pprof->minor = ida_alloc(&platform_profile_ida, GFP_KERNEL);
-       if (pprof->minor < 0)
-               return pprof->minor;
+       minor = ida_alloc(&platform_profile_ida, GFP_KERNEL);
+       if (minor < 0)
+               return ERR_PTR(minor);
 
+       pprof->name = name;
+       pprof->ops = ops;
+       pprof->minor = minor;
        pprof->class_dev.class = &platform_profile_class;
-       pprof->class_dev.parent = pprof->dev;
+       pprof->class_dev.parent = dev;
        dev_set_drvdata(&pprof->class_dev, drvdata);
        dev_set_name(&pprof->class_dev, "platform-profile-%d", pprof->minor);
-       err = device_register(&pprof->class_dev);
+       /* device_register() takes ownership of pprof/ppdev */
+       ppdev = &no_free_ptr(pprof)->class_dev;
+       err = device_register(ppdev);
        if (err) {
-               put_device(&pprof->class_dev);
+               put_device(ppdev);
                goto cleanup_ida;
        }
 
@@ -505,20 +526,21 @@ int platform_profile_register(struct platform_profile_handler *pprof, void *drvd
        if (err)
                goto cleanup_cur;
 
-       return 0;
+       return ppdev;
 
 cleanup_cur:
-       device_unregister(&pprof->class_dev);
+       device_unregister(ppdev);
 
 cleanup_ida:
-       ida_free(&platform_profile_ida, pprof->minor);
+       ida_free(&platform_profile_ida, minor);
 
-       return err;
+       return ERR_PTR(err);
 }
 EXPORT_SYMBOL_GPL(platform_profile_register);
 
-int platform_profile_remove(struct platform_profile_handler *pprof)
+int platform_profile_remove(struct device *dev)
 {
+       struct platform_profile_handler *pprof = to_pprof_handler(dev);
        int id;
        guard(mutex)(&profile_lock);
 
@@ -536,30 +558,32 @@ EXPORT_SYMBOL_GPL(platform_profile_remove);
 
 static void devm_platform_profile_release(struct device *dev, void *res)
 {
-       struct platform_profile_handler **pprof = res;
+       struct device **ppdev = res;
 
-       platform_profile_remove(*pprof);
+       platform_profile_remove(*ppdev);
 }
 
-int devm_platform_profile_register(struct platform_profile_handler *pprof, void *drvdata)
+struct device *devm_platform_profile_register(struct device *dev, const char *name,
+                                             void *drvdata,
+                                             const struct platform_profile_ops *ops)
 {
-       struct platform_profile_handler **dr;
-       int ret;
+       struct device *ppdev;
+       struct device **dr;
 
        dr = devres_alloc(devm_platform_profile_release, sizeof(*dr), GFP_KERNEL);
        if (!dr)
-               return -ENOMEM;
+               return ERR_PTR(-ENOMEM);
 
-       ret = platform_profile_register(pprof, drvdata);
-       if (ret) {
+       ppdev = platform_profile_register(dev, name, drvdata, ops);
+       if (IS_ERR(ppdev)) {
                devres_free(dr);
-               return ret;
+               return ppdev;
        }
 
-       *dr = pprof;
-       devres_add(pprof->dev, dr);
+       *dr = ppdev;
+       devres_add(dev, dr);
 
-       return 0;
+       return ppdev;
 }
 EXPORT_SYMBOL_GPL(devm_platform_profile_register);
 
index bbdc873cb78890c1bc676e757ac5cecbde022040..0e479e35e66e16bc58ba9209eb04e588484abf91 100644 (file)
@@ -40,7 +40,7 @@ struct ssam_tmp_profile_info {
 
 struct ssam_platform_profile_device {
        struct ssam_device *sdev;
-       struct platform_profile_handler handler;
+       struct device *ppdev;
        bool has_fan;
 };
 
@@ -228,13 +228,12 @@ static int surface_platform_profile_probe(struct ssam_device *sdev)
        tpd->sdev = sdev;
        ssam_device_set_drvdata(sdev, tpd);
 
-       tpd->handler.name = "Surface Platform Profile";
-       tpd->handler.dev = &sdev->dev;
-       tpd->handler.ops = &ssam_platform_profile_ops;
-
        tpd->has_fan = device_property_read_bool(&sdev->dev, "has_fan");
 
-       return devm_platform_profile_register(&tpd->handler, tpd);
+       tpd->ppdev = devm_platform_profile_register(&sdev->dev, "Surface Platform Profile",
+                                                   tpd, &ssam_platform_profile_ops);
+
+       return PTR_ERR_OR_ZERO(tpd->ppdev);
 }
 
 static const struct ssam_device_id ssam_platform_profile_match[] = {
index d201ca0e01d649d644e2d10718a4bf140ee00183..ae2a7c93ab727f4eb36bfb1ee865ed344e556fd7 100644 (file)
@@ -784,7 +784,7 @@ static const struct dmi_system_id non_acer_quirks[] __initconst = {
        {}
 };
 
-static struct platform_profile_handler platform_profile_handler;
+static struct device *platform_profile_device;
 static bool platform_profile_support;
 
 /*
@@ -2073,16 +2073,10 @@ static const struct platform_profile_ops acer_predator_v4_platform_profile_ops =
 static int acer_platform_profile_setup(struct platform_device *device)
 {
        if (quirks->predator_v4) {
-               int err;
-
-               platform_profile_handler.name = "acer-wmi";
-               platform_profile_handler.dev = &device->dev;
-               platform_profile_handler.ops =
-                       &acer_predator_v4_platform_profile_ops;
-
-               err = devm_platform_profile_register(&platform_profile_handler, NULL);
-               if (err)
-                       return err;
+               platform_profile_device = devm_platform_profile_register(
+                       &device->dev, "acer-wmi", NULL, &acer_predator_v4_platform_profile_ops);
+               if (IS_ERR(platform_profile_device))
+                       return PTR_ERR(platform_profile_device);
 
                platform_profile_support = true;
 
@@ -2125,7 +2119,7 @@ static int acer_thermal_profile_change(void)
                        if (current_tp != acer_predator_v4_max_perf)
                                last_non_turbo_profile = current_tp;
 
-                       platform_profile_notify(&platform_profile_handler);
+                       platform_profile_notify(platform_profile_device);
                }
        }
 
index d99b3556205b1fc93f63c078ac0a59953be508fd..41b2b91b8fdc61af818e326ebaddd305efdb57fd 100644 (file)
@@ -338,7 +338,7 @@ struct amd_pmf_dev {
        struct mutex lock; /* protects the PMF interface */
        u32 supported_func;
        enum platform_profile_option current_profile;
-       struct platform_profile_handler pprof;
+       struct device *ppdev; /* platform profile class device */
        struct dentry *dbgfs_dir;
        int hb_interval; /* SBIOS heartbeat interval */
        struct delayed_work heart_beat;
index 7c7ed2b9de01182e66ebd9a5b89f5e2ee41a1599..e6cf0b22dac33b07d2f1c5bc0a42f720319423a3 100644 (file)
@@ -404,8 +404,6 @@ static const struct platform_profile_ops amd_pmf_profile_ops = {
 
 int amd_pmf_init_sps(struct amd_pmf_dev *dev)
 {
-       int err;
-
        dev->current_profile = PLATFORM_PROFILE_BALANCED;
 
        if (is_apmf_func_supported(dev, APMF_FUNC_STATIC_SLIDER_GRANULAR)) {
@@ -420,15 +418,12 @@ int amd_pmf_init_sps(struct amd_pmf_dev *dev)
                amd_pmf_set_sps_power_limits(dev);
        }
 
-       dev->pprof.name = "amd-pmf";
-       dev->pprof.dev = dev->dev;
-       dev->pprof.ops = &amd_pmf_profile_ops;
-
        /* Create platform_profile structure and register */
-       err = devm_platform_profile_register(&dev->pprof, dev);
-       if (err)
-               dev_err(dev->dev, "Failed to register SPS support, this is most likely an SBIOS bug: %d\n",
-                       err);
+       dev->ppdev = devm_platform_profile_register(dev->dev, "amd-pmf", dev,
+                                                   &amd_pmf_profile_ops);
+       if (IS_ERR(dev->ppdev))
+               dev_err(dev->dev, "Failed to register SPS support, this is most likely an SBIOS bug: %ld\n",
+                       PTR_ERR(dev->ppdev));
 
-       return err;
+       return PTR_ERR_OR_ZERO(dev->ppdev);
 }
index 7aa837f74fd0c4e5e27f464fd6ff4fa262cb5fda..1032c0e84e3d33e2c47bc275237d60416409e4dd 100644 (file)
@@ -313,7 +313,7 @@ struct asus_wmi {
        bool mid_fan_curve_available;
        struct fan_curve_data custom_fan_curves[3];
 
-       struct platform_profile_handler platform_profile_handler;
+       struct device *ppdev;
        bool platform_profile_support;
 
        // The RSOC controls the maximum charging percentage.
@@ -3789,7 +3789,7 @@ static ssize_t throttle_thermal_policy_store(struct device *dev,
         * Ensure that platform_profile updates userspace with the change to ensure
         * that platform_profile and throttle_thermal_policy_mode are in sync.
         */
-       platform_profile_notify(&asus->platform_profile_handler);
+       platform_profile_notify(asus->ppdev);
 
        return count;
 }
@@ -3891,14 +3891,11 @@ static int platform_profile_setup(struct asus_wmi *asus)
 
        dev_info(dev, "Using throttle_thermal_policy for platform_profile support\n");
 
-       asus->platform_profile_handler.name = "asus-wmi";
-       asus->platform_profile_handler.dev = dev;
-       asus->platform_profile_handler.ops = &asus_wmi_platform_profile_ops;
-
-       err = devm_platform_profile_register(&asus->platform_profile_handler, asus);
-       if (err) {
+       asus->ppdev = devm_platform_profile_register(dev, "asus-wmi", asus,
+                                                    &asus_wmi_platform_profile_ops);
+       if (IS_ERR(asus->ppdev)) {
                dev_err(dev, "Failed to register a platform_profile class device\n");
-               return err;
+               return PTR_ERR(asus->ppdev);
        }
 
        asus->platform_profile_support = true;
index e7209863e7dc6a2ad534db6cc6f3ba648727e460..63cf016bc9128125b32f14b8cf63fa8bf39cfbb1 100644 (file)
@@ -406,7 +406,6 @@ struct wmax_u32_args {
 
 static struct platform_device *platform_device;
 static struct color_platform colors[4];
-static struct platform_profile_handler pp_handler;
 static enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_LAST];
 
 static u8 interface;
@@ -1135,11 +1134,12 @@ static const struct platform_profile_ops awcc_platform_profile_ops = {
 
 static int create_thermal_profile(struct platform_device *platform_device)
 {
-       pp_handler.name = "alienware-wmi";
-       pp_handler.dev = &platform_device->dev;
-       pp_handler.ops = &awcc_platform_profile_ops;
+       struct device *ppdev;
 
-       return devm_platform_profile_register(&pp_handler, NULL);
+       ppdev = devm_platform_profile_register(&platform_device->dev, "alienware-wmi",
+                                              NULL, &awcc_platform_profile_ops);
+
+       return PTR_ERR_OR_ZERO(ppdev);
 }
 
 /*
index 2759bb608b1a77587f024371a5b3946cfa3366da..483240bb36e77d2118dfcbd6bf271e12e82e042f 100644 (file)
@@ -109,8 +109,6 @@ MODULE_DEVICE_TABLE(dmi, dell_device_table);
 #define DELL_ACC_SET_FIELD     GENMASK(11, 8)
 #define DELL_THERMAL_SUPPORTED GENMASK(3, 0)
 
-static struct platform_profile_handler *thermal_handler;
-
 enum thermal_mode_bits {
        DELL_BALANCED    = BIT(0),
        DELL_COOL_BOTTOM = BIT(1),
@@ -254,6 +252,7 @@ static const struct platform_profile_ops dell_pc_platform_profile_ops = {
 
 static int thermal_init(void)
 {
+       struct device *ppdev;
        int ret;
 
        /* If thermal commands are not supported, exit without error */
@@ -271,25 +270,15 @@ static int thermal_init(void)
        if (IS_ERR(platform_device))
                return PTR_ERR(platform_device);
 
-       thermal_handler = devm_kzalloc(&platform_device->dev, sizeof(*thermal_handler), GFP_KERNEL);
-       if (!thermal_handler) {
-               ret = -ENOMEM;
+       ppdev = devm_platform_profile_register(&platform_device->dev, "dell-pc",
+                                              NULL, &dell_pc_platform_profile_ops);
+       if (IS_ERR(ppdev)) {
+               ret = PTR_ERR(ppdev);
                goto cleanup_platform_device;
        }
-       thermal_handler->name = "dell-pc";
-       thermal_handler->dev = &platform_device->dev;
-       thermal_handler->ops = &dell_pc_platform_profile_ops;
-
-       /* Clean up if failed */
-       ret = devm_platform_profile_register(thermal_handler, NULL);
-       if (ret)
-               goto cleanup_thermal_handler;
 
        return 0;
 
-cleanup_thermal_handler:
-       thermal_handler = NULL;
-
 cleanup_platform_device:
        platform_device_unregister(platform_device);
 
index 1304dfc65aab83971f09359aec421b5100410a35..435e3ef2e3e7839a27062e31aeb3f3872dff7319 100644 (file)
@@ -273,7 +273,7 @@ static DEFINE_MUTEX(active_platform_profile_lock);
 static struct input_dev *hp_wmi_input_dev;
 static struct input_dev *camera_shutter_input_dev;
 static struct platform_device *hp_wmi_platform_dev;
-static struct platform_profile_handler platform_profile_handler;
+static struct device *platform_profile_device;
 static struct notifier_block platform_power_source_nb;
 static enum platform_profile_option active_platform_profile;
 static bool platform_profile_support;
@@ -1602,6 +1602,7 @@ static const struct platform_profile_ops hp_wmi_platform_profile_ops = {
 
 static int thermal_profile_setup(struct platform_device *device)
 {
+       const struct platform_profile_ops *ops;
        int err, tp;
 
        if (is_omen_thermal_profile()) {
@@ -1617,7 +1618,7 @@ static int thermal_profile_setup(struct platform_device *device)
                if (err < 0)
                        return err;
 
-               platform_profile_handler.ops = &platform_profile_omen_ops;
+               ops = &platform_profile_omen_ops;
        } else if (is_victus_thermal_profile()) {
                err = platform_profile_victus_get_ec(&active_platform_profile);
                if (err < 0)
@@ -1631,7 +1632,7 @@ static int thermal_profile_setup(struct platform_device *device)
                if (err < 0)
                        return err;
 
-               platform_profile_handler.ops = &platform_profile_victus_ops;
+               ops = &platform_profile_victus_ops;
        } else {
                tp = thermal_profile_get();
 
@@ -1646,15 +1647,13 @@ static int thermal_profile_setup(struct platform_device *device)
                if (err)
                        return err;
 
-               platform_profile_handler.ops = &hp_wmi_platform_profile_ops;
+               ops = &hp_wmi_platform_profile_ops;
        }
 
-       platform_profile_handler.name = "hp-wmi";
-       platform_profile_handler.dev = &device->dev;
-
-       err = devm_platform_profile_register(&platform_profile_handler, NULL);
-       if (err)
-               return err;
+       platform_profile_device = devm_platform_profile_register(&device->dev, "hp-wmi",
+                                                                NULL, ops);
+       if (IS_ERR(platform_profile_device))
+               return PTR_ERR(platform_profile_device);
 
        platform_profile_support = true;
 
index 87c1e087770a10fab4df0e16d216a2b6cbdbb7fc..dfb5d4b8c0465c64e6873e8db94ae8a0ab963d3c 100644 (file)
@@ -142,7 +142,7 @@ enum {
 
 struct ideapad_dytc_priv {
        enum platform_profile_option current_profile;
-       struct platform_profile_handler pprof;
+       struct device *ppdev; /* platform profile device */
        struct mutex mutex; /* protects the DYTC interface */
        struct ideapad_private *priv;
 };
@@ -1050,7 +1050,7 @@ static void dytc_profile_refresh(struct ideapad_private *priv)
 
        if (profile != priv->dytc->current_profile) {
                priv->dytc->current_profile = profile;
-               platform_profile_notify(&priv->dytc->pprof);
+               platform_profile_notify(priv->dytc->ppdev);
        }
 }
 
@@ -1117,15 +1117,16 @@ static int ideapad_dytc_profile_init(struct ideapad_private *priv)
 
        mutex_init(&priv->dytc->mutex);
 
-       priv->dytc->pprof.name = "ideapad-laptop";
-       priv->dytc->pprof.dev = &priv->platform_device->dev;
        priv->dytc->priv = priv;
-       priv->dytc->pprof.ops = &dytc_profile_ops;
 
        /* Create platform_profile structure and register */
-       err = devm_platform_profile_register(&priv->dytc->pprof, &priv->dytc);
-       if (err)
+       priv->dytc->ppdev = devm_platform_profile_register(&priv->platform_device->dev,
+                                                          "ideapad-laptop", &priv->dytc,
+                                                          &dytc_profile_ops);
+       if (IS_ERR(priv->dytc->ppdev)) {
+               err = PTR_ERR(priv->dytc->ppdev);
                goto pp_reg_failed;
+       }
 
        /* Ensure initial values are correct */
        dytc_profile_refresh(priv);
index e1631de6ad86e8b81bc1af6d54ec9ad94e39ae2d..e02f5a55a6c5d3d61f6e3847d8777c0e5942b9f9 100644 (file)
@@ -32,7 +32,7 @@ enum inspur_tmp_profile {
 
 struct inspur_wmi_priv {
        struct wmi_device *wdev;
-       struct platform_profile_handler handler;
+       struct device *ppdev;
 };
 
 static int inspur_wmi_perform_query(struct wmi_device *wdev,
@@ -190,11 +190,10 @@ static int inspur_wmi_probe(struct wmi_device *wdev, const void *context)
        priv->wdev = wdev;
        dev_set_drvdata(&wdev->dev, priv);
 
-       priv->handler.name = "inspur-wmi";
-       priv->handler.dev = &wdev->dev;
-       priv->handler.ops = &inspur_platform_profile_ops;
+       priv->ppdev = devm_platform_profile_register(&wdev->dev, "inspur-wmi", priv,
+                                                    &inspur_platform_profile_ops);
 
-       return devm_platform_profile_register(&priv->handler, priv);
+       return PTR_ERR_OR_ZERO(priv->ppdev);
 }
 
 static const struct wmi_device_id inspur_wmi_id_table[] = {
index c9226e8dc7138cd47613427a37fb287bbe5ac84f..56c57cb45a76b77fdc1c6e37d70462bd65477718 100644 (file)
@@ -962,6 +962,7 @@ static const struct proc_ops dispatch_proc_ops = {
 static struct platform_device *tpacpi_pdev;
 static struct platform_device *tpacpi_sensors_pdev;
 static struct device *tpacpi_hwmon;
+static struct device *tpacpi_pprof;
 static struct input_dev *tpacpi_inputdev;
 static struct mutex tpacpi_inputdev_send_mutex;
 static LIST_HEAD(tpacpi_all_drivers);
@@ -10554,11 +10555,6 @@ static const struct platform_profile_ops dytc_profile_ops = {
        .profile_set = dytc_profile_set,
 };
 
-static struct platform_profile_handler dytc_profile = {
-       .name = "thinkpad-acpi",
-       .ops = &dytc_profile_ops,
-};
-
 static void dytc_profile_refresh(void)
 {
        enum platform_profile_option profile;
@@ -10587,7 +10583,7 @@ static void dytc_profile_refresh(void)
        err = convert_dytc_to_profile(funcmode, perfmode, &profile);
        if (!err && profile != dytc_current_profile) {
                dytc_current_profile = profile;
-               platform_profile_notify(&dytc_profile);
+               platform_profile_notify(tpacpi_pprof);
        }
 }
 
@@ -10648,14 +10644,14 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm)
        dbg_printk(TPACPI_DBG_INIT,
                        "DYTC version %d: thermal mode available\n", dytc_version);
 
-       dytc_profile.dev = &tpacpi_pdev->dev;
        /* Create platform_profile structure and register */
-       err = devm_platform_profile_register(&dytc_profile, NULL);
+       tpacpi_pprof = devm_platform_profile_register(&tpacpi_pdev->dev, "thinkpad-acpi",
+                                                     NULL, &dytc_profile_ops);
        /*
         * If for some reason platform_profiles aren't enabled
         * don't quit terminally.
         */
-       if (err)
+       if (IS_ERR(tpacpi_pprof))
                return -ENODEV;
 
        /* Ensure initial values are correct */
index 5ad1ab7b75e410a323e84f385fbca5916285bef9..778d4c661c3c56b95cf8762b89b30fb33dcb2a84 100644 (file)
@@ -45,10 +45,14 @@ struct platform_profile_handler {
        const struct platform_profile_ops *ops;
 };
 
-int platform_profile_register(struct platform_profile_handler *pprof, void *drvdata);
-int platform_profile_remove(struct platform_profile_handler *pprof);
-int devm_platform_profile_register(struct platform_profile_handler *pprof, void *drvdata);
+struct device *platform_profile_register(struct device *dev, const char *name,
+                                        void *drvdata,
+                                        const struct platform_profile_ops *ops);
+int platform_profile_remove(struct device *dev);
+struct device *devm_platform_profile_register(struct device *dev, const char *name,
+                                             void *drvdata,
+                                             const struct platform_profile_ops *ops);
 int platform_profile_cycle(void);
-void platform_profile_notify(struct platform_profile_handler *pprof);
+void platform_profile_notify(struct device *dev);
 
 #endif  /*_PLATFORM_PROFILE_H_*/