#define VIG_SC7180_MASK \
        (VIG_MASK | BIT(DPU_SSPP_QOS_8LVL) | BIT(DPU_SSPP_SCALER_QSEED4))
 
+#define VIG_SM8250_MASK \
+       (VIG_MASK | BIT(DPU_SSPP_SCALER_QSEED3LITE))
+
 #define DMA_SDM845_MASK \
        (BIT(DPU_SSPP_SRC) | BIT(DPU_SSPP_QOS) | BIT(DPU_SSPP_QOS_8LVL) |\
        BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_TS_PREFILL_REC1) |\
 static const struct dpu_caps sm8250_dpu_caps = {
        .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
        .max_mixer_blendstages = 0xb,
-       .qseed_type = DPU_SSPP_SCALER_QSEED3, /* TODO: qseed3 lite */
+       .qseed_type = DPU_SSPP_SCALER_QSEED3LITE,
        .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */
        .ubwc_version = DPU_HW_UBWC_VER_40,
        .has_src_split = true,
                sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR1),
 };
 
+static const struct dpu_sspp_sub_blks sm8250_vig_sblk_0 =
+                               _VIG_SBLK("0", 5, DPU_SSPP_SCALER_QSEED3LITE);
+static const struct dpu_sspp_sub_blks sm8250_vig_sblk_1 =
+                               _VIG_SBLK("1", 6, DPU_SSPP_SCALER_QSEED3LITE);
+static const struct dpu_sspp_sub_blks sm8250_vig_sblk_2 =
+                               _VIG_SBLK("2", 7, DPU_SSPP_SCALER_QSEED3LITE);
+static const struct dpu_sspp_sub_blks sm8250_vig_sblk_3 =
+                               _VIG_SBLK("3", 8, DPU_SSPP_SCALER_QSEED3LITE);
+
+static const struct dpu_sspp_cfg sm8250_sspp[] = {
+       SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SM8250_MASK,
+               sm8250_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+       SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SM8250_MASK,
+               sm8250_vig_sblk_1, 4,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
+       SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SM8250_MASK,
+               sm8250_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2),
+       SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SM8250_MASK,
+               sm8250_vig_sblk_3, 12,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
+       SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK,
+               sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+       SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_SDM845_MASK,
+               sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
+       SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK,
+               sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR0),
+       SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000,  DMA_CURSOR_SDM845_MASK,
+               sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR1),
+};
+
 /*************************************************************
  * MIXER sub blocks config
  *************************************************************/
                .mdp = sm8250_mdp,
                .ctl_count = ARRAY_SIZE(sm8150_ctl),
                .ctl = sm8150_ctl,
-               /* TODO: sspp qseed version differs from 845 */
-               .sspp_count = ARRAY_SIZE(sdm845_sspp),
-               .sspp = sdm845_sspp,
+               .sspp_count = ARRAY_SIZE(sm8250_sspp),
+               .sspp = sm8250_sspp,
                .mixer_count = ARRAY_SIZE(sm8150_lm),
                .mixer = sm8150_lm,
                .dspp_count = ARRAY_SIZE(sm8150_dspp),
 
 #define QSEED3_SEP_LUT_SIZE \
        (QSEED3_LUT_SIZE * QSEED3_SEPARABLE_LUTS * sizeof(u32))
 
+/* DPU_SCALER_QSEED3LITE */
+#define QSEED3LITE_COEF_LUT_Y_SEP_BIT         4
+#define QSEED3LITE_COEF_LUT_UV_SEP_BIT        5
+#define QSEED3LITE_COEF_LUT_CTRL              0x4C
+#define QSEED3LITE_COEF_LUT_SWAP_BIT          0
+#define QSEED3LITE_DIR_FILTER_WEIGHT          0x60
+#define QSEED3LITE_FILTERS                 2
+#define QSEED3LITE_SEPARABLE_LUTS             10
+#define QSEED3LITE_LUT_SIZE                   33
+#define QSEED3LITE_SEP_LUT_SIZE \
+               (QSEED3LITE_LUT_SIZE * QSEED3LITE_SEPARABLE_LUTS * sizeof(u32))
+
+
 void dpu_reg_write(struct dpu_hw_blk_reg_map *c,
                u32 reg_off,
                u32 val,
 
 }
 
+static void _dpu_hw_setup_scaler3lite_lut(struct dpu_hw_blk_reg_map *c,
+               struct dpu_hw_scaler3_cfg *scaler3_cfg, u32 offset)
+{
+       int j, filter;
+       int config_lut = 0x0;
+       unsigned long lut_flags;
+       u32 lut_addr, lut_offset;
+       u32 *lut[QSEED3LITE_FILTERS] = {NULL, NULL};
+       static const uint32_t off_tbl[QSEED3_FILTERS] = { 0x000, 0x200 };
+
+       DPU_REG_WRITE(c, QSEED3LITE_DIR_FILTER_WEIGHT + offset, scaler3_cfg->dir_weight);
+
+       if (!scaler3_cfg->sep_lut)
+               return;
+
+       lut_flags = (unsigned long) scaler3_cfg->lut_flag;
+       if (test_bit(QSEED3_COEF_LUT_Y_SEP_BIT, &lut_flags) &&
+               (scaler3_cfg->y_rgb_sep_lut_idx < QSEED3LITE_SEPARABLE_LUTS) &&
+               (scaler3_cfg->sep_len == QSEED3LITE_SEP_LUT_SIZE)) {
+               lut[0] = scaler3_cfg->sep_lut +
+                       scaler3_cfg->y_rgb_sep_lut_idx * QSEED3LITE_LUT_SIZE;
+               config_lut = 1;
+       }
+       if (test_bit(QSEED3_COEF_LUT_UV_SEP_BIT, &lut_flags) &&
+               (scaler3_cfg->uv_sep_lut_idx < QSEED3LITE_SEPARABLE_LUTS) &&
+               (scaler3_cfg->sep_len == QSEED3LITE_SEP_LUT_SIZE)) {
+               lut[1] = scaler3_cfg->sep_lut +
+                       scaler3_cfg->uv_sep_lut_idx * QSEED3LITE_LUT_SIZE;
+               config_lut = 1;
+       }
+
+       if (config_lut) {
+               for (filter = 0; filter < QSEED3LITE_FILTERS; filter++) {
+                       if (!lut[filter])
+                               continue;
+                       lut_offset = 0;
+                       lut_addr = QSEED3_COEF_LUT + offset + off_tbl[filter];
+                       for (j = 0; j < QSEED3LITE_LUT_SIZE; j++) {
+                               DPU_REG_WRITE(c,
+                                       lut_addr,
+                                       (lut[filter])[lut_offset++]);
+                               lut_addr += 4;
+                       }
+               }
+       }
+
+       if (test_bit(QSEED3_COEF_LUT_SWAP_BIT, &lut_flags))
+               DPU_REG_WRITE(c, QSEED3_COEF_LUT_CTRL + offset, BIT(0));
+
+}
+
 static void _dpu_hw_setup_scaler3_de(struct dpu_hw_blk_reg_map *c,
                struct dpu_hw_scaler3_de_cfg *de_cfg, u32 offset)
 {
                op_mode |= BIT(8);
        }
 
-       if (scaler3_cfg->lut_flag)
-               _dpu_hw_setup_scaler3_lut(c, scaler3_cfg,
-                                                               scaler_offset);
+       if (scaler3_cfg->lut_flag) {
+               if (scaler_version < 0x2004)
+                       _dpu_hw_setup_scaler3_lut(c, scaler3_cfg, scaler_offset);
+               else
+                       _dpu_hw_setup_scaler3lite_lut(c, scaler3_cfg, scaler_offset);
+       }
 
        if (scaler_version == 0x1002) {
                phase_init =