|
|
|
@@ -214,6 +214,7 @@ 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_dev_num = 1,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const struct mtk_mmsys_driver_data mt7623_mmsys_driver_data = {
|
|
|
|
@@ -222,6 +223,7 @@ 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_dev_num = 1,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const struct mtk_mmsys_driver_data mt2712_mmsys_driver_data = {
|
|
|
|
@@ -231,11 +233,13 @@ 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_dev_num = 1,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const struct mtk_mmsys_driver_data mt8167_mmsys_driver_data = {
|
|
|
|
|
.main_path = mt8167_mtk_ddp_main,
|
|
|
|
|
.main_len = ARRAY_SIZE(mt8167_mtk_ddp_main),
|
|
|
|
|
.mmsys_dev_num = 1,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const struct mtk_mmsys_driver_data mt8173_mmsys_driver_data = {
|
|
|
|
@@ -243,6 +247,7 @@ 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_dev_num = 1,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const struct mtk_mmsys_driver_data mt8183_mmsys_driver_data = {
|
|
|
|
@@ -250,6 +255,7 @@ 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_dev_num = 1,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const struct mtk_mmsys_driver_data mt8186_mmsys_driver_data = {
|
|
|
|
@@ -257,6 +263,7 @@ static const struct mtk_mmsys_driver_data mt8186_mmsys_driver_data = {
|
|
|
|
|
.main_len = ARRAY_SIZE(mt8186_mtk_ddp_main),
|
|
|
|
|
.ext_path = mt8186_mtk_ddp_ext,
|
|
|
|
|
.ext_len = ARRAY_SIZE(mt8186_mtk_ddp_ext),
|
|
|
|
|
.mmsys_dev_num = 1,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const struct mtk_mmsys_driver_data mt8192_mmsys_driver_data = {
|
|
|
|
@@ -264,36 +271,124 @@ static const struct mtk_mmsys_driver_data mt8192_mmsys_driver_data = {
|
|
|
|
|
.main_len = ARRAY_SIZE(mt8192_mtk_ddp_main),
|
|
|
|
|
.ext_path = mt8192_mtk_ddp_ext,
|
|
|
|
|
.ext_len = ARRAY_SIZE(mt8192_mtk_ddp_ext),
|
|
|
|
|
.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_dev_num = 1,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
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,mt8167-mmsys",
|
|
|
|
|
.data = &mt8167_mmsys_driver_data},
|
|
|
|
|
{ .compatible = "mediatek,mt8173-mmsys",
|
|
|
|
|
.data = &mt8173_mmsys_driver_data},
|
|
|
|
|
{ .compatible = "mediatek,mt8183-mmsys",
|
|
|
|
|
.data = &mt8183_mmsys_driver_data},
|
|
|
|
|
{ .compatible = "mediatek,mt8186-mmsys",
|
|
|
|
|
.data = &mt8186_mmsys_driver_data},
|
|
|
|
|
{ .compatible = "mediatek,mt8192-mmsys",
|
|
|
|
|
.data = &mt8192_mmsys_driver_data},
|
|
|
|
|
{ .compatible = "mediatek,mt8195-mmsys",
|
|
|
|
|
.data = &mt8195_vdosys0_driver_data},
|
|
|
|
|
{ .compatible = "mediatek,mt8195-vdosys0",
|
|
|
|
|
.data = &mt8195_vdosys0_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))
|
|
|
|
|
return true;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool mtk_drm_get_all_drm_priv(struct device *dev)
|
|
|
|
|
{
|
|
|
|
|
struct mtk_drm_private *drm_priv = dev_get_drvdata(dev);
|
|
|
|
|
struct mtk_drm_private *all_drm_priv[MAX_CRTC];
|
|
|
|
|
struct device_node *phandle = dev->parent->of_node;
|
|
|
|
|
const struct of_device_id *of_id;
|
|
|
|
|
struct device_node *node;
|
|
|
|
|
struct device *drm_dev;
|
|
|
|
|
int cnt = 0;
|
|
|
|
|
int i, j;
|
|
|
|
|
|
|
|
|
|
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 (all_drm_priv[cnt] && all_drm_priv[cnt]->mtk_drm_bound)
|
|
|
|
|
cnt++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (drm_priv->data->mmsys_dev_num == cnt) {
|
|
|
|
|
for (i = 0; i < cnt; i++)
|
|
|
|
|
for (j = 0; j < cnt; j++)
|
|
|
|
|
all_drm_priv[j]->all_drm_private[i] = all_drm_priv[i];
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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 i;
|
|
|
|
|
|
|
|
|
|
if (drv_data->main_path)
|
|
|
|
|
for (i = 0; i < drv_data->main_len; i++)
|
|
|
|
|
if (drv_data->main_path[i] == comp_id)
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
if (drv_data->ext_path)
|
|
|
|
|
for (i = 0; i < drv_data->ext_len; i++)
|
|
|
|
|
if (drv_data->ext_path[i] == comp_id)
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
if (drv_data->third_path)
|
|
|
|
|
for (i = 0; i < drv_data->third_len; i++)
|
|
|
|
|
if (drv_data->third_path[i] == comp_id)
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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 ret, i, j;
|
|
|
|
|
|
|
|
|
|
if (drm_firmware_drivers_only())
|
|
|
|
|
return -ENODEV;
|
|
|
|
|
|
|
|
|
|
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 = drmm_mode_config_init(drm);
|
|
|
|
|
if (ret)
|
|
|
|
|
goto put_mutex_dev;
|
|
|
|
@@ -311,9 +406,12 @@ 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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Ensure internal panels are at the top of the connector list before
|
|
|
|
@@ -322,28 +420,53 @@ static int mtk_drm_kms_init(struct drm_device *drm)
|
|
|
|
|
drm_helper_move_panel_connectors_to_head(drm);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* We currently support two fixed data streams, each optional,
|
|
|
|
|
* and each statically assigned to a crtc:
|
|
|
|
|
* OVL0 -> COLOR0 -> AAL -> OD -> RDMA0 -> UFOE -> DSI0 ...
|
|
|
|
|
* 1. We currently support two fixed data streams, each optional,
|
|
|
|
|
* and each statically assigned to a crtc:
|
|
|
|
|
* OVL0 -> COLOR0 -> AAL -> OD -> RDMA0 -> UFOE -> DSI0 ...
|
|
|
|
|
* 2. For multi mmsys architecture, crtc path data are located in
|
|
|
|
|
* different drm private data structures. Loop through crtc index to
|
|
|
|
|
* create crtc from the main path and then ext_path and finally the
|
|
|
|
|
* third path.
|
|
|
|
|
* 3. Use OVL device for all DMA memory allocations
|
|
|
|
|
*/
|
|
|
|
|
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;
|
|
|
|
|
for (i = 0; i < MAX_CRTC; i++) {
|
|
|
|
|
for (j = 0; j < private->data->mmsys_dev_num; j++) {
|
|
|
|
|
priv_n = private->all_drm_private[j];
|
|
|
|
|
|
|
|
|
|
ret = mtk_drm_crtc_create(drm, private->data->third_path,
|
|
|
|
|
private->data->third_len);
|
|
|
|
|
if (ret < 0)
|
|
|
|
|
goto err_component_unbind;
|
|
|
|
|
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;
|
|
|
|
@@ -352,7 +475,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
|
|
|
|
@@ -374,9 +498,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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -424,15 +551,36 @@ static const struct drm_driver mtk_drm_driver = {
|
|
|
|
|
static int mtk_drm_bind(struct device *dev)
|
|
|
|
|
{
|
|
|
|
|
struct mtk_drm_private *private = dev_get_drvdata(dev);
|
|
|
|
|
struct platform_device *pdev;
|
|
|
|
|
struct drm_device *drm;
|
|
|
|
|
int ret;
|
|
|
|
|
int ret, i;
|
|
|
|
|
|
|
|
|
|
if (!iommu_present(&platform_bus_type))
|
|
|
|
|
return -EPROBE_DEFER;
|
|
|
|
|
|
|
|
|
|
pdev = of_find_device_by_node(private->mutex_node);
|
|
|
|
|
if (!pdev) {
|
|
|
|
|
dev_err(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;
|
|
|
|
|
private->mtk_drm_bound = true;
|
|
|
|
|
private->dev = dev;
|
|
|
|
|
|
|
|
|
|
if (!mtk_drm_get_all_drm_priv(dev))
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
drm = drm_dev_alloc(&mtk_drm_driver, dev);
|
|
|
|
|
if (IS_ERR(drm))
|
|
|
|
|
return PTR_ERR(drm);
|
|
|
|
|
|
|
|
|
|
private->drm_master = true;
|
|
|
|
|
drm->dev_private = private;
|
|
|
|
|
private->drm = drm;
|
|
|
|
|
for (i = 0; i < private->data->mmsys_dev_num; i++)
|
|
|
|
|
private->all_drm_private[i]->drm = drm;
|
|
|
|
|
|
|
|
|
|
ret = mtk_drm_kms_init(drm);
|
|
|
|
|
if (ret < 0)
|
|
|
|
@@ -458,10 +606,14 @@ 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->drm_master) {
|
|
|
|
|
drm_dev_unregister(private->drm);
|
|
|
|
|
mtk_drm_kms_deinit(private->drm);
|
|
|
|
|
drm_dev_put(private->drm);
|
|
|
|
|
}
|
|
|
|
|
private->mtk_drm_bound = false;
|
|
|
|
|
private->drm_master = false;
|
|
|
|
|
private->drm = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -586,31 +738,6 @@ 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,mt8167-mmsys",
|
|
|
|
|
.data = &mt8167_mmsys_driver_data},
|
|
|
|
|
{ .compatible = "mediatek,mt8173-mmsys",
|
|
|
|
|
.data = &mt8173_mmsys_driver_data},
|
|
|
|
|
{ .compatible = "mediatek,mt8183-mmsys",
|
|
|
|
|
.data = &mt8183_mmsys_driver_data},
|
|
|
|
|
{ .compatible = "mediatek,mt8186-mmsys",
|
|
|
|
|
.data = &mt8186_mmsys_driver_data},
|
|
|
|
|
{ .compatible = "mediatek,mt8192-mmsys",
|
|
|
|
|
.data = &mt8192_mmsys_driver_data},
|
|
|
|
|
{ .compatible = "mediatek,mt8195-mmsys",
|
|
|
|
|
.data = &mt8195_vdosys0_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;
|
|
|
|
@@ -638,6 +765,12 @@ static int mtk_drm_probe(struct platform_device *pdev)
|
|
|
|
|
|
|
|
|
|
private->data = of_id->data;
|
|
|
|
|
|
|
|
|
|
private->all_drm_private = devm_kmalloc_array(dev, private->data->mmsys_dev_num,
|
|
|
|
|
sizeof(*private->all_drm_private),
|
|
|
|
|
GFP_KERNEL);
|
|
|
|
|
if (!private->all_drm_private)
|
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
|
|
/* Iterate over sibling DISP function blocks */
|
|
|
|
|
for_each_child_of_node(phandle->parent, node) {
|
|
|
|
|
const struct of_device_id *of_id;
|
|
|
|
@@ -657,7 +790,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 == private->data->mmsys_id) {
|
|
|
|
|
private->mutex_node = of_node_get(node);
|
|
|
|
|
dev_dbg(dev, "get mutex for mmsys %d", private->data->mmsys_id);
|
|
|
|
|
}
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -668,6 +807,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);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@@ -743,16 +885,20 @@ static int mtk_drm_sys_prepare(struct device *dev)
|
|
|
|
|
struct mtk_drm_private *private = dev_get_drvdata(dev);
|
|
|
|
|
struct drm_device *drm = private->drm;
|
|
|
|
|
|
|
|
|
|
return drm_mode_config_helper_suspend(drm);
|
|
|
|
|
if (private->drm_master)
|
|
|
|
|
return drm_mode_config_helper_suspend(drm);
|
|
|
|
|
else
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void mtk_drm_sys_complete(struct device *dev)
|
|
|
|
|
{
|
|
|
|
|
struct mtk_drm_private *private = dev_get_drvdata(dev);
|
|
|
|
|
struct drm_device *drm = private->drm;
|
|
|
|
|
int ret;
|
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
|
|
ret = drm_mode_config_helper_resume(drm);
|
|
|
|
|
if (private->drm_master)
|
|
|
|
|
ret = drm_mode_config_helper_resume(drm);
|
|
|
|
|
if (ret)
|
|
|
|
|
dev_err(dev, "Failed to resume\n");
|
|
|
|
|
}
|
|
|
|
|