Commit 415f3690 authored by Bjorn Andersson's avatar Bjorn Andersson Committed by Rob Clark

drm/msm/dp: Allow sub-regions to be specified in DT

Not all platforms has P0 at an offset of 0x1000 from the base address,
so add support for specifying each sub-region in DT. The code falls back
to the predefined offsets in the case that only a single reg is
specified, in order to support existing DT.
Reviewed-by: default avatarStephen Boyd <swboyd@chromium.org>
Reviewed-by: default avatarAbhinav Kumar <abhinavk@codeaurora.org>
Signed-off-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
Link: https://lore.kernel.org/r/20211001174400.981707-6-bjorn.andersson@linaro.orgSigned-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
parent 060c160f
...@@ -50,18 +50,45 @@ static int dp_parser_ctrl_res(struct dp_parser *parser) ...@@ -50,18 +50,45 @@ static int dp_parser_ctrl_res(struct dp_parser *parser)
if (IS_ERR(dss->ahb.base)) if (IS_ERR(dss->ahb.base))
return PTR_ERR(dss->ahb.base); return PTR_ERR(dss->ahb.base);
if (dss->ahb.len < DP_DEFAULT_P0_OFFSET + DP_DEFAULT_P0_SIZE) { dss->aux.base = dp_ioremap(pdev, 1, &dss->aux.len);
DRM_ERROR("legacy memory region not large enough\n"); if (IS_ERR(dss->aux.base)) {
return -EINVAL; /*
} * The initial binding had a single reg, but in order to
* support variation in the sub-region sizes this was split.
* dp_ioremap() will fail with -EINVAL here if only a single
* reg is specified, so fill in the sub-region offsets and
* lengths based on this single region.
*/
if (PTR_ERR(dss->aux.base) == -EINVAL) {
if (dss->ahb.len < DP_DEFAULT_P0_OFFSET + DP_DEFAULT_P0_SIZE) {
DRM_ERROR("legacy memory region not large enough\n");
return -EINVAL;
}
dss->ahb.len = DP_DEFAULT_AHB_SIZE;
dss->aux.base = dss->ahb.base + DP_DEFAULT_AUX_OFFSET;
dss->aux.len = DP_DEFAULT_AUX_SIZE;
dss->link.base = dss->ahb.base + DP_DEFAULT_LINK_OFFSET;
dss->link.len = DP_DEFAULT_LINK_SIZE;
dss->p0.base = dss->ahb.base + DP_DEFAULT_P0_OFFSET;
dss->p0.len = DP_DEFAULT_P0_SIZE;
} else {
DRM_ERROR("unable to remap aux region: %pe\n", dss->aux.base);
return PTR_ERR(dss->aux.base);
}
} else {
dss->link.base = dp_ioremap(pdev, 2, &dss->link.len);
if (IS_ERR(dss->link.base)) {
DRM_ERROR("unable to remap link region: %pe\n", dss->link.base);
return PTR_ERR(dss->link.base);
}
dss->ahb.len = DP_DEFAULT_AHB_SIZE; dss->p0.base = dp_ioremap(pdev, 3, &dss->p0.len);
dss->aux.base = dss->ahb.base + DP_DEFAULT_AUX_OFFSET; if (IS_ERR(dss->p0.base)) {
dss->aux.len = DP_DEFAULT_AUX_SIZE; DRM_ERROR("unable to remap p0 region: %pe\n", dss->p0.base);
dss->link.base = dss->ahb.base + DP_DEFAULT_LINK_OFFSET; return PTR_ERR(dss->p0.base);
dss->link.len = DP_DEFAULT_LINK_SIZE; }
dss->p0.base = dss->ahb.base + DP_DEFAULT_P0_OFFSET; }
dss->p0.len = DP_DEFAULT_P0_SIZE;
io->phy = devm_phy_get(&pdev->dev, "dp"); io->phy = devm_phy_get(&pdev->dev, "dp");
if (IS_ERR(io->phy)) if (IS_ERR(io->phy))
......
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