net: ppp: Mundane typo fixes in the file pppoe.c
[platform/kernel/linux-starfive.git] / drivers / tty / sysrq.c
index a8e39b2..959f9e1 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/sched/rt.h>
 #include <linux/sched/debug.h>
 #include <linux/sched/task.h>
+#include <linux/ctype.h>
 #include <linux/interrupt.h>
 #include <linux/mm.h>
 #include <linux/fs.h>
@@ -440,7 +441,7 @@ static const struct sysrq_key_op sysrq_unrt_op = {
 /* Key Operations table and lock */
 static DEFINE_SPINLOCK(sysrq_key_table_lock);
 
-static const struct sysrq_key_op *sysrq_key_table[36] = {
+static const struct sysrq_key_op *sysrq_key_table[62] = {
        &sysrq_loglevel_op,             /* 0 */
        &sysrq_loglevel_op,             /* 1 */
        &sysrq_loglevel_op,             /* 2 */
@@ -497,6 +498,32 @@ static const struct sysrq_key_op *sysrq_key_table[36] = {
        /* y: May be registered on sparc64 for global register dump */
        NULL,                           /* y */
        &sysrq_ftrace_dump_op,          /* z */
+       NULL,                           /* A */
+       NULL,                           /* B */
+       NULL,                           /* C */
+       NULL,                           /* D */
+       NULL,                           /* E */
+       NULL,                           /* F */
+       NULL,                           /* G */
+       NULL,                           /* H */
+       NULL,                           /* I */
+       NULL,                           /* J */
+       NULL,                           /* K */
+       NULL,                           /* L */
+       NULL,                           /* M */
+       NULL,                           /* N */
+       NULL,                           /* O */
+       NULL,                           /* P */
+       NULL,                           /* Q */
+       NULL,                           /* R */
+       NULL,                           /* S */
+       NULL,                           /* T */
+       NULL,                           /* U */
+       NULL,                           /* V */
+       NULL,                           /* W */
+       NULL,                           /* X */
+       NULL,                           /* Y */
+       NULL,                           /* Z */
 };
 
 /* key2index calculation, -1 on invalid index */
@@ -508,6 +535,8 @@ static int sysrq_key_table_key2index(int key)
                retval = key - '0';
        else if ((key >= 'a') && (key <= 'z'))
                retval = key + 10 - 'a';
+       else if ((key >= 'A') && (key <= 'Z'))
+               retval = key + 36 - 'A';
        else
                retval = -1;
        return retval;
@@ -621,6 +650,8 @@ struct sysrq_state {
        unsigned long key_down[BITS_TO_LONGS(KEY_CNT)];
        unsigned int alt;
        unsigned int alt_use;
+       unsigned int shift;
+       unsigned int shift_use;
        bool active;
        bool need_reinject;
        bool reinjecting;
@@ -805,10 +836,20 @@ static bool sysrq_handle_keypress(struct sysrq_state *sysrq,
                }
                break;
 
+       case KEY_LEFTSHIFT:
+       case KEY_RIGHTSHIFT:
+               if (!value)
+                       sysrq->shift = KEY_RESERVED;
+               else if (value != 2)
+                       sysrq->shift = code;
+               break;
+
        case KEY_SYSRQ:
                if (value == 1 && sysrq->alt != KEY_RESERVED) {
                        sysrq->active = true;
                        sysrq->alt_use = sysrq->alt;
+                       /* either RESERVED (for released) or actual code */
+                       sysrq->shift_use = sysrq->shift;
                        /*
                         * If nothing else will be pressed we'll need
                         * to re-inject Alt-SysRq keysroke.
@@ -831,8 +872,12 @@ static bool sysrq_handle_keypress(struct sysrq_state *sysrq,
 
        default:
                if (sysrq->active && value && value != 2) {
+                       unsigned char c = sysrq_xlate[code];
+
                        sysrq->need_reinject = false;
-                       __handle_sysrq(sysrq_xlate[code], true);
+                       if (sysrq->shift_use != KEY_RESERVED)
+                               c = toupper(c);
+                       __handle_sysrq(c, true);
                }
                break;
        }