diff options
Diffstat (limited to 'drivers/media/cec')
| -rw-r--r-- | drivers/media/cec/cec-adap.c | 18 | ||||
| -rw-r--r-- | drivers/media/cec/cec-api.c | 8 | 
2 files changed, 25 insertions, 1 deletions
| diff --git a/drivers/media/cec/cec-adap.c b/drivers/media/cec/cec-adap.c index b7fad0ec5710..030b2602faf0 100644 --- a/drivers/media/cec/cec-adap.c +++ b/drivers/media/cec/cec-adap.c @@ -74,7 +74,7 @@ void cec_queue_event_fh(struct cec_fh *fh,  			const struct cec_event *new_ev, u64 ts)  {  	static const u16 max_events[CEC_NUM_EVENTS] = { -		1, 1, 800, 800, 8, 8, +		1, 1, 800, 800, 8, 8, 8, 8  	};  	struct cec_event_entry *entry;  	unsigned int ev_idx = new_ev->event - 1; @@ -176,6 +176,22 @@ void cec_queue_pin_hpd_event(struct cec_adapter *adap, bool is_high, ktime_t ts)  }  EXPORT_SYMBOL_GPL(cec_queue_pin_hpd_event); +/* Notify userspace that the 5V pin changed state at the given time. */ +void cec_queue_pin_5v_event(struct cec_adapter *adap, bool is_high, ktime_t ts) +{ +	struct cec_event ev = { +		.event = is_high ? CEC_EVENT_PIN_5V_HIGH : +				   CEC_EVENT_PIN_5V_LOW, +	}; +	struct cec_fh *fh; + +	mutex_lock(&adap->devnode.lock); +	list_for_each_entry(fh, &adap->devnode.fhs, list) +		cec_queue_event_fh(fh, &ev, ktime_to_ns(ts)); +	mutex_unlock(&adap->devnode.lock); +} +EXPORT_SYMBOL_GPL(cec_queue_pin_5v_event); +  /*   * Queue a new message for this filehandle.   * diff --git a/drivers/media/cec/cec-api.c b/drivers/media/cec/cec-api.c index 10b67fc40318..b6536bbad530 100644 --- a/drivers/media/cec/cec-api.c +++ b/drivers/media/cec/cec-api.c @@ -579,6 +579,14 @@ static int cec_open(struct inode *inode, struct file *filp)  			cec_queue_event_fh(fh, &ev, 0);  		}  	} +	if (adap->pin && adap->pin->ops->read_5v) { +		err = adap->pin->ops->read_5v(adap); +		if (err >= 0) { +			ev.event = err ? CEC_EVENT_PIN_5V_HIGH : +					 CEC_EVENT_PIN_5V_LOW; +			cec_queue_event_fh(fh, &ev, 0); +		} +	}  #endif  	list_add(&fh->list, &devnode->fhs); |