drm/msm/dp: Allow specifying connector_type per controller
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> Link: https://lore.kernel.org/r/20211016221843.2167329-4-bjorn.andersson@linaro.org Signed-off-by: Rob Clark <robdclark@chromium.org>
This commit is contained in:
parent
167dac97eb
commit
269e92d84c
@ -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) {
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user