Skip to content

Commit 232177a

Browse files
committed
hwmon: (ina2xx) Use bit operations
Use bit operations where possible to make the code more generic and to align it with other drivers. Also use compile time conversion from bit to mask to reduce runtime overhead. Reviewed-by: Tzung-Bi Shih <[email protected]> Signed-off-by: Guenter Roeck <[email protected]>
1 parent 61a4a84 commit 232177a

File tree

1 file changed

+42
-42
lines changed

1 file changed

+42
-42
lines changed

drivers/hwmon/ina2xx.c

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
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>
@@ -65,25 +67,23 @@
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

183183
static 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,
552552
static SENSOR_DEVICE_ATTR_RO(in0_input, ina2xx_value, INA2XX_SHUNT_VOLTAGE);
553553
/* shunt voltage over/under voltage alert setting and alarm */
554554
static SENSOR_DEVICE_ATTR_RW(in0_crit, ina226_alert,
555-
INA226_SHUNT_OVER_VOLTAGE_BIT);
555+
INA226_SHUNT_OVER_VOLTAGE_MASK);
556556
static SENSOR_DEVICE_ATTR_RW(in0_lcrit, ina226_alert,
557-
INA226_SHUNT_UNDER_VOLTAGE_BIT);
557+
INA226_SHUNT_UNDER_VOLTAGE_MASK);
558558
static SENSOR_DEVICE_ATTR_RO(in0_crit_alarm, ina226_alarm,
559-
INA226_SHUNT_OVER_VOLTAGE_BIT);
559+
INA226_SHUNT_OVER_VOLTAGE_MASK);
560560
static 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 */
564564
static SENSOR_DEVICE_ATTR_RO(in1_input, ina2xx_value, INA2XX_BUS_VOLTAGE);
565565
/* bus voltage over/under voltage alert setting and alarm */
566566
static SENSOR_DEVICE_ATTR_RW(in1_crit, ina226_alert,
567-
INA226_BUS_OVER_VOLTAGE_BIT);
567+
INA226_BUS_OVER_VOLTAGE_MASK);
568568
static SENSOR_DEVICE_ATTR_RW(in1_lcrit, ina226_alert,
569-
INA226_BUS_UNDER_VOLTAGE_BIT);
569+
INA226_BUS_UNDER_VOLTAGE_MASK);
570570
static SENSOR_DEVICE_ATTR_RO(in1_crit_alarm, ina226_alarm,
571-
INA226_BUS_OVER_VOLTAGE_BIT);
571+
INA226_BUS_OVER_VOLTAGE_MASK);
572572
static 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 */
576576
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);
579579
static SENSOR_DEVICE_ATTR_RO(power1_input, ina2xx_value, INA2XX_POWER);
580580
/* over-limit power alert setting and alarm */
581581
static SENSOR_DEVICE_ATTR_RW(power1_crit, ina226_alert,
582-
INA226_POWER_OVER_LIMIT_BIT);
582+
INA226_POWER_OVER_LIMIT_MASK);
583583
static 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 */
587587
static SENSOR_DEVICE_ATTR_RW(shunt_resistor, ina2xx_shunt, INA2XX_CALIBRATION);

0 commit comments

Comments
 (0)