20
20
struct imx8mp_reset_map {
21
21
unsigned int offset ;
22
22
unsigned int mask ;
23
+ bool active_low ;
23
24
};
24
25
25
26
static const struct imx8mp_reset_map reset_map [] = {
26
27
[IMX8MP_AUDIOMIX_EARC_RESET ] = {
27
28
.offset = IMX8MP_AUDIOMIX_EARC_RESET_OFFSET ,
28
29
.mask = IMX8MP_AUDIOMIX_EARC_RESET_MASK ,
30
+ .active_low = true,
29
31
},
30
32
[IMX8MP_AUDIOMIX_EARC_PHY_RESET ] = {
31
33
.offset = IMX8MP_AUDIOMIX_EARC_RESET_OFFSET ,
32
34
.mask = IMX8MP_AUDIOMIX_EARC_PHY_RESET_MASK ,
35
+ .active_low = true,
33
36
},
34
37
};
35
38
@@ -44,42 +47,42 @@ static struct imx8mp_audiomix_reset *to_imx8mp_audiomix_reset(struct reset_contr
44
47
return container_of (rcdev , struct imx8mp_audiomix_reset , rcdev );
45
48
}
46
49
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 )
49
52
{
50
53
struct imx8mp_audiomix_reset * priv = to_imx8mp_audiomix_reset (rcdev );
51
54
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 ;
54
57
55
58
mask = reset_map [id ].mask ;
56
59
offset = reset_map [id ].offset ;
60
+ active_low = reset_map [id ].active_low ;
57
61
58
62
spin_lock_irqsave (& priv -> lock , flags );
63
+
59
64
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
+
61
71
spin_unlock_irqrestore (& priv -> lock , flags );
62
72
63
73
return 0 ;
64
74
}
65
75
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
+
66
82
static int imx8mp_audiomix_reset_deassert (struct reset_controller_dev * rcdev ,
67
83
unsigned long id )
68
84
{
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);
83
86
}
84
87
85
88
static const struct reset_control_ops imx8mp_audiomix_reset_ops = {
0 commit comments