Re: [PATCH v4 5/8] reset: imx8mp-audiomix: Switch to using regmap API
From: Philipp Zabel <p.zabel@pengutronix.de>
Date: 2025-11-05 15:11:00
Also in:
imx, linux-clk, linux-devicetree, lkml
On Di, 2025-11-04 at 04:02 -0800, Laurentiu Mihalcea wrote:
quoted hunk ↗ jump to hunk
From: Laurentiu Mihalcea <redacted> Switch to using the regmap API to allow performing register operations under the same lock. This is needed for cases such as i.MX8ULP's SIM LPAV where clock gating, reset control and MUX-ing is performed via the same register (i.e. SYSCTRL0) and different subsystem APIs. Signed-off-by: Laurentiu Mihalcea <redacted> --- drivers/reset/reset-imx8mp-audiomix.c | 93 +++++++++++++++++---------- 1 file changed, 58 insertions(+), 35 deletions(-)diff --git a/drivers/reset/reset-imx8mp-audiomix.c b/drivers/reset/reset-imx8mp-audiomix.c index e9643365a62c..18a7f68aa59f 100644 --- a/drivers/reset/reset-imx8mp-audiomix.c +++ b/drivers/reset/reset-imx8mp-audiomix.c@@ -11,6 +11,7 @@ #include <linux/module.h> #include <linux/of.h> #include <linux/of_address.h> +#include <linux/regmap.h> #include <linux/reset-controller.h> #define IMX8MP_AUDIOMIX_EARC_RESET_OFFSET 0x200@@ -42,8 +43,7 @@ static const struct imx8mp_reset_map reset_map[] = { struct imx8mp_audiomix_reset { struct reset_controller_dev rcdev; - spinlock_t lock; /* protect register read-modify-write cycle */ - void __iomem *base; + struct regmap *regmap; }; static struct imx8mp_audiomix_reset *to_imx8mp_audiomix_reset(struct reset_controller_dev *rcdev)@@ -55,26 +55,15 @@ static int imx8mp_audiomix_update(struct reset_controller_dev *rcdev, unsigned long id, bool assert) { struct imx8mp_audiomix_reset *priv = to_imx8mp_audiomix_reset(rcdev); - void __iomem *reg_addr = priv->base; - unsigned int mask, offset, active_low; - unsigned long reg, flags; + unsigned int mask, offset, active_low, shift, val; mask = reset_map[id].mask; offset = reset_map[id].offset; active_low = reset_map[id].active_low; + shift = ffs(mask) - 1; + val = (active_low ^ assert) << shift;
If you store the bit offset in the reset map, this can become mask = BIT(reset_map[id].bit); /* ... */ val = (active_low ^ assert) << reset_map[id].bit; regards Philipp