Skip to content

Commit

Permalink
hwmon: (ina2xx) Use bit operations
Browse files Browse the repository at this point in the history
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 <tzungbi@kernel.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
  • Loading branch information
groeck committed Aug 30, 2024
1 parent 61a4a84 commit 232177a
Showing 1 changed file with 42 additions and 42 deletions.
84 changes: 42 additions & 42 deletions drivers/hwmon/ina2xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
* Thanks to Jan Volkering
*/

#include <linux/bitfield.h>
#include <linux/bits.h>
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/hwmon.h>
Expand Down Expand Up @@ -65,25 +67,23 @@
#define INA2XX_RSHUNT_DEFAULT 10000

/* bit mask for reading the averaging setting in the configuration register */
#define INA226_AVG_RD_MASK 0x0E00
#define INA226_AVG_RD_MASK GENMASK(11, 9)

#define INA226_READ_AVG(reg) (((reg) & INA226_AVG_RD_MASK) >> 9)
#define INA226_SHIFT_AVG(val) ((val) << 9)
#define INA226_READ_AVG(reg) FIELD_GET(INA226_AVG_RD_MASK, reg)

#define INA226_ALERT_POLARITY_MASK 0x0002
#define INA226_SHIFT_ALERT_POLARITY(val) ((val) << 1)
#define INA226_ALERT_POL_LOW 0
#define INA226_ALERT_POL_HIGH 1
#define INA226_ALERT_POLARITY_MASK BIT(1)
#define INA226_ALERT_POL_LOW 0
#define INA226_ALERT_POL_HIGH 1

/* bit number of alert functions in Mask/Enable Register */
#define INA226_SHUNT_OVER_VOLTAGE_BIT 15
#define INA226_SHUNT_UNDER_VOLTAGE_BIT 14
#define INA226_BUS_OVER_VOLTAGE_BIT 13
#define INA226_BUS_UNDER_VOLTAGE_BIT 12
#define INA226_POWER_OVER_LIMIT_BIT 11
#define INA226_SHUNT_OVER_VOLTAGE_MASK BIT(15)
#define INA226_SHUNT_UNDER_VOLTAGE_MASK BIT(14)
#define INA226_BUS_OVER_VOLTAGE_MASK BIT(13)
#define INA226_BUS_UNDER_VOLTAGE_MASK BIT(12)
#define INA226_POWER_OVER_LIMIT_MASK BIT(11)

/* bit mask for alert config bits of Mask/Enable Register */
#define INA226_ALERT_CONFIG_MASK 0xFC00
#define INA226_ALERT_CONFIG_MASK GENMASK(15, 10)
#define INA226_ALERT_FUNCTION_FLAG BIT(4)

/* common attrs, ina226 attrs and NULL */
Expand Down Expand Up @@ -177,15 +177,15 @@ static u16 ina226_interval_to_reg(int interval)
avg_bits = find_closest(avg, ina226_avg_tab,
ARRAY_SIZE(ina226_avg_tab));

return INA226_SHIFT_AVG(avg_bits);
return FIELD_PREP(INA226_AVG_RD_MASK, avg_bits);
}

static int ina2xx_set_alert_polarity(struct ina2xx_data *data,
unsigned long val)
{
return regmap_update_bits(data->regmap, INA226_MASK_ENABLE,
INA226_ALERT_POLARITY_MASK,
INA226_SHIFT_ALERT_POLARITY(val));
FIELD_PREP(INA226_ALERT_POLARITY_MASK, val));
}

/*
Expand Down Expand Up @@ -322,20 +322,20 @@ static ssize_t ina2xx_value_show(struct device *dev,
return sysfs_emit(buf, "%d\n", ina2xx_get_value(data, attr->index, regval));
}

static int ina226_reg_to_alert(struct ina2xx_data *data, u8 bit, u16 regval)
static int ina226_reg_to_alert(struct ina2xx_data *data, u32 mask, u16 regval)
{
int reg;

switch (bit) {
case INA226_SHUNT_OVER_VOLTAGE_BIT:
case INA226_SHUNT_UNDER_VOLTAGE_BIT:
switch (mask) {
case INA226_SHUNT_OVER_VOLTAGE_MASK:
case INA226_SHUNT_UNDER_VOLTAGE_MASK:
reg = INA2XX_SHUNT_VOLTAGE;
break;
case INA226_BUS_OVER_VOLTAGE_BIT:
case INA226_BUS_UNDER_VOLTAGE_BIT:
case INA226_BUS_OVER_VOLTAGE_MASK:
case INA226_BUS_UNDER_VOLTAGE_MASK:
reg = INA2XX_BUS_VOLTAGE;
break;
case INA226_POWER_OVER_LIMIT_BIT:
case INA226_POWER_OVER_LIMIT_MASK:
reg = INA2XX_POWER;
break;
default:
Expand All @@ -351,19 +351,19 @@ static int ina226_reg_to_alert(struct ina2xx_data *data, u8 bit, u16 regval)
* Turns alert limit values into register values.
* Opposite of the formula in ina2xx_get_value().
*/
static s16 ina226_alert_to_reg(struct ina2xx_data *data, u8 bit, int val)
static s16 ina226_alert_to_reg(struct ina2xx_data *data, u32 mask, int val)
{
switch (bit) {
case INA226_SHUNT_OVER_VOLTAGE_BIT:
case INA226_SHUNT_UNDER_VOLTAGE_BIT:
switch (mask) {
case INA226_SHUNT_OVER_VOLTAGE_MASK:
case INA226_SHUNT_UNDER_VOLTAGE_MASK:
val *= data->config->shunt_div;
return clamp_val(val, SHRT_MIN, SHRT_MAX);
case INA226_BUS_OVER_VOLTAGE_BIT:
case INA226_BUS_UNDER_VOLTAGE_BIT:
case INA226_BUS_OVER_VOLTAGE_MASK:
case INA226_BUS_UNDER_VOLTAGE_MASK:
val = (val * 1000) << data->config->bus_voltage_shift;
val = DIV_ROUND_CLOSEST(val, data->config->bus_voltage_lsb);
return clamp_val(val, 0, SHRT_MAX);
case INA226_POWER_OVER_LIMIT_BIT:
case INA226_POWER_OVER_LIMIT_MASK:
val = DIV_ROUND_CLOSEST(val, data->power_lsb_uW);
return clamp_val(val, 0, USHRT_MAX);
default:
Expand All @@ -387,7 +387,7 @@ static ssize_t ina226_alert_show(struct device *dev,
if (ret)
goto abort;

if (regval & BIT(attr->index)) {
if (regval & attr->index) {
ret = regmap_read(data->regmap, INA226_ALERT_LIMIT, &regval);
if (ret)
goto abort;
Expand Down Expand Up @@ -432,7 +432,7 @@ static ssize_t ina226_alert_store(struct device *dev,
if (val != 0) {
ret = regmap_update_bits(data->regmap, INA226_MASK_ENABLE,
INA226_ALERT_CONFIG_MASK,
BIT(attr->index));
attr->index);
if (ret < 0)
goto abort;
}
Expand All @@ -456,7 +456,7 @@ static ssize_t ina226_alarm_show(struct device *dev,
if (ret)
return ret;

alarm = (regval & BIT(attr->index)) &&
alarm = (regval & attr->index) &&
(regval & INA226_ALERT_FUNCTION_FLAG);
return sysfs_emit(buf, "%d\n", alarm);
}
Expand Down Expand Up @@ -552,25 +552,25 @@ static ssize_t ina226_interval_show(struct device *dev,
static SENSOR_DEVICE_ATTR_RO(in0_input, ina2xx_value, INA2XX_SHUNT_VOLTAGE);
/* shunt voltage over/under voltage alert setting and alarm */
static SENSOR_DEVICE_ATTR_RW(in0_crit, ina226_alert,
INA226_SHUNT_OVER_VOLTAGE_BIT);
INA226_SHUNT_OVER_VOLTAGE_MASK);
static SENSOR_DEVICE_ATTR_RW(in0_lcrit, ina226_alert,
INA226_SHUNT_UNDER_VOLTAGE_BIT);
INA226_SHUNT_UNDER_VOLTAGE_MASK);
static SENSOR_DEVICE_ATTR_RO(in0_crit_alarm, ina226_alarm,
INA226_SHUNT_OVER_VOLTAGE_BIT);
INA226_SHUNT_OVER_VOLTAGE_MASK);
static SENSOR_DEVICE_ATTR_RO(in0_lcrit_alarm, ina226_alarm,
INA226_SHUNT_UNDER_VOLTAGE_BIT);
INA226_SHUNT_UNDER_VOLTAGE_MASK);

/* bus voltage */
static SENSOR_DEVICE_ATTR_RO(in1_input, ina2xx_value, INA2XX_BUS_VOLTAGE);
/* bus voltage over/under voltage alert setting and alarm */
static SENSOR_DEVICE_ATTR_RW(in1_crit, ina226_alert,
INA226_BUS_OVER_VOLTAGE_BIT);
INA226_BUS_OVER_VOLTAGE_MASK);
static SENSOR_DEVICE_ATTR_RW(in1_lcrit, ina226_alert,
INA226_BUS_UNDER_VOLTAGE_BIT);
INA226_BUS_UNDER_VOLTAGE_MASK);
static SENSOR_DEVICE_ATTR_RO(in1_crit_alarm, ina226_alarm,
INA226_BUS_OVER_VOLTAGE_BIT);
INA226_BUS_OVER_VOLTAGE_MASK);
static SENSOR_DEVICE_ATTR_RO(in1_lcrit_alarm, ina226_alarm,
INA226_BUS_UNDER_VOLTAGE_BIT);
INA226_BUS_UNDER_VOLTAGE_MASK);

/* calculated current */
static SENSOR_DEVICE_ATTR_RO(curr1_input, ina2xx_value, INA2XX_CURRENT);
Expand All @@ -579,9 +579,9 @@ static SENSOR_DEVICE_ATTR_RO(curr1_input, ina2xx_value, INA2XX_CURRENT);
static SENSOR_DEVICE_ATTR_RO(power1_input, ina2xx_value, INA2XX_POWER);
/* over-limit power alert setting and alarm */
static SENSOR_DEVICE_ATTR_RW(power1_crit, ina226_alert,
INA226_POWER_OVER_LIMIT_BIT);
INA226_POWER_OVER_LIMIT_MASK);
static SENSOR_DEVICE_ATTR_RO(power1_crit_alarm, ina226_alarm,
INA226_POWER_OVER_LIMIT_BIT);
INA226_POWER_OVER_LIMIT_MASK);

/* shunt resistance */
static SENSOR_DEVICE_ATTR_RW(shunt_resistor, ina2xx_shunt, INA2XX_CALIBRATION);
Expand Down

0 comments on commit 232177a

Please sign in to comment.