diff options
Diffstat (limited to 'drivers/hwmon/hwmon.c')
-rw-r--r-- | drivers/hwmon/hwmon.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c index c9790e2c3440..af5123042990 100644 --- a/drivers/hwmon/hwmon.c +++ b/drivers/hwmon/hwmon.c | |||
@@ -143,6 +143,7 @@ static int hwmon_thermal_add_sensor(struct device *dev, | |||
143 | struct hwmon_device *hwdev, int index) | 143 | struct hwmon_device *hwdev, int index) |
144 | { | 144 | { |
145 | struct hwmon_thermal_data *tdata; | 145 | struct hwmon_thermal_data *tdata; |
146 | struct thermal_zone_device *tzd; | ||
146 | 147 | ||
147 | tdata = devm_kzalloc(dev, sizeof(*tdata), GFP_KERNEL); | 148 | tdata = devm_kzalloc(dev, sizeof(*tdata), GFP_KERNEL); |
148 | if (!tdata) | 149 | if (!tdata) |
@@ -151,8 +152,14 @@ static int hwmon_thermal_add_sensor(struct device *dev, | |||
151 | tdata->hwdev = hwdev; | 152 | tdata->hwdev = hwdev; |
152 | tdata->index = index; | 153 | tdata->index = index; |
153 | 154 | ||
154 | devm_thermal_zone_of_sensor_register(&hwdev->dev, index, tdata, | 155 | tzd = devm_thermal_zone_of_sensor_register(&hwdev->dev, index, tdata, |
155 | &hwmon_thermal_ops); | 156 | &hwmon_thermal_ops); |
157 | /* | ||
158 | * If CONFIG_THERMAL_OF is disabled, this returns -ENODEV, | ||
159 | * so ignore that error but forward any other error. | ||
160 | */ | ||
161 | if (IS_ERR(tzd) && (PTR_ERR(tzd) != -ENODEV)) | ||
162 | return PTR_ERR(tzd); | ||
156 | 163 | ||
157 | return 0; | 164 | return 0; |
158 | } | 165 | } |
@@ -621,14 +628,20 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata, | |||
621 | if (!chip->ops->is_visible(drvdata, hwmon_temp, | 628 | if (!chip->ops->is_visible(drvdata, hwmon_temp, |
622 | hwmon_temp_input, j)) | 629 | hwmon_temp_input, j)) |
623 | continue; | 630 | continue; |
624 | if (info[i]->config[j] & HWMON_T_INPUT) | 631 | if (info[i]->config[j] & HWMON_T_INPUT) { |
625 | hwmon_thermal_add_sensor(dev, hwdev, j); | 632 | err = hwmon_thermal_add_sensor(dev, |
633 | hwdev, j); | ||
634 | if (err) | ||
635 | goto free_device; | ||
636 | } | ||
626 | } | 637 | } |
627 | } | 638 | } |
628 | } | 639 | } |
629 | 640 | ||
630 | return hdev; | 641 | return hdev; |
631 | 642 | ||
643 | free_device: | ||
644 | device_unregister(hdev); | ||
632 | free_hwmon: | 645 | free_hwmon: |
633 | kfree(hwdev); | 646 | kfree(hwdev); |
634 | ida_remove: | 647 | ida_remove: |