From: Ariana Lazar <ariana.lazar@microchip.com>
To: "Jonathan Cameron" <jic23@kernel.org>,
"David Lechner" <dlechner@baylibre.com>,
"Nuno Sá" <nuno.sa@analog.com>,
"Andy Shevchenko" <andy@kernel.org>,
"Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>
Cc: <linux-kernel@vger.kernel.org>, <linux-iio@vger.kernel.org>,
<devicetree@vger.kernel.org>,
Ariana Lazar <ariana.lazar@microchip.com>,
Jonathan Cameron <jic23@kernel.org>
Subject: [PATCH v7 08/11] iio: dac: mcp47feb02: use field_prep() instead of custom dynamic macros
Date: Fri, 18 Sep 2026 12:06:34 +0300 [thread overview]
Message-ID: <20260918-mcp47feb02_refactor-v7-8-82ca794eafe2@microchip.com> (raw)
In-Reply-To: <20260918-mcp47feb02_refactor-v7-0-82ca794eafe2@microchip.com>
Replace manual bit operations which select channel corresponding bits
from a control register for each write to regmap operation using
regmap_update_bits(). This approach matches the use of field_get() in
probe() and improves code readability.
Suggested-by: Jonathan Cameron <jic23@kernel.org>
Link: https://lore.kernel.org/all/20260917015334.1f43bd02@jic23-hlaptop/
Signed-off-by: Ariana Lazar <ariana.lazar@microchip.com>
---
drivers/iio/dac/mcp47feb02.c | 36 ++++++++++++++++++++++--------------
1 file changed, 22 insertions(+), 14 deletions(-)
diff --git a/drivers/iio/dac/mcp47feb02.c b/drivers/iio/dac/mcp47feb02.c
index 8019d398fbbbc866303ed7e9280f30acef4d6cc7..7312c2c96141e417726fc97954d8cb1fafefe3e9 100644
--- a/drivers/iio/dac/mcp47feb02.c
+++ b/drivers/iio/dac/mcp47feb02.c
@@ -48,12 +48,10 @@
#define MCP47FEB02_NV_I2C_SLAVE_ADDR_MASK GENMASK(7, 0)
/* Voltage reference, Power-Down control register and DAC Wiperlock status register fields */
-#define DAC_CTRL_MASK(ch) (GENMASK(1, 0) << (2 * (ch)))
-#define DAC_CTRL_VAL(ch, val) ((val) << (2 * (ch)))
+#define MCP47FEB02_VREF_PD_MASK(ch) (GENMASK(1, 0) << (2 * (ch)))
/* Gain Control and I2C Slave Address Register fields */
#define DAC_GAIN_MASK(ch) (BIT(0) << (8 + (ch)))
-#define DAC_GAIN_VAL(ch, val) ((val) << (8 + (ch)))
#define REG_ADDR(reg) ((reg) << 3)
#define NV_REG_ADDR(reg) ((NV_DAC_ADDR_OFFSET + (reg)) << 3)
@@ -550,11 +548,13 @@ static int mcp47feb02_suspend(struct device *dev)
for_each_set_bit(ch, &data->active_channels_mask, data->phys_channels) {
u8 pd_mode;
+ u32 mask;
data->chdata[ch].powerdown = true;
pd_mode = data->chdata[ch].powerdown_mode + 1;
+ mask = MCP47FEB02_VREF_PD_MASK(ch);
ret = regmap_update_bits(data->regmap, MCP47FEB02_POWER_DOWN_REG_ADDR,
- DAC_CTRL_MASK(ch), DAC_CTRL_VAL(ch, pd_mode));
+ mask, field_prep(mask, pd_mode));
if (ret)
return ret;
@@ -576,6 +576,7 @@ static int mcp47feb02_resume(struct device *dev)
for_each_set_bit(ch, &data->active_channels_mask, data->phys_channels) {
u8 pd_mode;
+ u32 mask;
int ret;
data->chdata[ch].powerdown = false;
@@ -585,20 +586,21 @@ static int mcp47feb02_resume(struct device *dev)
if (ret)
return ret;
+ mask = MCP47FEB02_VREF_PD_MASK(ch);
ret = regmap_update_bits(data->regmap, MCP47FEB02_VREF_REG_ADDR,
- DAC_CTRL_MASK(ch), DAC_CTRL_VAL(ch, pd_mode));
+ mask, field_prep(mask, pd_mode));
if (ret)
return ret;
+ mask = DAC_GAIN_MASK(ch);
ret = regmap_update_bits(data->regmap, MCP47FEB02_GAIN_CTRL_STATUS_REG_ADDR,
- DAC_GAIN_MASK(ch),
- DAC_GAIN_VAL(ch, data->chdata[ch].use_2x_gain));
+ mask, field_prep(mask, data->chdata[ch].use_2x_gain));
if (ret)
return ret;
+ mask = MCP47FEB02_VREF_PD_MASK(ch);
ret = regmap_update_bits(data->regmap, MCP47FEB02_POWER_DOWN_REG_ADDR,
- DAC_CTRL_MASK(ch),
- DAC_CTRL_VAL(ch, MCP47FEB02_NORMAL_OPERATION));
+ mask, field_prep(mask, MCP47FEB02_NORMAL_OPERATION));
if (ret)
return ret;
}
@@ -641,6 +643,7 @@ static ssize_t mcp47feb02_write_powerdown(struct iio_dev *indio_dev, uintptr_t p
u32 reg = ch->address;
u8 tmp_pd_mode;
bool state;
+ u32 mask;
int ret;
guard(mutex)(&data->lock);
@@ -654,8 +657,9 @@ static ssize_t mcp47feb02_write_powerdown(struct iio_dev *indio_dev, uintptr_t p
* requires writing normal operation mode (0) to the channel-specific register bits.
*/
tmp_pd_mode = state ? (data->chdata[reg].powerdown_mode + 1) : MCP47FEB02_NORMAL_OPERATION;
+ mask = MCP47FEB02_VREF_PD_MASK(reg);
ret = regmap_update_bits(data->regmap, MCP47FEB02_POWER_DOWN_REG_ADDR,
- DAC_CTRL_MASK(reg), DAC_CTRL_VAL(reg, tmp_pd_mode));
+ mask, field_prep(mask, tmp_pd_mode));
if (ret)
return ret;
@@ -799,6 +803,7 @@ static int mcp47feb02_check_scale(struct mcp47feb02_data *data, int val, int val
static int mcp47feb02_ch_scale(struct mcp47feb02_data *data, int ch, int scale)
{
int tmp_val, ret;
+ u32 mask;
if (scale == MCP47FEB02_SCALE_VDD) {
tmp_val = MCP47FEB02_VREF_VDD;
@@ -820,8 +825,9 @@ static int mcp47feb02_ch_scale(struct mcp47feb02_data *data, int ch, int scale)
tmp_val = MCP47FEB02_INTERNAL_BAND_GAP;
}
+ mask = MCP47FEB02_VREF_PD_MASK(ch);
ret = regmap_update_bits(data->regmap, MCP47FEB02_VREF_REG_ADDR,
- DAC_CTRL_MASK(ch), DAC_CTRL_VAL(ch, tmp_val));
+ mask, field_prep(mask, tmp_val));
if (ret)
return ret;
@@ -844,6 +850,7 @@ static int mcp47feb02_ch_scale(struct mcp47feb02_data *data, int ch, int scale)
static int mcp47feb02_set_scale(struct mcp47feb02_data *data, int ch, int scale)
{
int tmp_val, ret;
+ u32 mask;
ret = mcp47feb02_ch_scale(data, ch, scale);
if (ret)
@@ -854,8 +861,9 @@ static int mcp47feb02_set_scale(struct mcp47feb02_data *data, int ch, int scale)
else
tmp_val = MCP47FEB02_GAIN_BIT_X1;
+ mask = DAC_GAIN_MASK(ch);
ret = regmap_update_bits(data->regmap, MCP47FEB02_GAIN_CTRL_STATUS_REG_ADDR,
- DAC_GAIN_MASK(ch), DAC_GAIN_VAL(ch, tmp_val));
+ mask, field_prep(mask, tmp_val));
if (ret)
return ret;
@@ -1026,7 +1034,7 @@ static int mcp47feb02_init_ctrl_regs(struct mcp47feb02_data *data)
return ret;
data->chdata[i].dac_data = dac_val;
- data->chdata[i].ref_mode = field_get(DAC_CTRL_MASK(i), vref_ch);
+ data->chdata[i].ref_mode = field_get(MCP47FEB02_VREF_PD_MASK(i), vref_ch);
data->chdata[i].use_2x_gain = field_get(DAC_GAIN_MASK(i), gain_ch);
/*
@@ -1070,7 +1078,7 @@ static int mcp47feb02_init_ctrl_regs(struct mcp47feb02_data *data)
break;
}
- pd_tmp = field_get(DAC_CTRL_MASK(i), pd_ch);
+ pd_tmp = field_get(MCP47FEB02_VREF_PD_MASK(i), pd_ch);
data->chdata[i].powerdown_mode = pd_tmp ? (pd_tmp - 1) : pd_tmp;
data->chdata[i].powerdown = !!(data->chdata[i].powerdown_mode);
}
--
2.43.0
next prev parent reply other threads:[~2026-09-18 9:08 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-18 9:06 [PATCH v7 00/11] Refactor Microchip MCP47FEB02 I2C driver in separate modules to add support for MCP48FEB02 SPI driver Ariana Lazar
2026-09-18 9:06 ` [PATCH v7 01/11] iio: dac: mcp47feb02: initialize dac_data field in channel data struct at probe Ariana Lazar
2026-09-18 9:48 ` Andy Shevchenko
2026-09-18 9:06 ` [PATCH v7 02/11] iio: dac: mcp47feb02: Fix gain field initialization for active channels Ariana Lazar
2026-09-18 9:48 ` Andy Shevchenko
2026-09-18 9:06 ` [PATCH v7 03/11] iio: dac: mcp47feb02: use field_get() instead of custom dynamic macros Ariana Lazar
2026-09-18 9:17 ` sashiko-bot
2026-09-18 9:46 ` Andy Shevchenko
2026-09-20 18:44 ` Jonathan Cameron
2026-09-18 9:06 ` [PATCH v7 04/11] iio: dac: mcp47feb02: Return len when disabling EEPROM store Ariana Lazar
2026-09-18 9:49 ` Andy Shevchenko
2026-09-18 9:06 ` [PATCH v7 05/11] iio: dac: mcp47feb02: Increase EEPROM Programming Write Cycle Time Ariana Lazar
2026-09-18 9:49 ` Andy Shevchenko
2026-09-18 9:06 ` [PATCH v7 06/11] iio: dac: mcp47feb02: Avoid unjustified probe error on missing label Ariana Lazar
2026-09-18 9:22 ` sashiko-bot
2026-09-18 9:50 ` Andy Shevchenko
2026-09-20 22:52 ` Jonathan Cameron
2026-09-18 9:06 ` [PATCH v7 07/11] iio: dac: mcp47feb02: correct typo from a comment Ariana Lazar
2026-09-18 9:51 ` Andy Shevchenko
2026-09-18 9:06 ` Ariana Lazar [this message]
2026-09-18 9:06 ` [PATCH v7 09/11] iio: dac: mcp47feb02: refactor MCP47FEB02 I2C driver into two modules Ariana Lazar
2026-09-18 9:28 ` sashiko-bot
2026-09-20 22:52 ` Jonathan Cameron
2026-09-18 9:06 ` [PATCH v7 10/11] dt-bindings: iio: dac: add support for MCP48FEB02 SPI Ariana Lazar
2026-09-18 9:06 ` [PATCH v7 11/11] iio: dac: add support for Microchip MCP48FEB02 Ariana Lazar
2026-09-18 9:52 ` [PATCH v7 00/11] Refactor Microchip MCP47FEB02 I2C driver in separate modules to add support for MCP48FEB02 SPI driver Andy Shevchenko
2026-09-20 23:08 ` Jonathan Cameron
2026-09-21 14:16 ` Ariana.Lazar
2026-09-21 23:56 ` Jonathan Cameron
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=20260918-mcp47feb02_refactor-v7-8-82ca794eafe2@microchip.com \
--to=ariana.lazar@microchip.com \
--cc=andy@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dlechner@baylibre.com \
--cc=jic23@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nuno.sa@analog.com \
--cc=robh@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.