diff options
-rw-r--r-- | sound/soc/intel/common/sst-dsp.c | 28 | ||||
-rw-r--r-- | sound/soc/intel/common/sst-dsp.h | 4 |
2 files changed, 32 insertions, 0 deletions
diff --git a/sound/soc/intel/common/sst-dsp.c b/sound/soc/intel/common/sst-dsp.c index cc25f4c202af..a627236dd1f5 100644 --- a/sound/soc/intel/common/sst-dsp.c +++ b/sound/soc/intel/common/sst-dsp.c | |||
@@ -197,6 +197,22 @@ int sst_dsp_shim_update_bits64_unlocked(struct sst_dsp *sst, u32 offset, | |||
197 | } | 197 | } |
198 | EXPORT_SYMBOL_GPL(sst_dsp_shim_update_bits64_unlocked); | 198 | EXPORT_SYMBOL_GPL(sst_dsp_shim_update_bits64_unlocked); |
199 | 199 | ||
200 | /* This is for registers bits with attribute RWC */ | ||
201 | void sst_dsp_shim_update_bits_forced_unlocked(struct sst_dsp *sst, u32 offset, | ||
202 | u32 mask, u32 value) | ||
203 | { | ||
204 | unsigned int old, new; | ||
205 | u32 ret; | ||
206 | |||
207 | ret = sst_dsp_shim_read_unlocked(sst, offset); | ||
208 | |||
209 | old = ret; | ||
210 | new = (old & (~mask)) | (value & mask); | ||
211 | |||
212 | sst_dsp_shim_write_unlocked(sst, offset, new); | ||
213 | } | ||
214 | EXPORT_SYMBOL_GPL(sst_dsp_shim_update_bits_forced_unlocked); | ||
215 | |||
200 | int sst_dsp_shim_update_bits(struct sst_dsp *sst, u32 offset, | 216 | int sst_dsp_shim_update_bits(struct sst_dsp *sst, u32 offset, |
201 | u32 mask, u32 value) | 217 | u32 mask, u32 value) |
202 | { | 218 | { |
@@ -223,6 +239,18 @@ int sst_dsp_shim_update_bits64(struct sst_dsp *sst, u32 offset, | |||
223 | } | 239 | } |
224 | EXPORT_SYMBOL_GPL(sst_dsp_shim_update_bits64); | 240 | EXPORT_SYMBOL_GPL(sst_dsp_shim_update_bits64); |
225 | 241 | ||
242 | /* This is for registers bits with attribute RWC */ | ||
243 | void sst_dsp_shim_update_bits_forced(struct sst_dsp *sst, u32 offset, | ||
244 | u32 mask, u32 value) | ||
245 | { | ||
246 | unsigned long flags; | ||
247 | |||
248 | spin_lock_irqsave(&sst->spinlock, flags); | ||
249 | sst_dsp_shim_update_bits_forced_unlocked(sst, offset, mask, value); | ||
250 | spin_unlock_irqrestore(&sst->spinlock, flags); | ||
251 | } | ||
252 | EXPORT_SYMBOL_GPL(sst_dsp_shim_update_bits_forced); | ||
253 | |||
226 | int sst_dsp_register_poll(struct sst_dsp *ctx, u32 offset, u32 mask, | 254 | int sst_dsp_register_poll(struct sst_dsp *ctx, u32 offset, u32 mask, |
227 | u32 target, u32 timeout, char *operation) | 255 | u32 target, u32 timeout, char *operation) |
228 | { | 256 | { |
diff --git a/sound/soc/intel/common/sst-dsp.h b/sound/soc/intel/common/sst-dsp.h index cc3197be4cf7..1f45f18715c0 100644 --- a/sound/soc/intel/common/sst-dsp.h +++ b/sound/soc/intel/common/sst-dsp.h | |||
@@ -230,6 +230,8 @@ void sst_dsp_shim_write64(struct sst_dsp *sst, u32 offset, u64 value); | |||
230 | u64 sst_dsp_shim_read64(struct sst_dsp *sst, u32 offset); | 230 | u64 sst_dsp_shim_read64(struct sst_dsp *sst, u32 offset); |
231 | int sst_dsp_shim_update_bits64(struct sst_dsp *sst, u32 offset, | 231 | int sst_dsp_shim_update_bits64(struct sst_dsp *sst, u32 offset, |
232 | u64 mask, u64 value); | 232 | u64 mask, u64 value); |
233 | void sst_dsp_shim_update_bits_forced(struct sst_dsp *sst, u32 offset, | ||
234 | u32 mask, u32 value); | ||
233 | 235 | ||
234 | /* SHIM Read / Write Unlocked for callers already holding sst lock */ | 236 | /* SHIM Read / Write Unlocked for callers already holding sst lock */ |
235 | void sst_dsp_shim_write_unlocked(struct sst_dsp *sst, u32 offset, u32 value); | 237 | void sst_dsp_shim_write_unlocked(struct sst_dsp *sst, u32 offset, u32 value); |
@@ -240,6 +242,8 @@ void sst_dsp_shim_write64_unlocked(struct sst_dsp *sst, u32 offset, u64 value); | |||
240 | u64 sst_dsp_shim_read64_unlocked(struct sst_dsp *sst, u32 offset); | 242 | u64 sst_dsp_shim_read64_unlocked(struct sst_dsp *sst, u32 offset); |
241 | int sst_dsp_shim_update_bits64_unlocked(struct sst_dsp *sst, u32 offset, | 243 | int sst_dsp_shim_update_bits64_unlocked(struct sst_dsp *sst, u32 offset, |
242 | u64 mask, u64 value); | 244 | u64 mask, u64 value); |
245 | void sst_dsp_shim_update_bits_forced_unlocked(struct sst_dsp *sst, u32 offset, | ||
246 | u32 mask, u32 value); | ||
243 | 247 | ||
244 | /* Internal generic low-level SST IO functions - can be overidden */ | 248 | /* Internal generic low-level SST IO functions - can be overidden */ |
245 | void sst_shim32_write(void __iomem *addr, u32 offset, u32 value); | 249 | void sst_shim32_write(void __iomem *addr, u32 offset, u32 value); |