void            *fb_virt;       /* virt. address of the frame buffer */
        dma_addr_t      fb_phys;        /* phys. address of the frame buffer */
+       int             fb_alloced;     /* Flag, was the fb memory alloced? */
 
        u32             reg_ctrl_default;
 
        }
 
        /* Allocate the framebuffer memory */
-       drvdata->fb_virt = dma_alloc_coherent(dev, PAGE_ALIGN(fbsize),
-                               &drvdata->fb_phys, GFP_KERNEL);
+       if (pdata->fb_phys) {
+               drvdata->fb_phys = pdata->fb_phys;
+               drvdata->fb_virt = ioremap(pdata->fb_phys, fbsize);
+       } else {
+               drvdata->fb_alloced = 1;
+               drvdata->fb_virt = dma_alloc_coherent(dev, PAGE_ALIGN(fbsize),
+                                       &drvdata->fb_phys, GFP_KERNEL);
+       }
+
        if (!drvdata->fb_virt) {
                dev_err(dev, "Could not allocate frame buffer memory\n");
                rc = -ENOMEM;
        fb_dealloc_cmap(&drvdata->info.cmap);
 
 err_cmap:
-       dma_free_coherent(dev, PAGE_ALIGN(fbsize), drvdata->fb_virt,
-               drvdata->fb_phys);
+       if (drvdata->fb_alloced)
+               dma_free_coherent(dev, PAGE_ALIGN(fbsize), drvdata->fb_virt,
+                       drvdata->fb_phys);
        /* Turn off the display */
        xilinx_fb_out_be32(drvdata, REG_CTRL, 0);
 
 
        fb_dealloc_cmap(&drvdata->info.cmap);
 
-       dma_free_coherent(dev, PAGE_ALIGN(drvdata->info.fix.smem_len),
-                         drvdata->fb_virt, drvdata->fb_phys);
+       if (drvdata->fb_alloced)
+               dma_free_coherent(dev, PAGE_ALIGN(drvdata->info.fix.smem_len),
+                                 drvdata->fb_virt, drvdata->fb_phys);
 
        /* Turn off the display */
        xilinx_fb_out_be32(drvdata, REG_CTRL, 0);
 
        u32 screen_width_mm;
        u32 xres, yres;         /* resolution of screen in pixels */
        u32 xvirt, yvirt;       /* resolution of memory buffer */
+
+       /* Physical address of framebuffer memory; If non-zero, driver
+        * will use provided memory address instead of allocating one from
+        * the consistent pool. */
+       u32 fb_phys;
 };
 
 #endif  /* __XILINXFB_H__ */