|
@@ -354,6 +354,7 @@ static long cec_s_mode(struct cec_adapter *adap, struct cec_fh *fh,
|
|
|
u32 mode;
|
|
|
u8 mode_initiator;
|
|
|
u8 mode_follower;
|
|
|
+ bool send_pin_event = false;
|
|
|
long err = 0;
|
|
|
|
|
|
if (copy_from_user(&mode, parg, sizeof(mode)))
|
|
@@ -433,6 +434,19 @@ static long cec_s_mode(struct cec_adapter *adap, struct cec_fh *fh,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (!err) {
|
|
|
+ bool old_mon_pin = fh->mode_follower == CEC_MODE_MONITOR_PIN;
|
|
|
+ bool new_mon_pin = mode_follower == CEC_MODE_MONITOR_PIN;
|
|
|
+
|
|
|
+ if (old_mon_pin != new_mon_pin) {
|
|
|
+ send_pin_event = new_mon_pin;
|
|
|
+ if (new_mon_pin)
|
|
|
+ err = cec_monitor_pin_cnt_inc(adap);
|
|
|
+ else
|
|
|
+ cec_monitor_pin_cnt_dec(adap);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (err) {
|
|
|
mutex_unlock(&adap->lock);
|
|
|
return err;
|
|
@@ -440,11 +454,9 @@ static long cec_s_mode(struct cec_adapter *adap, struct cec_fh *fh,
|
|
|
|
|
|
if (fh->mode_follower == CEC_MODE_FOLLOWER)
|
|
|
adap->follower_cnt--;
|
|
|
- if (fh->mode_follower == CEC_MODE_MONITOR_PIN)
|
|
|
- adap->monitor_pin_cnt--;
|
|
|
if (mode_follower == CEC_MODE_FOLLOWER)
|
|
|
adap->follower_cnt++;
|
|
|
- if (mode_follower == CEC_MODE_MONITOR_PIN) {
|
|
|
+ if (send_pin_event) {
|
|
|
struct cec_event ev = {
|
|
|
.flags = CEC_EVENT_FL_INITIAL_STATE,
|
|
|
};
|
|
@@ -452,7 +464,6 @@ static long cec_s_mode(struct cec_adapter *adap, struct cec_fh *fh,
|
|
|
ev.event = adap->cec_pin_is_high ? CEC_EVENT_PIN_CEC_HIGH :
|
|
|
CEC_EVENT_PIN_CEC_LOW;
|
|
|
cec_queue_event_fh(fh, &ev, 0);
|
|
|
- adap->monitor_pin_cnt++;
|
|
|
}
|
|
|
if (mode_follower == CEC_MODE_EXCL_FOLLOWER ||
|
|
|
mode_follower == CEC_MODE_EXCL_FOLLOWER_PASSTHRU) {
|
|
@@ -608,7 +619,7 @@ static int cec_release(struct inode *inode, struct file *filp)
|
|
|
if (fh->mode_follower == CEC_MODE_FOLLOWER)
|
|
|
adap->follower_cnt--;
|
|
|
if (fh->mode_follower == CEC_MODE_MONITOR_PIN)
|
|
|
- adap->monitor_pin_cnt--;
|
|
|
+ cec_monitor_pin_cnt_dec(adap);
|
|
|
if (fh->mode_follower == CEC_MODE_MONITOR_ALL)
|
|
|
cec_monitor_all_cnt_dec(adap);
|
|
|
mutex_unlock(&adap->lock);
|