From: Marcelo Machado Lage <marcelomlage@usp.br>
To: andy@kernel.org, dlechner@baylibre.com, jic23@kernel.org,
nuno.sa@analog.com
Cc: Marcelo Machado Lage <marcelomlage@usp.br>,
Vinicius Lira <vinilira@usp.br>,
linux-iio@vger.kernel.org
Subject: [PATCH v3 2/2] iio: adc: mcp3422: write bit operations with bitfield.h macros
Date: Mon, 20 Apr 2026 16:14:55 -0300 [thread overview]
Message-ID: <20260420191455.529923-3-marcelomlage@usp.br> (raw)
In-Reply-To: <20260420191455.529923-1-marcelomlage@usp.br>
Replace manual bit manipulations with FIELD_GET(), FIELD_PREP() and
FIELD_MODIFY() calls. The resulting code is more readable and
maintainable, and 6 macros previously defined in the header are not
needed anymore.
Signed-off-by: Marcelo Machado Lage <marcelomlage@usp.br>
Co-developed-by: Vinicius Lira <vinilira@usp.br>
Signed-off-by: Vinicius Lira <vinilira@usp.br>
---
v1 -> v2:
- Remove 3 further macros still present in v1 and replace their usages by inline calls to FIELD_GET(), following a request by Jonathan Comeron
v2 -> v3:
- Apply stylistic changes to the definition block inside mcp3422_read_raw(), following a request by Andy Shevchenko
v1: https://lore.kernel.org/linux-iio/20260417005041.484742-1-marcelomlage@usp.br/
v2: https://lore.kernel.org/linux-iio/20260417165747.507487-1-marcelomlage@usp.br/
drivers/iio/adc/mcp3422.c | 52 +++++++++++++++------------------------
1 file changed, 20 insertions(+), 32 deletions(-)
diff --git a/drivers/iio/adc/mcp3422.c b/drivers/iio/adc/mcp3422.c
index 0cd0e7d39e39..24906f152c56 100644
--- a/drivers/iio/adc/mcp3422.c
+++ b/drivers/iio/adc/mcp3422.c
@@ -13,6 +13,7 @@
* voltage unit is nV.
*/
+#include <linux/bitfield.h>
#include <linux/bits.h>
#include <linux/err.h>
#include <linux/i2c.h>
@@ -39,14 +40,6 @@
#define MCP3422_PGA_8 3
#define MCP3422_CONT_SAMPLING BIT(4)
-#define MCP3422_CHANNEL(config) (((config) & MCP3422_CHANNEL_MASK) >> 5)
-#define MCP3422_PGA(config) ((config) & MCP3422_PGA_MASK)
-#define MCP3422_SAMPLE_RATE(config) (((config) & MCP3422_SRATE_MASK) >> 2)
-
-#define MCP3422_CHANNEL_VALUE(value) (((value) << 5) & MCP3422_CHANNEL_MASK)
-#define MCP3422_PGA_VALUE(value) ((value) & MCP3422_PGA_MASK)
-#define MCP3422_SAMPLE_RATE_VALUE(value) ((value << 2) & MCP3422_SRATE_MASK)
-
#define MCP3422_CHAN(_index) \
{ \
.type = IIO_VOLTAGE, \
@@ -109,7 +102,7 @@ static int mcp3422_update_config(struct mcp3422 *adc, u8 newconfig)
static int mcp3422_read(struct mcp3422 *adc, int *value, u8 *config)
{
int ret = 0;
- u8 sample_rate = MCP3422_SAMPLE_RATE(adc->config);
+ u8 sample_rate = FIELD_GET(MCP3422_SRATE_MASK, adc->config);
u8 buf[4] = {0, 0, 0, 0};
u32 temp;
@@ -137,18 +130,18 @@ static int mcp3422_read_channel(struct mcp3422 *adc,
mutex_lock(&adc->lock);
- if (req_channel != MCP3422_CHANNEL(adc->config)) {
+ if (req_channel != FIELD_GET(MCP3422_CHANNEL_MASK, adc->config)) {
config = adc->config;
- config &= ~MCP3422_CHANNEL_MASK;
- config |= MCP3422_CHANNEL_VALUE(req_channel);
- config &= ~MCP3422_PGA_MASK;
- config |= MCP3422_PGA_VALUE(adc->pga[req_channel]);
+
+ FIELD_MODIFY(MCP3422_CHANNEL_MASK, &config, req_channel);
+ FIELD_MODIFY(MCP3422_PGA_MASK, &config, adc->pga[req_channel]);
+
ret = mcp3422_update_config(adc, config);
if (ret < 0) {
mutex_unlock(&adc->lock);
return ret;
}
- msleep(mcp3422_read_times[MCP3422_SAMPLE_RATE(adc->config)]);
+ msleep(mcp3422_read_times[FIELD_GET(MCP3422_SRATE_MASK, adc->config)]);
}
ret = mcp3422_read(adc, value, &config);
@@ -164,9 +157,8 @@ static int mcp3422_read_raw(struct iio_dev *iio,
{
struct mcp3422 *adc = iio_priv(iio);
int err;
-
- u8 sample_rate = MCP3422_SAMPLE_RATE(adc->config);
- u8 pga = MCP3422_PGA(adc->config);
+ u8 sample_rate = FIELD_GET(MCP3422_SRATE_MASK, adc->config);
+ u8 pga = FIELD_GET(MCP3422_PGA_MASK, adc->config);
switch (mask) {
case IIO_CHAN_INFO_RAW:
@@ -182,7 +174,7 @@ static int mcp3422_read_raw(struct iio_dev *iio,
return IIO_VAL_INT_PLUS_NANO;
case IIO_CHAN_INFO_SAMP_FREQ:
- *val1 = mcp3422_sample_rates[MCP3422_SAMPLE_RATE(adc->config)];
+ *val1 = mcp3422_sample_rates[FIELD_GET(MCP3422_SRATE_MASK, adc->config)];
return IIO_VAL_INT;
default:
@@ -200,7 +192,7 @@ static int mcp3422_write_raw(struct iio_dev *iio,
u8 temp;
u8 config = adc->config;
u8 req_channel = channel->channel;
- u8 sample_rate = MCP3422_SAMPLE_RATE(config);
+ u8 sample_rate = FIELD_GET(MCP3422_SRATE_MASK, config);
u8 i;
switch (mask) {
@@ -212,10 +204,8 @@ static int mcp3422_write_raw(struct iio_dev *iio,
if (val2 == mcp3422_scales[sample_rate][i]) {
adc->pga[req_channel] = i;
- config &= ~MCP3422_CHANNEL_MASK;
- config |= MCP3422_CHANNEL_VALUE(req_channel);
- config &= ~MCP3422_PGA_MASK;
- config |= MCP3422_PGA_VALUE(adc->pga[req_channel]);
+ FIELD_MODIFY(MCP3422_CHANNEL_MASK, &config, req_channel);
+ FIELD_MODIFY(MCP3422_PGA_MASK, &config, adc->pga[req_channel]);
return mcp3422_update_config(adc, config);
}
@@ -242,10 +232,8 @@ static int mcp3422_write_raw(struct iio_dev *iio,
return -EINVAL;
}
- config &= ~MCP3422_CHANNEL_MASK;
- config |= MCP3422_CHANNEL_VALUE(req_channel);
- config &= ~MCP3422_SRATE_MASK;
- config |= MCP3422_SAMPLE_RATE_VALUE(temp);
+ FIELD_MODIFY(MCP3422_CHANNEL_MASK, &config, req_channel);
+ FIELD_MODIFY(MCP3422_SRATE_MASK, &config, temp);
return mcp3422_update_config(adc, config);
@@ -284,7 +272,7 @@ static ssize_t mcp3422_show_scales(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct mcp3422 *adc = iio_priv(dev_to_iio_dev(dev));
- u8 sample_rate = MCP3422_SAMPLE_RATE(adc->config);
+ u8 sample_rate = FIELD_GET(MCP3422_SRATE_MASK, adc->config);
return sprintf(buf, "0.%09u 0.%09u 0.%09u 0.%09u\n",
mcp3422_scales[sample_rate][0],
@@ -378,9 +366,9 @@ static int mcp3422_probe(struct i2c_client *client)
/* meaningful default configuration */
config = (MCP3422_CONT_SAMPLING
- | MCP3422_CHANNEL_VALUE(0)
- | MCP3422_PGA_VALUE(MCP3422_PGA_1)
- | MCP3422_SAMPLE_RATE_VALUE(MCP3422_SRATE_240));
+ | FIELD_PREP(MCP3422_CHANNEL_MASK, 0)
+ | FIELD_PREP(MCP3422_PGA_MASK, MCP3422_PGA_1)
+ | FIELD_PREP(MCP3422_SRATE_MASK, MCP3422_SRATE_240));
err = mcp3422_update_config(adc, config);
if (err < 0)
return err;
--
2.34.1
next prev parent reply other threads:[~2026-04-20 19:15 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-20 19:14 [PATCH v3 0/2] iio: adc: mcp3422: apply bit manipulation macros Marcelo Machado Lage
2026-04-20 19:14 ` [PATCH v3 1/2] iio: adc: mcp3422: rewrite mask macros using bits.h macros Marcelo Machado Lage
2026-04-20 19:14 ` Marcelo Machado Lage [this message]
2026-04-20 20:24 ` [PATCH v3 2/2] iio: adc: mcp3422: write bit operations with bitfield.h macros Andy Shevchenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260420191455.529923-3-marcelomlage@usp.br \
--to=marcelomlage@usp.br \
--cc=andy@kernel.org \
--cc=dlechner@baylibre.com \
--cc=jic23@kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=nuno.sa@analog.com \
--cc=vinilira@usp.br \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox