diff -r 2e80cd715047 linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c --- a/linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c Thu Feb 01 11:42:50 2007 +0000 +++ b/linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c Fri Feb 02 19:17:00 2007 -0500 @@ -29,8 +29,10 @@ struct xenkbd_info { - struct input_dev *dev; + struct input_dev *kbd; + struct input_dev *ptr; struct xenkbd_page *page; + unsigned evtchn; int irq; struct xenbus_device *xbdev; }; @@ -60,22 +62,30 @@ static irqreturn_t input_handler(int rq, switch (event->type) { case XENKBD_TYPE_MOTION: - input_report_rel(info->dev, REL_X, event->motion.rel_x); - input_report_rel(info->dev, REL_Y, event->motion.rel_y); + input_report_rel(info->ptr, REL_X, event->motion.rel_x); + input_report_rel(info->ptr, REL_Y, event->motion.rel_y); + input_sync(info->ptr); + input_report_rel(info->kbd, REL_X, event->motion.rel_x); + input_report_rel(info->kbd, REL_Y, event->motion.rel_y); + input_sync(info->kbd); break; case XENKBD_TYPE_KEY: - input_report_key(info->dev, event->key.keycode, event->key.pressed); + input_report_key(info->kbd, event->key.keycode, event->key.pressed); + input_sync(info->kbd); break; case XENKBD_TYPE_POS: - input_report_abs(info->dev, ABS_X, event->pos.abs_x); - input_report_abs(info->dev, ABS_Y, event->pos.abs_y); + input_report_abs(info->ptr, ABS_X, event->pos.abs_x); + input_report_abs(info->ptr, ABS_Y, event->pos.abs_y); + input_sync(info->ptr); + input_report_abs(info->kbd, ABS_X, event->pos.abs_x); + input_report_abs(info->kbd, ABS_Y, event->pos.abs_y); + input_sync(info->kbd); break; } } - input_sync(info->dev); mb(); /* ensure we got ring contents */ page->in_cons = cons; - notify_remote_via_irq(info->irq); + notify_remote_via_evtchn(info->evtchn); return IRQ_HANDLED; } @@ -85,7 +95,7 @@ int __devinit xenkbd_probe(struct xenbus { int ret, i; struct xenkbd_info *info; - struct input_dev *input_dev; + struct input_dev *kbd, *ptr; info = kzalloc(sizeof(*info), GFP_KERNEL); if (!info) { @@ -101,32 +111,50 @@ int __devinit xenkbd_probe(struct xenbus info->page->in_cons = info->page->in_prod = 0; info->page->out_cons = info->page->out_prod = 0; - input_dev = input_allocate_device(); - if (!input_dev) + kbd = input_allocate_device(); + ptr = input_allocate_device(); + if (!kbd || !ptr) goto error_nomem; - input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL) | BIT(EV_ABS); - input_dev->keybit[LONG(BTN_MOUSE)] + ptr->evbit[0] = BIT(EV_REL) | BIT(EV_ABS); + ptr->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); /* TODO additional buttons */ - input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y); - + ptr->relbit[0] = BIT(REL_X) | BIT(REL_Y); + + kbd->evbit[0] = BIT(EV_KEY) | BIT(EV_REL) | BIT(EV_ABS); + kbd->keybit[LONG(BTN_MOUSE)] + = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); + /* TODO additional buttons */ + kbd->relbit[0] = BIT(REL_X) | BIT(REL_Y); /* FIXME not sure this is quite right */ for (i = 0; i < 256; i++) - set_bit(i, input_dev->keybit); - - input_dev->name = "Xen Virtual Keyboard/Mouse"; - - input_set_abs_params(input_dev, ABS_X, 0, XENFB_WIDTH, 0, 0); - input_set_abs_params(input_dev, ABS_Y, 0, XENFB_HEIGHT, 0, 0); - - ret = input_register_device(input_dev); - if (ret) { - input_free_device(input_dev); - xenbus_dev_fatal(dev, ret, "input_register_device"); + set_bit(i, kbd->keybit); + + kbd->name = "Xen Virtual Keyboard"; + ptr->name = "Xen Virtual Touchscreen"; + + input_set_abs_params(ptr, ABS_X, 0, XENFB_WIDTH, 0, 0); + input_set_abs_params(ptr, ABS_Y, 0, XENFB_HEIGHT, 0, 0); + input_set_abs_params(kbd, ABS_X, 0, XENFB_WIDTH, 0, 0); + input_set_abs_params(kbd, ABS_Y, 0, XENFB_HEIGHT, 0, 0); + + ret = input_register_device(kbd); + if (ret) { + input_free_device(kbd); + input_free_device(ptr); + xenbus_dev_fatal(dev, ret, "input_register_device(kbd)"); goto error; } - info->dev = input_dev; + info->kbd = kbd; + + ret = input_register_device(ptr); + if (ret) { + input_free_device(ptr); + xenbus_dev_fatal(dev, ret, "input_register_device(ptr)"); + goto error; + } + info->ptr = ptr; ret = xenkbd_connect_backend(dev, info); if (ret < 0) @@ -155,7 +183,8 @@ static int xenkbd_remove(struct xenbus_d struct xenkbd_info *info = dev->dev.driver_data; xenkbd_disconnect_backend(info); - input_unregister_device(info->dev); + input_unregister_device(info->kbd); + input_unregister_device(info->ptr); free_page((unsigned long)info->page); kfree(info); return 0; @@ -167,11 +196,14 @@ static int xenkbd_connect_backend(struct int ret; struct xenbus_transaction xbt; - ret = bind_listening_port_to_irqhandler( - dev->otherend_id, input_handler, 0, "xenkbd", info); + ret = xenbus_alloc_evtchn(dev, &info->evtchn); + if (ret) + return ret; + ret = bind_evtchn_to_irqhandler(info->evtchn, input_handler, 0, + "xenkbd", info); if (ret < 0) { - xenbus_dev_fatal(dev, ret, - "bind_listening_port_to_irqhandler"); + xenbus_free_evtchn(dev, info->evtchn); + xenbus_dev_fatal(dev, ret, "bind_evtchn_to_irqhandler"); return ret; } info->irq = ret; @@ -187,7 +219,7 @@ static int xenkbd_connect_backend(struct if (ret) goto error_xenbus; ret = xenbus_printf(xbt, dev->nodename, "event-channel", "%u", - irq_to_evtchn_port(info->irq)); + info->evtchn); if (ret) goto error_xenbus; ret = xenbus_transaction_end(xbt, 0);