@@ -334,6 +334,7 @@ static int hdmi_cec_open(struct inode *inode, struct file *file)
334
334
}
335
335
hdmi_cec_data .open_count = 1 ;
336
336
file -> private_data = (void * )(& hdmi_cec_data );
337
+ hdmi_cec_data .tx_answer = CEC_TX_AVAIL ;
337
338
hdmi_cec_data .logical_address = 15 ;
338
339
hdmi_cec_data .is_started = false;
339
340
mutex_unlock (& hdmi_cec_data .lock );
@@ -399,7 +400,9 @@ static ssize_t hdmi_cec_write(struct file *file, const char __user *buf,
399
400
if (!hdmi_cec_data .is_started )
400
401
ret = - EACCES ;
401
402
else if (hdmi_cec_data .tx_answer != CEC_TX_AVAIL )
402
- ret = - EBUSY ;
403
+ ret = - EAGAIN ;
404
+ else if (hdmi_cec_data .link_status != 1 )
405
+ ret = - EAGAIN ;
403
406
else if (count > MAX_MESSAGE_LEN )
404
407
ret = - EINVAL ;
405
408
else if (copy_from_user (msg , buf , count ))
@@ -426,18 +429,15 @@ static ssize_t hdmi_cec_write(struct file *file, const char __user *buf,
426
429
ret = wait_event_interruptible_timeout (
427
430
tx_queue , hdmi_cec_data .tx_answer != CEC_TX_INPROGRESS , HZ );
428
431
429
- if (ret < 0 ) {
432
+ if (ret < 0 )
430
433
ret = - ERESTARTSYS ;
431
- goto tx_out ;
432
- }
433
-
434
- if (hdmi_cec_data .tx_answer & HDMI_IH_CEC_STAT0_DONE )
435
- /* msg correctly sent */
436
- ret = msg_len ;
434
+ else if (hdmi_cec_data .tx_answer & HDMI_IH_CEC_STAT0_DONE )
435
+ ret = msg_len ; /* msg sent, ACK received */
436
+ else if (hdmi_cec_data .tx_answer & HDMI_IH_CEC_STAT0_NACK )
437
+ ret = - EIO ; /* msg sent, NACK received */
437
438
else
438
- ret = - EIO ;
439
+ ret = - EPIPE ; /* other error */
439
440
440
- tx_out :
441
441
hdmi_cec_data .tx_answer = CEC_TX_AVAIL ;
442
442
return ret ;
443
443
}
@@ -580,6 +580,7 @@ static int hdmi_cec_release(struct inode *inode, struct file *file)
580
580
hdmi_cec_data .open_count = 0 ;
581
581
hdmi_cec_data .is_started = false;
582
582
hdmi_cec_data .logical_address = 15 ;
583
+ hdmi_cec_data .tx_answer = CEC_TX_AVAIL ;
583
584
584
585
free_events ();
585
586
}
@@ -595,13 +596,17 @@ static unsigned int hdmi_cec_poll(struct file *file, poll_table *wait)
595
596
pr_debug ("function : %s\n" , __func__ );
596
597
597
598
poll_wait (file , & rx_queue , wait );
599
+ poll_wait (file , & tx_queue , wait );
600
+
601
+ if (hdmi_cec_data .link_status == 1 &&
602
+ hdmi_cec_data .tx_answer == CEC_TX_AVAIL )
603
+ mask |= POLLOUT | POLLWRNORM ;
598
604
599
605
mutex_lock (& hdmi_cec_data .lock );
600
- if (hdmi_cec_data .tx_answer == CEC_TX_AVAIL )
601
- mask = (POLLOUT | POLLWRNORM );
602
606
if (!list_empty (& ev_pending ))
603
- mask |= ( POLLIN | POLLRDNORM ) ;
607
+ mask |= POLLIN | POLLRDNORM ;
604
608
mutex_unlock (& hdmi_cec_data .lock );
609
+
605
610
return mask ;
606
611
}
607
612
0 commit comments