22
22
* Thanks to Jan Volkering
23
23
*/
24
24
25
+ #include <linux/bitfield.h>
26
+ #include <linux/bits.h>
25
27
#include <linux/delay.h>
26
28
#include <linux/err.h>
27
29
#include <linux/hwmon.h>
65
67
#define INA2XX_RSHUNT_DEFAULT 10000
66
68
67
69
/* bit mask for reading the averaging setting in the configuration register */
68
- #define INA226_AVG_RD_MASK 0x0E00
70
+ #define INA226_AVG_RD_MASK GENMASK(11, 9)
69
71
70
- #define INA226_READ_AVG (reg ) (((reg) & INA226_AVG_RD_MASK) >> 9)
71
- #define INA226_SHIFT_AVG (val ) ((val) << 9)
72
+ #define INA226_READ_AVG (reg ) FIELD_GET(INA226_AVG_RD_MASK, reg)
72
73
73
- #define INA226_ALERT_POLARITY_MASK 0x0002
74
- #define INA226_SHIFT_ALERT_POLARITY (val ) ((val) << 1)
75
- #define INA226_ALERT_POL_LOW 0
76
- #define INA226_ALERT_POL_HIGH 1
74
+ #define INA226_ALERT_POLARITY_MASK BIT(1)
75
+ #define INA226_ALERT_POL_LOW 0
76
+ #define INA226_ALERT_POL_HIGH 1
77
77
78
78
/* bit number of alert functions in Mask/Enable Register */
79
- #define INA226_SHUNT_OVER_VOLTAGE_BIT 15
80
- #define INA226_SHUNT_UNDER_VOLTAGE_BIT 14
81
- #define INA226_BUS_OVER_VOLTAGE_BIT 13
82
- #define INA226_BUS_UNDER_VOLTAGE_BIT 12
83
- #define INA226_POWER_OVER_LIMIT_BIT 11
79
+ #define INA226_SHUNT_OVER_VOLTAGE_MASK BIT(15)
80
+ #define INA226_SHUNT_UNDER_VOLTAGE_MASK BIT(14)
81
+ #define INA226_BUS_OVER_VOLTAGE_MASK BIT(13)
82
+ #define INA226_BUS_UNDER_VOLTAGE_MASK BIT(12)
83
+ #define INA226_POWER_OVER_LIMIT_MASK BIT(11)
84
84
85
85
/* bit mask for alert config bits of Mask/Enable Register */
86
- #define INA226_ALERT_CONFIG_MASK 0xFC00
86
+ #define INA226_ALERT_CONFIG_MASK GENMASK(15, 10)
87
87
#define INA226_ALERT_FUNCTION_FLAG BIT(4)
88
88
89
89
/* common attrs, ina226 attrs and NULL */
@@ -177,15 +177,15 @@ static u16 ina226_interval_to_reg(int interval)
177
177
avg_bits = find_closest (avg , ina226_avg_tab ,
178
178
ARRAY_SIZE (ina226_avg_tab ));
179
179
180
- return INA226_SHIFT_AVG ( avg_bits );
180
+ return FIELD_PREP ( INA226_AVG_RD_MASK , avg_bits );
181
181
}
182
182
183
183
static int ina2xx_set_alert_polarity (struct ina2xx_data * data ,
184
184
unsigned long val )
185
185
{
186
186
return regmap_update_bits (data -> regmap , INA226_MASK_ENABLE ,
187
187
INA226_ALERT_POLARITY_MASK ,
188
- INA226_SHIFT_ALERT_POLARITY ( val ));
188
+ FIELD_PREP ( INA226_ALERT_POLARITY_MASK , val ));
189
189
}
190
190
191
191
/*
@@ -322,20 +322,20 @@ static ssize_t ina2xx_value_show(struct device *dev,
322
322
return sysfs_emit (buf , "%d\n" , ina2xx_get_value (data , attr -> index , regval ));
323
323
}
324
324
325
- static int ina226_reg_to_alert (struct ina2xx_data * data , u8 bit , u16 regval )
325
+ static int ina226_reg_to_alert (struct ina2xx_data * data , u32 mask , u16 regval )
326
326
{
327
327
int reg ;
328
328
329
- switch (bit ) {
330
- case INA226_SHUNT_OVER_VOLTAGE_BIT :
331
- case INA226_SHUNT_UNDER_VOLTAGE_BIT :
329
+ switch (mask ) {
330
+ case INA226_SHUNT_OVER_VOLTAGE_MASK :
331
+ case INA226_SHUNT_UNDER_VOLTAGE_MASK :
332
332
reg = INA2XX_SHUNT_VOLTAGE ;
333
333
break ;
334
- case INA226_BUS_OVER_VOLTAGE_BIT :
335
- case INA226_BUS_UNDER_VOLTAGE_BIT :
334
+ case INA226_BUS_OVER_VOLTAGE_MASK :
335
+ case INA226_BUS_UNDER_VOLTAGE_MASK :
336
336
reg = INA2XX_BUS_VOLTAGE ;
337
337
break ;
338
- case INA226_POWER_OVER_LIMIT_BIT :
338
+ case INA226_POWER_OVER_LIMIT_MASK :
339
339
reg = INA2XX_POWER ;
340
340
break ;
341
341
default :
@@ -351,19 +351,19 @@ static int ina226_reg_to_alert(struct ina2xx_data *data, u8 bit, u16 regval)
351
351
* Turns alert limit values into register values.
352
352
* Opposite of the formula in ina2xx_get_value().
353
353
*/
354
- static s16 ina226_alert_to_reg (struct ina2xx_data * data , u8 bit , int val )
354
+ static s16 ina226_alert_to_reg (struct ina2xx_data * data , u32 mask , int val )
355
355
{
356
- switch (bit ) {
357
- case INA226_SHUNT_OVER_VOLTAGE_BIT :
358
- case INA226_SHUNT_UNDER_VOLTAGE_BIT :
356
+ switch (mask ) {
357
+ case INA226_SHUNT_OVER_VOLTAGE_MASK :
358
+ case INA226_SHUNT_UNDER_VOLTAGE_MASK :
359
359
val *= data -> config -> shunt_div ;
360
360
return clamp_val (val , SHRT_MIN , SHRT_MAX );
361
- case INA226_BUS_OVER_VOLTAGE_BIT :
362
- case INA226_BUS_UNDER_VOLTAGE_BIT :
361
+ case INA226_BUS_OVER_VOLTAGE_MASK :
362
+ case INA226_BUS_UNDER_VOLTAGE_MASK :
363
363
val = (val * 1000 ) << data -> config -> bus_voltage_shift ;
364
364
val = DIV_ROUND_CLOSEST (val , data -> config -> bus_voltage_lsb );
365
365
return clamp_val (val , 0 , SHRT_MAX );
366
- case INA226_POWER_OVER_LIMIT_BIT :
366
+ case INA226_POWER_OVER_LIMIT_MASK :
367
367
val = DIV_ROUND_CLOSEST (val , data -> power_lsb_uW );
368
368
return clamp_val (val , 0 , USHRT_MAX );
369
369
default :
@@ -387,7 +387,7 @@ static ssize_t ina226_alert_show(struct device *dev,
387
387
if (ret )
388
388
goto abort ;
389
389
390
- if (regval & BIT ( attr -> index ) ) {
390
+ if (regval & attr -> index ) {
391
391
ret = regmap_read (data -> regmap , INA226_ALERT_LIMIT , & regval );
392
392
if (ret )
393
393
goto abort ;
@@ -432,7 +432,7 @@ static ssize_t ina226_alert_store(struct device *dev,
432
432
if (val != 0 ) {
433
433
ret = regmap_update_bits (data -> regmap , INA226_MASK_ENABLE ,
434
434
INA226_ALERT_CONFIG_MASK ,
435
- BIT ( attr -> index ) );
435
+ attr -> index );
436
436
if (ret < 0 )
437
437
goto abort ;
438
438
}
@@ -456,7 +456,7 @@ static ssize_t ina226_alarm_show(struct device *dev,
456
456
if (ret )
457
457
return ret ;
458
458
459
- alarm = (regval & BIT ( attr -> index ) ) &&
459
+ alarm = (regval & attr -> index ) &&
460
460
(regval & INA226_ALERT_FUNCTION_FLAG );
461
461
return sysfs_emit (buf , "%d\n" , alarm );
462
462
}
@@ -552,25 +552,25 @@ static ssize_t ina226_interval_show(struct device *dev,
552
552
static SENSOR_DEVICE_ATTR_RO (in0_input , ina2xx_value , INA2XX_SHUNT_VOLTAGE ) ;
553
553
/* shunt voltage over/under voltage alert setting and alarm */
554
554
static SENSOR_DEVICE_ATTR_RW (in0_crit , ina226_alert ,
555
- INA226_SHUNT_OVER_VOLTAGE_BIT ) ;
555
+ INA226_SHUNT_OVER_VOLTAGE_MASK ) ;
556
556
static SENSOR_DEVICE_ATTR_RW (in0_lcrit , ina226_alert ,
557
- INA226_SHUNT_UNDER_VOLTAGE_BIT ) ;
557
+ INA226_SHUNT_UNDER_VOLTAGE_MASK ) ;
558
558
static SENSOR_DEVICE_ATTR_RO (in0_crit_alarm , ina226_alarm ,
559
- INA226_SHUNT_OVER_VOLTAGE_BIT ) ;
559
+ INA226_SHUNT_OVER_VOLTAGE_MASK ) ;
560
560
static SENSOR_DEVICE_ATTR_RO (in0_lcrit_alarm , ina226_alarm ,
561
- INA226_SHUNT_UNDER_VOLTAGE_BIT ) ;
561
+ INA226_SHUNT_UNDER_VOLTAGE_MASK ) ;
562
562
563
563
/* bus voltage */
564
564
static SENSOR_DEVICE_ATTR_RO (in1_input , ina2xx_value , INA2XX_BUS_VOLTAGE ) ;
565
565
/* bus voltage over/under voltage alert setting and alarm */
566
566
static SENSOR_DEVICE_ATTR_RW (in1_crit , ina226_alert ,
567
- INA226_BUS_OVER_VOLTAGE_BIT ) ;
567
+ INA226_BUS_OVER_VOLTAGE_MASK ) ;
568
568
static SENSOR_DEVICE_ATTR_RW (in1_lcrit , ina226_alert ,
569
- INA226_BUS_UNDER_VOLTAGE_BIT ) ;
569
+ INA226_BUS_UNDER_VOLTAGE_MASK ) ;
570
570
static SENSOR_DEVICE_ATTR_RO (in1_crit_alarm , ina226_alarm ,
571
- INA226_BUS_OVER_VOLTAGE_BIT ) ;
571
+ INA226_BUS_OVER_VOLTAGE_MASK ) ;
572
572
static SENSOR_DEVICE_ATTR_RO (in1_lcrit_alarm , ina226_alarm ,
573
- INA226_BUS_UNDER_VOLTAGE_BIT ) ;
573
+ INA226_BUS_UNDER_VOLTAGE_MASK ) ;
574
574
575
575
/* calculated current */
576
576
static SENSOR_DEVICE_ATTR_RO (curr1_input , ina2xx_value , INA2XX_CURRENT ) ;
@@ -579,9 +579,9 @@ static SENSOR_DEVICE_ATTR_RO(curr1_input, ina2xx_value, INA2XX_CURRENT);
579
579
static SENSOR_DEVICE_ATTR_RO (power1_input , ina2xx_value , INA2XX_POWER ) ;
580
580
/* over-limit power alert setting and alarm */
581
581
static SENSOR_DEVICE_ATTR_RW (power1_crit , ina226_alert ,
582
- INA226_POWER_OVER_LIMIT_BIT ) ;
582
+ INA226_POWER_OVER_LIMIT_MASK ) ;
583
583
static SENSOR_DEVICE_ATTR_RO (power1_crit_alarm , ina226_alarm ,
584
- INA226_POWER_OVER_LIMIT_BIT ) ;
584
+ INA226_POWER_OVER_LIMIT_MASK ) ;
585
585
586
586
/* shunt resistance */
587
587
static SENSOR_DEVICE_ATTR_RW (shunt_resistor , ina2xx_shunt , INA2XX_CALIBRATION ) ;
0 commit comments