X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=drivers%2Ftty%2Fsysrq.c;h=40a9fe9d3b10f0170af31c4d8845d8cc609e6bb5;hb=f42bcf1aa84a4c4348d53ac3013eff2b642987e5;hp=d5cc3acecfd382d820b9eb5d5c3fbebf0f105b71;hpb=ee3e542fec6e69bc9fb668698889a37d93950ddf;p=firefly-linux-kernel-4.4.55.git diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c index d5cc3acecfd3..40a9fe9d3b10 100644 --- a/drivers/tty/sysrq.c +++ b/drivers/tty/sysrq.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -681,6 +682,40 @@ static void sysrq_detect_reset_sequence(struct sysrq_state *state, } } +#ifdef CONFIG_OF +static void sysrq_of_get_keyreset_config(void) +{ + u32 key; + struct device_node *np; + struct property *prop; + const __be32 *p; + + np = of_find_node_by_path("/chosen/linux,sysrq-reset-seq"); + if (!np) { + pr_debug("No sysrq node found"); + return; + } + + /* Reset in case a __weak definition was present */ + sysrq_reset_seq_len = 0; + + of_property_for_each_u32(np, "keyset", prop, p, key) { + if (key == KEY_RESERVED || key > KEY_MAX || + sysrq_reset_seq_len == SYSRQ_KEY_RESET_MAX) + break; + + sysrq_reset_seq[sysrq_reset_seq_len++] = (unsigned short)key; + } + + /* Get reset timeout if any. */ + of_property_read_u32(np, "timeout-ms", &sysrq_reset_downtime_ms); +} +#else +static void sysrq_of_get_keyreset_config(void) +{ +} +#endif + static void sysrq_reinject_alt_sysrq(struct work_struct *work) { struct sysrq_state *sysrq = @@ -914,6 +949,7 @@ static inline void sysrq_register_handler(void) int error; int i; + /* First check if a __weak interface was instantiated. */ for (i = 0; i < ARRAY_SIZE(sysrq_reset_seq); i++) { key = platform_sysrq_reset_seq[i]; if (key == KEY_RESERVED || key > KEY_MAX) @@ -922,6 +958,12 @@ static inline void sysrq_register_handler(void) sysrq_reset_seq[sysrq_reset_seq_len++] = key; } + /* + * DT configuration takes precedence over anything that would + * have been defined via the __weak interface. + */ + sysrq_of_get_keyreset_config(); + error = input_register_handler(&sysrq_handler); if (error) pr_err("Failed to register input handler, error %d", error);