rk fb: add rk_fb_par data struct to store more fb info
authorzwl <zwl@rockchips.com>
Thu, 16 Oct 2014 02:02:46 +0000 (10:02 +0800)
committerzwl <zwl@rockchips.com>
Thu, 16 Oct 2014 02:02:57 +0000 (10:02 +0800)
drivers/video/rockchip/rk_fb.c
drivers/video/rockchip/rkfb_sysfs.c
include/linux/rk_fb.h

index ad9b02803fc205fa73ef01b36dc8c42ff44aa3e5..ac655f9cb046f8572a6f029efad8e2317b3c8f33 100755 (executable)
@@ -733,11 +733,12 @@ void rk_fb_platform_set_sysmmu(struct device *sysmmu, struct device *dev)
 
 static int rk_fb_open(struct fb_info *info, int user)
 {
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)info->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)info->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        int win_id;
 
        win_id = dev_drv->ops->fb_get_win_id(dev_drv, info->fix.id);
-       dev_drv->win[win_id]->logicalstate++;
+       fb_par->state++;
        /* if this win aready opened ,no need to reopen */
        if (dev_drv->win[win_id]->state)
                return 0;
@@ -750,7 +751,8 @@ static int get_extend_fb_id(struct fb_info *info)
 {
        int fb_id = 0;
        char *id = info->fix.id;
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)info->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)info->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
 
        if (!strcmp(id, "fb0"))
                fb_id = 0;
@@ -765,14 +767,15 @@ static int get_extend_fb_id(struct fb_info *info)
 
 static int rk_fb_close(struct fb_info *info, int user)
 {
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)info->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)info->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        struct rk_lcdc_win *win = NULL;
        int win_id = dev_drv->ops->fb_get_win_id(dev_drv, info->fix.id);
 
        if (win_id >= 0) {
                win = dev_drv->win[win_id];
-               win->logicalstate--;
-               if (!win->logicalstate) {
+               fb_par->state--;
+               if (!fb_par->state) {
                        info->fix.smem_start = win->reserved;
                        info->var.xres = dev_drv->screen0->mode.xres;
                        info->var.yres = dev_drv->screen0->mode.yres;
@@ -799,7 +802,6 @@ static int rk_fb_close(struct fb_info *info, int user)
                        info->var.vsync_len = dev_drv->screen0->mode.vsync_len;
                        info->var.hsync_len = dev_drv->screen0->mode.hsync_len;
                }
-               info->var.reserved[0] = (__u32)win->area[0].ion_hdl;
        }
 
        return 0;
@@ -883,8 +885,8 @@ static void fb_copy_by_ipp(struct fb_info *dst_info,
        int dst_w, dst_h, dst_vir_w;
        int ipp_fmt;
        u8 data_format = (dst_info->var.nonstd) & 0xff;
-       struct rk_lcdc_driver *ext_dev_drv =
-                       (struct rk_lcdc_driver *)dst_info->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)dst_info->par;
+       struct rk_lcdc_driver *ext_dev_drv = fb_par->lcdc_drv;
        u16 orientation = ext_dev_drv->rotate_mode;
 
        memset(&ipp_req, 0, sizeof(struct rk29_ipp_req));
@@ -1104,9 +1106,10 @@ static void win_copy_by_rga(struct rk_lcdc_win *dst_win,
 static void fb_copy_by_rga(struct fb_info *dst_info,
                                struct fb_info *src_info)
 {
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)src_info->par;
-       struct rk_lcdc_driver *ext_dev_drv =
-           (struct rk_lcdc_driver *)dst_info->par;
+       struct rk_fb_par *src_fb_par = (struct rk_fb_par *)src_info->par;
+       struct rk_fb_par *dst_fb_par = (struct rk_fb_par *)dst_info->par;
+       struct rk_lcdc_driver *dev_drv = src_fb_par->lcdc_drv;
+       struct rk_lcdc_driver *ext_dev_drv = dst_fb_par->lcdc_drv;
        int win_id = 0, ext_win_id;
        struct rk_lcdc_win *src_win, *dst_win;
 
@@ -1155,6 +1158,7 @@ static int rk_fb_set_ext_win_buffer(struct rk_lcdc_win *ext_win,
 {
        struct rk_fb *rk_fb =  platform_get_drvdata(fb_pdev);
        struct fb_info *ext_info = rk_fb->fb[(rk_fb->num_fb >> 1)];
+       struct rk_fb_par *ext_fb_par = (struct rk_fb_par *)ext_info->par;
        struct rk_lcdc_driver *ext_dev_drv = rk_get_extend_lcdc_drv();
        struct rk_lcdc_win *last_win;
        static u8 fb_index = 0;
@@ -1223,7 +1227,7 @@ static int rk_fb_set_ext_win_buffer(struct rk_lcdc_win *ext_win,
        /* rotate mode */
        if (!iommu_en) {
                if (ext_win->id == 0) {
-                       ext_win->area[0].smem_start = rk_fb->ext_fb_phy_base;
+                       ext_win->area[0].smem_start = ext_fb_par->fb_phy_base;
                        ext_win->area[0].y_offset = (get_rotate_fb_size() >> 1) * fb_index;
                        if ((++fb_index) > 1)
                                fb_index = 0;
@@ -1261,7 +1265,9 @@ static int rk_fb_pan_display(struct fb_var_screeninfo *var,
                             struct fb_info *info)
 {
        struct rk_fb *rk_fb = dev_get_drvdata(info->device);
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)info->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)info->par;
+       struct rk_fb_par *extend_fb_par = NULL;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        struct fb_fix_screeninfo *fix = &info->fix;
        struct fb_info *extend_info = NULL;
        struct rk_lcdc_driver *extend_dev_drv = NULL;
@@ -1294,7 +1300,8 @@ static int rk_fb_pan_display(struct fb_var_screeninfo *var,
        if (rk_fb->disp_mode == DUAL) {
                fb_id = get_extend_fb_id(info);
                extend_info = rk_fb->fb[(rk_fb->num_fb >> 1) + fb_id];
-               extend_dev_drv = (struct rk_lcdc_driver *)extend_info->par;
+               extend_fb_par = (struct rk_fb_par *)extend_info->par;
+               extend_dev_drv = extend_fb_par->lcdc_drv;
                extend_win_id = dev_drv->ops->fb_get_win_id(extend_dev_drv,
                                                           extend_info->fix.id);
                extend_win = extend_dev_drv->win[extend_win_id];
@@ -1396,7 +1403,8 @@ static int rk_fb_pan_display(struct fb_var_screeninfo *var,
        dev_drv->ops->pan_display(dev_drv, win_id);
 
        if (rk_fb->disp_mode == DUAL) {
-               if (extend_win->state && hdmi_switch_complete) {
+               if (extend_info != info && extend_win->state &&
+                   hdmi_switch_complete) {
                        rk_fb_set_ext_win_buffer(extend_win, win,
                                                 extend_dev_drv->rotate_mode,
                                                 extend_dev_drv->iommu_enabled);
@@ -1441,7 +1449,8 @@ void rk_fd_fence_wait(struct rk_lcdc_driver *dev_drv, struct sync_fence *fence)
 #if 0
 static int rk_fb_copy_from_loader(struct fb_info *info)
 {
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)info->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)info->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        void *dst = info->screen_base;
        u32 dsp_addr[4];
        u32 src;
@@ -1988,7 +1997,8 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
 {
        struct rk_fb *rk_fb = dev_get_drvdata(info->device);
        struct fb_fix_screeninfo *fix = &info->fix;
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)info->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)info->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        struct rk_screen *screen = dev_drv->cur_screen;
         struct rk_screen primary_screen;
        struct fb_info *fbi = rk_fb->fb[0];
@@ -2219,7 +2229,8 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
 static int rk_fb_set_win_config(struct fb_info *info,
                                struct rk_fb_win_cfg_data *win_data)
 {
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)info->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)info->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        struct rk_fb_reg_data *regs;
 #ifdef H_USE_FENCE
        struct sync_fence *release_fence[RK_MAX_BUF_NUM];
@@ -2417,7 +2428,9 @@ static int rk_fb_ioctl(struct fb_info *info, unsigned int cmd,
                       unsigned long arg)
 {
        struct rk_fb *rk_fb = dev_get_drvdata(info->device);
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)info->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)info->par;
+       struct rk_fb_par *extend_fb_par = NULL;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        struct fb_fix_screeninfo *fix = &info->fix;
        int fb_id = 0, extend_win_id = 0;
        struct fb_info *extend_info = NULL;
@@ -2439,7 +2452,8 @@ static int rk_fb_ioctl(struct fb_info *info, unsigned int cmd,
        if (rk_fb->disp_mode == DUAL) {
                fb_id = get_extend_fb_id(info);
                extend_info = rk_fb->fb[(rk_fb->num_fb >> 1) + fb_id];
-               extend_dev_drv = (struct rk_lcdc_driver *)extend_info->par;
+               extend_fb_par = (struct rk_fb_par *)extend_info->par;
+               extend_dev_drv = extend_fb_par->lcdc_drv;
                extend_win_id = dev_drv->ops->fb_get_win_id(extend_dev_drv,
                                                            extend_info->fix.id);
                extend_win = extend_dev_drv->win[extend_win_id];
@@ -2634,7 +2648,7 @@ static int rk_fb_ioctl(struct fb_info *info, unsigned int cmd,
                }
 #endif
        case RK_FBIOSET_CLEAR_FB:
-               memset(info->screen_base, 0, info->fix.smem_len);
+               memset(fb_par->fb_virt_base, 0, fb_par->fb_size);
                break;
        case RK_FBIOSET_CONFIG_DONE:
                {
@@ -2679,7 +2693,8 @@ static int rk_fb_ioctl(struct fb_info *info, unsigned int cmd,
 
 static int rk_fb_blank(int blank_mode, struct fb_info *info)
 {
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)info->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)info->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        struct fb_fix_screeninfo *fix = &info->fix;
        int win_id;
 #if defined(CONFIG_RK_HDMI)
@@ -2743,7 +2758,8 @@ static ssize_t rk_fb_read(struct fb_info *info, char __user *buf,
        u8 __iomem *src;
        int c, cnt = 0, err = 0;
        unsigned long total_size;
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)info->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)info->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        struct rk_lcdc_win *win = NULL;
        int win_id = 0;
 
@@ -2807,7 +2823,8 @@ static ssize_t rk_fb_write(struct fb_info *info, const char __user *buf,
        u8 __iomem *dst;
        int c, cnt = 0, err = 0;
        unsigned long total_size;
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)info->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)info->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        struct rk_lcdc_win *win = NULL;
        int win_id = 0;
 
@@ -2877,6 +2894,8 @@ static int rk_fb_update_ext_info(struct fb_info *ext_info,
                                        struct fb_info *info, int update_buffer)
 {
        struct rk_fb *rk_fb =  platform_get_drvdata(fb_pdev);
+       struct rk_fb_par *fb_par = NULL;
+       struct rk_fb_par *ext_fb_par = NULL;
        struct rk_lcdc_driver *dev_drv = NULL;
        struct rk_lcdc_driver *ext_dev_drv = NULL;
        struct rk_lcdc_win *win = NULL;
@@ -2888,8 +2907,10 @@ static int rk_fb_update_ext_info(struct fb_info *ext_info,
        if (unlikely(!info) || unlikely(!ext_info))
                 return -1;
 
-       dev_drv = (struct rk_lcdc_driver *)info->par;
-       ext_dev_drv = (struct rk_lcdc_driver *)ext_info->par;
+       fb_par = (struct rk_fb_par *)info->par;
+       ext_fb_par = (struct rk_fb_par *)ext_info->par;
+       dev_drv = fb_par->lcdc_drv;
+       ext_dev_drv = ext_fb_par->lcdc_drv;
        if (unlikely(!dev_drv) || unlikely(!ext_dev_drv))
                 return -1;
 
@@ -2937,7 +2958,9 @@ static int rk_fb_set_par(struct fb_info *info)
 {
        struct fb_var_screeninfo *var = &info->var;
        struct fb_fix_screeninfo *fix = &info->fix;
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)info->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)info->par;
+       struct rk_fb_par *extend_fb_par = NULL;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        struct rk_fb *rk_fb = dev_get_drvdata(info->device);
        int fb_id, extend_win_id = 0;
        struct fb_info *extend_info = NULL;
@@ -2974,7 +2997,8 @@ static int rk_fb_set_par(struct fb_info *info)
        if (rk_fb->disp_mode == DUAL) {
                fb_id = get_extend_fb_id(info);
                extend_info = rk_fb->fb[(rk_fb->num_fb >> 1) + fb_id];
-               extend_dev_drv = (struct rk_lcdc_driver *)extend_info->par;
+               extend_fb_par = (struct rk_fb_par *)extend_info->par;
+               extend_dev_drv = extend_fb_par->lcdc_drv;
                extend_win_id = dev_drv->ops->fb_get_win_id(extend_dev_drv,
                                                            extend_info->fix.id);
                extend_win = extend_dev_drv->win[extend_win_id];
@@ -3153,11 +3177,12 @@ static int fb_setcolreg(unsigned regno,
 static int rk_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
 {
        struct rk_fb *rk_fb = platform_get_drvdata(fb_pdev);
-       struct ion_handle *handle = (struct ion_handle *)info->var.reserved[0];
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)info->par;
+       struct ion_handle *handle = fb_par->ion_hdl;
        struct dma_buf *dma_buf = NULL;
 
-       if (handle == NULL || IS_ERR(handle)) {
-               dev_err(info->device, "failed to get ion handle:%ld\n",
+       if (IS_ERR_OR_NULL(handle)) {
+               dev_err(info->dev, "failed to get ion handle:%ld\n",
                        PTR_ERR(handle));
                return -ENOMEM;
        }
@@ -3243,7 +3268,8 @@ static ssize_t rk_fb_vsync_show(struct device *dev,
                                struct device_attribute *attr, char *buf)
 {
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        return scnprintf(buf, PAGE_SIZE, "%llu\n",
                         ktime_to_ns(dev_drv->vsync_info.timestamp));
 }
@@ -3313,14 +3339,16 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id)
        struct rk_fb *rk_fb =  platform_get_drvdata(fb_pdev);
        struct fb_info *info = NULL;
        struct fb_info *pmy_info = NULL;
+       struct rk_fb_par *fb_par = NULL;
+       struct rk_fb_par *pmy_fb_par = NULL;
        struct rk_lcdc_driver *dev_drv = NULL;
-       struct rk_lcdc_driver *pmy_dev_drv = rk_get_prmry_lcdc_drv();
        char name[6] = {0};
        int i, win_id, load_screen = 0;
 
-       if (unlikely(!rk_fb) || unlikely(!pmy_dev_drv) || unlikely(!screen))
+       if (unlikely(!rk_fb) || unlikely(!screen))
                return -ENODEV;
 
+       hdmi_switch_complete = 0;
        /* get lcdc driver */
        sprintf(name, "lcdc%d", lcdc_id);
        if (rk_fb->disp_mode != DUAL)
@@ -3393,17 +3421,18 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id)
        if (!dev_drv->uboot_logo) {
                for (i = 0; i < dev_drv->lcdc_win_num; i++) {
                        info = rk_fb->fb[dev_drv->fb_index_base + i];
+                       fb_par = (struct rk_fb_par *)info->par;
                        win_id = dev_drv->ops->fb_get_win_id(dev_drv, info->fix.id);
                        if (dev_drv->win[win_id]) {
                                if (rk_fb->disp_mode == DUAL) {
-                                       if (dev_drv != pmy_dev_drv &&
-                                                       pmy_dev_drv->win[win_id]) {
-                                               dev_drv->win[win_id]->logicalstate =
-                                                       pmy_dev_drv->win[win_id]->logicalstate;
-                                               pmy_info = rk_fb->fb[pmy_dev_drv->fb_index_base + i];
+                                       pmy_info = rk_fb->fb[i];
+                                       if (pmy_info != info) {
+                                               pmy_fb_par =
+                                                       (struct rk_fb_par *)pmy_info->par;
+                                               fb_par->state = pmy_fb_par->state;
                                        }
                                }
-                               if (dev_drv->win[win_id]->logicalstate) {
+                               if (fb_par->state) {
                                        if (!dev_drv->win[win_id]->state)
                                                dev_drv->ops->open(dev_drv, win_id, 1);
                                        if (!load_screen) {
@@ -3519,7 +3548,8 @@ static int rk_fb_alloc_buffer_by_ion(struct fb_info *fbi,
                                     unsigned long fb_mem_size)
 {
        struct rk_fb *rk_fb = platform_get_drvdata(fb_pdev);
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        struct ion_handle *handle;
        ion_phys_addr_t phy_addr;
        size_t len;
@@ -3536,7 +3566,8 @@ static int rk_fb_alloc_buffer_by_ion(struct fb_info *fbi,
                        PTR_ERR(handle));
                return -ENOMEM;
        }
-       fbi->var.reserved[0] = (__u32)handle;
+
+       fb_par->ion_hdl = handle;
        win->area[0].dma_buf = ion_share_dma_buf(rk_fb->ion_client, handle);
        if (IS_ERR_OR_NULL(win->area[0].dma_buf)) {
                printk("ion_share_dma_buf() failed\n");
@@ -3546,7 +3577,7 @@ static int rk_fb_alloc_buffer_by_ion(struct fb_info *fbi,
         if (dev_drv->prop == PRMRY)
                fbi->screen_base = ion_map_kernel(rk_fb->ion_client, handle);
 #ifdef CONFIG_ROCKCHIP_IOMMU
-       if (dev_drv->iommu_enabled)
+       if (dev_drv->iommu_enabled && dev_drv->mmu_dev)
                ret = ion_map_iommu(dev_drv->dev, rk_fb->ion_client, handle,
                                        (unsigned long *)&phy_addr,
                                        (unsigned long *)&len);
@@ -3561,10 +3592,6 @@ static int rk_fb_alloc_buffer_by_ion(struct fb_info *fbi,
        }
        fbi->fix.smem_start = phy_addr;
        fbi->fix.smem_len = len;
-       if (dev_drv->prop == PRMRY)
-               rk_fb->fb_phy_base = phy_addr;
-       else
-               rk_fb->ext_fb_phy_base = phy_addr;
        printk(KERN_INFO "alloc_buffer:ion_phy_addr=0x%lx\n", phy_addr);
        return 0;
 
@@ -3577,7 +3604,8 @@ err_share_dma_buf:
 static int rk_fb_alloc_buffer(struct fb_info *fbi, int fb_id)
 {
        struct rk_fb *rk_fb = platform_get_drvdata(fb_pdev);
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        struct rk_lcdc_win *win = NULL;
        int win_id;
        int ret = 0;
@@ -3609,7 +3637,6 @@ static int rk_fb_alloc_buffer(struct fb_info *fbi, int fb_id)
                fbi->fix.smem_len = fb_mem_size;
                fbi->fix.smem_start = fb_mem_phys;
                fbi->screen_base = fb_mem_virt;
-               rk_fb->fb_phy_base = fb_mem_phys;
 #endif
                memset(fbi->screen_base, 0, fbi->fix.smem_len);
                printk(KERN_INFO "fb%d:phy:%lx>>vir:%p>>len:0x%x\n", fb_id,
@@ -3635,13 +3662,11 @@ static int rk_fb_alloc_buffer(struct fb_info *fbi, int fb_id)
                        fbi->fix.smem_len = fb_mem_size;
                        fbi->fix.smem_start = fb_mem_phys;
                        fbi->screen_base = fb_mem_virt;
-                       rk_fb->ext_fb_phy_base = fb_mem_phys;
 #endif
                } else {
                        fbi->fix.smem_start = rk_fb->fb[0]->fix.smem_start;
                        fbi->fix.smem_len = rk_fb->fb[0]->fix.smem_len;
                        fbi->screen_base = rk_fb->fb[0]->screen_base;
-                       rk_fb->ext_fb_phy_base = rk_fb->fb_phy_base;
                }
 
                printk(KERN_INFO "fb%d:phy:%lx>>vir:%p>>len:0x%x\n", fb_id,
@@ -3650,6 +3675,9 @@ static int rk_fb_alloc_buffer(struct fb_info *fbi, int fb_id)
        }
 
        fbi->screen_size = fbi->fix.smem_len;
+       fb_par->fb_phy_base = fbi->fix.smem_start;
+       fb_par->fb_virt_base = fbi->screen_base;
+       fb_par->fb_size = fbi->fix.smem_len;
        win_id = dev_drv->ops->fb_get_win_id(dev_drv, fbi->fix.id);
        if (win_id >= 0) {
                win = dev_drv->win[win_id];
@@ -3806,12 +3834,9 @@ int rk_fb_register(struct rk_lcdc_driver *dev_drv,
 {
        struct rk_fb *rk_fb = platform_get_drvdata(fb_pdev);
        struct fb_info *fbi;
+       struct rk_fb_par *fb_par = NULL;
        int i = 0, ret = 0, index = 0;
-/*
-#if defined(CONFIG_ROCKCHIP_IOMMU)
-       struct device *mmu_dev = NULL;
-#endif
-*/
+
        if (rk_fb->num_lcdc == RK30_MAX_LCDC_SUPPORT)
                return -ENXIO;
 
@@ -3833,7 +3858,16 @@ int rk_fb_register(struct rk_lcdc_driver *dev_drv,
                        dev_err(&fb_pdev->dev, "fb framebuffer_alloc fail!");
                        ret = -ENOMEM;
                }
-               fbi->par = dev_drv;
+               fb_par = devm_kzalloc(&fb_pdev->dev, sizeof(struct rk_fb_par),
+                                     GFP_KERNEL);
+               if (!fb_par) {
+                       dev_err(&fb_pdev->dev, "malloc fb_par for fb%d fail!",
+                               rk_fb->num_fb);
+                       return -ENOMEM;
+               }
+               fb_par->id = rk_fb->num_fb;
+               fb_par->lcdc_drv = dev_drv;
+               fbi->par = (void *)fb_par;
                fbi->var = def_var;
                fbi->fix = def_fix;
                sprintf(fbi->fix.id, "fb%d", rk_fb->num_fb);
@@ -3927,8 +3961,10 @@ int rk_fb_register(struct rk_lcdc_driver *dev_drv,
                rk_fb_alloc_buffer(main_fbi, 0);        /* only alloc memory for main fb */
                dev_drv->uboot_logo = support_uboot_display();
                if (support_uboot_display()) {
-                       /*if (dev_drv->iommu_enabled) 
-                               rk_fb_copy_from_loader(main_fbi);*/
+                       /*
+                       if (dev_drv->iommu_enabled)
+                               rk_fb_copy_from_loader(main_fbi);
+                       */
                        return 0;
                }
                main_fbi->fbops->fb_set_par(main_fbi);
index a3fba3e5d43aa8cd27950eb3bc79996380e15298..f9d8efd744b5550b11a25ad28de3e9c3eae098af 100755 (executable)
@@ -37,7 +37,8 @@ static ssize_t show_screen_info(struct device *dev,
                                struct device_attribute *attr, char *buf)
 {
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        struct rk_screen *screen = dev_drv->cur_screen;
        int fps = 0;
        u32 x = screen->mode.left_margin + screen->mode.right_margin +
@@ -56,7 +57,8 @@ static ssize_t show_disp_info(struct device *dev,
                              struct device_attribute *attr, char *buf)
 {
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        int win_id = dev_drv->ops->fb_get_win_id(dev_drv, fbi->fix.id);
 
        if (dev_drv->ops->get_disp_info)
@@ -87,8 +89,9 @@ static ssize_t show_fb_state(struct device *dev,
                             struct device_attribute *attr, char *buf)
 {
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv =
-           (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
+
        int win_id = dev_drv->ops->fb_get_win_id(dev_drv, fbi->fix.id);
        int state = dev_drv->ops->get_win_state(dev_drv, win_id);
 
@@ -109,8 +112,8 @@ static ssize_t set_fb_state(struct device *dev, struct device_attribute *attr,
                            const char *buf, size_t count)
 {
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv =
-           (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        int win_id = dev_drv->ops->fb_get_win_id(dev_drv, fbi->fix.id);
        int state;
        int ret;
@@ -131,8 +134,8 @@ static ssize_t show_overlay(struct device *dev,
                            struct device_attribute *attr, char *buf)
 {
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv =
-           (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        int ovl;
 
        if (dev_drv->ops->ovl_mgr)
@@ -150,8 +153,8 @@ static ssize_t set_overlay(struct device *dev, struct device_attribute *attr,
                           const char *buf, size_t count)
 {
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv =
-           (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        u32 ovl;
        int ret;
 
@@ -170,8 +173,8 @@ static ssize_t show_fps(struct device *dev,
                        struct device_attribute *attr, char *buf)
 {
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv =
-           (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        int fps;
 
        if (dev_drv->ops->fps_mgr)
@@ -186,8 +189,8 @@ static ssize_t set_fps(struct device *dev, struct device_attribute *attr,
                       const char *buf, size_t count)
 {
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv =
-           (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        u32 fps;
        int ret;
 
@@ -213,8 +216,8 @@ static ssize_t show_fb_win_map(struct device *dev,
 {
        int ret;
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv =
-           (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
 
        mutex_lock(&dev_drv->fb_win_id_mutex);
        ret =
@@ -230,8 +233,8 @@ static ssize_t set_fb_win_map(struct device *dev, struct device_attribute *attr,
                              const char *buf, size_t count)
 {
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv =
-           (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        u32 order;
        int ret;
 
@@ -274,8 +277,8 @@ static ssize_t set_hwc_lut(struct device *dev, struct device_attribute *attr,
        int space_max;
 
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv =
-           (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
 
        /*printk("count:%d\n>>%s\n\n",count,start);*/
        for (i = 0; i < 256; i++) {
@@ -320,8 +323,8 @@ static ssize_t set_dsp_lut(struct device *dev, struct device_attribute *attr,
        int space_max = 10;
 
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv =
-           (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
 
        for (i = 0; i < 256; i++) {
                temp = i;
@@ -360,8 +363,8 @@ static ssize_t show_dsp_cabc(struct device *dev,
                             struct device_attribute *attr, char *buf)
 {
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv =
-           (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
 
        return snprintf(buf, PAGE_SIZE, "cabc mode=%d\n",
                dev_drv->cabc_mode);
@@ -372,8 +375,8 @@ static ssize_t set_dsp_cabc(struct device *dev, struct device_attribute *attr,
                            const char *buf, size_t count)
 {
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv =
-           (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        int ret, mode = 0;
 
        ret = kstrtoint(buf, 0, &mode);
@@ -392,8 +395,8 @@ static ssize_t show_dsp_bcsh(struct device *dev,
                             struct device_attribute *attr, char *buf)
 {
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv =
-           (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        int brightness, contrast, sat_con, sin_hue, cos_hue;
 
        if (dev_drv->ops->get_dsp_bcsh_bcs) {
@@ -416,8 +419,8 @@ static ssize_t set_dsp_bcsh(struct device *dev, struct device_attribute *attr,
                            const char *buf, size_t count)
 {
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv =
-           (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        int brightness, contrast, sat_con, ret = 0, sin_hue, cos_hue;
 
        if (!strncmp(buf, "open", 4)) {
@@ -498,8 +501,8 @@ static ssize_t show_scale(struct device *dev,
                          struct device_attribute *attr, char *buf)
 {
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv =
-           (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        struct rk_screen *screen = dev_drv->cur_screen;
 
        return snprintf(buf, PAGE_SIZE,
@@ -514,8 +517,8 @@ static ssize_t set_scale(struct device *dev, struct device_attribute *attr,
                         const char *buf, size_t count)
 {
        struct fb_info *fbi = dev_get_drvdata(dev);
-       struct rk_lcdc_driver *dev_drv =
-           (struct rk_lcdc_driver *)fbi->par;
+       struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par;
+       struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        struct rk_screen *screen = dev_drv->cur_screen;
        u32 left, top, right, bottom;
 
index 8c5313f9368e173324de1292de91838e3119eaf4..9d56a43bcff3b5a0ddba2dc9728d2f96aef22521 100755 (executable)
@@ -341,7 +341,6 @@ struct rk_lcdc_win_area{
 struct rk_lcdc_win {
        char name[5];
        int id;
-       u32 logicalstate;
        bool state;             /*on or off*/
        bool last_state;                /*on or off*/
        u32 pseudo_pal[16];
@@ -596,6 +595,21 @@ struct rk_lcdc_driver {
        int uboot_logo;
 };
 
+struct rk_fb_par {
+       int id;
+       u32 state;
+
+       unsigned long fb_phy_base;      /* Start of fb address (physical address) */
+       char __iomem *fb_virt_base;     /* Start of fb address (virt address) */
+       u32 fb_size;
+       struct rk_lcdc_driver *lcdc_drv;
+
+#if defined(CONFIG_ION_ROCKCHIP)
+       struct ion_handle *ion_hdl;
+#endif
+       u32 reserved[2];
+};
+
 /*disp_mode: dual display mode
 *              NO_DUAL,no dual display,
                ONE_DUAL,use one lcdc + rk61x for dual display
@@ -609,9 +623,6 @@ struct rk_fb {
        struct rk29fb_info *mach_info;
        struct fb_info *fb[RK_MAX_FB_SUPPORT*2];
        int num_fb;
-       unsigned long fb_phy_base;              /* Start of fb address */
-       unsigned long ext_fb_phy_base;          /* Start of extend fb address */
-                                               /* (physical address) */
        struct rk_lcdc_driver *lcdc_dev_drv[RK30_MAX_LCDC_SUPPORT];
        int num_lcdc;