Commit 5ccdceca authored by Dmitry Baryshkov's avatar Dmitry Baryshkov Committed by Rob Clark

drm/msm: lookup the ICC paths in both mdp5/dpu and mdss devices

The commit 6874f48b ("drm/msm: make mdp5/dpu devices master
components") changed the MDP5 driver to look for the interconnect paths
in the MDSS device rather than in the MDP5 device itself. This was left
unnoticed since on my testing devices the interconnects probably didn't
reach the sync state.

Rather than just using the MDP5 device for ICC path lookups for the MDP5
devices, introduce an additional helper to check both MDP5/DPU and MDSS
nodes. This will be helpful for the MDP5->DPU conversion, since the
driver will have to check both nodes.

Fixes: 6874f48b ("drm/msm: make mdp5/dpu devices master components")
Reported-by: default avatarMarijn Suijten <marijn.suijten@somainline.org>
Reported-by: default avatarYassine Oudjana <y.oudjana@protonmail.com>
Signed-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Tested-by: Marijn Suijten <marijn.suijten@somainline.org> # On sdm630
Tested-by: Yassine Oudjana <y.oudjana@protonmail.com> # msm8996
Patchwork: https://patchwork.freedesktop.org/patch/496488/
Link: https://lore.kernel.org/r/20220805115630.506391-1-dmitry.baryshkov@linaro.orgSigned-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
parent feda34d1
...@@ -384,12 +384,9 @@ static int dpu_kms_parse_data_bus_icc_path(struct dpu_kms *dpu_kms) ...@@ -384,12 +384,9 @@ static int dpu_kms_parse_data_bus_icc_path(struct dpu_kms *dpu_kms)
struct icc_path *path1; struct icc_path *path1;
struct drm_device *dev = dpu_kms->dev; struct drm_device *dev = dpu_kms->dev;
struct device *dpu_dev = dev->dev; struct device *dpu_dev = dev->dev;
struct device *mdss_dev = dpu_dev->parent;
/* Interconnects are a part of MDSS device tree binding, not the path0 = msm_icc_get(dpu_dev, "mdp0-mem");
* MDP/DPU device. */ path1 = msm_icc_get(dpu_dev, "mdp1-mem");
path0 = of_icc_get(mdss_dev, "mdp0-mem");
path1 = of_icc_get(mdss_dev, "mdp1-mem");
if (IS_ERR_OR_NULL(path0)) if (IS_ERR_OR_NULL(path0))
return PTR_ERR_OR_ZERO(path0); return PTR_ERR_OR_ZERO(path0);
......
...@@ -902,12 +902,9 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev) ...@@ -902,12 +902,9 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev)
static int mdp5_setup_interconnect(struct platform_device *pdev) static int mdp5_setup_interconnect(struct platform_device *pdev)
{ {
/* Interconnects are a part of MDSS device tree binding, not the struct icc_path *path0 = msm_icc_get(&pdev->dev, "mdp0-mem");
* MDP5 device. */ struct icc_path *path1 = msm_icc_get(&pdev->dev, "mdp1-mem");
struct device *mdss_dev = pdev->dev.parent; struct icc_path *path_rot = msm_icc_get(&pdev->dev, "rotator-mem");
struct icc_path *path0 = of_icc_get(mdss_dev, "mdp0-mem");
struct icc_path *path1 = of_icc_get(mdss_dev, "mdp1-mem");
struct icc_path *path_rot = of_icc_get(mdss_dev, "rotator-mem");
if (IS_ERR(path0)) if (IS_ERR(path0))
return PTR_ERR(path0); return PTR_ERR(path0);
......
...@@ -467,6 +467,8 @@ void __iomem *msm_ioremap_size(struct platform_device *pdev, const char *name, ...@@ -467,6 +467,8 @@ void __iomem *msm_ioremap_size(struct platform_device *pdev, const char *name,
phys_addr_t *size); phys_addr_t *size);
void __iomem *msm_ioremap_quiet(struct platform_device *pdev, const char *name); void __iomem *msm_ioremap_quiet(struct platform_device *pdev, const char *name);
struct icc_path *msm_icc_get(struct device *dev, const char *name);
#define msm_writel(data, addr) writel((data), (addr)) #define msm_writel(data, addr) writel((data), (addr))
#define msm_readl(addr) readl((addr)) #define msm_readl(addr) readl((addr))
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
* Author: Rob Clark <robdclark@gmail.com> * Author: Rob Clark <robdclark@gmail.com>
*/ */
#include <linux/interconnect.h>
#include "msm_drv.h" #include "msm_drv.h"
/* /*
...@@ -124,3 +126,23 @@ void msm_hrtimer_work_init(struct msm_hrtimer_work *work, ...@@ -124,3 +126,23 @@ void msm_hrtimer_work_init(struct msm_hrtimer_work *work,
work->worker = worker; work->worker = worker;
kthread_init_work(&work->work, fn); kthread_init_work(&work->work, fn);
} }
struct icc_path *msm_icc_get(struct device *dev, const char *name)
{
struct device *mdss_dev = dev->parent;
struct icc_path *path;
path = of_icc_get(dev, name);
if (path)
return path;
/*
* If there are no interconnects attached to the corresponding device
* node, of_icc_get() will return NULL.
*
* If the MDP5/DPU device node doesn't have interconnects, lookup the
* path in the parent (MDSS) device.
*/
return of_icc_get(mdss_dev, name);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment