fb:
authorZheng Yang <zhengyang@rock-chips.com>
Tue, 21 Oct 2014 06:37:09 +0000 (14:37 +0800)
committerZheng Yang <zhengyang@rock-chips.com>
Tue, 21 Oct 2014 06:37:09 +0000 (14:37 +0800)
        Add disp-policy in dts and disp_policy in struct rk_fb
        to distinguish box and sdk display policy.

arch/arm/boot/dts/rk3036.dtsi
arch/arm/boot/dts/rk3128-box-rk88.dts
arch/arm/boot/dts/rk3128-box.dts
drivers/video/rockchip/rk_fb.c
include/linux/rk_fb.h

index c035f206edf8530c461bbf8b3f7e5ec24920fced..dfc68f480823d6fa606cb719c7768ee9a641f2e4 100755 (executable)
        fb: fb{
                compatible = "rockchip,rk-fb";
                rockchip,disp-mode = <NO_DUAL>;
+               rockchip,disp-policy = <1>;
        };
 
        rk_screen: rk_screen{
index 940cf1b004e7c2530a4f8018d0a3bd9f5952e86f..18bfc2439f2f832627b085980774b4eac7b3f8c8 100755 (executable)
 
 &fb {
        rockchip,disp-mode = <NO_DUAL>;
+       rockchip,disp-policy = <1>;
        rockchip,uboot-logo-on = <1>;
 };
 
index 857634e0fe5ac26d5f0a9076990c1831941b4333..4b54fb7b43a379f29b04a1d77e6b569be8ca60ad 100755 (executable)
 
 &fb {
        rockchip,disp-mode = <NO_DUAL>;
+       rockchip,disp-policy = <1>;
        rockchip,uboot-logo-on = <1>;
 };
 
index 9c938cd72614579609f0529ed72d013d87c0c9d4..ba279f51555991adc8a45eb92d3fc1dc240af6b7 100755 (executable)
@@ -449,7 +449,7 @@ char *get_format_string(enum data_format format, char *fmt)
                strcpy(fmt, "XBGR888");
                break;
        case ABGR888:
-               strcpy(fmt, "XBGR888");
+               strcpy(fmt, "ABGR888");
                break;
        default:
                strcpy(fmt, "invalid");
@@ -1538,6 +1538,7 @@ void rk_fb_free_dma_buf(struct rk_lcdc_driver *dev_drv,
                index_buf = area_data->index_buf;
 #if defined(CONFIG_ROCKCHIP_IOMMU)
                if (dev_drv->iommu_enabled) {
+                       if (rk_fb->disp_policy != DISPLAY_POLICY_BOX)
                        ion_unmap_iommu(dev_drv->dev, rk_fb->ion_client,
                                        area_data->ion_handle);
                        freed_addr[freed_index++] = area_data->smem_start;
@@ -1737,11 +1738,13 @@ static void rk_fb_update_win(struct rk_lcdc_driver *dev_drv,
                win->g_alpha_val = reg_win_data->g_alpha_val;
                for (i = 0; i < RK_WIN_MAX_AREA; i++) {
                        if (reg_win_data->reg_area_data[i].smem_start > 0) {
-                               win->area[i].ion_hdl =
+                               if (inf->disp_policy != DISPLAY_POLICY_BOX)
+                                       win->area[i].ion_hdl =
                                        reg_win_data->reg_area_data[i].ion_handle;
                                win->area[i].smem_start =
                                        reg_win_data->reg_area_data[i].smem_start;
-                                if (inf->disp_mode == DUAL) {
+                                if (inf->disp_mode == DUAL ||
+                                    inf->disp_policy == DISPLAY_POLICY_BOX) {
                                        win->area[i].xpos =
                                                reg_win_data->reg_area_data[i].xpos;
                                        win->area[i].ypos =
@@ -1838,6 +1841,9 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv,
                win = dev_drv->win[i];
                win_data = rk_fb_get_win_data(regs, i);
                if (win_data) {
+                       if (rk_fb->disp_policy == DISPLAY_POLICY_BOX &&
+                            win_data->data_format == YUV420)
+                               continue;
                        rk_fb_update_win(dev_drv, win, win_data);
                        win->state = 1;
                        dev_drv->ops->set_par(dev_drv, i);
@@ -1854,7 +1860,8 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv,
                }
        }
        dev_drv->ops->ovl_mgr(dev_drv, 0, 1);
-
+       if (rk_fb->disp_policy == DISPLAY_POLICY_BOX)
+               dev_drv->ops->cfg_done(dev_drv);
        if ((rk_fb->disp_mode == DUAL)
            && (hdmi_get_hotplug() == HDMI_HPD_ACTIVED)
            && hdmi_switch_complete) {
@@ -1904,17 +1911,26 @@ ext_win_exit:
                wait_for_vsync = false;
                for (i = 0; i < dev_drv->lcdc_win_num; i++) {
                        if (dev_drv->win[i]->state == 1) {
-                               u32 new_start =
-                                   dev_drv->win[i]->area[0].smem_start +
-                                   dev_drv->win[i]->area[0].y_offset;
-                               u32 reg_start = dsp_addr[i];
-
-                               if (unlikely(new_start != reg_start)) {
-                                       wait_for_vsync = true;
-                                       dev_info(dev_drv->dev,
-                                              "win%d:new_addr:0x%08x cur_addr:0x%08x--%d\n",
-                                              i, new_start, reg_start, 101 - count);
-                                       break;
+                               if (rk_fb->disp_policy == DISPLAY_POLICY_BOX &&
+                                   (dev_drv->win[i]->format == YUV420 ||
+                                    !strcmp(dev_drv->win[i]->name, "hwc"))) {
+                                       continue;
+                               } else {
+                                       u32 new_start =
+                                           dev_drv->win[i]->area[0].smem_start +
+                                           dev_drv->win[i]->area[0].y_offset;
+                                       u32 reg_start = dsp_addr[i];
+
+                                       if (rk_fb->disp_policy == DISPLAY_POLICY_BOX &&
+                                           new_start==0x0)
+                                               continue;
+                                       if (unlikely(new_start != reg_start)) {
+                                               wait_for_vsync = true;
+                                               dev_info(dev_drv->dev,
+                                                      "win%d:new_addr:0x%08x cur_addr:0x%08x--%d\n",
+                                                      i, new_start, reg_start, 101 - count);
+                                               break;
+                                       }
                                }
                        }
                }
@@ -2103,9 +2119,12 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
                reg_win_data->win_id = -1;
        }
 
-        rk_fb_get_prmry_screen(&primary_screen);
+       rk_fb_get_prmry_screen(&primary_screen);
        for (i = 0; i < reg_win_data->area_num; i++) {
-               rk_fb_check_config_var(&win_par->area_par[i], &primary_screen);
+               if (rk_fb->disp_policy == DISPLAY_POLICY_BOX)
+                       rk_fb_check_config_var(&win_par->area_par[i], screen);
+               else
+                       rk_fb_check_config_var(&win_par->area_par[i], &primary_screen);
                /* visiable pos in panel */
                reg_win_data->reg_area_data[i].xpos = win_par->area_par[i].xpos;
                reg_win_data->reg_area_data[i].ypos = win_par->area_par[i].ypos;
@@ -4045,6 +4064,11 @@ static int rk_fb_probe(struct platform_device *pdev)
                dev_err(&pdev->dev, "no disp-mode node found!");
                return -ENODEV;
        }
+       
+       if (!of_property_read_u32(np, "rockchip,disp-policy", &mode)) {
+               rk_fb->disp_policy = mode;
+               pr_info("fb disp policy is %s\n", rk_fb->disp_policy ? "box":"sdk");
+       }
 
        if (!of_property_read_u32(np, "rockchip,uboot-logo-on", &uboot_logo_on))
                printk(KERN_DEBUG "uboot-logo-on:%d\n", uboot_logo_on);
index 9d56a43bcff3b5a0ddba2dc9728d2f96aef22521..56436cc497f5ff88524a37e37d5d6d55db5603a8 100755 (executable)
@@ -238,6 +238,11 @@ typedef enum {
        SCREEN_UNPREPARE_DDR_CHANGE,
 } screen_status;
 
+enum {
+       DISPLAY_POLICY_SDK = 0,
+       DISPLAY_POLICY_BOX,
+};
+
 struct rk_fb_rgb {
        struct fb_bitfield red;
        struct fb_bitfield green;
@@ -620,6 +625,7 @@ struct rk_fb_par {
 
 struct rk_fb {
        int disp_mode;
+       int disp_policy;
        struct rk29fb_info *mach_info;
        struct fb_info *fb[RK_MAX_FB_SUPPORT*2];
        int num_fb;