@@ -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);
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@gmail.com> --- 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(-)