Lines Matching +full:attr +full:- +full:max +full:- +full:name
1 // SPDX-License-Identifier: MIT
7 #include <linux/hwmon-sysfs.h>
21 * SF_* - scale factors for particular quantities according to hwmon spec.
22 * - voltage - millivolts
23 * - power - microwatts
24 * - curr - milliamperes
25 * - energy - microjoules
26 * - time - milliseconds
61 char name[12]; member
81 struct i915_hwmon *hwmon = ddat->hwmon; in hwm_locked_with_pm_intel_uncore_rmw()
82 struct intel_uncore *uncore = ddat->uncore; in hwm_locked_with_pm_intel_uncore_rmw()
85 with_intel_runtime_pm(uncore->rpm, wakeref) { in hwm_locked_with_pm_intel_uncore_rmw()
86 mutex_lock(&hwmon->hwmon_lock); in hwm_locked_with_pm_intel_uncore_rmw()
90 mutex_unlock(&hwmon->hwmon_lock); in hwm_locked_with_pm_intel_uncore_rmw()
96 * of the field taken from the 32-bit register value might cause a result to
103 struct intel_uncore *uncore = ddat->uncore; in hwm_field_read_and_scale()
107 with_intel_runtime_pm(uncore->rpm, wakeref) in hwm_field_read_and_scale()
116 * hwm_energy - Obtain energy value
118 * The underlying energy hardware register is 32-bits and is subject to
121 * a power draw of 1000 watts, the 32-bit counter will overflow in
125 * 1 watt: (2^32 >> 14) / 1 W / (60 * 60 * 24) secs/day -> 3 days
126 * 1000 watts: (2^32 >> 14) / 1000 W / 60 secs/min -> 4.36 minutes
132 * hwmon->scl_shift_energy of 14 bits we have 57 (63 - 20 + 14) bits before
138 struct intel_uncore *uncore = ddat->uncore; in hwm_energy()
139 struct i915_hwmon *hwmon = ddat->hwmon; in hwm_energy()
140 struct hwm_energy_info *ei = &ddat->ei; in hwm_energy()
145 if (ddat->gt_n >= 0) in hwm_energy()
146 rgaddr = hwmon->rg.energy_status_tile; in hwm_energy()
148 rgaddr = hwmon->rg.energy_status_all; in hwm_energy()
150 with_intel_runtime_pm(uncore->rpm, wakeref) { in hwm_energy()
151 mutex_lock(&hwmon->hwmon_lock); in hwm_energy()
155 if (reg_val >= ei->reg_val_prev) in hwm_energy()
156 ei->accum_energy += reg_val - ei->reg_val_prev; in hwm_energy()
158 ei->accum_energy += UINT_MAX - ei->reg_val_prev + reg_val; in hwm_energy()
159 ei->reg_val_prev = reg_val; in hwm_energy()
161 *energy = mul_u64_u32_shr(ei->accum_energy, SF_ENERGY, in hwm_energy()
162 hwmon->scl_shift_energy); in hwm_energy()
163 mutex_unlock(&hwmon->hwmon_lock); in hwm_energy()
168 hwm_power1_max_interval_show(struct device *dev, struct device_attribute *attr, in hwm_power1_max_interval_show() argument
172 struct i915_hwmon *hwmon = ddat->hwmon; in hwm_power1_max_interval_show()
177 with_intel_runtime_pm(ddat->uncore->rpm, wakeref) in hwm_power1_max_interval_show()
178 r = intel_uncore_read(ddat->uncore, hwmon->rg.pkg_rapl_limit); in hwm_power1_max_interval_show()
184 * = (4 | x) << (y - 2) in hwm_power1_max_interval_show()
185 * where (y - 2) ensures a 1.x fixed point representation of 1.x in hwm_power1_max_interval_show()
192 out = mul_u64_u32_shr(tau4, SF_TIME, hwmon->scl_shift_time + x_w); in hwm_power1_max_interval_show()
199 struct device_attribute *attr, in hwm_power1_max_interval_store() argument
203 struct i915_hwmon *hwmon = ddat->hwmon; in hwm_power1_max_interval_store()
214 * Max HW supported tau in '1.x * power(2,y)' format, x = 0, y = 0x12 in hwm_power1_max_interval_store()
215 * The hwmon->scl_shift_time default of 0xa results in a max tau of 256 seconds in hwm_power1_max_interval_store()
220 * val must be < max in hwmon interface units. The steps below are in hwm_power1_max_interval_store()
227 max_win = mul_u64_u32_shr(tau4, SF_TIME, hwmon->scl_shift_time + x_w); in hwm_power1_max_interval_store()
230 return -EINVAL; in hwm_power1_max_interval_store()
233 val = DIV_ROUND_CLOSEST_ULL((u64)val << hwmon->scl_shift_time, SF_TIME); in hwm_power1_max_interval_store()
241 /* x = (val - (1 << y)) >> (y - 2); */ in hwm_power1_max_interval_store()
242 x = (val - (1ul << y)) << x_w >> y; in hwm_power1_max_interval_store()
247 hwm_locked_with_pm_intel_uncore_rmw(ddat, hwmon->rg.pkg_rapl_limit, in hwm_power1_max_interval_store()
257 &sensor_dev_attr_power1_max_interval.dev_attr.attr,
262 struct attribute *attr, int index) in hwm_attributes_visible() argument
266 struct i915_hwmon *hwmon = ddat->hwmon; in hwm_attributes_visible()
268 if (attr == &sensor_dev_attr_power1_max_interval.dev_attr.attr) in hwm_attributes_visible()
269 return i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit) ? attr->mode : 0; in hwm_attributes_visible()
304 return -ENXIO; in hwm_pcode_read_i1()
306 return snb_pcode_read_p(&i915->uncore, PCODE_POWER_SETUP, in hwm_pcode_read_i1()
312 return snb_pcode_write_p(&i915->uncore, PCODE_POWER_SETUP, in hwm_pcode_write_i1()
317 hwm_temp_is_visible(const struct hwm_drvdata *ddat, u32 attr) in hwm_temp_is_visible() argument
319 struct i915_hwmon *hwmon = ddat->hwmon; in hwm_temp_is_visible()
321 if (attr == hwmon_temp_input && i915_mmio_reg_valid(hwmon->rg.pkg_temp)) in hwm_temp_is_visible()
328 hwm_temp_read(struct hwm_drvdata *ddat, u32 attr, long *val) in hwm_temp_read() argument
330 struct i915_hwmon *hwmon = ddat->hwmon; in hwm_temp_read()
334 switch (attr) { in hwm_temp_read()
336 with_intel_runtime_pm(ddat->uncore->rpm, wakeref) in hwm_temp_read()
337 reg_val = intel_uncore_read(ddat->uncore, hwmon->rg.pkg_temp); in hwm_temp_read()
343 return -EOPNOTSUPP; in hwm_temp_read()
348 hwm_in_is_visible(const struct hwm_drvdata *ddat, u32 attr) in hwm_in_is_visible() argument
350 struct drm_i915_private *i915 = ddat->uncore->i915; in hwm_in_is_visible()
352 switch (attr) { in hwm_in_is_visible()
361 hwm_in_read(struct hwm_drvdata *ddat, u32 attr, long *val) in hwm_in_read() argument
363 struct i915_hwmon *hwmon = ddat->hwmon; in hwm_in_read()
367 switch (attr) { in hwm_in_read()
369 with_intel_runtime_pm(ddat->uncore->rpm, wakeref) in hwm_in_read()
370 reg_value = intel_uncore_read(ddat->uncore, hwmon->rg.gt_perf_status); in hwm_in_read()
375 return -EOPNOTSUPP; in hwm_in_read()
380 hwm_power_is_visible(const struct hwm_drvdata *ddat, u32 attr, int chan) in hwm_power_is_visible() argument
382 struct drm_i915_private *i915 = ddat->uncore->i915; in hwm_power_is_visible()
383 struct i915_hwmon *hwmon = ddat->hwmon; in hwm_power_is_visible()
386 switch (attr) { in hwm_power_is_visible()
388 return i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit) ? 0664 : 0; in hwm_power_is_visible()
390 return i915_mmio_reg_valid(hwmon->rg.pkg_power_sku) ? 0444 : 0; in hwm_power_is_visible()
403 * "typical but not guaranteed" min/max values in rg.pkg_power_sku. Follow the
410 struct i915_hwmon *hwmon = ddat->hwmon; in hwm_power_max_read()
412 u64 r, min, max; in hwm_power_max_read() local
415 with_intel_runtime_pm(ddat->uncore->rpm, wakeref) in hwm_power_max_read()
416 r = intel_uncore_read(ddat->uncore, hwmon->rg.pkg_rapl_limit); in hwm_power_max_read()
423 hwmon->rg.pkg_rapl_limit, in hwm_power_max_read()
425 hwmon->scl_shift_power, in hwm_power_max_read()
428 with_intel_runtime_pm(ddat->uncore->rpm, wakeref) in hwm_power_max_read()
429 r = intel_uncore_read64(ddat->uncore, hwmon->rg.pkg_power_sku); in hwm_power_max_read()
431 min = mul_u64_u32_shr(min, SF_POWER, hwmon->scl_shift_power); in hwm_power_max_read()
432 max = REG_FIELD_GET(PKG_MAX_PWR, r); in hwm_power_max_read()
433 max = mul_u64_u32_shr(max, SF_POWER, hwmon->scl_shift_power); in hwm_power_max_read()
435 if (min && max) in hwm_power_max_read()
436 *val = clamp_t(u64, *val, min, max); in hwm_power_max_read()
444 struct i915_hwmon *hwmon = ddat->hwmon; in hwm_power_max_write()
452 wakeref = intel_runtime_pm_get(ddat->uncore->rpm); in hwm_power_max_write()
453 mutex_lock(&hwmon->hwmon_lock); in hwm_power_max_write()
455 prepare_to_wait(&ddat->waitq, &wait, TASK_INTERRUPTIBLE); in hwm_power_max_write()
457 if (!hwmon->ddat.reset_in_progress) in hwm_power_max_write()
461 ret = -EINTR; in hwm_power_max_write()
465 mutex_unlock(&hwmon->hwmon_lock); in hwm_power_max_write()
466 intel_runtime_pm_put(ddat->uncore->rpm, wakeref); in hwm_power_max_write()
470 finish_wait(&ddat->waitq, &wait); in hwm_power_max_write()
476 intel_uncore_rmw(ddat->uncore, hwmon->rg.pkg_rapl_limit, in hwm_power_max_write()
478 nval = intel_uncore_read(ddat->uncore, hwmon->rg.pkg_rapl_limit); in hwm_power_max_write()
481 ret = -ENODEV; in hwm_power_max_write()
485 /* Computation in 64-bits to avoid overflow. Round to nearest. */ in hwm_power_max_write()
486 nval = DIV_ROUND_CLOSEST_ULL((u64)val << hwmon->scl_shift_power, SF_POWER); in hwm_power_max_write()
489 intel_uncore_rmw(ddat->uncore, hwmon->rg.pkg_rapl_limit, in hwm_power_max_write()
492 mutex_unlock(&hwmon->hwmon_lock); in hwm_power_max_write()
493 intel_runtime_pm_put(ddat->uncore->rpm, wakeref); in hwm_power_max_write()
498 hwm_power_read(struct hwm_drvdata *ddat, u32 attr, int chan, long *val) in hwm_power_read() argument
500 struct i915_hwmon *hwmon = ddat->hwmon; in hwm_power_read()
504 switch (attr) { in hwm_power_read()
509 hwmon->rg.pkg_power_sku, in hwm_power_read()
511 hwmon->scl_shift_power, in hwm_power_read()
515 ret = hwm_pcode_read_i1(ddat->uncore->i915, &uval); in hwm_power_read()
519 return -ENODEV; in hwm_power_read()
524 return -EOPNOTSUPP; in hwm_power_read()
529 hwm_power_write(struct hwm_drvdata *ddat, u32 attr, int chan, long val) in hwm_power_write() argument
533 switch (attr) { in hwm_power_write()
538 return hwm_pcode_write_i1(ddat->uncore->i915, uval); in hwm_power_write()
540 return -EOPNOTSUPP; in hwm_power_write()
546 struct i915_hwmon *hwmon = i915->hwmon; in i915_hwmon_power_max_disable()
549 if (!hwmon || !i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit)) in i915_hwmon_power_max_disable()
552 mutex_lock(&hwmon->hwmon_lock); in i915_hwmon_power_max_disable()
554 hwmon->ddat.reset_in_progress = true; in i915_hwmon_power_max_disable()
555 r = intel_uncore_rmw(hwmon->ddat.uncore, hwmon->rg.pkg_rapl_limit, in i915_hwmon_power_max_disable()
559 mutex_unlock(&hwmon->hwmon_lock); in i915_hwmon_power_max_disable()
564 struct i915_hwmon *hwmon = i915->hwmon; in i915_hwmon_power_max_restore()
566 if (!hwmon || !i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit)) in i915_hwmon_power_max_restore()
569 mutex_lock(&hwmon->hwmon_lock); in i915_hwmon_power_max_restore()
571 intel_uncore_rmw(hwmon->ddat.uncore, hwmon->rg.pkg_rapl_limit, in i915_hwmon_power_max_restore()
573 hwmon->ddat.reset_in_progress = false; in i915_hwmon_power_max_restore()
574 wake_up_all(&hwmon->ddat.waitq); in i915_hwmon_power_max_restore()
576 mutex_unlock(&hwmon->hwmon_lock); in i915_hwmon_power_max_restore()
580 hwm_energy_is_visible(const struct hwm_drvdata *ddat, u32 attr) in hwm_energy_is_visible() argument
582 struct i915_hwmon *hwmon = ddat->hwmon; in hwm_energy_is_visible()
585 switch (attr) { in hwm_energy_is_visible()
587 if (ddat->gt_n >= 0) in hwm_energy_is_visible()
588 rgaddr = hwmon->rg.energy_status_tile; in hwm_energy_is_visible()
590 rgaddr = hwmon->rg.energy_status_all; in hwm_energy_is_visible()
598 hwm_energy_read(struct hwm_drvdata *ddat, u32 attr, long *val) in hwm_energy_read() argument
600 switch (attr) { in hwm_energy_read()
605 return -EOPNOTSUPP; in hwm_energy_read()
610 hwm_curr_is_visible(const struct hwm_drvdata *ddat, u32 attr) in hwm_curr_is_visible() argument
612 struct drm_i915_private *i915 = ddat->uncore->i915; in hwm_curr_is_visible()
615 switch (attr) { in hwm_curr_is_visible()
625 hwm_curr_read(struct hwm_drvdata *ddat, u32 attr, long *val) in hwm_curr_read() argument
630 switch (attr) { in hwm_curr_read()
632 ret = hwm_pcode_read_i1(ddat->uncore->i915, &uval); in hwm_curr_read()
636 return -ENODEV; in hwm_curr_read()
641 return -EOPNOTSUPP; in hwm_curr_read()
646 hwm_curr_write(struct hwm_drvdata *ddat, u32 attr, long val) in hwm_curr_write() argument
650 switch (attr) { in hwm_curr_write()
653 return hwm_pcode_write_i1(ddat->uncore->i915, uval); in hwm_curr_write()
655 return -EOPNOTSUPP; in hwm_curr_write()
660 hwm_fan_is_visible(const struct hwm_drvdata *ddat, u32 attr) in hwm_fan_is_visible() argument
662 struct i915_hwmon *hwmon = ddat->hwmon; in hwm_fan_is_visible()
664 if (attr == hwmon_fan_input && i915_mmio_reg_valid(hwmon->rg.fan_speed)) in hwm_fan_is_visible()
673 struct i915_hwmon *hwmon = ddat->hwmon; in hwm_fan_input_read()
674 struct hwm_fan_info *fi = &ddat->fi; in hwm_fan_input_read()
680 wakeref = intel_runtime_pm_get(ddat->uncore->rpm); in hwm_fan_input_read()
681 mutex_lock(&hwmon->hwmon_lock); in hwm_fan_input_read()
683 reg_val = intel_uncore_read(ddat->uncore, hwmon->rg.fan_speed); in hwm_fan_input_read()
690 rotations = (reg_val - fi->reg_val_prev) / 2; in hwm_fan_input_read()
692 time = jiffies_delta_to_msecs(time_now - fi->time_prev); in hwm_fan_input_read()
694 ret = -EAGAIN; in hwm_fan_input_read()
705 fi->reg_val_prev = reg_val; in hwm_fan_input_read()
706 fi->time_prev = time_now; in hwm_fan_input_read()
708 mutex_unlock(&hwmon->hwmon_lock); in hwm_fan_input_read()
709 intel_runtime_pm_put(ddat->uncore->rpm, wakeref); in hwm_fan_input_read()
714 hwm_fan_read(struct hwm_drvdata *ddat, u32 attr, long *val) in hwm_fan_read() argument
716 if (attr == hwmon_fan_input) in hwm_fan_read()
719 return -EOPNOTSUPP; in hwm_fan_read()
724 u32 attr, int channel) in hwm_is_visible() argument
730 return hwm_temp_is_visible(ddat, attr); in hwm_is_visible()
732 return hwm_in_is_visible(ddat, attr); in hwm_is_visible()
734 return hwm_power_is_visible(ddat, attr, channel); in hwm_is_visible()
736 return hwm_energy_is_visible(ddat, attr); in hwm_is_visible()
738 return hwm_curr_is_visible(ddat, attr); in hwm_is_visible()
740 return hwm_fan_is_visible(ddat, attr); in hwm_is_visible()
747 hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, in hwm_read() argument
754 return hwm_temp_read(ddat, attr, val); in hwm_read()
756 return hwm_in_read(ddat, attr, val); in hwm_read()
758 return hwm_power_read(ddat, attr, channel, val); in hwm_read()
760 return hwm_energy_read(ddat, attr, val); in hwm_read()
762 return hwm_curr_read(ddat, attr, val); in hwm_read()
764 return hwm_fan_read(ddat, attr, val); in hwm_read()
766 return -EOPNOTSUPP; in hwm_read()
771 hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, in hwm_write() argument
778 return hwm_power_write(ddat, attr, channel, val); in hwm_write()
780 return hwm_curr_write(ddat, attr, val); in hwm_write()
782 return -EOPNOTSUPP; in hwm_write()
799 u32 attr, int channel) in hwm_gt_is_visible() argument
805 return hwm_energy_is_visible(ddat, attr); in hwm_gt_is_visible()
812 hwm_gt_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, in hwm_gt_read() argument
819 return hwm_energy_read(ddat, attr, val); in hwm_gt_read()
821 return -EOPNOTSUPP; in hwm_gt_read()
838 struct i915_hwmon *hwmon = i915->hwmon; in hwm_get_preregistration_info()
839 struct intel_uncore *uncore = &i915->uncore; in hwm_get_preregistration_info()
840 struct hwm_drvdata *ddat = &hwmon->ddat; in hwm_get_preregistration_info()
848 hwmon->rg.gt_perf_status = GEN12_RPSTAT1; in hwm_get_preregistration_info()
851 hwmon->rg.pkg_temp = PCU_PACKAGE_TEMPERATURE; in hwm_get_preregistration_info()
852 hwmon->rg.pkg_power_sku_unit = PCU_PACKAGE_POWER_SKU_UNIT; in hwm_get_preregistration_info()
853 hwmon->rg.pkg_power_sku = PCU_PACKAGE_POWER_SKU; in hwm_get_preregistration_info()
854 hwmon->rg.pkg_rapl_limit = PCU_PACKAGE_RAPL_LIMIT; in hwm_get_preregistration_info()
855 hwmon->rg.energy_status_all = PCU_PACKAGE_ENERGY_STATUS; in hwm_get_preregistration_info()
856 hwmon->rg.energy_status_tile = INVALID_MMIO_REG; in hwm_get_preregistration_info()
857 hwmon->rg.fan_speed = PCU_PWM_FAN_SPEED; in hwm_get_preregistration_info()
859 hwmon->rg.pkg_temp = INVALID_MMIO_REG; in hwm_get_preregistration_info()
860 hwmon->rg.pkg_power_sku_unit = INVALID_MMIO_REG; in hwm_get_preregistration_info()
861 hwmon->rg.pkg_power_sku = INVALID_MMIO_REG; in hwm_get_preregistration_info()
862 hwmon->rg.pkg_rapl_limit = INVALID_MMIO_REG; in hwm_get_preregistration_info()
863 hwmon->rg.energy_status_all = INVALID_MMIO_REG; in hwm_get_preregistration_info()
864 hwmon->rg.energy_status_tile = INVALID_MMIO_REG; in hwm_get_preregistration_info()
865 hwmon->rg.fan_speed = INVALID_MMIO_REG; in hwm_get_preregistration_info()
868 with_intel_runtime_pm(uncore->rpm, wakeref) { in hwm_get_preregistration_info()
870 * The contents of register hwmon->rg.pkg_power_sku_unit do not change, in hwm_get_preregistration_info()
873 if (i915_mmio_reg_valid(hwmon->rg.pkg_power_sku_unit)) in hwm_get_preregistration_info()
875 hwmon->rg.pkg_power_sku_unit); in hwm_get_preregistration_info()
881 if (i915_mmio_reg_valid(hwmon->rg.fan_speed)) { in hwm_get_preregistration_info()
882 ddat->fi.reg_val_prev = intel_uncore_read(uncore, in hwm_get_preregistration_info()
883 hwmon->rg.fan_speed); in hwm_get_preregistration_info()
884 ddat->fi.time_prev = get_jiffies_64(); in hwm_get_preregistration_info()
888 hwmon->scl_shift_power = REG_FIELD_GET(PKG_PWR_UNIT, val_sku_unit); in hwm_get_preregistration_info()
889 hwmon->scl_shift_energy = REG_FIELD_GET(PKG_ENERGY_UNIT, val_sku_unit); in hwm_get_preregistration_info()
890 hwmon->scl_shift_time = REG_FIELD_GET(PKG_TIME_UNIT, val_sku_unit); in hwm_get_preregistration_info()
896 if (i915_mmio_reg_valid(hwmon->rg.energy_status_all)) in hwm_get_preregistration_info()
898 if (i915_mmio_reg_valid(hwmon->rg.energy_status_tile)) { in hwm_get_preregistration_info()
900 hwm_energy(&hwmon->ddat_gt[i], &energy); in hwm_get_preregistration_info()
906 struct device *dev = i915->drm.dev; in i915_hwmon_register()
922 i915->hwmon = hwmon; in i915_hwmon_register()
923 mutex_init(&hwmon->hwmon_lock); in i915_hwmon_register()
924 ddat = &hwmon->ddat; in i915_hwmon_register()
926 ddat->hwmon = hwmon; in i915_hwmon_register()
927 ddat->uncore = &i915->uncore; in i915_hwmon_register()
928 snprintf(ddat->name, sizeof(ddat->name), "i915"); in i915_hwmon_register()
929 ddat->gt_n = -1; in i915_hwmon_register()
930 init_waitqueue_head(&ddat->waitq); in i915_hwmon_register()
933 ddat_gt = hwmon->ddat_gt + i; in i915_hwmon_register()
935 ddat_gt->hwmon = hwmon; in i915_hwmon_register()
936 ddat_gt->uncore = gt->uncore; in i915_hwmon_register()
937 snprintf(ddat_gt->name, sizeof(ddat_gt->name), "i915_gt%u", i); in i915_hwmon_register()
938 ddat_gt->gt_n = i; in i915_hwmon_register()
944 hwmon_dev = hwmon_device_register_with_info(dev, ddat->name, in i915_hwmon_register()
951 ddat->hwmon_dev = hwmon_dev; in i915_hwmon_register()
954 ddat_gt = hwmon->ddat_gt + i; in i915_hwmon_register()
956 * Create per-gt directories only if a per-gt attribute is in i915_hwmon_register()
962 hwmon_dev = hwmon_device_register_with_info(dev, ddat_gt->name, in i915_hwmon_register()
967 ddat_gt->hwmon_dev = hwmon_dev; in i915_hwmon_register()
976 struct i915_hwmon *hwmon = i915->hwmon; in i915_hwmon_unregister()
984 if (hwmon->ddat_gt[i].hwmon_dev) in i915_hwmon_unregister()
985 hwmon_device_unregister(hwmon->ddat_gt[i].hwmon_dev); in i915_hwmon_unregister()
987 if (hwmon->ddat.hwmon_dev) in i915_hwmon_unregister()
988 hwmon_device_unregister(hwmon->ddat.hwmon_dev); in i915_hwmon_unregister()
990 mutex_destroy(&hwmon->hwmon_lock); in i915_hwmon_unregister()
992 kfree(i915->hwmon); in i915_hwmon_unregister()
993 i915->hwmon = NULL; in i915_hwmon_unregister()