Skip to content

Commit 9fba663

Browse files
dbalutamathieupoirier
authored andcommitted
reset: imx8mp-audiomix: Introduce active_low configuration option
For EARC and EARC PHY the reset happens when clearing the reset bits. Refactor assert/deassert function in order to take into account the active_low configuration option. Reviewed-by: Philipp Zabel <[email protected]> Reviewed-by: Peng Fan <[email protected]> Reviewed-by: Frank Li <[email protected]> Signed-off-by: Daniel Baluta <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mathieu Poirier <[email protected]>
1 parent a83bc87 commit 9fba663

File tree

1 file changed

+22
-19
lines changed

1 file changed

+22
-19
lines changed

drivers/reset/reset-imx8mp-audiomix.c

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,19 @@
2020
struct imx8mp_reset_map {
2121
unsigned int offset;
2222
unsigned int mask;
23+
bool active_low;
2324
};
2425

2526
static const struct imx8mp_reset_map reset_map[] = {
2627
[IMX8MP_AUDIOMIX_EARC_RESET] = {
2728
.offset = IMX8MP_AUDIOMIX_EARC_RESET_OFFSET,
2829
.mask = IMX8MP_AUDIOMIX_EARC_RESET_MASK,
30+
.active_low = true,
2931
},
3032
[IMX8MP_AUDIOMIX_EARC_PHY_RESET] = {
3133
.offset = IMX8MP_AUDIOMIX_EARC_RESET_OFFSET,
3234
.mask = IMX8MP_AUDIOMIX_EARC_PHY_RESET_MASK,
35+
.active_low = true,
3336
},
3437
};
3538

@@ -44,42 +47,42 @@ static struct imx8mp_audiomix_reset *to_imx8mp_audiomix_reset(struct reset_contr
4447
return container_of(rcdev, struct imx8mp_audiomix_reset, rcdev);
4548
}
4649

47-
static int imx8mp_audiomix_reset_assert(struct reset_controller_dev *rcdev,
48-
unsigned long id)
50+
static int imx8mp_audiomix_update(struct reset_controller_dev *rcdev,
51+
unsigned long id, bool assert)
4952
{
5053
struct imx8mp_audiomix_reset *priv = to_imx8mp_audiomix_reset(rcdev);
5154
void __iomem *reg_addr = priv->base;
52-
unsigned int mask, offset, reg;
53-
unsigned long flags;
55+
unsigned int mask, offset, active_low;
56+
unsigned long reg, flags;
5457

5558
mask = reset_map[id].mask;
5659
offset = reset_map[id].offset;
60+
active_low = reset_map[id].active_low;
5761

5862
spin_lock_irqsave(&priv->lock, flags);
63+
5964
reg = readl(reg_addr + offset);
60-
writel(reg & ~mask, reg_addr + offset);
65+
if (active_low ^ assert)
66+
reg |= mask;
67+
else
68+
reg &= ~mask;
69+
writel(reg, reg_addr + offset);
70+
6171
spin_unlock_irqrestore(&priv->lock, flags);
6272

6373
return 0;
6474
}
6575

76+
static int imx8mp_audiomix_reset_assert(struct reset_controller_dev *rcdev,
77+
unsigned long id)
78+
{
79+
return imx8mp_audiomix_update(rcdev, id, true);
80+
}
81+
6682
static int imx8mp_audiomix_reset_deassert(struct reset_controller_dev *rcdev,
6783
unsigned long id)
6884
{
69-
struct imx8mp_audiomix_reset *priv = to_imx8mp_audiomix_reset(rcdev);
70-
void __iomem *reg_addr = priv->base;
71-
unsigned int mask, offset, reg;
72-
unsigned long flags;
73-
74-
mask = reset_map[id].mask;
75-
offset = reset_map[id].offset;
76-
77-
spin_lock_irqsave(&priv->lock, flags);
78-
reg = readl(reg_addr + offset);
79-
writel(reg | mask, reg_addr + offset);
80-
spin_unlock_irqrestore(&priv->lock, flags);
81-
82-
return 0;
85+
return imx8mp_audiomix_update(rcdev, id, false);
8386
}
8487

8588
static const struct reset_control_ops imx8mp_audiomix_reset_ops = {

0 commit comments

Comments
 (0)