Hi, Nancy: Nancy.Lin <nancy.lin@xxxxxxxxxxxx> 於 2021年9月6日 週一 下午3:15寫道: > > MT8195 have two mmsys. Modify drm for MT8195 multi-mmsys support. > The two mmsys (vdosys0 and vdosys1) will bring up two drm drivers, > only one drm driver register as the drm device. > Each drm driver binds its own component. The first bind drm driver > will allocate the drm device, and the last bind drm driver registers > the drm device to drm core. Each crtc path is created with the > corresponding drm driver data. > > Signed-off-by: Nancy.Lin <nancy.lin@xxxxxxxxxxxx> > --- > drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 25 +- > drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 3 +- > drivers/gpu/drm/mediatek/mtk_drm_drv.c | 360 +++++++++++++++++++----- > drivers/gpu/drm/mediatek/mtk_drm_drv.h | 8 +- > 4 files changed, 320 insertions(+), 76 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > index 474efb844249..68cb15c38c3f 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > @@ -737,21 +737,28 @@ static int mtk_drm_crtc_init_comp_planes(struct drm_device *drm_dev, > } > > int mtk_drm_crtc_create(struct drm_device *drm_dev, > - const enum mtk_ddp_comp_id *path, unsigned int path_len) > + const enum mtk_ddp_comp_id *path, unsigned int path_len, > + int priv_data_index) > { > struct mtk_drm_private *priv = drm_dev->dev_private; > struct device *dev = drm_dev->dev; > struct mtk_drm_crtc *mtk_crtc; > unsigned int num_comp_planes = 0; > - int pipe = priv->num_pipes; > int ret; > int i; > bool has_ctm = false; > uint gamma_lut_size = 0; > + struct drm_crtc *tmp; > + int crtc_i = 0; > > if (!path) > return 0; > > + priv = priv->all_drm_private[priv_data_index]; > + > + drm_for_each_crtc(tmp, drm_dev) > + crtc_i++; > + > for (i = 0; i < path_len; i++) { > enum mtk_ddp_comp_id comp_id = path[i]; > struct device_node *node; > @@ -760,7 +767,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev, > if (!node) { > dev_info(dev, > "Not creating crtc %d because component %d is disabled or missing\n", > - pipe, comp_id); > + crtc_i, comp_id); > return 0; > } > } > @@ -816,25 +823,25 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev, > > for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) { > ret = mtk_drm_crtc_init_comp_planes(drm_dev, mtk_crtc, i, > - pipe); > + crtc_i); > if (ret) > return ret; > } > > - ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, pipe); > + ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, crtc_i); > if (ret < 0) > return ret; > > if (gamma_lut_size) > drm_mode_crtc_set_gamma_size(&mtk_crtc->base, gamma_lut_size); > drm_crtc_enable_color_mgmt(&mtk_crtc->base, 0, has_ctm, gamma_lut_size); > - priv->num_pipes++; > mutex_init(&mtk_crtc->hw_lock); > > #if IS_REACHABLE(CONFIG_MTK_CMDQ) > + i = (priv->data->mmsys_dev_num > 1) ? 0 : drm_crtc_index(&mtk_crtc->base); > + > mtk_crtc->cmdq_client = > - cmdq_mbox_create(mtk_crtc->mmsys_dev, > - drm_crtc_index(&mtk_crtc->base)); > + cmdq_mbox_create(mtk_crtc->mmsys_dev, i); > if (IS_ERR(mtk_crtc->cmdq_client)) { > dev_dbg(dev, "mtk_crtc %d failed to create mailbox client, writing register by CPU now\n", > drm_crtc_index(&mtk_crtc->base)); > @@ -844,7 +851,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev, > if (mtk_crtc->cmdq_client) { > ret = of_property_read_u32_index(priv->mutex_node, > "mediatek,gce-events", > - drm_crtc_index(&mtk_crtc->base), > + i, > &mtk_crtc->cmdq_event); > if (ret) { > dev_dbg(dev, "mtk_crtc %d failed to get mediatek,gce-events property\n", > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > index cb9a36c48d4f..a57eb12d7c05 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > @@ -17,7 +17,8 @@ > void mtk_drm_crtc_commit(struct drm_crtc *crtc); > int mtk_drm_crtc_create(struct drm_device *drm_dev, > const enum mtk_ddp_comp_id *path, > - unsigned int path_len); > + unsigned int path_len, > + int priv_data_index); > int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane *plane, > struct mtk_plane_state *state); > void mtk_drm_crtc_async_update(struct drm_crtc *crtc, struct drm_plane *plane, > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > index ae8df7ecc872..782c791b368e 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > @@ -166,6 +166,8 @@ static const struct mtk_mmsys_driver_data mt2701_mmsys_driver_data = { > .ext_path = mt2701_mtk_ddp_ext, > .ext_len = ARRAY_SIZE(mt2701_mtk_ddp_ext), > .shadow_register = true, > + .mmsys_id = 0, > + .mmsys_dev_num = 1, > }; > > static const struct mtk_mmsys_driver_data mt7623_mmsys_driver_data = { > @@ -174,6 +176,8 @@ static const struct mtk_mmsys_driver_data mt7623_mmsys_driver_data = { > .ext_path = mt7623_mtk_ddp_ext, > .ext_len = ARRAY_SIZE(mt7623_mtk_ddp_ext), > .shadow_register = true, > + .mmsys_id = 0, > + .mmsys_dev_num = 1, > }; > > static const struct mtk_mmsys_driver_data mt2712_mmsys_driver_data = { > @@ -183,6 +187,8 @@ static const struct mtk_mmsys_driver_data mt2712_mmsys_driver_data = { > .ext_len = ARRAY_SIZE(mt2712_mtk_ddp_ext), > .third_path = mt2712_mtk_ddp_third, > .third_len = ARRAY_SIZE(mt2712_mtk_ddp_third), > + .mmsys_id = 0, > + .mmsys_dev_num = 1, > }; > > static const struct mtk_mmsys_driver_data mt8173_mmsys_driver_data = { > @@ -190,6 +196,8 @@ static const struct mtk_mmsys_driver_data mt8173_mmsys_driver_data = { > .main_len = ARRAY_SIZE(mt8173_mtk_ddp_main), > .ext_path = mt8173_mtk_ddp_ext, > .ext_len = ARRAY_SIZE(mt8173_mtk_ddp_ext), > + .mmsys_id = 0, > + .mmsys_dev_num = 1, > }; > > static const struct mtk_mmsys_driver_data mt8183_mmsys_driver_data = { > @@ -197,32 +205,219 @@ static const struct mtk_mmsys_driver_data mt8183_mmsys_driver_data = { > .main_len = ARRAY_SIZE(mt8183_mtk_ddp_main), > .ext_path = mt8183_mtk_ddp_ext, > .ext_len = ARRAY_SIZE(mt8183_mtk_ddp_ext), > + .mmsys_id = 0, > + .mmsys_dev_num = 1, > }; > > static const struct mtk_mmsys_driver_data mt8195_vdosys0_driver_data = { > .main_path = mt8195_mtk_ddp_main, > .main_len = ARRAY_SIZE(mt8195_mtk_ddp_main), > + .mmsys_id = 0, > + .mmsys_dev_num = 2, > }; > > +static const struct of_device_id mtk_drm_of_ids[] = { > + { .compatible = "mediatek,mt2701-mmsys", > + .data = &mt2701_mmsys_driver_data}, > + { .compatible = "mediatek,mt7623-mmsys", > + .data = &mt7623_mmsys_driver_data}, > + { .compatible = "mediatek,mt2712-mmsys", > + .data = &mt2712_mmsys_driver_data}, > + { .compatible = "mediatek,mt8173-mmsys", > + .data = &mt8173_mmsys_driver_data}, > + { .compatible = "mediatek,mt8183-mmsys", > + .data = &mt8183_mmsys_driver_data}, > + { .compatible = "mediatek,mt8195-vdosys0", > + .data = &mt8195_vdosys0_driver_data}, > + { .compatible = "mediatek,mt8195-vdosys1", > + .data = &mt8195_vdosys1_driver_data}, > + { } > +}; > +MODULE_DEVICE_TABLE(of, mtk_drm_of_ids); > + > +static int mtk_drm_match(struct device *dev, void *data) > +{ > + if (!strncmp(dev_name(dev), "mediatek-drm", sizeof("mediatek-drm") - 1)) Why not if (!strcmp(dev_name(dev), "mediatek-drm") > + return true; > + return false; > +} > + > +static int mtk_drm_get_drm_priv(struct device *dev, > + struct mtk_drm_private **all_drm_priv, > + int num) > +{ > + struct mtk_drm_private *drm_priv = dev_get_drvdata(dev); > + struct device_node *phandle = dev->parent->of_node; > + const struct of_device_id *of_id; > + struct device_node *node; > + int cnt = 0; > + struct device *drm_dev; > + > + for_each_child_of_node(phandle->parent, node) { > + struct platform_device *pdev; > + > + of_id = of_match_node(mtk_drm_of_ids, node); > + if (!of_id) > + continue; > + > + pdev = of_find_device_by_node(node); > + if (!pdev) > + continue; > + > + drm_dev = device_find_child(&pdev->dev, NULL, mtk_drm_match); > + if (!drm_dev || !dev_get_drvdata(drm_dev)) > + continue; > + > + all_drm_priv[cnt++] = dev_get_drvdata(drm_dev); > + if (cnt == num) > + break; > + } > + > + return 0; > +} > + > +static bool mtk_drm_check_last_drm_bind(struct device *dev) > +{ > + struct mtk_drm_private *drm_priv = dev_get_drvdata(dev); > + struct mtk_drm_private *all_drm_priv[MAX_CRTC]; > + int cnt = 0; > + int i; > + > + mtk_drm_get_drm_priv(dev, all_drm_priv, drm_priv->data->mmsys_dev_num); You call this in three place, why not call this once? > + > + for (i = 0; i < MAX_CRTC; i++) > + if (all_drm_priv[i] && all_drm_priv[i]->mtk_drm_bound) > + cnt++; > + > + return (drm_priv->data->mmsys_dev_num == cnt); > +} > + > +static bool mtk_drm_find_drm_dev(struct device *dev, struct drm_device **drm) > +{ > + struct device_node *phandle = dev->parent->of_node; > + struct mtk_drm_private *drm_priv = dev_get_drvdata(dev); > + struct mtk_drm_private *all_drm_priv[MAX_CRTC]; > + int i; > + > + if (!drm_priv->data->mmsys_dev_num) > + return false; > + > + mtk_drm_get_drm_priv(dev, all_drm_priv, drm_priv->data->mmsys_dev_num); > + > + for (i = 0; i < MAX_CRTC; i++) { > + if (all_drm_priv[i] && all_drm_priv[i]->mtk_drm_bound) { > + *drm = all_drm_priv[i]->drm; > + return true; > + } > + } > + > + return false; > +} > + > +static int mtk_drm_setup_all_drm_private(struct device *dev) > +{ > + struct mtk_drm_private *drm_priv = dev_get_drvdata(dev); > + struct mtk_drm_private *all_drm_priv[MAX_CRTC]; > + int mmsys_dev_num = drm_priv->data->mmsys_dev_num; > + int i; > + int j; int i, j; > + > + mtk_drm_get_drm_priv(dev, all_drm_priv, mmsys_dev_num); > + > + for (i = 0; i < mmsys_dev_num; i++) > + for (j = 0; j < mmsys_dev_num; j++) > + all_drm_priv[j]->all_drm_private[i] = all_drm_priv[i]; > + > + return 0; > +} > + > +static bool mtk_drm_find_mmsys_comp(struct mtk_drm_private *private, int comp_id) > +{ > + const struct mtk_mmsys_driver_data *drv_data = private->data; > + int ret = false; > + int i; > + > + if (drv_data->mmsys_dev_num == 1) > + return true; > + > + if (drv_data->main_path) { > + for (i = 0; i < drv_data->main_len; i++) > + if (drv_data->main_path[i] == comp_id) > + ret |= true; return true; > + > + if (i == drv_data->main_len) > + ret |= false; This is not necessary. > + } > + > + if (drv_data->ext_path) { > + for (i = 0; i < drv_data->ext_len; i++) > + if (drv_data->ext_path[i] == comp_id) > + ret |= true; return true; > + > + if (i == drv_data->ext_len) > + ret |= false; This is not necessary. > + } > + > + if (drv_data->third_path) { > + for (i = 0; i < drv_data->third_len; i++) > + if (drv_data->third_path[i] == comp_id) > + ret |= true; return true; > + > + if (i == drv_data->third_len) > + ret |= false; This is not necessary. > + } > + > + return ret; > +} > + > +static int mtk_drm_check_mutex_dev(struct mtk_drm_private *private) > +{ > + struct platform_device *pdev; > + struct mtk_drm_private *priv_i; > + int ret; > + int i; > + > + for (i = 0; i < private->data->mmsys_dev_num; i++) { > + priv_i = private->all_drm_private[i]; > + > + pdev = of_find_device_by_node(priv_i->mutex_node); > + if (!pdev) { > + dev_err(priv_i->dev, "Waiting for disp-mutex device %pOF\n", > + priv_i->mutex_node); > + ret = -EPROBE_DEFER; For SoC which has only one mmsys, I think waiting mutex is necessary. So move this to another patch and do this for a single mmsys. Regards, Chun-Kuang. > + goto err_put_mutex; > + } > + priv_i->mutex_dev = &pdev->dev; > + } > + > + return 0; > + > +err_put_mutex: > + for (i = 0; i < private->data->mmsys_dev_num; i++) { > + priv_i = private->all_drm_private[i]; > + of_node_put(priv_i->mutex_node); > + } > + > + return ret; > +} > + > static int mtk_drm_kms_init(struct drm_device *drm) > { > struct mtk_drm_private *private = drm->dev_private; > + struct mtk_drm_private *priv_n; > struct platform_device *pdev; > - struct device_node *np; > + struct device_node *np = NULL; > struct device *dma_dev; > int ret; > + int i; > + int j; > > if (!iommu_present(&platform_bus_type)) > return -EPROBE_DEFER; > > - pdev = of_find_device_by_node(private->mutex_node); > - if (!pdev) { > - dev_err(drm->dev, "Waiting for disp-mutex device %pOF\n", > - private->mutex_node); > - of_node_put(private->mutex_node); > - return -EPROBE_DEFER; > - } > - private->mutex_dev = &pdev->dev; > + ret = mtk_drm_check_mutex_dev(private); > + if (ret) > + return ret; > > ret = drmm_mode_config_init(drm); > if (ret) > @@ -241,33 +436,57 @@ static int mtk_drm_kms_init(struct drm_device *drm) > drm->mode_config.funcs = &mtk_drm_mode_config_funcs; > drm->mode_config.helper_private = &mtk_drm_mode_config_helpers; > > - ret = component_bind_all(drm->dev, drm); > - if (ret) > - goto put_mutex_dev; > + for (i = 0; i < private->data->mmsys_dev_num; i++) { > + drm->dev_private = private->all_drm_private[i]; > + ret = component_bind_all(private->all_drm_private[i]->dev, drm); > + if (ret) > + goto put_mutex_dev; > + } > > /* > * We currently support two fixed data streams, each optional, > * and each statically assigned to a crtc: > * OVL0 -> COLOR0 -> AAL -> OD -> RDMA0 -> UFOE -> DSI0 ... > */ > - ret = mtk_drm_crtc_create(drm, private->data->main_path, > - private->data->main_len); > - if (ret < 0) > - goto err_component_unbind; > - /* ... and OVL1 -> COLOR1 -> GAMMA -> RDMA1 -> DPI0. */ > - ret = mtk_drm_crtc_create(drm, private->data->ext_path, > - private->data->ext_len); > - if (ret < 0) > - goto err_component_unbind; > - > - ret = mtk_drm_crtc_create(drm, private->data->third_path, > - private->data->third_len); > - if (ret < 0) > - goto err_component_unbind; > + for (i = 0; i < MAX_CRTC; i++) { > + for (j = 0; j < private->data->mmsys_dev_num; j++) { > + priv_n = private->all_drm_private[j]; > + > + if (i == 0 && priv_n->data->main_len) { > + ret = mtk_drm_crtc_create(drm, priv_n->data->main_path, > + priv_n->data->main_len, j); > + if (ret) > + goto err_component_unbind; > + > + if (!np) > + np = priv_n->comp_node[priv_n->data->main_path[0]]; > + > + continue; > + } else if (i == 1 && priv_n->data->ext_len) { > + ret = mtk_drm_crtc_create(drm, priv_n->data->ext_path, > + priv_n->data->ext_len, j); > + if (ret) > + goto err_component_unbind; > + > + if (!np) > + np = priv_n->comp_node[priv_n->data->ext_path[0]]; > + > + continue; > + } else if (i == 2 && priv_n->data->third_len) { > + ret = mtk_drm_crtc_create(drm, priv_n->data->third_path, > + priv_n->data->third_len, j); > + if (ret) > + goto err_component_unbind; > + > + if (!np) > + np = priv_n->comp_node[priv_n->data->third_path[0]]; > + > + continue; > + } > + } > + } > > /* Use OVL device for all DMA memory allocations */ > - np = private->comp_node[private->data->main_path[0]] ?: > - private->comp_node[private->data->ext_path[0]]; > pdev = of_find_device_by_node(np); > if (!pdev) { > ret = -ENODEV; > @@ -276,7 +495,8 @@ static int mtk_drm_kms_init(struct drm_device *drm) > } > > dma_dev = &pdev->dev; > - private->dma_dev = dma_dev; > + for (i = 0; i < private->data->mmsys_dev_num; i++) > + private->all_drm_private[i]->dma_dev = dma_dev; > > /* > * Configure the DMA segment size to make sure we get contiguous IOVA > @@ -304,9 +524,12 @@ static int mtk_drm_kms_init(struct drm_device *drm) > return 0; > > err_component_unbind: > - component_unbind_all(drm->dev, drm); > + for (i = 0; i < private->data->mmsys_dev_num; i++) > + component_unbind_all(private->all_drm_private[i]->dev, drm); > put_mutex_dev: > - put_device(private->mutex_dev); > + for (i = 0; i < private->data->mmsys_dev_num; i++) > + put_device(private->all_drm_private[i]->mutex_dev); > + > return ret; > } > > @@ -371,12 +594,21 @@ static int mtk_drm_bind(struct device *dev) > struct drm_device *drm; > int ret; > > - drm = drm_dev_alloc(&mtk_drm_driver, dev); > - if (IS_ERR(drm)) > - return PTR_ERR(drm); > + if (!mtk_drm_find_drm_dev(dev, &drm)) { > + drm = drm_dev_alloc(&mtk_drm_driver, dev); > + if (IS_ERR(drm)) > + return PTR_ERR(drm); > + drm->dev_private = private; > + } > > - drm->dev_private = private; > + private->dev = dev; > private->drm = drm; > + private->mtk_drm_bound = true; > + > + if (!mtk_drm_check_last_drm_bind(dev)) > + return 0; > + > + mtk_drm_setup_all_drm_private(dev); > > ret = mtk_drm_kms_init(drm); > if (ret < 0) > @@ -401,10 +633,13 @@ static void mtk_drm_unbind(struct device *dev) > { > struct mtk_drm_private *private = dev_get_drvdata(dev); > > - drm_dev_unregister(private->drm); > - mtk_drm_kms_deinit(private->drm); > - drm_dev_put(private->drm); > - private->num_pipes = 0; > + /* for multi mmsys dev, unregister drm dev in mmsys master */ > + if (private->data->mmsys_id == 0) { > + drm_dev_unregister(private->drm); > + mtk_drm_kms_deinit(private->drm); > + drm_dev_put(private->drm); > + } > + private->mtk_drm_bound = false; > private->drm = NULL; > } > > @@ -487,50 +722,40 @@ static const struct of_device_id mtk_ddp_comp_dt_ids[] = { > { } > }; > > -static const struct of_device_id mtk_drm_of_ids[] = { > - { .compatible = "mediatek,mt2701-mmsys", > - .data = &mt2701_mmsys_driver_data}, > - { .compatible = "mediatek,mt7623-mmsys", > - .data = &mt7623_mmsys_driver_data}, > - { .compatible = "mediatek,mt2712-mmsys", > - .data = &mt2712_mmsys_driver_data}, > - { .compatible = "mediatek,mt8173-mmsys", > - .data = &mt8173_mmsys_driver_data}, > - { .compatible = "mediatek,mt8183-mmsys", > - .data = &mt8183_mmsys_driver_data}, > - {.compatible = "mediatek,mt8195-vdosys0", > - .data = &mt8195_vdosys0_driver_data}, > - { } > -}; > -MODULE_DEVICE_TABLE(of, mtk_drm_of_ids); > - > static int mtk_drm_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > struct device_node *phandle = dev->parent->of_node; > const struct of_device_id *of_id; > + const struct mtk_mmsys_driver_data *drv_data; > struct mtk_drm_private *private; > struct device_node *node; > struct component_match *match = NULL; > int ret; > int i; > > + of_id = of_match_node(mtk_drm_of_ids, phandle); > + if (!of_id) > + return -ENODEV; > + > + drv_data = of_id->data; > private = devm_kzalloc(dev, sizeof(*private), GFP_KERNEL); > if (!private) > return -ENOMEM; > > + private->all_drm_private = devm_kmalloc_array(dev, drv_data->mmsys_dev_num, > + sizeof(*private->all_drm_private), > + GFP_KERNEL); > + if (!private->all_drm_private) > + return -ENOMEM; > + > + private->data = drv_data; > private->mmsys_dev = dev->parent; > if (!private->mmsys_dev) { > dev_err(dev, "Failed to get MMSYS device\n"); > return -ENODEV; > } > > - of_id = of_match_node(mtk_drm_of_ids, phandle); > - if (!of_id) > - return -ENODEV; > - > - private->data = of_id->data; > - > /* Iterate over sibling DISP function blocks */ > for_each_child_of_node(phandle->parent, node) { > const struct of_device_id *of_id; > @@ -550,7 +775,13 @@ static int mtk_drm_probe(struct platform_device *pdev) > comp_type = (enum mtk_ddp_comp_type)of_id->data; > > if (comp_type == MTK_DISP_MUTEX) { > - private->mutex_node = of_node_get(node); > + int id; > + > + id = of_alias_get_id(node, "mutex"); > + if (id < 0 || id == drv_data->mmsys_id) { > + private->mutex_node = of_node_get(node); > + dev_dbg(dev, "get mutex for mmsys %d", drv_data->mmsys_id); > + } > continue; > } > > @@ -561,6 +792,9 @@ static int mtk_drm_probe(struct platform_device *pdev) > continue; > } > > + if (!mtk_drm_find_mmsys_comp(private, comp_id)) > + continue; > + > private->comp_node[comp_id] = of_node_get(node); > > /* > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h b/drivers/gpu/drm/mediatek/mtk_drm_drv.h > index 1ad9f7edfcc7..b87ba900c8e2 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h > @@ -29,14 +29,15 @@ struct mtk_mmsys_driver_data { > unsigned int third_len; > > bool shadow_register; > + unsigned int mmsys_id; > + unsigned int mmsys_dev_num; > }; > > struct mtk_drm_private { > struct drm_device *drm; > struct device *dma_dev; > - > - unsigned int num_pipes; > - > + bool mtk_drm_bound; > + struct device *dev; > struct device_node *mutex_node; > struct device *mutex_dev; > struct device *mmsys_dev; > @@ -44,6 +45,7 @@ struct mtk_drm_private { > struct mtk_ddp_comp ddp_comp[DDP_COMPONENT_ID_MAX]; > const struct mtk_mmsys_driver_data *data; > struct drm_atomic_state *suspend_state; > + struct mtk_drm_private **all_drm_private; > }; > > extern struct platform_driver mtk_disp_aal_driver; > -- > 2.18.0 >