drm/mediatek: Move mtk_ddp_comp_init() from sub driver to DRM driver
authorCK Hu <ck.hu@mediatek.com>
Tue, 13 Oct 2020 06:15:10 +0000 (14:15 +0800)
committerChun-Kuang Hu <chunkuang.hu@kernel.org>
Wed, 6 Jan 2021 22:28:16 +0000 (06:28 +0800)
Some ddp component exist in both display path and other path, so
sub driver should not directly call DRM driver's function. Moving
mtk_ddp_comp_init() from sub driver to DRM driver to achieve this.

Signed-off-by: CK Hu <ck.hu@mediatek.com>
Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
drivers/gpu/drm/mediatek/mtk_disp_color.c
drivers/gpu/drm/mediatek/mtk_disp_ovl.c
drivers/gpu/drm/mediatek/mtk_disp_rdma.c
drivers/gpu/drm/mediatek/mtk_dpi.c
drivers/gpu/drm/mediatek/mtk_drm_crtc.c
drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
drivers/gpu/drm/mediatek/mtk_drm_drv.c
drivers/gpu/drm/mediatek/mtk_drm_drv.h
drivers/gpu/drm/mediatek/mtk_dsi.c

index d28c06d..63f411a 100644 (file)
@@ -37,7 +37,6 @@ struct mtk_disp_color_data {
  * @data: platform colour driver data
  */
 struct mtk_disp_color {
-       struct mtk_ddp_comp                     ddp_comp;
        struct drm_crtc                         *crtc;
        struct clk                              *clk;
        void __iomem                            *regs;
@@ -81,27 +80,12 @@ void mtk_color_start(struct device *dev)
 static int mtk_disp_color_bind(struct device *dev, struct device *master,
                               void *data)
 {
-       struct mtk_disp_color *priv = dev_get_drvdata(dev);
-       struct drm_device *drm_dev = data;
-       int ret;
-
-       ret = mtk_ddp_comp_register(drm_dev, &priv->ddp_comp);
-       if (ret < 0) {
-               dev_err(dev, "Failed to register component %pOF: %d\n",
-                       dev->of_node, ret);
-               return ret;
-       }
-
        return 0;
 }
 
 static void mtk_disp_color_unbind(struct device *dev, struct device *master,
                                  void *data)
 {
-       struct mtk_disp_color *priv = dev_get_drvdata(dev);
-       struct drm_device *drm_dev = data;
-
-       mtk_ddp_comp_unregister(drm_dev, &priv->ddp_comp);
 }
 
 static const struct component_ops mtk_disp_color_component_ops = {
@@ -114,7 +98,6 @@ static int mtk_disp_color_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct mtk_disp_color *priv;
        struct resource *res;
-       int comp_id;
        int ret;
 
        priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
@@ -139,23 +122,7 @@ static int mtk_disp_color_probe(struct platform_device *pdev)
                dev_dbg(dev, "get mediatek,gce-client-reg fail!\n");
 #endif
 
-       comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DISP_COLOR);
-       if (comp_id < 0) {
-               dev_err(dev, "Failed to identify by alias: %d\n", comp_id);
-               return comp_id;
-       }
-
-       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",
-                               ret);
-
-               return ret;
-       }
-
        priv->data = of_device_get_match_data(dev);
-
        platform_set_drvdata(pdev, priv);
 
        ret = component_add(dev, &mtk_disp_color_component_ops);
@@ -167,8 +134,6 @@ static int mtk_disp_color_probe(struct platform_device *pdev)
 
 static int mtk_disp_color_remove(struct platform_device *pdev)
 {
-       component_del(&pdev->dev, &mtk_disp_color_component_ops);
-
        return 0;
 }
 
index a4f8063..266c5c5 100644 (file)
@@ -71,7 +71,6 @@ struct mtk_disp_ovl_data {
  * @data: platform data
  */
 struct mtk_disp_ovl {
-       struct mtk_ddp_comp             ddp_comp;
        struct drm_crtc                 *crtc;
        struct clk                      *clk;
        void __iomem                    *regs;
@@ -342,27 +341,12 @@ void mtk_ovl_bgclr_in_off(struct device *dev)
 static int mtk_disp_ovl_bind(struct device *dev, struct device *master,
                             void *data)
 {
-       struct mtk_disp_ovl *priv = dev_get_drvdata(dev);
-       struct drm_device *drm_dev = data;
-       int ret;
-
-       ret = mtk_ddp_comp_register(drm_dev, &priv->ddp_comp);
-       if (ret < 0) {
-               dev_err(dev, "Failed to register component %pOF: %d\n",
-                       dev->of_node, ret);
-               return ret;
-       }
-
        return 0;
 }
 
 static void mtk_disp_ovl_unbind(struct device *dev, struct device *master,
                                void *data)
 {
-       struct mtk_disp_ovl *priv = dev_get_drvdata(dev);
-       struct drm_device *drm_dev = data;
-
-       mtk_ddp_comp_unregister(drm_dev, &priv->ddp_comp);
 }
 
 static const struct component_ops mtk_disp_ovl_component_ops = {
@@ -375,7 +359,6 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct mtk_disp_ovl *priv;
        struct resource *res;
-       int comp_id;
        int irq;
        int ret;
 
@@ -406,25 +389,6 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev)
 #endif
 
        priv->data = of_device_get_match_data(dev);
-
-       comp_id = mtk_ddp_comp_get_id(dev->of_node,
-                                     priv->data->layer_nr == 4 ?
-                                     MTK_DISP_OVL :
-                                     MTK_DISP_OVL_2L);
-       if (comp_id < 0) {
-               dev_err(dev, "Failed to identify by alias: %d\n", comp_id);
-               return comp_id;
-       }
-
-       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",
-                               ret);
-
-               return ret;
-       }
-
        platform_set_drvdata(pdev, priv);
 
        ret = devm_request_irq(dev, irq, mtk_disp_ovl_irq_handler,
@@ -443,8 +407,6 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev)
 
 static int mtk_disp_ovl_remove(struct platform_device *pdev)
 {
-       component_del(&pdev->dev, &mtk_disp_ovl_component_ops);
-
        return 0;
 }
 
index a263b7e..7ac8f9e 100644 (file)
@@ -62,7 +62,6 @@ struct mtk_disp_rdma_data {
  * @data: local driver data
  */
 struct mtk_disp_rdma {
-       struct mtk_ddp_comp             ddp_comp;
        struct clk                      *clk;
        void __iomem                    *regs;
        struct cmdq_client_reg          cmdq_reg;
@@ -250,17 +249,6 @@ void mtk_rdma_layer_config(struct device *dev, unsigned int idx,
 static int mtk_disp_rdma_bind(struct device *dev, struct device *master,
                              void *data)
 {
-       struct mtk_disp_rdma *priv = dev_get_drvdata(dev);
-       struct drm_device *drm_dev = data;
-       int ret;
-
-       ret = mtk_ddp_comp_register(drm_dev, &priv->ddp_comp);
-       if (ret < 0) {
-               dev_err(dev, "Failed to register component %pOF: %d\n",
-                       dev->of_node, ret);
-               return ret;
-       }
-
        return 0;
 
 }
@@ -268,10 +256,6 @@ static int mtk_disp_rdma_bind(struct device *dev, struct device *master,
 static void mtk_disp_rdma_unbind(struct device *dev, struct device *master,
                                 void *data)
 {
-       struct mtk_disp_rdma *priv = dev_get_drvdata(dev);
-       struct drm_device *drm_dev = data;
-
-       mtk_ddp_comp_unregister(drm_dev, &priv->ddp_comp);
 }
 
 static const struct component_ops mtk_disp_rdma_component_ops = {
@@ -284,7 +268,6 @@ static int mtk_disp_rdma_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct mtk_disp_rdma *priv;
        struct resource *res;
-       int comp_id;
        int irq;
        int ret;
 
@@ -314,21 +297,6 @@ static int mtk_disp_rdma_probe(struct platform_device *pdev)
                dev_dbg(dev, "get mediatek,gce-client-reg fail!\n");
 #endif
 
-       comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DISP_RDMA);
-       if (comp_id < 0) {
-               dev_err(dev, "Failed to identify by alias: %d\n", comp_id);
-               return comp_id;
-       }
-
-       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",
-                               ret);
-
-               return ret;
-       }
-
        /* Disable and clear pending interrupts */
        writel(0x0, priv->regs + DISP_REG_RDMA_INT_ENABLE);
        writel(0x0, priv->regs + DISP_REG_RDMA_INT_STATUS);
index 3c23d68..88a6856 100644 (file)
@@ -63,7 +63,6 @@ enum mtk_dpi_out_color_format {
 };
 
 struct mtk_dpi {
-       struct mtk_ddp_comp ddp_comp;
        struct drm_encoder encoder;
        struct drm_bridge bridge;
        struct drm_bridge *next_bridge;
@@ -583,21 +582,14 @@ static int mtk_dpi_bind(struct device *dev, struct device *master, void *data)
        struct drm_device *drm_dev = data;
        int ret;
 
-       ret = mtk_ddp_comp_register(drm_dev, &dpi->ddp_comp);
-       if (ret < 0) {
-               dev_err(dev, "Failed to register component %pOF: %d\n",
-                       dev->of_node, ret);
-               return ret;
-       }
-
        ret = drm_simple_encoder_init(drm_dev, &dpi->encoder,
                                      DRM_MODE_ENCODER_TMDS);
        if (ret) {
                dev_err(dev, "Failed to initialize decoder: %d\n", ret);
-               goto err_unregister;
+               return ret;
        }
 
-       dpi->encoder.possible_crtcs = mtk_drm_find_possible_crtc_by_comp(drm_dev, dpi->ddp_comp);
+       dpi->encoder.possible_crtcs = mtk_drm_find_possible_crtc_by_comp(drm_dev, dpi->dev);
 
        ret = drm_bridge_attach(&dpi->encoder, &dpi->bridge, NULL, 0);
        if (ret) {
@@ -614,8 +606,6 @@ static int mtk_dpi_bind(struct device *dev, struct device *master, void *data)
 
 err_cleanup:
        drm_encoder_cleanup(&dpi->encoder);
-err_unregister:
-       mtk_ddp_comp_unregister(drm_dev, &dpi->ddp_comp);
        return ret;
 }
 
@@ -623,10 +613,8 @@ static void mtk_dpi_unbind(struct device *dev, struct device *master,
                           void *data)
 {
        struct mtk_dpi *dpi = dev_get_drvdata(dev);
-       struct drm_device *drm_dev = data;
 
        drm_encoder_cleanup(&dpi->encoder);
-       mtk_ddp_comp_unregister(drm_dev, &dpi->ddp_comp);
 }
 
 static const struct component_ops mtk_dpi_component_ops = {
@@ -687,7 +675,6 @@ static int mtk_dpi_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct mtk_dpi *dpi;
        struct resource *mem;
-       int comp_id;
        int ret;
 
        dpi = devm_kzalloc(dev, sizeof(*dpi), GFP_KERNEL);
@@ -765,18 +752,6 @@ static int mtk_dpi_probe(struct platform_device *pdev)
 
        dev_info(dev, "Found bridge node: %pOF\n", dpi->next_bridge->of_node);
 
-       comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DPI);
-       if (comp_id < 0) {
-               dev_err(dev, "Failed to identify by alias: %d\n", comp_id);
-               return comp_id;
-       }
-
-       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;
-       }
-
        platform_set_drvdata(pdev, dpi);
 
        dpi->bridge.funcs = &mtk_dpi_bridge_funcs;
index b5915a5..bf44a14 100644 (file)
@@ -786,7 +786,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
                struct device_node *node;
 
                node = priv->comp_node[comp_id];
-               comp = priv->ddp_comp[comp_id];
+               comp = &priv->ddp_comp[comp_id];
                if (!comp) {
                        dev_err(dev, "Component %pOF not initialized\n", node);
                        ret = -ENODEV;
index 6f60e8d..a17aee5 100644 (file)
@@ -524,9 +524,10 @@ static const struct mtk_ddp_comp_match mtk_ddp_matches[DDP_COMPONENT_ID_MAX] = {
        [DDP_COMPONENT_WDMA1]   = { MTK_DISP_WDMA,      1, NULL },
 };
 
-static bool mtk_drm_find_comp_in_ddp(struct mtk_ddp_comp ddp_comp,
+static bool mtk_drm_find_comp_in_ddp(struct device *dev,
                                     const enum mtk_ddp_comp_id *path,
-                                    unsigned int path_len)
+                                    unsigned int path_len,
+                                    struct mtk_ddp_comp *ddp_comp)
 {
        unsigned int i;
 
@@ -534,7 +535,7 @@ static bool mtk_drm_find_comp_in_ddp(struct mtk_ddp_comp ddp_comp,
                return false;
 
        for (i = 0U; i < path_len; i++)
-               if (ddp_comp.id == path[i])
+               if (dev == ddp_comp[path[i]].dev)
                        return true;
 
        return false;
@@ -556,18 +557,19 @@ int mtk_ddp_comp_get_id(struct device_node *node,
 }
 
 unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
-                                               struct mtk_ddp_comp ddp_comp)
+                                               struct device *dev)
 {
        struct mtk_drm_private *private = drm->dev_private;
        unsigned int ret = 0;
 
-       if (mtk_drm_find_comp_in_ddp(ddp_comp, private->data->main_path, private->data->main_len))
+       if (mtk_drm_find_comp_in_ddp(dev, private->data->main_path, private->data->main_len,
+                                    private->ddp_comp))
                ret = BIT(0);
-       else if (mtk_drm_find_comp_in_ddp(ddp_comp, private->data->ext_path,
-                                         private->data->ext_len))
+       else if (mtk_drm_find_comp_in_ddp(dev, private->data->ext_path,
+                                         private->data->ext_len, private->ddp_comp))
                ret = BIT(1);
-       else if (mtk_drm_find_comp_in_ddp(ddp_comp, private->data->third_path,
-                                         private->data->third_len))
+       else if (mtk_drm_find_comp_in_ddp(dev, private->data->third_path,
+                                         private->data->third_len, private->ddp_comp))
                ret = BIT(2);
        else
                DRM_INFO("Failed to find comp in ddp table\n");
@@ -660,21 +662,3 @@ int mtk_ddp_comp_init(struct device_node *node, struct mtk_ddp_comp *comp,
 
        return 0;
 }
-
-int mtk_ddp_comp_register(struct drm_device *drm, struct mtk_ddp_comp *comp)
-{
-       struct mtk_drm_private *private = drm->dev_private;
-
-       if (private->ddp_comp[comp->id])
-               return -EBUSY;
-
-       private->ddp_comp[comp->id] = comp;
-       return 0;
-}
-
-void mtk_ddp_comp_unregister(struct drm_device *drm, struct mtk_ddp_comp *comp)
-{
-       struct mtk_drm_private *private = drm->dev_private;
-
-       private->ddp_comp[comp->id] = NULL;
-}
index 0ab202f..bb914d9 100644 (file)
@@ -188,11 +188,9 @@ static inline void mtk_ddp_ctm_set(struct mtk_ddp_comp *comp,
 int mtk_ddp_comp_get_id(struct device_node *node,
                        enum mtk_ddp_comp_type comp_type);
 unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
-                                               struct mtk_ddp_comp ddp_comp);
+                                               struct device *dev);
 int mtk_ddp_comp_init(struct device_node *comp_node, struct mtk_ddp_comp *comp,
                      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);
 void mtk_ddp_write(struct cmdq_pkt *cmdq_pkt, unsigned int value,
                   struct cmdq_client_reg *cmdq_reg, void __iomem *regs,
index 68bc212..8514d68 100644 (file)
@@ -502,23 +502,12 @@ static int mtk_drm_probe(struct platform_device *pdev)
                                 node);
                        drm_of_component_match_add(dev, &match, compare_of,
                                                   node);
-               } else {
-                       struct mtk_ddp_comp *comp;
-
-                       comp = devm_kzalloc(dev, sizeof(*comp), GFP_KERNEL);
-                       if (!comp) {
-                               ret = -ENOMEM;
-                               of_node_put(node);
-                               goto err_node;
-                       }
-
-                       ret = mtk_ddp_comp_init(node, comp, comp_id);
-                       if (ret) {
-                               of_node_put(node);
-                               goto err_node;
-                       }
-
-                       private->ddp_comp[comp_id] = comp;
+               }
+
+               ret = mtk_ddp_comp_init(node, &private->ddp_comp[comp_id], comp_id);
+               if (ret) {
+                       of_node_put(node);
+                       goto err_node;
                }
        }
 
@@ -544,10 +533,8 @@ err_node:
        of_node_put(private->mutex_node);
        for (i = 0; i < DDP_COMPONENT_ID_MAX; i++) {
                of_node_put(private->comp_node[i]);
-               if (private->ddp_comp[i]) {
-                       put_device(private->ddp_comp[i]->larb_dev);
-                       private->ddp_comp[i] = NULL;
-               }
+               if (private->ddp_comp[i].larb_dev)
+                       put_device(private->ddp_comp[i].larb_dev);
        }
        return ret;
 }
index 5d771cf..690e92e 100644 (file)
@@ -41,7 +41,7 @@ struct mtk_drm_private {
        struct device *mutex_dev;
        struct device *mmsys_dev;
        struct device_node *comp_node[DDP_COMPONENT_ID_MAX];
-       struct mtk_ddp_comp *ddp_comp[DDP_COMPONENT_ID_MAX];
+       struct mtk_ddp_comp ddp_comp[DDP_COMPONENT_ID_MAX];
        const struct mtk_mmsys_driver_data *data;
        struct drm_atomic_state *suspend_state;
 };
index c4af040..a5247ee 100644 (file)
@@ -179,7 +179,6 @@ struct mtk_dsi_driver_data {
 };
 
 struct mtk_dsi {
-       struct mtk_ddp_comp ddp_comp;
        struct device *dev;
        struct mipi_dsi_host host;
        struct drm_encoder encoder;
@@ -948,7 +947,7 @@ static int mtk_dsi_encoder_init(struct drm_device *drm, struct mtk_dsi *dsi)
                return ret;
        }
 
-       dsi->encoder.possible_crtcs = mtk_drm_find_possible_crtc_by_comp(drm, dsi->ddp_comp);
+       dsi->encoder.possible_crtcs = mtk_drm_find_possible_crtc_by_comp(drm, dsi->host.dev);
 
        ret = drm_bridge_attach(&dsi->encoder, &dsi->bridge, NULL,
                                DRM_BRIDGE_ATTACH_NO_CONNECTOR);
@@ -976,32 +975,17 @@ static int mtk_dsi_bind(struct device *dev, struct device *master, void *data)
        struct drm_device *drm = data;
        struct mtk_dsi *dsi = dev_get_drvdata(dev);
 
-       ret = mtk_ddp_comp_register(drm, &dsi->ddp_comp);
-       if (ret < 0) {
-               dev_err(dev, "Failed to register component %pOF: %d\n",
-                       dev->of_node, ret);
-               return ret;
-       }
-
        ret = mtk_dsi_encoder_init(drm, dsi);
-       if (ret)
-               goto err_unregister;
-
-       return 0;
 
-err_unregister:
-       mtk_ddp_comp_unregister(drm, &dsi->ddp_comp);
        return ret;
 }
 
 static void mtk_dsi_unbind(struct device *dev, struct device *master,
                           void *data)
 {
-       struct drm_device *drm = data;
        struct mtk_dsi *dsi = dev_get_drvdata(dev);
 
        drm_encoder_cleanup(&dsi->encoder);
-       mtk_ddp_comp_unregister(drm, &dsi->ddp_comp);
 }
 
 static const struct component_ops mtk_dsi_component_ops = {
@@ -1016,7 +1000,6 @@ static int mtk_dsi_probe(struct platform_device *pdev)
        struct drm_panel *panel;
        struct resource *regs;
        int irq_num;
-       int comp_id;
        int ret;
 
        dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
@@ -1086,19 +1069,6 @@ static int mtk_dsi_probe(struct platform_device *pdev)
                goto err_unregister_host;
        }
 
-       comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DSI);
-       if (comp_id < 0) {
-               dev_err(dev, "Failed to identify by alias: %d\n", comp_id);
-               ret = comp_id;
-               goto err_unregister_host;
-       }
-
-       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;
-       }
-
        irq_num = platform_get_irq(pdev, 0);
        if (irq_num < 0) {
                dev_err(&pdev->dev, "failed to get dsi irq_num: %d\n", irq_num);