static int32_t sprdfb_dispc_refresh (struct sprdfb_device *dev) { struct fb_info *fb = dev->fb; uint32_t base = fb->fix.smem_start + fb->fix.line_length * fb->var.yoffset; pr_debug(KERN_INFO "sprdfb:[%s]\n",__FUNCTION__); if(SPRDFB_PANEL_IF_DPI != dev->panel_if_type){ dispc_ctx.vsync_waiter ++; dispc_sync(dev); // dispc_ctx.vsync_done = 0; #ifdef CONFIG_FB_DYNAMIC_CLK_SUPPORT if(!dispc_ctx.clk_open){ clk_enable(dispc_ctx.clk_dispc); clk_enable(dispc_ctx.clk_dispc_dpi); clk_enable(dispc_ctx.clk_dispc_dbi); dispc_ctx.clk_open = true; } #endif } pr_debug(KERN_INFO "srpdfb: [%s] got sync\n", __FUNCTION__); dispc_ctx.dev = dev; #ifdef CONFIG_FB_LCD_OVERLAY_SUPPORT down(&dispc_ctx.overlay_lock); #endif #ifdef LCD_UPDATE_PARTLY if ((fb->var.reserved[0] == 0x6f766572) &&(SPRDFB_PANEL_IF_DPI != dev->panel_if_type)) { uint32_t x,y, width, height; x = fb->var.reserved[1] & 0xffff; y = fb->var.reserved[1] >> 16; width = fb->var.reserved[2] & 0xffff; height = fb->var.reserved[2] >> 16; base += ((x + y * fb->var.xres) * fb->var.bits_per_pixel / 8); dispc_write(base, DISPC_OSD_BASE_ADDR); dispc_write(0, DISPC_OSD_DISP_XY); dispc_write(fb->var.reserved[2], DISPC_OSD_SIZE_XY); dispc_write(fb->var.xres, DISPC_OSD_PITCH); dispc_write(fb->var.reserved[2], DISPC_SIZE_XY); sprdfb_panel_invalidate_rect(dev->panel, x, y, x+width-1, y+height-1); } else
static int32_t sprdfb_lcdc_refresh (struct sprdfb_device *dev) { struct fb_info *fb = dev->fb; uint32_t base = fb->fix.smem_start + fb->fix.line_length * fb->var.yoffset; pr_debug(KERN_INFO "sprdfb:[%s]\n",__FUNCTION__); lcdc_ctx.vsync_waiter ++; lcdc_sync(dev); pr_debug(KERN_INFO "srpdfb: [%s] got sync\n", __FUNCTION__); lcdc_ctx.dev = dev; lcdc_ctx.vsync_done = 0; #ifdef LCD_UPDATE_PARTLY if (fb->var.reserved[0] == 0x6f766572) { uint32_t x,y, width, height; x = fb->var.reserved[1] & 0xffff; y = fb->var.reserved[1] >> 16; width = fb->var.reserved[2] & 0xffff; height = fb->var.reserved[2] >> 16; base += ((x + y * fb->var.xres) * fb->var.bits_per_pixel / 8); lcdc_write(base, LCDC_OSD1_BASE_ADDR); lcdc_write(0, LCDC_OSD1_DISP_XY); lcdc_write(fb->var.reserved[2], LCDC_OSD1_SIZE_XY); lcdc_write(fb->var.xres, LCDC_OSD1_PITCH); lcdc_write(fb->var.reserved[2], LCDC_DISP_SIZE); lcdc_write(0, LCDC_LCM_START); lcdc_write(fb->var.reserved[2], LCDC_LCM_SIZE); sprdfb_panel_invalidate_rect(dev->panel, x, y, x+width-1, y+height-1); } else