pr_debug("snd_intelhad_open called\n");
intelhaddata = snd_pcm_substream_chip(substream);
had_stream = intelhaddata->private_data;
- if (had_stream->process_trigger != NO_TRIGGER) {
- pr_err("%s:Yet to process some trigger\n", __func__);
- return -ENODEV;
- }
if (had_get_hwstate(intelhaddata)) {
pr_err("%s: HDMI cable plugged-out\n", __func__);
return -ENODEV;
}
-
+ if (had_stream->process_trigger != NO_TRIGGER) {
+ pr_err("%s:Yet to process some trigger\n", __func__);
+ return -EAGAIN;
+ }
runtime = substream->runtime;
/* Check, if device already in use */
/* Disable local INTRs till register prgmng is done */
if (had_get_hwstate(intelhaddata)) {
pr_err("_START: HDMI cable plugged-out\n");
+ snd_pcm_stop(substream, SNDRV_PCM_STATE_DISCONNECTED);
retval = -ENODEV;
break;
}
had_stream->process_trigger = STOP_TRIGGER;
/* Send zero filled data */
if (had_stream->stream_status == HAD_RUNNING_DUMMY) {
+ had_stream->stream_status = HAD_INIT;
+ had_stream->process_trigger = NO_TRIGGER;
spin_unlock_irqrestore(&intelhaddata->had_spinlock,
flag_irq);
cancel_delayed_work(&intelhaddata->dummy_audio);
runtime = substream->runtime;
had_stream = intelhaddata->private_data;
+ if (had_get_hwstate(intelhaddata)) {
+ pr_err("%s: HDMI cable plugged-out\n", __func__);
+ snd_pcm_stop(substream, SNDRV_PCM_STATE_DISCONNECTED);
+ retval = -ENODEV;
+ goto prep_end;
+ }
+
spin_lock_irqsave(&intelhaddata->had_spinlock, flag_irqs);
if (had_stream->process_trigger != NO_TRIGGER) {
spin_unlock_irqrestore(&intelhaddata->had_spinlock, flag_irqs);
pr_err("%s:Yet to process some trigger\n", __func__);
- return -EBUSY;
+ return -EAGAIN;
}
spin_unlock_irqrestore(&intelhaddata->had_spinlock, flag_irqs);
if (retval)
goto prep_end;
- if (had_get_hwstate(intelhaddata)) {
- pr_err("%s: HDMI cable plugged-out\n", __func__);
- retval = -ENODEV;
- goto prep_end;
- }
/* Get N value in KHz */
retval = had_get_caps(HAD_GET_SAMPLING_FREQ, &disp_samp_freq);
schedule_delayed_work(
&intelhaddata->dummy_audio,
intelhaddata->timer);
- }
+ } else
+ spin_unlock_irqrestore(&intelhaddata->had_spinlock, flag_irqs);
return retval;
}
struct had_pvt_data *had_stream;
enum intel_had_aud_buf_type buf_id;
u32 buf_addr;
- unsigned long flag_irqs;
had_stream = intelhaddata->private_data;
/* If device disconnected, ignore this interrupt */
if (had_stream->stream_status == HAD_RUNNING_DUMMY) {
had_stream->stream_status = HAD_INIT;
+ had_stream->process_trigger = NO_TRIGGER;
return retval;
}
intelhaddata->curr_buf = HAD_BUF_TYPE_D;
else
intelhaddata->curr_buf = HAD_BUF_TYPE_C;
- spin_unlock_irqrestore(&intelhaddata->had_spinlock, flag_irqs);
/* _STOP -> _START -> _STOP occured
* invalidate Buff_A, Buff_B
pr_debug("buf[%d] addr=%#x and size=%d\n", i,
intelhaddata->buf_info[i].buf_addr,
intelhaddata->buf_info[i].buf_size);
- spin_lock_irqsave(&intelhaddata->had_spinlock, flag_irqs);
return retval;
}
buf_size = intelhaddata->buf_info[buf_id].buf_size;
stream_status = had_stream->stream_status;
process_trigger = had_stream->process_trigger;
- spin_unlock_irqrestore(&intelhaddata->had_spinlock, flag_irqs);
pr_debug("Enter:%s buf_id=%d", __func__, buf_id);
*/
/* Check for any intr_miss in case of active playback */
- if ((stream_status == HAD_RUNNING_STREAM) &&
- (process_trigger == NO_TRIGGER) &&
+ if ((had_stream->stream_status == HAD_RUNNING_STREAM) &&
+ (had_stream->process_trigger == NO_TRIGGER) &&
!flag_en_allbufs) {
+ spin_unlock_irqrestore(&intelhaddata->had_spinlock, flag_irqs);
intr_count = had_chk_intrmiss(intelhaddata, buf_id);
if (!intr_count || (intr_count > 3)) {
pr_err("HAD SW state in non-recoverable!!! mode\n");
}
buf_id += (intr_count - 1);
buf_id = buf_id % 4;
+ spin_lock_irqsave(&intelhaddata->had_spinlock, flag_irqs);
}
- spin_lock_irqsave(&intelhaddata->had_spinlock, flag_irqs);
/* Acknowledge _START trigger recieved */
if (had_stream->process_trigger == PRE_START) {
spin_unlock_irqrestore(&intelhaddata->had_spinlock, flag_irqs);
return retval;
}
+ /* Safety check */
+ if (!substream) {
+ pr_err("PANIC!!! Should never come here\n");
+ return retval;
+ }
+
if (stream_status == HAD_RUNNING_DUMMY) {
spin_lock_irqsave(&intelhaddata->had_spinlock, flag_irqs);
had_stream->stream_status = HAD_RUNNING_STREAM;