video: rockchip: mipi: add long packet support for linux-4.4
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / rk_fb.c
index 47e2c78e7f0083b1110cd182d16babf90424b86a..94d9f3ac3b2ffe1e2d0633b70f1e7d209211fc61 100644 (file)
@@ -192,6 +192,12 @@ int rk_fb_pixel_width(int data_format)
        case YUV444_A:
                pixel_width = 8;
                break;
+       case YUYV422:
+       case UYVY422:
+       case YUYV420:
+       case UYVY420:
+               pixel_width = 16;
+               break;
        default:
                pr_warn("%s: unsupported format: 0x%x\n",
                        __func__, data_format);
@@ -263,6 +269,18 @@ static int rk_fb_data_fmt(int data_format, int bits_per_pixel)
                case HAL_PIXEL_FORMAT_FBDC_U8U8U8:      /* fbdc rgb888 */
                        fb_data_fmt = FBDC_RGBX_888;
                        break;
+               case HAL_PIXEL_FORMAT_YUYV422:          /* yuyv422 */
+                       fb_data_fmt = YUYV422;
+                       break;
+               case HAL_PIXEL_FORMAT_YUYV420:          /* yuyv420 */
+                       fb_data_fmt = YUYV420;
+                       break;
+               case HAL_PIXEL_FORMAT_UYVY422:          /* uyvy422 */
+                       fb_data_fmt = UYVY422;
+                       break;
+               case HAL_PIXEL_FORMAT_UYVY420:          /* uyvy420 */
+                       fb_data_fmt = UYVY420;
+                       break;
                default:
                        pr_warn("%s: unsupported format: 0x%x\n",
                                __func__, data_format);
@@ -602,6 +620,18 @@ char *get_format_string(enum data_format format, char *fmt)
        case FBDC_RGBX_888:
                strcpy(fmt, "FBDC_RGBX_888");
                break;
+       case YUYV422:
+               strcpy(fmt, "YUYV422");
+               break;
+       case YUYV420:
+               strcpy(fmt, "YUYV420");
+               break;
+       case UYVY422:
+               strcpy(fmt, "UYVY422");
+               break;
+       case UYVY420:
+               strcpy(fmt, "UYVY420");
+               break;
        default:
                strcpy(fmt, "invalid");
                break;
@@ -1697,6 +1727,7 @@ static void rk_fb_update_win(struct rk_lcdc_driver *dev_drv,
                                }
                        } else {
                                win->area[i].state = 0;
+                               win->area[i].fbdc_en = 0;
                                if (dev_drv->iommu_enabled) {
                                        g_now_config_addr[win->id][i] = 0;
                                        g_now_config_state[win->id][i] = 0;
@@ -1876,8 +1907,10 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv,
                } else {
                        win->z_order = -1;
                        win->state = 0;
-                       for (j = 0; j < 4; j++)
+                       for (j = 0; j < 4; j++) {
                                win->area[j].state = 0;
+                               win->area[j].fbdc_en = 0;
+                       }
                        if (dev_drv->iommu_enabled) {
                                for (j = 0; j < 4; j++) {
                                        g_now_config_addr[i][j] = 0;
@@ -4188,6 +4221,7 @@ int rk_fb_register(struct rk_lcdc_driver *dev_drv,
                        mutex_init(&dev_drv->output_lock);
 
                        INIT_LIST_HEAD(&dev_drv->update_regs_list);
+                       INIT_LIST_HEAD(&dev_drv->saved_list);
                        mutex_init(&dev_drv->update_regs_list_lock);
                        init_kthread_worker(&dev_drv->update_regs_worker);