Commit 269e92d8 authored by Bjorn Andersson's avatar Bjorn Andersson Committed by Rob Clark
Browse files

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: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
Reviewed-by: default avatarStephen Boyd <swboyd@chromium.org>
Link: https://lore.kernel.org/r/20211016221843.2167329-4-bjorn.andersson@linaro.org


Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
parent 167dac97
Loading
Loading
Loading
Loading
+42 −1
Original line number Diff line number Diff line
@@ -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) {
+1 −0
Original line number Diff line number Diff line
@@ -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;

+1 −1
Original line number Diff line number Diff line
@@ -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);