* @broken_vblank: the vblank IRQ is broken on this variant
  * @formats: array of supported pixel formats on this variant
  * @nformats: the length of the array of supported pixel formats
+ * @fb_bpp: desired bits per pixel on the default framebuffer
  */
 struct pl111_variant_data {
        const char *name;
        bool broken_vblank;
        const u32 *formats;
        unsigned int nformats;
+       unsigned int fb_bpp;
 };
 
 struct pl111_drm_dev_private {
 
 
        drm_mode_config_reset(dev);
 
-       drm_fb_cma_fbdev_init(dev, 32, 0);
+       drm_fb_cma_fbdev_init(dev, priv->variant->fb_bpp, 0);
 
        drm_kms_helper_poll_init(dev);
 
        .is_pl110 = true,
        .formats = pl110_pixel_formats,
        .nformats = ARRAY_SIZE(pl110_pixel_formats),
+       .fb_bpp = 16,
 };
 
 /* RealView, Versatile Express etc use this modern variant */
        .name = "PL111",
        .formats = pl111_pixel_formats,
        .nformats = ARRAY_SIZE(pl111_pixel_formats),
+       .fb_bpp = 32,
 };
 
 static const struct amba_id pl111_id_table[] = {
 
        .broken_vblank = true,
        .formats = pl110_integrator_pixel_formats,
        .nformats = ARRAY_SIZE(pl110_integrator_pixel_formats),
+       .fb_bpp = 16,
 };
 
 /*
        .external_bgr = true,
        .formats = pl110_versatile_pixel_formats,
        .nformats = ARRAY_SIZE(pl110_versatile_pixel_formats),
+       .fb_bpp = 16,
 };
 
 int pl111_versatile_init(struct device *dev, struct pl111_drm_dev_private *priv)