--- /dev/null
+From 7ad9684721606efbfb9b347346816e1e6baff8bb Mon Sep 17 00:00:00 2001
+From: Gerd Hoffmann <kraxel@redhat.com>
+Date: Wed, 2 Oct 2013 13:55:10 +0200
+Subject: hyperv-fb: add pci stub
+
+From: Gerd Hoffmann <kraxel@redhat.com>
+
+commit 7ad9684721606efbfb9b347346816e1e6baff8bb upstream.
+
+This patch adds a pci stub driver to hyper-fb. The hyperv framebuffer
+driver will bind to the pci device then, so linux kernel and userspace
+know there is a proper kernel driver for the device active. lspci shows
+this for example:
+
+[root@dhcp231 ~]# lspci -vs8
+00:08.0 VGA compatible controller: Microsoft Corporation Hyper-V virtual
+VGA (prog-if 00 [VGA controller])
+ Flags: bus master, fast devsel, latency 0, IRQ 11
+ Memory at f8000000 (32-bit, non-prefetchable) [size=64M]
+ Expansion ROM at <unassigned> [disabled]
+ Kernel driver in use: hyperv_fb
+
+Another effect is that the xorg vesa driver will not attach to the
+device and thus the Xorg server will automatically use the fbdev
+driver instead.
+
+Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
+Acked-by: Haiyang Zhang <haiyangz@microsoft.com>
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/video/hyperv_fb.c | 40 +++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 39 insertions(+), 1 deletion(-)
+
+--- a/drivers/video/hyperv_fb.c
++++ b/drivers/video/hyperv_fb.c
+@@ -795,12 +795,21 @@ static int hvfb_remove(struct hv_device
+ }
+
+
++static DEFINE_PCI_DEVICE_TABLE(pci_stub_id_table) = {
++ {
++ .vendor = PCI_VENDOR_ID_MICROSOFT,
++ .device = PCI_DEVICE_ID_HYPERV_VIDEO,
++ },
++ { /* end of list */ }
++};
++
+ static const struct hv_vmbus_device_id id_table[] = {
+ /* Synthetic Video Device GUID */
+ {HV_SYNTHVID_GUID},
+ {}
+ };
+
++MODULE_DEVICE_TABLE(pci, pci_stub_id_table);
+ MODULE_DEVICE_TABLE(vmbus, id_table);
+
+ static struct hv_driver hvfb_drv = {
+@@ -810,14 +819,43 @@ static struct hv_driver hvfb_drv = {
+ .remove = hvfb_remove,
+ };
+
++static int hvfb_pci_stub_probe(struct pci_dev *pdev,
++ const struct pci_device_id *ent)
++{
++ return 0;
++}
++
++static void hvfb_pci_stub_remove(struct pci_dev *pdev)
++{
++}
++
++static struct pci_driver hvfb_pci_stub_driver = {
++ .name = KBUILD_MODNAME,
++ .id_table = pci_stub_id_table,
++ .probe = hvfb_pci_stub_probe,
++ .remove = hvfb_pci_stub_remove,
++};
+
+ static int __init hvfb_drv_init(void)
+ {
+- return vmbus_driver_register(&hvfb_drv);
++ int ret;
++
++ ret = vmbus_driver_register(&hvfb_drv);
++ if (ret != 0)
++ return ret;
++
++ ret = pci_register_driver(&hvfb_pci_stub_driver);
++ if (ret != 0) {
++ vmbus_driver_unregister(&hvfb_drv);
++ return ret;
++ }
++
++ return 0;
+ }
+
+ static void __exit hvfb_drv_exit(void)
+ {
++ pci_unregister_driver(&hvfb_pci_stub_driver);
+ vmbus_driver_unregister(&hvfb_drv);
+ }
+