@@ -628,12 +628,12 @@ static struct pmbus_data *pmbus_update_device(struct device *dev)
628
628
* Convert linear sensor values to milli- or micro-units
629
629
* depending on sensor type.
630
630
*/
631
- static long pmbus_reg2data_linear (struct pmbus_data * data ,
632
- struct pmbus_sensor * sensor )
631
+ static s64 pmbus_reg2data_linear (struct pmbus_data * data ,
632
+ struct pmbus_sensor * sensor )
633
633
{
634
634
s16 exponent ;
635
635
s32 mantissa ;
636
- long val ;
636
+ s64 val ;
637
637
638
638
if (sensor -> class == PSC_VOLTAGE_OUT ) { /* LINEAR16 */
639
639
exponent = data -> exponent [sensor -> page ];
@@ -647,11 +647,11 @@ static long pmbus_reg2data_linear(struct pmbus_data *data,
647
647
648
648
/* scale result to milli-units for all sensors except fans */
649
649
if (sensor -> class != PSC_FAN )
650
- val = val * 1000L ;
650
+ val = val * 1000LL ;
651
651
652
652
/* scale result to micro-units for power sensors */
653
653
if (sensor -> class == PSC_POWER )
654
- val = val * 1000L ;
654
+ val = val * 1000LL ;
655
655
656
656
if (exponent >= 0 )
657
657
val <<= exponent ;
@@ -665,8 +665,8 @@ static long pmbus_reg2data_linear(struct pmbus_data *data,
665
665
* Convert direct sensor values to milli- or micro-units
666
666
* depending on sensor type.
667
667
*/
668
- static long pmbus_reg2data_direct (struct pmbus_data * data ,
669
- struct pmbus_sensor * sensor )
668
+ static s64 pmbus_reg2data_direct (struct pmbus_data * data ,
669
+ struct pmbus_sensor * sensor )
670
670
{
671
671
s64 b , val = (s16 )sensor -> data ;
672
672
s32 m , R ;
@@ -702,15 +702,15 @@ static long pmbus_reg2data_direct(struct pmbus_data *data,
702
702
}
703
703
704
704
val = div_s64 (val - b , m );
705
- return clamp_val ( val , LONG_MIN , LONG_MAX ) ;
705
+ return val ;
706
706
}
707
707
708
708
/*
709
709
* Convert VID sensor values to milli- or micro-units
710
710
* depending on sensor type.
711
711
*/
712
- static long pmbus_reg2data_vid (struct pmbus_data * data ,
713
- struct pmbus_sensor * sensor )
712
+ static s64 pmbus_reg2data_vid (struct pmbus_data * data ,
713
+ struct pmbus_sensor * sensor )
714
714
{
715
715
long val = sensor -> data ;
716
716
long rv = 0 ;
@@ -740,9 +740,9 @@ static long pmbus_reg2data_vid(struct pmbus_data *data,
740
740
return rv ;
741
741
}
742
742
743
- static long pmbus_reg2data (struct pmbus_data * data , struct pmbus_sensor * sensor )
743
+ static s64 pmbus_reg2data (struct pmbus_data * data , struct pmbus_sensor * sensor )
744
744
{
745
- long val ;
745
+ s64 val ;
746
746
747
747
if (!sensor -> convert )
748
748
return sensor -> data ;
@@ -766,7 +766,7 @@ static long pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor)
766
766
#define MIN_MANTISSA (511 * 1000)
767
767
768
768
static u16 pmbus_data2reg_linear (struct pmbus_data * data ,
769
- struct pmbus_sensor * sensor , long val )
769
+ struct pmbus_sensor * sensor , s64 val )
770
770
{
771
771
s16 exponent = 0 , mantissa ;
772
772
bool negative = false;
@@ -788,8 +788,8 @@ static u16 pmbus_data2reg_linear(struct pmbus_data *data,
788
788
val <<= - data -> exponent [sensor -> page ];
789
789
else
790
790
val >>= data -> exponent [sensor -> page ];
791
- val = DIV_ROUND_CLOSEST (val , 1000 );
792
- return val & 0xffff ;
791
+ val = DIV_ROUND_CLOSEST_ULL (val , 1000 );
792
+ return clamp_val ( val , 0 , 0xffff ) ;
793
793
}
794
794
795
795
if (val < 0 ) {
@@ -799,14 +799,14 @@ static u16 pmbus_data2reg_linear(struct pmbus_data *data,
799
799
800
800
/* Power is in uW. Convert to mW before converting. */
801
801
if (sensor -> class == PSC_POWER )
802
- val = DIV_ROUND_CLOSEST (val , 1000L );
802
+ val = DIV_ROUND_CLOSEST_ULL (val , 1000 );
803
803
804
804
/*
805
805
* For simplicity, convert fan data to milli-units
806
806
* before calculating the exponent.
807
807
*/
808
808
if (sensor -> class == PSC_FAN )
809
- val = val * 1000 ;
809
+ val = val * 1000LL ;
810
810
811
811
/* Reduce large mantissa until it fits into 10 bit */
812
812
while (val >= MAX_MANTISSA && exponent < 15 ) {
@@ -820,11 +820,7 @@ static u16 pmbus_data2reg_linear(struct pmbus_data *data,
820
820
}
821
821
822
822
/* Convert mantissa from milli-units to units */
823
- mantissa = DIV_ROUND_CLOSEST (val , 1000 );
824
-
825
- /* Ensure that resulting number is within range */
826
- if (mantissa > 0x3ff )
827
- mantissa = 0x3ff ;
823
+ mantissa = clamp_val (DIV_ROUND_CLOSEST_ULL (val , 1000 ), 0 , 0x3ff );
828
824
829
825
/* restore sign */
830
826
if (negative )
@@ -835,9 +831,9 @@ static u16 pmbus_data2reg_linear(struct pmbus_data *data,
835
831
}
836
832
837
833
static u16 pmbus_data2reg_direct (struct pmbus_data * data ,
838
- struct pmbus_sensor * sensor , long val )
834
+ struct pmbus_sensor * sensor , s64 val )
839
835
{
840
- s64 b , val64 = val ;
836
+ s64 b ;
841
837
s32 m , R ;
842
838
843
839
m = data -> info -> m [sensor -> class ];
@@ -855,30 +851,30 @@ static u16 pmbus_data2reg_direct(struct pmbus_data *data,
855
851
R -= 3 ; /* Adjust R and b for data in milli-units */
856
852
b *= 1000 ;
857
853
}
858
- val64 = val64 * m + b ;
854
+ val = val * m + b ;
859
855
860
856
while (R > 0 ) {
861
- val64 *= 10 ;
857
+ val *= 10 ;
862
858
R -- ;
863
859
}
864
860
while (R < 0 ) {
865
- val64 = div_s64 (val64 + 5LL , 10L ); /* round closest */
861
+ val = div_s64 (val + 5LL , 10L ); /* round closest */
866
862
R ++ ;
867
863
}
868
864
869
- return (u16 )clamp_val (val64 , S16_MIN , S16_MAX );
865
+ return (u16 )clamp_val (val , S16_MIN , S16_MAX );
870
866
}
871
867
872
868
static u16 pmbus_data2reg_vid (struct pmbus_data * data ,
873
- struct pmbus_sensor * sensor , long val )
869
+ struct pmbus_sensor * sensor , s64 val )
874
870
{
875
871
val = clamp_val (val , 500 , 1600 );
876
872
877
- return 2 + DIV_ROUND_CLOSEST (( 1600 - val ) * 100 , 625 );
873
+ return 2 + DIV_ROUND_CLOSEST_ULL (( 1600LL - val ) * 100LL , 625 );
878
874
}
879
875
880
876
static u16 pmbus_data2reg (struct pmbus_data * data ,
881
- struct pmbus_sensor * sensor , long val )
877
+ struct pmbus_sensor * sensor , s64 val )
882
878
{
883
879
u16 regval ;
884
880
@@ -944,7 +940,7 @@ static int pmbus_get_boolean(struct pmbus_data *data, struct pmbus_boolean *b,
944
940
WARN (1 , "Bad boolean descriptor %p: s1=%p, s2=%p\n" , b , s1 , s2 );
945
941
return 0 ;
946
942
} else {
947
- long v1 , v2 ;
943
+ s64 v1 , v2 ;
948
944
949
945
if (s1 -> data < 0 )
950
946
return s1 -> data ;
@@ -981,7 +977,7 @@ static ssize_t pmbus_show_sensor(struct device *dev,
981
977
if (sensor -> data < 0 )
982
978
return sensor -> data ;
983
979
984
- return snprintf (buf , PAGE_SIZE , "%ld \n" , pmbus_reg2data (data , sensor ));
980
+ return snprintf (buf , PAGE_SIZE , "%lld \n" , pmbus_reg2data (data , sensor ));
985
981
}
986
982
987
983
static ssize_t pmbus_set_sensor (struct device * dev ,
@@ -992,11 +988,11 @@ static ssize_t pmbus_set_sensor(struct device *dev,
992
988
struct pmbus_data * data = i2c_get_clientdata (client );
993
989
struct pmbus_sensor * sensor = to_pmbus_sensor (devattr );
994
990
ssize_t rv = count ;
995
- long val = 0 ;
991
+ s64 val ;
996
992
int ret ;
997
993
u16 regval ;
998
994
999
- if (kstrtol (buf , 10 , & val ) < 0 )
995
+ if (kstrtos64 (buf , 10 , & val ) < 0 )
1000
996
return - EINVAL ;
1001
997
1002
998
mutex_lock (& data -> update_lock );
0 commit comments