#include <linux/platform_device.h>
 #include <linux/soc/mediatek/mtk-cmdq.h>
 
+#include "mtk_disp_drv.h"
 #include "mtk_drm_crtc.h"
 #include "mtk_drm_ddp_comp.h"
 
        const struct mtk_disp_color_data        *data;
 };
 
-static int mtk_color_clk_enable(struct device *dev)
+int mtk_color_clk_enable(struct device *dev)
 {
        struct mtk_disp_color *color = dev_get_drvdata(dev);
 
        return clk_prepare_enable(color->clk);
 }
 
-static void mtk_color_clk_disable(struct device *dev)
+void mtk_color_clk_disable(struct device *dev)
 {
        struct mtk_disp_color *color = dev_get_drvdata(dev);
 
        clk_disable_unprepare(color->clk);
 }
 
-static void mtk_color_config(struct device *dev, unsigned int w,
-                            unsigned int h, unsigned int vrefresh,
-                            unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
+void mtk_color_config(struct device *dev, unsigned int w,
+                     unsigned int h, unsigned int vrefresh,
+                     unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
 {
        struct mtk_disp_color *color = dev_get_drvdata(dev);
 
        mtk_ddp_write(cmdq_pkt, h, &color->cmdq_reg, color->regs, DISP_COLOR_HEIGHT(color));
 }
 
-static void mtk_color_start(struct device *dev)
+void mtk_color_start(struct device *dev)
 {
        struct mtk_disp_color *color = dev_get_drvdata(dev);
 
        writel(0x1, color->regs + DISP_COLOR_START(color));
 }
 
-static const struct mtk_ddp_comp_funcs mtk_disp_color_funcs = {
-       .clk_enable = mtk_color_clk_enable,
-       .clk_disable = mtk_color_clk_disable,
-       .config = mtk_color_config,
-       .start = mtk_color_start,
-};
-
 static int mtk_disp_color_bind(struct device *dev, struct device *master,
                               void *data)
 {
                return comp_id;
        }
 
-       ret = mtk_ddp_comp_init(dev->of_node, &priv->ddp_comp, comp_id,
-                               &mtk_disp_color_funcs);
+       ret = mtk_ddp_comp_init(dev->of_node, &priv->ddp_comp, comp_id);
        if (ret) {
                if (ret != -EPROBE_DEFER)
                        dev_err(dev, "Failed to initialize component: %d\n",
 
--- /dev/null
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2020 MediaTek Inc.
+ */
+
+#ifndef _MTK_DISP_DRV_H_
+#define _MTK_DISP_DRV_H_
+
+#include <linux/soc/mediatek/mtk-cmdq.h>
+#include "mtk_drm_plane.h"
+
+void mtk_color_bypass_shadow(struct device *dev);
+int mtk_color_clk_enable(struct device *dev);
+void mtk_color_clk_disable(struct device *dev);
+void mtk_color_config(struct device *dev, unsigned int w,
+                     unsigned int h, unsigned int vrefresh,
+                     unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
+void mtk_color_start(struct device *dev);
+
+void mtk_dpi_start(struct device *dev);
+void mtk_dpi_stop(struct device *dev);
+
+void mtk_dsi_ddp_start(struct device *dev);
+void mtk_dsi_ddp_stop(struct device *dev);
+
+void mtk_ovl_bgclr_in_on(struct device *dev);
+void mtk_ovl_bgclr_in_off(struct device *dev);
+void mtk_ovl_bypass_shadow(struct device *dev);
+int mtk_ovl_clk_enable(struct device *dev);
+void mtk_ovl_clk_disable(struct device *dev);
+void mtk_ovl_config(struct device *dev, unsigned int w,
+                   unsigned int h, unsigned int vrefresh,
+                   unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
+int mtk_ovl_layer_check(struct device *dev, unsigned int idx,
+                       struct mtk_plane_state *mtk_state);
+void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
+                         struct mtk_plane_state *state,
+                         struct cmdq_pkt *cmdq_pkt);
+unsigned int mtk_ovl_layer_nr(struct device *dev);
+void mtk_ovl_layer_on(struct device *dev, unsigned int idx,
+                     struct cmdq_pkt *cmdq_pkt);
+void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
+                      struct cmdq_pkt *cmdq_pkt);
+void mtk_ovl_start(struct device *dev);
+void mtk_ovl_stop(struct device *dev);
+unsigned int mtk_ovl_supported_rotations(struct device *dev);
+void mtk_ovl_enable_vblank(struct device *dev,
+                          void (*vblank_cb)(void *),
+                          void *vblank_cb_data);
+void mtk_ovl_disable_vblank(struct device *dev);
+
+void mtk_rdma_bypass_shadow(struct device *dev);
+int mtk_rdma_clk_enable(struct device *dev);
+void mtk_rdma_clk_disable(struct device *dev);
+void mtk_rdma_config(struct device *dev, unsigned int width,
+                    unsigned int height, unsigned int vrefresh,
+                    unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
+unsigned int mtk_rdma_layer_nr(struct device *dev);
+void mtk_rdma_layer_config(struct device *dev, unsigned int idx,
+                          struct mtk_plane_state *state,
+                          struct cmdq_pkt *cmdq_pkt);
+void mtk_rdma_start(struct device *dev);
+void mtk_rdma_stop(struct device *dev);
+void mtk_rdma_enable_vblank(struct device *dev,
+                           void (*vblank_cb)(void *),
+                           void *vblank_cb_data);
+void mtk_rdma_disable_vblank(struct device *dev);
+
+#endif
 
 #include <linux/platform_device.h>
 #include <linux/soc/mediatek/mtk-cmdq.h>
 
+#include "mtk_disp_drv.h"
 #include "mtk_drm_crtc.h"
 #include "mtk_drm_ddp_comp.h"
 
        return IRQ_HANDLED;
 }
 
-static void mtk_ovl_enable_vblank(struct device *dev,
-                                 void (*vblank_cb)(void *),
-                                 void *vblank_cb_data)
+void mtk_ovl_enable_vblank(struct device *dev,
+                          void (*vblank_cb)(void *),
+                          void *vblank_cb_data)
 {
        struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
 
        writel_relaxed(OVL_FME_CPL_INT, ovl->regs + DISP_REG_OVL_INTEN);
 }
 
-static void mtk_ovl_disable_vblank(struct device *dev)
+void mtk_ovl_disable_vblank(struct device *dev)
 {
        struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
 
        writel_relaxed(0x0, ovl->regs + DISP_REG_OVL_INTEN);
 }
 
-static int mtk_ovl_clk_enable(struct device *dev)
+int mtk_ovl_clk_enable(struct device *dev)
 {
        struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
 
        return clk_prepare_enable(ovl->clk);
 }
 
-static void mtk_ovl_clk_disable(struct device *dev)
+void mtk_ovl_clk_disable(struct device *dev)
 {
        struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
 
        clk_disable_unprepare(ovl->clk);
 }
 
-static void mtk_ovl_start(struct device *dev)
+void mtk_ovl_start(struct device *dev)
 {
        struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
 
        writel_relaxed(0x1, ovl->regs + DISP_REG_OVL_EN);
 }
 
-static void mtk_ovl_stop(struct device *dev)
+void mtk_ovl_stop(struct device *dev)
 {
        struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
 
        writel_relaxed(0x0, ovl->regs + DISP_REG_OVL_EN);
 }
 
-static void mtk_ovl_config(struct device *dev, unsigned int w,
-                          unsigned int h, unsigned int vrefresh,
-                          unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
+void mtk_ovl_config(struct device *dev, unsigned int w,
+                   unsigned int h, unsigned int vrefresh,
+                   unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
 {
        struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
 
        mtk_ddp_write(cmdq_pkt, 0x0, &ovl->cmdq_reg, ovl->regs, DISP_REG_OVL_RST);
 }
 
-static unsigned int mtk_ovl_layer_nr(struct device *dev)
+unsigned int mtk_ovl_layer_nr(struct device *dev)
 {
        struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
 
        return ovl->data->layer_nr;
 }
 
-static unsigned int mtk_ovl_supported_rotations(struct device *dev)
+unsigned int mtk_ovl_supported_rotations(struct device *dev)
 {
        return DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 |
               DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y;
 }
 
-static int mtk_ovl_layer_check(struct device *dev, unsigned int idx,
-                              struct mtk_plane_state *mtk_state)
+int mtk_ovl_layer_check(struct device *dev, unsigned int idx,
+                       struct mtk_plane_state *mtk_state)
 {
        struct drm_plane_state *state = &mtk_state->base;
        unsigned int rotation = 0;
        return 0;
 }
 
-static void mtk_ovl_layer_on(struct device *dev, unsigned int idx,
-                            struct cmdq_pkt *cmdq_pkt)
+void mtk_ovl_layer_on(struct device *dev, unsigned int idx,
+                     struct cmdq_pkt *cmdq_pkt)
 {
        unsigned int gmc_thrshd_l;
        unsigned int gmc_thrshd_h;
                           DISP_REG_OVL_SRC_CON, BIT(idx));
 }
 
-static void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
-                             struct cmdq_pkt *cmdq_pkt)
+void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
+                      struct cmdq_pkt *cmdq_pkt)
 {
        struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
 
        }
 }
 
-static void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
-                                struct mtk_plane_state *state,
-                                struct cmdq_pkt *cmdq_pkt)
+void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
+                         struct mtk_plane_state *state,
+                         struct cmdq_pkt *cmdq_pkt)
 {
        struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
        struct mtk_plane_pending_state *pending = &state->pending;
        mtk_ovl_layer_on(dev, idx, cmdq_pkt);
 }
 
-static void mtk_ovl_bgclr_in_on(struct device *dev)
+void mtk_ovl_bgclr_in_on(struct device *dev)
 {
        struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
        unsigned int reg;
        writel(reg, ovl->regs + DISP_REG_OVL_DATAPATH_CON);
 }
 
-static void mtk_ovl_bgclr_in_off(struct device *dev)
+void mtk_ovl_bgclr_in_off(struct device *dev)
 {
        struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
        unsigned int reg;
        writel(reg, ovl->regs + DISP_REG_OVL_DATAPATH_CON);
 }
 
-static const struct mtk_ddp_comp_funcs mtk_disp_ovl_funcs = {
-       .clk_enable = mtk_ovl_clk_enable,
-       .clk_disable = mtk_ovl_clk_disable,
-       .config = mtk_ovl_config,
-       .start = mtk_ovl_start,
-       .stop = mtk_ovl_stop,
-       .enable_vblank = mtk_ovl_enable_vblank,
-       .disable_vblank = mtk_ovl_disable_vblank,
-       .supported_rotations = mtk_ovl_supported_rotations,
-       .layer_nr = mtk_ovl_layer_nr,
-       .layer_check = mtk_ovl_layer_check,
-       .layer_config = mtk_ovl_layer_config,
-       .bgclr_in_on = mtk_ovl_bgclr_in_on,
-       .bgclr_in_off = mtk_ovl_bgclr_in_off,
-};
-
 static int mtk_disp_ovl_bind(struct device *dev, struct device *master,
                             void *data)
 {
                return comp_id;
        }
 
-       ret = mtk_ddp_comp_init(dev->of_node, &priv->ddp_comp, comp_id,
-                               &mtk_disp_ovl_funcs);
+       ret = mtk_ddp_comp_init(dev->of_node, &priv->ddp_comp, comp_id);
        if (ret) {
                if (ret != -EPROBE_DEFER)
                        dev_err(dev, "Failed to initialize component: %d\n",
 
 #include <linux/platform_device.h>
 #include <linux/soc/mediatek/mtk-cmdq.h>
 
+#include "mtk_disp_drv.h"
 #include "mtk_drm_crtc.h"
 #include "mtk_drm_ddp_comp.h"
 
        writel(tmp, rdma->regs + reg);
 }
 
-static void mtk_rdma_enable_vblank(struct device *dev,
-                                  void (*vblank_cb)(void *),
-                                  void *vblank_cb_data)
+void mtk_rdma_enable_vblank(struct device *dev,
+                           void (*vblank_cb)(void *),
+                           void *vblank_cb_data)
 {
        struct mtk_disp_rdma *rdma = dev_get_drvdata(dev);
 
                         RDMA_FRAME_END_INT);
 }
 
-static void mtk_rdma_disable_vblank(struct device *dev)
+void mtk_rdma_disable_vblank(struct device *dev)
 {
        struct mtk_disp_rdma *rdma = dev_get_drvdata(dev);
 
        rdma_update_bits(dev, DISP_REG_RDMA_INT_ENABLE, RDMA_FRAME_END_INT, 0);
 }
 
-static int mtk_rdma_clk_enable(struct device *dev)
+int mtk_rdma_clk_enable(struct device *dev)
 {
        struct mtk_disp_rdma *rdma = dev_get_drvdata(dev);
 
        return clk_prepare_enable(rdma->clk);
 }
 
-static void mtk_rdma_clk_disable(struct device *dev)
+void mtk_rdma_clk_disable(struct device *dev)
 {
        struct mtk_disp_rdma *rdma = dev_get_drvdata(dev);
 
        clk_disable_unprepare(rdma->clk);
 }
 
-static void mtk_rdma_start(struct device *dev)
+void mtk_rdma_start(struct device *dev)
 {
        rdma_update_bits(dev, DISP_REG_RDMA_GLOBAL_CON, RDMA_ENGINE_EN,
                         RDMA_ENGINE_EN);
 }
 
-static void mtk_rdma_stop(struct device *dev)
+void mtk_rdma_stop(struct device *dev)
 {
        rdma_update_bits(dev, DISP_REG_RDMA_GLOBAL_CON, RDMA_ENGINE_EN, 0);
 }
 
-static void mtk_rdma_config(struct device *dev, unsigned int width,
-                           unsigned int height, unsigned int vrefresh,
-                           unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
+void mtk_rdma_config(struct device *dev, unsigned int width,
+                    unsigned int height, unsigned int vrefresh,
+                    unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
 {
        unsigned int threshold;
        unsigned int reg;
        }
 }
 
-static unsigned int mtk_rdma_layer_nr(struct device *dev)
+unsigned int mtk_rdma_layer_nr(struct device *dev)
 {
        return 1;
 }
 
-static void mtk_rdma_layer_config(struct device *dev, unsigned int idx,
-                                 struct mtk_plane_state *state,
-                                 struct cmdq_pkt *cmdq_pkt)
+void mtk_rdma_layer_config(struct device *dev, unsigned int idx,
+                          struct mtk_plane_state *state,
+                          struct cmdq_pkt *cmdq_pkt)
 {
        struct mtk_disp_rdma *rdma = dev_get_drvdata(dev);
        struct mtk_plane_pending_state *pending = &state->pending;
 
 }
 
-static const struct mtk_ddp_comp_funcs mtk_disp_rdma_funcs = {
-       .clk_enable = mtk_rdma_clk_enable,
-       .clk_disable = mtk_rdma_clk_disable,
-       .config = mtk_rdma_config,
-       .start = mtk_rdma_start,
-       .stop = mtk_rdma_stop,
-       .enable_vblank = mtk_rdma_enable_vblank,
-       .disable_vblank = mtk_rdma_disable_vblank,
-       .layer_nr = mtk_rdma_layer_nr,
-       .layer_config = mtk_rdma_layer_config,
-};
-
 static int mtk_disp_rdma_bind(struct device *dev, struct device *master,
                              void *data)
 {
                return comp_id;
        }
 
-       ret = mtk_ddp_comp_init(dev->of_node, &priv->ddp_comp, comp_id,
-                               &mtk_disp_rdma_funcs);
+       ret = mtk_ddp_comp_init(dev->of_node, &priv->ddp_comp, comp_id);
        if (ret) {
                if (ret != -EPROBE_DEFER)
                        dev_err(dev, "Failed to initialize component: %d\n",
 
 #include <drm/drm_of.h>
 #include <drm/drm_simple_kms_helper.h>
 
+#include "mtk_disp_drv.h"
 #include "mtk_dpi_regs.h"
 #include "mtk_drm_ddp_comp.h"
 
        .enable = mtk_dpi_bridge_enable,
 };
 
-static void mtk_dpi_start(struct device *dev)
+void mtk_dpi_start(struct device *dev)
 {
        struct mtk_dpi *dpi = dev_get_drvdata(dev);
 
        mtk_dpi_power_on(dpi);
 }
 
-static void mtk_dpi_stop(struct device *dev)
+void mtk_dpi_stop(struct device *dev)
 {
        struct mtk_dpi *dpi = dev_get_drvdata(dev);
 
        mtk_dpi_power_off(dpi);
 }
 
-static const struct mtk_ddp_comp_funcs mtk_dpi_funcs = {
-       .start = mtk_dpi_start,
-       .stop = mtk_dpi_stop,
-};
-
 static int mtk_dpi_bind(struct device *dev, struct device *master, void *data)
 {
        struct mtk_dpi *dpi = dev_get_drvdata(dev);
                return comp_id;
        }
 
-       ret = mtk_ddp_comp_init(dev->of_node, &dpi->ddp_comp, comp_id,
-                               &mtk_dpi_funcs);
+       ret = mtk_ddp_comp_init(dev->of_node, &dpi->ddp_comp, comp_id);
        if (ret) {
                dev_err(dev, "Failed to initialize component: %d\n", ret);
                return ret;
 
 #include <linux/soc/mediatek/mtk-cmdq.h>
 #include <drm/drm_print.h>
 
+#include "mtk_disp_drv.h"
 #include "mtk_drm_drv.h"
 #include "mtk_drm_plane.h"
 #include "mtk_drm_ddp_comp.h"
        .ctm_set = mtk_ccorr_ctm_set,
 };
 
+static const struct mtk_ddp_comp_funcs ddp_color = {
+       .clk_enable = mtk_color_clk_enable,
+       .clk_disable = mtk_color_clk_disable,
+       .config = mtk_color_config,
+       .start = mtk_color_start,
+};
+
 static const struct mtk_ddp_comp_funcs ddp_dither = {
        .clk_enable = mtk_ddp_clk_enable,
        .clk_disable = mtk_ddp_clk_disable,
        .stop = mtk_dither_stop,
 };
 
+static const struct mtk_ddp_comp_funcs ddp_dpi = {
+       .start = mtk_dpi_start,
+       .stop = mtk_dpi_stop,
+};
+
+static const struct mtk_ddp_comp_funcs ddp_dsi = {
+       .start = mtk_dsi_ddp_start,
+       .stop = mtk_dsi_ddp_stop,
+};
+
 static const struct mtk_ddp_comp_funcs ddp_gamma = {
        .clk_enable = mtk_ddp_clk_enable,
        .clk_disable = mtk_ddp_clk_disable,
        .start = mtk_od_start,
 };
 
+static const struct mtk_ddp_comp_funcs ddp_ovl = {
+       .clk_enable = mtk_ovl_clk_enable,
+       .clk_disable = mtk_ovl_clk_disable,
+       .config = mtk_ovl_config,
+       .start = mtk_ovl_start,
+       .stop = mtk_ovl_stop,
+       .enable_vblank = mtk_ovl_enable_vblank,
+       .disable_vblank = mtk_ovl_disable_vblank,
+       .supported_rotations = mtk_ovl_supported_rotations,
+       .layer_nr = mtk_ovl_layer_nr,
+       .layer_check = mtk_ovl_layer_check,
+       .layer_config = mtk_ovl_layer_config,
+       .bgclr_in_on = mtk_ovl_bgclr_in_on,
+       .bgclr_in_off = mtk_ovl_bgclr_in_off,
+};
+
+static const struct mtk_ddp_comp_funcs ddp_rdma = {
+       .clk_enable = mtk_rdma_clk_enable,
+       .clk_disable = mtk_rdma_clk_disable,
+       .config = mtk_rdma_config,
+       .start = mtk_rdma_start,
+       .stop = mtk_rdma_stop,
+       .enable_vblank = mtk_rdma_enable_vblank,
+       .disable_vblank = mtk_rdma_disable_vblank,
+       .layer_nr = mtk_rdma_layer_nr,
+       .layer_config = mtk_rdma_layer_config,
+};
+
 static const struct mtk_ddp_comp_funcs ddp_ufoe = {
        .clk_enable = mtk_ddp_clk_enable,
        .clk_disable = mtk_ddp_clk_disable,
        [DDP_COMPONENT_AAL1]    = { MTK_DISP_AAL,       1, &ddp_aal },
        [DDP_COMPONENT_BLS]     = { MTK_DISP_BLS,       0, NULL },
        [DDP_COMPONENT_CCORR]   = { MTK_DISP_CCORR,     0, &ddp_ccorr },
-       [DDP_COMPONENT_COLOR0]  = { MTK_DISP_COLOR,     0, NULL },
-       [DDP_COMPONENT_COLOR1]  = { MTK_DISP_COLOR,     1, NULL },
+       [DDP_COMPONENT_COLOR0]  = { MTK_DISP_COLOR,     0, &ddp_color },
+       [DDP_COMPONENT_COLOR1]  = { MTK_DISP_COLOR,     1, &ddp_color },
        [DDP_COMPONENT_DITHER]  = { MTK_DISP_DITHER,    0, &ddp_dither },
-       [DDP_COMPONENT_DPI0]    = { MTK_DPI,            0, NULL },
-       [DDP_COMPONENT_DPI1]    = { MTK_DPI,            1, NULL },
-       [DDP_COMPONENT_DSI0]    = { MTK_DSI,            0, NULL },
-       [DDP_COMPONENT_DSI1]    = { MTK_DSI,            1, NULL },
-       [DDP_COMPONENT_DSI2]    = { MTK_DSI,            2, NULL },
-       [DDP_COMPONENT_DSI3]    = { MTK_DSI,            3, NULL },
+       [DDP_COMPONENT_DPI0]    = { MTK_DPI,            0, &ddp_dpi },
+       [DDP_COMPONENT_DPI1]    = { MTK_DPI,            1, &ddp_dpi },
+       [DDP_COMPONENT_DSI0]    = { MTK_DSI,            0, &ddp_dsi },
+       [DDP_COMPONENT_DSI1]    = { MTK_DSI,            1, &ddp_dsi },
+       [DDP_COMPONENT_DSI2]    = { MTK_DSI,            2, &ddp_dsi },
+       [DDP_COMPONENT_DSI3]    = { MTK_DSI,            3, &ddp_dsi },
        [DDP_COMPONENT_GAMMA]   = { MTK_DISP_GAMMA,     0, &ddp_gamma },
        [DDP_COMPONENT_OD0]     = { MTK_DISP_OD,        0, &ddp_od },
        [DDP_COMPONENT_OD1]     = { MTK_DISP_OD,        1, &ddp_od },
-       [DDP_COMPONENT_OVL0]    = { MTK_DISP_OVL,       0, NULL },
-       [DDP_COMPONENT_OVL1]    = { MTK_DISP_OVL,       1, NULL },
-       [DDP_COMPONENT_OVL_2L0] = { MTK_DISP_OVL_2L,    0, NULL },
-       [DDP_COMPONENT_OVL_2L1] = { MTK_DISP_OVL_2L,    1, NULL },
+       [DDP_COMPONENT_OVL0]    = { MTK_DISP_OVL,       0, &ddp_ovl },
+       [DDP_COMPONENT_OVL1]    = { MTK_DISP_OVL,       1, &ddp_ovl },
+       [DDP_COMPONENT_OVL_2L0] = { MTK_DISP_OVL_2L,    0, &ddp_ovl },
+       [DDP_COMPONENT_OVL_2L1] = { MTK_DISP_OVL_2L,    1, &ddp_ovl },
        [DDP_COMPONENT_PWM0]    = { MTK_DISP_PWM,       0, NULL },
        [DDP_COMPONENT_PWM1]    = { MTK_DISP_PWM,       1, NULL },
        [DDP_COMPONENT_PWM2]    = { MTK_DISP_PWM,       2, NULL },
-       [DDP_COMPONENT_RDMA0]   = { MTK_DISP_RDMA,      0, NULL },
-       [DDP_COMPONENT_RDMA1]   = { MTK_DISP_RDMA,      1, NULL },
-       [DDP_COMPONENT_RDMA2]   = { MTK_DISP_RDMA,      2, NULL },
+       [DDP_COMPONENT_RDMA0]   = { MTK_DISP_RDMA,      0, &ddp_rdma },
+       [DDP_COMPONENT_RDMA1]   = { MTK_DISP_RDMA,      1, &ddp_rdma },
+       [DDP_COMPONENT_RDMA2]   = { MTK_DISP_RDMA,      2, &ddp_rdma },
        [DDP_COMPONENT_UFOE]    = { MTK_DISP_UFOE,      0, &ddp_ufoe },
        [DDP_COMPONENT_WDMA0]   = { MTK_DISP_WDMA,      0, NULL },
        [DDP_COMPONENT_WDMA1]   = { MTK_DISP_WDMA,      1, NULL },
 }
 
 int mtk_ddp_comp_init(struct device_node *node, struct mtk_ddp_comp *comp,
-                     enum mtk_ddp_comp_id comp_id, const struct mtk_ddp_comp_funcs *funcs)
+                     enum mtk_ddp_comp_id comp_id)
 {
        struct platform_device *comp_pdev;
        enum mtk_ddp_comp_type type;
        type = mtk_ddp_matches[comp_id].type;
 
        comp->id = comp_id;
-       comp->funcs = funcs ?: mtk_ddp_matches[comp_id].funcs;
+       comp->funcs = mtk_ddp_matches[comp_id].funcs;
        comp_pdev = of_find_device_by_node(node);
        if (!comp_pdev) {
                DRM_INFO("Waiting for device %s\n", node->full_name);
 
 unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
                                                struct mtk_ddp_comp ddp_comp);
 int mtk_ddp_comp_init(struct device_node *comp_node, struct mtk_ddp_comp *comp,
-                     enum mtk_ddp_comp_id comp_id, const struct mtk_ddp_comp_funcs *funcs);
+                     enum mtk_ddp_comp_id comp_id);
 int mtk_ddp_comp_register(struct drm_device *drm, struct mtk_ddp_comp *comp);
 void mtk_ddp_comp_unregister(struct drm_device *drm, struct mtk_ddp_comp *comp);
 enum mtk_ddp_comp_type mtk_ddp_comp_get_type(enum mtk_ddp_comp_id comp_id);
 
                                goto err_node;
                        }
 
-                       ret = mtk_ddp_comp_init(node, comp,
-                                               comp_id, NULL);
+                       ret = mtk_ddp_comp_init(node, comp, comp_id);
                        if (ret) {
                                of_node_put(node);
                                goto err_node;
 
 #include <drm/drm_probe_helper.h>
 #include <drm/drm_simple_kms_helper.h>
 
+#include "mtk_disp_drv.h"
 #include "mtk_drm_ddp_comp.h"
 
 #define DSI_START              0x00
        .mode_set = mtk_dsi_bridge_mode_set,
 };
 
-static void mtk_dsi_ddp_start(struct device *dev)
+void mtk_dsi_ddp_start(struct device *dev)
 {
        struct mtk_dsi *dsi = dev_get_drvdata(dev);
 
        mtk_dsi_poweron(dsi);
 }
 
-static void mtk_dsi_ddp_stop(struct device *dev)
+void mtk_dsi_ddp_stop(struct device *dev)
 {
        struct mtk_dsi *dsi = dev_get_drvdata(dev);
 
        mtk_dsi_poweroff(dsi);
 }
 
-static const struct mtk_ddp_comp_funcs mtk_dsi_funcs = {
-       .start = mtk_dsi_ddp_start,
-       .stop = mtk_dsi_ddp_stop,
-};
-
 static int mtk_dsi_host_attach(struct mipi_dsi_host *host,
                               struct mipi_dsi_device *device)
 {
                goto err_unregister_host;
        }
 
-       ret = mtk_ddp_comp_init(dev->of_node, &dsi->ddp_comp, comp_id,
-                               &mtk_dsi_funcs);
+       ret = mtk_ddp_comp_init(dev->of_node, &dsi->ddp_comp, comp_id);
        if (ret) {
                dev_err(dev, "Failed to initialize component: %d\n", ret);
                goto err_unregister_host;