These resources are tied to the platform device lifetime thus make them make them device managed. Also propagate devm_led_classdev_register() in case of failure. This indirectly improves module exit error handling, as potentially not registered led class or sysfs groups are unregistered. Signed-off-by: Kurt Borja <kuurtb@xxxxxxxxx> --- v2: - led_classdev_register() is now device managed - sysfs_create_group() is now device managed - Removed alienware_zone_exit() because it's empty now --- It seems even if the led class is not registered, led_classdev_unregister fails safely. Same for the sysfs group. If I'm wrong and this is actually a fix please point it out. --- drivers/platform/x86/dell/alienware-wmi.c | 51 ++++++++--------------- 1 file changed, 17 insertions(+), 34 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x86/dell/alienware-wmi.c index 77465ed9b449..6760c7627f62 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -411,8 +411,6 @@ struct wmax_u32_args { }; static struct platform_device *platform_device; -static struct device_attribute *zone_dev_attrs; -static struct attribute **zone_attrs; static struct platform_zone *zone_data; static struct platform_profile_handler pp_handler; static enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_LAST]; @@ -624,10 +622,13 @@ static ssize_t store_control_state(struct device *dev, static DEVICE_ATTR(lighting_control_state, 0644, show_control_state, store_control_state); -static int alienware_zone_init(struct platform_device *dev) +static int alienware_zone_init(struct platform_device *pdev) { u8 zone; char *name; + struct device_attribute *zone_dev_attrs; + struct attribute **zone_attrs; + int ret; if (interface == WMAX) { lighting_control_state = WMAX_RUNNING; @@ -644,28 +645,25 @@ static int alienware_zone_init(struct platform_device *dev) * the lighting control + null terminated * - zone_data num_zones is for the distinct zones */ - zone_dev_attrs = - kcalloc(quirks->num_zones + 1, sizeof(struct device_attribute), - GFP_KERNEL); + zone_dev_attrs = devm_kcalloc(&pdev->dev, quirks->num_zones + 1, + sizeof(struct device_attribute), GFP_KERNEL); if (!zone_dev_attrs) return -ENOMEM; - zone_attrs = - kcalloc(quirks->num_zones + 2, sizeof(struct attribute *), - GFP_KERNEL); + zone_attrs = devm_kcalloc(&pdev->dev, quirks->num_zones + 2, + sizeof(struct attribute *), GFP_KERNEL); if (!zone_attrs) return -ENOMEM; - zone_data = - kcalloc(quirks->num_zones, sizeof(struct platform_zone), - GFP_KERNEL); + zone_data = devm_kcalloc(&pdev->dev, quirks->num_zones, + sizeof(struct platform_zone), GFP_KERNEL); if (!zone_data) return -ENOMEM; for (zone = 0; zone < quirks->num_zones; zone++) { - name = kasprintf(GFP_KERNEL, "zone%02hhX", zone); - if (name == NULL) - return 1; + name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "zone%02hhX", zone); + if (!name) + return -ENOMEM; sysfs_attr_init(&zone_dev_attrs[zone].attr); zone_dev_attrs[zone].attr.name = name; zone_dev_attrs[zone].attr.mode = 0644; @@ -678,24 +676,11 @@ static int alienware_zone_init(struct platform_device *dev) zone_attrs[quirks->num_zones] = &dev_attr_lighting_control_state.attr; zone_attribute_group.attrs = zone_attrs; - led_classdev_register(&dev->dev, &global_led); - - return sysfs_create_group(&dev->dev.kobj, &zone_attribute_group); -} - -static void alienware_zone_exit(struct platform_device *dev) -{ - u8 zone; + ret = devm_led_classdev_register(&pdev->dev, &global_led); + if (ret < 0) + return ret; - sysfs_remove_group(&dev->dev.kobj, &zone_attribute_group); - led_classdev_unregister(&global_led); - if (zone_dev_attrs) { - for (zone = 0; zone < quirks->num_zones; zone++) - kfree(zone_dev_attrs[zone].attr.name); - } - kfree(zone_dev_attrs); - kfree(zone_data); - kfree(zone_attrs); + return devm_device_add_group(&pdev->dev, &zone_attribute_group); } static acpi_status alienware_wmax_command(void *in_args, size_t in_size, @@ -1236,7 +1221,6 @@ static int __init alienware_wmi_init(void) return 0; fail_prep_zones: - alienware_zone_exit(platform_device); remove_thermal_profile(); fail_prep_thermal_profile: fail_prep_deepsleep: @@ -1256,7 +1240,6 @@ module_init(alienware_wmi_init); static void __exit alienware_wmi_exit(void) { if (platform_device) { - alienware_zone_exit(platform_device); remove_hdmi(platform_device); remove_thermal_profile(); platform_device_unregister(platform_device); -- 2.47.0