Commit e290c812 authored by Sebastian Reichel's avatar Sebastian Reichel Committed by Tomi Valkeinen
Browse files

drm/omap: dsi: Reverse direction of the DSS device enable/disable operations



Complete the direction reversal of the DSS device enable/disable
operations started by commit 19b4200d ("drm/omap: Reverse direction
of the DSS device enable/disable operations").

This effectively drops the requirement of calling DSS specific
code from the DSI panel driver moving it a bit further to a
standard drm_panel driver.

Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20201215104657.802264-31-tomi.valkeinen@ti.com
parent 2a4703c2
Loading
Loading
Loading
Loading
+37 −37
Original line number Diff line number Diff line
@@ -284,27 +284,6 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
	struct omap_dss_device *src = ddata->src;
	u8 id1, id2, id3;
	int r;
	struct omap_dss_dsi_config dsi_config = {
		.vm = &ddata->vm,
		.hs_clk_min = 150000000,
		.hs_clk_max = 300000000,
		.lp_clk_min = 7000000,
		.lp_clk_max = 10000000,
	};

	r = regulator_bulk_enable(ARRAY_SIZE(ddata->supplies), ddata->supplies);
	if (r) {
		dev_err(&ddata->dsi->dev, "failed to enable supplies: %d\n", r);
		return r;
	}

	r = src->ops->dsi.set_config(src, &dsi_config);
	if (r) {
		dev_err(&ddata->dsi->dev, "failed to configure DSI\n");
		goto err_regulators;
	}

	src->ops->enable(src);

	dsicm_hw_reset(ddata);

@@ -359,12 +338,6 @@ static int dsicm_power_on(struct panel_drv_data *ddata)

	dsicm_hw_reset(ddata);

	src->ops->disable(src);
err_regulators:
	r = regulator_bulk_disable(ARRAY_SIZE(ddata->supplies), ddata->supplies);
	if (r)
		dev_err(&ddata->dsi->dev, "failed to disable supplies: %d\n", r);

	return r;
}

@@ -373,6 +346,8 @@ static void dsicm_power_off(struct panel_drv_data *ddata)
	struct omap_dss_device *src = ddata->src;
	int r;

	ddata->enabled = false;

	src->ops->dsi.disable_video_output(src, ddata->dsi->channel);

	r = mipi_dsi_dcs_set_display_off(ddata->dsi);
@@ -384,14 +359,6 @@ static void dsicm_power_off(struct panel_drv_data *ddata)
				"error disabling panel, issuing HW reset\n");
		dsicm_hw_reset(ddata);
	}

	src->ops->disable(src);

	r = regulator_bulk_disable(ARRAY_SIZE(ddata->supplies), ddata->supplies);
	if (r)
		dev_err(&ddata->dsi->dev, "failed to disable supplies: %d\n", r);

	ddata->enabled = false;
}

static int dsicm_connect(struct omap_dss_device *src,
@@ -411,6 +378,29 @@ static void dsicm_disconnect(struct omap_dss_device *src,
	ddata->src = NULL;
}

static void dsicm_pre_enable(struct omap_dss_device *dssdev)
{
	struct panel_drv_data *ddata = to_panel_data(dssdev);
	struct omap_dss_device *src = ddata->src;
	int r;
	struct omap_dss_dsi_config dsi_config = {
		.vm = &ddata->vm,
		.hs_clk_min = 150000000,
		.hs_clk_max = 300000000,
		.lp_clk_min = 7000000,
		.lp_clk_max = 10000000,
	};

	r = regulator_bulk_enable(ARRAY_SIZE(ddata->supplies), ddata->supplies);
	if (r)
		dev_err(&ddata->dsi->dev, "failed to enable supplies: %d\n", r);

	r = src->ops->dsi.set_config(src, &dsi_config);
	if (r) {
		dev_err(&ddata->dsi->dev, "failed to configure DSI\n");
	}
}

static void dsicm_enable(struct omap_dss_device *dssdev)
{
	struct panel_drv_data *ddata = to_panel_data(dssdev);
@@ -445,6 +435,16 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
	mutex_unlock(&ddata->lock);
}

static void dsicm_post_disable(struct omap_dss_device *dssdev)
{
	struct panel_drv_data *ddata = to_panel_data(dssdev);
	int r;

	r = regulator_bulk_disable(ARRAY_SIZE(ddata->supplies), ddata->supplies);
	if (r)
		dev_err(&ddata->dsi->dev, "failed to disable supplies: %d\n", r);
}

static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
{
	struct mipi_dsi_device *dsi = ddata->dsi;
@@ -498,8 +498,10 @@ static const struct omap_dss_device_ops dsicm_ops = {
	.connect	= dsicm_connect,
	.disconnect	= dsicm_disconnect,

	.pre_enable	= dsicm_pre_enable,
	.enable		= dsicm_enable,
	.disable	= dsicm_disable,
	.post_disable	= dsicm_post_disable,

	.get_modes	= dsicm_get_modes,
	.check_timings	= dsicm_check_timings,
@@ -655,8 +657,6 @@ static int __exit dsicm_remove(struct mipi_dsi_device *dsi)

	omapdss_device_unregister(dssdev);

	if (omapdss_device_is_enabled(dssdev))
		dsicm_disable(dssdev);
	omapdss_device_disconnect(ddata->src, dssdev);

	sysfs_remove_group(&dsi->dev.kobj, &dsicm_attr_group);
+8 −20
Original line number Diff line number Diff line
@@ -136,16 +136,10 @@ static void omap_encoder_disable(struct drm_encoder *encoder)
	 */
	omapdss_device_disable(dssdev->next);

	/*
	 * Disable the internal encoder. This will disable the DSS output. The
	 * DSI is treated as an exception as DSI pipelines still use the legacy
	 * flow where the pipeline output controls the encoder.
	 */
	if (dssdev->type != OMAP_DISPLAY_TYPE_DSI) {
	/* Disable the internal encoder. This will disable the DSS output. */
	if (dssdev->ops && dssdev->ops->disable)
		dssdev->ops->disable(dssdev);
	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
	}

	/*
	 * Perform the post-disable operations on the chain of external devices
@@ -165,16 +159,10 @@ static void omap_encoder_enable(struct drm_encoder *encoder)
	/* Prepare the chain of external devices for pipeline enable. */
	omapdss_device_pre_enable(dssdev->next);

	/*
	 * Enable the internal encoder. This will enable the DSS output. The
	 * DSI is treated as an exception as DSI pipelines still use the legacy
	 * flow where the pipeline output controls the encoder.
	 */
	if (dssdev->type != OMAP_DISPLAY_TYPE_DSI) {
	/* Enable the internal encoder. This will enable the DSS output. */
	if (dssdev->ops && dssdev->ops->enable)
		dssdev->ops->enable(dssdev);
	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
	}

	/*
	 * Enable the chain of external devices, starting at the one at the