Message ID | 20211016221843.2167329-4-bjorn.andersson@linaro.org (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | drm/msm/dp: Support multiple DP instances and add sc8180x | expand |
Quoting Bjorn Andersson (2021-10-16 15:18:39) > As the following patches introduced support for multiple DP blocks in a > platform and some of those block might be eDP it becomes useful to be > able to specify the connector type per block. > > Although there's only a single block at this point, the array of descs > and the search in dp_display_get_desc() are introduced here to simplify > the next patch, that does introduce support for multiple DP blocks. > > Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org> > --- Reviewed-by: Stephen Boyd <swboyd@chromium.org>
On 2021-10-16 15:18, Bjorn Andersson wrote: > As the following patches introduced support for multiple DP blocks in a > platform and some of those block might be eDP it becomes useful to be > able to specify the connector type per block. > > Although there's only a single block at this point, the array of descs > and the search in dp_display_get_desc() are introduced here to simplify > the next patch, that does introduce support for multiple DP blocks. > > Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org> Reviewed-by: Abhinav Kumar <abhinavk@codeaurora.org> > --- > > Changes since v4: > - const the various struct msm_dp_desc instances > - unsigned the connector_type > > > The references to DRM_MODE_CONNECTOR_DisplayPort in dp_debug.c, that > was > highligted in the review of v4 has been removed in a separate patch. > > drivers/gpu/drm/msm/dp/dp_display.c | 43 ++++++++++++++++++++++++++++- > drivers/gpu/drm/msm/dp/dp_display.h | 1 + > drivers/gpu/drm/msm/dp/dp_drm.c | 2 +- > 3 files changed, 44 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/msm/dp/dp_display.c > b/drivers/gpu/drm/msm/dp/dp_display.c > index 5d3ee5ef07c2..6913970c8cf9 100644 > --- a/drivers/gpu/drm/msm/dp/dp_display.c > +++ b/drivers/gpu/drm/msm/dp/dp_display.c > @@ -115,8 +115,25 @@ struct dp_display_private { > struct dp_audio *audio; > }; > > +struct msm_dp_desc { > + phys_addr_t io_start; > + unsigned int connector_type; > +}; > + > +struct msm_dp_config { > + const struct msm_dp_desc *descs; > + size_t num_descs; > +}; > + > +static const struct msm_dp_config sc7180_dp_cfg = { > + .descs = (const struct msm_dp_desc[]) { > + { .io_start = 0x0ae90000, .connector_type = > DRM_MODE_CONNECTOR_DisplayPort }, > + }, > + .num_descs = 1, > +}; > + > static const struct of_device_id dp_dt_match[] = { > - {.compatible = "qcom,sc7180-dp"}, > + { .compatible = "qcom,sc7180-dp", .data = &sc7180_dp_cfg }, > {} > }; > > @@ -1180,10 +1197,29 @@ int dp_display_request_irq(struct msm_dp > *dp_display) > return 0; > } > > +static const struct msm_dp_desc *dp_display_get_desc(struct > platform_device *pdev) > +{ > + const struct msm_dp_config *cfg = > of_device_get_match_data(&pdev->dev); > + struct resource *res; > + int i; > + > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + if (!res) > + return NULL; > + > + for (i = 0; i < cfg->num_descs; i++) > + if (cfg->descs[i].io_start == res->start) > + return &cfg->descs[i]; > + > + dev_err(&pdev->dev, "unknown displayport instance\n"); > + return NULL; > +} > + > static int dp_display_probe(struct platform_device *pdev) > { > int rc = 0; > struct dp_display_private *dp; > + const struct msm_dp_desc *desc; > > if (!pdev || !pdev->dev.of_node) { > DRM_ERROR("pdev not found\n"); > @@ -1194,8 +1230,13 @@ static int dp_display_probe(struct > platform_device *pdev) > if (!dp) > return -ENOMEM; > > + desc = dp_display_get_desc(pdev); > + if (!desc) > + return -EINVAL; > + > dp->pdev = pdev; > dp->name = "drm_dp"; > + dp->dp_display.connector_type = desc->connector_type; > > rc = dp_init_sub_modules(dp); > if (rc) { > diff --git a/drivers/gpu/drm/msm/dp/dp_display.h > b/drivers/gpu/drm/msm/dp/dp_display.h > index 8b47cdabb67e..75fcabcfbbdd 100644 > --- a/drivers/gpu/drm/msm/dp/dp_display.h > +++ b/drivers/gpu/drm/msm/dp/dp_display.h > @@ -18,6 +18,7 @@ struct msm_dp { > bool is_connected; > bool audio_enabled; > bool power_on; > + unsigned int connector_type; > > hdmi_codec_plugged_cb plugged_cb; > > diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c > b/drivers/gpu/drm/msm/dp/dp_drm.c > index 764f4b81017e..f33e31523f56 100644 > --- a/drivers/gpu/drm/msm/dp/dp_drm.c > +++ b/drivers/gpu/drm/msm/dp/dp_drm.c > @@ -147,7 +147,7 @@ struct drm_connector *dp_drm_connector_init(struct > msm_dp *dp_display) > > ret = drm_connector_init(dp_display->drm_dev, connector, > &dp_connector_funcs, > - DRM_MODE_CONNECTOR_DisplayPort); > + dp_display->connector_type); > if (ret) > return ERR_PTR(ret);
diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c index 5d3ee5ef07c2..6913970c8cf9 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.c +++ b/drivers/gpu/drm/msm/dp/dp_display.c @@ -115,8 +115,25 @@ struct dp_display_private { struct dp_audio *audio; }; +struct msm_dp_desc { + phys_addr_t io_start; + unsigned int connector_type; +}; + +struct msm_dp_config { + const struct msm_dp_desc *descs; + size_t num_descs; +}; + +static const struct msm_dp_config sc7180_dp_cfg = { + .descs = (const struct msm_dp_desc[]) { + { .io_start = 0x0ae90000, .connector_type = DRM_MODE_CONNECTOR_DisplayPort }, + }, + .num_descs = 1, +}; + static const struct of_device_id dp_dt_match[] = { - {.compatible = "qcom,sc7180-dp"}, + { .compatible = "qcom,sc7180-dp", .data = &sc7180_dp_cfg }, {} }; @@ -1180,10 +1197,29 @@ int dp_display_request_irq(struct msm_dp *dp_display) return 0; } +static const struct msm_dp_desc *dp_display_get_desc(struct platform_device *pdev) +{ + const struct msm_dp_config *cfg = of_device_get_match_data(&pdev->dev); + struct resource *res; + int i; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) + return NULL; + + for (i = 0; i < cfg->num_descs; i++) + if (cfg->descs[i].io_start == res->start) + return &cfg->descs[i]; + + dev_err(&pdev->dev, "unknown displayport instance\n"); + return NULL; +} + static int dp_display_probe(struct platform_device *pdev) { int rc = 0; struct dp_display_private *dp; + const struct msm_dp_desc *desc; if (!pdev || !pdev->dev.of_node) { DRM_ERROR("pdev not found\n"); @@ -1194,8 +1230,13 @@ static int dp_display_probe(struct platform_device *pdev) if (!dp) return -ENOMEM; + desc = dp_display_get_desc(pdev); + if (!desc) + return -EINVAL; + dp->pdev = pdev; dp->name = "drm_dp"; + dp->dp_display.connector_type = desc->connector_type; rc = dp_init_sub_modules(dp); if (rc) { diff --git a/drivers/gpu/drm/msm/dp/dp_display.h b/drivers/gpu/drm/msm/dp/dp_display.h index 8b47cdabb67e..75fcabcfbbdd 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.h +++ b/drivers/gpu/drm/msm/dp/dp_display.h @@ -18,6 +18,7 @@ struct msm_dp { bool is_connected; bool audio_enabled; bool power_on; + unsigned int connector_type; hdmi_codec_plugged_cb plugged_cb; diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c b/drivers/gpu/drm/msm/dp/dp_drm.c index 764f4b81017e..f33e31523f56 100644 --- a/drivers/gpu/drm/msm/dp/dp_drm.c +++ b/drivers/gpu/drm/msm/dp/dp_drm.c @@ -147,7 +147,7 @@ struct drm_connector *dp_drm_connector_init(struct msm_dp *dp_display) ret = drm_connector_init(dp_display->drm_dev, connector, &dp_connector_funcs, - DRM_MODE_CONNECTOR_DisplayPort); + dp_display->connector_type); if (ret) return ERR_PTR(ret);
As the following patches introduced support for multiple DP blocks in a platform and some of those block might be eDP it becomes useful to be able to specify the connector type per block. Although there's only a single block at this point, the array of descs and the search in dp_display_get_desc() are introduced here to simplify the next patch, that does introduce support for multiple DP blocks. Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org> --- Changes since v4: - const the various struct msm_dp_desc instances - unsigned the connector_type The references to DRM_MODE_CONNECTOR_DisplayPort in dp_debug.c, that was highligted in the review of v4 has been removed in a separate patch. drivers/gpu/drm/msm/dp/dp_display.c | 43 ++++++++++++++++++++++++++++- drivers/gpu/drm/msm/dp/dp_display.h | 1 + drivers/gpu/drm/msm/dp/dp_drm.c | 2 +- 3 files changed, 44 insertions(+), 2 deletions(-)