2222 * Thanks to Jan Volkering
2323 */
2424
25+ #include <linux/bitfield.h>
26+ #include <linux/bits.h>
2527#include <linux/delay.h>
2628#include <linux/err.h>
2729#include <linux/hwmon.h>
6567#define INA2XX_RSHUNT_DEFAULT 10000
6668
6769/* 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)
6971
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)
7273
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
7777
7878/* 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)
8484
8585/* 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)
8787#define INA226_ALERT_FUNCTION_FLAG BIT(4)
8888
8989/* common attrs, ina226 attrs and NULL */
@@ -177,15 +177,15 @@ static u16 ina226_interval_to_reg(int interval)
177177 avg_bits = find_closest (avg , ina226_avg_tab ,
178178 ARRAY_SIZE (ina226_avg_tab ));
179179
180- return INA226_SHIFT_AVG ( avg_bits );
180+ return FIELD_PREP ( INA226_AVG_RD_MASK , avg_bits );
181181}
182182
183183static int ina2xx_set_alert_polarity (struct ina2xx_data * data ,
184184 unsigned long val )
185185{
186186 return regmap_update_bits (data -> regmap , INA226_MASK_ENABLE ,
187187 INA226_ALERT_POLARITY_MASK ,
188- INA226_SHIFT_ALERT_POLARITY ( val ));
188+ FIELD_PREP ( INA226_ALERT_POLARITY_MASK , val ));
189189}
190190
191191/*
@@ -322,20 +322,20 @@ static ssize_t ina2xx_value_show(struct device *dev,
322322 return sysfs_emit (buf , "%d\n" , ina2xx_get_value (data , attr -> index , regval ));
323323}
324324
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 )
326326{
327327 int reg ;
328328
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 :
332332 reg = INA2XX_SHUNT_VOLTAGE ;
333333 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 :
336336 reg = INA2XX_BUS_VOLTAGE ;
337337 break ;
338- case INA226_POWER_OVER_LIMIT_BIT :
338+ case INA226_POWER_OVER_LIMIT_MASK :
339339 reg = INA2XX_POWER ;
340340 break ;
341341 default :
@@ -351,19 +351,19 @@ static int ina226_reg_to_alert(struct ina2xx_data *data, u8 bit, u16 regval)
351351 * Turns alert limit values into register values.
352352 * Opposite of the formula in ina2xx_get_value().
353353 */
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 )
355355{
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 :
359359 val *= data -> config -> shunt_div ;
360360 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 :
363363 val = (val * 1000 ) << data -> config -> bus_voltage_shift ;
364364 val = DIV_ROUND_CLOSEST (val , data -> config -> bus_voltage_lsb );
365365 return clamp_val (val , 0 , SHRT_MAX );
366- case INA226_POWER_OVER_LIMIT_BIT :
366+ case INA226_POWER_OVER_LIMIT_MASK :
367367 val = DIV_ROUND_CLOSEST (val , data -> power_lsb_uW );
368368 return clamp_val (val , 0 , USHRT_MAX );
369369 default :
@@ -387,7 +387,7 @@ static ssize_t ina226_alert_show(struct device *dev,
387387 if (ret )
388388 goto abort ;
389389
390- if (regval & BIT ( attr -> index ) ) {
390+ if (regval & attr -> index ) {
391391 ret = regmap_read (data -> regmap , INA226_ALERT_LIMIT , & regval );
392392 if (ret )
393393 goto abort ;
@@ -432,7 +432,7 @@ static ssize_t ina226_alert_store(struct device *dev,
432432 if (val != 0 ) {
433433 ret = regmap_update_bits (data -> regmap , INA226_MASK_ENABLE ,
434434 INA226_ALERT_CONFIG_MASK ,
435- BIT ( attr -> index ) );
435+ attr -> index );
436436 if (ret < 0 )
437437 goto abort ;
438438 }
@@ -456,7 +456,7 @@ static ssize_t ina226_alarm_show(struct device *dev,
456456 if (ret )
457457 return ret ;
458458
459- alarm = (regval & BIT ( attr -> index ) ) &&
459+ alarm = (regval & attr -> index ) &&
460460 (regval & INA226_ALERT_FUNCTION_FLAG );
461461 return sysfs_emit (buf , "%d\n" , alarm );
462462}
@@ -552,25 +552,25 @@ static ssize_t ina226_interval_show(struct device *dev,
552552static SENSOR_DEVICE_ATTR_RO (in0_input , ina2xx_value , INA2XX_SHUNT_VOLTAGE ) ;
553553/* shunt voltage over/under voltage alert setting and alarm */
554554static SENSOR_DEVICE_ATTR_RW (in0_crit , ina226_alert ,
555- INA226_SHUNT_OVER_VOLTAGE_BIT ) ;
555+ INA226_SHUNT_OVER_VOLTAGE_MASK ) ;
556556static SENSOR_DEVICE_ATTR_RW (in0_lcrit , ina226_alert ,
557- INA226_SHUNT_UNDER_VOLTAGE_BIT ) ;
557+ INA226_SHUNT_UNDER_VOLTAGE_MASK ) ;
558558static SENSOR_DEVICE_ATTR_RO (in0_crit_alarm , ina226_alarm ,
559- INA226_SHUNT_OVER_VOLTAGE_BIT ) ;
559+ INA226_SHUNT_OVER_VOLTAGE_MASK ) ;
560560static SENSOR_DEVICE_ATTR_RO (in0_lcrit_alarm , ina226_alarm ,
561- INA226_SHUNT_UNDER_VOLTAGE_BIT ) ;
561+ INA226_SHUNT_UNDER_VOLTAGE_MASK ) ;
562562
563563/* bus voltage */
564564static SENSOR_DEVICE_ATTR_RO (in1_input , ina2xx_value , INA2XX_BUS_VOLTAGE ) ;
565565/* bus voltage over/under voltage alert setting and alarm */
566566static SENSOR_DEVICE_ATTR_RW (in1_crit , ina226_alert ,
567- INA226_BUS_OVER_VOLTAGE_BIT ) ;
567+ INA226_BUS_OVER_VOLTAGE_MASK ) ;
568568static SENSOR_DEVICE_ATTR_RW (in1_lcrit , ina226_alert ,
569- INA226_BUS_UNDER_VOLTAGE_BIT ) ;
569+ INA226_BUS_UNDER_VOLTAGE_MASK ) ;
570570static SENSOR_DEVICE_ATTR_RO (in1_crit_alarm , ina226_alarm ,
571- INA226_BUS_OVER_VOLTAGE_BIT ) ;
571+ INA226_BUS_OVER_VOLTAGE_MASK ) ;
572572static SENSOR_DEVICE_ATTR_RO (in1_lcrit_alarm , ina226_alarm ,
573- INA226_BUS_UNDER_VOLTAGE_BIT ) ;
573+ INA226_BUS_UNDER_VOLTAGE_MASK ) ;
574574
575575/* calculated current */
576576static 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);
579579static SENSOR_DEVICE_ATTR_RO (power1_input , ina2xx_value , INA2XX_POWER ) ;
580580/* over-limit power alert setting and alarm */
581581static SENSOR_DEVICE_ATTR_RW (power1_crit , ina226_alert ,
582- INA226_POWER_OVER_LIMIT_BIT ) ;
582+ INA226_POWER_OVER_LIMIT_MASK ) ;
583583static SENSOR_DEVICE_ATTR_RO (power1_crit_alarm , ina226_alarm ,
584- INA226_POWER_OVER_LIMIT_BIT ) ;
584+ INA226_POWER_OVER_LIMIT_MASK ) ;
585585
586586/* shunt resistance */
587587static SENSOR_DEVICE_ATTR_RW (shunt_resistor , ina2xx_shunt , INA2XX_CALIBRATION ) ;
0 commit comments