Merge tag 'tty-4.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 18 Aug 2018 17:50:41 +0000 (10:50 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 18 Aug 2018 17:50:41 +0000 (10:50 -0700)
Pull tty/serial driver updates from Greg KH:
 "Here is the big tty and serial driver pull request for 4.19-rc1.

  It's not all that big, just a number of small serial driver updates
  and fixes, along with some better vt handling for unicode characters
  for those using braille terminals.

  All of these patches have been in linux-next for a long time with no
  reported issues"

* tag 'tty-4.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: (73 commits)
  tty: serial: 8250: Revert NXP SC16C2552 workaround
  serial: 8250_exar: Read INT0 from slave device, too
  tty: rocket: Fix possible buffer overwrite on register_PCI
  serial: 8250_dw: Add ACPI support for uart on Broadcom SoC
  serial: 8250_dw: always set baud rate in dw8250_set_termios
  dt-bindings: serial: Add binding for uartlite
  tty: serial: uartlite: Add support for suspend and resume
  tty: serial: uartlite: Add clock adaptation
  tty: serial: uartlite: Add structure for private data
  serial: sh-sci: Improve support for separate TEI and DRI interrupts
  serial: sh-sci: Remove SCIx_RZ_SCIFA_REGTYPE
  serial: sh-sci: Allow for compressed SCIF address
  serial: sh-sci: Improve interrupts description
  serial: 8250: Use cached port name directly in messages
  serial: 8250_exar: Drop unused variable in pci_xr17v35x_setup()
  vt: drop unused struct vt_struct
  vt: avoid a VLA in the unicode screen scroll function
  vt: add /dev/vcsu* to devices.txt
  vt: coherence validation code for the unicode screen buffer
  vt: selection: take screen contents from uniscr if available
  ...

1  2 
Documentation/devicetree/bindings/interrupt-controller/mediatek,sysirq.txt
Documentation/devicetree/bindings/soc/qcom/qcom,geni-se.txt
drivers/s390/char/keyboard.c
drivers/tty/vt/keyboard.c

index 6a32922a55b8d3df13f4f7ff5d1ab0c9a061a951,c8eda800f37eba6c3bdb3ffa0487bd5cddaf0d54..33a98eb44949f1c43c972a7955e4d4d5427f7865
@@@ -11,6 -11,7 +11,7 @@@ Required properties
        "mediatek,mt7622-sysirq", "mediatek,mt6577-sysirq": for MT7622
        "mediatek,mt6795-sysirq", "mediatek,mt6577-sysirq": for MT6795
        "mediatek,mt6797-sysirq", "mediatek,mt6577-sysirq": for MT6797
+       "mediatek,mt6765-sysirq", "mediatek,mt6577-sysirq": for MT6765
        "mediatek,mt6755-sysirq", "mediatek,mt6577-sysirq": for MT6755
        "mediatek,mt6592-sysirq", "mediatek,mt6577-sysirq": for MT6592
        "mediatek,mt6589-sysirq", "mediatek,mt6577-sysirq": for MT6589
@@@ -21,6 -22,8 +22,6 @@@
        "mediatek,mt2701-sysirq", "mediatek,mt6577-sysirq": for MT2701
  - interrupt-controller : Identifies the node as an interrupt controller
  - #interrupt-cells : Use the same format as specified by GIC in arm,gic.txt.
 -- interrupt-parent: phandle of irq parent for sysirq. The parent must
 -  use the same interrupt-cells format as GIC.
  - reg: Physical base address of the intpol registers and length of memory
    mapped region. Could be multiple bases here. Ex: mt6797 needs 2 reg, others
    need 1.
index 68b7d6207e3d75acd51400da27e5ca292c5026d0,a9eeca28f03e1e18dcf6f2566a77565fb523c6ec..ff92e5a41bedcc15d4126f9a93306f3efe70b1f2
@@@ -39,14 -39,14 +39,14 @@@ Required properties
  
  Optional property:
  - clock-frequency:    Desired I2C bus clock frequency in Hz.
 -                      When missing default to 400000Hz.
 +                      When missing default to 100000Hz.
  
  Child nodes should conform to I2C bus binding as described in i2c.txt.
  
  Qualcomm Technologies Inc. GENI Serial Engine based UART Controller
  
  Required properties:
- - compatible:         Must be "qcom,geni-debug-uart".
+ - compatible:         Must be "qcom,geni-debug-uart" or "qcom,geni-uart".
  - reg:                        Must contain UART register location and length.
  - interrupts:                 Must contain UART core interrupts.
  - clock-names:                Must contain "se".
index bbb3001b0961f339535cb4f52424d2f008142ca2,eda245887fe03bd8b93b002a20a6203eec6d0025..567aedc03c76332895e34d0704f83f74aad9de0e
@@@ -39,8 -39,34 +39,34 @@@ static const int kbd_max_vals[] = 
  };
  static const int KBD_NR_TYPES = ARRAY_SIZE(kbd_max_vals);
  
- static unsigned char ret_diacr[NR_DEAD] = {
-       '`', '\'', '^', '~', '"', ','
+ static const unsigned char ret_diacr[NR_DEAD] = {
+       '`',    /* dead_grave */
+       '\'',   /* dead_acute */
+       '^',    /* dead_circumflex */
+       '~',    /* dead_tilda */
+       '"',    /* dead_diaeresis */
+       ',',    /* dead_cedilla */
+       '_',    /* dead_macron */
+       'U',    /* dead_breve */
+       '.',    /* dead_abovedot */
+       '*',    /* dead_abovering */
+       '=',    /* dead_doubleacute */
+       'c',    /* dead_caron */
+       'k',    /* dead_ogonek */
+       'i',    /* dead_iota */
+       '#',    /* dead_voiced_sound */
+       'o',    /* dead_semivoiced_sound */
+       '!',    /* dead_belowdot */
+       '?',    /* dead_hook */
+       '+',    /* dead_horn */
+       '-',    /* dead_stroke */
+       ')',    /* dead_abovecomma */
+       '(',    /* dead_abovereversedcomma */
+       ':',    /* dead_doublegrave */
+       'n',    /* dead_invertedbreve */
+       ';',    /* dead_belowcomma */
+       '$',    /* dead_currency */
+       '@',    /* dead_greek */
  };
  
  /*
@@@ -334,41 -360,37 +360,41 @@@ do_kdsk_ioctl(struct kbd_data *kbd, str
              int cmd, int perm)
  {
        struct kbentry tmp;
 +      unsigned long kb_index, kb_table;
        ushort *key_map, val, ov;
  
        if (copy_from_user(&tmp, user_kbe, sizeof(struct kbentry)))
                return -EFAULT;
 +      kb_index = (unsigned long) tmp.kb_index;
  #if NR_KEYS < 256
 -      if (tmp.kb_index >= NR_KEYS)
 +      if (kb_index >= NR_KEYS)
                return -EINVAL;
  #endif
 +      kb_table = (unsigned long) tmp.kb_table;
  #if MAX_NR_KEYMAPS < 256
 -      if (tmp.kb_table >= MAX_NR_KEYMAPS)
 +      if (kb_table >= MAX_NR_KEYMAPS)
                return -EINVAL; 
 +      kb_table = array_index_nospec(kb_table , MAX_NR_KEYMAPS);
  #endif
  
        switch (cmd) {
        case KDGKBENT:
 -              key_map = kbd->key_maps[tmp.kb_table];
 +              key_map = kbd->key_maps[kb_table];
                if (key_map) {
 -                  val = U(key_map[tmp.kb_index]);
 +                  val = U(key_map[kb_index]);
                    if (KTYP(val) >= KBD_NR_TYPES)
                        val = K_HOLE;
                } else
 -                  val = (tmp.kb_index ? K_HOLE : K_NOSUCHMAP);
 +                  val = (kb_index ? K_HOLE : K_NOSUCHMAP);
                return put_user(val, &user_kbe->kb_value);
        case KDSKBENT:
                if (!perm)
                        return -EPERM;
 -              if (!tmp.kb_index && tmp.kb_value == K_NOSUCHMAP) {
 +              if (!kb_index && tmp.kb_value == K_NOSUCHMAP) {
                        /* disallocate map */
 -                      key_map = kbd->key_maps[tmp.kb_table];
 +                      key_map = kbd->key_maps[kb_table];
                        if (key_map) {
 -                          kbd->key_maps[tmp.kb_table] = NULL;
 +                          kbd->key_maps[kb_table] = NULL;
                            kfree(key_map);
                        }
                        break;
                if (KVAL(tmp.kb_value) > kbd_max_vals[KTYP(tmp.kb_value)])
                        return -EINVAL;
  
 -              if (!(key_map = kbd->key_maps[tmp.kb_table])) {
 +              if (!(key_map = kbd->key_maps[kb_table])) {
                        int j;
  
                        key_map = kmalloc(sizeof(plain_map),
                                                     GFP_KERNEL);
                        if (!key_map)
                                return -ENOMEM;
 -                      kbd->key_maps[tmp.kb_table] = key_map;
 +                      kbd->key_maps[kb_table] = key_map;
                        for (j = 0; j < NR_KEYS; j++)
                                key_map[j] = U(K_HOLE);
                }
 -              ov = U(key_map[tmp.kb_index]);
 +              ov = U(key_map[kb_index]);
                if (tmp.kb_value == ov)
                        break;  /* nothing to do */
                /*
                if (((ov == K_SAK) || (tmp.kb_value == K_SAK)) &&
                    !capable(CAP_SYS_ADMIN))
                        return -EPERM;
 -              key_map[tmp.kb_index] = U(tmp.kb_value);
 +              key_map[kb_index] = U(tmp.kb_value);
                break;
        }
        return 0;
index de310621b8e777b6a75cea8b41031d52d9ba27d8,c0f5802acd7c280db6c9b3b2dad8f90d585bdbac..88312c6c92cc6d2f9e1c806571a6360ecab5e5b2
@@@ -690,7 -690,35 +690,35 @@@ static void k_dead2(struct vc_data *vc
   */
  static void k_dead(struct vc_data *vc, unsigned char value, char up_flag)
  {
-       static const unsigned char ret_diacr[NR_DEAD] = {'`', '\'', '^', '~', '"', ',' };
+       static const unsigned char ret_diacr[NR_DEAD] = {
+               '`',    /* dead_grave */
+               '\'',   /* dead_acute */
+               '^',    /* dead_circumflex */
+               '~',    /* dead_tilda */
+               '"',    /* dead_diaeresis */
+               ',',    /* dead_cedilla */
+               '_',    /* dead_macron */
+               'U',    /* dead_breve */
+               '.',    /* dead_abovedot */
+               '*',    /* dead_abovering */
+               '=',    /* dead_doubleacute */
+               'c',    /* dead_caron */
+               'k',    /* dead_ogonek */
+               'i',    /* dead_iota */
+               '#',    /* dead_voiced_sound */
+               'o',    /* dead_semivoiced_sound */
+               '!',    /* dead_belowdot */
+               '?',    /* dead_hook */
+               '+',    /* dead_horn */
+               '-',    /* dead_stroke */
+               ')',    /* dead_abovecomma */
+               '(',    /* dead_abovereversedcomma */
+               ':',    /* dead_doublegrave */
+               'n',    /* dead_invertedbreve */
+               ';',    /* dead_belowcomma */
+               '$',    /* dead_currency */
+               '@',    /* dead_greek */
+       };
  
        k_deadunicode(vc, ret_diacr[value], up_flag);
  }
@@@ -959,7 -987,7 +987,7 @@@ struct kbd_led_trigger 
        unsigned int mask;
  };
  
 -static void kbd_led_trigger_activate(struct led_classdev *cdev)
 +static int kbd_led_trigger_activate(struct led_classdev *cdev)
  {
        struct kbd_led_trigger *trigger =
                container_of(cdev->trigger, struct kbd_led_trigger, trigger);
                                  ledstate & trigger->mask ?
                                        LED_FULL : LED_OFF);
        tasklet_enable(&keyboard_tasklet);
 +
 +      return 0;
  }
  
  #define KBD_LED_TRIGGER(_led_bit, _name) {                    \