diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-10-23 02:58:22 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-10-23 02:58:22 -0400 |
| commit | 90338325a9cab8ff93359963e3a37be1c8907389 (patch) | |
| tree | 58d7473cea8eec2300549df1a4e9bb25f2298377 | |
| parent | ea89e1d320ebde318ae0217fec625102b9165774 (diff) | |
| parent | 167c3ad268c2643b926d693f402e893ce64857a8 (diff) | |
Merge branch 'for-rc' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux
Pull thermal management fixes from Zhang Rui:
"These includes several commits that are necessary to properly fix
regression for TMU test MUX address setting after reset, for exynos
thermal driver.
Specifics:
- fix a regression that the removal of setting a certain field at TMU
configuration setting results in immediately shutdown after reset
on Exynos4412 SoC.
- revert a patch which tries to link the thermal_zone device and its
hwmon node but breaks libsensors.
- fix a deadlock/lockdep warning issue in x86_pkg_temp thermal
driver, which can be reproduced on a buggy platform only.
- fix ti-soc-thermal driver to fall back on bandgap reading when
reading from PCB temperature sensor fails"
* 'for-rc' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux:
Revert "drivers: thermal: parent virtual hwmon with thermal zone"
drivers: thermal: allow ti-soc-thermal run without pcb zone
thermal: exynos: Provide initial setting for TMU's test MUX address at Exynos4412
thermal: exynos: Provide separate TMU data for Exynos4412
thermal: exynos: Remove check for thermal device pointer at exynos_report_trigger()
Thermal: x86_pkg_temp: change spin lock
| -rw-r--r-- | drivers/thermal/samsung/exynos_thermal_common.c | 2 | ||||
| -rw-r--r-- | drivers/thermal/samsung/exynos_tmu.c | 12 | ||||
| -rw-r--r-- | drivers/thermal/samsung/exynos_tmu.h | 7 | ||||
| -rw-r--r-- | drivers/thermal/samsung/exynos_tmu_data.c | 30 | ||||
| -rw-r--r-- | drivers/thermal/samsung/exynos_tmu_data.h | 13 | ||||
| -rw-r--r-- | drivers/thermal/thermal_hwmon.c | 2 | ||||
| -rw-r--r-- | drivers/thermal/ti-soc-thermal/ti-thermal-common.c | 1 | ||||
| -rw-r--r-- | drivers/thermal/x86_pkg_temp_thermal.c | 14 |
8 files changed, 60 insertions, 21 deletions
diff --git a/drivers/thermal/samsung/exynos_thermal_common.c b/drivers/thermal/samsung/exynos_thermal_common.c index f10a6ad37c06..c2301da08ac7 100644 --- a/drivers/thermal/samsung/exynos_thermal_common.c +++ b/drivers/thermal/samsung/exynos_thermal_common.c | |||
| @@ -310,8 +310,6 @@ void exynos_report_trigger(struct thermal_sensor_conf *conf) | |||
| 310 | } | 310 | } |
| 311 | 311 | ||
| 312 | th_zone = conf->pzone_data; | 312 | th_zone = conf->pzone_data; |
| 313 | if (th_zone->therm_dev) | ||
| 314 | return; | ||
| 315 | 313 | ||
| 316 | if (th_zone->bind == false) { | 314 | if (th_zone->bind == false) { |
| 317 | for (i = 0; i < th_zone->cool_dev_size; i++) { | 315 | for (i = 0; i < th_zone->cool_dev_size; i++) { |
diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c index b43afda8acd1..32f38b90c4f6 100644 --- a/drivers/thermal/samsung/exynos_tmu.c +++ b/drivers/thermal/samsung/exynos_tmu.c | |||
| @@ -317,6 +317,9 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on) | |||
| 317 | 317 | ||
| 318 | con = readl(data->base + reg->tmu_ctrl); | 318 | con = readl(data->base + reg->tmu_ctrl); |
| 319 | 319 | ||
| 320 | if (pdata->test_mux) | ||
| 321 | con |= (pdata->test_mux << reg->test_mux_addr_shift); | ||
| 322 | |||
| 320 | if (pdata->reference_voltage) { | 323 | if (pdata->reference_voltage) { |
| 321 | con &= ~(reg->buf_vref_sel_mask << reg->buf_vref_sel_shift); | 324 | con &= ~(reg->buf_vref_sel_mask << reg->buf_vref_sel_shift); |
| 322 | con |= pdata->reference_voltage << reg->buf_vref_sel_shift; | 325 | con |= pdata->reference_voltage << reg->buf_vref_sel_shift; |
| @@ -488,7 +491,7 @@ static const struct of_device_id exynos_tmu_match[] = { | |||
| 488 | }, | 491 | }, |
| 489 | { | 492 | { |
| 490 | .compatible = "samsung,exynos4412-tmu", | 493 | .compatible = "samsung,exynos4412-tmu", |
| 491 | .data = (void *)EXYNOS5250_TMU_DRV_DATA, | 494 | .data = (void *)EXYNOS4412_TMU_DRV_DATA, |
| 492 | }, | 495 | }, |
| 493 | { | 496 | { |
| 494 | .compatible = "samsung,exynos5250-tmu", | 497 | .compatible = "samsung,exynos5250-tmu", |
| @@ -629,9 +632,10 @@ static int exynos_tmu_probe(struct platform_device *pdev) | |||
| 629 | if (ret) | 632 | if (ret) |
| 630 | return ret; | 633 | return ret; |
| 631 | 634 | ||
| 632 | if (pdata->type == SOC_ARCH_EXYNOS || | 635 | if (pdata->type == SOC_ARCH_EXYNOS4210 || |
| 633 | pdata->type == SOC_ARCH_EXYNOS4210 || | 636 | pdata->type == SOC_ARCH_EXYNOS4412 || |
| 634 | pdata->type == SOC_ARCH_EXYNOS5440) | 637 | pdata->type == SOC_ARCH_EXYNOS5250 || |
| 638 | pdata->type == SOC_ARCH_EXYNOS5440) | ||
| 635 | data->soc = pdata->type; | 639 | data->soc = pdata->type; |
| 636 | else { | 640 | else { |
| 637 | ret = -EINVAL; | 641 | ret = -EINVAL; |
diff --git a/drivers/thermal/samsung/exynos_tmu.h b/drivers/thermal/samsung/exynos_tmu.h index b364c9eee701..3fb65547e64c 100644 --- a/drivers/thermal/samsung/exynos_tmu.h +++ b/drivers/thermal/samsung/exynos_tmu.h | |||
| @@ -41,7 +41,8 @@ enum calibration_mode { | |||
| 41 | 41 | ||
| 42 | enum soc_type { | 42 | enum soc_type { |
| 43 | SOC_ARCH_EXYNOS4210 = 1, | 43 | SOC_ARCH_EXYNOS4210 = 1, |
| 44 | SOC_ARCH_EXYNOS, | 44 | SOC_ARCH_EXYNOS4412, |
| 45 | SOC_ARCH_EXYNOS5250, | ||
| 45 | SOC_ARCH_EXYNOS5440, | 46 | SOC_ARCH_EXYNOS5440, |
| 46 | }; | 47 | }; |
| 47 | 48 | ||
| @@ -84,6 +85,7 @@ enum soc_type { | |||
| 84 | * @triminfo_reload_shift: shift of triminfo reload enable bit in triminfo_ctrl | 85 | * @triminfo_reload_shift: shift of triminfo reload enable bit in triminfo_ctrl |
| 85 | reg. | 86 | reg. |
| 86 | * @tmu_ctrl: TMU main controller register. | 87 | * @tmu_ctrl: TMU main controller register. |
| 88 | * @test_mux_addr_shift: shift bits of test mux address. | ||
| 87 | * @buf_vref_sel_shift: shift bits of reference voltage in tmu_ctrl register. | 89 | * @buf_vref_sel_shift: shift bits of reference voltage in tmu_ctrl register. |
| 88 | * @buf_vref_sel_mask: mask bits of reference voltage in tmu_ctrl register. | 90 | * @buf_vref_sel_mask: mask bits of reference voltage in tmu_ctrl register. |
| 89 | * @therm_trip_mode_shift: shift bits of tripping mode in tmu_ctrl register. | 91 | * @therm_trip_mode_shift: shift bits of tripping mode in tmu_ctrl register. |
| @@ -150,6 +152,7 @@ struct exynos_tmu_registers { | |||
| 150 | u32 triminfo_reload_shift; | 152 | u32 triminfo_reload_shift; |
| 151 | 153 | ||
| 152 | u32 tmu_ctrl; | 154 | u32 tmu_ctrl; |
| 155 | u32 test_mux_addr_shift; | ||
| 153 | u32 buf_vref_sel_shift; | 156 | u32 buf_vref_sel_shift; |
| 154 | u32 buf_vref_sel_mask; | 157 | u32 buf_vref_sel_mask; |
| 155 | u32 therm_trip_mode_shift; | 158 | u32 therm_trip_mode_shift; |
| @@ -257,6 +260,7 @@ struct exynos_tmu_registers { | |||
| 257 | * @first_point_trim: temp value of the first point trimming | 260 | * @first_point_trim: temp value of the first point trimming |
| 258 | * @second_point_trim: temp value of the second point trimming | 261 | * @second_point_trim: temp value of the second point trimming |
| 259 | * @default_temp_offset: default temperature offset in case of no trimming | 262 | * @default_temp_offset: default temperature offset in case of no trimming |
| 263 | * @test_mux; information if SoC supports test MUX | ||
| 260 | * @cal_type: calibration type for temperature | 264 | * @cal_type: calibration type for temperature |
| 261 | * @cal_mode: calibration mode for temperature | 265 | * @cal_mode: calibration mode for temperature |
| 262 | * @freq_clip_table: Table representing frequency reduction percentage. | 266 | * @freq_clip_table: Table representing frequency reduction percentage. |
| @@ -286,6 +290,7 @@ struct exynos_tmu_platform_data { | |||
| 286 | u8 first_point_trim; | 290 | u8 first_point_trim; |
| 287 | u8 second_point_trim; | 291 | u8 second_point_trim; |
| 288 | u8 default_temp_offset; | 292 | u8 default_temp_offset; |
| 293 | u8 test_mux; | ||
| 289 | 294 | ||
| 290 | enum calibration_type cal_type; | 295 | enum calibration_type cal_type; |
| 291 | enum calibration_mode cal_mode; | 296 | enum calibration_mode cal_mode; |
diff --git a/drivers/thermal/samsung/exynos_tmu_data.c b/drivers/thermal/samsung/exynos_tmu_data.c index 9002499c1f69..073c292baa53 100644 --- a/drivers/thermal/samsung/exynos_tmu_data.c +++ b/drivers/thermal/samsung/exynos_tmu_data.c | |||
| @@ -90,14 +90,15 @@ struct exynos_tmu_init_data const exynos4210_default_tmu_data = { | |||
| 90 | }; | 90 | }; |
| 91 | #endif | 91 | #endif |
| 92 | 92 | ||
| 93 | #if defined(CONFIG_SOC_EXYNOS5250) || defined(CONFIG_SOC_EXYNOS4412) | 93 | #if defined(CONFIG_SOC_EXYNOS4412) || defined(CONFIG_SOC_EXYNOS5250) |
| 94 | static const struct exynos_tmu_registers exynos5250_tmu_registers = { | 94 | static const struct exynos_tmu_registers exynos4412_tmu_registers = { |
| 95 | .triminfo_data = EXYNOS_TMU_REG_TRIMINFO, | 95 | .triminfo_data = EXYNOS_TMU_REG_TRIMINFO, |
| 96 | .triminfo_25_shift = EXYNOS_TRIMINFO_25_SHIFT, | 96 | .triminfo_25_shift = EXYNOS_TRIMINFO_25_SHIFT, |
| 97 | .triminfo_85_shift = EXYNOS_TRIMINFO_85_SHIFT, | 97 | .triminfo_85_shift = EXYNOS_TRIMINFO_85_SHIFT, |
| 98 | .triminfo_ctrl = EXYNOS_TMU_TRIMINFO_CON, | 98 | .triminfo_ctrl = EXYNOS_TMU_TRIMINFO_CON, |
| 99 | .triminfo_reload_shift = EXYNOS_TRIMINFO_RELOAD_SHIFT, | 99 | .triminfo_reload_shift = EXYNOS_TRIMINFO_RELOAD_SHIFT, |
| 100 | .tmu_ctrl = EXYNOS_TMU_REG_CONTROL, | 100 | .tmu_ctrl = EXYNOS_TMU_REG_CONTROL, |
| 101 | .test_mux_addr_shift = EXYNOS4412_MUX_ADDR_SHIFT, | ||
| 101 | .buf_vref_sel_shift = EXYNOS_TMU_REF_VOLTAGE_SHIFT, | 102 | .buf_vref_sel_shift = EXYNOS_TMU_REF_VOLTAGE_SHIFT, |
| 102 | .buf_vref_sel_mask = EXYNOS_TMU_REF_VOLTAGE_MASK, | 103 | .buf_vref_sel_mask = EXYNOS_TMU_REF_VOLTAGE_MASK, |
| 103 | .therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT, | 104 | .therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT, |
| @@ -128,7 +129,7 @@ static const struct exynos_tmu_registers exynos5250_tmu_registers = { | |||
| 128 | .emul_time_mask = EXYNOS_EMUL_TIME_MASK, | 129 | .emul_time_mask = EXYNOS_EMUL_TIME_MASK, |
| 129 | }; | 130 | }; |
| 130 | 131 | ||
| 131 | #define EXYNOS5250_TMU_DATA \ | 132 | #define EXYNOS4412_TMU_DATA \ |
| 132 | .threshold_falling = 10, \ | 133 | .threshold_falling = 10, \ |
| 133 | .trigger_levels[0] = 85, \ | 134 | .trigger_levels[0] = 85, \ |
| 134 | .trigger_levels[1] = 103, \ | 135 | .trigger_levels[1] = 103, \ |
| @@ -162,15 +163,32 @@ static const struct exynos_tmu_registers exynos5250_tmu_registers = { | |||
| 162 | .temp_level = 103, \ | 163 | .temp_level = 103, \ |
| 163 | }, \ | 164 | }, \ |
| 164 | .freq_tab_count = 2, \ | 165 | .freq_tab_count = 2, \ |
| 165 | .type = SOC_ARCH_EXYNOS, \ | 166 | .registers = &exynos4412_tmu_registers, \ |
| 166 | .registers = &exynos5250_tmu_registers, \ | ||
| 167 | .features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \ | 167 | .features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \ |
| 168 | TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \ | 168 | TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \ |
| 169 | TMU_SUPPORT_EMUL_TIME) | 169 | TMU_SUPPORT_EMUL_TIME) |
| 170 | #endif | ||
| 170 | 171 | ||
| 172 | #if defined(CONFIG_SOC_EXYNOS4412) | ||
| 173 | struct exynos_tmu_init_data const exynos4412_default_tmu_data = { | ||
| 174 | .tmu_data = { | ||
| 175 | { | ||
| 176 | EXYNOS4412_TMU_DATA, | ||
| 177 | .type = SOC_ARCH_EXYNOS4412, | ||
| 178 | .test_mux = EXYNOS4412_MUX_ADDR_VALUE, | ||
| 179 | }, | ||
| 180 | }, | ||
| 181 | .tmu_count = 1, | ||
| 182 | }; | ||
| 183 | #endif | ||
| 184 | |||
| 185 | #if defined(CONFIG_SOC_EXYNOS5250) | ||
| 171 | struct exynos_tmu_init_data const exynos5250_default_tmu_data = { | 186 | struct exynos_tmu_init_data const exynos5250_default_tmu_data = { |
| 172 | .tmu_data = { | 187 | .tmu_data = { |
| 173 | { EXYNOS5250_TMU_DATA }, | 188 | { |
| 189 | EXYNOS4412_TMU_DATA, | ||
| 190 | .type = SOC_ARCH_EXYNOS5250, | ||
| 191 | }, | ||
| 174 | }, | 192 | }, |
| 175 | .tmu_count = 1, | 193 | .tmu_count = 1, |
| 176 | }; | 194 | }; |
diff --git a/drivers/thermal/samsung/exynos_tmu_data.h b/drivers/thermal/samsung/exynos_tmu_data.h index dc7feb51099b..a1ea19d9e0a6 100644 --- a/drivers/thermal/samsung/exynos_tmu_data.h +++ b/drivers/thermal/samsung/exynos_tmu_data.h | |||
| @@ -95,6 +95,10 @@ | |||
| 95 | 95 | ||
| 96 | #define EXYNOS_MAX_TRIGGER_PER_REG 4 | 96 | #define EXYNOS_MAX_TRIGGER_PER_REG 4 |
| 97 | 97 | ||
| 98 | /* Exynos4412 specific */ | ||
| 99 | #define EXYNOS4412_MUX_ADDR_VALUE 6 | ||
| 100 | #define EXYNOS4412_MUX_ADDR_SHIFT 20 | ||
| 101 | |||
| 98 | /*exynos5440 specific registers*/ | 102 | /*exynos5440 specific registers*/ |
| 99 | #define EXYNOS5440_TMU_S0_7_TRIM 0x000 | 103 | #define EXYNOS5440_TMU_S0_7_TRIM 0x000 |
| 100 | #define EXYNOS5440_TMU_S0_7_CTRL 0x020 | 104 | #define EXYNOS5440_TMU_S0_7_CTRL 0x020 |
| @@ -138,7 +142,14 @@ extern struct exynos_tmu_init_data const exynos4210_default_tmu_data; | |||
| 138 | #define EXYNOS4210_TMU_DRV_DATA (NULL) | 142 | #define EXYNOS4210_TMU_DRV_DATA (NULL) |
| 139 | #endif | 143 | #endif |
| 140 | 144 | ||
| 141 | #if (defined(CONFIG_SOC_EXYNOS5250) || defined(CONFIG_SOC_EXYNOS4412)) | 145 | #if defined(CONFIG_SOC_EXYNOS4412) |
| 146 | extern struct exynos_tmu_init_data const exynos4412_default_tmu_data; | ||
| 147 | #define EXYNOS4412_TMU_DRV_DATA (&exynos4412_default_tmu_data) | ||
| 148 | #else | ||
| 149 | #define EXYNOS4412_TMU_DRV_DATA (NULL) | ||
| 150 | #endif | ||
| 151 | |||
| 152 | #if defined(CONFIG_SOC_EXYNOS5250) | ||
| 142 | extern struct exynos_tmu_init_data const exynos5250_default_tmu_data; | 153 | extern struct exynos_tmu_init_data const exynos5250_default_tmu_data; |
| 143 | #define EXYNOS5250_TMU_DRV_DATA (&exynos5250_default_tmu_data) | 154 | #define EXYNOS5250_TMU_DRV_DATA (&exynos5250_default_tmu_data) |
| 144 | #else | 155 | #else |
diff --git a/drivers/thermal/thermal_hwmon.c b/drivers/thermal/thermal_hwmon.c index eeef0e2498ca..fdb07199d9c2 100644 --- a/drivers/thermal/thermal_hwmon.c +++ b/drivers/thermal/thermal_hwmon.c | |||
| @@ -159,7 +159,7 @@ int thermal_add_hwmon_sysfs(struct thermal_zone_device *tz) | |||
| 159 | 159 | ||
| 160 | INIT_LIST_HEAD(&hwmon->tz_list); | 160 | INIT_LIST_HEAD(&hwmon->tz_list); |
| 161 | strlcpy(hwmon->type, tz->type, THERMAL_NAME_LENGTH); | 161 | strlcpy(hwmon->type, tz->type, THERMAL_NAME_LENGTH); |
| 162 | hwmon->device = hwmon_device_register(&tz->device); | 162 | hwmon->device = hwmon_device_register(NULL); |
| 163 | if (IS_ERR(hwmon->device)) { | 163 | if (IS_ERR(hwmon->device)) { |
| 164 | result = PTR_ERR(hwmon->device); | 164 | result = PTR_ERR(hwmon->device); |
| 165 | goto free_mem; | 165 | goto free_mem; |
diff --git a/drivers/thermal/ti-soc-thermal/ti-thermal-common.c b/drivers/thermal/ti-soc-thermal/ti-thermal-common.c index 4f8b9af54a5a..5a47cc8c8f85 100644 --- a/drivers/thermal/ti-soc-thermal/ti-thermal-common.c +++ b/drivers/thermal/ti-soc-thermal/ti-thermal-common.c | |||
| @@ -110,6 +110,7 @@ static inline int ti_thermal_get_temp(struct thermal_zone_device *thermal, | |||
| 110 | } else { | 110 | } else { |
| 111 | dev_err(bgp->dev, | 111 | dev_err(bgp->dev, |
| 112 | "Failed to read PCB state. Using defaults\n"); | 112 | "Failed to read PCB state. Using defaults\n"); |
| 113 | ret = 0; | ||
| 113 | } | 114 | } |
| 114 | } | 115 | } |
| 115 | *temp = ti_thermal_hotspot_temperature(tmp, slope, constant); | 116 | *temp = ti_thermal_hotspot_temperature(tmp, slope, constant); |
diff --git a/drivers/thermal/x86_pkg_temp_thermal.c b/drivers/thermal/x86_pkg_temp_thermal.c index f36950e4134f..7722cb9d5a80 100644 --- a/drivers/thermal/x86_pkg_temp_thermal.c +++ b/drivers/thermal/x86_pkg_temp_thermal.c | |||
| @@ -316,18 +316,19 @@ static void pkg_temp_thermal_threshold_work_fn(struct work_struct *work) | |||
| 316 | int phy_id = topology_physical_package_id(cpu); | 316 | int phy_id = topology_physical_package_id(cpu); |
| 317 | struct phy_dev_entry *phdev = pkg_temp_thermal_get_phy_entry(cpu); | 317 | struct phy_dev_entry *phdev = pkg_temp_thermal_get_phy_entry(cpu); |
| 318 | bool notify = false; | 318 | bool notify = false; |
| 319 | unsigned long flags; | ||
| 319 | 320 | ||
| 320 | if (!phdev) | 321 | if (!phdev) |
| 321 | return; | 322 | return; |
| 322 | 323 | ||
| 323 | spin_lock(&pkg_work_lock); | 324 | spin_lock_irqsave(&pkg_work_lock, flags); |
| 324 | ++pkg_work_cnt; | 325 | ++pkg_work_cnt; |
| 325 | if (unlikely(phy_id > max_phy_id)) { | 326 | if (unlikely(phy_id > max_phy_id)) { |
| 326 | spin_unlock(&pkg_work_lock); | 327 | spin_unlock_irqrestore(&pkg_work_lock, flags); |
| 327 | return; | 328 | return; |
| 328 | } | 329 | } |
| 329 | pkg_work_scheduled[phy_id] = 0; | 330 | pkg_work_scheduled[phy_id] = 0; |
| 330 | spin_unlock(&pkg_work_lock); | 331 | spin_unlock_irqrestore(&pkg_work_lock, flags); |
| 331 | 332 | ||
| 332 | enable_pkg_thres_interrupt(); | 333 | enable_pkg_thres_interrupt(); |
| 333 | rdmsrl(MSR_IA32_PACKAGE_THERM_STATUS, msr_val); | 334 | rdmsrl(MSR_IA32_PACKAGE_THERM_STATUS, msr_val); |
| @@ -397,6 +398,7 @@ static int pkg_temp_thermal_device_add(unsigned int cpu) | |||
| 397 | int thres_count; | 398 | int thres_count; |
| 398 | u32 eax, ebx, ecx, edx; | 399 | u32 eax, ebx, ecx, edx; |
| 399 | u8 *temp; | 400 | u8 *temp; |
| 401 | unsigned long flags; | ||
| 400 | 402 | ||
| 401 | cpuid(6, &eax, &ebx, &ecx, &edx); | 403 | cpuid(6, &eax, &ebx, &ecx, &edx); |
| 402 | thres_count = ebx & 0x07; | 404 | thres_count = ebx & 0x07; |
| @@ -420,19 +422,19 @@ static int pkg_temp_thermal_device_add(unsigned int cpu) | |||
| 420 | goto err_ret_unlock; | 422 | goto err_ret_unlock; |
| 421 | } | 423 | } |
| 422 | 424 | ||
| 423 | spin_lock(&pkg_work_lock); | 425 | spin_lock_irqsave(&pkg_work_lock, flags); |
| 424 | if (topology_physical_package_id(cpu) > max_phy_id) | 426 | if (topology_physical_package_id(cpu) > max_phy_id) |
| 425 | max_phy_id = topology_physical_package_id(cpu); | 427 | max_phy_id = topology_physical_package_id(cpu); |
| 426 | temp = krealloc(pkg_work_scheduled, | 428 | temp = krealloc(pkg_work_scheduled, |
| 427 | (max_phy_id+1) * sizeof(u8), GFP_ATOMIC); | 429 | (max_phy_id+1) * sizeof(u8), GFP_ATOMIC); |
| 428 | if (!temp) { | 430 | if (!temp) { |
| 429 | spin_unlock(&pkg_work_lock); | 431 | spin_unlock_irqrestore(&pkg_work_lock, flags); |
| 430 | err = -ENOMEM; | 432 | err = -ENOMEM; |
| 431 | goto err_ret_free; | 433 | goto err_ret_free; |
| 432 | } | 434 | } |
| 433 | pkg_work_scheduled = temp; | 435 | pkg_work_scheduled = temp; |
| 434 | pkg_work_scheduled[topology_physical_package_id(cpu)] = 0; | 436 | pkg_work_scheduled[topology_physical_package_id(cpu)] = 0; |
| 435 | spin_unlock(&pkg_work_lock); | 437 | spin_unlock_irqrestore(&pkg_work_lock, flags); |
| 436 | 438 | ||
| 437 | phy_dev_entry->phys_proc_id = topology_physical_package_id(cpu); | 439 | phy_dev_entry->phys_proc_id = topology_physical_package_id(cpu); |
| 438 | phy_dev_entry->first_cpu = cpu; | 440 | phy_dev_entry->first_cpu = cpu; |
