diff options
-rw-r--r-- | drivers/tty/hvc/Kconfig | 8 | ||||
-rw-r--r-- | drivers/tty/hvc/hvc_xen.c | 116 |
2 files changed, 70 insertions, 54 deletions
diff --git a/drivers/tty/hvc/Kconfig b/drivers/tty/hvc/Kconfig index 4222035acfb7..192e21e2239c 100644 --- a/drivers/tty/hvc/Kconfig +++ b/drivers/tty/hvc/Kconfig @@ -76,6 +76,14 @@ config HVC_XEN help Xen virtual console device driver +config HVC_XEN_FRONTEND + bool "Xen Hypervisor Multiple Consoles support" + depends on HVC_XEN + select XEN_XENBUS_FRONTEND + default y + help + Xen driver for secondary virtual consoles + config HVC_UDBG bool "udbg based fake hypervisor console" depends on PPC && EXPERIMENTAL diff --git a/drivers/tty/hvc/hvc_xen.c b/drivers/tty/hvc/hvc_xen.c index 26090c736bcf..83d5c88e7165 100644 --- a/drivers/tty/hvc/hvc_xen.c +++ b/drivers/tty/hvc/hvc_xen.c @@ -55,7 +55,6 @@ struct xencons_info { static LIST_HEAD(xenconsoles); static DEFINE_SPINLOCK(xencons_lock); -static struct xenbus_driver xencons_driver; /* ------------------------------------------------------------------ */ @@ -298,53 +297,6 @@ static int xen_initial_domain_console_init(void) return 0; } -static int __init xen_hvc_init(void) -{ - int r; - struct xencons_info *info; - const struct hv_ops *ops; - - if (!xen_domain()) - return -ENODEV; - - if (xen_initial_domain()) { - ops = &dom0_hvc_ops; - r = xen_initial_domain_console_init(); - if (r < 0) - return r; - info = vtermno_to_xencons(HVC_COOKIE); - } else { - ops = &domU_hvc_ops; - if (xen_hvm_domain()) - r = xen_hvm_console_init(); - else - r = xen_pv_console_init(); - if (r < 0) - return r; - - info = vtermno_to_xencons(HVC_COOKIE); - info->irq = bind_evtchn_to_irq(info->evtchn); - } - if (info->irq < 0) - info->irq = 0; /* NO_IRQ */ - else - irq_set_noprobe(info->irq); - - info->hvc = hvc_alloc(HVC_COOKIE, info->irq, ops, 256); - if (IS_ERR(info->hvc)) { - r = PTR_ERR(info->hvc); - spin_lock(&xencons_lock); - list_del(&info->list); - spin_unlock(&xencons_lock); - if (info->irq) - unbind_from_irqhandler(info->irq, NULL); - kfree(info); - return r; - } - - return xenbus_register_frontend(&xencons_driver); -} - void xen_console_resume(void) { struct xencons_info *info = vtermno_to_xencons(HVC_COOKIE); @@ -392,6 +344,9 @@ static int xen_console_remove(struct xencons_info *info) return 0; } +#ifdef CONFIG_HVC_XEN_FRONTEND +static struct xenbus_driver xencons_driver; + static int xencons_remove(struct xenbus_device *dev) { return xen_console_remove(dev_get_drvdata(&dev->dev)); @@ -543,6 +498,65 @@ static const struct xenbus_device_id xencons_ids[] = { }; +static DEFINE_XENBUS_DRIVER(xencons, "xenconsole", + .probe = xencons_probe, + .remove = xencons_remove, + .resume = xencons_resume, + .otherend_changed = xencons_backend_changed, +); +#endif /* CONFIG_HVC_XEN_FRONTEND */ + +static int __init xen_hvc_init(void) +{ + int r; + struct xencons_info *info; + const struct hv_ops *ops; + + if (!xen_domain()) + return -ENODEV; + + if (xen_initial_domain()) { + ops = &dom0_hvc_ops; + r = xen_initial_domain_console_init(); + if (r < 0) + return r; + info = vtermno_to_xencons(HVC_COOKIE); + } else { + ops = &domU_hvc_ops; + if (xen_hvm_domain()) + r = xen_hvm_console_init(); + else + r = xen_pv_console_init(); + if (r < 0) + return r; + + info = vtermno_to_xencons(HVC_COOKIE); + info->irq = bind_evtchn_to_irq(info->evtchn); + } + if (info->irq < 0) + info->irq = 0; /* NO_IRQ */ + else + irq_set_noprobe(info->irq); + + info->hvc = hvc_alloc(HVC_COOKIE, info->irq, ops, 256); + if (IS_ERR(info->hvc)) { + r = PTR_ERR(info->hvc); + spin_lock(&xencons_lock); + list_del(&info->list); + spin_unlock(&xencons_lock); + if (info->irq) + unbind_from_irqhandler(info->irq, NULL); + kfree(info); + return r; + } + + r = 0; +#ifdef CONFIG_HVC_XEN_FRONTEND + r = xenbus_register_frontend(&xencons_driver); +#endif + return r; +} + static void __exit xen_hvc_fini(void) { struct xencons_info *entry, *next; @@ -580,12 +594,6 @@ static int xen_cons_init(void) return 0; } -static DEFINE_XENBUS_DRIVER(xencons, "xenconsole", - .probe = xencons_probe, - .remove = xencons_remove, - .resume = xencons_resume, - .otherend_changed = xencons_backend_changed, -); module_init(xen_hvc_init); module_exit(xen_hvc_fini); |