diff options
Diffstat (limited to 'drivers/thermal/intel/intel_soc_dts_iosf.c')
| -rw-r--r-- | drivers/thermal/intel/intel_soc_dts_iosf.c | 31 | 
1 files changed, 18 insertions, 13 deletions
diff --git a/drivers/thermal/intel/intel_soc_dts_iosf.c b/drivers/thermal/intel/intel_soc_dts_iosf.c index 5716b62e0f73..f75271b669c6 100644 --- a/drivers/thermal/intel/intel_soc_dts_iosf.c +++ b/drivers/thermal/intel/intel_soc_dts_iosf.c @@ -6,6 +6,7 @@  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +#include <linux/bitops.h>  #include <linux/module.h>  #include <linux/slab.h>  #include <linux/interrupt.h> @@ -103,6 +104,7 @@ static int update_trip_temp(struct intel_soc_dts_sensor_entry *dts,  	int status;  	u32 temp_out;  	u32 out; +	unsigned long update_ptps;  	u32 store_ptps;  	u32 store_ptmc;  	u32 store_te_out; @@ -120,8 +122,10 @@ static int update_trip_temp(struct intel_soc_dts_sensor_entry *dts,  	if (status)  		return status; -	out = (store_ptps & ~(0xFF << (thres_index * 8))); -	out |= (temp_out & 0xFF) << (thres_index * 8); +	update_ptps = store_ptps; +	bitmap_set_value8(&update_ptps, temp_out & 0xFF, thres_index * 8); +	out = update_ptps; +  	status = iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_REG_WRITE,  				SOC_DTS_OFFSET_PTPS, out);  	if (status) @@ -223,6 +227,7 @@ static int sys_get_curr_temp(struct thermal_zone_device *tzd,  	u32 out;  	struct intel_soc_dts_sensor_entry *dts;  	struct intel_soc_dts_sensors *sensors; +	unsigned long raw;  	dts = tzd->devdata;  	sensors = dts->sensors; @@ -231,8 +236,8 @@ static int sys_get_curr_temp(struct thermal_zone_device *tzd,  	if (status)  		return status; -	out = (out & dts->temp_mask) >> dts->temp_shift; -	out -= SOC_DTS_TJMAX_ENCODING; +	raw = out; +	out = bitmap_get_value8(&raw, dts->id * 8) - SOC_DTS_TJMAX_ENCODING;  	*temp = sensors->tj_max - out * 1000;  	return 0; @@ -280,11 +285,14 @@ static int add_dts_thermal_zone(int id, struct intel_soc_dts_sensor_entry *dts,  				int read_only_trip_cnt)  {  	char name[10]; +	unsigned long trip;  	int trip_count = 0;  	int trip_mask = 0; +	int writable_trip_cnt = 0; +	unsigned long ptps;  	u32 store_ptps; +	unsigned long i;  	int ret; -	int i;  	/* Store status to restor on exit */  	ret = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ, @@ -293,11 +301,10 @@ static int add_dts_thermal_zone(int id, struct intel_soc_dts_sensor_entry *dts,  		goto err_ret;  	dts->id = id; -	dts->temp_mask = 0x00FF << (id * 8); -	dts->temp_shift = id * 8;  	if (notification_support) {  		trip_count = min(SOC_MAX_DTS_TRIPS, trip_cnt); -		trip_mask = BIT(trip_count - read_only_trip_cnt) - 1; +		writable_trip_cnt = trip_count - read_only_trip_cnt; +		trip_mask = GENMASK(writable_trip_cnt - 1, 0);  	}  	/* Check if the writable trip we provide is not used by BIOS */ @@ -306,11 +313,9 @@ static int add_dts_thermal_zone(int id, struct intel_soc_dts_sensor_entry *dts,  	if (ret)  		trip_mask = 0;  	else { -		for (i = 0; i < trip_count; ++i) { -			if (trip_mask & BIT(i)) -				if (store_ptps & (0xff << (i * 8))) -					trip_mask &= ~BIT(i); -		} +		ptps = store_ptps; +		for_each_set_clump8(i, trip, &ptps, writable_trip_cnt * 8) +			trip_mask &= ~BIT(i / 8);  	}  	dts->trip_mask = trip_mask;  	dts->trip_count = trip_count;  |