@@ -333,7 +333,13 @@ static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
333333{
334334 struct sensor_device_attribute * attr = to_sensor_dev_attr (devattr );
335335 struct lm63_data * data = lm63_update_device (dev );
336- return sprintf (buf , "%d\n" , FAN_FROM_REG (data -> fan [attr -> index ]));
336+ int fan ;
337+
338+ mutex_lock (& data -> update_lock );
339+ fan = FAN_FROM_REG (data -> fan [attr -> index ]);
340+ mutex_unlock (& data -> update_lock );
341+
342+ return sprintf (buf , "%d\n" , fan );
337343}
338344
339345static ssize_t set_fan (struct device * dev , struct device_attribute * dummy ,
@@ -366,12 +372,14 @@ static ssize_t show_pwm1(struct device *dev, struct device_attribute *devattr,
366372 int nr = attr -> index ;
367373 int pwm ;
368374
375+ mutex_lock (& data -> update_lock );
369376 if (data -> pwm_highres )
370377 pwm = data -> pwm1 [nr ];
371378 else
372379 pwm = data -> pwm1 [nr ] >= 2 * data -> pwm1_freq ?
373380 255 : (data -> pwm1 [nr ] * 255 + data -> pwm1_freq ) /
374381 (2 * data -> pwm1_freq );
382+ mutex_unlock (& data -> update_lock );
375383
376384 return sprintf (buf , "%d\n" , pwm );
377385}
@@ -529,6 +537,7 @@ static ssize_t show_temp11(struct device *dev, struct device_attribute *devattr,
529537 int nr = attr -> index ;
530538 int temp ;
531539
540+ mutex_lock (& data -> update_lock );
532541 if (!nr ) {
533542 /*
534543 * Use unsigned temperature unless its value is zero.
@@ -544,7 +553,10 @@ static ssize_t show_temp11(struct device *dev, struct device_attribute *devattr,
544553 else
545554 temp = TEMP11_FROM_REG (data -> temp11 [nr ]);
546555 }
547- return sprintf (buf , "%d\n" , temp + data -> temp2_offset );
556+ temp += data -> temp2_offset ;
557+ mutex_unlock (& data -> update_lock );
558+
559+ return sprintf (buf , "%d\n" , temp );
548560}
549561
550562static ssize_t set_temp11 (struct device * dev , struct device_attribute * devattr ,
@@ -592,20 +604,29 @@ static ssize_t temp2_crit_hyst_show(struct device *dev,
592604 struct device_attribute * dummy , char * buf )
593605{
594606 struct lm63_data * data = lm63_update_device (dev );
595- return sprintf (buf , "%d\n" , temp8_from_reg (data , 2 )
596- + data -> temp2_offset
597- - TEMP8_FROM_REG (data -> temp2_crit_hyst ));
607+ int temp ;
608+
609+ mutex_lock (& data -> update_lock );
610+ temp = temp8_from_reg (data , 2 ) + data -> temp2_offset
611+ - TEMP8_FROM_REG (data -> temp2_crit_hyst );
612+ mutex_unlock (& data -> update_lock );
613+
614+ return sprintf (buf , "%d\n" , temp );
598615}
599616
600617static ssize_t show_lut_temp_hyst (struct device * dev ,
601618 struct device_attribute * devattr , char * buf )
602619{
603620 struct sensor_device_attribute * attr = to_sensor_dev_attr (devattr );
604621 struct lm63_data * data = lm63_update_device (dev );
622+ int temp ;
605623
606- return sprintf (buf , "%d\n" , lut_temp_from_reg (data , attr -> index )
607- + data -> temp2_offset
608- - TEMP8_FROM_REG (data -> lut_temp_hyst ));
624+ mutex_lock (& data -> update_lock );
625+ temp = lut_temp_from_reg (data , attr -> index ) + data -> temp2_offset
626+ - TEMP8_FROM_REG (data -> lut_temp_hyst );
627+ mutex_unlock (& data -> update_lock );
628+
629+ return sprintf (buf , "%d\n" , temp );
609630}
610631
611632/*
@@ -616,7 +637,7 @@ static ssize_t temp2_crit_hyst_store(struct device *dev,
616637 struct device_attribute * dummy ,
617638 const char * buf , size_t count )
618639{
619- struct lm63_data * data = dev_get_drvdata (dev );
640+ struct lm63_data * data = lm63_update_device (dev );
620641 struct i2c_client * client = data -> client ;
621642 long val ;
622643 int err ;
0 commit comments