linux-omap.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Tomi Valkeinen <tomi.valkeinen@ti.com>
To: Sebastian Reichel <sre@kernel.org>,
	Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	Nikhil Devshatwar <nikhil.nd@ti.com>,
	<linux-omap@vger.kernel.org>, <dri-devel@lists.freedesktop.org>
Cc: Sekhar Nori <nsekhar@ti.com>, Tony Lindgren <tony@atomide.com>,
	<hns@goldelico.com>,
	Sebastian Reichel <sebastian.reichel@collabora.com>,
	Tomi Valkeinen <tomi.valkeinen@ti.com>
Subject: [PATCH v4 32/80] drm/omap: dsi: convert to drm_panel
Date: Tue, 24 Nov 2020 14:44:50 +0200	[thread overview]
Message-ID: <20201124124538.660710-33-tomi.valkeinen@ti.com> (raw)
In-Reply-To: <20201124124538.660710-1-tomi.valkeinen@ti.com>

From: Sebastian Reichel <sebastian.reichel@collabora.com>

This converts the DSI module to expect common drm_panel display
drivers instead of dssdev based ones.

Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
---
 .../gpu/drm/omapdrm/displays/panel-dsi-cm.c   | 203 +++++++-----------
 drivers/gpu/drm/omapdrm/dss/dsi.c             | 128 +++++++++--
 .../gpu/drm/omapdrm/dss/omapdss-boot-init.c   |   1 -
 drivers/gpu/drm/omapdrm/dss/omapdss.h         |   8 -
 4 files changed, 182 insertions(+), 158 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index 389efed5e9dd..5d6a001f8f71 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -6,8 +6,6 @@
  * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
  */
 
-/* #define DEBUG */
-
 #include <linux/backlight.h>
 #include <linux/delay.h>
 #include <linux/gpio/consumer.h>
@@ -20,11 +18,14 @@
 #include <linux/regulator/consumer.h>
 
 #include <drm/drm_connector.h>
+#include <drm/drm_mipi_dsi.h>
+#include <drm/drm_modes.h>
+#include <drm/drm_panel.h>
 
+#include <video/display_timing.h>
 #include <video/mipi_display.h>
 #include <video/of_display_timing.h>
-
-#include "../dss/omapdss.h"
+#include <video/videomode.h>
 
 #define DCS_READ_NUM_ERRORS	0x05
 #define DCS_GET_ID1		0xda
@@ -35,11 +36,8 @@
 
 struct panel_drv_data {
 	struct mipi_dsi_device *dsi;
-
-	struct omap_dss_device dssdev;
-	struct omap_dss_device *src;
-
-	struct videomode vm;
+	struct drm_panel panel;
+	struct drm_display_mode mode;
 
 	struct mutex lock;
 
@@ -67,7 +65,10 @@ struct panel_drv_data {
 	bool intro_printed;
 };
 
-#define to_panel_data(p) container_of(p, struct panel_drv_data, dssdev)
+static inline struct panel_drv_data *panel_to_ddata(struct drm_panel *panel)
+{
+	return container_of(panel, struct panel_drv_data, panel);
+}
 
 static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable);
 
@@ -282,7 +283,6 @@ static void dsicm_hw_reset(struct panel_drv_data *ddata)
 
 static int dsicm_power_on(struct panel_drv_data *ddata)
 {
-	struct omap_dss_device *src = ddata->src;
 	u8 id1, id2, id3;
 	int r;
 
@@ -319,10 +319,6 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
 	if (r)
 		goto err;
 
-	r = src->ops->dsi.enable_video_output(src, ddata->dsi->channel);
-	if (r)
-		goto err;
-
 	ddata->enabled = true;
 
 	if (!ddata->intro_printed) {
@@ -342,15 +338,12 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
 	return r;
 }
 
-static void dsicm_power_off(struct panel_drv_data *ddata)
+static int 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);
 	if (!r)
 		r = dsicm_sleep_in(ddata);
@@ -360,51 +353,25 @@ static void dsicm_power_off(struct panel_drv_data *ddata)
 				"error disabling panel, issuing HW reset\n");
 		dsicm_hw_reset(ddata);
 	}
-}
-
-static int dsicm_connect(struct omap_dss_device *src,
-			 struct omap_dss_device *dst)
-{
-	struct panel_drv_data *ddata = to_panel_data(dst);
-
-	ddata->src = src;
-	return 0;
-}
 
-static void dsicm_disconnect(struct omap_dss_device *src,
-			     struct omap_dss_device *dst)
-{
-	struct panel_drv_data *ddata = to_panel_data(dst);
-
-	ddata->src = NULL;
+	return r;
 }
 
-static void dsicm_pre_enable(struct omap_dss_device *dssdev)
+static int dsicm_prepare(struct drm_panel *panel)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *src = ddata->src;
+	struct panel_drv_data *ddata = panel_to_ddata(panel);
 	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");
-	}
+	return r;
 }
 
-static void dsicm_enable(struct omap_dss_device *dssdev)
+static int dsicm_enable(struct drm_panel *panel)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
+	struct panel_drv_data *ddata = panel_to_ddata(panel);
 	int r;
 
 	mutex_lock(&ddata->lock);
@@ -417,33 +384,39 @@ static void dsicm_enable(struct omap_dss_device *dssdev)
 
 	dsicm_bl_power(ddata, true);
 
-	return;
+	return 0;
 err:
-	dev_dbg(&ddata->dsi->dev, "enable failed (%d)\n", r);
+	dev_err(&ddata->dsi->dev, "enable failed (%d)\n", r);
 	mutex_unlock(&ddata->lock);
+	return r;
+}
+
+static int dsicm_unprepare(struct drm_panel *panel)
+{
+	struct panel_drv_data *ddata = panel_to_ddata(panel);
+	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);
+
+	return r;
 }
 
-static void dsicm_disable(struct omap_dss_device *dssdev)
+static int dsicm_disable(struct drm_panel *panel)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
+	struct panel_drv_data *ddata = panel_to_ddata(panel);
+	int r;
 
 	dsicm_bl_power(ddata, false);
 
 	mutex_lock(&ddata->lock);
 
-	dsicm_power_off(ddata);
+	r = dsicm_power_off(ddata);
 
 	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);
+	return r;
 }
 
 static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
@@ -462,50 +435,37 @@ static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
 	return r;
 }
 
-static int dsicm_get_modes(struct omap_dss_device *dssdev,
+static int dsicm_get_modes(struct drm_panel *panel,
 			   struct drm_connector *connector)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
+	struct panel_drv_data *ddata = panel_to_ddata(panel);
+	struct drm_display_mode *mode;
+
+	mode = drm_mode_duplicate(connector->dev, &ddata->mode);
+	if (!mode) {
+		dev_err(&ddata->dsi->dev, "failed to add mode %ux%ux@%u kHz\n",
+			ddata->mode.hdisplay, ddata->mode.vdisplay,
+			ddata->mode.clock);
+		return -ENOMEM;
+	}
+
+	drm_mode_set_name(mode);
+	mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
 
 	connector->display_info.width_mm = ddata->width_mm;
 	connector->display_info.height_mm = ddata->height_mm;
 
-	return omapdss_display_get_modes(connector, &ddata->vm);
-}
-
-static int dsicm_check_timings(struct omap_dss_device *dssdev,
-			       struct drm_display_mode *mode)
-{
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	int ret = 0;
-
-	if (mode->hdisplay != ddata->vm.hactive)
-		ret = -EINVAL;
-
-	if (mode->vdisplay != ddata->vm.vactive)
-		ret = -EINVAL;
+	drm_mode_probed_add(connector, mode);
 
-	if (ret) {
-		dev_warn(dssdev->dev, "wrong resolution: %d x %d",
-			 mode->hdisplay, mode->vdisplay);
-		dev_warn(dssdev->dev, "panel resolution: %d x %d",
-			 ddata->vm.hactive, ddata->vm.vactive);
-	}
-
-	return ret;
+	return 1;
 }
 
-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,
+static const struct drm_panel_funcs dsicm_panel_funcs = {
+	.unprepare = dsicm_unprepare,
+	.disable = dsicm_disable,
+	.prepare = dsicm_prepare,
+	.enable = dsicm_enable,
+	.get_modes = dsicm_get_modes,
 };
 
 static int dsicm_probe_of(struct mipi_dsi_device *dsi)
@@ -514,6 +474,10 @@ static int dsicm_probe_of(struct mipi_dsi_device *dsi)
 	struct backlight_device *backlight;
 	struct panel_drv_data *ddata = mipi_dsi_get_drvdata(dsi);
 	struct display_timing timing;
+	struct videomode vm = {
+		.hactive = 864,
+		.vactive = 480,
+	};
 	int err;
 
 	ddata->reset_gpio = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW);
@@ -525,15 +489,16 @@ static int dsicm_probe_of(struct mipi_dsi_device *dsi)
 
 	err = of_get_display_timing(node, "panel-timing", &timing);
 	if (!err) {
-		videomode_from_timing(&timing, &ddata->vm);
-		if (!ddata->vm.pixelclock)
-			ddata->vm.pixelclock =
-				ddata->vm.hactive * ddata->vm.vactive * 60;
+		videomode_from_timing(&timing, &vm);
 	} else {
 		dev_warn(&dsi->dev,
 			 "failed to get video timing, using defaults\n");
 	}
 
+	if (!vm.pixelclock)
+		vm.pixelclock = vm.hactive * vm.vactive * 60;
+	drm_display_mode_from_videomode(&vm, &ddata->mode);
+
 	ddata->width_mm = 0;
 	of_property_read_u32(node, "width-mm", &ddata->width_mm);
 
@@ -565,7 +530,6 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
 	struct panel_drv_data *ddata;
 	struct backlight_device *bldev = NULL;
 	struct device *dev = &dsi->dev;
-	struct omap_dss_device *dssdev;
 	int r;
 
 	dev_dbg(dev, "probe\n");
@@ -577,30 +541,17 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
 	mipi_dsi_set_drvdata(dsi, ddata);
 	ddata->dsi = dsi;
 
-	ddata->vm.hactive = 864;
-	ddata->vm.vactive = 480;
-	ddata->vm.pixelclock = 864 * 480 * 60;
-
 	r = dsicm_probe_of(dsi);
 	if (r)
 		return r;
 
-	dssdev = &ddata->dssdev;
-	dssdev->dev = dev;
-	dssdev->ops = &dsicm_ops;
-	dssdev->type = OMAP_DISPLAY_TYPE_DSI;
-	dssdev->display = true;
-	dssdev->owner = THIS_MODULE;
-	dssdev->of_port = 0;
-	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
-
-	omapdss_display_init(dssdev);
-	omapdss_device_register(dssdev);
-
 	mutex_init(&ddata->lock);
 
 	dsicm_hw_reset(ddata);
 
+	drm_panel_init(&ddata->panel, dev, &dsicm_panel_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
+
 	if (ddata->use_dsi_backlight) {
 		struct backlight_properties props = { 0 };
 		props.max_brightness = 255;
@@ -629,6 +580,8 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
 	dsi->hs_rate = 300000000;
 	dsi->lp_rate = 10000000;
 
+	drm_panel_add(&ddata->panel);
+
 	r = mipi_dsi_attach(dsi);
 	if (r < 0)
 		goto err_dsi_attach;
@@ -636,6 +589,7 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
 	return 0;
 
 err_dsi_attach:
+	drm_panel_remove(&ddata->panel);
 	sysfs_remove_group(&dsi->dev.kobj, &dsicm_attr_group);
 err_bl:
 	if (ddata->extbldev)
@@ -647,15 +601,12 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
 static int __exit dsicm_remove(struct mipi_dsi_device *dsi)
 {
 	struct panel_drv_data *ddata = mipi_dsi_get_drvdata(dsi);
-	struct omap_dss_device *dssdev = &ddata->dssdev;
 
 	dev_dbg(&dsi->dev, "remove\n");
 
 	mipi_dsi_detach(dsi);
 
-	omapdss_device_unregister(dssdev);
-
-	omapdss_device_disconnect(ddata->src, dssdev);
+	drm_panel_remove(&ddata->panel);
 
 	sysfs_remove_group(&dsi->dev.kobj, &dsicm_attr_group);
 
@@ -669,7 +620,7 @@ static int __exit dsicm_remove(struct mipi_dsi_device *dsi)
 }
 
 static const struct of_device_id dsicm_of_match[] = {
-	{ .compatible = "omapdss,panel-dsi-cm", },
+	{ .compatible = "panel-dsi-cm", },
 	{},
 };
 
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 1a5ab2fd1d81..93900739237e 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -36,6 +36,7 @@
 #include <linux/sys_soc.h>
 
 #include <drm/drm_mipi_dsi.h>
+#include <drm/drm_panel.h>
 #include <video/mipi_display.h>
 
 #include "omapdss.h"
@@ -217,6 +218,8 @@ static int dsi_vc_send_null(struct dsi_data *dsi, int channel);
 static ssize_t _omap_dsi_host_transfer(struct dsi_data *dsi,
 				       const struct mipi_dsi_msg *msg);
 
+static void dsi_display_disable(struct omap_dss_device *dssdev);
+
 /* DSI PLL HSDIV indices */
 #define HSDIV_DISPC	0
 #define HSDIV_DSI	1
@@ -384,6 +387,7 @@ struct dsi_data {
 	bool te_enabled;
 	bool ulps_enabled;
 	bool ulps_auto_idle;
+	bool video_enabled;
 
 	struct delayed_work ulps_work;
 
@@ -424,6 +428,8 @@ struct dsi_data {
 
 	unsigned int scp_clk_refcount;
 
+	struct omap_dss_dsi_config config;
+
 	struct dss_lcd_mgr_config mgr_config;
 	struct videomode vm;
 	enum mipi_dsi_pixel_format pix_fmt;
@@ -3622,7 +3628,7 @@ static int dsi_configure_pins(struct omap_dss_device *dssdev,
 	return 0;
 }
 
-static int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
+static void dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
 {
 	struct dsi_data *dsi = to_dsi_data(dssdev);
 	int bpp = mipi_dsi_pixel_format_to_bpp(dsi->pix_fmt);
@@ -3631,8 +3637,10 @@ static int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
 	int r;
 
 	r = dsi_display_init_dispc(dsi);
-	if (r)
-		return r;
+	if (r) {
+		dev_err(dsi->dev, "failed to init dispc!\n");
+		return;
+	}
 
 	if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) {
 		switch (dsi->pix_fmt) {
@@ -3672,7 +3680,7 @@ static int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
 	if (r)
 		goto err_mgr_enable;
 
-	return 0;
+	return;
 
 err_mgr_enable:
 	if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) {
@@ -3681,7 +3689,8 @@ static int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
 	}
 err_pix_fmt:
 	dsi_display_uninit_dispc(dsi);
-	return r;
+	dev_err(dsi->dev, "failed to enable DSI encoder!\n");
+	return;
 }
 
 static void dsi_disable_video_output(struct omap_dss_device *dssdev, int channel)
@@ -3704,6 +3713,25 @@ static void dsi_disable_video_output(struct omap_dss_device *dssdev, int channel
 	dsi_display_uninit_dispc(dsi);
 }
 
+static void dsi_disable_video_outputs(struct omap_dss_device *dssdev)
+{
+	struct dsi_data *dsi = to_dsi_data(dssdev);
+	unsigned int i;
+
+	dsi_bus_lock(dsi);
+	dsi->video_enabled = false;
+
+	for (i = 0; i < 4; i++) {
+		if (!dsi->vc[i].dest)
+			continue;
+		dsi_disable_video_output(dssdev, i);
+	}
+
+	dsi_display_disable(dssdev);
+
+	dsi_bus_unlock(dsi);
+}
+
 static void dsi_update_screen_dispc(struct dsi_data *dsi)
 {
 	unsigned int bytespp;
@@ -3897,6 +3925,11 @@ static int dsi_update_channel(struct omap_dss_device *dssdev, int channel)
 
 	dsi_bus_lock(dsi);
 
+	if (!dsi->video_enabled) {
+		r = -EIO;
+		goto err;
+	}
+
 	if (!dsi->vc[channel].dest) {
 		r = -ENODEV;
 		goto err;
@@ -4167,8 +4200,30 @@ static void dsi_display_enable(struct omap_dss_device *dssdev)
 	struct dsi_data *dsi = to_dsi_data(dssdev);
 	DSSDBG("dsi_display_enable\n");
 
-	dsi_bus_lock(dsi);
+	WARN_ON(!dsi_bus_is_locked(dsi));
+
 	_dsi_display_enable(dsi);
+}
+
+static void dsi_enable_video_outputs(struct omap_dss_device *dssdev)
+{
+	struct dsi_data *dsi = to_dsi_data(dssdev);
+	unsigned int i;
+
+	dsi_bus_lock(dsi);
+
+	dsi_display_enable(dssdev);
+
+	for (i = 0; i < 4; i++) {
+		if (!dsi->vc[i].dest)
+			continue;
+		dsi_enable_video_output(dssdev, i);
+	}
+
+	dsi->video_enabled = true;
+
+	dsi_set_ulps_auto(dsi, true);
+
 	dsi_bus_unlock(dsi);
 }
 
@@ -4195,11 +4250,11 @@ static void dsi_display_disable(struct omap_dss_device *dssdev)
 {
 	struct dsi_data *dsi = to_dsi_data(dssdev);
 
+	WARN_ON(!dsi_bus_is_locked(dsi));
+
 	DSSDBG("dsi_display_disable\n");
 
-	dsi_bus_lock(dsi);
 	_dsi_display_disable(dsi, true, false);
-	dsi_bus_unlock(dsi);
 }
 
 static int dsi_enable_te(struct dsi_data *dsi, bool enable)
@@ -4739,14 +4794,18 @@ static bool dsi_is_video_mode(struct omap_dss_device *dssdev)
 }
 
 static int dsi_set_config(struct omap_dss_device *dssdev,
-		const struct omap_dss_dsi_config *config)
+		const struct drm_display_mode *mode)
 {
 	struct dsi_data *dsi = to_dsi_data(dssdev);
 	struct dsi_clk_calc_ctx ctx;
-	struct omap_dss_dsi_config cfg = *config;
+	struct videomode vm;
+	struct omap_dss_dsi_config cfg = dsi->config;
 	bool ok;
 	int r;
 
+	drm_display_mode_to_videomode(mode, &vm);
+	cfg.vm = &vm;
+
 	mutex_lock(&dsi->lock);
 
 	cfg.mode = dsi->mode;
@@ -4909,9 +4968,15 @@ static ssize_t omap_dsi_host_transfer(struct mipi_dsi_host *host,
 	int r;
 
 	dsi_bus_lock(dsi);
-	dsi_set_ulps_auto(dsi, false);
-	r = _omap_dsi_host_transfer(dsi, msg);
-	dsi_set_ulps_auto(dsi, true);
+
+	if (dsi->video_enabled) {
+		dsi_set_ulps_auto(dsi, false);
+		r = _omap_dsi_host_transfer(dsi, msg);
+		dsi_set_ulps_auto(dsi, true);
+	} else {
+		r = -EIO;
+	}
+
 	dsi_bus_unlock(dsi);
 
 	return r;
@@ -4932,6 +4997,23 @@ static int dsi_get_clocks(struct dsi_data *dsi)
 	return 0;
 }
 
+static void dsi_set_timings(struct omap_dss_device *dssdev,
+			    const struct drm_display_mode *mode)
+{
+	DSSDBG("dsi_set_timings\n");
+	dsi_set_config(dssdev, mode);
+}
+
+static int dsi_check_timings(struct omap_dss_device *dssdev,
+			     struct drm_display_mode *mode)
+{
+	DSSDBG("dsi_check_timings\n");
+
+	/* TODO */
+
+	return 0;
+}
+
 static int dsi_connect(struct omap_dss_device *src,
 		       struct omap_dss_device *dst)
 {
@@ -4947,15 +5029,13 @@ static void dsi_disconnect(struct omap_dss_device *src,
 static const struct omap_dss_device_ops dsi_ops = {
 	.connect = dsi_connect,
 	.disconnect = dsi_disconnect,
-	.enable = dsi_display_enable,
-	.disable = dsi_display_disable,
+	.enable = dsi_enable_video_outputs,
+	.disable = dsi_disable_video_outputs,
 
-	.dsi = {
-		.set_config = dsi_set_config,
-
-		.enable_video_output = dsi_enable_video_output,
-		.disable_video_output = dsi_disable_video_output,
+	.check_timings = dsi_check_timings,
+	.set_timings = dsi_set_timings,
 
+	.dsi = {
 		.update = dsi_update_all,
 		.is_video_mode = dsi_is_video_mode,
 	},
@@ -5083,10 +5163,12 @@ static int omap_dsi_host_attach(struct mipi_dsi_host *host,
 	INIT_DEFERRABLE_WORK(&dsi->ulps_work,
 			     omap_dsi_ulps_work_callback);
 
-	dsi_bus_lock(dsi);
+	dsi->config.hs_clk_min = 150000000; // TODO: get from client?
+	dsi->config.hs_clk_max = client->hs_rate;
+	dsi->config.lp_clk_min = 7000000; // TODO: get from client?
+	dsi->config.lp_clk_max = client->lp_rate;
+
 	dsi->ulps_auto_idle = false;
-	dsi_set_ulps_auto(dsi, true);
-	dsi_bus_unlock(dsi);
 
 	return 0;
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c b/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c
index 72a7da7bfff1..18560ca4bbb0 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c
@@ -174,7 +174,6 @@ static const struct of_device_id omapdss_of_match[] __initconst = {
 };
 
 static const struct of_device_id omapdss_of_fixups_whitelist[] __initconst = {
-	{ .compatible = "panel-dsi-cm" },
 	{},
 };
 
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 4200611525d5..3ee3063b6a2d 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -278,14 +278,6 @@ struct omap_dss_writeback_info {
 struct omapdss_dsi_ops {
 	int (*update)(struct omap_dss_device *dssdev);
 	bool (*is_video_mode)(struct omap_dss_device *dssdev);
-
-	/* legacy API used by omapdss panels */
-	int (*set_config)(struct omap_dss_device *dssdev,
-			const struct omap_dss_dsi_config *cfg);
-
-	int (*enable_video_output)(struct omap_dss_device *dssdev, int channel);
-	void (*disable_video_output)(struct omap_dss_device *dssdev,
-			int channel);
 };
 
 struct omap_dss_device_ops {
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki


  parent reply	other threads:[~2020-11-24 12:47 UTC|newest]

Thread overview: 152+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-24 12:44 [PATCH v4 00/80] Convert DSI code to use drm_mipi_dsi and drm_panel Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 01/80] Revert "drm/omap: dss: Remove unused omap_dss_device operations" Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 02/80] drm/omap: drop unused dsi.configure_pins Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 03/80] drm/omap: dsi: use MIPI_DSI_FMT_* instead of OMAP_DSS_DSI_FMT_* Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 04/80] drm/omap: constify write buffers Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 05/80] drm/omap: dsi: add generic transfer function Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 06/80] drm/omap: panel-dsi-cm: convert to transfer API Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 07/80] drm/omap: dsi: unexport specific data transfer functions Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 08/80] drm/omap: dsi: drop virtual channel logic Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 09/80] drm/omap: dsi: simplify write function Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 10/80] drm/omap: dsi: simplify read functions Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 11/80] drm/omap: dsi: switch dsi_vc_send_long/short to mipi_dsi_msg Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 12/80] drm/omap: dsi: introduce mipi_dsi_host Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 13/80] drm/omap: panel-dsi-cm: use DSI helpers Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 14/80] drm/omap: dsi: request VC via mipi_dsi_attach Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 15/80] drm/omap: panel-dsi-cm: drop hardcoded VC Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 16/80] drm/omap: panel-dsi-cm: use common MIPI DCS 1.3 defines Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 17/80] drm/omap: dsi: drop unused memory_read() Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 18/80] drm/omap: dsi: drop unused get_te() Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 19/80] drm/omap: dsi: drop unused enable_te() Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 20/80] drm/omap: dsi: drop useless sync() Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 21/80] drm/omap: dsi: use pixel-format and mode from attach Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 22/80] drm/omap: panel-dsi-cm: use bulk regulator API Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 23/80] drm/omap: dsi: lp/hs switching support for transfer() Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 24/80] drm/omap: dsi: move TE GPIO handling into core Tomi Valkeinen
2021-02-08 17:55   ` Tony Lindgren
2021-02-11  7:34     ` Tomi Valkeinen
2021-02-11 17:35       ` Tony Lindgren
2021-02-17  7:42         ` Tomi Valkeinen
2021-02-18  5:57           ` Tony Lindgren
2021-02-22  8:47             ` Tomi Valkeinen
2021-02-25 12:46               ` Tony Lindgren
2021-02-26  9:04                 ` Tomi Valkeinen
2021-02-27  7:18                   ` Tony Lindgren
2020-11-24 12:44 ` [PATCH v4 25/80] drm/omap: dsi: drop custom enable_te() API Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 26/80] drm/omap: dsi: do bus locking in host driver Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 27/80] drm/omap: dsi: untangle ulps ops from enable/disable Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 28/80] drm/omap: dsi: do ULPS in host driver Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 29/80] drm/omap: dsi: move panel refresh function to host Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 30/80] drm/omap: dsi: Reverse direction of the DSS device enable/disable operations Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 31/80] drm/omap: dsi: drop custom panel capability support Tomi Valkeinen
2020-11-24 12:44 ` Tomi Valkeinen [this message]
2020-11-24 12:44 ` [PATCH v4 33/80] drm/omap: drop omapdss-boot-init Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 34/80] drm/omap: dsi: implement check timings Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 35/80] drm/omap: panel-dsi-cm: use DEVICE_ATTR_RO Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 36/80] drm/omap: panel-dsi-cm: support unbinding Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 37/80] drm/omap: panel-dsi-cm: fix remove() Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 38/80] drm/omap: remove global dss_device variable Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 39/80] drm/panel: Move OMAP's DSI command mode panel driver Tomi Valkeinen
2021-01-08 21:23   ` Dixit, Ashutosh
2021-01-08 21:54     ` Sebastian Reichel
2020-11-24 12:44 ` [PATCH v4 40/80] drm/omap: dsi: Register a drm_bridge Tomi Valkeinen
2020-11-24 12:44 ` [PATCH v4 41/80] drm/omap: remove legacy DSS device operations Tomi Valkeinen
2020-11-24 12:45 ` [PATCH v4 42/80] drm/omap: remove unused omap_connector Tomi Valkeinen
2020-11-24 12:45 ` [PATCH v4 43/80] drm/omap: simplify omap_display_id Tomi Valkeinen
2020-11-24 12:45 ` [PATCH v4 44/80] drm/omap: drop unused DSS next pointer Tomi Valkeinen
2020-11-24 12:45 ` [PATCH v4 45/80] drm/omap: drop DSS ops_flags Tomi Valkeinen
2020-11-24 12:45 ` [PATCH v4 46/80] drm/omap: drop dssdev display field Tomi Valkeinen
2020-11-24 12:45 ` [PATCH v4 47/80] drm/omap: simplify DSI manual update code Tomi Valkeinen
2020-11-24 12:45 ` [PATCH v4 48/80] drm/omap: dsi: simplify pin config Tomi Valkeinen
2020-11-24 12:45 ` [PATCH v4 49/80] ARM: omap2plus_defconfig: Update for moved DSI command mode panel Tomi Valkeinen
2020-12-01  8:46   ` Tony Lindgren
2020-11-24 12:45 ` [PATCH v4 50/80] drm/omap: squash omapdrm sub-modules into one Tomi Valkeinen
2020-12-14 12:53   ` Sebastian Reichel
2020-11-24 12:45 ` [PATCH v4 51/80] drm/omap: remove unused display.c Tomi Valkeinen
2020-12-14 12:53   ` Sebastian Reichel
2020-11-24 12:45 ` [PATCH v4 52/80] drm/omap: drop unused owner field Tomi Valkeinen
2020-12-14 12:53   ` Sebastian Reichel
2020-11-24 12:45 ` [PATCH v4 53/80] drm/omap: remove dispc_ops Tomi Valkeinen
2020-12-14 12:54   ` Sebastian Reichel
2020-11-24 12:45 ` [PATCH v4 54/80] drm/omap: remove dss_mgr_ops Tomi Valkeinen
2020-12-14 12:54   ` Sebastian Reichel
2020-11-24 12:45 ` [PATCH v4 55/80] drm/panel: panel-dsi-cm: use MIPI_DCS_GET_ERROR_COUNT_ON_DSI Tomi Valkeinen
2020-11-24 16:18   ` Sam Ravnborg
2020-11-24 16:26     ` Tomi Valkeinen
2020-11-24 16:38       ` Sam Ravnborg
2020-11-25  8:52         ` Tomi Valkeinen
2020-11-30  9:50   ` Laurent Pinchart
2020-12-14 12:54   ` Sebastian Reichel
2020-11-24 12:45 ` [PATCH v4 56/80] drm/panel: panel-dsi-cm: cleanup tear enable Tomi Valkeinen
2020-11-24 17:25   ` Sam Ravnborg
2020-11-30  9:51   ` Laurent Pinchart
2020-12-14 12:54   ` Sebastian Reichel
2020-11-24 12:45 ` [PATCH v4 57/80] ARM: dts: omap5: add address-cells & size-cells to dsi Tomi Valkeinen
2020-11-30  9:53   ` Laurent Pinchart
2020-12-01 10:39     ` Tomi Valkeinen
2020-12-01 10:47       ` Tony Lindgren
2020-12-14 12:55   ` Sebastian Reichel
2020-11-24 12:45 ` [PATCH v4 58/80] drm/omap: pll: fix iteration loop check Tomi Valkeinen
2020-11-30  9:54   ` Laurent Pinchart
2020-12-14 12:55   ` Sebastian Reichel
2020-11-24 12:45 ` [PATCH v4 59/80] drm/omap: dsi: set trans_mode according to client mode_flags Tomi Valkeinen
2020-11-30  9:55   ` Laurent Pinchart
2020-12-14 12:56   ` Sebastian Reichel
2020-11-24 12:45 ` [PATCH v4 60/80] drm/panel: panel-dsi-cm: set column & page at setup Tomi Valkeinen
2020-11-24 17:30   ` Sam Ravnborg
2020-11-24 18:19     ` Tomi Valkeinen
2020-11-30  9:56   ` Laurent Pinchart
2020-12-14 12:59   ` Sebastian Reichel
2020-11-24 12:45 ` [PATCH v4 61/80] drm/omap: dsi: send nop instead of page & column Tomi Valkeinen
2020-11-30  9:58   ` Laurent Pinchart
2020-12-01 10:59     ` Tomi Valkeinen
2020-11-24 12:45 ` [PATCH v4 62/80] drm/omap: dsi: simplify VC handling Tomi Valkeinen
2020-11-30 10:00   ` Laurent Pinchart
2020-12-01 11:11     ` Tomi Valkeinen
2020-11-24 12:45 ` [PATCH v4 63/80] drm/omap: dsi: drop useless channel checks Tomi Valkeinen
2020-12-01  0:14   ` Laurent Pinchart
2020-11-24 12:45 ` [PATCH v4 64/80] drm/omap: dsi: cleanup channel usages Tomi Valkeinen
2020-12-01  0:17   ` Laurent Pinchart
2020-12-01 11:23     ` Tomi Valkeinen
2020-11-24 12:45 ` [PATCH v4 65/80] drm/omap: dsi: skip dsi_vc_enable_hs when already in correct mode Tomi Valkeinen
2020-12-01  0:18   ` Laurent Pinchart
2020-11-24 12:45 ` [PATCH v4 66/80] drm/omap: dsi: set LP/HS before update Tomi Valkeinen
2020-12-01  0:20   ` Laurent Pinchart
2020-11-24 12:45 ` [PATCH v4 67/80] drm/omap: dsi: use separate VCs for cmd and video Tomi Valkeinen
2020-12-01  0:21   ` Laurent Pinchart
2020-11-24 12:45 ` [PATCH v4 68/80] drm/panel: panel-dsi-cm: remove extra 'if' Tomi Valkeinen
2020-11-24 17:34   ` Sam Ravnborg
2020-12-01  0:22   ` Laurent Pinchart
2020-12-01 11:26     ` Tomi Valkeinen
2020-12-02 20:08   ` kernel test robot
2020-11-24 12:45 ` [PATCH v4 69/80] drm/panel: panel-dsi-cm: add panel database to driver Tomi Valkeinen
2020-11-24 17:35   ` Sam Ravnborg
2020-12-01  0:23   ` Laurent Pinchart
2020-12-01 11:29     ` Tomi Valkeinen
2020-11-24 12:45 ` [PATCH v4 70/80] drm/panel: panel-dsi-cm: drop unneeded includes Tomi Valkeinen
2020-11-24 17:36   ` Sam Ravnborg
2020-12-01  0:27   ` Laurent Pinchart
2020-12-01 11:33     ` Tomi Valkeinen
2020-11-24 12:45 ` [PATCH v4 71/80] drm/omap: dsi: move structs & defines to dsi.h Tomi Valkeinen
2020-12-01  0:31   ` Laurent Pinchart
2020-12-01 11:37     ` Tomi Valkeinen
2020-11-24 12:45 ` [PATCH v4 72/80] drm/omap: dsi: move enable/disable to bridge enable/disable Tomi Valkeinen
2020-12-01  0:32   ` Laurent Pinchart
2020-11-24 12:45 ` [PATCH v4 73/80] drm/omap: dsi: display_enable cleanup Tomi Valkeinen
2020-12-01  0:32   ` Laurent Pinchart
2020-11-24 12:45 ` [PATCH v4 74/80] drm/omap: dsi: display_disable cleanup Tomi Valkeinen
2020-12-01  0:33   ` Laurent Pinchart
2020-11-24 12:45 ` [PATCH v4 75/80] drm/omap: dsi: rename dsi_display_* functions Tomi Valkeinen
2020-12-01  0:34   ` Laurent Pinchart
2020-11-24 12:45 ` [PATCH v4 76/80] drm/omap: dsi: cleanup initial vc setup Tomi Valkeinen
2020-12-01  0:36   ` Laurent Pinchart
2020-12-01 11:51     ` Tomi Valkeinen
2020-11-24 12:45 ` [PATCH v4 77/80] drm/omap: dsi: split video mode enable/disable into separate func Tomi Valkeinen
2020-12-01  0:37   ` Laurent Pinchart
2020-11-24 12:45 ` [PATCH v4 78/80] drm/omap: dsi: fix and cleanup ddr_clk_always_on Tomi Valkeinen
2020-12-01  0:38   ` Laurent Pinchart
2020-11-24 12:45 ` [PATCH v4 79/80] drm/omap: dsi: remove ulps support Tomi Valkeinen
2020-12-01  0:39   ` Laurent Pinchart
2020-11-24 12:45 ` [PATCH v4 80/80] drm/omap: dsi: fix DCS_CMD_ENABLE Tomi Valkeinen
2020-12-01  0:40   ` Laurent Pinchart
2020-11-30  9:39 ` [PATCH v4 81/80] drm/omap: dsi: allow DSI commands to be sent early Tomi Valkeinen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201124124538.660710-33-tomi.valkeinen@ti.com \
    --to=tomi.valkeinen@ti.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hns@goldelico.com \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-omap@vger.kernel.org \
    --cc=nikhil.nd@ti.com \
    --cc=nsekhar@ti.com \
    --cc=sebastian.reichel@collabora.com \
    --cc=sre@kernel.org \
    --cc=tony@atomide.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).