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