dma: hda: enable xrun handling
Enable link under/overruns handling and reporting such events in dma status Signed-off-by: Piotr Makaruk <piotr.makaruk@intel.com>
This commit is contained in:
parent
122c7be703
commit
00b5114344
2 changed files with 44 additions and 0 deletions
|
@ -190,6 +190,7 @@ int intel_adsp_hda_dma_status(const struct device *dev, uint32_t channel,
|
|||
struct dma_status *stat)
|
||||
{
|
||||
const struct intel_adsp_hda_dma_cfg *const cfg = dev->config;
|
||||
bool xrun_det;
|
||||
|
||||
__ASSERT(channel < cfg->dma_channels, "Channel does not exist");
|
||||
|
||||
|
@ -203,6 +204,25 @@ int intel_adsp_hda_dma_status(const struct device *dev, uint32_t channel,
|
|||
stat->pending_length = used;
|
||||
stat->free = unused;
|
||||
|
||||
switch (cfg->direction) {
|
||||
case MEMORY_TO_PERIPHERAL:
|
||||
xrun_det = intel_adsp_hda_is_buffer_underrun(cfg->base, cfg->regblock_size,
|
||||
channel);
|
||||
if (xrun_det) {
|
||||
intel_adsp_hda_underrun_clear(cfg->base, cfg->regblock_size, channel);
|
||||
return -EPIPE;
|
||||
}
|
||||
case PERIPHERAL_TO_MEMORY:
|
||||
xrun_det = intel_adsp_hda_is_buffer_overrun(cfg->base, cfg->regblock_size,
|
||||
channel);
|
||||
if (xrun_det) {
|
||||
intel_adsp_hda_overrun_clear(cfg->base, cfg->regblock_size, channel);
|
||||
return -EPIPE;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue