drm/i915/hwmon: Get rid of devm
authorjsg <jsg@openbsd.org>
Mon, 17 Jun 2024 07:20:12 +0000 (07:20 +0000)
committerjsg <jsg@openbsd.org>
Mon, 17 Jun 2024 07:20:12 +0000 (07:20 +0000)
From Ashutosh Dixit
cfa73607eb21a4ce1d6294a2c5733628897b48a2 in linux-6.6.y/6.6.34
5bc9de065b8bb9b8dd8799ecb4592d0403b54281 in mainline linux

sys/dev/pci/drm/i915/i915_hwmon.c

index 4ad8ab0..c89c8ca 100644 (file)
@@ -793,7 +793,7 @@ void i915_hwmon_register(struct drm_i915_private *i915)
        if (!IS_DGFX(i915))
                return;
 
-       hwmon = devm_kzalloc(dev, sizeof(*hwmon), GFP_KERNEL);
+       hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL);
        if (!hwmon)
                return;
 
@@ -819,14 +819,12 @@ void i915_hwmon_register(struct drm_i915_private *i915)
        hwm_get_preregistration_info(i915);
 
        /*  hwmon_dev points to device hwmon<i> */
-       hwmon_dev = devm_hwmon_device_register_with_info(dev, ddat->name,
-                                                        ddat,
-                                                        &hwm_chip_info,
-                                                        hwm_groups);
-       if (IS_ERR(hwmon_dev)) {
-               i915->hwmon = NULL;
-               return;
-       }
+       hwmon_dev = hwmon_device_register_with_info(dev, ddat->name,
+                                                   ddat,
+                                                   &hwm_chip_info,
+                                                   hwm_groups);
+       if (IS_ERR(hwmon_dev))
+               goto err;
 
        ddat->hwmon_dev = hwmon_dev;
 
@@ -839,16 +837,36 @@ void i915_hwmon_register(struct drm_i915_private *i915)
                if (!hwm_gt_is_visible(ddat_gt, hwmon_energy, hwmon_energy_input, 0))
                        continue;
 
-               hwmon_dev = devm_hwmon_device_register_with_info(dev, ddat_gt->name,
-                                                                ddat_gt,
-                                                                &hwm_gt_chip_info,
-                                                                NULL);
+               hwmon_dev = hwmon_device_register_with_info(dev, ddat_gt->name,
+                                                           ddat_gt,
+                                                           &hwm_gt_chip_info,
+                                                           NULL);
                if (!IS_ERR(hwmon_dev))
                        ddat_gt->hwmon_dev = hwmon_dev;
        }
+       return;
+err:
+       i915_hwmon_unregister(i915);
 }
 
 void i915_hwmon_unregister(struct drm_i915_private *i915)
 {
-       fetch_and_zero(&i915->hwmon);
+       struct i915_hwmon *hwmon = i915->hwmon;
+       struct intel_gt *gt;
+       int i;
+
+       if (!hwmon)
+               return;
+
+       for_each_gt(gt, i915, i)
+               if (hwmon->ddat_gt[i].hwmon_dev)
+                       hwmon_device_unregister(hwmon->ddat_gt[i].hwmon_dev);
+
+       if (hwmon->ddat.hwmon_dev)
+               hwmon_device_unregister(hwmon->ddat.hwmon_dev);
+
+       mutex_destroy(&hwmon->hwmon_lock);
+
+       kfree(i915->hwmon);
+       i915->hwmon = NULL;
 }