mirror of https://gitee.com/openkylin/linux.git
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 <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
This commit is contained in:
parent
152b0a9a3d
commit
28e11b15b6
|
@ -444,15 +444,13 @@ static long cec_s_mode(struct cec_adapter *adap, struct cec_fh *fh,
|
||||||
if (mode_follower == CEC_MODE_FOLLOWER)
|
if (mode_follower == CEC_MODE_FOLLOWER)
|
||||||
adap->follower_cnt++;
|
adap->follower_cnt++;
|
||||||
if (mode_follower == CEC_MODE_MONITOR_PIN) {
|
if (mode_follower == CEC_MODE_MONITOR_PIN) {
|
||||||
#ifdef CONFIG_CEC_PIN
|
|
||||||
struct cec_event ev = {
|
struct cec_event ev = {
|
||||||
.flags = CEC_EVENT_FL_INITIAL_STATE,
|
.flags = CEC_EVENT_FL_INITIAL_STATE,
|
||||||
};
|
};
|
||||||
|
|
||||||
ev.event = adap->pin->cur_value ? CEC_EVENT_PIN_CEC_HIGH :
|
ev.event = adap->cec_pin_is_high ? CEC_EVENT_PIN_CEC_HIGH :
|
||||||
CEC_EVENT_PIN_CEC_LOW;
|
CEC_EVENT_PIN_CEC_LOW;
|
||||||
cec_queue_event_fh(fh, &ev, 0);
|
cec_queue_event_fh(fh, &ev, 0);
|
||||||
#endif
|
|
||||||
adap->monitor_pin_cnt++;
|
adap->monitor_pin_cnt++;
|
||||||
}
|
}
|
||||||
if (mode_follower == CEC_MODE_EXCL_FOLLOWER ||
|
if (mode_follower == CEC_MODE_EXCL_FOLLOWER ||
|
||||||
|
|
|
@ -227,6 +227,7 @@ struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
strlcpy(adap->name, name, sizeof(adap->name));
|
strlcpy(adap->name, name, sizeof(adap->name));
|
||||||
adap->phys_addr = CEC_PHYS_ADDR_INVALID;
|
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.cec_version = CEC_OP_CEC_VERSION_2_0;
|
||||||
adap->log_addrs.vendor_id = CEC_VENDOR_ID_NONE;
|
adap->log_addrs.vendor_id = CEC_VENDOR_ID_NONE;
|
||||||
adap->capabilities = caps;
|
adap->capabilities = caps;
|
||||||
|
|
|
@ -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)
|
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;
|
return;
|
||||||
|
|
||||||
pin->cur_value = v;
|
pin->adap->cec_pin_is_high = v;
|
||||||
if (atomic_read(&pin->work_pin_events) < CEC_NUM_PIN_EVENTS) {
|
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_is_high[pin->work_pin_events_wr] = v;
|
||||||
pin->work_pin_ts[pin->work_pin_events_wr] = ktime_get();
|
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)
|
if (pin == NULL)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
pin->ops = pin_ops;
|
pin->ops = pin_ops;
|
||||||
pin->cur_value = true;
|
|
||||||
hrtimer_init(&pin->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
hrtimer_init(&pin->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||||
pin->timer.function = cec_pin_timer;
|
pin->timer.function = cec_pin_timer;
|
||||||
init_waitqueue_head(&pin->kthread_waitq);
|
init_waitqueue_head(&pin->kthread_waitq);
|
||||||
|
|
|
@ -128,7 +128,6 @@ struct cec_pin {
|
||||||
u16 la_mask;
|
u16 la_mask;
|
||||||
bool enabled;
|
bool enabled;
|
||||||
bool monitor_all;
|
bool monitor_all;
|
||||||
bool cur_value;
|
|
||||||
bool rx_eom;
|
bool rx_eom;
|
||||||
bool enable_irq_failed;
|
bool enable_irq_failed;
|
||||||
enum cec_pin_state state;
|
enum cec_pin_state state;
|
||||||
|
|
|
@ -180,6 +180,7 @@ struct cec_adapter {
|
||||||
bool needs_hpd;
|
bool needs_hpd;
|
||||||
bool is_configuring;
|
bool is_configuring;
|
||||||
bool is_configured;
|
bool is_configured;
|
||||||
|
bool cec_pin_is_high;
|
||||||
u32 monitor_all_cnt;
|
u32 monitor_all_cnt;
|
||||||
u32 monitor_pin_cnt;
|
u32 monitor_pin_cnt;
|
||||||
u32 follower_cnt;
|
u32 follower_cnt;
|
||||||
|
|
Loading…
Reference in New Issue