hwmon: (dell-smm) Introduce helper function for data init
authorArmin Wolf <W_Armin@gmx.de>
Thu, 23 Nov 2023 00:48:17 +0000 (01:48 +0100)
committerGuenter Roeck <linux@roeck-us.net>
Mon, 11 Dec 2023 14:21:01 +0000 (06:21 -0800)
In the future, multiple SMM calling backends will exist,
with each backend being required to initialize its data.
Introduce a helper function for this so the code necessary
to initialize dell_smm_data is not duplicated between
different backends.

Tested-by: <serverror@serverror.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Pali Rohár <pali@kernel.org>
Signed-off-by: Armin Wolf <W_Armin@gmx.de>
Link: https://lore.kernel.org/r/20231123004820.50635-7-W_Armin@gmx.de
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/dell-smm-hwmon.c

index b60755070d860cd66b63727de096b101a387c3a8..a377cd08355f0ce31f5e5d1851f72d34f0a8ab14 100644 (file)
@@ -623,6 +623,11 @@ static void __init i8k_init_procfs(struct device *dev)
 {
        struct dell_smm_data *data = dev_get_drvdata(dev);
 
+       strscpy(data->bios_version, i8k_get_dmi_data(DMI_BIOS_VERSION),
+               sizeof(data->bios_version));
+       strscpy(data->bios_machineid, i8k_get_dmi_data(DMI_PRODUCT_SERIAL),
+               sizeof(data->bios_machineid));
+
        /* Only register exit function if creation was successful */
        if (proc_create_data("i8k", 0, NULL, &i8k_proc_ops, data))
                devm_add_action_or_reset(dev, i8k_exit_procfs, NULL);
@@ -1078,6 +1083,26 @@ static int __init dell_smm_init_hwmon(struct device *dev)
        return PTR_ERR_OR_ZERO(dell_smm_hwmon_dev);
 }
 
+static int __init dell_smm_init_data(struct device *dev, const struct dell_smm_ops *ops)
+{
+       struct dell_smm_data *data;
+
+       data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
+       mutex_init(&data->i8k_mutex);
+       dev_set_drvdata(dev, data);
+
+       data->ops = ops;
+       /* All options must not be 0 */
+       data->i8k_fan_mult = fan_mult ? : I8K_FAN_MULT;
+       data->i8k_fan_max = fan_max ? : I8K_FAN_HIGH;
+       data->i8k_pwm_mult = DIV_ROUND_UP(255, data->i8k_fan_max);
+
+       return 0;
+}
+
 static const struct dmi_system_id i8k_dmi_table[] __initconst = {
        {
                .ident = "Dell G5 5590",
@@ -1386,26 +1411,11 @@ static const struct dmi_system_id i8k_whitelist_fan_control[] __initconst = {
 
 static int __init dell_smm_probe(struct platform_device *pdev)
 {
-       struct dell_smm_data *data;
        int ret;
 
-       data = devm_kzalloc(&pdev->dev, sizeof(struct dell_smm_data), GFP_KERNEL);
-       if (!data)
-               return -ENOMEM;
-
-       mutex_init(&data->i8k_mutex);
-       platform_set_drvdata(pdev, data);
-       data->ops = &i8k_smm_ops;
-
-       strscpy(data->bios_version, i8k_get_dmi_data(DMI_BIOS_VERSION),
-               sizeof(data->bios_version));
-       strscpy(data->bios_machineid, i8k_get_dmi_data(DMI_PRODUCT_SERIAL),
-               sizeof(data->bios_machineid));
-
-       /* All options must not be 0 */
-       data->i8k_fan_mult = fan_mult ? : I8K_FAN_MULT;
-       data->i8k_fan_max = fan_max ? : I8K_FAN_HIGH;
-       data->i8k_pwm_mult = DIV_ROUND_UP(255, data->i8k_fan_max);
+       ret = dell_smm_init_data(&pdev->dev, &i8k_smm_ops);
+       if (ret < 0)
+               return ret;
 
        ret = dell_smm_init_hwmon(&pdev->dev);
        if (ret)