3
3
* Copyright 2024 NXP
4
4
*/
5
5
6
+ #include <dt-bindings/reset/imx8mp-reset-audiomix.h>
7
+
6
8
#include <linux/auxiliary_bus.h>
7
9
#include <linux/device.h>
8
10
#include <linux/io.h>
12
14
#include <linux/reset-controller.h>
13
15
14
16
#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
+ };
16
35
17
36
struct imx8mp_audiomix_reset {
18
37
struct reset_controller_dev rcdev ;
@@ -30,13 +49,15 @@ static int imx8mp_audiomix_reset_assert(struct reset_controller_dev *rcdev,
30
49
{
31
50
struct imx8mp_audiomix_reset * priv = to_imx8mp_audiomix_reset (rcdev );
32
51
void __iomem * reg_addr = priv -> base ;
33
- unsigned int mask , reg ;
52
+ unsigned int mask , offset , reg ;
34
53
unsigned long flags ;
35
54
36
- mask = BIT (id );
55
+ mask = reset_map [id ].mask ;
56
+ offset = reset_map [id ].offset ;
57
+
37
58
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 );
40
61
spin_unlock_irqrestore (& priv -> lock , flags );
41
62
42
63
return 0 ;
@@ -47,13 +68,15 @@ static int imx8mp_audiomix_reset_deassert(struct reset_controller_dev *rcdev,
47
68
{
48
69
struct imx8mp_audiomix_reset * priv = to_imx8mp_audiomix_reset (rcdev );
49
70
void __iomem * reg_addr = priv -> base ;
50
- unsigned int mask , reg ;
71
+ unsigned int mask , offset , reg ;
51
72
unsigned long flags ;
52
73
53
- mask = BIT (id );
74
+ mask = reset_map [id ].mask ;
75
+ offset = reset_map [id ].offset ;
76
+
54
77
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 );
57
80
spin_unlock_irqrestore (& priv -> lock , flags );
58
81
59
82
return 0 ;
@@ -78,7 +101,7 @@ static int imx8mp_audiomix_reset_probe(struct auxiliary_device *adev,
78
101
spin_lock_init (& priv -> lock );
79
102
80
103
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 );
82
105
priv -> rcdev .ops = & imx8mp_audiomix_reset_ops ;
83
106
priv -> rcdev .of_node = dev -> parent -> of_node ;
84
107
priv -> rcdev .dev = dev ;
0 commit comments