static int display_postregistered_callback(struct notifier_block *nb, unsigned long event, void *dev) { struct mcde_display_device *ddev = dev; u16 width, height; u16 virtual_height; struct fb_info *fbi; #if defined(CONFIG_COMPDEV) struct mcde_fb *mfb; #endif if (event != MCDE_DSS_EVENT_DISPLAY_REGISTERED) return 0; if (ddev->id < PRIMARY_DISPLAY_ID || ddev->id >= MCDE_NR_OF_DISPLAYS) return 0; mcde_dss_get_native_resolution(ddev, &width, &height); virtual_height = height * 3; /* Create frame buffer */ fbi = mcde_fb_create(ddev, width, height, width, virtual_height, ddev->default_pixel_format, FB_ROTATE_UR); if (IS_ERR(fbi)) { dev_warn(&ddev->dev, "Failed to create fb for display %s\n", ddev->name); goto display_postregistered_callback_err; } else { dev_info(&ddev->dev, "Framebuffer created (%s)\n", ddev->name); if (ddev->id == PRIMARY_DISPLAY_ID) { primary_fbi = fbi; #if defined (CONFIG_SAMSUNG_USE_GETLOG) sec_getlog_supply_fbinfo(primary_fbi); #endif } } #ifdef CONFIG_COMPDEV mfb = to_mcde_fb(fbi); /* Create a compdev overlay for this display */ if (compdev_create(ddev, mfb->ovlys[0], true, NULL) < 0) { dev_warn(&ddev->dev, "Failed to create compdev for display %s\n", ddev->name); goto display_postregistered_callback_err; } else { dev_info(&ddev->dev, "compdev created for (%s)\n", ddev->name); } #endif return 0; display_postregistered_callback_err: return -1; }
static int display_postregistered_callback(struct notifier_block *nb, unsigned long event, void *dev) { struct mcde_display_device *ddev = dev; u16 width, height; u16 virtual_width, virtual_height; u32 rotate = FB_ROTATE_UR; struct fb_info *fbi; struct mcde_fb *mfb; if (event != MCDE_DSS_EVENT_DISPLAY_REGISTERED) return 0; if (ddev->id < PRIMARY_DISPLAY_ID || ddev->id >= MCDE_NR_OF_DISPLAYS) return 0; mcde_dss_get_native_resolution(ddev, &width, &height); virtual_width = width; virtual_height = height * 2; /* Create frame buffer */ fbi = mcde_fb_create(ddev, width, height, virtual_width, virtual_height, ddev->default_pixel_format, rotate); if (IS_ERR(fbi)) { dev_warn(&ddev->dev, "Failed to create fb for display %s\n", ddev->name); goto display_postregistered_callback_err; } else { dev_info(&ddev->dev, "Framebuffer created (%s)\n", ddev->name); if (ddev->id == PRIMARY_DISPLAY_ID) primary_fbi = fbi; } #ifdef CONFIG_DISPDEV mfb = to_mcde_fb(fbi); /* Create a dispdev overlay for this display */ if (dispdev_create(ddev, true, mfb->ovlys[0]) < 0) { dev_warn(&ddev->dev, "Failed to create disp for display %s\n", ddev->name); goto display_postregistered_callback_err; } else { dev_info(&ddev->dev, "Disp dev created for (%s)\n", ddev->name); } #endif return 0; display_postregistered_callback_err: return -1; }
void hdmi_fb_onoff(struct mcde_display_device *ddev, bool enable, u8 cea, u8 vesa_cea_nr) { u16 w, h; u16 vw, vh; u32 rotate = FB_ROTATE_UR; struct display_driver_data *driver_data = dev_get_drvdata(&ddev->dev); dev_dbg(&ddev->dev, "%s\n", __func__); dev_dbg(&ddev->dev, "en:%d cea:%d nr:%d\n", enable, cea, vesa_cea_nr); if (enable) { struct fb_info *fbi; if (ddev->enabled) { dev_dbg(&ddev->dev, "Display is already enabled.\n"); return; } /* Create fb */ if (ddev->fbi == NULL) { #ifdef CONFIG_DISPLAY_AV8100_TRIPPLE_BUFFER int buffering = 3; #else int buffering = 2; #endif /* Get default values */ mcde_dss_get_native_resolution(ddev, &w, &h); vw = w; vh = h * buffering; if (vesa_cea_nr != 0) ddev->ceanr_convert(ddev, cea, vesa_cea_nr, buffering, &w, &h, &vw, &vh); fbi = mcde_fb_create(ddev, w, h, vw, vh, ddev->default_pixel_format, rotate); if (IS_ERR(fbi)) { dev_warn(&ddev->dev, "Failed to create fb for display %s\n", ddev->name); goto hdmi_fb_onoff_end; } else { dev_info(&ddev->dev, "Framebuffer created (%s)\n", ddev->name); } driver_data->fbdevname = (char *)dev_name(fbi->dev); } } else { if (!ddev->enabled) { dev_dbg(&ddev->dev, "Display %s is already disabled.\n", ddev->name); return; } mcde_fb_destroy(ddev); } hdmi_fb_onoff_end: return; }
/* * This function will create the framebuffer for the display that is registered. */ static int display_postregistered_callback(struct notifier_block *nb, unsigned long event, void *dev) { struct mcde_display_device *ddev = dev; u16 width, height; u16 virtual_width, virtual_height; u32 rotate = FB_ROTATE_UR; struct fb_info *fbi; if (event != MCDE_DSS_EVENT_DISPLAY_REGISTERED) return 0; if (ddev->id < PRIMARY_DISPLAY_ID || ddev->id >= MCDE_NR_OF_DISPLAYS) return 0; mcde_dss_get_native_resolution(ddev, &width, &height); #ifdef CONFIG_DISPLAY_GENERIC_DSI_PRIMARY if (ddev->id == PRIMARY_DISPLAY_ID) { switch (CONFIG_DISPLAY_GENERIC_DSI_PRIMARY_ROTATION_ANGLE) { case 0: rotate = FB_ROTATE_UR; break; case 90: rotate = FB_ROTATE_CW; swap(width, height); break; case 180: rotate = FB_ROTATE_UD; break; case 270: rotate = FB_ROTATE_CCW; swap(width, height); break; } } #endif virtual_width = width; virtual_height = height * 2; #if defined(CONFIG_DISPLAY_GENERIC_DSI_PRIMARY) && \ defined(CONFIG_DISPLAY_GENERIC_DSI_PRIMARY_AUTO_SYNC) if (ddev->id == PRIMARY_DISPLAY_ID) virtual_height = height; #endif #if defined(CONFIG_DISPLAY_GENERIC_DSI_SECONDARY) && \ defined(CONFIG_DISPLAY_GENERIC_DSI_SECONDARY_AUTO_SYNC) if (ddev->id == SECONDARY_DISPLAY_ID) virtual_height = height; #endif #ifdef CONFIG_DISPLAY_AV8100_TRIPPLE_BUFFER if (ddev->id == AV8100_DISPLAY_ID) virtual_height = height * 3; #endif if (ddev->id == AV8100_DISPLAY_ID) { #ifdef CONFIG_MCDE_DISPLAY_HDMI_FB_AUTO_CREATE hdmi_fb_onoff(ddev, 1, 0, 0); #endif /* CONFIG_MCDE_DISPLAY_HDMI_FB_AUTO_CREATE */ } else { struct mcde_fb *mfb; /* Create frame buffer */ fbi = mcde_fb_create(ddev, width, height, virtual_width, virtual_height, ddev->default_pixel_format, rotate); if (IS_ERR(fbi)) { dev_warn(&ddev->dev, "Failed to create fb for display %s\n", ddev->name); goto display_postregistered_callback_err; } else { dev_info(&ddev->dev, "Framebuffer created (%s)\n", ddev->name); } #ifdef CONFIG_DISPDEV mfb = to_mcde_fb(fbi); /* Create a dispdev overlay for this display */ if (dispdev_create(ddev, true, mfb->ovlys[0]) < 0) { dev_warn(&ddev->dev, "Failed to create disp for display %s\n", ddev->name); goto display_postregistered_callback_err; } else { dev_info(&ddev->dev, "Disp dev created for (%s)\n", ddev->name); } #endif } return 0; display_postregistered_callback_err: return -1; }
/* * This function will create the framebuffer for the display that is registered. */ static int display_postregistered_callback(struct notifier_block *nb, unsigned long event, void *dev) { struct mcde_display_device *ddev = dev; u16 width, height; u16 virtual_height; struct fb_info *fbi; #if defined(CONFIG_DISPDEV) || defined(CONFIG_COMPDEV) struct mcde_fb *mfb; #endif if (event != MCDE_DSS_EVENT_DISPLAY_REGISTERED) return 0; if (ddev->id < 0 || ddev->id >= MCDE_NR_OF_DISPLAYS) return 0; mcde_dss_get_native_resolution(ddev, &width, &height); if (ddev->id == PRIMARY_DISPLAY_ID) virtual_height = height * 3; else virtual_height = height * 2; #ifndef CONFIG_MCDE_DISPLAY_HDMI_FB_AUTO_CREATE if (ddev->id == AV8100_DISPLAY_ID) goto out; #endif /* Create frame buffer */ #if defined(CONFIG_MCDE_DISPLAY_BAMBOOK) fbi = mcde_fb_create(ddev, width, height, width, virtual_height, ddev->default_pixel_format, FB_ROTATE_UD); #else fbi = mcde_fb_create(ddev, width, height, width, virtual_height, ddev->default_pixel_format, FB_ROTATE_UR); #endif if (IS_ERR(fbi)) { dev_warn(&ddev->dev, "Failed to create fb for display %s\n", ddev->name); goto display_postregistered_callback_err; } else { dev_info(&ddev->dev, "Framebuffer created (%s)\n", ddev->name); } #ifdef CONFIG_DISPDEV mfb = to_mcde_fb(fbi); /* Create a dispdev overlay for this display */ if (dispdev_create(ddev, true, mfb->ovlys[0]) < 0) { dev_warn(&ddev->dev, "Failed to create disp for display %s\n", ddev->name); goto display_postregistered_callback_err; } else { dev_info(&ddev->dev, "Disp dev created for (%s)\n", ddev->name); } #endif #ifdef CONFIG_COMPDEV /* Only create compdev for the main display */ if (ddev->id == PRIMARY_DISPLAY_ID) { bool mcde_rotation = false; /* Use mcde rotation for U8500 only */ if (cpu_is_u8500_family()) mcde_rotation = true; mfb = to_mcde_fb(fbi); /* Create a compdev overlay for this display */ if (compdev_create(ddev, mfb->ovlys[0], mcde_rotation, NULL) < 0) { dev_warn(&ddev->dev, "Failed to create compdev for display %s\n", ddev->name); goto display_postregistered_callback_err; } else { dev_info(&ddev->dev, "compdev created for (%s)\n", ddev->name); } } #endif out: return 0; display_postregistered_callback_err: return -1; }