* TODO: interrupt support, thresholds
  */
 
-#include <linux/module.h>
-#include <linux/init.h>
+#include <linux/bitfield.h>
 #include <linux/i2c.h>
+#include <linux/module.h>
 
 #include <linux/iio/iio.h>
 #include <linux/iio/sysfs.h>
 #define AL3320A_CONFIG_DISABLE         0x00
 #define AL3320A_CONFIG_ENABLE          0x01
 
-#define AL3320A_GAIN_SHIFT             1
-#define AL3320A_GAIN_MASK              (BIT(2) | BIT(1))
+#define AL3320A_GAIN_MASK              GENMASK(2, 1)
 
 /* chip params default values */
 #define AL3320A_DEFAULT_MEAN_TIME      4
                return ret;
 
        ret = i2c_smbus_write_byte_data(data->client, AL3320A_REG_CONFIG_RANGE,
-                                       AL3320A_RANGE_3 << AL3320A_GAIN_SHIFT);
+                                       FIELD_PREP(AL3320A_GAIN_MASK,
+                                                  AL3320A_RANGE_3));
        if (ret < 0)
                return ret;
 
                if (ret < 0)
                        return ret;
 
-               ret = (ret & AL3320A_GAIN_MASK) >> AL3320A_GAIN_SHIFT;
+               ret = FIELD_GET(AL3320A_GAIN_MASK, ret);
                *val = al3320a_scales[ret][0];
                *val2 = al3320a_scales[ret][1];
 
        switch (mask) {
        case IIO_CHAN_INFO_SCALE:
                for (i = 0; i < ARRAY_SIZE(al3320a_scales); i++) {
-                       if (val == al3320a_scales[i][0] &&
-                           val2 == al3320a_scales[i][1])
-                               return i2c_smbus_write_byte_data(data->client,
+                       if (val != al3320a_scales[i][0] ||
+                           val2 != al3320a_scales[i][1])
+                               continue;
+
+                       return i2c_smbus_write_byte_data(data->client,
                                        AL3320A_REG_CONFIG_RANGE,
-                                       i << AL3320A_GAIN_SHIFT);
+                                       FIELD_PREP(AL3320A_GAIN_MASK, i));
                }
                break;
        }