Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'tty-4.8-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty

Pull serial driver fixes from Greg KH:
"Here are some small serial driver fixes for 4.8-rc5. One fixes an
oft-reported build issue with the fintek driver, another reverts a
patch that was causing problems, one fixes a crash, and some new
device ids were added.

All of these have been in linux-next for a while"

* tag 'tty-4.8-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
serial: 8250: added acces i/o products quad and octal serial cards
serial: 8250_mid: fix divide error bug if baud rate is 0
Revert "tty/serial/8250: use mctrl_gpio helpers"
8250/fintek: rename IRQ_MODE macro

+159 -90
-19
Documentation/devicetree/bindings/serial/8250.txt
··· 42 42 - auto-flow-control: one way to enable automatic flow control support. The 43 43 driver is allowed to detect support for the capability even without this 44 44 property. 45 - - {rts,cts,dtr,dsr,rng,dcd}-gpios: specify a GPIO for RTS/CTS/DTR/DSR/RI/DCD 46 - line respectively. It will use specified GPIO instead of the peripheral 47 - function pin for the UART feature. If unsure, don't specify this property. 48 45 49 46 Note: 50 47 * fsl,ns16550: ··· 62 65 clock-frequency = <3686400>; 63 66 interrupts = <10>; 64 67 reg-shift = <2>; 65 - }; 66 - 67 - Example for OMAP UART using GPIO-based modem control signals: 68 - 69 - uart4: serial@49042000 { 70 - compatible = "ti,omap3-uart"; 71 - reg = <0x49042000 0x400>; 72 - interrupts = <80>; 73 - ti,hwmods = "uart4"; 74 - clock-frequency = <48000000>; 75 - cts-gpios = <&gpio3 5 GPIO_ACTIVE_LOW>; 76 - rts-gpios = <&gpio3 6 GPIO_ACTIVE_LOW>; 77 - dtr-gpios = <&gpio1 12 GPIO_ACTIVE_LOW>; 78 - dsr-gpios = <&gpio1 13 GPIO_ACTIVE_LOW>; 79 - dcd-gpios = <&gpio1 14 GPIO_ACTIVE_LOW>; 80 - rng-gpios = <&gpio1 15 GPIO_ACTIVE_LOW>; 81 68 };
+1 -34
drivers/tty/serial/8250/8250.h
··· 15 15 #include <linux/serial_reg.h> 16 16 #include <linux/dmaengine.h> 17 17 18 - #include "../serial_mctrl_gpio.h" 19 - 20 18 struct uart_8250_dma { 21 19 int (*tx_dma)(struct uart_8250_port *p); 22 20 int (*rx_dma)(struct uart_8250_port *p); ··· 131 133 132 134 static inline void serial8250_out_MCR(struct uart_8250_port *up, int value) 133 135 { 134 - int mctrl_gpio = 0; 135 - 136 136 serial_out(up, UART_MCR, value); 137 - 138 - if (value & UART_MCR_RTS) 139 - mctrl_gpio |= TIOCM_RTS; 140 - if (value & UART_MCR_DTR) 141 - mctrl_gpio |= TIOCM_DTR; 142 - 143 - mctrl_gpio_set(up->gpios, mctrl_gpio); 144 137 } 145 138 146 139 static inline int serial8250_in_MCR(struct uart_8250_port *up) 147 140 { 148 - int mctrl, mctrl_gpio = 0; 149 - 150 - mctrl = serial_in(up, UART_MCR); 151 - 152 - /* save current MCR values */ 153 - if (mctrl & UART_MCR_RTS) 154 - mctrl_gpio |= TIOCM_RTS; 155 - if (mctrl & UART_MCR_DTR) 156 - mctrl_gpio |= TIOCM_DTR; 157 - 158 - mctrl_gpio = mctrl_gpio_get_outputs(up->gpios, &mctrl_gpio); 159 - 160 - if (mctrl_gpio & TIOCM_RTS) 161 - mctrl |= UART_MCR_RTS; 162 - else 163 - mctrl &= ~UART_MCR_RTS; 164 - 165 - if (mctrl_gpio & TIOCM_DTR) 166 - mctrl |= UART_MCR_DTR; 167 - else 168 - mctrl &= ~UART_MCR_DTR; 169 - 170 - return mctrl; 141 + return serial_in(up, UART_MCR); 171 142 } 172 143 173 144 #if defined(__alpha__) && !defined(CONFIG_PCI)
-9
drivers/tty/serial/8250/8250_core.c
··· 974 974 975 975 uart = serial8250_find_match_or_unused(&up->port); 976 976 if (uart && uart->port.type != PORT_8250_CIR) { 977 - struct mctrl_gpios *gpios; 978 - 979 977 if (uart->port.dev) 980 978 uart_remove_one_port(&serial8250_reg, &uart->port); 981 979 ··· 1010 1012 1011 1013 if (up->port.flags & UPF_FIXED_TYPE) 1012 1014 uart->port.type = up->port.type; 1013 - 1014 - gpios = mctrl_gpio_init(&uart->port, 0); 1015 - if (IS_ERR(gpios)) { 1016 - if (PTR_ERR(gpios) != -ENOSYS) 1017 - return PTR_ERR(gpios); 1018 - } else 1019 - uart->gpios = gpios; 1020 1015 1021 1016 serial8250_set_defaults(uart); 1022 1017
+2 -2
drivers/tty/serial/8250/8250_fintek.c
··· 31 31 #define IO_ADDR2 0x60 32 32 #define LDN 0x7 33 33 34 - #define IRQ_MODE 0x70 34 + #define FINTEK_IRQ_MODE 0x70 35 35 #define IRQ_SHARE BIT(4) 36 36 #define IRQ_MODE_MASK (BIT(6) | BIT(5)) 37 37 #define IRQ_LEVEL_LOW 0 ··· 195 195 outb(LDN, pdata->base_port + ADDR_PORT); 196 196 outb(pdata->index, pdata->base_port + DATA_PORT); 197 197 198 - outb(IRQ_MODE, pdata->base_port + ADDR_PORT); 198 + outb(FINTEK_IRQ_MODE, pdata->base_port + ADDR_PORT); 199 199 tmp = inb(pdata->base_port + DATA_PORT); 200 200 201 201 tmp &= ~IRQ_MODE_MASK;
+3
drivers/tty/serial/8250/8250_mid.c
··· 168 168 unsigned long w = BIT(24) - 1; 169 169 unsigned long mul, div; 170 170 171 + /* Gracefully handle the B0 case: fall back to B9600 */ 172 + fuart = fuart ? fuart : 9600 * 16; 173 + 171 174 if (mid->board->freq < fuart) { 172 175 /* Find prescaler value that satisfies Fuart < Fref */ 173 176 if (mid->board->freq > baud)
+13 -18
drivers/tty/serial/8250/8250_omap.c
··· 134 134 135 135 serial8250_do_set_mctrl(port, mctrl); 136 136 137 - if (IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(up->gpios, 138 - UART_GPIO_RTS))) { 139 - /* 140 - * Turn off autoRTS if RTS is lowered and restore autoRTS 141 - * setting if RTS is raised 142 - */ 143 - lcr = serial_in(up, UART_LCR); 144 - serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); 145 - if ((mctrl & TIOCM_RTS) && (port->status & UPSTAT_AUTORTS)) 146 - priv->efr |= UART_EFR_RTS; 147 - else 148 - priv->efr &= ~UART_EFR_RTS; 149 - serial_out(up, UART_EFR, priv->efr); 150 - serial_out(up, UART_LCR, lcr); 151 - } 137 + /* 138 + * Turn off autoRTS if RTS is lowered and restore autoRTS setting 139 + * if RTS is raised 140 + */ 141 + lcr = serial_in(up, UART_LCR); 142 + serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); 143 + if ((mctrl & TIOCM_RTS) && (port->status & UPSTAT_AUTORTS)) 144 + priv->efr |= UART_EFR_RTS; 145 + else 146 + priv->efr &= ~UART_EFR_RTS; 147 + serial_out(up, UART_EFR, priv->efr); 148 + serial_out(up, UART_LCR, lcr); 152 149 } 153 150 154 151 /* ··· 446 449 priv->efr = 0; 447 450 up->port.status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS | UPSTAT_AUTOXOFF); 448 451 449 - if (termios->c_cflag & CRTSCTS && up->port.flags & UPF_HARD_FLOW 450 - && IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(up->gpios, 451 - UART_GPIO_RTS))) { 452 + if (termios->c_cflag & CRTSCTS && up->port.flags & UPF_HARD_FLOW) { 452 453 /* Enable AUTOCTS (autoRTS is enabled when RTS is raised) */ 453 454 up->port.status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS; 454 455 priv->efr |= UART_EFR_CTS;
+139
drivers/tty/serial/8250/8250_pci.c
··· 1950 1950 #define PCI_DEVICE_ID_PERICOM_PI7C9X7954 0x7954 1951 1951 #define PCI_DEVICE_ID_PERICOM_PI7C9X7958 0x7958 1952 1952 1953 + #define PCI_VENDOR_ID_ACCESIO 0x494f 1954 + #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SDB 0x1051 1955 + #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2S 0x1053 1956 + #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB 0x105C 1957 + #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4S 0x105E 1958 + #define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_2DB 0x1091 1959 + #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_2 0x1093 1960 + #define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB 0x1099 1961 + #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_4 0x109B 1962 + #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SMDB 0x10D1 1963 + #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2SM 0x10D3 1964 + #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB 0x10DA 1965 + #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4SM 0x10DC 1966 + #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_1 0x1108 1967 + #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_2 0x1110 1968 + #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_2 0x1111 1969 + #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4 0x1118 1970 + #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_4 0x1119 1971 + #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2S 0x1152 1972 + #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S 0x115A 1973 + #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_2 0x1190 1974 + #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_2 0x1191 1975 + #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4 0x1198 1976 + #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_4 0x1199 1977 + #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2SM 0x11D0 1978 + #define PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4 0x105A 1979 + #define PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4 0x105B 1980 + #define PCI_DEVICE_ID_ACCESIO_PCIE_COM422_8 0x106A 1981 + #define PCI_DEVICE_ID_ACCESIO_PCIE_COM485_8 0x106B 1982 + #define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4 0x1098 1983 + #define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_8 0x10A9 1984 + #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM 0x10D9 1985 + #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_8SM 0x10E9 1986 + #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM 0x11D8 1987 + 1988 + 1989 + 1953 1990 /* Unknown vendors/cards - this should not be in linux/pci_ids.h */ 1954 1991 #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 1955 1992 #define PCI_SUBDEVICE_ID_UNKNOWN_0x1588 0x1588 ··· 5149 5112 PCI_ANY_ID, PCI_ANY_ID, 5150 5113 0, 5151 5114 0, pbn_pericom_PI7C9X7958 }, 5115 + /* 5116 + * ACCES I/O Products quad 5117 + */ 5118 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SDB, 5119 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5120 + pbn_pericom_PI7C9X7954 }, 5121 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2S, 5122 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5123 + pbn_pericom_PI7C9X7954 }, 5124 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB, 5125 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5126 + pbn_pericom_PI7C9X7954 }, 5127 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4S, 5128 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5129 + pbn_pericom_PI7C9X7954 }, 5130 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_2DB, 5131 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5132 + pbn_pericom_PI7C9X7954 }, 5133 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_2, 5134 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5135 + pbn_pericom_PI7C9X7954 }, 5136 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB, 5137 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5138 + pbn_pericom_PI7C9X7954 }, 5139 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_4, 5140 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5141 + pbn_pericom_PI7C9X7954 }, 5142 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SMDB, 5143 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5144 + pbn_pericom_PI7C9X7954 }, 5145 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2SM, 5146 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5147 + pbn_pericom_PI7C9X7954 }, 5148 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB, 5149 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5150 + pbn_pericom_PI7C9X7954 }, 5151 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4SM, 5152 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5153 + pbn_pericom_PI7C9X7954 }, 5154 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_1, 5155 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5156 + pbn_pericom_PI7C9X7954 }, 5157 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_2, 5158 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5159 + pbn_pericom_PI7C9X7954 }, 5160 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_2, 5161 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5162 + pbn_pericom_PI7C9X7954 }, 5163 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4, 5164 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5165 + pbn_pericom_PI7C9X7954 }, 5166 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_4, 5167 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5168 + pbn_pericom_PI7C9X7954 }, 5169 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2S, 5170 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5171 + pbn_pericom_PI7C9X7954 }, 5172 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S, 5173 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5174 + pbn_pericom_PI7C9X7954 }, 5175 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_2, 5176 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5177 + pbn_pericom_PI7C9X7954 }, 5178 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_2, 5179 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5180 + pbn_pericom_PI7C9X7954 }, 5181 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4, 5182 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5183 + pbn_pericom_PI7C9X7954 }, 5184 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_4, 5185 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5186 + pbn_pericom_PI7C9X7954 }, 5187 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2SM, 5188 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5189 + pbn_pericom_PI7C9X7954 }, 5190 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4, 5191 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5192 + pbn_pericom_PI7C9X7958 }, 5193 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4, 5194 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5195 + pbn_pericom_PI7C9X7958 }, 5196 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM422_8, 5197 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5198 + pbn_pericom_PI7C9X7958 }, 5199 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM485_8, 5200 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5201 + pbn_pericom_PI7C9X7958 }, 5202 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4, 5203 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5204 + pbn_pericom_PI7C9X7958 }, 5205 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_8, 5206 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5207 + pbn_pericom_PI7C9X7958 }, 5208 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM, 5209 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5210 + pbn_pericom_PI7C9X7958 }, 5211 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_8SM, 5212 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5213 + pbn_pericom_PI7C9X7958 }, 5214 + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM, 5215 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5216 + pbn_pericom_PI7C9X7958 }, 5152 5217 /* 5153 5218 * Topic TP560 Data/Fax/Voice 56k modem (reported by Evan Clarke) 5154 5219 */
+1 -6
drivers/tty/serial/8250/8250_port.c
··· 1618 1618 if (up->bugs & UART_BUG_NOMSR) 1619 1619 return; 1620 1620 1621 - mctrl_gpio_disable_ms(up->gpios); 1622 - 1623 1621 up->ier &= ~UART_IER_MSI; 1624 1622 serial_port_out(port, UART_IER, up->ier); 1625 1623 } ··· 1629 1631 /* no MSR capabilities */ 1630 1632 if (up->bugs & UART_BUG_NOMSR) 1631 1633 return; 1632 - 1633 - mctrl_gpio_enable_ms(up->gpios); 1634 1634 1635 1635 up->ier |= UART_IER_MSI; 1636 1636 ··· 1913 1917 ret |= TIOCM_DSR; 1914 1918 if (status & UART_MSR_CTS) 1915 1919 ret |= TIOCM_CTS; 1916 - 1917 - return mctrl_gpio_get(up->gpios, &ret); 1920 + return ret; 1918 1921 } 1919 1922 EXPORT_SYMBOL_GPL(serial8250_do_get_mctrl); 1920 1923
-1
drivers/tty/serial/8250/Kconfig
··· 6 6 config SERIAL_8250 7 7 tristate "8250/16550 and compatible serial support" 8 8 select SERIAL_CORE 9 - select SERIAL_MCTRL_GPIO if GPIOLIB 10 9 ---help--- 11 10 This selects whether you want to include the driver for the standard 12 11 serial ports. The standard answer is Y. People who might say N
-1
include/linux/serial_8250.h
··· 111 111 * if no_console_suspend 112 112 */ 113 113 unsigned char probe; 114 - struct mctrl_gpios *gpios; 115 114 #define UART_PROBE_RSA (1 << 0) 116 115 117 116 /*