static int framebuffer_postregistered_callback(struct notifier_block *nb, unsigned long event, void *data) { int ret = 0; struct fb_event *event_data = data; struct fb_info *info; struct fb_var_screeninfo var; struct fb_fix_screeninfo fix; struct mcde_fb *mfb; if (event != FB_EVENT_FB_REGISTERED) return 0; if (!event_data) return 0; info = event_data->info; mfb = to_mcde_fb(info); if (mfb->id == 0 && display_initialized_during_boot) goto out; var = info->var; fix = info->fix; var.yoffset = var.yoffset ? 0 : var.yres; if (info->fbops->fb_pan_display) ret = info->fbops->fb_pan_display(&var, info); out: return ret; }
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 framebuffer_postregistered_callback(struct notifier_block *nb, unsigned long event, void *data) { int ret = 0; struct fb_event *event_data = data; struct fb_info *info; struct fb_var_screeninfo var; struct fb_fix_screeninfo fix; struct mcde_fb *mfb; int i; if (event != FB_EVENT_FB_REGISTERED) return 0; if (!event_data) return 0; info = event_data->info; mfb = to_mcde_fb(info); var = info->var; fix = info->fix; /* Apply overlay info */ for (i = 0; i < mfb->num_ovlys; i++) { struct mcde_overlay *ovly = mfb->ovlys[i]; struct mcde_overlay_info ovly_info; struct mcde_fb *mfb = to_mcde_fb(info); memset(&ovly_info, 0, sizeof(ovly_info)); ovly_info.paddr = fix.smem_start + fix.line_length * var.yoffset; if (ovly_info.paddr + fix.line_length * var.yres > fix.smem_start + fix.smem_len) ovly_info.paddr = fix.smem_start; ovly_info.fmt = mfb->pix_fmt; ovly_info.stride = fix.line_length; ovly_info.w = var.xres; ovly_info.h = var.yres; ovly_info.dirty.w = var.xres; ovly_info.dirty.h = var.yres; (void) mcde_dss_apply_overlay(ovly, &ovly_info); ret = mcde_dss_update_overlay(ovly); if (ret) break; } return ret; }
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; }
/* * 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; }