struct completion fifo_completion;
struct scatterlist sg;
- unsigned errors;
+ struct tegra_audio_error_counts errors;
int i2s_fifo_atn_level;
if (kfifo_is_empty(&aos->fifo)) {
sound_ops->stop_playback(aos);
if (aos->active)
- aos->errors++;
+ aos->errors.full_empty++; /* underflow */
spin_unlock_irqrestore(&aos->dma_req_lock, flags);
pm_qos_update_request(aos->pm_qos, PM_QOS_DEFAULT_VALUE);
return true;
if (ads->recording_cancelled || kfifo_is_full(&ais->fifo)) {
if (kfifo_is_full(&ais->fifo))
- ais->errors++;
+ ais->errors.full_empty++; /* overflow */
sound_ops->stop_recording(ais);
return true;
}
if (delta_us > max_delay_us) {
pr_debug("%s: too late by %lld us\n", __func__,
delta_us - max_delay_us);
- aos->errors++;
+ aos->errors.late_dma++;
}
kfifo_dma_out_finish(&aos->fifo, count);
if (status & I2S_I2S_FIFO_RX_ERR) {
ads->pio_stats.rx_fifo_errors++;
- ads->in.errors++;
+ ads->in.errors.full_empty++;
}
if (status & I2S_FIFO_ERR)
sizeof(aos->errors)))
rc = -EFAULT;
if (!rc)
- aos->errors = 0;
+ memset(&aos->errors, 0, sizeof(aos->errors));
break;
case TEGRA_AUDIO_OUT_PRELOAD_FIFO: {
struct tegra_audio_out_preload preload;
sizeof(ais->errors)))
rc = -EFAULT;
if (!rc)
- ais->errors = 0;
+ memset(&ais->errors, 0, sizeof(ais->errors));
break;
default:
rc = -EINVAL;
mutex_lock(&ads->out.lock);
if (!ads->out.opened++) {
pr_info("%s: resetting fifo and error count\n", __func__);
- ads->out.errors = 0;
+ memset(&ads->out.errors, 0, sizeof(ads->out.errors));
kfifo_reset(&ads->out.fifo);
}
mutex_unlock(&ads->out.lock);
* input device.
*/
ads->recording_cancelled = false;
- ads->in.errors = 0;
+ memset(&ads->in.errors, 0, sizeof(ads->in.errors));
kfifo_reset(&ads->in.fifo);
}
mutex_unlock(&ads->in.lock);
#define TEGRA_AUDIO_OUT_GET_BUF_CONFIG _IOR(TEGRA_AUDIO_MAGIC, 7, \
struct tegra_audio_buf_config *)
+struct tegra_audio_error_counts {
+ unsigned late_dma;
+ unsigned full_empty; /* empty for playback, full for recording */
+};
+
#define TEGRA_AUDIO_IN_GET_ERROR_COUNT _IOR(TEGRA_AUDIO_MAGIC, 8, \
- unsigned *)
+ struct tegra_audio_error_counts *)
#define TEGRA_AUDIO_OUT_GET_ERROR_COUNT _IOR(TEGRA_AUDIO_MAGIC, 9, \
- unsigned *)
+ struct tegra_audio_error_counts *)
struct tegra_audio_out_preload {
void *data;