mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-09 09:01:36 -04:00
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 19b4200d8f ("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: Sebastian Reichel <sebastian.reichel@collabora.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20201215104657.802264-31-tomi.valkeinen@ti.com
This commit is contained in:
committed by
Tomi Valkeinen
parent
2a4703c25f
commit
e290c812eb
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
if (dssdev->ops && dssdev->ops->disable)
|
||||
dssdev->ops->disable(dssdev);
|
||||
dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
|
||||
}
|
||||
/* 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) {
|
||||
if (dssdev->ops && dssdev->ops->enable)
|
||||
dssdev->ops->enable(dssdev);
|
||||
dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
|
||||
}
|
||||
/* 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
|
||||
|
||||
Reference in New Issue
Block a user