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

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

Pull tty/serial updates from Greg KH:
"Here are some small updates for tty/serial drivers for 6.18-rc1.

Not many changes overall, just the usual:

- abi cleanups and reworking of the tty functions by Jiri by adding
console lock guard logic

- 8250_platform driver updates

- qcom-geni driver updates

- other minor serial driver updates

- some more vt escape codes added

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

* tag 'tty-6.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: (43 commits)
tty: serial: fix help message for SERIAL_CPM
serial: 8250: omap: Support wakeup pinctrl state on suspend
dt-bindings: serial: 8250_omap: Add wakeup pinctrl state
serial: max310x: improve interrupt handling
vt: move vc_saved_screen to within tty allocated judgment
Revert "m68k: make HPDCA and HPAPCI bools"
tty: remove redundant condition checks
tty/vt: Add missing return value for VT_RESIZE in vt_ioctl()
vt: remove redundant check on vc_mode in con_font_set()
serial: qcom-geni: Add DFS clock mode support to GENI UART driver
m68k: make HPDCA and HPAPCI bools
tty: n_gsm: Don't block input queue by waiting MSC
serial: qcom-geni: Fix off-by-one error in ida_alloc_range()
serdev: Drop dev_pm_domain_detach() call
serial: sc16is7xx: drop redundant conversion to bool
vt: add support for smput/rmput escape codes
serial: stm32: allow selecting console when the driver is module
serial: 8250_core: fix coding style issue
tty: serial: Modify the use of dev_err_probe()
s390/char/con3270: use tty_port_tty guard()
...

+1201 -1403
+16
Documentation/devicetree/bindings/serial/8250_omap.yaml
··· 71 71 overrun-throttle-ms: true 72 72 wakeup-source: true 73 73 74 + pinctrl-0: 75 + description: Default pinctrl state 76 + 77 + pinctrl-1: 78 + description: Wakeup pinctrl state 79 + 80 + pinctrl-names: 81 + description: 82 + When present should contain at least "default" describing the default pin 83 + states. The second state called "wakeup" describes the pins in their 84 + wakeup configuration required to exit sleep states. 85 + minItems: 1 86 + items: 87 + - const: default 88 + - const: wakeup 89 + 74 90 required: 75 91 - compatible 76 92 - reg
+32
arch/mips/sgi-ip22/ip22-platform.c
··· 221 221 } 222 222 223 223 device_initcall(sgi_ds1286_devinit); 224 + 225 + #define SGI_ZILOG_BASE (HPC3_CHIP0_BASE + \ 226 + offsetof(struct hpc3_regs, pbus_extregs[6]) + \ 227 + offsetof(struct sgioc_regs, uart)) 228 + 229 + static struct resource sgi_zilog_resources[] = { 230 + { 231 + .start = SGI_ZILOG_BASE, 232 + .end = SGI_ZILOG_BASE + 15, 233 + .flags = IORESOURCE_MEM 234 + }, 235 + { 236 + .start = SGI_SERIAL_IRQ, 237 + .end = SGI_SERIAL_IRQ, 238 + .flags = IORESOURCE_IRQ 239 + } 240 + }; 241 + 242 + static struct platform_device zilog_device = { 243 + .name = "ip22zilog", 244 + .id = 0, 245 + .num_resources = ARRAY_SIZE(sgi_zilog_resources), 246 + .resource = sgi_zilog_resources, 247 + }; 248 + 249 + 250 + static int __init sgi_zilog_devinit(void) 251 + { 252 + return platform_device_register(&zilog_device); 253 + } 254 + 255 + device_initcall(sgi_zilog_devinit);
+8 -10
drivers/s390/char/con3270.c
··· 970 970 char **old_rcl_lines, **new_rcl_lines; 971 971 char *old_prompt, *new_prompt; 972 972 char *old_input, *new_input; 973 - struct tty_struct *tty; 974 - struct winsize ws; 975 973 size_t prompt_sz; 976 974 int new_allocated, old_allocated = tp->allocated_lines; 977 975 ··· 1021 1023 kfree(old_prompt); 1022 1024 tty3270_free_recall(old_rcl_lines); 1023 1025 tty3270_set_timer(tp, 1); 1024 - /* Informat tty layer about new size */ 1025 - tty = tty_port_tty_get(&tp->port); 1026 - if (!tty) 1027 - return; 1028 - ws.ws_row = tty3270_tty_rows(tp); 1029 - ws.ws_col = tp->view.cols; 1030 - tty_do_resize(tty, &ws); 1031 - tty_kref_put(tty); 1026 + /* Inform the tty layer about new size */ 1027 + scoped_guard(tty_port_tty, &tp->port) { 1028 + struct winsize ws = { 1029 + .ws_row = tty3270_tty_rows(tp), 1030 + .ws_col = tp->view.cols, 1031 + }; 1032 + tty_do_resize(scoped_tty(), &ws); 1033 + } 1032 1034 return; 1033 1035 out_screen: 1034 1036 tty3270_free_screen(screen, new_rows);
+1 -1
drivers/tty/hvc/hvc_console.c
··· 184 184 hvc_console_flush(cons_ops[index], 185 185 vtermnos[index]); 186 186 } 187 - } else if (r > 0) { 187 + } else { 188 188 i -= r; 189 189 if (i > 0) 190 190 memmove(c, c+r, i);
+106 -159
drivers/tty/mxser.c
··· 442 442 443 443 static void mxser_start_tx(struct mxser_port *info) 444 444 { 445 - unsigned long flags; 446 - 447 - spin_lock_irqsave(&info->slock, flags); 445 + guard(spinlock_irqsave)(&info->slock); 448 446 __mxser_start_tx(info); 449 - spin_unlock_irqrestore(&info->slock, flags); 450 447 } 451 448 452 449 static void __mxser_stop_tx(struct mxser_port *info) ··· 462 465 static void mxser_dtr_rts(struct tty_port *port, bool active) 463 466 { 464 467 struct mxser_port *mp = container_of(port, struct mxser_port, port); 465 - unsigned long flags; 466 468 u8 mcr; 467 469 468 - spin_lock_irqsave(&mp->slock, flags); 470 + guard(spinlock_irqsave)(&mp->slock); 469 471 mcr = inb(mp->ioaddr + UART_MCR); 470 472 if (active) 471 473 mcr |= UART_MCR_DTR | UART_MCR_RTS; 472 474 else 473 475 mcr &= ~(UART_MCR_DTR | UART_MCR_RTS); 474 476 outb(mcr, mp->ioaddr + UART_MCR); 475 - spin_unlock_irqrestore(&mp->slock, flags); 476 477 } 477 478 478 479 static int mxser_set_baud(struct tty_struct *tty, speed_t newspd) ··· 823 828 static void mxser_shutdown_port(struct tty_port *port) 824 829 { 825 830 struct mxser_port *info = container_of(port, struct mxser_port, port); 826 - unsigned long flags; 827 831 828 - spin_lock_irqsave(&info->slock, flags); 832 + scoped_guard(spinlock_irqsave, &info->slock) { 833 + mxser_stop_rx(info); 829 834 830 - mxser_stop_rx(info); 835 + /* 836 + * clear delta_msr_wait queue to avoid mem leaks: we may free the irq 837 + * here so the queue might never be waken up 838 + */ 839 + wake_up_interruptible(&info->port.delta_msr_wait); 831 840 832 - /* 833 - * clear delta_msr_wait queue to avoid mem leaks: we may free the irq 834 - * here so the queue might never be waken up 835 - */ 836 - wake_up_interruptible(&info->port.delta_msr_wait); 841 + info->IER = 0; 842 + outb(0x00, info->ioaddr + UART_IER); 837 843 838 - info->IER = 0; 839 - outb(0x00, info->ioaddr + UART_IER); 844 + /* clear Rx/Tx FIFO's */ 845 + mxser_disable_and_clear_FIFO(info); 840 846 841 - /* clear Rx/Tx FIFO's */ 842 - mxser_disable_and_clear_FIFO(info); 847 + /* read data port to reset things */ 848 + (void)inb(info->ioaddr + UART_RX); 843 849 844 - /* read data port to reset things */ 845 - (void) inb(info->ioaddr + UART_RX); 846 - 847 - 848 - if (info->board->must_hwid) 849 - mxser_must_no_sw_flow_control(info->ioaddr); 850 - 851 - spin_unlock_irqrestore(&info->slock, flags); 850 + if (info->board->must_hwid) 851 + mxser_must_no_sw_flow_control(info->ioaddr); 852 + } 852 853 853 854 /* make sure ISR is not running while we free the buffer */ 854 855 synchronize_irq(info->board->irq); ··· 871 880 static void mxser_flush_buffer(struct tty_struct *tty) 872 881 { 873 882 struct mxser_port *info = tty->driver_data; 874 - unsigned long flags; 875 883 876 - spin_lock_irqsave(&info->slock, flags); 877 - kfifo_reset(&info->port.xmit_fifo); 884 + scoped_guard(spinlock_irqsave, &info->slock) { 885 + kfifo_reset(&info->port.xmit_fifo); 878 886 879 - outb(info->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, 880 - info->ioaddr + UART_FCR); 881 - 882 - spin_unlock_irqrestore(&info->slock, flags); 887 + outb(info->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, 888 + info->ioaddr + UART_FCR); 889 + } 883 890 884 891 tty_wakeup(tty); 885 892 } ··· 890 901 static ssize_t mxser_write(struct tty_struct *tty, const u8 *buf, size_t count) 891 902 { 892 903 struct mxser_port *info = tty->driver_data; 893 - unsigned long flags; 894 904 size_t written; 895 905 bool is_empty; 896 906 897 - spin_lock_irqsave(&info->slock, flags); 898 - written = kfifo_in(&info->port.xmit_fifo, buf, count); 899 - is_empty = kfifo_is_empty(&info->port.xmit_fifo); 900 - spin_unlock_irqrestore(&info->slock, flags); 907 + scoped_guard(spinlock_irqsave, &info->slock) { 908 + written = kfifo_in(&info->port.xmit_fifo, buf, count); 909 + is_empty = kfifo_is_empty(&info->port.xmit_fifo); 910 + } 901 911 902 912 if (!is_empty && !tty->flow.stopped) 903 913 if (!tty->hw_stopped || mxser_16550A_or_MUST(info)) ··· 908 920 static int mxser_put_char(struct tty_struct *tty, u8 ch) 909 921 { 910 922 struct mxser_port *info = tty->driver_data; 911 - unsigned long flags; 912 - int ret; 913 923 914 - spin_lock_irqsave(&info->slock, flags); 915 - ret = kfifo_put(&info->port.xmit_fifo, ch); 916 - spin_unlock_irqrestore(&info->slock, flags); 917 - 918 - return ret; 924 + guard(spinlock_irqsave)(&info->slock); 925 + return kfifo_put(&info->port.xmit_fifo, ch); 919 926 } 920 927 921 928 ··· 951 968 struct tty_port *port = &info->port; 952 969 unsigned int closing_wait, close_delay; 953 970 954 - mutex_lock(&port->mutex); 971 + guard(mutex)(&port->mutex); 955 972 956 973 close_delay = jiffies_to_msecs(info->port.close_delay) / 10; 957 974 closing_wait = info->port.closing_wait; ··· 967 984 ss->close_delay = close_delay; 968 985 ss->closing_wait = closing_wait; 969 986 ss->custom_divisor = MXSER_CUSTOM_DIVISOR; 970 - mutex_unlock(&port->mutex); 987 + 971 988 return 0; 972 989 } 973 990 ··· 977 994 struct mxser_port *info = tty->driver_data; 978 995 struct tty_port *port = &info->port; 979 996 speed_t baud; 980 - unsigned long sl_flags; 981 997 unsigned int old_speed, close_delay, closing_wait; 982 - int retval = 0; 983 998 984 999 if (tty_io_error(tty)) 985 1000 return -EIO; 986 1001 987 - mutex_lock(&port->mutex); 1002 + guard(mutex)(&port->mutex); 988 1003 989 - if (ss->irq != info->board->irq || 990 - ss->port != info->ioaddr) { 991 - mutex_unlock(&port->mutex); 1004 + if (ss->irq != info->board->irq || ss->port != info->ioaddr) 992 1005 return -EINVAL; 993 - } 994 1006 995 1007 old_speed = port->flags & ASYNC_SPD_MASK; 996 1008 ··· 998 1020 if ((ss->baud_base != MXSER_BAUD_BASE) || 999 1021 (close_delay != port->close_delay) || 1000 1022 (closing_wait != port->closing_wait) || 1001 - ((ss->flags & ~ASYNC_USR_MASK) != (port->flags & ~ASYNC_USR_MASK))) { 1002 - mutex_unlock(&port->mutex); 1023 + ((ss->flags & ~ASYNC_USR_MASK) != (port->flags & ~ASYNC_USR_MASK))) 1003 1024 return -EPERM; 1004 - } 1025 + 1005 1026 port->flags = (port->flags & ~ASYNC_USR_MASK) | 1006 1027 (ss->flags & ASYNC_USR_MASK); 1007 1028 } else { ··· 1016 1039 (ss->baud_base != MXSER_BAUD_BASE || 1017 1040 ss->custom_divisor != 1018 1041 MXSER_CUSTOM_DIVISOR)) { 1019 - if (ss->custom_divisor == 0) { 1020 - mutex_unlock(&port->mutex); 1042 + if (ss->custom_divisor == 0) 1021 1043 return -EINVAL; 1022 - } 1044 + 1023 1045 baud = ss->baud_base / ss->custom_divisor; 1024 1046 tty_encode_baud_rate(tty, baud, baud); 1025 1047 } ··· 1030 1054 1031 1055 if (tty_port_initialized(port)) { 1032 1056 if (old_speed != (port->flags & ASYNC_SPD_MASK)) { 1033 - spin_lock_irqsave(&info->slock, sl_flags); 1057 + guard(spinlock_irqsave)(&info->slock); 1034 1058 mxser_change_speed(tty, NULL); 1035 - spin_unlock_irqrestore(&info->slock, sl_flags); 1036 1059 } 1037 - } else { 1038 - retval = mxser_activate(port, tty); 1039 - if (retval == 0) 1040 - tty_port_set_initialized(port, true); 1060 + 1061 + return 0; 1041 1062 } 1042 - mutex_unlock(&port->mutex); 1063 + 1064 + int retval = mxser_activate(port, tty); 1065 + if (retval == 0) 1066 + tty_port_set_initialized(port, true); 1067 + 1043 1068 return retval; 1044 1069 } 1045 1070 ··· 1057 1080 static int mxser_get_lsr_info(struct mxser_port *info, 1058 1081 unsigned int __user *value) 1059 1082 { 1060 - unsigned char status; 1061 1083 unsigned int result; 1062 - unsigned long flags; 1084 + u8 status; 1063 1085 1064 - spin_lock_irqsave(&info->slock, flags); 1065 - status = inb(info->ioaddr + UART_LSR); 1066 - spin_unlock_irqrestore(&info->slock, flags); 1086 + scoped_guard(spinlock_irqsave, &info->slock) 1087 + status = inb(info->ioaddr + UART_LSR); 1067 1088 result = ((status & UART_LSR_TEMT) ? TIOCSER_TEMT : 0); 1068 1089 return put_user(result, value); 1069 1090 } ··· 1070 1095 { 1071 1096 struct mxser_port *info = tty->driver_data; 1072 1097 unsigned char control; 1073 - unsigned long flags; 1074 1098 u8 msr; 1075 1099 1076 1100 if (tty_io_error(tty)) 1077 1101 return -EIO; 1078 1102 1079 - spin_lock_irqsave(&info->slock, flags); 1080 - control = info->MCR; 1081 - msr = mxser_check_modem_status(tty, info); 1082 - spin_unlock_irqrestore(&info->slock, flags); 1103 + scoped_guard(spinlock_irqsave, &info->slock) { 1104 + control = info->MCR; 1105 + msr = mxser_check_modem_status(tty, info); 1106 + } 1083 1107 1084 1108 return ((control & UART_MCR_RTS) ? TIOCM_RTS : 0) | 1085 1109 ((control & UART_MCR_DTR) ? TIOCM_DTR : 0) | ··· 1092 1118 unsigned int set, unsigned int clear) 1093 1119 { 1094 1120 struct mxser_port *info = tty->driver_data; 1095 - unsigned long flags; 1096 1121 1097 1122 if (tty_io_error(tty)) 1098 1123 return -EIO; 1099 1124 1100 - spin_lock_irqsave(&info->slock, flags); 1125 + guard(spinlock_irqsave)(&info->slock); 1101 1126 1102 1127 if (set & TIOCM_RTS) 1103 1128 info->MCR |= UART_MCR_RTS; ··· 1109 1136 info->MCR &= ~UART_MCR_DTR; 1110 1137 1111 1138 outb(info->MCR, info->ioaddr + UART_MCR); 1112 - spin_unlock_irqrestore(&info->slock, flags); 1139 + 1113 1140 return 0; 1114 1141 } 1115 1142 ··· 1117 1144 struct async_icount *cprev) 1118 1145 { 1119 1146 struct async_icount cnow; 1120 - unsigned long flags; 1121 1147 int ret; 1122 1148 1123 - spin_lock_irqsave(&info->slock, flags); 1124 - cnow = info->icount; /* atomic copy */ 1125 - spin_unlock_irqrestore(&info->slock, flags); 1149 + /* atomic copy */ 1150 + scoped_guard(spinlock_irqsave, &info->slock) 1151 + cnow = info->icount; 1126 1152 1127 1153 ret = ((arg & TIOCM_RNG) && (cnow.rng != cprev->rng)) || 1128 1154 ((arg & TIOCM_DSR) && (cnow.dsr != cprev->dsr)) || ··· 1151 1179 if (opmode & ~OP_MODE_MASK) 1152 1180 return -EINVAL; 1153 1181 1154 - spin_lock_irq(&port->slock); 1182 + guard(spinlock_irq)(&port->slock); 1155 1183 val = inb(port->opmode_ioaddr); 1156 1184 val &= ~(OP_MODE_MASK << shiftbit); 1157 1185 val |= (opmode << shiftbit); 1158 1186 outb(val, port->opmode_ioaddr); 1159 - spin_unlock_irq(&port->slock); 1160 1187 1161 1188 return 0; 1162 1189 } 1163 1190 1164 - spin_lock_irq(&port->slock); 1165 - opmode = inb(port->opmode_ioaddr) >> shiftbit; 1166 - spin_unlock_irq(&port->slock); 1191 + scoped_guard(spinlock_irq, &port->slock) 1192 + opmode = inb(port->opmode_ioaddr) >> shiftbit; 1167 1193 1168 1194 return put_user(opmode & OP_MODE_MASK, u_opmode); 1169 1195 } ··· 1171 1201 { 1172 1202 struct mxser_port *info = tty->driver_data; 1173 1203 struct async_icount cnow; 1174 - unsigned long flags; 1175 1204 void __user *argp = (void __user *)arg; 1176 1205 1177 1206 if (cmd == MOXA_SET_OP_MODE || cmd == MOXA_GET_OP_MODE) ··· 1190 1221 * Caller should use TIOCGICOUNT to see which one it was 1191 1222 */ 1192 1223 case TIOCMIWAIT: 1193 - spin_lock_irqsave(&info->slock, flags); 1194 - cnow = info->icount; /* note the counters on entry */ 1195 - spin_unlock_irqrestore(&info->slock, flags); 1224 + /* note the counters on entry */ 1225 + scoped_guard(spinlock_irqsave, &info->slock) 1226 + cnow = info->icount; 1196 1227 1197 1228 return wait_event_interruptible(info->port.delta_msr_wait, 1198 1229 mxser_cflags_changed(info, arg, &cnow)); ··· 1215 1246 { 1216 1247 struct mxser_port *info = tty->driver_data; 1217 1248 struct async_icount cnow; 1218 - unsigned long flags; 1219 1249 1220 - spin_lock_irqsave(&info->slock, flags); 1221 - cnow = info->icount; 1222 - spin_unlock_irqrestore(&info->slock, flags); 1250 + scoped_guard(spinlock_irqsave, &info->slock) 1251 + cnow = info->icount; 1223 1252 1224 1253 icount->frame = cnow.frame; 1225 1254 icount->brk = cnow.brk; ··· 1295 1328 static void mxser_stop(struct tty_struct *tty) 1296 1329 { 1297 1330 struct mxser_port *info = tty->driver_data; 1298 - unsigned long flags; 1299 1331 1300 - spin_lock_irqsave(&info->slock, flags); 1332 + guard(spinlock_irqsave)(&info->slock); 1301 1333 if (info->IER & UART_IER_THRI) 1302 1334 __mxser_stop_tx(info); 1303 - spin_unlock_irqrestore(&info->slock, flags); 1304 1335 } 1305 1336 1306 1337 static void mxser_start(struct tty_struct *tty) 1307 1338 { 1308 1339 struct mxser_port *info = tty->driver_data; 1309 - unsigned long flags; 1310 1340 1311 - spin_lock_irqsave(&info->slock, flags); 1341 + guard(spinlock_irqsave)(&info->slock); 1312 1342 if (!kfifo_is_empty(&info->port.xmit_fifo)) 1313 1343 __mxser_start_tx(info); 1314 - spin_unlock_irqrestore(&info->slock, flags); 1315 1344 } 1316 1345 1317 1346 static void mxser_set_termios(struct tty_struct *tty, 1318 1347 const struct ktermios *old_termios) 1319 1348 { 1320 1349 struct mxser_port *info = tty->driver_data; 1321 - unsigned long flags; 1322 1350 1323 - spin_lock_irqsave(&info->slock, flags); 1324 - mxser_change_speed(tty, old_termios); 1325 - spin_unlock_irqrestore(&info->slock, flags); 1351 + scoped_guard(spinlock_irqsave, &info->slock) 1352 + mxser_change_speed(tty, old_termios); 1326 1353 1327 1354 if ((old_termios->c_cflag & CRTSCTS) && !C_CRTSCTS(tty)) { 1328 1355 tty->hw_stopped = false; ··· 1328 1367 tty->flow.stopped = 0; 1329 1368 1330 1369 if (info->board->must_hwid) { 1331 - spin_lock_irqsave(&info->slock, flags); 1370 + guard(spinlock_irqsave)(&info->slock); 1332 1371 mxser_must_set_rx_sw_flow_control(info->ioaddr, false); 1333 - spin_unlock_irqrestore(&info->slock, flags); 1334 1372 } 1335 1373 1336 1374 mxser_start(tty); ··· 1338 1378 1339 1379 static bool mxser_tx_empty(struct mxser_port *info) 1340 1380 { 1341 - unsigned long flags; 1342 - u8 lsr; 1343 - 1344 - spin_lock_irqsave(&info->slock, flags); 1345 - lsr = inb(info->ioaddr + UART_LSR); 1346 - spin_unlock_irqrestore(&info->slock, flags); 1347 - 1348 - return !(lsr & UART_LSR_TEMT); 1381 + guard(spinlock_irqsave)(&info->slock); 1382 + return !(inb(info->ioaddr + UART_LSR) & UART_LSR_TEMT); 1349 1383 } 1350 1384 1351 1385 /* ··· 1413 1459 static int mxser_rs_break(struct tty_struct *tty, int break_state) 1414 1460 { 1415 1461 struct mxser_port *info = tty->driver_data; 1416 - unsigned long flags; 1417 1462 u8 lcr; 1418 1463 1419 - spin_lock_irqsave(&info->slock, flags); 1464 + guard(spinlock_irqsave)(&info->slock); 1420 1465 lcr = inb(info->ioaddr + UART_LCR); 1421 1466 if (break_state == -1) 1422 1467 lcr |= UART_LCR_SBC; 1423 1468 else 1424 1469 lcr &= ~UART_LCR_SBC; 1425 1470 outb(lcr, info->ioaddr + UART_LCR); 1426 - spin_unlock_irqrestore(&info->slock, flags); 1427 1471 1428 1472 return 0; 1429 1473 } ··· 1552 1600 1553 1601 static bool mxser_port_isr(struct mxser_port *port) 1554 1602 { 1555 - struct tty_struct *tty; 1556 1603 u8 iir, status; 1557 - bool error = false; 1558 1604 1559 1605 iir = inb(port->ioaddr + UART_IIR); 1560 1606 if (iir & UART_IIR_NO_INT) 1561 1607 return true; 1562 1608 1563 1609 iir &= MOXA_MUST_IIR_MASK; 1564 - tty = tty_port_tty_get(&port->port); 1565 - if (!tty) { 1566 - status = inb(port->ioaddr + UART_LSR); 1567 - outb(port->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, 1568 - port->ioaddr + UART_FCR); 1569 - inb(port->ioaddr + UART_MSR); 1570 1610 1571 - error = true; 1572 - goto put_tty; 1611 + scoped_guard(tty_port_tty, &port->port) { 1612 + struct tty_struct *tty = scoped_tty(); 1613 + 1614 + status = inb(port->ioaddr + UART_LSR); 1615 + 1616 + if (port->board->must_hwid) { 1617 + if (iir == MOXA_MUST_IIR_GDA || 1618 + iir == MOXA_MUST_IIR_RDA || 1619 + iir == MOXA_MUST_IIR_RTO || 1620 + iir == MOXA_MUST_IIR_LSR) 1621 + status = mxser_receive_chars(tty, port, status); 1622 + } else { 1623 + status &= port->read_status_mask; 1624 + if (status & UART_LSR_DR) 1625 + status = mxser_receive_chars(tty, port, status); 1626 + } 1627 + 1628 + mxser_check_modem_status(tty, port); 1629 + 1630 + if (port->board->must_hwid) { 1631 + if (iir == 0x02 && (status & UART_LSR_THRE)) 1632 + mxser_transmit_chars(tty, port); 1633 + } else { 1634 + if (status & UART_LSR_THRE) 1635 + mxser_transmit_chars(tty, port); 1636 + } 1637 + 1638 + return false; 1573 1639 } 1574 1640 1575 1641 status = inb(port->ioaddr + UART_LSR); 1642 + outb(port->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, 1643 + port->ioaddr + UART_FCR); 1644 + inb(port->ioaddr + UART_MSR); 1576 1645 1577 - if (port->board->must_hwid) { 1578 - if (iir == MOXA_MUST_IIR_GDA || 1579 - iir == MOXA_MUST_IIR_RDA || 1580 - iir == MOXA_MUST_IIR_RTO || 1581 - iir == MOXA_MUST_IIR_LSR) 1582 - status = mxser_receive_chars(tty, port, status); 1583 - } else { 1584 - status &= port->read_status_mask; 1585 - if (status & UART_LSR_DR) 1586 - status = mxser_receive_chars(tty, port, status); 1587 - } 1588 - 1589 - mxser_check_modem_status(tty, port); 1590 - 1591 - if (port->board->must_hwid) { 1592 - if (iir == 0x02 && (status & UART_LSR_THRE)) 1593 - mxser_transmit_chars(tty, port); 1594 - } else { 1595 - if (status & UART_LSR_THRE) 1596 - mxser_transmit_chars(tty, port); 1597 - } 1598 - 1599 - put_tty: 1600 - tty_kref_put(tty); 1601 - 1602 - return error; 1646 + return true; 1603 1647 } 1604 1648 1605 1649 /* ··· 1624 1676 port = &brd->ports[i]; 1625 1677 1626 1678 int_cnt = 0; 1627 - spin_lock(&port->slock); 1679 + guard(spinlock)(&port->slock); 1628 1680 do { 1629 1681 if (mxser_port_isr(port)) 1630 1682 break; 1631 1683 } while (int_cnt++ < MXSER_ISR_PASS_LIMIT); 1632 - spin_unlock(&port->slock); 1633 1684 } 1634 1685 } 1635 1686
+24 -1
drivers/tty/n_gsm.c
··· 461 461 static struct gsm_dlci *gsm_dlci_alloc(struct gsm_mux *gsm, int addr); 462 462 static void gsmld_write_trigger(struct gsm_mux *gsm); 463 463 static void gsmld_write_task(struct work_struct *work); 464 + static int gsm_modem_send_initial_msc(struct gsm_dlci *dlci); 464 465 465 466 /** 466 467 * gsm_fcs_add - update FCS ··· 2175 2174 pr_debug("DLCI %d goes open.\n", dlci->addr); 2176 2175 /* Send current modem state */ 2177 2176 if (dlci->addr) { 2178 - gsm_modem_update(dlci, 0); 2177 + gsm_modem_send_initial_msc(dlci); 2179 2178 } else { 2180 2179 /* Start keep-alive control */ 2181 2180 gsm->ka_num = 0; ··· 4160 4159 if (ctrl == NULL) 4161 4160 return -ENOMEM; 4162 4161 return gsm_control_wait(dlci->gsm, ctrl); 4162 + } 4163 + 4164 + /** 4165 + * gsm_modem_send_initial_msc - Send initial modem status message 4166 + * 4167 + * @dlci channel 4168 + * 4169 + * Send an initial MSC message after DLCI open to set the initial 4170 + * modem status lines. This is only done for basic mode. 4171 + * Does not wait for a response as we cannot block the input queue 4172 + * processing. 4173 + */ 4174 + static int gsm_modem_send_initial_msc(struct gsm_dlci *dlci) 4175 + { 4176 + u8 modembits[2]; 4177 + 4178 + if (dlci->adaption != 1 || dlci->gsm->encoding != GSM_BASIC_OPT) 4179 + return 0; 4180 + 4181 + modembits[0] = (dlci->addr << 2) | 2 | EA; /* DLCI, Valid, EA */ 4182 + modembits[1] = (gsm_encode_modem(dlci) << 1) | EA; 4183 + return gsm_control_command(dlci->gsm, CMD_MSC, (const u8 *)&modembits, 2); 4163 4184 } 4164 4185 4165 4186 /**
+3 -8
drivers/tty/serdev/core.c
··· 399 399 const struct serdev_device_driver *sdrv = to_serdev_device_driver(dev->driver); 400 400 int ret; 401 401 402 - ret = dev_pm_domain_attach(dev, PD_FLAG_ATTACH_POWER_ON); 402 + ret = dev_pm_domain_attach(dev, PD_FLAG_ATTACH_POWER_ON | 403 + PD_FLAG_DETACH_POWER_OFF); 403 404 if (ret) 404 405 return ret; 405 406 406 - ret = sdrv->probe(to_serdev_device(dev)); 407 - if (ret) 408 - dev_pm_domain_detach(dev, true); 409 - 410 - return ret; 407 + return sdrv->probe(to_serdev_device(dev)); 411 408 } 412 409 413 410 static void serdev_drv_remove(struct device *dev) ··· 412 415 const struct serdev_device_driver *sdrv = to_serdev_device_driver(dev->driver); 413 416 if (sdrv->remove) 414 417 sdrv->remove(to_serdev_device(dev)); 415 - 416 - dev_pm_domain_detach(dev, true); 417 418 } 418 419 419 420 static const struct bus_type serdev_bus_type = {
+5
drivers/tty/serial/8250/8250.h
··· 186 186 187 187 void serial8250_clear_and_reinit_fifos(struct uart_8250_port *p); 188 188 189 + void serial8250_rpm_get(struct uart_8250_port *p); 190 + void serial8250_rpm_put(struct uart_8250_port *p); 191 + DEFINE_GUARD(serial8250_rpm, struct uart_8250_port *, 192 + serial8250_rpm_get(_T), serial8250_rpm_put(_T)); 193 + 189 194 static inline u32 serial_dl_read(struct uart_8250_port *up) 190 195 { 191 196 return up->dl_read(up);
+37 -56
drivers/tty/serial/8250/8250_core.c
··· 72 72 struct list_head *l, *end = NULL; 73 73 int pass_counter = 0, handled = 0; 74 74 75 - spin_lock(&i->lock); 75 + guard(spinlock)(&i->lock); 76 76 77 77 l = i->head; 78 78 do { ··· 90 90 if (l == i->head && pass_counter++ > PASS_LIMIT) 91 91 break; 92 92 } while (l != end); 93 - 94 - spin_unlock(&i->lock); 95 93 96 94 return IRQ_RETVAL(handled); 97 95 } ··· 130 132 { 131 133 struct irq_info *i; 132 134 133 - mutex_lock(&hash_mutex); 135 + guard(mutex)(&hash_mutex); 134 136 135 137 hash_for_each_possible(irq_lists, i, node, up->port.irq) 136 138 if (i->irq == up->port.irq) 137 - goto unlock; 139 + return i; 138 140 139 141 i = kzalloc(sizeof(*i), GFP_KERNEL); 140 - if (i == NULL) { 141 - i = ERR_PTR(-ENOMEM); 142 - goto unlock; 143 - } 142 + if (i == NULL) 143 + return ERR_PTR(-ENOMEM); 144 + 144 145 spin_lock_init(&i->lock); 145 146 i->irq = up->port.irq; 146 147 hash_add(irq_lists, &i->node, i->irq); 147 - unlock: 148 - mutex_unlock(&hash_mutex); 149 148 150 149 return i; 151 150 } ··· 156 161 if (IS_ERR(i)) 157 162 return PTR_ERR(i); 158 163 159 - spin_lock_irq(&i->lock); 164 + scoped_guard(spinlock_irq, &i->lock) { 165 + if (i->head) { 166 + list_add(&up->list, i->head); 160 167 161 - if (i->head) { 162 - list_add(&up->list, i->head); 163 - spin_unlock_irq(&i->lock); 168 + return 0; 169 + } 164 170 165 - ret = 0; 166 - } else { 167 171 INIT_LIST_HEAD(&up->list); 168 172 i->head = &up->list; 169 - spin_unlock_irq(&i->lock); 170 - ret = request_irq(up->port.irq, serial8250_interrupt, 171 - up->port.irqflags, up->port.name, i); 172 - if (ret < 0) 173 - serial_do_unlink(i, up); 174 173 } 174 + 175 + ret = request_irq(up->port.irq, serial8250_interrupt, up->port.irqflags, up->port.name, i); 176 + if (ret < 0) 177 + serial_do_unlink(i, up); 175 178 176 179 return ret; 177 180 } ··· 178 185 { 179 186 struct irq_info *i; 180 187 181 - mutex_lock(&hash_mutex); 188 + guard(mutex)(&hash_mutex); 182 189 183 190 hash_for_each_possible(irq_lists, i, node, up->port.irq) 184 - if (i->irq == up->port.irq) 185 - break; 191 + if (i->irq == up->port.irq) { 192 + if (WARN_ON(i->head == NULL)) 193 + return; 186 194 187 - BUG_ON(i == NULL); 188 - BUG_ON(i->head == NULL); 195 + if (list_empty(i->head)) 196 + free_irq(up->port.irq, i); 189 197 190 - if (list_empty(i->head)) 191 - free_irq(up->port.irq, i); 198 + serial_do_unlink(i, up); 192 199 193 - serial_do_unlink(i, up); 194 - mutex_unlock(&hash_mutex); 200 + return; 201 + } 202 + 203 + WARN_ON(1); 195 204 } 196 205 197 206 /* ··· 302 307 serial_unlink_irq_chain(up); 303 308 } 304 309 305 - const struct uart_ops *univ8250_port_base_ops = NULL; 310 + const struct uart_ops *univ8250_port_base_ops; 306 311 struct uart_ops univ8250_port_ops; 307 312 308 313 static const struct uart_8250_ops univ8250_driver_ops = { ··· 665 670 666 671 static void serial_8250_overrun_backoff_work(struct work_struct *work) 667 672 { 668 - struct uart_8250_port *up = 669 - container_of(to_delayed_work(work), struct uart_8250_port, 670 - overrun_backoff); 671 - struct uart_port *port = &up->port; 672 - unsigned long flags; 673 + struct uart_8250_port *up = container_of(to_delayed_work(work), struct uart_8250_port, 674 + overrun_backoff); 673 675 674 - uart_port_lock_irqsave(port, &flags); 676 + guard(uart_port_lock_irqsave)(&up->port); 675 677 up->ier |= UART_IER_RLSI | UART_IER_RDI; 676 678 serial_out(up, UART_IER, up->ier); 677 - uart_port_unlock_irqrestore(port, flags); 678 679 } 679 680 680 681 /** ··· 689 698 int serial8250_register_8250_port(const struct uart_8250_port *up) 690 699 { 691 700 struct uart_8250_port *uart; 692 - int ret = -ENOSPC; 701 + int ret; 693 702 694 703 if (up->port.uartclk == 0) 695 704 return -EINVAL; 696 705 697 - mutex_lock(&serial_mutex); 706 + guard(mutex)(&serial_mutex); 698 707 699 708 uart = serial8250_find_match_or_unused(&up->port); 700 709 if (!uart) { ··· 704 713 */ 705 714 uart = serial8250_setup_port(nr_uarts); 706 715 if (!uart) 707 - goto unlock; 716 + return -ENOSPC; 708 717 nr_uarts++; 709 718 } 710 719 711 720 /* Check if it is CIR already. We check this below again, see there why. */ 712 - if (uart->port.type == PORT_8250_CIR) { 713 - ret = -ENODEV; 714 - goto unlock; 715 - } 721 + if (uart->port.type == PORT_8250_CIR) 722 + return -ENODEV; 716 723 717 724 if (uart->port.dev) 718 725 uart_remove_one_port(&serial8250_reg, &uart->port); ··· 844 855 uart->overrun_backoff_time_ms = 0; 845 856 } 846 857 847 - unlock: 848 - mutex_unlock(&serial_mutex); 849 - 850 858 return ret; 851 859 852 860 err: 853 861 uart->port.dev = NULL; 854 - mutex_unlock(&serial_mutex); 855 862 return ret; 856 863 } 857 864 EXPORT_SYMBOL(serial8250_register_8250_port); ··· 863 878 { 864 879 struct uart_8250_port *uart = &serial8250_ports[line]; 865 880 866 - mutex_lock(&serial_mutex); 881 + guard(mutex)(&serial_mutex); 867 882 868 883 if (uart->em485) { 869 - unsigned long flags; 870 - 871 - uart_port_lock_irqsave(&uart->port, &flags); 884 + guard(uart_port_lock_irqsave)(&uart->port); 872 885 serial8250_em485_destroy(uart); 873 - uart_port_unlock_irqrestore(&uart->port, flags); 874 886 } 875 887 876 888 uart_remove_one_port(&serial8250_reg, &uart->port); ··· 883 901 } else { 884 902 uart->port.dev = NULL; 885 903 } 886 - mutex_unlock(&serial_mutex); 887 904 } 888 905 EXPORT_SYMBOL(serial8250_unregister_port); 889 906
+97 -86
drivers/tty/serial/8250/8250_omap.c
··· 27 27 #include <linux/pm_wakeirq.h> 28 28 #include <linux/dma-mapping.h> 29 29 #include <linux/sys_soc.h> 30 + #include <linux/reboot.h> 31 + #include <linux/pinctrl/consumer.h> 30 32 31 33 #include "8250.h" 32 34 ··· 147 145 spinlock_t rx_dma_lock; 148 146 bool rx_dma_broken; 149 147 bool throttled; 148 + 149 + struct pinctrl *pinctrl; 150 + struct pinctrl_state *pinctrl_wakeup; 150 151 }; 151 152 152 153 struct omap8250_dma_params { ··· 374 369 serial8250_em485_stop_tx(up, true); 375 370 } 376 371 377 - /* 378 - * OMAP can use "CLK / (16 or 13) / div" for baud rate. And then we have have 379 - * some differences in how we want to handle flow control. 380 - */ 381 - static void omap_8250_set_termios(struct uart_port *port, 382 - struct ktermios *termios, 383 - const struct ktermios *old) 372 + static void omap_8250_set_termios_atomic(struct uart_port *port, struct ktermios *termios, 373 + const struct ktermios *old, unsigned int baud) 384 374 { 385 375 struct uart_8250_port *up = up_to_u8250p(port); 386 376 struct omap8250_priv *priv = port->private_data; 387 - unsigned char cval = 0; 388 - unsigned int baud; 377 + u8 cval; 389 378 390 379 cval = UART_LCR_WLEN(tty_get_char_size(termios->c_cflag)); 391 380 ··· 392 393 if (termios->c_cflag & CMSPAR) 393 394 cval |= UART_LCR_SPAR; 394 395 395 - /* 396 - * Ask the core to calculate the divisor for us. 397 - */ 398 - baud = uart_get_baud_rate(port, termios, old, 399 - port->uartclk / 16 / UART_DIV_MAX, 400 - port->uartclk / 13); 401 396 omap_8250_get_divisor(port, baud, priv); 402 397 403 398 /* 404 399 * Ok, we're now changing the port state. Do it with 405 400 * interrupts disabled. 406 401 */ 407 - pm_runtime_get_sync(port->dev); 408 - uart_port_lock_irq(port); 402 + guard(serial8250_rpm)(up); 403 + guard(uart_port_lock_irq)(port); 409 404 410 405 /* 411 406 * Update the per-port timeout. ··· 507 514 } 508 515 } 509 516 omap8250_restore_regs(up); 517 + } 510 518 511 - uart_port_unlock_irq(&up->port); 512 - pm_runtime_mark_last_busy(port->dev); 513 - pm_runtime_put_autosuspend(port->dev); 519 + /* 520 + * OMAP can use "CLK / (16 or 13) / div" for baud rate. And then we have have 521 + * some differences in how we want to handle flow control. 522 + */ 523 + static void omap_8250_set_termios(struct uart_port *port, 524 + struct ktermios *termios, 525 + const struct ktermios *old) 526 + { 527 + struct omap8250_priv *priv = port->private_data; 528 + unsigned int baud; 529 + 530 + /* 531 + * Ask the core to calculate the divisor for us. 532 + */ 533 + baud = uart_get_baud_rate(port, termios, old, 534 + port->uartclk / 16 / UART_DIV_MAX, 535 + port->uartclk / 13); 536 + 537 + omap_8250_set_termios_atomic(port, termios, old, baud); 514 538 515 539 /* calculate wakeup latency constraint */ 516 540 priv->calc_latency = USEC_PER_SEC * 64 * 8 / baud; ··· 547 537 struct uart_8250_port *up = up_to_u8250p(port); 548 538 u8 efr; 549 539 550 - pm_runtime_get_sync(port->dev); 551 - 540 + guard(serial8250_rpm)(up); 552 541 /* Synchronize UART_IER access against the console. */ 553 - uart_port_lock_irq(port); 542 + guard(uart_port_lock_irq)(port); 554 543 555 544 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); 556 545 efr = serial_in(up, UART_EFR); ··· 560 551 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); 561 552 serial_out(up, UART_EFR, efr); 562 553 serial_out(up, UART_LCR, 0); 563 - 564 - uart_port_unlock_irq(port); 565 - 566 - pm_runtime_mark_last_busy(port->dev); 567 - pm_runtime_put_autosuspend(port->dev); 568 554 } 569 555 570 556 static void omap_serial_fill_features_erratas(struct uart_8250_port *up, ··· 731 727 return ret; 732 728 } 733 729 734 - pm_runtime_get_sync(port->dev); 730 + #ifdef CONFIG_PM 731 + up->capabilities |= UART_CAP_RPM; 732 + #endif 733 + 734 + guard(serial8250_rpm)(up); 735 735 736 736 serial_out(up, UART_FCR, UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); 737 737 ··· 758 750 } 759 751 760 752 /* Synchronize UART_IER access against the console. */ 761 - uart_port_lock_irq(port); 762 - up->ier = UART_IER_RLSI | UART_IER_RDI; 763 - serial_out(up, UART_IER, up->ier); 764 - uart_port_unlock_irq(port); 765 - 766 - #ifdef CONFIG_PM 767 - up->capabilities |= UART_CAP_RPM; 768 - #endif 753 + scoped_guard(uart_port_lock_irq, port) { 754 + up->ier = UART_IER_RLSI | UART_IER_RDI; 755 + serial_out(up, UART_IER, up->ier); 756 + } 769 757 770 758 /* Enable module level wake up */ 771 759 priv->wer = OMAP_UART_WER_MOD_WKUP; ··· 770 766 serial_out(up, UART_OMAP_WER, priv->wer); 771 767 772 768 if (up->dma && !(priv->habit & UART_HAS_EFR2)) { 773 - uart_port_lock_irq(port); 769 + guard(uart_port_lock_irq)(port); 774 770 up->dma->rx_dma(up); 775 - uart_port_unlock_irq(port); 776 771 } 777 772 778 773 enable_irq(port->irq); 779 774 780 - pm_runtime_mark_last_busy(port->dev); 781 - pm_runtime_put_autosuspend(port->dev); 782 775 return 0; 783 776 } 784 777 ··· 784 783 struct uart_8250_port *up = up_to_u8250p(port); 785 784 struct omap8250_priv *priv = port->private_data; 786 785 787 - pm_runtime_get_sync(port->dev); 786 + guard(serial8250_rpm)(up); 788 787 789 788 flush_work(&priv->qos_work); 790 789 if (up->dma) ··· 795 794 serial_out(up, UART_OMAP_EFR2, 0x0); 796 795 797 796 /* Synchronize UART_IER access against the console. */ 798 - uart_port_lock_irq(port); 799 - up->ier = 0; 800 - serial_out(up, UART_IER, 0); 801 - uart_port_unlock_irq(port); 797 + scoped_guard(uart_port_lock_irq, port) { 798 + up->ier = 0; 799 + serial_out(up, UART_IER, 0); 800 + } 801 + 802 802 disable_irq_nosync(port->irq); 803 803 dev_pm_clear_wake_irq(port->dev); 804 804 ··· 812 810 if (up->lcr & UART_LCR_SBC) 813 811 serial_out(up, UART_LCR, up->lcr & ~UART_LCR_SBC); 814 812 serial_out(up, UART_FCR, UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); 815 - 816 - pm_runtime_mark_last_busy(port->dev); 817 - pm_runtime_put_autosuspend(port->dev); 818 813 } 819 814 820 815 static void omap_8250_throttle(struct uart_port *port) 821 816 { 822 817 struct omap8250_priv *priv = port->private_data; 823 - unsigned long flags; 824 818 825 - pm_runtime_get_sync(port->dev); 819 + guard(serial8250_rpm)(up_to_u8250p(port)); 820 + guard(uart_port_lock_irqsave)(port); 826 821 827 - uart_port_lock_irqsave(port, &flags); 828 822 port->ops->stop_rx(port); 829 823 priv->throttled = true; 830 - uart_port_unlock_irqrestore(port, flags); 831 - 832 - pm_runtime_mark_last_busy(port->dev); 833 - pm_runtime_put_autosuspend(port->dev); 834 824 } 835 825 836 826 static void omap_8250_unthrottle(struct uart_port *port) 837 827 { 838 828 struct omap8250_priv *priv = port->private_data; 839 829 struct uart_8250_port *up = up_to_u8250p(port); 840 - unsigned long flags; 841 830 842 - pm_runtime_get_sync(port->dev); 843 - 831 + guard(serial8250_rpm)(up); 844 832 /* Synchronize UART_IER access against the console. */ 845 - uart_port_lock_irqsave(port, &flags); 833 + guard(uart_port_lock_irqsave)(port); 834 + 846 835 priv->throttled = false; 847 836 if (up->dma) 848 837 up->dma->rx_dma(up); 849 838 up->ier |= UART_IER_RLSI | UART_IER_RDI; 850 839 serial_out(up, UART_IER, up->ier); 851 - uart_port_unlock_irqrestore(port, flags); 852 - 853 - pm_runtime_mark_last_busy(port->dev); 854 - pm_runtime_put_autosuspend(port->dev); 855 840 } 856 841 857 842 static int omap8250_rs485_config(struct uart_port *port, ··· 976 987 struct omap8250_priv *priv = p->port.private_data; 977 988 struct uart_8250_dma *dma = p->dma; 978 989 struct dma_tx_state state; 979 - unsigned long flags; 980 990 981 991 /* Synchronize UART_IER access against the console. */ 982 - uart_port_lock_irqsave(&p->port, &flags); 992 + guard(uart_port_lock_irqsave)(&p->port); 983 993 984 994 /* 985 995 * If the tx status is not DMA_COMPLETE, then this is a delayed 986 996 * completion callback. A previous RX timeout flush would have 987 997 * already pushed the data, so exit. 988 998 */ 989 - if (dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state) != 990 - DMA_COMPLETE) { 991 - uart_port_unlock_irqrestore(&p->port, flags); 999 + if (dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state) != DMA_COMPLETE) 992 1000 return; 993 - } 994 - __dma_rx_do_complete(p); 995 - if (!priv->throttled) { 996 - p->ier |= UART_IER_RLSI | UART_IER_RDI; 997 - serial_out(p, UART_IER, p->ier); 998 - if (!(priv->habit & UART_HAS_EFR2)) 999 - omap_8250_rx_dma(p); 1000 - } 1001 1001 1002 - uart_port_unlock_irqrestore(&p->port, flags); 1002 + __dma_rx_do_complete(p); 1003 + if (priv->throttled) 1004 + return; 1005 + 1006 + p->ier |= UART_IER_RLSI | UART_IER_RDI; 1007 + serial_out(p, UART_IER, p->ier); 1008 + if (!(priv->habit & UART_HAS_EFR2)) 1009 + omap_8250_rx_dma(p); 1003 1010 } 1004 1011 1005 1012 static void omap_8250_rx_dma_flush(struct uart_8250_port *p) ··· 1093 1108 struct uart_8250_port *p = param; 1094 1109 struct uart_8250_dma *dma = p->dma; 1095 1110 struct tty_port *tport = &p->port.state->port; 1096 - unsigned long flags; 1097 1111 bool en_thri = false; 1098 1112 struct omap8250_priv *priv = p->port.private_data; 1099 1113 1100 1114 dma_sync_single_for_cpu(dma->txchan->device->dev, dma->tx_addr, 1101 1115 UART_XMIT_SIZE, DMA_TO_DEVICE); 1102 1116 1103 - uart_port_lock_irqsave(&p->port, &flags); 1117 + guard(uart_port_lock_irqsave)(&p->port); 1104 1118 1105 1119 dma->tx_running = 0; 1106 1120 ··· 1127 1143 dma->tx_err = 1; 1128 1144 serial8250_set_THRI(p); 1129 1145 } 1130 - 1131 - uart_port_unlock_irqrestore(&p->port, flags); 1132 1146 } 1133 1147 1134 1148 static int omap_8250_tx_dma(struct uart_8250_port *p) ··· 1354 1372 return 0; 1355 1373 } 1356 1374 1375 + static int omap8250_select_wakeup_pinctrl(struct device *dev, 1376 + struct omap8250_priv *priv) 1377 + { 1378 + if (IS_ERR_OR_NULL(priv->pinctrl_wakeup)) 1379 + return 0; 1380 + 1381 + if (!device_may_wakeup(dev)) 1382 + return 0; 1383 + 1384 + return pinctrl_select_state(priv->pinctrl, priv->pinctrl_wakeup); 1385 + } 1386 + 1357 1387 static struct omap8250_dma_params am654_dma = { 1358 1388 .rx_size = SZ_2K, 1359 1389 .rx_trigger = 1, ··· 1590 1596 priv->line = ret; 1591 1597 pm_runtime_mark_last_busy(&pdev->dev); 1592 1598 pm_runtime_put_autosuspend(&pdev->dev); 1599 + 1600 + priv->pinctrl = devm_pinctrl_get(&pdev->dev); 1601 + if (!IS_ERR_OR_NULL(priv->pinctrl)) 1602 + priv->pinctrl_wakeup = pinctrl_lookup_state(priv->pinctrl, "wakeup"); 1603 + 1593 1604 return 0; 1594 1605 err: 1595 1606 pm_runtime_dont_use_autosuspend(&pdev->dev); ··· 1652 1653 struct uart_8250_port *up = serial8250_get_port(priv->line); 1653 1654 int err = 0; 1654 1655 1656 + err = omap8250_select_wakeup_pinctrl(dev, priv); 1657 + if (err) { 1658 + dev_err(dev, "Failed to select wakeup pinctrl, aborting suspend %pe\n", 1659 + ERR_PTR(err)); 1660 + return err; 1661 + } 1662 + 1655 1663 serial8250_suspend_port(priv->line); 1656 1664 1657 1665 err = pm_runtime_resume_and_get(dev); ··· 1679 1673 struct omap8250_priv *priv = dev_get_drvdata(dev); 1680 1674 struct uart_8250_port *up = serial8250_get_port(priv->line); 1681 1675 int err; 1676 + 1677 + err = pinctrl_select_default_state(dev); 1678 + if (err) { 1679 + dev_err(dev, "Failed to select default pinctrl state on resume: %pe\n", 1680 + ERR_PTR(err)); 1681 + return err; 1682 + } 1682 1683 1683 1684 if (uart_console(&up->port) && console_suspend_enabled) { 1684 1685 err = pm_runtime_force_resume(dev); ··· 1808 1795 up = serial8250_get_port(priv->line); 1809 1796 1810 1797 if (up && omap8250_lost_context(up)) { 1811 - uart_port_lock_irq(&up->port); 1798 + guard(uart_port_lock_irq)(&up->port); 1812 1799 omap8250_restore_regs(up); 1813 - uart_port_unlock_irq(&up->port); 1814 1800 } 1815 1801 1816 1802 if (up && up->dma && up->dma->rxchan && !(priv->habit & UART_HAS_EFR2)) { 1817 - uart_port_lock_irq(&up->port); 1803 + guard(uart_port_lock_irq)(&up->port); 1818 1804 omap_8250_rx_dma(up); 1819 - uart_port_unlock_irq(&up->port); 1820 1805 } 1821 1806 1822 1807 atomic_set(&priv->active, 1);
+46 -41
drivers/tty/serial/8250/8250_platform.c
··· 10 10 */ 11 11 #include <linux/acpi.h> 12 12 #include <linux/array_size.h> 13 + #include <linux/cleanup.h> 13 14 #include <linux/io.h> 14 15 #include <linux/module.h> 15 16 #include <linux/moduleparam.h> ··· 111 110 static int serial8250_probe_acpi(struct platform_device *pdev) 112 111 { 113 112 struct device *dev = &pdev->dev; 114 - struct uart_8250_port uart = { }; 115 113 struct resource *regs; 116 114 int ret, line; 115 + 116 + struct uart_8250_port *uart __free(kfree) = kzalloc(sizeof(*uart), GFP_KERNEL); 117 + if (!uart) 118 + return -ENOMEM; 117 119 118 120 regs = platform_get_mem_or_io(pdev, 0); 119 121 if (!regs) ··· 124 120 125 121 switch (resource_type(regs)) { 126 122 case IORESOURCE_IO: 127 - uart.port.iobase = regs->start; 123 + uart->port.iobase = regs->start; 128 124 break; 129 125 case IORESOURCE_MEM: 130 - uart.port.mapbase = regs->start; 131 - uart.port.mapsize = resource_size(regs); 132 - uart.port.flags = UPF_IOREMAP; 126 + uart->port.mapbase = regs->start; 127 + uart->port.mapsize = resource_size(regs); 128 + uart->port.flags = UPF_IOREMAP; 133 129 break; 134 130 default: 135 131 return -EINVAL; 136 132 } 137 133 138 134 /* default clock frequency */ 139 - uart.port.uartclk = 1843200; 140 - uart.port.type = PORT_16550A; 141 - uart.port.dev = &pdev->dev; 142 - uart.port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF; 135 + uart->port.uartclk = 1843200; 136 + uart->port.type = PORT_16550A; 137 + uart->port.dev = &pdev->dev; 138 + uart->port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF; 143 139 144 - ret = uart_read_and_validate_port_properties(&uart.port); 140 + ret = uart_read_and_validate_port_properties(&uart->port); 145 141 /* no interrupt -> fall back to polling */ 146 142 if (ret == -ENXIO) 147 143 ret = 0; 148 144 if (ret) 149 145 return ret; 150 146 151 - line = serial8250_register_8250_port(&uart); 147 + line = serial8250_register_8250_port(uart); 152 148 if (line < 0) 153 149 return line; 154 150 ··· 157 153 158 154 static int serial8250_probe_platform(struct platform_device *dev, struct plat_serial8250_port *p) 159 155 { 160 - struct uart_8250_port uart; 161 156 int ret, i, irqflag = 0; 162 157 163 - memset(&uart, 0, sizeof(uart)); 158 + struct uart_8250_port *uart __free(kfree) = kzalloc(sizeof(*uart), GFP_KERNEL); 159 + if (!uart) 160 + return -ENOMEM; 164 161 165 162 if (share_irqs) 166 163 irqflag = IRQF_SHARED; 167 164 168 165 for (i = 0; p && p->flags != 0; p++, i++) { 169 - uart.port.iobase = p->iobase; 170 - uart.port.membase = p->membase; 171 - uart.port.irq = p->irq; 172 - uart.port.irqflags = p->irqflags; 173 - uart.port.uartclk = p->uartclk; 174 - uart.port.regshift = p->regshift; 175 - uart.port.iotype = p->iotype; 176 - uart.port.flags = p->flags; 177 - uart.port.mapbase = p->mapbase; 178 - uart.port.mapsize = p->mapsize; 179 - uart.port.hub6 = p->hub6; 180 - uart.port.has_sysrq = p->has_sysrq; 181 - uart.port.private_data = p->private_data; 182 - uart.port.type = p->type; 183 - uart.bugs = p->bugs; 184 - uart.port.serial_in = p->serial_in; 185 - uart.port.serial_out = p->serial_out; 186 - uart.dl_read = p->dl_read; 187 - uart.dl_write = p->dl_write; 188 - uart.port.handle_irq = p->handle_irq; 189 - uart.port.handle_break = p->handle_break; 190 - uart.port.set_termios = p->set_termios; 191 - uart.port.set_ldisc = p->set_ldisc; 192 - uart.port.get_mctrl = p->get_mctrl; 193 - uart.port.pm = p->pm; 194 - uart.port.dev = &dev->dev; 195 - uart.port.irqflags |= irqflag; 196 - ret = serial8250_register_8250_port(&uart); 166 + uart->port.iobase = p->iobase; 167 + uart->port.membase = p->membase; 168 + uart->port.irq = p->irq; 169 + uart->port.irqflags = p->irqflags; 170 + uart->port.uartclk = p->uartclk; 171 + uart->port.regshift = p->regshift; 172 + uart->port.iotype = p->iotype; 173 + uart->port.flags = p->flags; 174 + uart->port.mapbase = p->mapbase; 175 + uart->port.mapsize = p->mapsize; 176 + uart->port.hub6 = p->hub6; 177 + uart->port.has_sysrq = p->has_sysrq; 178 + uart->port.private_data = p->private_data; 179 + uart->port.type = p->type; 180 + uart->bugs = p->bugs; 181 + uart->port.serial_in = p->serial_in; 182 + uart->port.serial_out = p->serial_out; 183 + uart->dl_read = p->dl_read; 184 + uart->dl_write = p->dl_write; 185 + uart->port.handle_irq = p->handle_irq; 186 + uart->port.handle_break = p->handle_break; 187 + uart->port.set_termios = p->set_termios; 188 + uart->port.set_ldisc = p->set_ldisc; 189 + uart->port.get_mctrl = p->get_mctrl; 190 + uart->port.pm = p->pm; 191 + uart->port.dev = &dev->dev; 192 + uart->port.irqflags |= irqflag; 193 + ret = serial8250_register_8250_port(uart); 197 194 if (ret < 0) { 198 195 dev_err(&dev->dev, "unable to register port at index %d " 199 196 "(IO%lx MEM%llx IRQ%d): %d\n", i,
+123 -177
drivers/tty/serial/8250/8250_port.c
··· 508 508 } 509 509 EXPORT_SYMBOL_GPL(serial8250_clear_and_reinit_fifos); 510 510 511 - static void serial8250_rpm_get(struct uart_8250_port *p) 511 + void serial8250_rpm_get(struct uart_8250_port *p) 512 512 { 513 513 if (!(p->capabilities & UART_CAP_RPM)) 514 514 return; 515 515 pm_runtime_get_sync(p->port.dev); 516 516 } 517 + EXPORT_SYMBOL_GPL(serial8250_rpm_get); 517 518 518 - static void serial8250_rpm_put(struct uart_8250_port *p) 519 + void serial8250_rpm_put(struct uart_8250_port *p) 519 520 { 520 521 if (!(p->capabilities & UART_CAP_RPM)) 521 522 return; 522 523 pm_runtime_mark_last_busy(p->port.dev); 523 524 pm_runtime_put_autosuspend(p->port.dev); 524 525 } 526 + EXPORT_SYMBOL_GPL(serial8250_rpm_put); 525 527 526 528 /** 527 529 * serial8250_em485_init() - put uart_8250_port into rs485 emulating ··· 674 672 { 675 673 unsigned char lcr = 0, efr = 0; 676 674 677 - serial8250_rpm_get(p); 675 + guard(serial8250_rpm)(p); 678 676 679 - if (p->capabilities & UART_CAP_SLEEP) { 680 - /* Synchronize UART_IER access against the console. */ 681 - uart_port_lock_irq(&p->port); 682 - if (p->capabilities & UART_CAP_EFR) { 683 - lcr = serial_in(p, UART_LCR); 684 - efr = serial_in(p, UART_EFR); 685 - serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B); 686 - serial_out(p, UART_EFR, UART_EFR_ECB); 687 - serial_out(p, UART_LCR, 0); 688 - } 689 - serial_out(p, UART_IER, sleep ? UART_IERX_SLEEP : 0); 690 - if (p->capabilities & UART_CAP_EFR) { 691 - serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B); 692 - serial_out(p, UART_EFR, efr); 693 - serial_out(p, UART_LCR, lcr); 694 - } 695 - uart_port_unlock_irq(&p->port); 677 + if (!(p->capabilities & UART_CAP_SLEEP)) 678 + return; 679 + 680 + /* Synchronize UART_IER access against the console. */ 681 + guard(uart_port_lock_irq)(&p->port); 682 + 683 + if (p->capabilities & UART_CAP_EFR) { 684 + lcr = serial_in(p, UART_LCR); 685 + efr = serial_in(p, UART_EFR); 686 + serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B); 687 + serial_out(p, UART_EFR, UART_EFR_ECB); 688 + serial_out(p, UART_LCR, 0); 696 689 } 697 - 698 - serial8250_rpm_put(p); 690 + serial_out(p, UART_IER, sleep ? UART_IERX_SLEEP : 0); 691 + if (p->capabilities & UART_CAP_EFR) { 692 + serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B); 693 + serial_out(p, UART_EFR, efr); 694 + serial_out(p, UART_LCR, lcr); 695 + } 699 696 } 700 697 701 698 /* Clear the interrupt registers. */ ··· 1230 1229 probe_irq_off(probe_irq_on()); 1231 1230 save_mcr = serial8250_in_MCR(up); 1232 1231 /* Synchronize UART_IER access against the console. */ 1233 - uart_port_lock_irq(port); 1234 - save_ier = serial_in(up, UART_IER); 1235 - uart_port_unlock_irq(port); 1232 + scoped_guard(uart_port_lock_irq, port) 1233 + save_ier = serial_in(up, UART_IER); 1236 1234 serial8250_out_MCR(up, UART_MCR_OUT1 | UART_MCR_OUT2); 1237 1235 1238 1236 irqs = probe_irq_on(); ··· 1244 1244 UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2); 1245 1245 } 1246 1246 /* Synchronize UART_IER access against the console. */ 1247 - uart_port_lock_irq(port); 1248 - serial_out(up, UART_IER, UART_IER_ALL_INTR); 1249 - uart_port_unlock_irq(port); 1247 + scoped_guard(uart_port_lock_irq, port) 1248 + serial_out(up, UART_IER, UART_IER_ALL_INTR); 1250 1249 serial8250_clear_interrupts(port); 1251 1250 serial_out(up, UART_TX, 0xFF); 1252 1251 udelay(20); ··· 1253 1254 1254 1255 serial8250_out_MCR(up, save_mcr); 1255 1256 /* Synchronize UART_IER access against the console. */ 1256 - uart_port_lock_irq(port); 1257 - serial_out(up, UART_IER, save_ier); 1258 - uart_port_unlock_irq(port); 1257 + scoped_guard(uart_port_lock_irq, port) 1258 + serial_out(up, UART_IER, save_ier); 1259 1259 1260 1260 if (port->flags & UPF_FOURPORT) 1261 1261 outb_p(save_ICP, ICP); ··· 1269 1271 /* Port locked to synchronize UART_IER access against the console. */ 1270 1272 lockdep_assert_held_once(&port->lock); 1271 1273 1272 - serial8250_rpm_get(up); 1274 + guard(serial8250_rpm)(up); 1273 1275 1274 1276 up->ier &= ~(UART_IER_RLSI | UART_IER_RDI); 1275 1277 serial_port_out(port, UART_IER, up->ier); 1276 - 1277 - serial8250_rpm_put(up); 1278 1278 } 1279 1279 1280 1280 /** ··· 1316 1320 struct uart_8250_em485 *em485 = container_of(t, struct uart_8250_em485, 1317 1321 stop_tx_timer); 1318 1322 struct uart_8250_port *p = em485->port; 1319 - unsigned long flags; 1320 1323 1321 - serial8250_rpm_get(p); 1322 - uart_port_lock_irqsave(&p->port, &flags); 1324 + guard(serial8250_rpm)(p); 1325 + guard(uart_port_lock_irqsave)(&p->port); 1326 + 1323 1327 if (em485->active_timer == &em485->stop_tx_timer) { 1324 1328 p->rs485_stop_tx(p, true); 1325 1329 em485->active_timer = NULL; 1326 1330 em485->tx_stopped = true; 1327 1331 } 1328 - uart_port_unlock_irqrestore(&p->port, flags); 1329 - serial8250_rpm_put(p); 1330 1332 1331 1333 return HRTIMER_NORESTART; 1332 1334 } ··· 1399 1405 { 1400 1406 struct uart_8250_port *up = up_to_u8250p(port); 1401 1407 1402 - serial8250_rpm_get(up); 1408 + guard(serial8250_rpm)(up); 1403 1409 __stop_tx(up); 1404 1410 1405 1411 /* ··· 1409 1415 up->acr |= UART_ACR_TXDIS; 1410 1416 serial_icr_write(up, UART_ACR, up->acr); 1411 1417 } 1412 - serial8250_rpm_put(up); 1413 1418 } 1414 1419 1415 1420 static inline void __start_tx(struct uart_port *port) ··· 1503 1510 struct uart_8250_em485 *em485 = container_of(t, struct uart_8250_em485, 1504 1511 start_tx_timer); 1505 1512 struct uart_8250_port *p = em485->port; 1506 - unsigned long flags; 1507 1513 1508 - uart_port_lock_irqsave(&p->port, &flags); 1514 + guard(uart_port_lock_irqsave)(&p->port); 1515 + 1509 1516 if (em485->active_timer == &em485->start_tx_timer) { 1510 1517 __start_tx(&p->port); 1511 1518 em485->active_timer = NULL; 1512 1519 } 1513 - uart_port_unlock_irqrestore(&p->port, flags); 1514 1520 1515 1521 return HRTIMER_NORESTART; 1516 1522 } ··· 1577 1585 1578 1586 up->ier |= UART_IER_MSI; 1579 1587 1580 - serial8250_rpm_get(up); 1588 + guard(serial8250_rpm)(up); 1581 1589 serial_port_out(port, UART_IER, up->ier); 1582 - serial8250_rpm_put(up); 1583 1590 } 1584 1591 1585 1592 void serial8250_read_char(struct uart_8250_port *up, u16 lsr) ··· 1839 1848 { 1840 1849 struct uart_8250_port *up = up_to_u8250p(port); 1841 1850 unsigned int iir; 1842 - int ret; 1843 1851 1844 - serial8250_rpm_get(up); 1852 + guard(serial8250_rpm)(up); 1845 1853 1846 1854 iir = serial_port_in(port, UART_IIR); 1847 - ret = serial8250_handle_irq(port, iir); 1848 - 1849 - serial8250_rpm_put(up); 1850 - return ret; 1855 + return serial8250_handle_irq(port, iir); 1851 1856 } 1852 1857 1853 1858 /* ··· 1854 1867 */ 1855 1868 static int serial8250_tx_threshold_handle_irq(struct uart_port *port) 1856 1869 { 1857 - unsigned long flags; 1858 1870 unsigned int iir = serial_port_in(port, UART_IIR); 1859 1871 1860 1872 /* TX Threshold IRQ triggered so load up FIFO */ 1861 1873 if ((iir & UART_IIR_ID) == UART_IIR_THRI) { 1862 1874 struct uart_8250_port *up = up_to_u8250p(port); 1863 1875 1864 - uart_port_lock_irqsave(port, &flags); 1876 + guard(uart_port_lock_irqsave)(port); 1865 1877 serial8250_tx_chars(up); 1866 - uart_port_unlock_irqrestore(port, flags); 1867 1878 } 1868 1879 1869 1880 iir = serial_port_in(port, UART_IIR); ··· 1871 1886 static unsigned int serial8250_tx_empty(struct uart_port *port) 1872 1887 { 1873 1888 struct uart_8250_port *up = up_to_u8250p(port); 1874 - unsigned int result = 0; 1875 - unsigned long flags; 1876 1889 1877 - serial8250_rpm_get(up); 1890 + guard(serial8250_rpm)(up); 1891 + guard(uart_port_lock_irqsave)(port); 1878 1892 1879 - uart_port_lock_irqsave(port, &flags); 1880 1893 if (!serial8250_tx_dma_running(up) && uart_lsr_tx_empty(serial_lsr_in(up))) 1881 - result = TIOCSER_TEMT; 1882 - uart_port_unlock_irqrestore(port, flags); 1894 + return TIOCSER_TEMT; 1883 1895 1884 - serial8250_rpm_put(up); 1885 - 1886 - return result; 1896 + return 0; 1887 1897 } 1888 1898 1889 1899 unsigned int serial8250_do_get_mctrl(struct uart_port *port) ··· 1887 1907 unsigned int status; 1888 1908 unsigned int val; 1889 1909 1890 - serial8250_rpm_get(up); 1891 - status = serial8250_modem_status(up); 1892 - serial8250_rpm_put(up); 1910 + scoped_guard(serial8250_rpm, up) 1911 + status = serial8250_modem_status(up); 1893 1912 1894 1913 val = serial8250_MSR_to_TIOCM(status); 1895 1914 if (up->gpios) ··· 1932 1953 static void serial8250_break_ctl(struct uart_port *port, int break_state) 1933 1954 { 1934 1955 struct uart_8250_port *up = up_to_u8250p(port); 1935 - unsigned long flags; 1936 1956 1937 - serial8250_rpm_get(up); 1938 - uart_port_lock_irqsave(port, &flags); 1957 + guard(serial8250_rpm)(up); 1958 + guard(uart_port_lock_irqsave)(port); 1959 + 1939 1960 if (break_state == -1) 1940 1961 up->lcr |= UART_LCR_SBC; 1941 1962 else 1942 1963 up->lcr &= ~UART_LCR_SBC; 1943 1964 serial_port_out(port, UART_LCR, up->lcr); 1944 - uart_port_unlock_irqrestore(port, flags); 1945 - serial8250_rpm_put(up); 1946 1965 } 1947 1966 1948 1967 /* Returns true if @bits were set, false on timeout */ ··· 2000 2023 static int serial8250_get_poll_char(struct uart_port *port) 2001 2024 { 2002 2025 struct uart_8250_port *up = up_to_u8250p(port); 2003 - int status; 2004 2026 u16 lsr; 2005 2027 2006 - serial8250_rpm_get(up); 2028 + guard(serial8250_rpm)(up); 2007 2029 2008 2030 lsr = serial_port_in(port, UART_LSR); 2031 + if (!(lsr & UART_LSR_DR)) 2032 + return NO_POLL_CHAR; 2009 2033 2010 - if (!(lsr & UART_LSR_DR)) { 2011 - status = NO_POLL_CHAR; 2012 - goto out; 2013 - } 2014 - 2015 - status = serial_port_in(port, UART_RX); 2016 - out: 2017 - serial8250_rpm_put(up); 2018 - return status; 2034 + return serial_port_in(port, UART_RX); 2019 2035 } 2020 2036 2021 2037 ··· 2026 2056 * should allow safe lockless usage here. 2027 2057 */ 2028 2058 2029 - serial8250_rpm_get(up); 2059 + guard(serial8250_rpm)(up); 2030 2060 /* 2031 2061 * First save the IER then disable the interrupts 2032 2062 */ ··· 2045 2075 */ 2046 2076 wait_for_xmitr(up, UART_LSR_BOTH_EMPTY); 2047 2077 serial_port_out(port, UART_IER, ier); 2048 - serial8250_rpm_put(up); 2049 2078 } 2050 2079 2051 2080 #endif /* CONFIG_CONSOLE_POLL */ ··· 2052 2083 static void serial8250_startup_special(struct uart_port *port) 2053 2084 { 2054 2085 struct uart_8250_port *up = up_to_u8250p(port); 2055 - unsigned long flags; 2056 2086 2057 2087 switch (port->type) { 2058 - case PORT_16C950: 2088 + case PORT_16C950: { 2059 2089 /* 2060 2090 * Wake up and initialize UART 2061 2091 * 2062 2092 * Synchronize UART_IER access against the console. 2063 2093 */ 2064 - uart_port_lock_irqsave(port, &flags); 2094 + guard(uart_port_lock_irqsave)(port); 2065 2095 up->acr = 0; 2066 2096 serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B); 2067 2097 serial_port_out(port, UART_EFR, UART_EFR_ECB); ··· 2070 2102 serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B); 2071 2103 serial_port_out(port, UART_EFR, UART_EFR_ECB); 2072 2104 serial_port_out(port, UART_LCR, 0); 2073 - uart_port_unlock_irqrestore(port, flags); 2074 2105 break; 2106 + } 2075 2107 case PORT_DA830: 2076 2108 /* 2077 2109 * Reset the port 2078 2110 * 2079 2111 * Synchronize UART_IER access against the console. 2080 2112 */ 2081 - uart_port_lock_irqsave(port, &flags); 2082 - serial_port_out(port, UART_IER, 0); 2083 - serial_port_out(port, UART_DA830_PWREMU_MGMT, 0); 2084 - uart_port_unlock_irqrestore(port, flags); 2113 + scoped_guard(uart_port_lock_irqsave, port) { 2114 + serial_port_out(port, UART_IER, 0); 2115 + serial_port_out(port, UART_DA830_PWREMU_MGMT, 0); 2116 + } 2085 2117 mdelay(10); 2086 2118 2087 2119 /* Enable Tx, Rx and free run mode */ ··· 2139 2171 static void serial8250_THRE_test(struct uart_port *port) 2140 2172 { 2141 2173 struct uart_8250_port *up = up_to_u8250p(port); 2142 - unsigned long flags; 2143 2174 bool iir_noint1, iir_noint2; 2144 2175 2145 2176 if (!port->irq) ··· 2158 2191 * 2159 2192 * Synchronize UART_IER access against the console. 2160 2193 */ 2161 - uart_port_lock_irqsave(port, &flags); 2162 - 2163 - wait_for_xmitr(up, UART_LSR_THRE); 2164 - serial_port_out_sync(port, UART_IER, UART_IER_THRI); 2165 - udelay(1); /* allow THRE to set */ 2166 - iir_noint1 = serial_port_in(port, UART_IIR) & UART_IIR_NO_INT; 2167 - serial_port_out(port, UART_IER, 0); 2168 - serial_port_out_sync(port, UART_IER, UART_IER_THRI); 2169 - udelay(1); /* allow a working UART time to re-assert THRE */ 2170 - iir_noint2 = serial_port_in(port, UART_IIR) & UART_IIR_NO_INT; 2171 - serial_port_out(port, UART_IER, 0); 2172 - 2173 - uart_port_unlock_irqrestore(port, flags); 2194 + scoped_guard(uart_port_lock_irqsave, port) { 2195 + wait_for_xmitr(up, UART_LSR_THRE); 2196 + serial_port_out_sync(port, UART_IER, UART_IER_THRI); 2197 + udelay(1); /* allow THRE to set */ 2198 + iir_noint1 = serial_port_in(port, UART_IIR) & UART_IIR_NO_INT; 2199 + serial_port_out(port, UART_IER, 0); 2200 + serial_port_out_sync(port, UART_IER, UART_IER_THRI); 2201 + udelay(1); /* allow a working UART time to re-assert THRE */ 2202 + iir_noint2 = serial_port_in(port, UART_IIR) & UART_IIR_NO_INT; 2203 + serial_port_out(port, UART_IER, 0); 2204 + } 2174 2205 2175 2206 if (port->irqflags & IRQF_SHARED) 2176 2207 enable_irq(port->irq); ··· 2232 2267 2233 2268 static void serial8250_initialize(struct uart_port *port) 2234 2269 { 2235 - unsigned long flags; 2236 - 2237 - uart_port_lock_irqsave(port, &flags); 2270 + guard(uart_port_lock_irqsave)(port); 2238 2271 serial_port_out(port, UART_LCR, UART_LCR_WLEN8); 2239 2272 2240 2273 serial8250_init_mctrl(port); 2241 2274 serial8250_iir_txen_test(port); 2242 - uart_port_unlock_irqrestore(port, flags); 2243 2275 } 2244 2276 2245 2277 int serial8250_do_startup(struct uart_port *port) ··· 2255 2293 if (port->iotype != up->cur_iotype) 2256 2294 set_io_from_upio(port); 2257 2295 2258 - serial8250_rpm_get(up); 2296 + guard(serial8250_rpm)(up); 2259 2297 2260 2298 serial8250_startup_special(port); 2261 2299 ··· 2275 2313 if (!(port->flags & UPF_BUGGY_UART) && 2276 2314 (serial_port_in(port, UART_LSR) == 0xff)) { 2277 2315 dev_info_ratelimited(port->dev, "LSR safety check engaged!\n"); 2278 - retval = -ENODEV; 2279 - goto out; 2316 + return -ENODEV; 2280 2317 } 2281 2318 2282 2319 serial8250_set_TRG_levels(port); ··· 2286 2325 2287 2326 retval = up->ops->setup_irq(up); 2288 2327 if (retval) 2289 - goto out; 2328 + return retval; 2290 2329 2291 2330 serial8250_THRE_test(port); 2292 2331 ··· 2335 2374 outb_p(0x80, icp); 2336 2375 inb_p(icp); 2337 2376 } 2338 - retval = 0; 2339 - out: 2340 - serial8250_rpm_put(up); 2341 - return retval; 2377 + 2378 + return 0; 2342 2379 } 2343 2380 EXPORT_SYMBOL_GPL(serial8250_do_startup); 2344 2381 ··· 2350 2391 void serial8250_do_shutdown(struct uart_port *port) 2351 2392 { 2352 2393 struct uart_8250_port *up = up_to_u8250p(port); 2353 - unsigned long flags; 2354 2394 2355 2395 serial8250_rpm_get(up); 2356 2396 /* ··· 2357 2399 * 2358 2400 * Synchronize UART_IER access against the console. 2359 2401 */ 2360 - uart_port_lock_irqsave(port, &flags); 2361 - up->ier = 0; 2362 - serial_port_out(port, UART_IER, 0); 2363 - uart_port_unlock_irqrestore(port, flags); 2402 + scoped_guard(uart_port_lock_irqsave, port) { 2403 + up->ier = 0; 2404 + serial_port_out(port, UART_IER, 0); 2405 + } 2364 2406 2365 2407 synchronize_irq(port->irq); 2366 2408 2367 2409 if (up->dma) 2368 2410 serial8250_release_dma(up); 2369 2411 2370 - uart_port_lock_irqsave(port, &flags); 2371 - if (port->flags & UPF_FOURPORT) { 2372 - /* reset interrupts on the AST Fourport board */ 2373 - inb((port->iobase & 0xfe0) | 0x1f); 2374 - port->mctrl |= TIOCM_OUT1; 2375 - } else 2376 - port->mctrl &= ~TIOCM_OUT2; 2412 + scoped_guard(uart_port_lock_irqsave, port) { 2413 + if (port->flags & UPF_FOURPORT) { 2414 + /* reset interrupts on the AST Fourport board */ 2415 + inb((port->iobase & 0xfe0) | 0x1f); 2416 + port->mctrl |= TIOCM_OUT1; 2417 + } else 2418 + port->mctrl &= ~TIOCM_OUT2; 2377 2419 2378 - serial8250_set_mctrl(port, port->mctrl); 2379 - uart_port_unlock_irqrestore(port, flags); 2420 + serial8250_set_mctrl(port, port->mctrl); 2421 + } 2380 2422 2381 2423 /* 2382 2424 * Disable break condition and FIFOs ··· 2568 2610 void serial8250_update_uartclk(struct uart_port *port, unsigned int uartclk) 2569 2611 { 2570 2612 struct tty_port *tport = &port->state->port; 2571 - struct tty_struct *tty; 2572 2613 2573 - tty = tty_port_tty_get(tport); 2574 - if (!tty) { 2575 - mutex_lock(&tport->mutex); 2614 + scoped_guard(tty_port_tty, tport) { 2615 + struct tty_struct *tty = scoped_tty(); 2616 + 2617 + guard(rwsem_write)(&tty->termios_rwsem); 2618 + guard(mutex)(&tport->mutex); 2619 + 2620 + if (port->uartclk == uartclk) 2621 + return; 2622 + 2576 2623 port->uartclk = uartclk; 2577 - mutex_unlock(&tport->mutex); 2624 + 2625 + if (!tty_port_initialized(tport)) 2626 + return; 2627 + 2628 + serial8250_do_set_termios(port, &tty->termios, NULL); 2629 + 2578 2630 return; 2579 2631 } 2580 - 2581 - down_write(&tty->termios_rwsem); 2582 - mutex_lock(&tport->mutex); 2583 - 2584 - if (port->uartclk == uartclk) 2585 - goto out_unlock; 2586 - 2632 + guard(mutex)(&tport->mutex); 2587 2633 port->uartclk = uartclk; 2588 - 2589 - if (!tty_port_initialized(tport)) 2590 - goto out_unlock; 2591 - 2592 - serial8250_do_set_termios(port, &tty->termios, NULL); 2593 - 2594 - out_unlock: 2595 - mutex_unlock(&tport->mutex); 2596 - up_write(&tty->termios_rwsem); 2597 - tty_kref_put(tty); 2598 2634 } 2599 2635 EXPORT_SYMBOL_GPL(serial8250_update_uartclk); 2600 2636 ··· 2743 2791 const struct ktermios *old) 2744 2792 { 2745 2793 struct uart_8250_port *up = up_to_u8250p(port); 2746 - unsigned long flags; 2747 2794 unsigned int baud, quot, frac = 0; 2748 2795 u8 lcr; 2749 2796 ··· 2752 2801 quot = serial8250_get_divisor(port, baud, &frac); 2753 2802 2754 2803 /* 2755 - * Ok, we're now changing the port state. Do it with 2756 - * interrupts disabled. 2804 + * Ok, we're now changing the port state. Do it with interrupts disabled. 2757 2805 * 2758 2806 * Synchronize UART_IER access against the console. 2759 2807 */ 2760 - serial8250_rpm_get(up); 2761 - uart_port_lock_irqsave(port, &flags); 2808 + scoped_guard(serial8250_rpm, up) { 2809 + guard(uart_port_lock_irqsave)(port); 2762 2810 2763 - up->lcr = lcr; 2764 - serial8250_set_trigger_for_slow_speed(port, termios, baud); 2765 - serial8250_set_afe(port, termios); 2766 - uart_update_timeout(port, termios->c_cflag, baud); 2767 - serial8250_set_errors_and_ignores(port, termios); 2768 - serial8250_set_ier(port, termios); 2769 - serial8250_set_efr(port, termios); 2770 - serial8250_set_divisor(port, baud, quot, frac); 2771 - serial8250_set_fcr(port, termios); 2772 - serial8250_set_mctrl(port, port->mctrl); 2773 - 2774 - uart_port_unlock_irqrestore(port, flags); 2775 - serial8250_rpm_put(up); 2811 + up->lcr = lcr; 2812 + serial8250_set_trigger_for_slow_speed(port, termios, baud); 2813 + serial8250_set_afe(port, termios); 2814 + uart_update_timeout(port, termios->c_cflag, baud); 2815 + serial8250_set_errors_and_ignores(port, termios); 2816 + serial8250_set_ier(port, termios); 2817 + serial8250_set_efr(port, termios); 2818 + serial8250_set_divisor(port, baud, quot, frac); 2819 + serial8250_set_fcr(port, termios); 2820 + serial8250_set_mctrl(port, port->mctrl); 2821 + } 2776 2822 2777 2823 /* Don't rewrite B0 */ 2778 2824 if (tty_termios_baud_rate(termios)) ··· 2791 2843 { 2792 2844 if (termios->c_line == N_PPS) { 2793 2845 port->flags |= UPF_HARDPPS_CD; 2794 - uart_port_lock_irq(port); 2846 + guard(uart_port_lock_irq)(port); 2795 2847 serial8250_enable_ms(port); 2796 - uart_port_unlock_irq(port); 2797 2848 } else { 2798 2849 port->flags &= ~UPF_HARDPPS_CD; 2799 2850 if (!UART_ENABLE_MS(port, termios->c_cflag)) { 2800 - uart_port_lock_irq(port); 2851 + guard(uart_port_lock_irq)(port); 2801 2852 serial8250_disable_ms(port); 2802 - uart_port_unlock_irq(port); 2803 2853 } 2804 2854 } 2805 2855 }
+3 -4
drivers/tty/serial/8250/8250_rsa.c
··· 140 140 return; 141 141 142 142 if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) { 143 - uart_port_lock_irq(&up->port); 143 + guard(uart_port_lock_irq)(&up->port); 144 144 __rsa_enable(up); 145 - uart_port_unlock_irq(&up->port); 146 145 } 147 146 if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) 148 147 serial_out(up, UART_RSA_FRR, 0); ··· 164 165 if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) 165 166 return; 166 167 167 - uart_port_lock_irq(&up->port); 168 + guard(uart_port_lock_irq)(&up->port); 169 + 168 170 mode = serial_in(up, UART_RSA_MSR); 169 171 result = !(mode & UART_RSA_MSR_FIFO); 170 172 ··· 177 177 178 178 if (result) 179 179 up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16; 180 - uart_port_unlock_irq(&up->port); 181 180 } 182 181 EXPORT_SYMBOL_FOR_MODULES(rsa_disable, "8250_base"); 183 182
+10 -2
drivers/tty/serial/Kconfig
··· 782 782 depends on CPM2 || CPM1 783 783 select SERIAL_CORE 784 784 help 785 - This driver supports the SCC and SMC serial ports on Motorola 785 + This driver supports the SCC and SMC serial ports on Motorola 786 786 embedded PowerPC that contain a CPM1 (8xx) or CPM2 (8xxx) 787 787 788 788 config SERIAL_CPM_CONSOLE ··· 927 927 help 928 928 Serial console driver for Qualcomm Technologies Inc's GENI based 929 929 QUP hardware. 930 + 931 + config SERIAL_QCOM_GENI_UART_PORTS 932 + int "Maximum number of GENI UART ports" 933 + depends on SERIAL_QCOM_GENI 934 + default "8" 935 + help 936 + Set this to the maximum number of serial ports you want the driver 937 + to support. 930 938 931 939 config SERIAL_VT8500 932 940 bool "VIA VT8500 on-chip serial port support" ··· 1420 1412 1421 1413 config SERIAL_STM32_CONSOLE 1422 1414 bool "Support for console on STM32" 1423 - depends on SERIAL_STM32=y 1415 + depends on SERIAL_STM32 1424 1416 select SERIAL_CORE_CONSOLE 1425 1417 select SERIAL_EARLYCON 1426 1418
+147 -213
drivers/tty/serial/ip22zilog.c
··· 30 30 #include <linux/console.h> 31 31 #include <linux/spinlock.h> 32 32 #include <linux/init.h> 33 + #include <linux/platform_device.h> 33 34 34 35 #include <linux/io.h> 35 36 #include <asm/irq.h> ··· 51 50 #define ZSDELAY_LONG() udelay(20) 52 51 #define ZS_WSYNC(channel) do { } while (0) 53 52 54 - #define NUM_IP22ZILOG 1 55 - #define NUM_CHANNELS (NUM_IP22ZILOG * 2) 53 + #define NUM_CHANNELS 2 54 + #define CHANNEL_B 0 55 + #define CHANNEL_A 1 56 56 57 57 #define ZS_CLOCK 3672000 /* Zilog input clock rate. */ 58 58 #define ZS_CLOCK_DIVISOR 16 /* Divisor this driver uses. */ ··· 64 62 struct uart_ip22zilog_port { 65 63 struct uart_port port; 66 64 67 - /* IRQ servicing chain. */ 68 - struct uart_ip22zilog_port *next; 69 - 70 65 /* Current values of Zilog write registers. */ 71 66 unsigned char curregs[NUM_ZSREGS]; 72 67 ··· 71 72 #define IP22ZILOG_FLAG_IS_CONS 0x00000004 72 73 #define IP22ZILOG_FLAG_IS_KGDB 0x00000008 73 74 #define IP22ZILOG_FLAG_MODEM_STATUS 0x00000010 74 - #define IP22ZILOG_FLAG_IS_CHANNEL_A 0x00000020 75 75 #define IP22ZILOG_FLAG_REGS_HELD 0x00000040 76 76 #define IP22ZILOG_FLAG_TX_STOPPED 0x00000080 77 77 #define IP22ZILOG_FLAG_TX_ACTIVE 0x00000100 ··· 82 84 unsigned char prev_status; 83 85 }; 84 86 87 + static struct uart_ip22zilog_port ip22zilog_port_table[NUM_CHANNELS]; 88 + 85 89 #define ZILOG_CHANNEL_FROM_PORT(PORT) ((struct zilog_channel *)((PORT)->membase)) 86 90 #define UART_ZILOG(PORT) ((struct uart_ip22zilog_port *)(PORT)) 87 91 #define IP22ZILOG_GET_CURR_REG(PORT, REGNUM) \ ··· 93 93 #define ZS_IS_CONS(UP) ((UP)->flags & IP22ZILOG_FLAG_IS_CONS) 94 94 #define ZS_IS_KGDB(UP) ((UP)->flags & IP22ZILOG_FLAG_IS_KGDB) 95 95 #define ZS_WANTS_MODEM_STATUS(UP) ((UP)->flags & IP22ZILOG_FLAG_MODEM_STATUS) 96 - #define ZS_IS_CHANNEL_A(UP) ((UP)->flags & IP22ZILOG_FLAG_IS_CHANNEL_A) 97 96 #define ZS_REGS_HELD(UP) ((UP)->flags & IP22ZILOG_FLAG_REGS_HELD) 98 97 #define ZS_TX_STOPPED(UP) ((UP)->flags & IP22ZILOG_FLAG_TX_STOPPED) 99 98 #define ZS_TX_ACTIVE(UP) ((UP)->flags & IP22ZILOG_FLAG_TX_ACTIVE) ··· 422 423 423 424 static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id) 424 425 { 425 - struct uart_ip22zilog_port *up = dev_id; 426 + struct uart_ip22zilog_port *up; 427 + struct zilog_channel *channel; 428 + unsigned char r3; 429 + bool push = false; 426 430 427 - while (up) { 428 - struct zilog_channel *channel 429 - = ZILOG_CHANNEL_FROM_PORT(&up->port); 430 - unsigned char r3; 431 - bool push = false; 431 + up = &ip22zilog_port_table[CHANNEL_A]; 432 + channel = ZILOG_CHANNEL_FROM_PORT(&up->port); 432 433 433 - uart_port_lock(&up->port); 434 - r3 = read_zsreg(channel, R3); 434 + uart_port_lock(&up->port); 435 + r3 = read_zsreg(channel, R3); 435 436 436 - /* Channel A */ 437 - if (r3 & (CHAEXT | CHATxIP | CHARxIP)) { 438 - writeb(RES_H_IUS, &channel->control); 439 - ZSDELAY(); 440 - ZS_WSYNC(channel); 437 + /* Channel A */ 438 + if (r3 & (CHAEXT | CHATxIP | CHARxIP)) { 439 + writeb(RES_H_IUS, &channel->control); 440 + ZSDELAY(); 441 + ZS_WSYNC(channel); 441 442 442 - if (r3 & CHARxIP) 443 - push = ip22zilog_receive_chars(up, channel); 444 - if (r3 & CHAEXT) 445 - ip22zilog_status_handle(up, channel); 446 - if (r3 & CHATxIP) 447 - ip22zilog_transmit_chars(up, channel); 448 - } 449 - uart_port_unlock(&up->port); 450 - 451 - if (push) 452 - tty_flip_buffer_push(&up->port.state->port); 453 - 454 - /* Channel B */ 455 - up = up->next; 456 - channel = ZILOG_CHANNEL_FROM_PORT(&up->port); 457 - push = false; 458 - 459 - uart_port_lock(&up->port); 460 - if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) { 461 - writeb(RES_H_IUS, &channel->control); 462 - ZSDELAY(); 463 - ZS_WSYNC(channel); 464 - 465 - if (r3 & CHBRxIP) 466 - push = ip22zilog_receive_chars(up, channel); 467 - if (r3 & CHBEXT) 468 - ip22zilog_status_handle(up, channel); 469 - if (r3 & CHBTxIP) 470 - ip22zilog_transmit_chars(up, channel); 471 - } 472 - uart_port_unlock(&up->port); 473 - 474 - if (push) 475 - tty_flip_buffer_push(&up->port.state->port); 476 - 477 - up = up->next; 443 + if (r3 & CHARxIP) 444 + push = ip22zilog_receive_chars(up, channel); 445 + if (r3 & CHAEXT) 446 + ip22zilog_status_handle(up, channel); 447 + if (r3 & CHATxIP) 448 + ip22zilog_transmit_chars(up, channel); 478 449 } 450 + uart_port_unlock(&up->port); 451 + 452 + if (push) 453 + tty_flip_buffer_push(&up->port.state->port); 454 + 455 + /* Channel B */ 456 + up = &ip22zilog_port_table[CHANNEL_B]; 457 + channel = ZILOG_CHANNEL_FROM_PORT(&up->port); 458 + push = false; 459 + 460 + uart_port_lock(&up->port); 461 + if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) { 462 + writeb(RES_H_IUS, &channel->control); 463 + ZSDELAY(); 464 + ZS_WSYNC(channel); 465 + 466 + if (r3 & CHBRxIP) 467 + push = ip22zilog_receive_chars(up, channel); 468 + if (r3 & CHBEXT) 469 + ip22zilog_status_handle(up, channel); 470 + if (r3 & CHBTxIP) 471 + ip22zilog_transmit_chars(up, channel); 472 + } 473 + uart_port_unlock(&up->port); 474 + 475 + if (push) 476 + tty_flip_buffer_push(&up->port.state->port); 479 477 480 478 return IRQ_HANDLED; 481 479 } ··· 688 692 udelay(100); 689 693 } 690 694 691 - if (!ZS_IS_CHANNEL_A(up)) { 692 - up++; 693 - channel = ZILOG_CHANNEL_FROM_PORT(&up->port); 694 - } 695 + up = &ip22zilog_port_table[CHANNEL_A]; 696 + channel = ZILOG_CHANNEL_FROM_PORT(&up->port); 697 + 695 698 write_zsreg(channel, R9, FHWRES); 696 699 ZSDELAY_LONG(); 697 700 (void) read_zsreg(channel, R0); 698 701 699 702 up->flags |= IP22ZILOG_FLAG_RESET_DONE; 700 - up->next->flags |= IP22ZILOG_FLAG_RESET_DONE; 703 + up = &ip22zilog_port_table[CHANNEL_B]; 704 + up->flags |= IP22ZILOG_FLAG_RESET_DONE; 701 705 } 702 706 703 707 static void __ip22zilog_startup(struct uart_ip22zilog_port *up) ··· 938 942 .verify_port = ip22zilog_verify_port, 939 943 }; 940 944 941 - static struct uart_ip22zilog_port *ip22zilog_port_table; 942 - static struct zilog_layout **ip22zilog_chip_regs; 943 - 944 - static struct uart_ip22zilog_port *ip22zilog_irq_chain; 945 - static int zilog_irq = -1; 946 - 947 - static void * __init alloc_one_table(unsigned long size) 948 - { 949 - return kzalloc(size, GFP_KERNEL); 950 - } 951 - 952 - static void __init ip22zilog_alloc_tables(void) 953 - { 954 - ip22zilog_port_table = (struct uart_ip22zilog_port *) 955 - alloc_one_table(NUM_CHANNELS * sizeof(struct uart_ip22zilog_port)); 956 - ip22zilog_chip_regs = (struct zilog_layout **) 957 - alloc_one_table(NUM_IP22ZILOG * sizeof(struct zilog_layout *)); 958 - 959 - if (ip22zilog_port_table == NULL || ip22zilog_chip_regs == NULL) { 960 - panic("IP22-Zilog: Cannot allocate IP22-Zilog tables."); 961 - } 962 - } 963 - 964 - /* Get the address of the registers for IP22-Zilog instance CHIP. */ 965 - static struct zilog_layout * __init get_zs(int chip) 966 - { 967 - unsigned long base; 968 - 969 - if (chip < 0 || chip >= NUM_IP22ZILOG) { 970 - panic("IP22-Zilog: Illegal chip number %d in get_zs.", chip); 971 - } 972 - 973 - /* Not probe-able, hard code it. */ 974 - base = (unsigned long) &sgioc->uart; 975 - 976 - zilog_irq = SGI_SERIAL_IRQ; 977 - request_mem_region(base, 8, "IP22-Zilog"); 978 - 979 - return (struct zilog_layout *) base; 980 - } 981 - 982 945 #define ZS_PUT_CHAR_MAX_DELAY 2000 /* 10 ms */ 983 946 984 947 #ifdef CONFIG_SERIAL_IP22_ZILOG_CONSOLE ··· 1025 1070 #endif 1026 1071 }; 1027 1072 1028 - static void __init ip22zilog_prepare(void) 1073 + static void __init ip22zilog_prepare(struct uart_ip22zilog_port *up) 1029 1074 { 1030 1075 unsigned char sysrq_on = IS_ENABLED(CONFIG_SERIAL_IP22_ZILOG_CONSOLE); 1031 - struct uart_ip22zilog_port *up; 1032 - struct zilog_layout *rp; 1033 - int channel, chip; 1076 + int brg; 1034 1077 1035 - /* 1036 - * Temporary fix. 1037 - */ 1038 - for (channel = 0; channel < NUM_CHANNELS; channel++) 1039 - spin_lock_init(&ip22zilog_port_table[channel].port.lock); 1078 + spin_lock_init(&up->port.lock); 1040 1079 1041 - ip22zilog_irq_chain = &ip22zilog_port_table[NUM_CHANNELS - 1]; 1042 - up = &ip22zilog_port_table[0]; 1043 - for (channel = NUM_CHANNELS - 1 ; channel > 0; channel--) 1044 - up[channel].next = &up[channel - 1]; 1045 - up[channel].next = NULL; 1080 + up->port.iotype = UPIO_MEM; 1081 + up->port.uartclk = ZS_CLOCK; 1082 + up->port.fifosize = 1; 1083 + up->port.has_sysrq = sysrq_on; 1084 + up->port.ops = &ip22zilog_pops; 1085 + up->port.type = PORT_IP22ZILOG; 1046 1086 1047 - for (chip = 0; chip < NUM_IP22ZILOG; chip++) { 1048 - if (!ip22zilog_chip_regs[chip]) { 1049 - ip22zilog_chip_regs[chip] = rp = get_zs(chip); 1050 - 1051 - up[(chip * 2) + 0].port.membase = (char *) &rp->channelB; 1052 - up[(chip * 2) + 1].port.membase = (char *) &rp->channelA; 1053 - 1054 - /* In theory mapbase is the physical address ... */ 1055 - up[(chip * 2) + 0].port.mapbase = 1056 - (unsigned long) ioremap((unsigned long) &rp->channelB, 8); 1057 - up[(chip * 2) + 1].port.mapbase = 1058 - (unsigned long) ioremap((unsigned long) &rp->channelA, 8); 1059 - } 1060 - 1061 - /* Channel A */ 1062 - up[(chip * 2) + 0].port.iotype = UPIO_MEM; 1063 - up[(chip * 2) + 0].port.irq = zilog_irq; 1064 - up[(chip * 2) + 0].port.uartclk = ZS_CLOCK; 1065 - up[(chip * 2) + 0].port.fifosize = 1; 1066 - up[(chip * 2) + 0].port.has_sysrq = sysrq_on; 1067 - up[(chip * 2) + 0].port.ops = &ip22zilog_pops; 1068 - up[(chip * 2) + 0].port.type = PORT_IP22ZILOG; 1069 - up[(chip * 2) + 0].port.flags = 0; 1070 - up[(chip * 2) + 0].port.line = (chip * 2) + 0; 1071 - up[(chip * 2) + 0].flags = 0; 1072 - 1073 - /* Channel B */ 1074 - up[(chip * 2) + 1].port.iotype = UPIO_MEM; 1075 - up[(chip * 2) + 1].port.irq = zilog_irq; 1076 - up[(chip * 2) + 1].port.uartclk = ZS_CLOCK; 1077 - up[(chip * 2) + 1].port.fifosize = 1; 1078 - up[(chip * 2) + 1].port.has_sysrq = sysrq_on; 1079 - up[(chip * 2) + 1].port.ops = &ip22zilog_pops; 1080 - up[(chip * 2) + 1].port.type = PORT_IP22ZILOG; 1081 - up[(chip * 2) + 1].port.line = (chip * 2) + 1; 1082 - up[(chip * 2) + 1].flags |= IP22ZILOG_FLAG_IS_CHANNEL_A; 1083 - } 1084 - 1085 - for (channel = 0; channel < NUM_CHANNELS; channel++) { 1086 - struct uart_ip22zilog_port *up = &ip22zilog_port_table[channel]; 1087 - int brg; 1088 - 1089 - /* Normal serial TTY. */ 1090 - up->parity_mask = 0xff; 1091 - up->curregs[R1] = EXT_INT_ENAB | INT_ALL_Rx | TxINT_ENAB; 1092 - up->curregs[R4] = PAR_EVEN | X16CLK | SB1; 1093 - up->curregs[R3] = RxENAB | Rx8; 1094 - up->curregs[R5] = TxENAB | Tx8; 1095 - up->curregs[R9] = NV | MIE; 1096 - up->curregs[R10] = NRZ; 1097 - up->curregs[R11] = TCBR | RCBR; 1098 - brg = BPS_TO_BRG(9600, ZS_CLOCK / ZS_CLOCK_DIVISOR); 1099 - up->curregs[R12] = (brg & 0xff); 1100 - up->curregs[R13] = (brg >> 8) & 0xff; 1101 - up->curregs[R14] = BRENAB; 1102 - } 1087 + /* Normal serial TTY. */ 1088 + up->parity_mask = 0xff; 1089 + up->curregs[R1] = EXT_INT_ENAB | INT_ALL_Rx | TxINT_ENAB; 1090 + up->curregs[R4] = PAR_EVEN | X16CLK | SB1; 1091 + up->curregs[R3] = RxENAB | Rx8; 1092 + up->curregs[R5] = TxENAB | Tx8; 1093 + up->curregs[R9] = NV | MIE; 1094 + up->curregs[R10] = NRZ; 1095 + up->curregs[R11] = TCBR | RCBR; 1096 + brg = BPS_TO_BRG(9600, ZS_CLOCK / ZS_CLOCK_DIVISOR); 1097 + up->curregs[R12] = (brg & 0xff); 1098 + up->curregs[R13] = (brg >> 8) & 0xff; 1099 + up->curregs[R14] = BRENAB; 1103 1100 } 1104 1101 1105 - static int __init ip22zilog_ports_init(void) 1102 + static int ip22zilog_probe(struct platform_device *pdev) 1106 1103 { 1107 - int ret; 1104 + struct uart_ip22zilog_port *up; 1105 + char __iomem *membase; 1106 + struct resource *res; 1107 + int irq; 1108 + int i; 1108 1109 1109 - printk(KERN_INFO "Serial: IP22 Zilog driver (%d chips).\n", NUM_IP22ZILOG); 1110 + up = &ip22zilog_port_table[CHANNEL_B]; 1111 + if (up->port.dev) 1112 + return -ENOSPC; 1110 1113 1111 - ip22zilog_prepare(); 1114 + irq = platform_get_irq(pdev, 0); 1115 + if (irq < 0) 1116 + return irq; 1112 1117 1113 - if (request_irq(zilog_irq, ip22zilog_interrupt, 0, 1114 - "IP22-Zilog", ip22zilog_irq_chain)) { 1118 + membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); 1119 + if (IS_ERR(membase)) 1120 + return PTR_ERR(membase); 1121 + 1122 + ip22zilog_prepare(up); 1123 + 1124 + up->port.mapbase = res->start + offsetof(struct zilog_layout, channelB); 1125 + up->port.membase = membase + offsetof(struct zilog_layout, channelB); 1126 + up->port.line = 0; 1127 + up->port.dev = &pdev->dev; 1128 + up->port.irq = irq; 1129 + 1130 + up = &ip22zilog_port_table[CHANNEL_A]; 1131 + ip22zilog_prepare(up); 1132 + 1133 + up->port.mapbase = res->start + offsetof(struct zilog_layout, channelA); 1134 + up->port.membase = membase + offsetof(struct zilog_layout, channelA); 1135 + up->port.line = 1; 1136 + up->port.dev = &pdev->dev; 1137 + up->port.irq = irq; 1138 + 1139 + if (request_irq(irq, ip22zilog_interrupt, 0, 1140 + "IP22-Zilog", NULL)) { 1115 1141 panic("IP22-Zilog: Unable to register zs interrupt handler.\n"); 1116 1142 } 1117 1143 1118 - ret = uart_register_driver(&ip22zilog_reg); 1119 - if (ret == 0) { 1120 - int i; 1121 - 1122 - for (i = 0; i < NUM_CHANNELS; i++) { 1123 - struct uart_ip22zilog_port *up = &ip22zilog_port_table[i]; 1124 - 1125 - uart_add_one_port(&ip22zilog_reg, &up->port); 1126 - } 1127 - } 1128 - 1129 - return ret; 1130 - } 1131 - 1132 - static int __init ip22zilog_init(void) 1133 - { 1134 - /* IP22 Zilog setup is hard coded, no probing to do. */ 1135 - ip22zilog_alloc_tables(); 1136 - ip22zilog_ports_init(); 1144 + for (i = 0; i < NUM_CHANNELS; i++) 1145 + uart_add_one_port(&ip22zilog_reg, 1146 + &ip22zilog_port_table[i].port); 1137 1147 1138 1148 return 0; 1139 1149 } 1140 1150 1141 - static void __exit ip22zilog_exit(void) 1151 + static void ip22zilog_remove(struct platform_device *pdev) 1142 1152 { 1143 1153 int i; 1144 - struct uart_ip22zilog_port *up; 1145 1154 1146 1155 for (i = 0; i < NUM_CHANNELS; i++) { 1147 - up = &ip22zilog_port_table[i]; 1148 - 1149 - uart_remove_one_port(&ip22zilog_reg, &up->port); 1156 + uart_remove_one_port(&ip22zilog_reg, 1157 + &ip22zilog_port_table[i].port); 1158 + ip22zilog_port_table[i].port.dev = NULL; 1150 1159 } 1160 + } 1151 1161 1152 - /* Free IO mem */ 1153 - up = &ip22zilog_port_table[0]; 1154 - for (i = 0; i < NUM_IP22ZILOG; i++) { 1155 - if (up[(i * 2) + 0].port.mapbase) { 1156 - iounmap((void*)up[(i * 2) + 0].port.mapbase); 1157 - up[(i * 2) + 0].port.mapbase = 0; 1158 - } 1159 - if (up[(i * 2) + 1].port.mapbase) { 1160 - iounmap((void*)up[(i * 2) + 1].port.mapbase); 1161 - up[(i * 2) + 1].port.mapbase = 0; 1162 - } 1162 + static struct platform_driver ip22zilog_driver = { 1163 + .probe = ip22zilog_probe, 1164 + .remove = ip22zilog_remove, 1165 + .driver = { 1166 + .name = "ip22zilog" 1163 1167 } 1168 + }; 1164 1169 1170 + static int __init ip22zilog_init(void) 1171 + { 1172 + int ret; 1173 + 1174 + ret = uart_register_driver(&ip22zilog_reg); 1175 + if (ret) 1176 + return ret; 1177 + 1178 + ret = platform_driver_register(&ip22zilog_driver); 1179 + if (ret) 1180 + uart_unregister_driver(&ip22zilog_reg); 1181 + 1182 + return ret; 1183 + 1184 + } 1185 + 1186 + static void __exit ip22zilog_exit(void) 1187 + { 1165 1188 uart_unregister_driver(&ip22zilog_reg); 1189 + platform_driver_unregister(&ip22zilog_driver); 1166 1190 } 1167 1191 1168 1192 module_init(ip22zilog_init);
+1 -1
drivers/tty/serial/max3100.c
··· 705 705 break; 706 706 if (i == MAX_MAX3100) { 707 707 mutex_unlock(&max3100s_lock); 708 - return dev_err_probe(dev, -ENOMEM, "too many MAX3100 chips\n"); 708 + return dev_err_probe(dev, -ENOSPC, "too many MAX3100 chips\n"); 709 709 } 710 710 711 711 max3100s[i] = kzalloc(sizeof(struct max3100_port), GFP_KERNEL);
+20 -8
drivers/tty/serial/max310x.c
··· 823 823 bool handled = false; 824 824 825 825 if (s->devtype->nr > 1) { 826 + bool done; 827 + 826 828 do { 827 829 unsigned int val = ~0; 830 + unsigned long irq; 831 + unsigned int port; 832 + 833 + done = true; 828 834 829 835 WARN_ON_ONCE(regmap_read(s->regmap, 830 836 MAX310X_GLOBALIRQ_REG, &val)); 831 - val = ((1 << s->devtype->nr) - 1) & ~val; 832 - if (!val) 833 - break; 834 - if (max310x_port_irq(s, fls(val) - 1) == IRQ_HANDLED) 835 - handled = true; 836 - } while (1); 837 + 838 + irq = val; 839 + 840 + for_each_clear_bit(port, &irq, s->devtype->nr) { 841 + done = false; 842 + 843 + if (max310x_port_irq(s, port) == IRQ_HANDLED) 844 + handled = true; 845 + } 846 + 847 + } while (!done); 837 848 } else { 838 849 if (max310x_port_irq(s, 0) == IRQ_HANDLED) 839 850 handled = true; ··· 1280 1269 /* Alloc port structure */ 1281 1270 s = devm_kzalloc(dev, struct_size(s, p, devtype->nr), GFP_KERNEL); 1282 1271 if (!s) 1283 - return dev_err_probe(dev, -ENOMEM, 1284 - "Error allocating port structure\n"); 1272 + return -ENOMEM; 1285 1273 1286 1274 /* Always ask for fixed clock rate from a property. */ 1287 1275 device_property_read_u32(dev, "clock-frequency", &uartclk); ··· 1654 1644 port_client = devm_i2c_new_dummy_device(&client->dev, 1655 1645 client->adapter, 1656 1646 port_addr); 1647 + if (IS_ERR(port_client)) 1648 + return PTR_ERR(port_client); 1657 1649 1658 1650 regcfg_i2c.name = max310x_regmap_name(i); 1659 1651 regmaps[i] = devm_regmap_init_i2c(port_client, &regcfg_i2c);
+1 -1
drivers/tty/serial/msm_serial.c
··· 1102 1102 1103 1103 if (result == baud) 1104 1104 break; 1105 - } else if (entry->divisor > divisor) { 1105 + } else { 1106 1106 old = target; 1107 1107 target = clk_round_rate(msm_port->clk, old + 1); 1108 1108 /*
+6 -4
drivers/tty/serial/mvebu-uart.c
··· 1264 1264 return parent_rate / uart_clock_base->div; 1265 1265 } 1266 1266 1267 - static long mvebu_uart_clock_round_rate(struct clk_hw *hw, unsigned long rate, 1268 - unsigned long *parent_rate) 1267 + static int mvebu_uart_clock_determine_rate(struct clk_hw *hw, 1268 + struct clk_rate_request *req) 1269 1269 { 1270 1270 struct mvebu_uart_clock *uart_clock = to_uart_clock(hw); 1271 1271 struct mvebu_uart_clock_base *uart_clock_base = 1272 1272 to_uart_clock_base(uart_clock); 1273 1273 1274 - return *parent_rate / uart_clock_base->div; 1274 + req->rate = req->best_parent_rate / uart_clock_base->div; 1275 + 1276 + return 0; 1275 1277 } 1276 1278 1277 1279 static int mvebu_uart_clock_set_rate(struct clk_hw *hw, unsigned long rate, ··· 1295 1293 .is_enabled = mvebu_uart_clock_is_enabled, 1296 1294 .save_context = mvebu_uart_clock_save_context, 1297 1295 .restore_context = mvebu_uart_clock_restore_context, 1298 - .round_rate = mvebu_uart_clock_round_rate, 1296 + .determine_rate = mvebu_uart_clock_determine_rate, 1299 1297 .set_rate = mvebu_uart_clock_set_rate, 1300 1298 .recalc_rate = mvebu_uart_clock_recalc_rate, 1301 1299 };
+39 -108
drivers/tty/serial/qcom_geni_serial.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 2 - // Copyright (c) 2017-2018, The Linux foundation. All rights reserved. 2 + /* 3 + * Copyright (c) 2017-2018, The Linux foundation. All rights reserved. 4 + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. 5 + */ 3 6 4 7 /* Disable MMIO tracing to prevent excessive logging of unwanted MMIO traces */ 5 8 #define __DISABLE_TRACE_MMIO__ ··· 80 77 #define STALE_TIMEOUT 16 81 78 #define DEFAULT_BITS_PER_CHAR 10 82 79 #define GENI_UART_CONS_PORTS 1 83 - #define GENI_UART_PORTS 3 84 80 #define DEF_FIFO_DEPTH_WORDS 16 85 81 #define DEF_TX_WM 2 86 82 #define DEF_FIFO_WIDTH_BITS 32 ··· 165 163 { 166 164 return container_of(uport, struct qcom_geni_serial_port, uport); 167 165 } 168 - 169 - static struct qcom_geni_serial_port qcom_geni_uart_ports[GENI_UART_PORTS] = { 170 - [0] = { 171 - .uport = { 172 - .iotype = UPIO_MEM, 173 - .ops = &qcom_geni_uart_pops, 174 - .flags = UPF_BOOT_AUTOCONF, 175 - .line = 0, 176 - }, 177 - }, 178 - [1] = { 179 - .uport = { 180 - .iotype = UPIO_MEM, 181 - .ops = &qcom_geni_uart_pops, 182 - .flags = UPF_BOOT_AUTOCONF, 183 - .line = 1, 184 - }, 185 - }, 186 - [2] = { 187 - .uport = { 188 - .iotype = UPIO_MEM, 189 - .ops = &qcom_geni_uart_pops, 190 - .flags = UPF_BOOT_AUTOCONF, 191 - .line = 2, 192 - }, 193 - }, 194 - }; 195 166 196 167 static struct qcom_geni_serial_port qcom_geni_console_port = { 197 168 .uport = { ··· 260 285 return "MSM"; 261 286 } 262 287 263 - static struct qcom_geni_serial_port *get_port_from_line(int line, bool console) 288 + static struct qcom_geni_serial_port *get_port_from_line(int line, bool console, struct device *dev) 264 289 { 265 290 struct qcom_geni_serial_port *port; 266 - int nr_ports = console ? GENI_UART_CONS_PORTS : GENI_UART_PORTS; 291 + int nr_ports = console ? GENI_UART_CONS_PORTS : CONFIG_SERIAL_QCOM_GENI_UART_PORTS; 267 292 268 293 if (console) { 269 294 if (line < 0 || line >= nr_ports) ··· 274 299 int max_alias_num = of_alias_get_highest_id("serial"); 275 300 276 301 if (line < 0 || line >= nr_ports) 277 - line = ida_alloc_range(&port_ida, max_alias_num + 1, nr_ports, GFP_KERNEL); 302 + line = ida_alloc_range(&port_ida, max_alias_num + 1, 303 + nr_ports - 1, GFP_KERNEL); 278 304 else 279 - line = ida_alloc_range(&port_ida, line, nr_ports, GFP_KERNEL); 305 + line = ida_alloc_range(&port_ida, line, 306 + nr_ports - 1, GFP_KERNEL); 280 307 281 308 if (line < 0) 282 309 return ERR_PTR(-ENXIO); 283 310 284 - port = &qcom_geni_uart_ports[line]; 311 + port = devm_kzalloc(dev, sizeof(*port), GFP_KERNEL); 312 + if (!port) 313 + return ERR_PTR(-ENOMEM); 314 + 315 + port->uport.iotype = UPIO_MEM; 316 + port->uport.ops = &qcom_geni_uart_pops; 317 + port->uport.flags = UPF_BOOT_AUTOCONF; 318 + port->uport.line = line; 285 319 } 286 320 return port; 287 321 } ··· 538 554 539 555 WARN_ON(co->index < 0 || co->index >= GENI_UART_CONS_PORTS); 540 556 541 - port = get_port_from_line(co->index, true); 557 + port = get_port_from_line(co->index, true, NULL); 542 558 if (IS_ERR(port)) 543 559 return; 544 560 ··· 1251 1267 return 0; 1252 1268 } 1253 1269 1254 - static unsigned long find_clk_rate_in_tol(struct clk *clk, unsigned int desired_clk, 1255 - unsigned int *clk_div, unsigned int percent_tol) 1256 - { 1257 - unsigned long freq; 1258 - unsigned long div, maxdiv; 1259 - u64 mult; 1260 - unsigned long offset, abs_tol, achieved; 1261 - 1262 - abs_tol = div_u64((u64)desired_clk * percent_tol, 100); 1263 - maxdiv = CLK_DIV_MSK >> CLK_DIV_SHFT; 1264 - div = 1; 1265 - while (div <= maxdiv) { 1266 - mult = (u64)div * desired_clk; 1267 - if (mult != (unsigned long)mult) 1268 - break; 1269 - 1270 - offset = div * abs_tol; 1271 - freq = clk_round_rate(clk, mult - offset); 1272 - 1273 - /* Can only get lower if we're done */ 1274 - if (freq < mult - offset) 1275 - break; 1276 - 1277 - /* 1278 - * Re-calculate div in case rounding skipped rates but we 1279 - * ended up at a good one, then check for a match. 1280 - */ 1281 - div = DIV_ROUND_CLOSEST(freq, desired_clk); 1282 - achieved = DIV_ROUND_CLOSEST(freq, div); 1283 - if (achieved <= desired_clk + abs_tol && 1284 - achieved >= desired_clk - abs_tol) { 1285 - *clk_div = div; 1286 - return freq; 1287 - } 1288 - 1289 - div = DIV_ROUND_UP(freq, desired_clk); 1290 - } 1291 - 1292 - return 0; 1293 - } 1294 - 1295 - static unsigned long get_clk_div_rate(struct clk *clk, unsigned int baud, 1296 - unsigned int sampling_rate, unsigned int *clk_div) 1297 - { 1298 - unsigned long ser_clk; 1299 - unsigned long desired_clk; 1300 - 1301 - desired_clk = baud * sampling_rate; 1302 - if (!desired_clk) 1303 - return 0; 1304 - 1305 - /* 1306 - * try to find a clock rate within 2% tolerance, then within 5% 1307 - */ 1308 - ser_clk = find_clk_rate_in_tol(clk, desired_clk, clk_div, 2); 1309 - if (!ser_clk) 1310 - ser_clk = find_clk_rate_in_tol(clk, desired_clk, clk_div, 5); 1311 - 1312 - return ser_clk; 1313 - } 1314 - 1315 1270 static int geni_serial_set_rate(struct uart_port *uport, unsigned int baud) 1316 1271 { 1317 1272 struct qcom_geni_serial_port *port = to_dev_port(uport); 1318 1273 unsigned long clk_rate; 1319 - unsigned int avg_bw_core; 1274 + unsigned int avg_bw_core, clk_idx; 1320 1275 unsigned int clk_div; 1321 1276 u32 ver, sampling_rate; 1322 1277 u32 ser_clk_cfg; 1278 + int ret; 1323 1279 1324 1280 sampling_rate = UART_OVERSAMPLING; 1325 1281 /* Sampling rate is halved for IP versions >= 2.5 */ ··· 1267 1343 if (ver >= QUP_SE_VERSION_2_5) 1268 1344 sampling_rate /= 2; 1269 1345 1270 - clk_rate = get_clk_div_rate(port->se.clk, baud, 1271 - sampling_rate, &clk_div); 1272 - if (!clk_rate) { 1273 - dev_err(port->se.dev, 1274 - "Couldn't find suitable clock rate for %u\n", 1275 - baud * sampling_rate); 1346 + ret = geni_se_clk_freq_match(&port->se, baud * sampling_rate, &clk_idx, &clk_rate, false); 1347 + if (ret) { 1348 + dev_err(port->se.dev, "Failed to find src clk for baud rate: %d ret: %d\n", 1349 + baud, ret); 1350 + return ret; 1351 + } 1352 + 1353 + clk_div = DIV_ROUND_UP(clk_rate, baud * sampling_rate); 1354 + /* Check if calculated divider exceeds maximum allowed value */ 1355 + if (clk_div > (CLK_DIV_MSK >> CLK_DIV_SHFT)) { 1356 + dev_err(port->se.dev, "Calculated clock divider %u exceeds maximum\n", clk_div); 1276 1357 return -EINVAL; 1277 1358 } 1278 1359 1279 - dev_dbg(port->se.dev, "desired_rate = %u, clk_rate = %lu, clk_div = %u\n", 1280 - baud * sampling_rate, clk_rate, clk_div); 1360 + dev_dbg(port->se.dev, "desired_rate = %u, clk_rate = %lu, clk_div = %u\n, clk_idx = %u\n", 1361 + baud * sampling_rate, clk_rate, clk_div, clk_idx); 1281 1362 1282 1363 uport->uartclk = clk_rate; 1283 1364 port->clk_rate = clk_rate; ··· 1302 1373 1303 1374 writel(ser_clk_cfg, uport->membase + GENI_SER_M_CLK_CFG); 1304 1375 writel(ser_clk_cfg, uport->membase + GENI_SER_S_CLK_CFG); 1376 + /* Configure clock selection register with the selected clock index */ 1377 + writel(clk_idx & CLK_SEL_MSK, uport->membase + SE_GENI_CLK_SEL); 1305 1378 return 0; 1306 1379 } 1307 1380 ··· 1448 1517 if (co->index >= GENI_UART_CONS_PORTS || co->index < 0) 1449 1518 return -ENXIO; 1450 1519 1451 - port = get_port_from_line(co->index, true); 1520 + port = get_port_from_line(co->index, true, NULL); 1452 1521 if (IS_ERR(port)) { 1453 1522 pr_err("Invalid line %d\n", co->index); 1454 1523 return PTR_ERR(port); ··· 1609 1678 .owner = THIS_MODULE, 1610 1679 .driver_name = "qcom_geni_uart", 1611 1680 .dev_name = "ttyHS", 1612 - .nr = GENI_UART_PORTS, 1681 + .nr = CONFIG_SERIAL_QCOM_GENI_UART_PORTS, 1613 1682 }; 1614 1683 1615 1684 static int geni_serial_resources_on(struct uart_port *uport) ··· 1803 1872 line = of_alias_get_id(pdev->dev.of_node, "hsuart"); 1804 1873 } 1805 1874 1806 - port = get_port_from_line(line, data->console); 1875 + port = get_port_from_line(line, data->console, &pdev->dev); 1807 1876 if (IS_ERR(port)) { 1808 1877 dev_err(&pdev->dev, "Invalid line %d\n", line); 1809 1878 return PTR_ERR(port);
+1 -1
drivers/tty/serial/sc16is7xx.c
··· 626 626 { 627 627 struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); 628 628 unsigned int lsr = 0, bytes_read, i; 629 - bool read_lsr = (iir == SC16IS7XX_IIR_RLSE_SRC) ? true : false; 629 + bool read_lsr = (iir == SC16IS7XX_IIR_RLSE_SRC); 630 630 u8 ch, flag; 631 631 632 632 if (unlikely(rxlen >= sizeof(one->buf))) {
+59 -84
drivers/tty/serial/serial_core.c
··· 177 177 static void 178 178 uart_update_mctrl(struct uart_port *port, unsigned int set, unsigned int clear) 179 179 { 180 - unsigned long flags; 181 180 unsigned int old; 182 181 183 - uart_port_lock_irqsave(port, &flags); 182 + guard(uart_port_lock_irqsave)(port); 184 183 old = port->mctrl; 185 184 port->mctrl = (old & ~clear) | set; 186 185 if (old != port->mctrl && !(port->rs485.flags & SER_RS485_ENABLED)) 187 186 port->ops->set_mctrl(port, port->mctrl); 188 - uart_port_unlock_irqrestore(port, flags); 189 187 } 190 188 191 189 #define uart_set_mctrl(port, set) uart_update_mctrl(port, set, 0) ··· 218 220 /* 219 221 * Set modem status enables based on termios cflag 220 222 */ 221 - uart_port_lock_irq(uport); 223 + guard(uart_port_lock_irq)(uport); 222 224 if (termios->c_cflag & CRTSCTS) 223 225 uport->status |= UPSTAT_CTS_ENABLE; 224 226 else ··· 239 241 else 240 242 __uart_start(state); 241 243 } 242 - uart_port_unlock_irq(uport); 243 244 } 244 245 245 246 static int uart_alloc_xmit_buf(struct tty_port *port) ··· 708 711 { 709 712 struct uart_state *state = tty->driver_data; 710 713 struct uart_port *port; 711 - unsigned long flags; 712 714 713 715 port = uart_port_ref(state); 714 716 if (!port) ··· 716 720 if (port->ops->send_xchar) 717 721 port->ops->send_xchar(port, ch); 718 722 else { 719 - uart_port_lock_irqsave(port, &flags); 723 + guard(uart_port_lock_irqsave)(port); 720 724 port->x_char = ch; 721 725 if (ch) 722 726 port->ops->start_tx(port); 723 - uart_port_unlock_irqrestore(port, flags); 724 727 } 725 728 uart_port_deref(port); 726 729 } ··· 1084 1089 struct uart_state *state = tty->driver_data; 1085 1090 struct tty_port *port = &state->port; 1086 1091 struct uart_port *uport; 1087 - int result; 1088 1092 1089 1093 guard(mutex)(&port->mutex); 1090 1094 ··· 1091 1097 if (!uport || tty_io_error(tty)) 1092 1098 return -EIO; 1093 1099 1094 - uart_port_lock_irq(uport); 1095 - result = uport->mctrl; 1096 - result |= uport->ops->get_mctrl(uport); 1097 - uart_port_unlock_irq(uport); 1100 + guard(uart_port_lock_irq)(uport); 1098 1101 1099 - return result; 1102 + return uport->mctrl | uport->ops->get_mctrl(uport); 1100 1103 } 1101 1104 1102 1105 static int ··· 1217 1226 uport = uart_port_ref(state); 1218 1227 if (!uport) 1219 1228 return -EIO; 1220 - uart_port_lock_irq(uport); 1221 - memcpy(&cprev, &uport->icount, sizeof(struct uart_icount)); 1222 - uart_enable_ms(uport); 1223 - uart_port_unlock_irq(uport); 1229 + scoped_guard(uart_port_lock_irq, uport) { 1230 + memcpy(&cprev, &uport->icount, sizeof(struct uart_icount)); 1231 + uart_enable_ms(uport); 1232 + } 1224 1233 1225 1234 add_wait_queue(&port->delta_msr_wait, &wait); 1226 1235 for (;;) { 1227 - uart_port_lock_irq(uport); 1228 - memcpy(&cnow, &uport->icount, sizeof(struct uart_icount)); 1229 - uart_port_unlock_irq(uport); 1236 + scoped_guard(uart_port_lock_irq, uport) 1237 + memcpy(&cnow, &uport->icount, sizeof(struct uart_icount)); 1230 1238 1231 1239 set_current_state(TASK_INTERRUPTIBLE); 1232 1240 ··· 1420 1430 static int uart_rs485_config(struct uart_port *port) 1421 1431 { 1422 1432 struct serial_rs485 *rs485 = &port->rs485; 1423 - unsigned long flags; 1424 1433 int ret; 1425 1434 1426 1435 if (!(rs485->flags & SER_RS485_ENABLED)) ··· 1429 1440 uart_set_rs485_termination(port, rs485); 1430 1441 uart_set_rs485_rx_during_tx(port, rs485); 1431 1442 1432 - uart_port_lock_irqsave(port, &flags); 1433 - ret = port->rs485_config(port, NULL, rs485); 1434 - uart_port_unlock_irqrestore(port, flags); 1443 + scoped_guard(uart_port_lock_irqsave, port) 1444 + ret = port->rs485_config(port, NULL, rs485); 1435 1445 if (ret) { 1436 1446 memset(rs485, 0, sizeof(*rs485)); 1437 1447 /* unset GPIOs */ ··· 1444 1456 static int uart_get_rs485_config(struct uart_port *port, 1445 1457 struct serial_rs485 __user *rs485) 1446 1458 { 1447 - unsigned long flags; 1448 1459 struct serial_rs485 aux; 1449 1460 1450 - uart_port_lock_irqsave(port, &flags); 1451 - aux = port->rs485; 1452 - uart_port_unlock_irqrestore(port, flags); 1461 + scoped_guard(uart_port_lock_irqsave, port) 1462 + aux = port->rs485; 1453 1463 1454 1464 if (copy_to_user(rs485, &aux, sizeof(aux))) 1455 1465 return -EFAULT; ··· 1460 1474 { 1461 1475 struct serial_rs485 rs485; 1462 1476 int ret; 1463 - unsigned long flags; 1464 1477 1465 1478 if (!(port->rs485_supported.flags & SER_RS485_ENABLED)) 1466 1479 return -ENOTTY; ··· 1474 1489 uart_set_rs485_termination(port, &rs485); 1475 1490 uart_set_rs485_rx_during_tx(port, &rs485); 1476 1491 1477 - uart_port_lock_irqsave(port, &flags); 1478 - ret = port->rs485_config(port, &tty->termios, &rs485); 1479 - if (!ret) { 1480 - port->rs485 = rs485; 1492 + scoped_guard(uart_port_lock_irqsave, port) { 1493 + ret = port->rs485_config(port, &tty->termios, &rs485); 1494 + if (!ret) { 1495 + port->rs485 = rs485; 1481 1496 1482 - /* Reset RTS and other mctrl lines when disabling RS485 */ 1483 - if (!(rs485.flags & SER_RS485_ENABLED)) 1484 - port->ops->set_mctrl(port, port->mctrl); 1497 + /* Reset RTS and other mctrl lines when disabling RS485 */ 1498 + if (!(rs485.flags & SER_RS485_ENABLED)) 1499 + port->ops->set_mctrl(port, port->mctrl); 1500 + } 1485 1501 } 1486 - uart_port_unlock_irqrestore(port, flags); 1487 1502 if (ret) { 1488 1503 /* restore old GPIO settings */ 1489 1504 gpiod_set_value_cansleep(port->rs485_term_gpio, ··· 1502 1517 static int uart_get_iso7816_config(struct uart_port *port, 1503 1518 struct serial_iso7816 __user *iso7816) 1504 1519 { 1505 - unsigned long flags; 1506 1520 struct serial_iso7816 aux; 1507 1521 1508 1522 if (!port->iso7816_config) 1509 1523 return -ENOTTY; 1510 1524 1511 - uart_port_lock_irqsave(port, &flags); 1512 - aux = port->iso7816; 1513 - uart_port_unlock_irqrestore(port, flags); 1525 + scoped_guard(uart_port_lock_irqsave, port) 1526 + aux = port->iso7816; 1514 1527 1515 1528 if (copy_to_user(iso7816, &aux, sizeof(aux))) 1516 1529 return -EFAULT; ··· 1520 1537 struct serial_iso7816 __user *iso7816_user) 1521 1538 { 1522 1539 struct serial_iso7816 iso7816; 1523 - int i, ret; 1524 - unsigned long flags; 1540 + int i; 1525 1541 1526 1542 if (!port->iso7816_config) 1527 1543 return -ENOTTY; ··· 1536 1554 if (iso7816.reserved[i]) 1537 1555 return -EINVAL; 1538 1556 1539 - uart_port_lock_irqsave(port, &flags); 1540 - ret = port->iso7816_config(port, &iso7816); 1541 - uart_port_unlock_irqrestore(port, flags); 1542 - if (ret) 1543 - return ret; 1557 + scoped_guard(uart_port_lock_irqsave, port) { 1558 + int ret = port->iso7816_config(port, &iso7816); 1559 + if (ret) 1560 + return ret; 1561 + } 1544 1562 1545 1563 if (copy_to_user(iso7816_user, &port->iso7816, sizeof(port->iso7816))) 1546 1564 return -EFAULT; ··· 1752 1770 if (WARN(!uport, "detached port still initialized!\n")) 1753 1771 return; 1754 1772 1755 - uart_port_lock_irq(uport); 1756 - uport->ops->stop_rx(uport); 1757 - uart_port_unlock_irq(uport); 1773 + scoped_guard(uart_port_lock_irq, uport) 1774 + uport->ops->stop_rx(uport); 1758 1775 1759 1776 serial_base_port_shutdown(uport); 1760 1777 uart_port_shutdown(port); ··· 2025 2044 pm_state = state->pm_state; 2026 2045 if (pm_state != UART_PM_STATE_ON) 2027 2046 uart_change_pm(state, UART_PM_STATE_ON); 2028 - uart_port_lock_irq(uport); 2029 - status = uport->ops->get_mctrl(uport); 2030 - uart_port_unlock_irq(uport); 2047 + scoped_guard(uart_port_lock_irq, uport) 2048 + status = uport->ops->get_mctrl(uport); 2031 2049 if (pm_state != UART_PM_STATE_ON) 2032 2050 uart_change_pm(state, pm_state); 2033 2051 ··· 2335 2355 */ 2336 2356 if (!console_suspend_enabled && uart_console(uport)) { 2337 2357 if (uport->ops->start_rx) { 2338 - uart_port_lock_irq(uport); 2358 + guard(uart_port_lock_irq)(uport); 2339 2359 uport->ops->stop_rx(uport); 2340 - uart_port_unlock_irq(uport); 2341 2360 } 2342 2361 device_set_awake_path(uport->dev); 2343 2362 return 0; ··· 2352 2373 tty_port_set_suspended(port, true); 2353 2374 tty_port_set_initialized(port, false); 2354 2375 2355 - uart_port_lock_irq(uport); 2356 - ops->stop_tx(uport); 2357 - if (!(uport->rs485.flags & SER_RS485_ENABLED)) 2358 - ops->set_mctrl(uport, 0); 2359 - /* save mctrl so it can be restored on resume */ 2360 - mctrl = uport->mctrl; 2361 - uport->mctrl = 0; 2362 - ops->stop_rx(uport); 2363 - uart_port_unlock_irq(uport); 2376 + scoped_guard(uart_port_lock_irq, uport) { 2377 + ops->stop_tx(uport); 2378 + if (!(uport->rs485.flags & SER_RS485_ENABLED)) 2379 + ops->set_mctrl(uport, 0); 2380 + /* save mctrl so it can be restored on resume */ 2381 + mctrl = uport->mctrl; 2382 + uport->mctrl = 0; 2383 + ops->stop_rx(uport); 2384 + } 2364 2385 2365 2386 /* 2366 2387 * Wait for the transmitter to empty. ··· 2429 2450 uart_change_pm(state, UART_PM_STATE_ON); 2430 2451 uport->ops->set_termios(uport, &termios, NULL); 2431 2452 if (!console_suspend_enabled && uport->ops->start_rx) { 2432 - uart_port_lock_irq(uport); 2453 + guard(uart_port_lock_irq)(uport); 2433 2454 uport->ops->start_rx(uport); 2434 - uart_port_unlock_irq(uport); 2435 2455 } 2436 2456 if (console_suspend_enabled) 2437 2457 console_resume(uport->cons); ··· 2441 2463 int ret; 2442 2464 2443 2465 uart_change_pm(state, UART_PM_STATE_ON); 2444 - uart_port_lock_irq(uport); 2445 - if (!(uport->rs485.flags & SER_RS485_ENABLED)) 2446 - ops->set_mctrl(uport, 0); 2447 - uart_port_unlock_irq(uport); 2466 + scoped_guard(uart_port_lock_irq, uport) 2467 + if (!(uport->rs485.flags & SER_RS485_ENABLED)) 2468 + ops->set_mctrl(uport, 0); 2448 2469 if (console_suspend_enabled || !uart_console(uport)) { 2449 2470 /* Protected by port mutex for now */ 2450 2471 struct tty_struct *tty = port->tty; ··· 2453 2476 if (tty) 2454 2477 uart_change_line_settings(tty, state, NULL); 2455 2478 uart_rs485_config(uport); 2456 - uart_port_lock_irq(uport); 2457 - if (!(uport->rs485.flags & SER_RS485_ENABLED)) 2458 - ops->set_mctrl(uport, uport->mctrl); 2459 - ops->start_tx(uport); 2460 - uart_port_unlock_irq(uport); 2479 + scoped_guard(uart_port_lock_irq, uport) { 2480 + if (!(uport->rs485.flags & SER_RS485_ENABLED)) 2481 + ops->set_mctrl(uport, uport->mctrl); 2482 + ops->start_tx(uport); 2483 + } 2461 2484 tty_port_set_initialized(port, true); 2462 2485 } else { 2463 2486 /* ··· 2551 2574 } 2552 2575 2553 2576 if (port->type != PORT_UNKNOWN) { 2554 - unsigned long flags; 2555 - 2556 2577 uart_report_port(drv, port); 2557 2578 2558 2579 /* Synchronize with possible boot console. */ ··· 2565 2590 * keep the DTR setting that is set in uart_set_options() 2566 2591 * We probably don't need a spinlock around this, but 2567 2592 */ 2568 - uart_port_lock_irqsave(port, &flags); 2569 - port->mctrl &= TIOCM_DTR; 2570 - if (!(port->rs485.flags & SER_RS485_ENABLED)) 2571 - port->ops->set_mctrl(port, port->mctrl); 2572 - uart_port_unlock_irqrestore(port, flags); 2593 + scoped_guard(uart_port_lock_irqsave, port) { 2594 + port->mctrl &= TIOCM_DTR; 2595 + if (!(port->rs485.flags & SER_RS485_ENABLED)) 2596 + port->ops->set_mctrl(port, port->mctrl); 2597 + } 2573 2598 2574 2599 uart_rs485_config(port); 2575 2600
+1 -2
drivers/tty/sysrq.c
··· 1133 1133 * Behaves like do_proc_dointvec as t does not have min nor max. 1134 1134 */ 1135 1135 ret = proc_dointvec_minmax(&t, write, buffer, lenp, ppos); 1136 - 1137 - if (ret || !write) 1136 + if (ret) 1138 1137 return ret; 1139 1138 1140 1139 if (write)
+74 -94
drivers/tty/tty_port.c
··· 63 63 64 64 static void tty_port_default_wakeup(struct tty_port *port) 65 65 { 66 - struct tty_struct *tty = tty_port_tty_get(port); 67 - 68 - if (tty) { 69 - tty_wakeup(tty); 70 - tty_kref_put(tty); 71 - } 66 + scoped_guard(tty_port_tty, port) 67 + tty_wakeup(scoped_tty()); 72 68 } 73 69 74 70 const struct tty_port_client_operations tty_port_default_client_ops = { ··· 221 225 int tty_port_alloc_xmit_buf(struct tty_port *port) 222 226 { 223 227 /* We may sleep in get_zeroed_page() */ 224 - mutex_lock(&port->buf_mutex); 225 - if (port->xmit_buf == NULL) { 226 - port->xmit_buf = (u8 *)get_zeroed_page(GFP_KERNEL); 227 - if (port->xmit_buf) 228 - kfifo_init(&port->xmit_fifo, port->xmit_buf, PAGE_SIZE); 229 - } 230 - mutex_unlock(&port->buf_mutex); 228 + guard(mutex)(&port->buf_mutex); 229 + 230 + if (port->xmit_buf) 231 + return 0; 232 + 233 + port->xmit_buf = (u8 *)get_zeroed_page(GFP_KERNEL); 231 234 if (port->xmit_buf == NULL) 232 235 return -ENOMEM; 236 + 237 + kfifo_init(&port->xmit_fifo, port->xmit_buf, PAGE_SIZE); 238 + 233 239 return 0; 234 240 } 235 241 EXPORT_SYMBOL(tty_port_alloc_xmit_buf); 236 242 237 243 void tty_port_free_xmit_buf(struct tty_port *port) 238 244 { 239 - mutex_lock(&port->buf_mutex); 245 + guard(mutex)(&port->buf_mutex); 240 246 free_page((unsigned long)port->xmit_buf); 241 247 port->xmit_buf = NULL; 242 248 INIT_KFIFO(port->xmit_fifo); 243 - mutex_unlock(&port->buf_mutex); 244 249 } 245 250 EXPORT_SYMBOL(tty_port_free_xmit_buf); 246 251 ··· 298 301 */ 299 302 struct tty_struct *tty_port_tty_get(struct tty_port *port) 300 303 { 301 - unsigned long flags; 302 - struct tty_struct *tty; 303 - 304 - spin_lock_irqsave(&port->lock, flags); 305 - tty = tty_kref_get(port->tty); 306 - spin_unlock_irqrestore(&port->lock, flags); 307 - return tty; 304 + guard(spinlock_irqsave)(&port->lock); 305 + return tty_kref_get(port->tty); 308 306 } 309 307 EXPORT_SYMBOL(tty_port_tty_get); 310 308 ··· 313 321 */ 314 322 void tty_port_tty_set(struct tty_port *port, struct tty_struct *tty) 315 323 { 316 - unsigned long flags; 317 - 318 - spin_lock_irqsave(&port->lock, flags); 324 + guard(spinlock_irqsave)(&port->lock); 319 325 tty_kref_put(port->tty); 320 326 port->tty = tty_kref_get(tty); 321 - spin_unlock_irqrestore(&port->lock, flags); 322 327 } 323 328 EXPORT_SYMBOL(tty_port_tty_set); 324 329 ··· 331 342 */ 332 343 static void tty_port_shutdown(struct tty_port *port, struct tty_struct *tty) 333 344 { 334 - mutex_lock(&port->mutex); 345 + guard(mutex)(&port->mutex); 346 + 335 347 if (port->console) 336 - goto out; 348 + return; 337 349 338 - if (tty_port_initialized(port)) { 339 - tty_port_set_initialized(port, false); 340 - /* 341 - * Drop DTR/RTS if HUPCL is set. This causes any attached 342 - * modem to hang up the line. 343 - */ 344 - if (tty && C_HUPCL(tty)) 345 - tty_port_lower_dtr_rts(port); 350 + if (!tty_port_initialized(port)) 351 + return; 346 352 347 - if (port->ops->shutdown) 348 - port->ops->shutdown(port); 349 - } 350 - out: 351 - mutex_unlock(&port->mutex); 353 + tty_port_set_initialized(port, false); 354 + /* 355 + * Drop DTR/RTS if HUPCL is set. This causes any attached 356 + * modem to hang up the line. 357 + */ 358 + if (tty && C_HUPCL(tty)) 359 + tty_port_lower_dtr_rts(port); 360 + 361 + if (port->ops->shutdown) 362 + port->ops->shutdown(port); 352 363 } 353 364 354 365 /** ··· 363 374 void tty_port_hangup(struct tty_port *port) 364 375 { 365 376 struct tty_struct *tty; 366 - unsigned long flags; 367 377 368 - spin_lock_irqsave(&port->lock, flags); 369 - port->count = 0; 370 - tty = port->tty; 371 - if (tty) 372 - set_bit(TTY_IO_ERROR, &tty->flags); 373 - port->tty = NULL; 374 - spin_unlock_irqrestore(&port->lock, flags); 378 + scoped_guard(spinlock_irqsave, &port->lock) { 379 + port->count = 0; 380 + tty = port->tty; 381 + if (tty) 382 + set_bit(TTY_IO_ERROR, &tty->flags); 383 + port->tty = NULL; 384 + } 385 + 375 386 tty_port_set_active(port, false); 376 387 tty_port_shutdown(port, tty); 377 388 tty_kref_put(tty); ··· 382 393 383 394 void __tty_port_tty_hangup(struct tty_port *port, bool check_clocal, bool async) 384 395 { 385 - struct tty_struct *tty = tty_port_tty_get(port); 396 + scoped_guard(tty_port_tty, port) { 397 + struct tty_struct *tty = scoped_tty(); 386 398 387 - if (tty && (!check_clocal || !C_CLOCAL(tty))) { 388 - if (async) 389 - tty_hangup(tty); 390 - else 391 - tty_vhangup(tty); 399 + if (!check_clocal || !C_CLOCAL(tty)) { 400 + if (async) 401 + tty_hangup(tty); 402 + else 403 + tty_vhangup(tty); 404 + } 392 405 } 393 - tty_kref_put(tty); 394 406 } 395 407 EXPORT_SYMBOL_GPL(__tty_port_tty_hangup); 396 408 ··· 480 490 struct tty_struct *tty, struct file *filp) 481 491 { 482 492 int do_clocal = 0, retval; 483 - unsigned long flags; 484 493 DEFINE_WAIT(wait); 485 494 486 495 /* if non-blocking mode is set we can pass directly to open unless ··· 508 519 retval = 0; 509 520 510 521 /* The port lock protects the port counts */ 511 - spin_lock_irqsave(&port->lock, flags); 512 - port->count--; 513 - port->blocked_open++; 514 - spin_unlock_irqrestore(&port->lock, flags); 522 + scoped_guard(spinlock_irqsave, &port->lock) { 523 + port->count--; 524 + port->blocked_open++; 525 + } 515 526 516 527 while (1) { 517 528 /* Indicate we are open */ ··· 550 561 /* Update counts. A parallel hangup will have set count to zero and 551 562 * we must not mess that up further. 552 563 */ 553 - spin_lock_irqsave(&port->lock, flags); 554 - if (!tty_hung_up_p(filp)) 555 - port->count++; 556 - port->blocked_open--; 557 - spin_unlock_irqrestore(&port->lock, flags); 564 + scoped_guard(spinlock_irqsave, &port->lock) { 565 + if (!tty_hung_up_p(filp)) 566 + port->count++; 567 + port->blocked_open--; 568 + } 558 569 if (retval == 0) 559 570 tty_port_set_active(port, true); 560 571 return retval; ··· 593 604 int tty_port_close_start(struct tty_port *port, 594 605 struct tty_struct *tty, struct file *filp) 595 606 { 596 - unsigned long flags; 597 - 598 607 if (tty_hung_up_p(filp)) 599 608 return 0; 600 609 601 - spin_lock_irqsave(&port->lock, flags); 602 - if (tty->count == 1 && port->count != 1) { 603 - tty_warn(tty, "%s: tty->count = 1 port count = %d\n", __func__, 604 - port->count); 605 - port->count = 1; 606 - } 607 - if (--port->count < 0) { 608 - tty_warn(tty, "%s: bad port count (%d)\n", __func__, 609 - port->count); 610 - port->count = 0; 611 - } 610 + scoped_guard(spinlock_irqsave, &port->lock) { 611 + if (tty->count == 1 && port->count != 1) { 612 + tty_warn(tty, "%s: tty->count = 1 port count = %d\n", __func__, 613 + port->count); 614 + port->count = 1; 615 + } 616 + if (--port->count < 0) { 617 + tty_warn(tty, "%s: bad port count (%d)\n", __func__, 618 + port->count); 619 + port->count = 0; 620 + } 612 621 613 - if (port->count) { 614 - spin_unlock_irqrestore(&port->lock, flags); 615 - return 0; 622 + if (port->count) 623 + return 0; 616 624 } 617 - spin_unlock_irqrestore(&port->lock, flags); 618 625 619 626 tty->closing = 1; 620 627 ··· 729 744 int tty_port_open(struct tty_port *port, struct tty_struct *tty, 730 745 struct file *filp) 731 746 { 732 - spin_lock_irq(&port->lock); 733 - ++port->count; 734 - spin_unlock_irq(&port->lock); 747 + scoped_guard(spinlock_irq, &port->lock) 748 + ++port->count; 735 749 tty_port_tty_set(port, tty); 736 750 737 751 /* ··· 739 755 * port mutex. 740 756 */ 741 757 742 - mutex_lock(&port->mutex); 743 - 744 - if (!tty_port_initialized(port)) { 758 + scoped_guard(mutex, &port->mutex) { 759 + if (tty_port_initialized(port)) 760 + break; 745 761 clear_bit(TTY_IO_ERROR, &tty->flags); 746 762 if (port->ops->activate) { 747 763 int retval = port->ops->activate(port, tty); 748 - 749 - if (retval) { 750 - mutex_unlock(&port->mutex); 764 + if (retval) 751 765 return retval; 752 - } 753 766 } 754 767 tty_port_set_initialized(port, true); 755 768 } 756 - mutex_unlock(&port->mutex); 757 769 return tty_port_block_til_ready(port, tty, filp); 758 770 } 759 771 EXPORT_SYMBOL(tty_port_open);
+51 -65
drivers/tty/vt/consolemap.c
··· 361 361 inbuf[i] = UNI_DIRECT_BASE | ch; 362 362 } 363 363 364 - console_lock(); 364 + guard(console_lock)(); 365 365 memcpy(translations[USER_MAP], inbuf, sizeof(inbuf)); 366 366 update_user_maps(); 367 - console_unlock(); 367 + 368 368 return 0; 369 369 } 370 370 ··· 374 374 unsigned short *p = translations[USER_MAP]; 375 375 unsigned char outbuf[E_TABSZ]; 376 376 377 - console_lock(); 378 - for (i = 0; i < ARRAY_SIZE(outbuf); i++) 379 - { 380 - ch = conv_uni_to_pc(vc_cons[fg_console].d, p[i]); 381 - outbuf[i] = (ch & ~0xff) ? 0 : ch; 382 - } 383 - console_unlock(); 377 + scoped_guard(console_lock) 378 + for (i = 0; i < ARRAY_SIZE(outbuf); i++) { 379 + ch = conv_uni_to_pc(vc_cons[fg_console].d, p[i]); 380 + outbuf[i] = (ch & ~0xff) ? 0 : ch; 381 + } 384 382 385 383 return copy_to_user(arg, outbuf, sizeof(outbuf)) ? -EFAULT : 0; 386 384 } ··· 390 392 if (copy_from_user(inbuf, arg, sizeof(inbuf))) 391 393 return -EFAULT; 392 394 393 - console_lock(); 395 + guard(console_lock)(); 394 396 memcpy(translations[USER_MAP], inbuf, sizeof(inbuf)); 395 397 update_user_maps(); 396 - console_unlock(); 398 + 397 399 return 0; 398 400 } 399 401 ··· 401 403 { 402 404 unsigned short outbuf[E_TABSZ]; 403 405 404 - console_lock(); 405 - memcpy(outbuf, translations[USER_MAP], sizeof(outbuf)); 406 - console_unlock(); 406 + scoped_guard(console_lock) 407 + memcpy(outbuf, translations[USER_MAP], sizeof(outbuf)); 407 408 408 409 return copy_to_user(arg, outbuf, sizeof(outbuf)) ? -EFAULT : 0; 409 410 } ··· 568 571 569 572 int con_clear_unimap(struct vc_data *vc) 570 573 { 571 - int ret; 572 - console_lock(); 573 - ret = con_do_clear_unimap(vc); 574 - console_unlock(); 575 - return ret; 574 + guard(console_lock)(); 575 + return con_do_clear_unimap(vc); 576 576 } 577 577 578 578 static struct uni_pagedict *con_unshare_unimap(struct vc_data *vc, ··· 631 637 632 638 int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list) 633 639 { 634 - int err = 0, err1; 635 640 struct uni_pagedict *dict; 636 - struct unipair *unilist, *plist; 641 + struct unipair *plist; 642 + int err = 0; 637 643 638 644 if (!ct) 639 645 return 0; 640 646 641 - unilist = vmemdup_array_user(list, ct, sizeof(*unilist)); 647 + struct unipair *unilist __free(kvfree) = vmemdup_array_user(list, ct, sizeof(*unilist)); 642 648 if (IS_ERR(unilist)) 643 649 return PTR_ERR(unilist); 644 650 645 - console_lock(); 651 + guard(console_lock)(); 646 652 647 653 /* Save original vc_unipagdir_loc in case we allocate a new one */ 648 654 dict = *vc->uni_pagedict_loc; 649 - if (!dict) { 650 - err = -EINVAL; 651 - goto out_unlock; 652 - } 655 + if (!dict) 656 + return -EINVAL; 653 657 654 658 if (dict->refcount > 1) { 655 659 dict = con_unshare_unimap(vc, dict); 656 - if (IS_ERR(dict)) { 657 - err = PTR_ERR(dict); 658 - goto out_unlock; 659 - } 660 + if (IS_ERR(dict)) 661 + return PTR_ERR(dict); 660 662 } else if (dict == dflt) { 661 663 dflt = NULL; 662 664 } ··· 661 671 * Insert user specified unicode pairs into new table. 662 672 */ 663 673 for (plist = unilist; ct; ct--, plist++) { 664 - err1 = con_insert_unipair(dict, plist->unicode, plist->fontpos); 674 + int err1 = con_insert_unipair(dict, plist->unicode, plist->fontpos); 665 675 if (err1) 666 676 err = err1; 667 677 } ··· 670 680 * Merge with fontmaps of any other virtual consoles. 671 681 */ 672 682 if (con_unify_unimap(vc, dict)) 673 - goto out_unlock; 683 + return err; 674 684 675 685 for (enum translation_map m = FIRST_MAP; m <= LAST_MAP; m++) 676 686 set_inverse_transl(vc, dict, m); 677 687 set_inverse_trans_unicode(dict); 678 688 679 - out_unlock: 680 - console_unlock(); 681 - kvfree(unilist); 682 689 return err; 683 690 } 684 691 ··· 774 787 { 775 788 ushort ect; 776 789 struct uni_pagedict *dict; 777 - struct unipair *unilist; 778 790 unsigned int d, r, g; 779 - int ret = 0; 780 791 781 - unilist = kvmalloc_array(ct, sizeof(*unilist), GFP_KERNEL); 792 + struct unipair *unilist __free(kvfree) = kvmalloc_array(ct, sizeof(*unilist), GFP_KERNEL); 782 793 if (!unilist) 783 794 return -ENOMEM; 784 795 785 - console_lock(); 796 + scoped_guard(console_lock) { 797 + ect = 0; 798 + dict = *vc->uni_pagedict_loc; 799 + if (!dict) 800 + break; 786 801 787 - ect = 0; 788 - dict = *vc->uni_pagedict_loc; 789 - if (!dict) 790 - goto unlock; 791 - 792 - for (d = 0; d < UNI_DIRS; d++) { 793 - u16 **dir = dict->uni_pgdir[d]; 794 - if (!dir) 795 - continue; 796 - 797 - for (r = 0; r < UNI_DIR_ROWS; r++) { 798 - u16 *row = dir[r]; 799 - if (!row) 802 + for (d = 0; d < UNI_DIRS; d++) { 803 + u16 **dir = dict->uni_pgdir[d]; 804 + if (!dir) 800 805 continue; 801 806 802 - for (g = 0; g < UNI_ROW_GLYPHS; g++, row++) { 803 - if (*row >= MAX_GLYPH) 807 + for (r = 0; r < UNI_DIR_ROWS; r++) { 808 + u16 *row = dir[r]; 809 + if (!row) 804 810 continue; 805 - if (ect < ct) { 806 - unilist[ect].unicode = UNI(d, r, g); 807 - unilist[ect].fontpos = *row; 811 + 812 + for (g = 0; g < UNI_ROW_GLYPHS; g++, row++) { 813 + if (*row >= MAX_GLYPH) 814 + continue; 815 + if (ect < ct) { 816 + unilist[ect].unicode = UNI(d, r, g); 817 + unilist[ect].fontpos = *row; 818 + } 819 + ect++; 808 820 } 809 - ect++; 810 821 } 811 822 } 812 823 } 813 - unlock: 814 - console_unlock(); 824 + 815 825 if (copy_to_user(list, unilist, min(ect, ct) * sizeof(*unilist))) 816 - ret = -EFAULT; 826 + return -EFAULT; 817 827 if (put_user(ect, uct)) 818 - ret = -EFAULT; 819 - kvfree(unilist); 820 - return ret ? ret : (ect <= ct) ? 0 : -ENOMEM; 828 + return -EFAULT; 829 + if (ect > ct) 830 + return -ENOMEM; 831 + 832 + return 0; 821 833 } 822 834 823 835 /*
+6 -14
drivers/tty/vt/selection.c
··· 127 127 if (copy_from_user(tmplut, lut, sizeof(inwordLut))) 128 128 return -EFAULT; 129 129 130 - console_lock(); 130 + guard(console_lock)(); 131 131 memcpy(inwordLut, tmplut, sizeof(inwordLut)); 132 - console_unlock(); 133 132 134 133 return 0; 135 134 } ··· 374 375 375 376 int set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty) 376 377 { 377 - int ret; 378 - 379 - mutex_lock(&vc_sel.lock); 380 - console_lock(); 381 - ret = vc_selection(vc_cons[fg_console].d, v, tty); 382 - console_unlock(); 383 - mutex_unlock(&vc_sel.lock); 384 - 385 - return ret; 378 + guard(mutex)(&vc_sel.lock); 379 + guard(console_lock)(); 380 + return vc_selection(vc_cons[fg_console].d, v, tty); 386 381 } 387 382 EXPORT_SYMBOL_GPL(set_selection_kernel); 388 383 ··· 402 409 const char *bps = bp ? bracketed_paste_start : NULL; 403 410 const char *bpe = bp ? bracketed_paste_end : NULL; 404 411 405 - console_lock(); 406 - poke_blanked_console(); 407 - console_unlock(); 412 + scoped_guard(console_lock) 413 + poke_blanked_console(); 408 414 409 415 ld = tty_ldisc_ref_wait(tty); 410 416 if (!ld)
+29 -45
drivers/tty/vt/vc_screen.c
··· 53 53 #define HEADER_SIZE 4u 54 54 #define CON_BUF_SIZE (IS_ENABLED(CONFIG_BASE_SMALL) ? 256 : PAGE_SIZE) 55 55 56 + DEFINE_FREE(free_page_ptr, void *, if (_T) free_page((unsigned long)_T)); 57 + 56 58 /* 57 59 * Our minor space: 58 60 * ··· 73 71 #define console(inode) (iminor(inode) & 63) 74 72 #define use_unicode(inode) (iminor(inode) & 64) 75 73 #define use_attributes(inode) (iminor(inode) & 128) 76 - 77 74 78 75 struct vcs_poll_data { 79 76 struct notifier_block notifier; ··· 232 231 struct vc_data *vc; 233 232 int size; 234 233 235 - console_lock(); 236 - vc = vcs_vc(inode, NULL); 237 - if (!vc) { 238 - console_unlock(); 239 - return -ENXIO; 240 - } 234 + scoped_guard(console_lock) { 235 + vc = vcs_vc(inode, NULL); 236 + if (!vc) 237 + return -ENXIO; 241 238 242 - size = vcs_size(vc, use_attributes(inode), use_unicode(inode)); 243 - console_unlock(); 239 + size = vcs_size(vc, use_attributes(inode), use_unicode(inode)); 240 + } 244 241 if (size < 0) 245 242 return size; 246 243 return fixed_size_llseek(file, offset, orig, size); ··· 368 369 struct vcs_poll_data *poll; 369 370 unsigned int read; 370 371 ssize_t ret; 371 - char *con_buf; 372 372 loff_t pos; 373 373 bool viewed, attr, uni_mode; 374 374 375 - con_buf = (char *) __get_free_page(GFP_KERNEL); 375 + char *con_buf __free(free_page_ptr) = (char *)__get_free_page(GFP_KERNEL); 376 376 if (!con_buf) 377 377 return -ENOMEM; 378 378 ··· 380 382 /* Select the proper current console and verify 381 383 * sanity of the situation under the console lock. 382 384 */ 383 - console_lock(); 385 + guard(console_lock)(); 384 386 385 387 uni_mode = use_unicode(inode); 386 388 attr = use_attributes(inode); 387 389 388 - ret = -EINVAL; 389 390 if (pos < 0) 390 - goto unlock_out; 391 + return -EINVAL; 391 392 /* we enforce 32-bit alignment for pos and count in unicode mode */ 392 393 if (uni_mode && (pos | count) & 3) 393 - goto unlock_out; 394 + return -EINVAL; 394 395 395 396 poll = file->private_data; 396 397 if (count && poll) ··· 465 468 } 466 469 *ppos += read; 467 470 if (read) 468 - ret = read; 469 - unlock_out: 470 - console_unlock(); 471 - free_page((unsigned long) con_buf); 471 + return read; 472 + 472 473 return ret; 473 474 } 474 475 ··· 586 591 { 587 592 struct inode *inode = file_inode(file); 588 593 struct vc_data *vc; 589 - char *con_buf; 590 594 u16 *org0, *org; 591 595 unsigned int written; 592 596 int size; ··· 596 602 if (use_unicode(inode)) 597 603 return -EOPNOTSUPP; 598 604 599 - con_buf = (char *) __get_free_page(GFP_KERNEL); 605 + char *con_buf __free(free_page_ptr) = (char *)__get_free_page(GFP_KERNEL); 600 606 if (!con_buf) 601 607 return -ENOMEM; 602 608 ··· 605 611 /* Select the proper current console and verify 606 612 * sanity of the situation under the console lock. 607 613 */ 608 - console_lock(); 614 + guard(console_lock)(); 609 615 610 616 attr = use_attributes(inode); 611 - ret = -ENXIO; 612 617 vc = vcs_vc(inode, &viewed); 613 618 if (!vc) 614 - goto unlock_out; 619 + return -ENXIO; 615 620 616 621 size = vcs_size(vc, attr, false); 617 - if (size < 0) { 618 - ret = size; 619 - goto unlock_out; 620 - } 621 - ret = -EINVAL; 622 + if (size < 0) 623 + return size; 622 624 if (pos < 0 || pos > size) 623 - goto unlock_out; 625 + return -EINVAL; 624 626 if (count > size - pos) 625 627 count = size - pos; 626 628 written = 0; ··· 641 651 */ 642 652 if (written) 643 653 break; 644 - ret = -EFAULT; 645 - goto unlock_out; 654 + return -EFAULT; 646 655 } 647 656 } 648 657 ··· 653 664 if (!vc) { 654 665 if (written) 655 666 break; 656 - ret = -ENXIO; 657 - goto unlock_out; 667 + return -ENXIO; 658 668 } 659 669 size = vcs_size(vc, attr, false); 660 670 if (size < 0) { 661 671 if (written) 662 672 break; 663 - ret = size; 664 - goto unlock_out; 673 + return size; 665 674 } 666 675 if (pos >= size) 667 676 break; ··· 689 702 if (written) 690 703 vcs_scr_updated(vc); 691 704 692 - unlock_out: 693 - console_unlock(); 694 - free_page((unsigned long) con_buf); 695 705 return ret; 696 706 } 697 707 ··· 738 754 unsigned int currcons = console(inode); 739 755 bool attr = use_attributes(inode); 740 756 bool uni_mode = use_unicode(inode); 741 - int ret = 0; 742 757 743 758 /* we currently don't support attributes in unicode mode */ 744 759 if (attr && uni_mode) 745 760 return -EOPNOTSUPP; 746 761 747 - console_lock(); 748 - if(currcons && !vc_cons_allocated(currcons-1)) 749 - ret = -ENXIO; 750 - console_unlock(); 751 - return ret; 762 + guard(console_lock)(); 763 + 764 + if (currcons && !vc_cons_allocated(currcons - 1)) 765 + return -ENXIO; 766 + 767 + return 0; 752 768 } 753 769 754 770 static int vcs_release(struct inode *inode, struct file *file)
+136 -111
drivers/tty/vt/vt.c
··· 141 141 static int con_open(struct tty_struct *, struct file *); 142 142 static void vc_init(struct vc_data *vc, int do_clear); 143 143 static void gotoxy(struct vc_data *vc, int new_x, int new_y); 144 + static void restore_cur(struct vc_data *vc); 144 145 static void save_cur(struct vc_data *vc); 145 146 static void reset_terminal(struct vc_data *vc, int do_clear); 146 147 static void con_flush_chars(struct tty_struct *tty); ··· 1318 1317 static int vt_resize(struct tty_struct *tty, struct winsize *ws) 1319 1318 { 1320 1319 struct vc_data *vc = tty->driver_data; 1321 - int ret; 1322 1320 1323 - console_lock(); 1324 - ret = vc_do_resize(tty, vc, ws->ws_col, ws->ws_row, false); 1325 - console_unlock(); 1326 - return ret; 1321 + guard(console_lock)(); 1322 + return vc_do_resize(tty, vc, ws->ws_col, ws->ws_row, false); 1327 1323 } 1328 1324 1329 1325 struct vc_data *vc_deallocate(unsigned int currcons) ··· 1341 1343 vc_uniscr_set(vc, NULL); 1342 1344 kfree(vc->vc_screenbuf); 1343 1345 vc_cons[currcons].d = NULL; 1346 + if (vc->vc_saved_screen != NULL) { 1347 + kfree(vc->vc_saved_screen); 1348 + vc->vc_saved_screen = NULL; 1349 + } 1344 1350 } 1345 1351 return vc; 1346 1352 } ··· 1880 1878 return vc->vc_bracketed_paste; 1881 1879 } 1882 1880 1881 + /* console_lock is held */ 1882 + static void enter_alt_screen(struct vc_data *vc) 1883 + { 1884 + unsigned int size = vc->vc_rows * vc->vc_cols * 2; 1885 + 1886 + if (vc->vc_saved_screen != NULL) 1887 + return; /* Already inside an alt-screen */ 1888 + vc->vc_saved_screen = kmemdup((u16 *)vc->vc_origin, size, GFP_KERNEL); 1889 + if (vc->vc_saved_screen == NULL) 1890 + return; 1891 + vc->vc_saved_rows = vc->vc_rows; 1892 + vc->vc_saved_cols = vc->vc_cols; 1893 + save_cur(vc); 1894 + /* clear entire screen */ 1895 + csi_J(vc, CSI_J_FULL); 1896 + } 1897 + 1898 + /* console_lock is held */ 1899 + static void leave_alt_screen(struct vc_data *vc) 1900 + { 1901 + unsigned int rows = min(vc->vc_saved_rows, vc->vc_rows); 1902 + unsigned int cols = min(vc->vc_saved_cols, vc->vc_cols); 1903 + u16 *src, *dest; 1904 + 1905 + if (vc->vc_saved_screen == NULL) 1906 + return; /* Not inside an alt-screen */ 1907 + for (unsigned int r = 0; r < rows; r++) { 1908 + src = vc->vc_saved_screen + r * vc->vc_saved_cols; 1909 + dest = ((u16 *)vc->vc_origin) + r * vc->vc_cols; 1910 + memcpy(dest, src, 2 * cols); 1911 + } 1912 + restore_cur(vc); 1913 + /* Update the entire screen */ 1914 + if (con_should_update(vc)) 1915 + do_update_region(vc, vc->vc_origin, vc->vc_screenbuf_size / 2); 1916 + kfree(vc->vc_saved_screen); 1917 + vc->vc_saved_screen = NULL; 1918 + } 1919 + 1883 1920 enum { 1884 1921 CSI_DEC_hl_CURSOR_KEYS = 1, /* CKM: cursor keys send ^[Ox/^[[x */ 1885 1922 CSI_DEC_hl_132_COLUMNS = 3, /* COLM: 80/132 mode switch */ ··· 1929 1888 CSI_DEC_hl_MOUSE_X10 = 9, 1930 1889 CSI_DEC_hl_SHOW_CURSOR = 25, /* TCEM */ 1931 1890 CSI_DEC_hl_MOUSE_VT200 = 1000, 1891 + CSI_DEC_hl_ALT_SCREEN = 1049, 1932 1892 CSI_DEC_hl_BRACKETED_PASTE = 2004, 1933 1893 }; 1934 1894 ··· 1985 1943 break; 1986 1944 case CSI_DEC_hl_BRACKETED_PASTE: 1987 1945 vc->vc_bracketed_paste = on_off; 1946 + break; 1947 + case CSI_DEC_hl_ALT_SCREEN: 1948 + if (on_off) 1949 + enter_alt_screen(vc); 1950 + else 1951 + leave_alt_screen(vc); 1988 1952 break; 1989 1953 } 1990 1954 } ··· 2229 2181 vc->vc_decawm = 1; 2230 2182 vc->vc_deccm = global_cursor_default; 2231 2183 vc->vc_decim = 0; 2184 + 2185 + if (vc->vc_saved_screen != NULL) { 2186 + kfree(vc->vc_saved_screen); 2187 + vc->vc_saved_screen = NULL; 2188 + vc->vc_saved_rows = 0; 2189 + vc->vc_saved_cols = 0; 2190 + } 2232 2191 2233 2192 vt_reset_keyboard(vc->vc_num); 2234 2193 ··· 3190 3135 if (in_interrupt()) 3191 3136 return count; 3192 3137 3193 - console_lock(); 3138 + guard(console_lock)(); 3194 3139 currcons = vc->vc_num; 3195 3140 if (!vc_cons_allocated(currcons)) { 3196 3141 /* could this happen? */ 3197 3142 pr_warn_once("con_write: tty %d not allocated\n", currcons+1); 3198 - console_unlock(); 3199 3143 return 0; 3200 3144 } 3201 3145 ··· 3238 3184 con_flush(vc, &draw); 3239 3185 console_conditional_schedule(); 3240 3186 notify_update(vc); 3241 - console_unlock(); 3187 + 3242 3188 return n; 3243 3189 } 3244 3190 ··· 3253 3199 */ 3254 3200 static void console_callback(struct work_struct *ignored) 3255 3201 { 3256 - console_lock(); 3202 + guard(console_lock)(); 3257 3203 3258 3204 if (want_console >= 0) { 3259 3205 if (want_console != fg_console && ··· 3282 3228 blank_timer_expired = 0; 3283 3229 } 3284 3230 notify_update(vc_cons[fg_console].d); 3285 - 3286 - console_unlock(); 3287 3231 } 3288 3232 3289 3233 int set_console(int nr) ··· 3485 3433 return -EPERM; 3486 3434 return paste_selection(tty); 3487 3435 case TIOCL_UNBLANKSCREEN: 3488 - console_lock(); 3489 - unblank_screen(); 3490 - console_unlock(); 3436 + scoped_guard(console_lock) 3437 + unblank_screen(); 3491 3438 break; 3492 3439 case TIOCL_SELLOADLUT: 3493 3440 if (!capable(CAP_SYS_ADMIN)) ··· 3502 3451 data = vt_get_shift_state(); 3503 3452 return put_user(data, p); 3504 3453 case TIOCL_GETMOUSEREPORTING: 3505 - console_lock(); /* May be overkill */ 3506 - data = mouse_reporting(); 3507 - console_unlock(); 3454 + scoped_guard(console_lock) /* May be overkill */ 3455 + data = mouse_reporting(); 3508 3456 return put_user(data, p); 3509 3457 case TIOCL_SETVESABLANK: 3510 3458 return set_vesa_blanking(param); ··· 3534 3484 * Needs the console lock here. Note that lots of other calls 3535 3485 * need fixing before the lock is actually useful! 3536 3486 */ 3537 - console_lock(); 3538 - scrollfront(vc_cons[fg_console].d, lines); 3539 - console_unlock(); 3487 + scoped_guard(console_lock) 3488 + scrollfront(vc_cons[fg_console].d, lines); 3540 3489 break; 3541 3490 case TIOCL_BLANKSCREEN: /* until explicitly unblanked, not only poked */ 3542 - console_lock(); 3543 - ignore_poke = 1; 3544 - do_blank_screen(0); 3545 - console_unlock(); 3491 + scoped_guard(console_lock) { 3492 + ignore_poke = 1; 3493 + do_blank_screen(0); 3494 + } 3546 3495 break; 3547 3496 case TIOCL_BLANKEDSCREEN: 3548 3497 return console_blanked; ··· 3631 3582 if (in_interrupt()) /* from flush_to_ldisc */ 3632 3583 return; 3633 3584 3634 - console_lock(); 3585 + guard(console_lock)(); 3635 3586 set_cursor(vc); 3636 - console_unlock(); 3637 3587 } 3638 3588 3639 3589 /* ··· 3644 3596 struct vc_data *vc; 3645 3597 int ret; 3646 3598 3647 - console_lock(); 3599 + guard(console_lock)(); 3648 3600 ret = vc_allocate(currcons); 3649 3601 if (ret) 3650 - goto unlock; 3602 + return ret; 3651 3603 3652 3604 vc = vc_cons[currcons].d; 3653 3605 3654 3606 /* Still being freed */ 3655 - if (vc->port.tty) { 3656 - ret = -ERESTARTSYS; 3657 - goto unlock; 3658 - } 3607 + if (vc->port.tty) 3608 + return -ERESTARTSYS; 3659 3609 3660 3610 ret = tty_port_install(&vc->port, driver, tty); 3661 3611 if (ret) 3662 - goto unlock; 3612 + return ret; 3663 3613 3664 3614 tty->driver_data = vc; 3665 3615 vc->port.tty = tty; ··· 3671 3625 tty->termios.c_iflag |= IUTF8; 3672 3626 else 3673 3627 tty->termios.c_iflag &= ~IUTF8; 3674 - unlock: 3675 - console_unlock(); 3676 - return ret; 3628 + 3629 + return 0; 3677 3630 } 3678 3631 3679 3632 static int con_open(struct tty_struct *tty, struct file *filp) ··· 3691 3646 { 3692 3647 struct vc_data *vc = tty->driver_data; 3693 3648 BUG_ON(vc == NULL); 3694 - console_lock(); 3649 + 3650 + guard(console_lock)(); 3695 3651 vc->port.tty = NULL; 3696 - console_unlock(); 3697 3652 } 3698 3653 3699 3654 static void con_cleanup(struct tty_struct *tty) ··· 4182 4137 struct con_driver *con = dev_get_drvdata(dev); 4183 4138 int bind = simple_strtoul(buf, NULL, 0); 4184 4139 4185 - console_lock(); 4140 + guard(console_lock)(); 4186 4141 4187 4142 if (bind) 4188 4143 vt_bind(con); 4189 4144 else 4190 4145 vt_unbind(con); 4191 - 4192 - console_unlock(); 4193 4146 4194 4147 return count; 4195 4148 } ··· 4198 4155 struct con_driver *con = dev_get_drvdata(dev); 4199 4156 int bind; 4200 4157 4201 - console_lock(); 4202 - bind = con_is_bound(con->con); 4203 - console_unlock(); 4158 + scoped_guard(console_lock) 4159 + bind = con_is_bound(con->con); 4204 4160 4205 4161 return sysfs_emit(buf, "%i\n", bind); 4206 4162 } ··· 4471 4429 { 4472 4430 int i; 4473 4431 4474 - console_lock(); 4432 + guard(console_lock)(); 4475 4433 4476 4434 for (i = 0; i < MAX_NR_CON_DRIVER; i++) { 4477 4435 struct con_driver *con_driver = &registered_con_driver[i]; ··· 4496 4454 con_driver->first = 0; 4497 4455 con_driver->last = 0; 4498 4456 } 4499 - 4500 - console_unlock(); 4501 4457 } 4502 4458 4503 4459 /* ··· 4531 4491 */ 4532 4492 void give_up_console(const struct consw *csw) 4533 4493 { 4534 - console_lock(); 4494 + guard(console_lock)(); 4535 4495 do_unregister_con_driver(csw); 4536 - console_unlock(); 4537 4496 } 4538 4497 EXPORT_SYMBOL(give_up_console); 4539 4498 ··· 4580 4541 if (get_user(mode, mode_user)) 4581 4542 return -EFAULT; 4582 4543 4583 - console_lock(); 4544 + guard(console_lock)(); 4584 4545 vesa_blank_mode = (mode <= VESA_BLANK_MAX) ? mode : VESA_NO_BLANKING; 4585 - console_unlock(); 4586 4546 4587 4547 return 0; 4588 4548 } ··· 4767 4729 if (copy_from_user(colormap, arg, sizeof(colormap))) 4768 4730 return -EFAULT; 4769 4731 4770 - console_lock(); 4732 + guard(console_lock)(); 4771 4733 for (i = k = 0; i < 16; i++) { 4772 4734 default_red[i] = colormap[k++]; 4773 4735 default_grn[i] = colormap[k++]; ··· 4783 4745 } 4784 4746 set_palette(vc_cons[i].d); 4785 4747 } 4786 - console_unlock(); 4787 4748 4788 4749 return 0; 4789 4750 } ··· 4792 4755 int i, k; 4793 4756 unsigned char colormap[3*16]; 4794 4757 4795 - console_lock(); 4796 - for (i = k = 0; i < 16; i++) { 4797 - colormap[k++] = default_red[i]; 4798 - colormap[k++] = default_grn[i]; 4799 - colormap[k++] = default_blu[i]; 4800 - } 4801 - console_unlock(); 4758 + scoped_guard(console_lock) 4759 + for (i = k = 0; i < 16; i++) { 4760 + colormap[k++] = default_red[i]; 4761 + colormap[k++] = default_grn[i]; 4762 + colormap[k++] = default_blu[i]; 4763 + } 4802 4764 4803 4765 if (copy_to_user(arg, colormap, sizeof(colormap))) 4804 4766 return -EFAULT; ··· 4837 4801 static int con_font_get(struct vc_data *vc, struct console_font_op *op) 4838 4802 { 4839 4803 struct console_font font; 4840 - int rc = -EINVAL; 4841 4804 int c; 4842 4805 unsigned int vpitch = op->op == KD_FONT_OP_GET_TALL ? op->height : 32; 4843 4806 4844 4807 if (vpitch > max_font_height) 4845 4808 return -EINVAL; 4846 4809 4810 + void *font_data __free(kvfree) = NULL; 4847 4811 if (op->data) { 4848 - font.data = kvzalloc(max_font_size, GFP_KERNEL); 4812 + font.data = font_data = kvzalloc(max_font_size, GFP_KERNEL); 4849 4813 if (!font.data) 4850 4814 return -ENOMEM; 4851 4815 } else 4852 4816 font.data = NULL; 4853 4817 4854 - console_lock(); 4855 - if (vc->vc_mode != KD_TEXT) 4856 - rc = -EINVAL; 4857 - else if (vc->vc_sw->con_font_get) 4858 - rc = vc->vc_sw->con_font_get(vc, &font, vpitch); 4859 - else 4860 - rc = -ENOSYS; 4861 - console_unlock(); 4818 + scoped_guard(console_lock) { 4819 + if (vc->vc_mode != KD_TEXT) 4820 + return -EINVAL; 4821 + if (!vc->vc_sw->con_font_get) 4822 + return -ENOSYS; 4862 4823 4863 - if (rc) 4864 - goto out; 4824 + int ret = vc->vc_sw->con_font_get(vc, &font, vpitch); 4825 + if (ret) 4826 + return ret; 4827 + } 4865 4828 4866 4829 c = (font.width+7)/8 * vpitch * font.charcount; 4867 4830 4868 4831 if (op->data && font.charcount > op->charcount) 4869 - rc = -ENOSPC; 4832 + return -ENOSPC; 4870 4833 if (font.width > op->width || font.height > op->height) 4871 - rc = -ENOSPC; 4872 - if (rc) 4873 - goto out; 4834 + return -ENOSPC; 4874 4835 4875 4836 op->height = font.height; 4876 4837 op->width = font.width; 4877 4838 op->charcount = font.charcount; 4878 4839 4879 4840 if (op->data && copy_to_user(op->data, font.data, c)) 4880 - rc = -EFAULT; 4841 + return -EFAULT; 4881 4842 4882 - out: 4883 - kvfree(font.data); 4884 - return rc; 4843 + return 0; 4885 4844 } 4886 4845 4887 4846 static int con_font_set(struct vc_data *vc, const struct console_font_op *op) 4888 4847 { 4889 4848 struct console_font font; 4890 - int rc = -EINVAL; 4891 4849 int size; 4892 4850 unsigned int vpitch = op->op == KD_FONT_OP_SET_TALL ? op->height : 32; 4893 4851 4894 - if (vc->vc_mode != KD_TEXT) 4895 - return -EINVAL; 4896 4852 if (!op->data) 4897 4853 return -EINVAL; 4898 4854 if (op->charcount > max_font_glyphs) ··· 4898 4870 if (size > max_font_size) 4899 4871 return -ENOSPC; 4900 4872 4901 - font.data = memdup_user(op->data, size); 4873 + void *font_data __free(kfree) = font.data = memdup_user(op->data, size); 4902 4874 if (IS_ERR(font.data)) 4903 4875 return PTR_ERR(font.data); 4904 4876 ··· 4906 4878 font.width = op->width; 4907 4879 font.height = op->height; 4908 4880 4909 - console_lock(); 4881 + guard(console_lock)(); 4882 + 4910 4883 if (vc->vc_mode != KD_TEXT) 4911 - rc = -EINVAL; 4912 - else if (vc->vc_sw->con_font_set) { 4913 - if (vc_is_sel(vc)) 4914 - clear_selection(); 4915 - rc = vc->vc_sw->con_font_set(vc, &font, vpitch, op->flags); 4916 - } else 4917 - rc = -ENOSYS; 4918 - console_unlock(); 4919 - kfree(font.data); 4920 - return rc; 4884 + return -EINVAL; 4885 + if (!vc->vc_sw->con_font_set) 4886 + return -ENOSYS; 4887 + 4888 + if (vc_is_sel(vc)) 4889 + clear_selection(); 4890 + 4891 + return vc->vc_sw->con_font_set(vc, &font, vpitch, op->flags); 4921 4892 } 4922 4893 4923 4894 static int con_font_default(struct vc_data *vc, struct console_font_op *op) ··· 4924 4897 struct console_font font = {.width = op->width, .height = op->height}; 4925 4898 char name[MAX_FONT_NAME]; 4926 4899 char *s = name; 4927 - int rc; 4928 - 4929 4900 4930 4901 if (!op->data) 4931 4902 s = NULL; ··· 4932 4907 else 4933 4908 name[MAX_FONT_NAME - 1] = 0; 4934 4909 4935 - console_lock(); 4936 - if (vc->vc_mode != KD_TEXT) { 4937 - console_unlock(); 4938 - return -EINVAL; 4939 - } 4940 - if (vc->vc_sw->con_font_default) { 4910 + scoped_guard(console_lock) { 4911 + if (vc->vc_mode != KD_TEXT) 4912 + return -EINVAL; 4913 + if (!vc->vc_sw->con_font_default) 4914 + return -ENOSYS; 4915 + 4941 4916 if (vc_is_sel(vc)) 4942 4917 clear_selection(); 4943 - rc = vc->vc_sw->con_font_default(vc, &font, s); 4944 - } else 4945 - rc = -ENOSYS; 4946 - console_unlock(); 4947 - if (!rc) { 4948 - op->width = font.width; 4949 - op->height = font.height; 4918 + int ret = vc->vc_sw->con_font_default(vc, &font, s); 4919 + if (ret) 4920 + return ret; 4950 4921 } 4951 - return rc; 4922 + 4923 + op->width = font.width; 4924 + op->height = font.height; 4925 + 4926 + return 0; 4952 4927 } 4953 4928 4954 4929 int con_font_op(struct vc_data *vc, struct console_font_op *op)
+87 -107
drivers/tty/vt/vt_ioctl.c
··· 373 373 break; 374 374 } 375 375 376 - case KDSETMODE: 376 + case KDSETMODE: { 377 377 if (!perm) 378 378 return -EPERM; 379 379 380 - console_lock(); 381 - ret = vt_kdsetmode(vc, arg); 382 - console_unlock(); 383 - return ret; 384 - 380 + guard(console_lock)(); 381 + return vt_kdsetmode(vc, arg); 382 + } 385 383 case KDGETMODE: 386 384 return put_user(vc->vc_mode, (int __user *)arg); 387 385 ··· 599 601 600 602 vsa.console--; 601 603 vsa.console = array_index_nospec(vsa.console, MAX_NR_CONSOLES); 602 - console_lock(); 603 - ret = vc_allocate(vsa.console); 604 - if (ret) { 605 - console_unlock(); 606 - return ret; 607 - } 604 + scoped_guard(console_lock) { 605 + ret = vc_allocate(vsa.console); 606 + if (ret) 607 + return ret; 608 608 609 - /* 610 - * This is safe providing we don't drop the console sem between 611 - * vc_allocate and finishing referencing nvc. 612 - */ 613 - nvc = vc_cons[vsa.console].d; 614 - nvc->vt_mode = vsa.mode; 615 - nvc->vt_mode.frsig = 0; 616 - put_pid(nvc->vt_pid); 617 - nvc->vt_pid = get_pid(task_pid(current)); 618 - console_unlock(); 609 + /* 610 + * This is safe providing we don't drop the console sem between 611 + * vc_allocate and finishing referencing nvc. 612 + */ 613 + nvc = vc_cons[vsa.console].d; 614 + nvc->vt_mode = vsa.mode; 615 + nvc->vt_mode.frsig = 0; 616 + put_pid(nvc->vt_pid); 617 + nvc->vt_pid = get_pid(task_pid(current)); 618 + } 619 619 620 620 /* Commence switch and lock */ 621 621 /* Review set_console locks */ ··· 626 630 static int vt_disallocate(unsigned int vc_num) 627 631 { 628 632 struct vc_data *vc = NULL; 629 - int ret = 0; 630 633 631 - console_lock(); 632 - if (vt_busy(vc_num)) 633 - ret = -EBUSY; 634 - else if (vc_num) 635 - vc = vc_deallocate(vc_num); 636 - console_unlock(); 634 + scoped_guard(console_lock) { 635 + if (vt_busy(vc_num)) 636 + return -EBUSY; 637 + if (vc_num) 638 + vc = vc_deallocate(vc_num); 639 + } 637 640 638 641 if (vc && vc_num >= MIN_NR_CONSOLES) 639 642 tty_port_put(&vc->port); 640 643 641 - return ret; 644 + return 0; 642 645 } 643 646 644 647 /* deallocate all unused consoles, but leave 0 */ ··· 646 651 struct vc_data *vc[MAX_NR_CONSOLES]; 647 652 int i; 648 653 649 - console_lock(); 650 - for (i = 1; i < MAX_NR_CONSOLES; i++) 651 - if (!vt_busy(i)) 652 - vc[i] = vc_deallocate(i); 653 - else 654 - vc[i] = NULL; 655 - console_unlock(); 654 + scoped_guard(console_lock) 655 + for (i = 1; i < MAX_NR_CONSOLES; i++) 656 + if (!vt_busy(i)) 657 + vc[i] = vc_deallocate(i); 658 + else 659 + vc[i] = NULL; 656 660 657 661 for (i = 1; i < MAX_NR_CONSOLES; i++) { 658 662 if (vc[i] && i >= MIN_NR_CONSOLES) ··· 697 703 698 704 if (!vc_cons[i].d) 699 705 continue; 700 - console_lock(); 706 + guard(console_lock)(); 701 707 vcp = vc_cons[i].d; 702 708 if (vcp) { 703 709 int ret; ··· 712 718 if (ret) { 713 719 vcp->vc_scan_lines = save_scan_lines; 714 720 vcp->vc_cell_height = save_cell_height; 715 - console_unlock(); 716 721 return ret; 717 722 } 718 723 } 719 - console_unlock(); 720 724 } 721 725 722 726 return 0; ··· 762 770 if (tmp.mode != VT_AUTO && tmp.mode != VT_PROCESS) 763 771 return -EINVAL; 764 772 765 - console_lock(); 773 + guard(console_lock)(); 766 774 vc->vt_mode = tmp; 767 775 /* the frsig is ignored, so we set it to 0 */ 768 776 vc->vt_mode.frsig = 0; ··· 770 778 vc->vt_pid = get_pid(task_pid(current)); 771 779 /* no switch is required -- saw@shade.msu.ru */ 772 780 vc->vt_newvt = -1; 773 - console_unlock(); 774 781 break; 775 782 } 776 783 ··· 778 787 struct vt_mode tmp; 779 788 int rc; 780 789 781 - console_lock(); 782 - memcpy(&tmp, &vc->vt_mode, sizeof(struct vt_mode)); 783 - console_unlock(); 790 + scoped_guard(console_lock) 791 + memcpy(&tmp, &vc->vt_mode, sizeof(struct vt_mode)); 784 792 785 793 rc = copy_to_user(up, &tmp, sizeof(struct vt_mode)); 786 794 if (rc) ··· 801 811 return -EFAULT; 802 812 803 813 state = 1; /* /dev/tty0 is always open */ 804 - console_lock(); /* required by vt_in_use() */ 805 - for (i = 0, mask = 2; i < MAX_NR_CONSOLES && mask; 806 - ++i, mask <<= 1) 807 - if (vt_in_use(i)) 808 - state |= mask; 809 - console_unlock(); 814 + scoped_guard(console_lock) /* required by vt_in_use() */ 815 + for (i = 0, mask = 2; i < MAX_NR_CONSOLES && mask; ++i, mask <<= 1) 816 + if (vt_in_use(i)) 817 + state |= mask; 810 818 return put_user(state, &vtstat->v_state); 811 819 } 812 820 ··· 812 824 * Returns the first available (non-opened) console. 813 825 */ 814 826 case VT_OPENQRY: 815 - console_lock(); /* required by vt_in_use() */ 816 - for (i = 0; i < MAX_NR_CONSOLES; ++i) 817 - if (!vt_in_use(i)) 818 - break; 819 - console_unlock(); 827 + scoped_guard(console_lock) /* required by vt_in_use() */ 828 + for (i = 0; i < MAX_NR_CONSOLES; ++i) 829 + if (!vt_in_use(i)) 830 + break; 820 831 i = i < MAX_NR_CONSOLES ? (i+1) : -1; 821 832 return put_user(i, (int __user *)arg); 822 833 ··· 832 845 833 846 arg--; 834 847 arg = array_index_nospec(arg, MAX_NR_CONSOLES); 835 - console_lock(); 836 - ret = vc_allocate(arg); 837 - console_unlock(); 838 - if (ret) 839 - return ret; 848 + scoped_guard(console_lock) { 849 + ret = vc_allocate(arg); 850 + if (ret) 851 + return ret; 852 + } 840 853 set_console(arg); 841 854 break; 842 855 ··· 867 880 * 2: completed switch-to OK 868 881 */ 869 882 case VT_RELDISP: 883 + { 870 884 if (!perm) 871 885 return -EPERM; 872 886 873 - console_lock(); 874 - ret = vt_reldisp(vc, arg); 875 - console_unlock(); 876 - 877 - return ret; 878 - 887 + guard(console_lock)(); 888 + return vt_reldisp(vc, arg); 889 + } 879 890 880 891 /* 881 892 * Disallocate memory associated to VT (but leave VT1) ··· 902 917 get_user(cc, &vtsizes->v_cols)) 903 918 return -EFAULT; 904 919 905 - console_lock(); 920 + guard(console_lock)(); 906 921 for (i = 0; i < MAX_NR_CONSOLES; i++) { 907 922 vc = vc_cons[i].d; 908 923 909 924 if (vc) { 910 925 /* FIXME: review v tty lock */ 911 - __vc_resize(vc_cons[i].d, cc, ll, true); 926 + ret = __vc_resize(vc_cons[i].d, cc, ll, true); 927 + if (ret) 928 + return ret; 912 929 } 913 930 } 914 - console_unlock(); 915 931 break; 916 932 } 917 933 ··· 982 996 struct vc_data *vc; 983 997 struct tty_struct *tty; 984 998 985 - console_lock(); 999 + guard(console_lock)(); 986 1000 vc = vc_con->d; 987 - if (vc) { 988 - /* FIXME: review tty ref counting */ 989 - tty = vc->port.tty; 990 - /* 991 - * SAK should also work in all raw modes and reset 992 - * them properly. 993 - */ 994 - if (tty) 995 - __do_SAK(tty); 996 - reset_vc(vc); 997 - } 998 - console_unlock(); 1001 + if (!vc) 1002 + return; 1003 + 1004 + /* FIXME: review tty ref counting */ 1005 + tty = vc->port.tty; 1006 + /* SAK should also work in all raw modes and reset them properly. */ 1007 + if (tty) 1008 + __do_SAK(tty); 1009 + reset_vc(vc); 999 1010 } 1000 1011 1001 1012 #ifdef CONFIG_COMPAT ··· 1270 1287 { 1271 1288 int prev; 1272 1289 1273 - console_lock(); 1274 - /* Graphics mode - up to X */ 1275 - if (disable_vt_switch) { 1276 - console_unlock(); 1277 - return 0; 1278 - } 1279 - prev = fg_console; 1290 + scoped_guard(console_lock) { 1291 + /* Graphics mode - up to X */ 1292 + if (disable_vt_switch) 1293 + return 0; 1280 1294 1281 - if (alloc && vc_allocate(vt)) { 1282 - /* we can't have a free VC for now. Too bad, 1283 - * we don't want to mess the screen for now. */ 1284 - console_unlock(); 1285 - return -ENOSPC; 1286 - } 1295 + prev = fg_console; 1287 1296 1288 - if (set_console(vt)) { 1289 - /* 1290 - * We're unable to switch to the SUSPEND_CONSOLE. 1291 - * Let the calling function know so it can decide 1292 - * what to do. 1293 - */ 1294 - console_unlock(); 1295 - return -EIO; 1297 + if (alloc && vc_allocate(vt)) { 1298 + /* 1299 + * We can't have a free VC for now. Too bad, we don't want to mess the 1300 + * screen for now. 1301 + */ 1302 + return -ENOSPC; 1303 + } 1304 + 1305 + if (set_console(vt)) { 1306 + /* 1307 + * We're unable to switch to the SUSPEND_CONSOLE. Let the calling function 1308 + * know so it can decide what to do. 1309 + */ 1310 + return -EIO; 1311 + } 1296 1312 } 1297 - console_unlock(); 1298 1313 if (vt_waitactive(vt + 1)) { 1299 1314 pr_debug("Suspend: Can't switch VCs."); 1300 1315 return -EINTR; ··· 1309 1328 */ 1310 1329 void pm_set_vt_switch(int do_switch) 1311 1330 { 1312 - console_lock(); 1331 + guard(console_lock)(); 1313 1332 disable_vt_switch = !do_switch; 1314 - console_unlock(); 1315 1333 } 1316 1334 EXPORT_SYMBOL(pm_set_vt_switch);
+2
include/linux/console.h
··· 666 666 */ 667 667 extern atomic_t ignore_console_lock_warning; 668 668 669 + DEFINE_LOCK_GUARD_0(console_lock, console_lock(), console_unlock()); 670 + 669 671 extern void console_init(void); 670 672 671 673 /* For deferred console takeover */
+3
include/linux/console_struct.h
··· 159 159 struct uni_pagedict *uni_pagedict; 160 160 struct uni_pagedict **uni_pagedict_loc; /* [!] Location of uni_pagedict variable for this console */ 161 161 u32 **vc_uni_lines; /* unicode screen content */ 162 + u16 *vc_saved_screen; 163 + unsigned int vc_saved_cols; 164 + unsigned int vc_saved_rows; 162 165 /* additional information is in vt_kern.h */ 163 166 }; 164 167
+13
include/linux/serial_core.h
··· 788 788 spin_unlock_irqrestore(&up->lock, flags); 789 789 } 790 790 791 + DEFINE_GUARD(uart_port_lock, struct uart_port *, uart_port_lock(_T), uart_port_unlock(_T)); 792 + DEFINE_GUARD_COND(uart_port_lock, _try, uart_port_trylock(_T)); 793 + 794 + DEFINE_GUARD(uart_port_lock_irq, struct uart_port *, uart_port_lock_irq(_T), 795 + uart_port_unlock_irq(_T)); 796 + 797 + DEFINE_LOCK_GUARD_1(uart_port_lock_irqsave, struct uart_port, 798 + uart_port_lock_irqsave(_T->lock, &_T->flags), 799 + uart_port_unlock_irqrestore(_T->lock, _T->flags), 800 + unsigned long flags); 801 + DEFINE_LOCK_GUARD_1_COND(uart_port_lock_irqsave, _try, 802 + uart_port_trylock_irqsave(_T->lock, &_T->flags)); 803 + 791 804 static inline int serial_port_in(struct uart_port *up, int offset) 792 805 { 793 806 return up->serial_in(up, offset);
+14
include/linux/tty_port.h
··· 270 270 __tty_port_tty_hangup(port, false, false); 271 271 } 272 272 273 + #ifdef CONFIG_TTY 274 + void tty_kref_put(struct tty_struct *tty); 275 + __DEFINE_CLASS_IS_CONDITIONAL(tty_port_tty, true); 276 + __DEFINE_UNLOCK_GUARD(tty_port_tty, struct tty_struct, tty_kref_put(_T->lock)); 277 + static inline class_tty_port_tty_t class_tty_port_tty_constructor(struct tty_port *tport) 278 + { 279 + class_tty_port_tty_t _t = { 280 + .lock = tty_port_tty_get(tport), 281 + }; 282 + return _t; 283 + } 284 + #define scoped_tty() ((struct tty_struct *)(__guard_ptr(tty_port_tty)(&scope))) 285 + #endif 286 + 273 287 #endif