summaryrefslogtreecommitdiffstats
path: root/drivers/media/cec
diff options
context:
space:
mode:
authorSean Young <sean@mess.org>2017-11-23 23:37:10 +0100
committerMauro Carvalho Chehab <mchehab@s-opensource.com>2017-12-14 16:35:30 +0100
commit57c642cb45d6f7d0d950c3bc67439989062ac743 (patch)
treea8bb6ccd399309d7c359917291cc58f01cbffb7f /drivers/media/cec
parentmedia: imon: auto-config ffdc 30 device (diff)
downloadlinux-57c642cb45d6f7d0d950c3bc67439989062ac743.tar.xz
linux-57c642cb45d6f7d0d950c3bc67439989062ac743.zip
media: cec: move cec autorepeat handling to rc-core
CEC autorepeat is different than other protocols. Autorepeat is triggered by the first repeated user control pressed CEC message, rather than a fixed REP_DELAY. This change also does away with the KEY_UP event directly after the first KEY_DOWN event, which was used to stop autorepeat from starting. See commit a9a249a2c997 ("media: cec: fix remote control passthrough") for the original change. Acked-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Sean Young <sean@mess.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Diffstat (limited to 'drivers/media/cec')
-rw-r--r--drivers/media/cec/cec-adap.c56
-rw-r--r--drivers/media/cec/cec-core.c12
2 files changed, 5 insertions, 63 deletions
diff --git a/drivers/media/cec/cec-adap.c b/drivers/media/cec/cec-adap.c
index 2a097e016414..2b1e540587d6 100644
--- a/drivers/media/cec/cec-adap.c
+++ b/drivers/media/cec/cec-adap.c
@@ -1788,9 +1788,6 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
int la_idx = cec_log_addr2idx(adap, dest_laddr);
bool from_unregistered = init_laddr == 0xf;
struct cec_msg tx_cec_msg = { };
-#ifdef CONFIG_MEDIA_CEC_RC
- int scancode;
-#endif
dprintk(2, "%s: %*ph\n", __func__, msg->len, msg->msg);
@@ -1886,9 +1883,11 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
*/
case 0x60:
if (msg->len == 2)
- scancode = msg->msg[2];
+ rc_keydown(adap->rc, RC_PROTO_CEC,
+ msg->msg[2], 0);
else
- scancode = msg->msg[2] << 8 | msg->msg[3];
+ rc_keydown(adap->rc, RC_PROTO_CEC,
+ msg->msg[2] << 8 | msg->msg[3], 0);
break;
/*
* Other function messages that are not handled.
@@ -1901,54 +1900,11 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
*/
case 0x56: case 0x57:
case 0x67: case 0x68: case 0x69: case 0x6a:
- scancode = -1;
break;
default:
- scancode = msg->msg[2];
- break;
- }
-
- /* Was repeating, but keypress timed out */
- if (adap->rc_repeating && !adap->rc->keypressed) {
- adap->rc_repeating = false;
- adap->rc_last_scancode = -1;
- }
- /* Different keypress from last time, ends repeat mode */
- if (adap->rc_last_scancode != scancode) {
- rc_keyup(adap->rc);
- adap->rc_repeating = false;
- }
- /* We can't handle this scancode */
- if (scancode < 0) {
- adap->rc_last_scancode = scancode;
- break;
- }
-
- /* Send key press */
- rc_keydown(adap->rc, RC_PROTO_CEC, scancode, 0);
-
- /* When in repeating mode, we're done */
- if (adap->rc_repeating)
- break;
-
- /*
- * We are not repeating, but the new scancode is
- * the same as the last one, and this second key press is
- * within 550 ms (the 'Follower Safety Timeout') from the
- * previous key press, so we now enable the repeating mode.
- */
- if (adap->rc_last_scancode == scancode &&
- msg->rx_ts - adap->rc_last_keypress < 550 * NSEC_PER_MSEC) {
- adap->rc_repeating = true;
+ rc_keydown(adap->rc, RC_PROTO_CEC, msg->msg[2], 0);
break;
}
- /*
- * Not in repeating mode, so avoid triggering repeat mode
- * by calling keyup.
- */
- rc_keyup(adap->rc);
- adap->rc_last_scancode = scancode;
- adap->rc_last_keypress = msg->rx_ts;
#endif
break;
@@ -1958,8 +1914,6 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
break;
#ifdef CONFIG_MEDIA_CEC_RC
rc_keyup(adap->rc);
- adap->rc_repeating = false;
- adap->rc_last_scancode = -1;
#endif
break;
diff --git a/drivers/media/cec/cec-core.c b/drivers/media/cec/cec-core.c
index b5845b47fe6c..a9f9525db9ae 100644
--- a/drivers/media/cec/cec-core.c
+++ b/drivers/media/cec/cec-core.c
@@ -286,7 +286,6 @@ struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
adap->rc->priv = adap;
adap->rc->map_name = RC_MAP_CEC;
adap->rc->timeout = MS_TO_NS(100);
- adap->rc_last_scancode = -1;
#endif
return adap;
}
@@ -318,17 +317,6 @@ int cec_register_adapter(struct cec_adapter *adap,
adap->rc = NULL;
return res;
}
- /*
- * The REP_DELAY for CEC is really the time between the initial
- * 'User Control Pressed' message and the second. The first
- * keypress is always seen as non-repeating, the second
- * (provided it has the same UI Command) will start the 'Press
- * and Hold' (aka repeat) behavior. By setting REP_DELAY to the
- * same value as REP_PERIOD the expected CEC behavior is
- * reproduced.
- */
- adap->rc->input_dev->rep[REP_DELAY] =
- adap->rc->input_dev->rep[REP_PERIOD];
}
#endif