diff options
Diffstat (limited to 'drivers/char/virtio_console.c')
| -rw-r--r-- | drivers/char/virtio_console.c | 61 |
1 files changed, 39 insertions, 22 deletions
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index c6c6f52043b..11e5fafcca5 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c | |||
| @@ -346,6 +346,43 @@ int __init virtio_cons_early_init(int (*put_chars)(u32, const char *, int)) | |||
| 346 | return hvc_instantiate(0, 0, &hv_ops); | 346 | return hvc_instantiate(0, 0, &hv_ops); |
| 347 | } | 347 | } |
| 348 | 348 | ||
| 349 | int __devinit init_port_console(struct port *port) | ||
| 350 | { | ||
| 351 | int ret; | ||
| 352 | |||
| 353 | /* | ||
| 354 | * The Host's telling us this port is a console port. Hook it | ||
| 355 | * up with an hvc console. | ||
| 356 | * | ||
| 357 | * To set up and manage our virtual console, we call | ||
| 358 | * hvc_alloc(). | ||
| 359 | * | ||
| 360 | * The first argument of hvc_alloc() is the virtual console | ||
| 361 | * number. The second argument is the parameter for the | ||
| 362 | * notification mechanism (like irq number). We currently | ||
| 363 | * leave this as zero, virtqueues have implicit notifications. | ||
| 364 | * | ||
| 365 | * The third argument is a "struct hv_ops" containing the | ||
| 366 | * put_chars() get_chars(), notifier_add() and notifier_del() | ||
| 367 | * pointers. The final argument is the output buffer size: we | ||
| 368 | * can do any size, so we put PAGE_SIZE here. | ||
| 369 | */ | ||
| 370 | port->cons.vtermno = pdrvdata.next_vtermno; | ||
| 371 | |||
| 372 | port->cons.hvc = hvc_alloc(port->cons.vtermno, 0, &hv_ops, PAGE_SIZE); | ||
| 373 | if (IS_ERR(port->cons.hvc)) { | ||
| 374 | ret = PTR_ERR(port->cons.hvc); | ||
| 375 | port->cons.hvc = NULL; | ||
| 376 | return ret; | ||
| 377 | } | ||
| 378 | spin_lock_irq(&pdrvdata_lock); | ||
| 379 | pdrvdata.next_vtermno++; | ||
| 380 | list_add_tail(&port->cons.list, &pdrvdata.consoles); | ||
| 381 | spin_unlock_irq(&pdrvdata_lock); | ||
| 382 | |||
| 383 | return 0; | ||
| 384 | } | ||
| 385 | |||
| 349 | static int __devinit add_port(struct ports_device *portdev) | 386 | static int __devinit add_port(struct ports_device *portdev) |
| 350 | { | 387 | { |
| 351 | struct port *port; | 388 | struct port *port; |
| @@ -367,29 +404,9 @@ static int __devinit add_port(struct ports_device *portdev) | |||
| 367 | goto free_port; | 404 | goto free_port; |
| 368 | } | 405 | } |
| 369 | 406 | ||
| 370 | /* | 407 | err = init_port_console(port); |
| 371 | * The first argument of hvc_alloc() is the virtual console | 408 | if (err) |
| 372 | * number. The second argument is the parameter for the | ||
| 373 | * notification mechanism (like irq number). We currently | ||
| 374 | * leave this as zero, virtqueues have implicit notifications. | ||
| 375 | * | ||
| 376 | * The third argument is a "struct hv_ops" containing the | ||
| 377 | * put_chars(), get_chars(), notifier_add() and notifier_del() | ||
| 378 | * pointers. The final argument is the output buffer size: we | ||
| 379 | * can do any size, so we put PAGE_SIZE here. | ||
| 380 | */ | ||
| 381 | port->cons.vtermno = pdrvdata.next_vtermno; | ||
| 382 | port->cons.hvc = hvc_alloc(port->cons.vtermno, 0, &hv_ops, PAGE_SIZE); | ||
| 383 | if (IS_ERR(port->cons.hvc)) { | ||
| 384 | err = PTR_ERR(port->cons.hvc); | ||
| 385 | goto free_inbuf; | 409 | goto free_inbuf; |
| 386 | } | ||
| 387 | |||
| 388 | /* Add to vtermno list. */ | ||
| 389 | spin_lock_irq(&pdrvdata_lock); | ||
| 390 | pdrvdata.next_vtermno++; | ||
| 391 | list_add(&port->cons.list, &pdrvdata.consoles); | ||
| 392 | spin_unlock_irq(&pdrvdata_lock); | ||
| 393 | 410 | ||
| 394 | /* Register the input buffer the first time. */ | 411 | /* Register the input buffer the first time. */ |
| 395 | add_inbuf(port->in_vq, port->inbuf); | 412 | add_inbuf(port->in_vq, port->inbuf); |
