From 28e11b15b6606c3308f87f7c9c4c9e404eddde6d Mon Sep 17 00:00:00 2001 From: Hans Verkuil Date: Sun, 20 Aug 2017 06:53:10 -0400 Subject: [PATCH] media: cec: replace pin->cur_value by adap->cec_pin_is_high The current CEC pin value (0 or 1) was part of the cec_pin struct, but that assumes that CEC pin monitoring can only be used with a driver that uses the low-level CEC pin framework. But hardware that has both a high-level API and can monitor the CEC pin at low-level at the same time does not need to depend on the cec pin framework. To support such devices remove the cur_value field from struct cec_pin and add a cec_pin_is_high field to cec_adapter. This also makes it possible to drop the '#ifdef CONFIG_CEC_PIN' in cec-api.c. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab --- drivers/media/cec/cec-api.c | 6 ++---- drivers/media/cec/cec-core.c | 1 + drivers/media/cec/cec-pin.c | 5 ++--- include/media/cec-pin.h | 1 - include/media/cec.h | 1 + 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/drivers/media/cec/cec-api.c b/drivers/media/cec/cec-api.c index 87649b0c6381..a079f7fe018c 100644 --- a/drivers/media/cec/cec-api.c +++ b/drivers/media/cec/cec-api.c @@ -444,15 +444,13 @@ static long cec_s_mode(struct cec_adapter *adap, struct cec_fh *fh, if (mode_follower == CEC_MODE_FOLLOWER) adap->follower_cnt++; if (mode_follower == CEC_MODE_MONITOR_PIN) { -#ifdef CONFIG_CEC_PIN struct cec_event ev = { .flags = CEC_EVENT_FL_INITIAL_STATE, }; - ev.event = adap->pin->cur_value ? CEC_EVENT_PIN_CEC_HIGH : - CEC_EVENT_PIN_CEC_LOW; + ev.event = adap->cec_pin_is_high ? CEC_EVENT_PIN_CEC_HIGH : + CEC_EVENT_PIN_CEC_LOW; cec_queue_event_fh(fh, &ev, 0); -#endif adap->monitor_pin_cnt++; } if (mode_follower == CEC_MODE_EXCL_FOLLOWER || diff --git a/drivers/media/cec/cec-core.c b/drivers/media/cec/cec-core.c index e9db90997b0a..648136e552d5 100644 --- a/drivers/media/cec/cec-core.c +++ b/drivers/media/cec/cec-core.c @@ -227,6 +227,7 @@ struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops, return ERR_PTR(-ENOMEM); strlcpy(adap->name, name, sizeof(adap->name)); adap->phys_addr = CEC_PHYS_ADDR_INVALID; + adap->cec_pin_is_high = true; adap->log_addrs.cec_version = CEC_OP_CEC_VERSION_2_0; adap->log_addrs.vendor_id = CEC_VENDOR_ID_NONE; adap->capabilities = caps; diff --git a/drivers/media/cec/cec-pin.c b/drivers/media/cec/cec-pin.c index 970774de3dcd..c003b8eac617 100644 --- a/drivers/media/cec/cec-pin.c +++ b/drivers/media/cec/cec-pin.c @@ -88,10 +88,10 @@ static const struct cec_state states[CEC_PIN_STATES] = { static void cec_pin_update(struct cec_pin *pin, bool v, bool force) { - if (!force && v == pin->cur_value) + if (!force && v == pin->adap->cec_pin_is_high) return; - pin->cur_value = v; + pin->adap->cec_pin_is_high = v; if (atomic_read(&pin->work_pin_events) < CEC_NUM_PIN_EVENTS) { pin->work_pin_is_high[pin->work_pin_events_wr] = v; pin->work_pin_ts[pin->work_pin_events_wr] = ktime_get(); @@ -781,7 +781,6 @@ struct cec_adapter *cec_pin_allocate_adapter(const struct cec_pin_ops *pin_ops, if (pin == NULL) return ERR_PTR(-ENOMEM); pin->ops = pin_ops; - pin->cur_value = true; hrtimer_init(&pin->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); pin->timer.function = cec_pin_timer; init_waitqueue_head(&pin->kthread_waitq); diff --git a/include/media/cec-pin.h b/include/media/cec-pin.h index d28d07fa312e..f09cc9579d53 100644 --- a/include/media/cec-pin.h +++ b/include/media/cec-pin.h @@ -128,7 +128,6 @@ struct cec_pin { u16 la_mask; bool enabled; bool monitor_all; - bool cur_value; bool rx_eom; bool enable_irq_failed; enum cec_pin_state state; diff --git a/include/media/cec.h b/include/media/cec.h index 60b26fc18464..df6b3bd31284 100644 --- a/include/media/cec.h +++ b/include/media/cec.h @@ -180,6 +180,7 @@ struct cec_adapter { bool needs_hpd; bool is_configuring; bool is_configured; + bool cec_pin_is_high; u32 monitor_all_cnt; u32 monitor_pin_cnt; u32 follower_cnt;