aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/intel/common/sst-dsp.c28
-rw-r--r--sound/soc/intel/common/sst-dsp.h4
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}
198EXPORT_SYMBOL_GPL(sst_dsp_shim_update_bits64_unlocked); 198EXPORT_SYMBOL_GPL(sst_dsp_shim_update_bits64_unlocked);
199 199
200/* This is for registers bits with attribute RWC */
201void 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}
214EXPORT_SYMBOL_GPL(sst_dsp_shim_update_bits_forced_unlocked);
215
200int sst_dsp_shim_update_bits(struct sst_dsp *sst, u32 offset, 216int 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}
224EXPORT_SYMBOL_GPL(sst_dsp_shim_update_bits64); 240EXPORT_SYMBOL_GPL(sst_dsp_shim_update_bits64);
225 241
242/* This is for registers bits with attribute RWC */
243void 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}
252EXPORT_SYMBOL_GPL(sst_dsp_shim_update_bits_forced);
253
226int sst_dsp_register_poll(struct sst_dsp *ctx, u32 offset, u32 mask, 254int 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);
230u64 sst_dsp_shim_read64(struct sst_dsp *sst, u32 offset); 230u64 sst_dsp_shim_read64(struct sst_dsp *sst, u32 offset);
231int sst_dsp_shim_update_bits64(struct sst_dsp *sst, u32 offset, 231int sst_dsp_shim_update_bits64(struct sst_dsp *sst, u32 offset,
232 u64 mask, u64 value); 232 u64 mask, u64 value);
233void 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 */
235void sst_dsp_shim_write_unlocked(struct sst_dsp *sst, u32 offset, u32 value); 237void 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);
240u64 sst_dsp_shim_read64_unlocked(struct sst_dsp *sst, u32 offset); 242u64 sst_dsp_shim_read64_unlocked(struct sst_dsp *sst, u32 offset);
241int sst_dsp_shim_update_bits64_unlocked(struct sst_dsp *sst, u32 offset, 243int sst_dsp_shim_update_bits64_unlocked(struct sst_dsp *sst, u32 offset,
242 u64 mask, u64 value); 244 u64 mask, u64 value);
245void 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 */
245void sst_shim32_write(void __iomem *addr, u32 offset, u32 value); 249void sst_shim32_write(void __iomem *addr, u32 offset, u32 value);