Skip to content

Commit a83bc87

Browse files
dbalutamathieupoirier
authored andcommitted
reset: imx8mp-audiomix: Prepare the code for more reset bits
Current code supports EARC PHY Software Reset and EARC Software Reset but it is not easily extensible to more reset bits. So, refactor the code in order to easily allow more reset bits in the future. Reviewed-by: Peng Fan <[email protected]> Reviewed-by: Frank Li <[email protected]> Signed-off-by: Daniel Baluta <[email protected]> Reviewed-by: Philipp Zabel <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mathieu Poirier <[email protected]>
1 parent 9df5c53 commit a83bc87

File tree

1 file changed

+33
-10
lines changed

1 file changed

+33
-10
lines changed

drivers/reset/reset-imx8mp-audiomix.c

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
* Copyright 2024 NXP
44
*/
55

6+
#include <dt-bindings/reset/imx8mp-reset-audiomix.h>
7+
68
#include <linux/auxiliary_bus.h>
79
#include <linux/device.h>
810
#include <linux/io.h>
@@ -12,7 +14,24 @@
1214
#include <linux/reset-controller.h>
1315

1416
#define IMX8MP_AUDIOMIX_EARC_RESET_OFFSET 0x200
15-
#define IMX8MP_AUDIOMIX_EARC_RESET_MASK 0x3
17+
#define IMX8MP_AUDIOMIX_EARC_RESET_MASK BIT(1)
18+
#define IMX8MP_AUDIOMIX_EARC_PHY_RESET_MASK BIT(2)
19+
20+
struct imx8mp_reset_map {
21+
unsigned int offset;
22+
unsigned int mask;
23+
};
24+
25+
static const struct imx8mp_reset_map reset_map[] = {
26+
[IMX8MP_AUDIOMIX_EARC_RESET] = {
27+
.offset = IMX8MP_AUDIOMIX_EARC_RESET_OFFSET,
28+
.mask = IMX8MP_AUDIOMIX_EARC_RESET_MASK,
29+
},
30+
[IMX8MP_AUDIOMIX_EARC_PHY_RESET] = {
31+
.offset = IMX8MP_AUDIOMIX_EARC_RESET_OFFSET,
32+
.mask = IMX8MP_AUDIOMIX_EARC_PHY_RESET_MASK,
33+
},
34+
};
1635

1736
struct imx8mp_audiomix_reset {
1837
struct reset_controller_dev rcdev;
@@ -30,13 +49,15 @@ static int imx8mp_audiomix_reset_assert(struct reset_controller_dev *rcdev,
3049
{
3150
struct imx8mp_audiomix_reset *priv = to_imx8mp_audiomix_reset(rcdev);
3251
void __iomem *reg_addr = priv->base;
33-
unsigned int mask, reg;
52+
unsigned int mask, offset, reg;
3453
unsigned long flags;
3554

36-
mask = BIT(id);
55+
mask = reset_map[id].mask;
56+
offset = reset_map[id].offset;
57+
3758
spin_lock_irqsave(&priv->lock, flags);
38-
reg = readl(reg_addr + IMX8MP_AUDIOMIX_EARC_RESET_OFFSET);
39-
writel(reg & ~mask, reg_addr + IMX8MP_AUDIOMIX_EARC_RESET_OFFSET);
59+
reg = readl(reg_addr + offset);
60+
writel(reg & ~mask, reg_addr + offset);
4061
spin_unlock_irqrestore(&priv->lock, flags);
4162

4263
return 0;
@@ -47,13 +68,15 @@ static int imx8mp_audiomix_reset_deassert(struct reset_controller_dev *rcdev,
4768
{
4869
struct imx8mp_audiomix_reset *priv = to_imx8mp_audiomix_reset(rcdev);
4970
void __iomem *reg_addr = priv->base;
50-
unsigned int mask, reg;
71+
unsigned int mask, offset, reg;
5172
unsigned long flags;
5273

53-
mask = BIT(id);
74+
mask = reset_map[id].mask;
75+
offset = reset_map[id].offset;
76+
5477
spin_lock_irqsave(&priv->lock, flags);
55-
reg = readl(reg_addr + IMX8MP_AUDIOMIX_EARC_RESET_OFFSET);
56-
writel(reg | mask, reg_addr + IMX8MP_AUDIOMIX_EARC_RESET_OFFSET);
78+
reg = readl(reg_addr + offset);
79+
writel(reg | mask, reg_addr + offset);
5780
spin_unlock_irqrestore(&priv->lock, flags);
5881

5982
return 0;
@@ -78,7 +101,7 @@ static int imx8mp_audiomix_reset_probe(struct auxiliary_device *adev,
78101
spin_lock_init(&priv->lock);
79102

80103
priv->rcdev.owner = THIS_MODULE;
81-
priv->rcdev.nr_resets = fls(IMX8MP_AUDIOMIX_EARC_RESET_MASK);
104+
priv->rcdev.nr_resets = ARRAY_SIZE(reset_map);
82105
priv->rcdev.ops = &imx8mp_audiomix_reset_ops;
83106
priv->rcdev.of_node = dev->parent->of_node;
84107
priv->rcdev.dev = dev;

0 commit comments

Comments
 (0)