1 /*
2 * Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
3 *
4 * Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
5 * the the people's Republic of China and other countries.
6 * All Allwinner Technology Co.,Ltd. trademarks are used with permission.
7 *
8 * DISCLAIMER
9 * THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
10 * IF YOU NEED TO INTEGRATE THIRD PARTY’S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
11 * IN ALLWINNERS’SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
12 * ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
13 * ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
14 * COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
15 * YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY’S TECHNOLOGY.
16 *
17 *
18 * THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
19 * PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
20 * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
21 * THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
22 * OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
23 * IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26 * LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
30 * OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32 #include <sound/snd_core.h>
33 
34  /*#define SND_IO_DEBUG */
35 #ifdef SND_IO_DEBUG
36 #define snd_io_debug        printf
37 #else
38 #define snd_io_debug(fmt, args...)
39 #endif
40 
snd_codec_read(struct snd_codec * codec,unsigned int reg)41 unsigned int snd_codec_read(struct snd_codec *codec, unsigned int reg)
42 {
43     unsigned int val = 0;
44 //        uint32_t __cpsr;
45         /*__cpsr = hal_spin_lock_irqsave();*/
46 
47     if (codec->read)
48         val = codec->read(codec, reg);
49     else
50         val = snd_readl(codec->codec_base_addr + reg);
51 
52         /*hal_spin_unlock_irqrestore(__cpsr);*/
53     snd_io_debug("reg=0x%x, val:0x%x\n", reg, val);
54 
55     return val;
56 }
57 
snd_codec_write(struct snd_codec * codec,unsigned int reg,unsigned int val)58 int snd_codec_write(struct snd_codec *codec, unsigned int reg, unsigned int val)
59 {
60     int ret = 0;
61 //        uint32_t __cpsr;
62         /*__cpsr = hal_spin_lock_irqsave();*/
63 
64     if (codec->write)
65         ret = codec->write(codec, reg, val);
66     else
67         ret = snd_writel(val, codec->codec_base_addr + reg);
68 
69         /*hal_spin_unlock_irqrestore(__cpsr);*/
70     snd_io_debug("reg=0x%x, val=0x%x\n", reg, val);
71 
72     return ret;
73 }
74 
snd_codec_update_bits(struct snd_codec * codec,unsigned int reg,unsigned int mask,unsigned int value)75 int snd_codec_update_bits(struct snd_codec *codec, unsigned int reg,
76                 unsigned int mask, unsigned int value)
77 {
78     int ret = 0;
79     unsigned int old, new;
80     bool change;
81 //        uint32_t __cpsr;
82         /*__cpsr = hal_spin_lock_irqsave();*/
83 
84     if (codec->read)
85         old = codec->read(codec, reg);
86     else
87         old = snd_readl(codec->codec_base_addr + reg);
88     snd_io_debug("old: 0X%x\n", old);
89     new = (old & ~mask) | (value & mask);
90     snd_io_debug("new: 0X%x\n", new);
91     change = old != new;
92     if (change) {
93         if (codec->write)
94             ret = codec->write(codec, reg, new);
95         else
96             ret = snd_writel(new, codec->codec_base_addr + reg);
97     }
98 
99         /*hal_spin_unlock_irqrestore(__cpsr);*/
100     snd_io_debug("reg=0x%x, mask=0x%x, val=0x%x, change=%u\n", reg, mask, value, change);
101 
102     return ret;
103 }
104 
snd_platform_read(struct snd_platform * platform,unsigned int reg)105 unsigned int snd_platform_read(struct snd_platform *platform, unsigned int reg)
106 {
107     unsigned int val = 0;
108 //        uint32_t __cpsr;
109         /*__cpsr = hal_spin_lock_irqsave();*/
110 
111     val = snd_readl(platform->mem_base + reg);
112 
113         /*hal_spin_unlock_irqrestore(__cpsr);*/
114     snd_io_debug("reg=0x%x, val=0x%x\n", reg, val);
115 
116     return val;
117 }
118 
snd_platform_write(struct snd_platform * platform,unsigned int reg,unsigned int val)119 int snd_platform_write(struct snd_platform *platform, unsigned int reg, unsigned int val)
120 {
121     int ret = 0;
122 //        uint32_t __cpsr;
123         /*__cpsr = hal_spin_lock_irqsave();*/
124 
125     ret = snd_writel(val, platform->mem_base + reg);
126 
127         /*hal_spin_unlock_irqrestore(__cpsr);*/
128     snd_io_debug("reg=0x%x, val=0x%x\n", reg, val);
129 
130     return ret;
131 }
132 
snd_platform_update_bits(struct snd_platform * platform,unsigned int reg,unsigned int mask,unsigned int value)133 int snd_platform_update_bits(struct snd_platform *platform, unsigned int reg,
134                 unsigned int mask, unsigned int value)
135 {
136     int ret = 0;
137     unsigned int old, new;
138     bool change;
139 //        uint32_t __cpsr;
140         /*__cpsr = hal_spin_lock_irqsave();*/
141 
142     old = snd_readl(platform->mem_base + reg);
143     snd_io_debug("old: 0X%x\n", old);
144     new = (old & ~mask) | (value & mask);
145     snd_io_debug("new: 0X%x\n", new);
146     change = old != new;
147     if (change)
148         ret = snd_writel(new, platform->mem_base + reg);
149 
150         /*hal_spin_unlock_irqrestore(__cpsr);*/
151     snd_io_debug("reg=0x%x, mask=0x%x, val=0x%x, change=%u\n", reg, mask, value, change);
152 
153     return ret;
154 }
155