diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-10-15 01:41:27 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-10-15 01:41:27 -0400 |
| commit | c362495586e8a3a6487a318fcd82eaf15ffe2142 (patch) | |
| tree | 86f7b195d36ba198f24f86be327f21a8d24ec248 /drivers/tty | |
| parent | b70936d9ffbf0f45f4fa13a03122f015f13ecdb0 (diff) | |
| parent | ddffeb8c4d0331609ef2581d84de4d763607bd37 (diff) | |
Merge 3.7-rc1 into tty-linus
This syncs up the tty-linus branch to the latest in Linus's tree to get all of
the UAPI stuff needed for the next set of patches to merge.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty')
| -rw-r--r-- | drivers/tty/hvc/hvc_console.c | 33 | ||||
| -rw-r--r-- | drivers/tty/hvc/hvc_vio.c | 123 | ||||
| -rw-r--r-- | drivers/tty/hvc/hvc_xen.c | 5 | ||||
| -rw-r--r-- | drivers/tty/serial/kgdboc.c | 3 | ||||
| -rw-r--r-- | drivers/tty/vt/vt.c | 13 |
5 files changed, 115 insertions, 62 deletions
diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c index 4a652999380f..a5dec1ca1b82 100644 --- a/drivers/tty/hvc/hvc_console.c +++ b/drivers/tty/hvc/hvc_console.c | |||
| @@ -245,6 +245,20 @@ static void hvc_port_destruct(struct tty_port *port) | |||
| 245 | kfree(hp); | 245 | kfree(hp); |
| 246 | } | 246 | } |
| 247 | 247 | ||
| 248 | static void hvc_check_console(int index) | ||
| 249 | { | ||
| 250 | /* Already enabled, bail out */ | ||
| 251 | if (hvc_console.flags & CON_ENABLED) | ||
| 252 | return; | ||
| 253 | |||
| 254 | /* If this index is what the user requested, then register | ||
| 255 | * now (setup won't fail at this point). It's ok to just | ||
| 256 | * call register again if previously .setup failed. | ||
| 257 | */ | ||
| 258 | if (index == hvc_console.index) | ||
| 259 | register_console(&hvc_console); | ||
| 260 | } | ||
| 261 | |||
| 248 | /* | 262 | /* |
| 249 | * hvc_instantiate() is an early console discovery method which locates | 263 | * hvc_instantiate() is an early console discovery method which locates |
| 250 | * consoles * prior to the vio subsystem discovering them. Hotplugged | 264 | * consoles * prior to the vio subsystem discovering them. Hotplugged |
| @@ -275,12 +289,8 @@ int hvc_instantiate(uint32_t vtermno, int index, const struct hv_ops *ops) | |||
| 275 | if (last_hvc < index) | 289 | if (last_hvc < index) |
| 276 | last_hvc = index; | 290 | last_hvc = index; |
| 277 | 291 | ||
| 278 | /* if this index is what the user requested, then register | 292 | /* check if we need to re-register the kernel console */ |
| 279 | * now (setup won't fail at this point). It's ok to just | 293 | hvc_check_console(index); |
| 280 | * call register again if previously .setup failed. | ||
| 281 | */ | ||
| 282 | if (index == hvc_console.index) | ||
| 283 | register_console(&hvc_console); | ||
| 284 | 294 | ||
| 285 | return 0; | 295 | return 0; |
| 286 | } | 296 | } |
| @@ -877,10 +887,15 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data, | |||
| 877 | i = ++last_hvc; | 887 | i = ++last_hvc; |
| 878 | 888 | ||
| 879 | hp->index = i; | 889 | hp->index = i; |
| 890 | cons_ops[i] = ops; | ||
| 891 | vtermnos[i] = vtermno; | ||
| 880 | 892 | ||
| 881 | list_add_tail(&(hp->next), &hvc_structs); | 893 | list_add_tail(&(hp->next), &hvc_structs); |
| 882 | spin_unlock(&hvc_structs_lock); | 894 | spin_unlock(&hvc_structs_lock); |
| 883 | 895 | ||
| 896 | /* check if we need to re-register the kernel console */ | ||
| 897 | hvc_check_console(i); | ||
| 898 | |||
| 884 | return hp; | 899 | return hp; |
| 885 | } | 900 | } |
| 886 | EXPORT_SYMBOL_GPL(hvc_alloc); | 901 | EXPORT_SYMBOL_GPL(hvc_alloc); |
| @@ -893,8 +908,12 @@ int hvc_remove(struct hvc_struct *hp) | |||
| 893 | tty = tty_port_tty_get(&hp->port); | 908 | tty = tty_port_tty_get(&hp->port); |
| 894 | 909 | ||
| 895 | spin_lock_irqsave(&hp->lock, flags); | 910 | spin_lock_irqsave(&hp->lock, flags); |
| 896 | if (hp->index < MAX_NR_HVC_CONSOLES) | 911 | if (hp->index < MAX_NR_HVC_CONSOLES) { |
| 912 | console_lock(); | ||
| 897 | vtermnos[hp->index] = -1; | 913 | vtermnos[hp->index] = -1; |
| 914 | cons_ops[hp->index] = NULL; | ||
| 915 | console_unlock(); | ||
| 916 | } | ||
| 898 | 917 | ||
| 899 | /* Don't whack hp->irq because tty_hangup() will need to free the irq. */ | 918 | /* Don't whack hp->irq because tty_hangup() will need to free the irq. */ |
| 900 | 919 | ||
diff --git a/drivers/tty/hvc/hvc_vio.c b/drivers/tty/hvc/hvc_vio.c index ee307799271a..070c0ee68642 100644 --- a/drivers/tty/hvc/hvc_vio.c +++ b/drivers/tty/hvc/hvc_vio.c | |||
| @@ -230,6 +230,69 @@ static const struct hv_ops hvterm_hvsi_ops = { | |||
| 230 | .tiocmset = hvterm_hvsi_tiocmset, | 230 | .tiocmset = hvterm_hvsi_tiocmset, |
| 231 | }; | 231 | }; |
| 232 | 232 | ||
| 233 | static void udbg_hvc_putc(char c) | ||
| 234 | { | ||
| 235 | int count = -1; | ||
| 236 | |||
| 237 | if (!hvterm_privs[0]) | ||
| 238 | return; | ||
| 239 | |||
| 240 | if (c == '\n') | ||
| 241 | udbg_hvc_putc('\r'); | ||
| 242 | |||
| 243 | do { | ||
| 244 | switch(hvterm_privs[0]->proto) { | ||
| 245 | case HV_PROTOCOL_RAW: | ||
| 246 | count = hvterm_raw_put_chars(0, &c, 1); | ||
| 247 | break; | ||
| 248 | case HV_PROTOCOL_HVSI: | ||
| 249 | count = hvterm_hvsi_put_chars(0, &c, 1); | ||
| 250 | break; | ||
| 251 | } | ||
| 252 | } while(count == 0); | ||
| 253 | } | ||
| 254 | |||
| 255 | static int udbg_hvc_getc_poll(void) | ||
| 256 | { | ||
| 257 | int rc = 0; | ||
| 258 | char c; | ||
| 259 | |||
| 260 | if (!hvterm_privs[0]) | ||
| 261 | return -1; | ||
| 262 | |||
| 263 | switch(hvterm_privs[0]->proto) { | ||
| 264 | case HV_PROTOCOL_RAW: | ||
| 265 | rc = hvterm_raw_get_chars(0, &c, 1); | ||
| 266 | break; | ||
| 267 | case HV_PROTOCOL_HVSI: | ||
| 268 | rc = hvterm_hvsi_get_chars(0, &c, 1); | ||
| 269 | break; | ||
| 270 | } | ||
| 271 | if (!rc) | ||
| 272 | return -1; | ||
| 273 | return c; | ||
| 274 | } | ||
| 275 | |||
| 276 | static int udbg_hvc_getc(void) | ||
| 277 | { | ||
| 278 | int ch; | ||
| 279 | |||
| 280 | if (!hvterm_privs[0]) | ||
| 281 | return -1; | ||
| 282 | |||
| 283 | for (;;) { | ||
| 284 | ch = udbg_hvc_getc_poll(); | ||
| 285 | if (ch == -1) { | ||
| 286 | /* This shouldn't be needed...but... */ | ||
| 287 | volatile unsigned long delay; | ||
| 288 | for (delay=0; delay < 2000000; delay++) | ||
| 289 | ; | ||
| 290 | } else { | ||
| 291 | return ch; | ||
| 292 | } | ||
| 293 | } | ||
| 294 | } | ||
| 295 | |||
| 233 | static int __devinit hvc_vio_probe(struct vio_dev *vdev, | 296 | static int __devinit hvc_vio_probe(struct vio_dev *vdev, |
| 234 | const struct vio_device_id *id) | 297 | const struct vio_device_id *id) |
| 235 | { | 298 | { |
| @@ -289,6 +352,13 @@ static int __devinit hvc_vio_probe(struct vio_dev *vdev, | |||
| 289 | return PTR_ERR(hp); | 352 | return PTR_ERR(hp); |
| 290 | dev_set_drvdata(&vdev->dev, hp); | 353 | dev_set_drvdata(&vdev->dev, hp); |
| 291 | 354 | ||
| 355 | /* register udbg if it's not there already for console 0 */ | ||
| 356 | if (hp->index == 0 && !udbg_putc) { | ||
| 357 | udbg_putc = udbg_hvc_putc; | ||
| 358 | udbg_getc = udbg_hvc_getc; | ||
| 359 | udbg_getc_poll = udbg_hvc_getc_poll; | ||
| 360 | } | ||
| 361 | |||
| 292 | return 0; | 362 | return 0; |
| 293 | } | 363 | } |
| 294 | 364 | ||
| @@ -331,59 +401,6 @@ static void __exit hvc_vio_exit(void) | |||
| 331 | } | 401 | } |
| 332 | module_exit(hvc_vio_exit); | 402 | module_exit(hvc_vio_exit); |
| 333 | 403 | ||
| 334 | static void udbg_hvc_putc(char c) | ||
| 335 | { | ||
| 336 | int count = -1; | ||
| 337 | |||
| 338 | if (c == '\n') | ||
| 339 | udbg_hvc_putc('\r'); | ||
| 340 | |||
| 341 | do { | ||
| 342 | switch(hvterm_priv0.proto) { | ||
| 343 | case HV_PROTOCOL_RAW: | ||
| 344 | count = hvterm_raw_put_chars(0, &c, 1); | ||
| 345 | break; | ||
| 346 | case HV_PROTOCOL_HVSI: | ||
| 347 | count = hvterm_hvsi_put_chars(0, &c, 1); | ||
| 348 | break; | ||
| 349 | } | ||
| 350 | } while(count == 0); | ||
| 351 | } | ||
| 352 | |||
| 353 | static int udbg_hvc_getc_poll(void) | ||
| 354 | { | ||
| 355 | int rc = 0; | ||
| 356 | char c; | ||
| 357 | |||
| 358 | switch(hvterm_priv0.proto) { | ||
| 359 | case HV_PROTOCOL_RAW: | ||
| 360 | rc = hvterm_raw_get_chars(0, &c, 1); | ||
| 361 | break; | ||
| 362 | case HV_PROTOCOL_HVSI: | ||
| 363 | rc = hvterm_hvsi_get_chars(0, &c, 1); | ||
| 364 | break; | ||
| 365 | } | ||
| 366 | if (!rc) | ||
| 367 | return -1; | ||
| 368 | return c; | ||
| 369 | } | ||
| 370 | |||
| 371 | static int udbg_hvc_getc(void) | ||
| 372 | { | ||
| 373 | int ch; | ||
| 374 | for (;;) { | ||
| 375 | ch = udbg_hvc_getc_poll(); | ||
| 376 | if (ch == -1) { | ||
| 377 | /* This shouldn't be needed...but... */ | ||
| 378 | volatile unsigned long delay; | ||
| 379 | for (delay=0; delay < 2000000; delay++) | ||
| 380 | ; | ||
| 381 | } else { | ||
| 382 | return ch; | ||
| 383 | } | ||
| 384 | } | ||
| 385 | } | ||
| 386 | |||
| 387 | void __init hvc_vio_init_early(void) | 404 | void __init hvc_vio_init_early(void) |
| 388 | { | 405 | { |
| 389 | struct device_node *stdout_node; | 406 | struct device_node *stdout_node; |
diff --git a/drivers/tty/hvc/hvc_xen.c b/drivers/tty/hvc/hvc_xen.c index 2944ff88fdc0..f4abfe238f98 100644 --- a/drivers/tty/hvc/hvc_xen.c +++ b/drivers/tty/hvc/hvc_xen.c | |||
| @@ -478,7 +478,6 @@ static void xencons_backend_changed(struct xenbus_device *dev, | |||
| 478 | case XenbusStateInitialising: | 478 | case XenbusStateInitialising: |
| 479 | case XenbusStateInitialised: | 479 | case XenbusStateInitialised: |
| 480 | case XenbusStateUnknown: | 480 | case XenbusStateUnknown: |
| 481 | case XenbusStateClosed: | ||
| 482 | break; | 481 | break; |
| 483 | 482 | ||
| 484 | case XenbusStateInitWait: | 483 | case XenbusStateInitWait: |
| @@ -488,6 +487,10 @@ static void xencons_backend_changed(struct xenbus_device *dev, | |||
| 488 | xenbus_switch_state(dev, XenbusStateConnected); | 487 | xenbus_switch_state(dev, XenbusStateConnected); |
| 489 | break; | 488 | break; |
| 490 | 489 | ||
| 490 | case XenbusStateClosed: | ||
| 491 | if (dev->state == XenbusStateClosed) | ||
| 492 | break; | ||
| 493 | /* Missed the backend's CLOSING state -- fallthrough */ | ||
| 491 | case XenbusStateClosing: | 494 | case XenbusStateClosing: |
| 492 | xenbus_frontend_closed(dev); | 495 | xenbus_frontend_closed(dev); |
| 493 | break; | 496 | break; |
diff --git a/drivers/tty/serial/kgdboc.c b/drivers/tty/serial/kgdboc.c index c0b334327d93..10020547c60b 100644 --- a/drivers/tty/serial/kgdboc.c +++ b/drivers/tty/serial/kgdboc.c | |||
| @@ -97,7 +97,8 @@ static void kgdboc_restore_input(void) | |||
| 97 | 97 | ||
| 98 | static int kgdboc_register_kbd(char **cptr) | 98 | static int kgdboc_register_kbd(char **cptr) |
| 99 | { | 99 | { |
| 100 | if (strncmp(*cptr, "kbd", 3) == 0) { | 100 | if (strncmp(*cptr, "kbd", 3) == 0 || |
| 101 | strncmp(*cptr, "kdb", 3) == 0) { | ||
| 101 | if (kdb_poll_idx < KDB_POLL_FUNC_MAX) { | 102 | if (kdb_poll_idx < KDB_POLL_FUNC_MAX) { |
| 102 | kdb_poll_funcs[kdb_poll_idx] = kdb_get_kbd_char; | 103 | kdb_poll_funcs[kdb_poll_idx] = kdb_get_kbd_char; |
| 103 | kdb_poll_idx++; | 104 | kdb_poll_idx++; |
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index 999ca63afdef..f87d7e8964bf 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c | |||
| @@ -3442,6 +3442,19 @@ int con_debug_enter(struct vc_data *vc) | |||
| 3442 | kdb_set(2, setargs); | 3442 | kdb_set(2, setargs); |
| 3443 | } | 3443 | } |
| 3444 | } | 3444 | } |
| 3445 | if (vc->vc_cols < 999) { | ||
| 3446 | int colcount; | ||
| 3447 | char cols[4]; | ||
| 3448 | const char *setargs[3] = { | ||
| 3449 | "set", | ||
| 3450 | "COLUMNS", | ||
| 3451 | cols, | ||
| 3452 | }; | ||
| 3453 | if (kdbgetintenv(setargs[0], &colcount)) { | ||
| 3454 | snprintf(cols, 4, "%i", vc->vc_cols); | ||
| 3455 | kdb_set(2, setargs); | ||
| 3456 | } | ||
| 3457 | } | ||
| 3445 | #endif /* CONFIG_KGDB_KDB */ | 3458 | #endif /* CONFIG_KGDB_KDB */ |
| 3446 | return ret; | 3459 | return ret; |
| 3447 | } | 3460 | } |
