All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: Sebastian Reichel <sre@kernel.org>,
	Nikhil Devshatwar <nikhil.nd@ti.com>,
	linux-omap@vger.kernel.org, dri-devel@lists.freedesktop.org,
	Sekhar Nori <nsekhar@ti.com>, Tony Lindgren <tony@atomide.com>,
	"H . Nikolaus Schaller" <hns@goldelico.com>,
	Sebastian Reichel <sebastian.reichel@collabora.com>
Subject: Re: [PATCH v3 29/56] drm/omap: dsi: do ULPS in host driver
Date: Mon, 9 Nov 2020 12:03:15 +0200	[thread overview]
Message-ID: <20201109100315.GZ6029@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20201105120333.947408-30-tomi.valkeinen@ti.com>

Hi Tomi and Sebastian,

Thank you for the patch.

On Thu, Nov 05, 2020 at 02:03:06PM +0200, Tomi Valkeinen wrote:
> From: Sebastian Reichel <sebastian.reichel@collabora.com>
> 
> Move ULPS handling into the DSI host controller, so that we
> no longer need a custom API for the DSI client.
> 
> 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   | 273 +-----------------
>  drivers/gpu/drm/omapdrm/dss/dsi.c             |  63 +++-
>  drivers/gpu/drm/omapdrm/dss/omapdss.h         |   2 -
>  3 files changed, 62 insertions(+), 276 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index 78247dcb1848..030a8fa140db 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -16,7 +16,6 @@
>  #include <linux/module.h>
>  #include <linux/sched/signal.h>
>  #include <linux/slab.h>
> -#include <linux/workqueue.h>
>  #include <linux/of_device.h>
>  #include <linux/regulator/consumer.h>
>  
> @@ -69,21 +68,13 @@ struct panel_drv_data {
>  
>  	bool intro_printed;
>  
> -	struct workqueue_struct *workqueue;
> -
>  	bool ulps_enabled;
> -	unsigned int ulps_timeout;
> -	struct delayed_work ulps_work;
>  };
>  
>  #define to_panel_data(p) container_of(p, struct panel_drv_data, dssdev)
>  
>  static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable);
>  
> -static int dsicm_panel_reset(struct panel_drv_data *ddata);
> -
> -static void dsicm_ulps_work(struct work_struct *work);
> -
>  static void dsicm_bl_power(struct panel_drv_data *ddata, bool enable)
>  {
>  	struct backlight_device *backlight;
> @@ -207,94 +198,6 @@ static int dsicm_set_update_window(struct panel_drv_data *ddata,
>  	return 0;
>  }
>  
> -static void dsicm_queue_ulps_work(struct panel_drv_data *ddata)
> -{
> -	if (ddata->ulps_timeout > 0)
> -		queue_delayed_work(ddata->workqueue, &ddata->ulps_work,
> -				msecs_to_jiffies(ddata->ulps_timeout));
> -}
> -
> -static void dsicm_cancel_ulps_work(struct panel_drv_data *ddata)
> -{
> -	cancel_delayed_work(&ddata->ulps_work);
> -}
> -
> -static int dsicm_enter_ulps(struct panel_drv_data *ddata)
> -{
> -	struct omap_dss_device *src = ddata->src;
> -	int r;
> -
> -	if (ddata->ulps_enabled)
> -		return 0;
> -
> -	dsicm_cancel_ulps_work(ddata);
> -
> -	r = _dsicm_enable_te(ddata, false);
> -	if (r)
> -		goto err;
> -
> -	src->ops->dsi.ulps(src, true);
> -
> -	ddata->ulps_enabled = true;
> -
> -	return 0;
> -
> -err:
> -	dev_err(&ddata->dsi->dev, "enter ULPS failed");
> -	dsicm_panel_reset(ddata);
> -
> -	ddata->ulps_enabled = false;
> -
> -	dsicm_queue_ulps_work(ddata);
> -
> -	return r;
> -}
> -
> -static int dsicm_exit_ulps(struct panel_drv_data *ddata)
> -{
> -	struct omap_dss_device *src = ddata->src;
> -	int r;
> -
> -	if (!ddata->ulps_enabled)
> -		return 0;
> -
> -	src->ops->dsi.ulps(src, false);
> -	ddata->dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
> -
> -	r = _dsicm_enable_te(ddata, ddata->te_enabled);
> -	if (r) {
> -		dev_err(&ddata->dsi->dev, "failed to re-enable TE");
> -		goto err2;
> -	}
> -
> -	dsicm_queue_ulps_work(ddata);
> -
> -	ddata->ulps_enabled = false;
> -
> -	return 0;
> -
> -err2:
> -	dev_err(&ddata->dsi->dev, "failed to exit ULPS");
> -
> -	r = dsicm_panel_reset(ddata);
> -	if (!r)
> -		ddata->ulps_enabled = false;
> -
> -	dsicm_queue_ulps_work(ddata);
> -
> -	return r;
> -}
> -
> -static int dsicm_wake_up(struct panel_drv_data *ddata)
> -{
> -	if (ddata->ulps_enabled)
> -		return dsicm_exit_ulps(ddata);
> -
> -	dsicm_cancel_ulps_work(ddata);
> -	dsicm_queue_ulps_work(ddata);
> -	return 0;
> -}
> -
>  static int dsicm_bl_update_status(struct backlight_device *dev)
>  {
>  	struct panel_drv_data *ddata = dev_get_drvdata(&dev->dev);
> @@ -312,11 +215,8 @@ static int dsicm_bl_update_status(struct backlight_device *dev)
>  	mutex_lock(&ddata->lock);
>  
>  	if (ddata->enabled) {
> -		r = dsicm_wake_up(ddata);
> -		if (!r) {
> -			r = dsicm_dcs_write_1(ddata,
> -				MIPI_DCS_SET_DISPLAY_BRIGHTNESS, level);
> -		}
> +		r = dsicm_dcs_write_1(ddata, MIPI_DCS_SET_DISPLAY_BRIGHTNESS,
> +				      level);
>  	}
>  
>  	mutex_unlock(&ddata->lock);
> @@ -343,18 +243,12 @@ static ssize_t dsicm_num_errors_show(struct device *dev,
>  {
>  	struct panel_drv_data *ddata = dev_get_drvdata(dev);
>  	u8 errors = 0;
> -	int r;
> +	int r = -ENODEV;
>  
>  	mutex_lock(&ddata->lock);
>  
> -	if (ddata->enabled) {
> -		r = dsicm_wake_up(ddata);
> -		if (!r)
> -			r = dsicm_dcs_read_1(ddata, DCS_READ_NUM_ERRORS,
> -					&errors);
> -	} else {
> -		r = -ENODEV;
> -	}
> +	if (ddata->enabled)
> +		r = dsicm_dcs_read_1(ddata, DCS_READ_NUM_ERRORS, &errors);
>  
>  	mutex_unlock(&ddata->lock);
>  
> @@ -369,17 +263,12 @@ static ssize_t dsicm_hw_revision_show(struct device *dev,
>  {
>  	struct panel_drv_data *ddata = dev_get_drvdata(dev);
>  	u8 id1, id2, id3;
> -	int r;
> +	int r = -ENODEV;
>  
>  	mutex_lock(&ddata->lock);
>  
> -	if (ddata->enabled) {
> -		r = dsicm_wake_up(ddata);
> -		if (!r)
> -			r = dsicm_get_id(ddata, &id1, &id2, &id3);
> -	} else {
> -		r = -ENODEV;
> -	}
> +	if (ddata->enabled)
> +		r = dsicm_get_id(ddata, &id1, &id2, &id3);
>  
>  	mutex_unlock(&ddata->lock);
>  
> @@ -389,103 +278,12 @@ static ssize_t dsicm_hw_revision_show(struct device *dev,
>  	return snprintf(buf, PAGE_SIZE, "%02x.%02x.%02x\n", id1, id2, id3);
>  }
>  
> -static ssize_t dsicm_store_ulps(struct device *dev,
> -		struct device_attribute *attr,
> -		const char *buf, size_t count)
> -{
> -	struct panel_drv_data *ddata = dev_get_drvdata(dev);
> -	unsigned long t;
> -	int r;
> -
> -	r = kstrtoul(buf, 0, &t);
> -	if (r)
> -		return r;
> -
> -	mutex_lock(&ddata->lock);
> -
> -	if (ddata->enabled) {
> -		if (t)
> -			r = dsicm_enter_ulps(ddata);
> -		else
> -			r = dsicm_wake_up(ddata);
> -	}
> -
> -	mutex_unlock(&ddata->lock);
> -
> -	if (r)
> -		return r;
> -
> -	return count;
> -}
> -
> -static ssize_t dsicm_show_ulps(struct device *dev,
> -		struct device_attribute *attr,
> -		char *buf)
> -{
> -	struct panel_drv_data *ddata = dev_get_drvdata(dev);
> -	unsigned int t;
> -
> -	mutex_lock(&ddata->lock);
> -	t = ddata->ulps_enabled;
> -	mutex_unlock(&ddata->lock);
> -
> -	return snprintf(buf, PAGE_SIZE, "%u\n", t);
> -}
> -
> -static ssize_t dsicm_store_ulps_timeout(struct device *dev,
> -		struct device_attribute *attr,
> -		const char *buf, size_t count)
> -{
> -	struct panel_drv_data *ddata = dev_get_drvdata(dev);
> -	unsigned long t;
> -	int r;
> -
> -	r = kstrtoul(buf, 0, &t);
> -	if (r)
> -		return r;
> -
> -	mutex_lock(&ddata->lock);
> -	ddata->ulps_timeout = t;
> -
> -	if (ddata->enabled) {
> -		/* dsicm_wake_up will restart the timer */
> -		r = dsicm_wake_up(ddata);
> -	}
> -
> -	mutex_unlock(&ddata->lock);
> -
> -	if (r)
> -		return r;
> -
> -	return count;
> -}
> -
> -static ssize_t dsicm_show_ulps_timeout(struct device *dev,
> -		struct device_attribute *attr,
> -		char *buf)
> -{
> -	struct panel_drv_data *ddata = dev_get_drvdata(dev);
> -	unsigned int t;
> -
> -	mutex_lock(&ddata->lock);
> -	t = ddata->ulps_timeout;
> -	mutex_unlock(&ddata->lock);
> -
> -	return snprintf(buf, PAGE_SIZE, "%u\n", t);
> -}
> -
>  static DEVICE_ATTR(num_dsi_errors, S_IRUGO, dsicm_num_errors_show, NULL);
>  static DEVICE_ATTR(hw_revision, S_IRUGO, dsicm_hw_revision_show, NULL);
> -static DEVICE_ATTR(ulps, S_IRUGO | S_IWUSR,
> -		dsicm_show_ulps, dsicm_store_ulps);
> -static DEVICE_ATTR(ulps_timeout, S_IRUGO | S_IWUSR,
> -		dsicm_show_ulps_timeout, dsicm_store_ulps_timeout);
>  
>  static struct attribute *dsicm_attrs[] = {
>  	&dev_attr_num_dsi_errors.attr,
>  	&dev_attr_hw_revision.attr,
> -	&dev_attr_ulps.attr,
> -	&dev_attr_ulps_timeout.attr,
>  	NULL,
>  };
>  
> @@ -621,15 +419,6 @@ static void dsicm_power_off(struct panel_drv_data *ddata)
>  	ddata->enabled = false;
>  }
>  
> -static int dsicm_panel_reset(struct panel_drv_data *ddata)
> -{
> -	dev_err(&ddata->dsi->dev, "performing LCD reset\n");
> -
> -	dsicm_power_off(ddata);
> -	dsicm_hw_reset(ddata);
> -	return dsicm_power_on(ddata);
> -}
> -
>  static int dsicm_connect(struct omap_dss_device *src,
>  			 struct omap_dss_device *dst)
>  {
> @@ -671,17 +460,12 @@ static void dsicm_enable(struct omap_dss_device *dssdev)
>  static void dsicm_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	int r;
>  
>  	dsicm_bl_power(ddata, false);
>  
>  	mutex_lock(&ddata->lock);
>  
> -	dsicm_cancel_ulps_work(ddata);
> -
> -	r = dsicm_wake_up(ddata);
> -	if (!r)
> -		dsicm_power_off(ddata);
> +	dsicm_power_off(ddata);
>  
>  	mutex_unlock(&ddata->lock);
>  }
> @@ -705,10 +489,6 @@ static int dsicm_update(struct omap_dss_device *dssdev,
>  
>  	mutex_lock(&ddata->lock);
>  
> -	r = dsicm_wake_up(ddata);
> -	if (r)
> -		goto err;
> -
>  	if (!ddata->enabled) {
>  		r = 0;
>  		goto err;
> @@ -748,24 +528,6 @@ static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
>  	return r;
>  }
>  
> -static void dsicm_ulps_work(struct work_struct *work)
> -{
> -	struct panel_drv_data *ddata = container_of(work, struct panel_drv_data,
> -			ulps_work.work);
> -	struct omap_dss_device *dssdev = &ddata->dssdev;
> -
> -	mutex_lock(&ddata->lock);
> -
> -	if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE || !ddata->enabled) {
> -		mutex_unlock(&ddata->lock);
> -		return;
> -	}
> -
> -	dsicm_enter_ulps(ddata);
> -
> -	mutex_unlock(&ddata->lock);
> -}
> -
>  static int dsicm_get_modes(struct omap_dss_device *dssdev,
>  			   struct drm_connector *connector)
>  {
> @@ -863,7 +625,7 @@ static int dsicm_probe_of(struct mipi_dsi_device *dsi)
>  	else
>  		ddata->use_dsi_backlight = true;
>  
> -	/* TODO: ulps */
> +	/* TODO: ulps_enabled */
>  
>  	return 0;
>  }
> @@ -911,13 +673,6 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
>  
>  	mutex_init(&ddata->lock);
>  
> -	ddata->workqueue = create_singlethread_workqueue("dsicm_wq");
> -	if (!ddata->workqueue) {
> -		r = -ENOMEM;
> -		goto err_reg;
> -	}
> -	INIT_DELAYED_WORK(&ddata->ulps_work, dsicm_ulps_work);
> -
>  	dsicm_hw_reset(ddata);
>  
>  	if (ddata->use_dsi_backlight) {
> @@ -948,6 +703,9 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
>  	dsi->hs_rate = 300000000;
>  	dsi->lp_rate = 10000000;
>  
> +	if (ddata->ulps_enabled)
> +		dsi->mode_flags |= MIPI_DSI_MODE_ULPS_IDLE;
> +
>  	r = mipi_dsi_attach(dsi);
>  	if (r < 0)
>  		goto err_dsi_attach;
> @@ -957,8 +715,6 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
>  err_dsi_attach:
>  	sysfs_remove_group(&dsi->dev.kobj, &dsicm_attr_group);
>  err_bl:
> -	destroy_workqueue(ddata->workqueue);
> -err_reg:
>  	if (ddata->extbldev)
>  		put_device(&ddata->extbldev->dev);
>  
> @@ -985,9 +741,6 @@ static int __exit dsicm_remove(struct mipi_dsi_device *dsi)
>  	if (ddata->extbldev)
>  		put_device(&ddata->extbldev->dev);
>  
> -	dsicm_cancel_ulps_work(ddata);
> -	destroy_workqueue(ddata->workqueue);
> -
>  	/* reset, to be sure that the panel is in a valid state */
>  	dsicm_hw_reset(ddata);
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index 937362ade4b4..0f264654792d 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -207,6 +207,8 @@ struct dsi_reg { u16 module; u16 idx; };
>  typedef void (*omap_dsi_isr_t) (void *arg, u32 mask);
>  struct dsi_data;
>  
> +static void dsi_set_ulps_auto(struct dsi_data *dsi, bool enable);
> +

Would it be possible to avoid forward declarations by reordering
functions ?

This patch removes the ability for userspace to configure the ULPS
timeout (and thus, if I understand correctly, to disable the auto-ULPS
feature). I understand the simplification is needed, but I can't tell if
the feature removal could have an adverse effect.

Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

>  static int dsi_display_init_dispc(struct dsi_data *dsi);
>  static void dsi_display_uninit_dispc(struct dsi_data *dsi);
>  
> @@ -377,6 +379,9 @@ struct dsi_data {
>  
>  	bool te_enabled;
>  	bool ulps_enabled;
> +	bool ulps_auto_idle;
> +
> +	struct delayed_work ulps_work;
>  
>  	void (*framedone_callback)(int, void *);
>  	void *framedone_data;
> @@ -3794,6 +3799,7 @@ static void dsi_handle_framedone(struct dsi_data *dsi, int error)
>  		REG_FLD_MOD(dsi, DSI_TIMING2, 1, 15, 15); /* LP_RX_TO */
>  	}
>  
> +	dsi_set_ulps_auto(dsi, true);
>  	dsi_bus_unlock(dsi);
>  
>  	dsi->framedone_callback(error, dsi->framedone_data);
> @@ -3856,6 +3862,7 @@ static int dsi_update(struct omap_dss_device *dssdev, int channel,
>  	struct dsi_data *dsi = to_dsi_data(dssdev);
>  
>  	dsi_bus_lock(dsi);
> +	dsi_set_ulps_auto(dsi, false);
>  
>  	dsi->update_channel = channel;
>  	dsi->framedone_callback = callback;
> @@ -4119,18 +4126,6 @@ static void dsi_display_disable(struct omap_dss_device *dssdev)
>  	dsi_display_ulps_disable(dsi, true, false);
>  }
>  
> -static void dsi_ulps(struct omap_dss_device *dssdev, bool enable)
> -{
> -	struct dsi_data *dsi = to_dsi_data(dssdev);
> -
> -	DSSDBG("dsi_ulps\n");
> -
> -	if (enable)
> -		dsi_display_ulps_disable(dsi, false, true);
> -	else
> -		dsi_display_ulps_enable(dsi);
> -}
> -
>  static int dsi_enable_te(struct dsi_data *dsi, bool enable)
>  {
>  	dsi->te_enabled = enable;
> @@ -4145,6 +4140,40 @@ static int dsi_enable_te(struct dsi_data *dsi, bool enable)
>  	return 0;
>  }
>  
> +static void omap_dsi_ulps_work_callback(struct work_struct *work)
> +{
> +	struct dsi_data *dsi = container_of(work, struct dsi_data,
> +					    ulps_work.work);
> +
> +	dsi_bus_lock(dsi);
> +
> +	dsi_enable_te(dsi, false);
> +
> +	dsi_display_ulps_disable(dsi, false, true);
> +
> +	dsi_bus_unlock(dsi);
> +}
> +
> +static void dsi_set_ulps_auto(struct dsi_data *dsi, bool enable)
> +{
> +	WARN_ON(!dsi_bus_is_locked(dsi));
> +
> +	if (!dsi->ulps_auto_idle)
> +		return;
> +
> +	if (enable) {
> +		schedule_delayed_work(&dsi->ulps_work, msecs_to_jiffies(250));
> +	} else {
> +		cancel_delayed_work_sync(&dsi->ulps_work);
> +
> +		if (!dsi->ulps_enabled)
> +			return;
> +
> +		dsi_display_ulps_enable(dsi);
> +		dsi_enable_te(dsi, true);
> +	}
> +}
> +
>  #ifdef PRINT_VERBOSE_VM_TIMINGS
>  static void print_dsi_vm(const char *str,
>  		const struct omap_dss_dsi_videomode_timings *t)
> @@ -4796,7 +4825,9 @@ 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);
>  	dsi_bus_unlock(dsi);
>  
>  	return r;
> @@ -4836,8 +4867,6 @@ static const struct omap_dss_device_ops dsi_ops = {
>  	.disable = dsi_display_disable,
>  
>  	.dsi = {
> -		.ulps = dsi_ulps,
> -
>  		.set_config = dsi_set_config,
>  
>  		.enable_video_output = dsi_enable_video_output,
> @@ -4959,6 +4988,12 @@ static int omap_dsi_host_attach(struct mipi_dsi_host *host,
>  	dsi->vc[channel].dest = client;
>  	dsi->pix_fmt = client->format;
>  
> +	INIT_DEFERRABLE_WORK(&dsi->ulps_work,
> +			     omap_dsi_ulps_work_callback);
> +
> +	dsi->ulps_auto_idle = !!(client->mode_flags & MIPI_DSI_MODE_ULPS_IDLE);
> +	dsi_set_ulps_auto(dsi, true);
> +
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 0d82ba34ca89..524cb87cd9ea 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -282,8 +282,6 @@ struct omap_dss_writeback_info {
>  
>  struct omapdss_dsi_ops {
>  	/* bus configuration */
> -	void (*ulps)(struct omap_dss_device *dssdev, bool enable);
> -
>  	int (*set_config)(struct omap_dss_device *dssdev,
>  			const struct omap_dss_dsi_config *cfg);
>  

-- 
Regards,

Laurent Pinchart

WARNING: multiple messages have this Message-ID (diff)
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: Tony Lindgren <tony@atomide.com>,
	"H . Nikolaus Schaller" <hns@goldelico.com>,
	Sekhar Nori <nsekhar@ti.com>, Sebastian Reichel <sre@kernel.org>,
	dri-devel@lists.freedesktop.org,
	Sebastian Reichel <sebastian.reichel@collabora.com>,
	linux-omap@vger.kernel.org, Nikhil Devshatwar <nikhil.nd@ti.com>
Subject: Re: [PATCH v3 29/56] drm/omap: dsi: do ULPS in host driver
Date: Mon, 9 Nov 2020 12:03:15 +0200	[thread overview]
Message-ID: <20201109100315.GZ6029@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20201105120333.947408-30-tomi.valkeinen@ti.com>

Hi Tomi and Sebastian,

Thank you for the patch.

On Thu, Nov 05, 2020 at 02:03:06PM +0200, Tomi Valkeinen wrote:
> From: Sebastian Reichel <sebastian.reichel@collabora.com>
> 
> Move ULPS handling into the DSI host controller, so that we
> no longer need a custom API for the DSI client.
> 
> 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   | 273 +-----------------
>  drivers/gpu/drm/omapdrm/dss/dsi.c             |  63 +++-
>  drivers/gpu/drm/omapdrm/dss/omapdss.h         |   2 -
>  3 files changed, 62 insertions(+), 276 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index 78247dcb1848..030a8fa140db 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -16,7 +16,6 @@
>  #include <linux/module.h>
>  #include <linux/sched/signal.h>
>  #include <linux/slab.h>
> -#include <linux/workqueue.h>
>  #include <linux/of_device.h>
>  #include <linux/regulator/consumer.h>
>  
> @@ -69,21 +68,13 @@ struct panel_drv_data {
>  
>  	bool intro_printed;
>  
> -	struct workqueue_struct *workqueue;
> -
>  	bool ulps_enabled;
> -	unsigned int ulps_timeout;
> -	struct delayed_work ulps_work;
>  };
>  
>  #define to_panel_data(p) container_of(p, struct panel_drv_data, dssdev)
>  
>  static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable);
>  
> -static int dsicm_panel_reset(struct panel_drv_data *ddata);
> -
> -static void dsicm_ulps_work(struct work_struct *work);
> -
>  static void dsicm_bl_power(struct panel_drv_data *ddata, bool enable)
>  {
>  	struct backlight_device *backlight;
> @@ -207,94 +198,6 @@ static int dsicm_set_update_window(struct panel_drv_data *ddata,
>  	return 0;
>  }
>  
> -static void dsicm_queue_ulps_work(struct panel_drv_data *ddata)
> -{
> -	if (ddata->ulps_timeout > 0)
> -		queue_delayed_work(ddata->workqueue, &ddata->ulps_work,
> -				msecs_to_jiffies(ddata->ulps_timeout));
> -}
> -
> -static void dsicm_cancel_ulps_work(struct panel_drv_data *ddata)
> -{
> -	cancel_delayed_work(&ddata->ulps_work);
> -}
> -
> -static int dsicm_enter_ulps(struct panel_drv_data *ddata)
> -{
> -	struct omap_dss_device *src = ddata->src;
> -	int r;
> -
> -	if (ddata->ulps_enabled)
> -		return 0;
> -
> -	dsicm_cancel_ulps_work(ddata);
> -
> -	r = _dsicm_enable_te(ddata, false);
> -	if (r)
> -		goto err;
> -
> -	src->ops->dsi.ulps(src, true);
> -
> -	ddata->ulps_enabled = true;
> -
> -	return 0;
> -
> -err:
> -	dev_err(&ddata->dsi->dev, "enter ULPS failed");
> -	dsicm_panel_reset(ddata);
> -
> -	ddata->ulps_enabled = false;
> -
> -	dsicm_queue_ulps_work(ddata);
> -
> -	return r;
> -}
> -
> -static int dsicm_exit_ulps(struct panel_drv_data *ddata)
> -{
> -	struct omap_dss_device *src = ddata->src;
> -	int r;
> -
> -	if (!ddata->ulps_enabled)
> -		return 0;
> -
> -	src->ops->dsi.ulps(src, false);
> -	ddata->dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
> -
> -	r = _dsicm_enable_te(ddata, ddata->te_enabled);
> -	if (r) {
> -		dev_err(&ddata->dsi->dev, "failed to re-enable TE");
> -		goto err2;
> -	}
> -
> -	dsicm_queue_ulps_work(ddata);
> -
> -	ddata->ulps_enabled = false;
> -
> -	return 0;
> -
> -err2:
> -	dev_err(&ddata->dsi->dev, "failed to exit ULPS");
> -
> -	r = dsicm_panel_reset(ddata);
> -	if (!r)
> -		ddata->ulps_enabled = false;
> -
> -	dsicm_queue_ulps_work(ddata);
> -
> -	return r;
> -}
> -
> -static int dsicm_wake_up(struct panel_drv_data *ddata)
> -{
> -	if (ddata->ulps_enabled)
> -		return dsicm_exit_ulps(ddata);
> -
> -	dsicm_cancel_ulps_work(ddata);
> -	dsicm_queue_ulps_work(ddata);
> -	return 0;
> -}
> -
>  static int dsicm_bl_update_status(struct backlight_device *dev)
>  {
>  	struct panel_drv_data *ddata = dev_get_drvdata(&dev->dev);
> @@ -312,11 +215,8 @@ static int dsicm_bl_update_status(struct backlight_device *dev)
>  	mutex_lock(&ddata->lock);
>  
>  	if (ddata->enabled) {
> -		r = dsicm_wake_up(ddata);
> -		if (!r) {
> -			r = dsicm_dcs_write_1(ddata,
> -				MIPI_DCS_SET_DISPLAY_BRIGHTNESS, level);
> -		}
> +		r = dsicm_dcs_write_1(ddata, MIPI_DCS_SET_DISPLAY_BRIGHTNESS,
> +				      level);
>  	}
>  
>  	mutex_unlock(&ddata->lock);
> @@ -343,18 +243,12 @@ static ssize_t dsicm_num_errors_show(struct device *dev,
>  {
>  	struct panel_drv_data *ddata = dev_get_drvdata(dev);
>  	u8 errors = 0;
> -	int r;
> +	int r = -ENODEV;
>  
>  	mutex_lock(&ddata->lock);
>  
> -	if (ddata->enabled) {
> -		r = dsicm_wake_up(ddata);
> -		if (!r)
> -			r = dsicm_dcs_read_1(ddata, DCS_READ_NUM_ERRORS,
> -					&errors);
> -	} else {
> -		r = -ENODEV;
> -	}
> +	if (ddata->enabled)
> +		r = dsicm_dcs_read_1(ddata, DCS_READ_NUM_ERRORS, &errors);
>  
>  	mutex_unlock(&ddata->lock);
>  
> @@ -369,17 +263,12 @@ static ssize_t dsicm_hw_revision_show(struct device *dev,
>  {
>  	struct panel_drv_data *ddata = dev_get_drvdata(dev);
>  	u8 id1, id2, id3;
> -	int r;
> +	int r = -ENODEV;
>  
>  	mutex_lock(&ddata->lock);
>  
> -	if (ddata->enabled) {
> -		r = dsicm_wake_up(ddata);
> -		if (!r)
> -			r = dsicm_get_id(ddata, &id1, &id2, &id3);
> -	} else {
> -		r = -ENODEV;
> -	}
> +	if (ddata->enabled)
> +		r = dsicm_get_id(ddata, &id1, &id2, &id3);
>  
>  	mutex_unlock(&ddata->lock);
>  
> @@ -389,103 +278,12 @@ static ssize_t dsicm_hw_revision_show(struct device *dev,
>  	return snprintf(buf, PAGE_SIZE, "%02x.%02x.%02x\n", id1, id2, id3);
>  }
>  
> -static ssize_t dsicm_store_ulps(struct device *dev,
> -		struct device_attribute *attr,
> -		const char *buf, size_t count)
> -{
> -	struct panel_drv_data *ddata = dev_get_drvdata(dev);
> -	unsigned long t;
> -	int r;
> -
> -	r = kstrtoul(buf, 0, &t);
> -	if (r)
> -		return r;
> -
> -	mutex_lock(&ddata->lock);
> -
> -	if (ddata->enabled) {
> -		if (t)
> -			r = dsicm_enter_ulps(ddata);
> -		else
> -			r = dsicm_wake_up(ddata);
> -	}
> -
> -	mutex_unlock(&ddata->lock);
> -
> -	if (r)
> -		return r;
> -
> -	return count;
> -}
> -
> -static ssize_t dsicm_show_ulps(struct device *dev,
> -		struct device_attribute *attr,
> -		char *buf)
> -{
> -	struct panel_drv_data *ddata = dev_get_drvdata(dev);
> -	unsigned int t;
> -
> -	mutex_lock(&ddata->lock);
> -	t = ddata->ulps_enabled;
> -	mutex_unlock(&ddata->lock);
> -
> -	return snprintf(buf, PAGE_SIZE, "%u\n", t);
> -}
> -
> -static ssize_t dsicm_store_ulps_timeout(struct device *dev,
> -		struct device_attribute *attr,
> -		const char *buf, size_t count)
> -{
> -	struct panel_drv_data *ddata = dev_get_drvdata(dev);
> -	unsigned long t;
> -	int r;
> -
> -	r = kstrtoul(buf, 0, &t);
> -	if (r)
> -		return r;
> -
> -	mutex_lock(&ddata->lock);
> -	ddata->ulps_timeout = t;
> -
> -	if (ddata->enabled) {
> -		/* dsicm_wake_up will restart the timer */
> -		r = dsicm_wake_up(ddata);
> -	}
> -
> -	mutex_unlock(&ddata->lock);
> -
> -	if (r)
> -		return r;
> -
> -	return count;
> -}
> -
> -static ssize_t dsicm_show_ulps_timeout(struct device *dev,
> -		struct device_attribute *attr,
> -		char *buf)
> -{
> -	struct panel_drv_data *ddata = dev_get_drvdata(dev);
> -	unsigned int t;
> -
> -	mutex_lock(&ddata->lock);
> -	t = ddata->ulps_timeout;
> -	mutex_unlock(&ddata->lock);
> -
> -	return snprintf(buf, PAGE_SIZE, "%u\n", t);
> -}
> -
>  static DEVICE_ATTR(num_dsi_errors, S_IRUGO, dsicm_num_errors_show, NULL);
>  static DEVICE_ATTR(hw_revision, S_IRUGO, dsicm_hw_revision_show, NULL);
> -static DEVICE_ATTR(ulps, S_IRUGO | S_IWUSR,
> -		dsicm_show_ulps, dsicm_store_ulps);
> -static DEVICE_ATTR(ulps_timeout, S_IRUGO | S_IWUSR,
> -		dsicm_show_ulps_timeout, dsicm_store_ulps_timeout);
>  
>  static struct attribute *dsicm_attrs[] = {
>  	&dev_attr_num_dsi_errors.attr,
>  	&dev_attr_hw_revision.attr,
> -	&dev_attr_ulps.attr,
> -	&dev_attr_ulps_timeout.attr,
>  	NULL,
>  };
>  
> @@ -621,15 +419,6 @@ static void dsicm_power_off(struct panel_drv_data *ddata)
>  	ddata->enabled = false;
>  }
>  
> -static int dsicm_panel_reset(struct panel_drv_data *ddata)
> -{
> -	dev_err(&ddata->dsi->dev, "performing LCD reset\n");
> -
> -	dsicm_power_off(ddata);
> -	dsicm_hw_reset(ddata);
> -	return dsicm_power_on(ddata);
> -}
> -
>  static int dsicm_connect(struct omap_dss_device *src,
>  			 struct omap_dss_device *dst)
>  {
> @@ -671,17 +460,12 @@ static void dsicm_enable(struct omap_dss_device *dssdev)
>  static void dsicm_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	int r;
>  
>  	dsicm_bl_power(ddata, false);
>  
>  	mutex_lock(&ddata->lock);
>  
> -	dsicm_cancel_ulps_work(ddata);
> -
> -	r = dsicm_wake_up(ddata);
> -	if (!r)
> -		dsicm_power_off(ddata);
> +	dsicm_power_off(ddata);
>  
>  	mutex_unlock(&ddata->lock);
>  }
> @@ -705,10 +489,6 @@ static int dsicm_update(struct omap_dss_device *dssdev,
>  
>  	mutex_lock(&ddata->lock);
>  
> -	r = dsicm_wake_up(ddata);
> -	if (r)
> -		goto err;
> -
>  	if (!ddata->enabled) {
>  		r = 0;
>  		goto err;
> @@ -748,24 +528,6 @@ static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
>  	return r;
>  }
>  
> -static void dsicm_ulps_work(struct work_struct *work)
> -{
> -	struct panel_drv_data *ddata = container_of(work, struct panel_drv_data,
> -			ulps_work.work);
> -	struct omap_dss_device *dssdev = &ddata->dssdev;
> -
> -	mutex_lock(&ddata->lock);
> -
> -	if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE || !ddata->enabled) {
> -		mutex_unlock(&ddata->lock);
> -		return;
> -	}
> -
> -	dsicm_enter_ulps(ddata);
> -
> -	mutex_unlock(&ddata->lock);
> -}
> -
>  static int dsicm_get_modes(struct omap_dss_device *dssdev,
>  			   struct drm_connector *connector)
>  {
> @@ -863,7 +625,7 @@ static int dsicm_probe_of(struct mipi_dsi_device *dsi)
>  	else
>  		ddata->use_dsi_backlight = true;
>  
> -	/* TODO: ulps */
> +	/* TODO: ulps_enabled */
>  
>  	return 0;
>  }
> @@ -911,13 +673,6 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
>  
>  	mutex_init(&ddata->lock);
>  
> -	ddata->workqueue = create_singlethread_workqueue("dsicm_wq");
> -	if (!ddata->workqueue) {
> -		r = -ENOMEM;
> -		goto err_reg;
> -	}
> -	INIT_DELAYED_WORK(&ddata->ulps_work, dsicm_ulps_work);
> -
>  	dsicm_hw_reset(ddata);
>  
>  	if (ddata->use_dsi_backlight) {
> @@ -948,6 +703,9 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
>  	dsi->hs_rate = 300000000;
>  	dsi->lp_rate = 10000000;
>  
> +	if (ddata->ulps_enabled)
> +		dsi->mode_flags |= MIPI_DSI_MODE_ULPS_IDLE;
> +
>  	r = mipi_dsi_attach(dsi);
>  	if (r < 0)
>  		goto err_dsi_attach;
> @@ -957,8 +715,6 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
>  err_dsi_attach:
>  	sysfs_remove_group(&dsi->dev.kobj, &dsicm_attr_group);
>  err_bl:
> -	destroy_workqueue(ddata->workqueue);
> -err_reg:
>  	if (ddata->extbldev)
>  		put_device(&ddata->extbldev->dev);
>  
> @@ -985,9 +741,6 @@ static int __exit dsicm_remove(struct mipi_dsi_device *dsi)
>  	if (ddata->extbldev)
>  		put_device(&ddata->extbldev->dev);
>  
> -	dsicm_cancel_ulps_work(ddata);
> -	destroy_workqueue(ddata->workqueue);
> -
>  	/* reset, to be sure that the panel is in a valid state */
>  	dsicm_hw_reset(ddata);
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index 937362ade4b4..0f264654792d 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -207,6 +207,8 @@ struct dsi_reg { u16 module; u16 idx; };
>  typedef void (*omap_dsi_isr_t) (void *arg, u32 mask);
>  struct dsi_data;
>  
> +static void dsi_set_ulps_auto(struct dsi_data *dsi, bool enable);
> +

Would it be possible to avoid forward declarations by reordering
functions ?

This patch removes the ability for userspace to configure the ULPS
timeout (and thus, if I understand correctly, to disable the auto-ULPS
feature). I understand the simplification is needed, but I can't tell if
the feature removal could have an adverse effect.

Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

>  static int dsi_display_init_dispc(struct dsi_data *dsi);
>  static void dsi_display_uninit_dispc(struct dsi_data *dsi);
>  
> @@ -377,6 +379,9 @@ struct dsi_data {
>  
>  	bool te_enabled;
>  	bool ulps_enabled;
> +	bool ulps_auto_idle;
> +
> +	struct delayed_work ulps_work;
>  
>  	void (*framedone_callback)(int, void *);
>  	void *framedone_data;
> @@ -3794,6 +3799,7 @@ static void dsi_handle_framedone(struct dsi_data *dsi, int error)
>  		REG_FLD_MOD(dsi, DSI_TIMING2, 1, 15, 15); /* LP_RX_TO */
>  	}
>  
> +	dsi_set_ulps_auto(dsi, true);
>  	dsi_bus_unlock(dsi);
>  
>  	dsi->framedone_callback(error, dsi->framedone_data);
> @@ -3856,6 +3862,7 @@ static int dsi_update(struct omap_dss_device *dssdev, int channel,
>  	struct dsi_data *dsi = to_dsi_data(dssdev);
>  
>  	dsi_bus_lock(dsi);
> +	dsi_set_ulps_auto(dsi, false);
>  
>  	dsi->update_channel = channel;
>  	dsi->framedone_callback = callback;
> @@ -4119,18 +4126,6 @@ static void dsi_display_disable(struct omap_dss_device *dssdev)
>  	dsi_display_ulps_disable(dsi, true, false);
>  }
>  
> -static void dsi_ulps(struct omap_dss_device *dssdev, bool enable)
> -{
> -	struct dsi_data *dsi = to_dsi_data(dssdev);
> -
> -	DSSDBG("dsi_ulps\n");
> -
> -	if (enable)
> -		dsi_display_ulps_disable(dsi, false, true);
> -	else
> -		dsi_display_ulps_enable(dsi);
> -}
> -
>  static int dsi_enable_te(struct dsi_data *dsi, bool enable)
>  {
>  	dsi->te_enabled = enable;
> @@ -4145,6 +4140,40 @@ static int dsi_enable_te(struct dsi_data *dsi, bool enable)
>  	return 0;
>  }
>  
> +static void omap_dsi_ulps_work_callback(struct work_struct *work)
> +{
> +	struct dsi_data *dsi = container_of(work, struct dsi_data,
> +					    ulps_work.work);
> +
> +	dsi_bus_lock(dsi);
> +
> +	dsi_enable_te(dsi, false);
> +
> +	dsi_display_ulps_disable(dsi, false, true);
> +
> +	dsi_bus_unlock(dsi);
> +}
> +
> +static void dsi_set_ulps_auto(struct dsi_data *dsi, bool enable)
> +{
> +	WARN_ON(!dsi_bus_is_locked(dsi));
> +
> +	if (!dsi->ulps_auto_idle)
> +		return;
> +
> +	if (enable) {
> +		schedule_delayed_work(&dsi->ulps_work, msecs_to_jiffies(250));
> +	} else {
> +		cancel_delayed_work_sync(&dsi->ulps_work);
> +
> +		if (!dsi->ulps_enabled)
> +			return;
> +
> +		dsi_display_ulps_enable(dsi);
> +		dsi_enable_te(dsi, true);
> +	}
> +}
> +
>  #ifdef PRINT_VERBOSE_VM_TIMINGS
>  static void print_dsi_vm(const char *str,
>  		const struct omap_dss_dsi_videomode_timings *t)
> @@ -4796,7 +4825,9 @@ 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);
>  	dsi_bus_unlock(dsi);
>  
>  	return r;
> @@ -4836,8 +4867,6 @@ static const struct omap_dss_device_ops dsi_ops = {
>  	.disable = dsi_display_disable,
>  
>  	.dsi = {
> -		.ulps = dsi_ulps,
> -
>  		.set_config = dsi_set_config,
>  
>  		.enable_video_output = dsi_enable_video_output,
> @@ -4959,6 +4988,12 @@ static int omap_dsi_host_attach(struct mipi_dsi_host *host,
>  	dsi->vc[channel].dest = client;
>  	dsi->pix_fmt = client->format;
>  
> +	INIT_DEFERRABLE_WORK(&dsi->ulps_work,
> +			     omap_dsi_ulps_work_callback);
> +
> +	dsi->ulps_auto_idle = !!(client->mode_flags & MIPI_DSI_MODE_ULPS_IDLE);
> +	dsi_set_ulps_auto(dsi, true);
> +
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 0d82ba34ca89..524cb87cd9ea 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -282,8 +282,6 @@ struct omap_dss_writeback_info {
>  
>  struct omapdss_dsi_ops {
>  	/* bus configuration */
> -	void (*ulps)(struct omap_dss_device *dssdev, bool enable);
> -
>  	int (*set_config)(struct omap_dss_device *dssdev,
>  			const struct omap_dss_dsi_config *cfg);
>  

-- 
Regards,

Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2020-11-09 10:03 UTC|newest]

Thread overview: 328+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-05 12:02 [PATCH v3 00/56] Convert DSI code to use drm_mipi_dsi and drm_panel Tomi Valkeinen
2020-11-05 12:02 ` Tomi Valkeinen
2020-11-05 12:02 ` [PATCH v3 01/56] drm/dsi: add MIPI_DSI_MODE_ULPS_IDLE Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-06  4:41   ` Laurent Pinchart
2020-11-06  4:41     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 02/56] Revert "drm/omap: dss: Remove unused omap_dss_device operations" Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-05 21:27   ` Sam Ravnborg
2020-11-05 21:27     ` Sam Ravnborg
2020-11-06  4:50   ` Laurent Pinchart
2020-11-06  4:50     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 03/56] drm/omap: drop unused dsi.configure_pins Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-06  4:50   ` Laurent Pinchart
2020-11-06  4:50     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 04/56] drm/omap: dsi: use MIPI_DSI_FMT_* instead of OMAP_DSS_DSI_FMT_* Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-06  4:56   ` Laurent Pinchart
2020-11-06  4:56     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 05/56] drm/omap: constify write buffers Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-06  4:57   ` Laurent Pinchart
2020-11-06  4:57     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 06/56] drm/omap: dsi: add generic transfer function Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-06  5:05   ` Laurent Pinchart
2020-11-06  5:05     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 07/56] drm/omap: panel-dsi-cm: convert to transfer API Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-06  5:08   ` Laurent Pinchart
2020-11-06  5:08     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 08/56] drm/omap: dsi: unexport specific data transfer functions Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-09  8:10   ` Laurent Pinchart
2020-11-09  8:10     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 09/56] drm/omap: dsi: drop virtual channel logic Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-09  8:14   ` Laurent Pinchart
2020-11-09  8:14     ` Laurent Pinchart
2020-11-09  8:20     ` Tomi Valkeinen
2020-11-09  8:20       ` Tomi Valkeinen
2020-11-09  8:18   ` Tomi Valkeinen
2020-11-09  8:18     ` Tomi Valkeinen
2020-11-05 12:02 ` [PATCH v3 10/56] drm/omap: dsi: simplify write function Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-09  8:21   ` Laurent Pinchart
2020-11-09  8:21     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 11/56] drm/omap: dsi: simplify read functions Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-09  8:28   ` Laurent Pinchart
2020-11-09  8:28     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 12/56] drm/omap: dsi: switch dsi_vc_send_long/short to mipi_dsi_msg Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-09  8:33   ` Laurent Pinchart
2020-11-09  8:33     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 13/56] drm/omap: dsi: introduce mipi_dsi_host Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-09  8:38   ` Laurent Pinchart
2020-11-09  8:38     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 14/56] drm/omap: panel-dsi-cm: use DSI helpers Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-09  8:40   ` Laurent Pinchart
2020-11-09  8:40     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 15/56] drm/omap: dsi: request VC via mipi_dsi_attach Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-09  8:42   ` Laurent Pinchart
2020-11-09  8:42     ` Laurent Pinchart
2020-11-09 11:16     ` Tomi Valkeinen
2020-11-09 11:16       ` Tomi Valkeinen
2020-11-05 12:02 ` [PATCH v3 16/56] drm/omap: panel-dsi-cm: drop hardcoded VC Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-09  8:43   ` Laurent Pinchart
2020-11-09  8:43     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 17/56] drm/omap: panel-dsi-cm: use common MIPI DCS 1.3 defines Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-09  8:44   ` Laurent Pinchart
2020-11-09  8:44     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 18/56] drm/omap: dsi: drop unused memory_read() Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-09  8:45   ` Laurent Pinchart
2020-11-09  8:45     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 19/56] drm/omap: dsi: drop unused get_te() Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-09  8:45   ` Laurent Pinchart
2020-11-09  8:45     ` Laurent Pinchart
2020-11-09  9:49     ` Tomi Valkeinen
2020-11-09  9:49       ` Tomi Valkeinen
2020-11-05 12:02 ` [PATCH v3 20/56] drm/omap: dsi: drop unused enable_te() Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-09  8:46   ` Laurent Pinchart
2020-11-09  8:46     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 21/56] drm/omap: dsi: drop useless sync() Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-09  8:46   ` Laurent Pinchart
2020-11-09  8:46     ` Laurent Pinchart
2020-11-05 12:02 ` [PATCH v3 22/56] drm/omap: dsi: use pixel-format and mode from attach Tomi Valkeinen
2020-11-05 12:02   ` Tomi Valkeinen
2020-11-09  8:49   ` Laurent Pinchart
2020-11-09  8:49     ` Laurent Pinchart
2020-11-09  9:45     ` Tomi Valkeinen
2020-11-09  9:45       ` Tomi Valkeinen
2020-11-05 12:03 ` [PATCH v3 23/56] drm/omap: panel-dsi-cm: use bulk regulator API Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09  8:51   ` Laurent Pinchart
2020-11-09  8:51     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 24/56] drm/omap: dsi: lp/hs switching support for transfer() Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09  8:53   ` Laurent Pinchart
2020-11-09  8:53     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 25/56] drm/omap: dsi: move TE GPIO handling into core Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09  9:19   ` Laurent Pinchart
2020-11-09  9:19     ` Laurent Pinchart
2020-11-11 13:26     ` Tomi Valkeinen
2020-11-11 13:26       ` Tomi Valkeinen
2020-11-05 12:03 ` [PATCH v3 26/56] drm/omap: dsi: drop custom enable_te() API Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09  9:32   ` Laurent Pinchart
2020-11-09  9:32     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 27/56] drm/omap: dsi: do bus locking in host driver Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09  9:52   ` Laurent Pinchart
2020-11-09  9:52     ` Laurent Pinchart
2020-11-09 10:08     ` Tomi Valkeinen
2020-11-09 10:08       ` Tomi Valkeinen
2020-11-09 13:27       ` Sebastian Reichel
2020-11-09 13:27         ` Sebastian Reichel
2020-11-09 14:25         ` Tomi Valkeinen
2020-11-09 14:25           ` Tomi Valkeinen
2020-11-11 13:35         ` Tomi Valkeinen
2020-11-11 13:35           ` Tomi Valkeinen
2020-11-05 12:03 ` [PATCH v3 28/56] drm/omap: dsi: untangle ulps ops from enable/disable Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09  9:57   ` Laurent Pinchart
2020-11-09  9:57     ` Laurent Pinchart
2020-11-11 14:05     ` Tomi Valkeinen
2020-11-11 14:05       ` Tomi Valkeinen
2020-11-05 12:03 ` [PATCH v3 29/56] drm/omap: dsi: do ULPS in host driver Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 10:03   ` Laurent Pinchart [this message]
2020-11-09 10:03     ` Laurent Pinchart
2020-11-11 15:29     ` Tomi Valkeinen
2020-11-11 15:29       ` Tomi Valkeinen
2020-11-05 12:03 ` [PATCH v3 30/56] drm/omap: dsi: move panel refresh function to host Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 10:10   ` Laurent Pinchart
2020-11-09 10:10     ` Laurent Pinchart
2020-11-11 15:34     ` Tomi Valkeinen
2020-11-11 15:34       ` Tomi Valkeinen
2020-11-11 15:58       ` Laurent Pinchart
2020-11-11 15:58         ` Laurent Pinchart
2020-11-12  8:08         ` Tomi Valkeinen
2020-11-12  8:08           ` Tomi Valkeinen
2020-11-16  9:22           ` Laurent Pinchart
2020-11-16  9:22             ` Laurent Pinchart
2020-11-17 10:04             ` Sebastian Reichel
2020-11-17 10:04               ` Sebastian Reichel
2020-11-05 12:03 ` [PATCH v3 31/56] drm/omap: dsi: Reverse direction of the DSS device enable/disable operations Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 10:17   ` Laurent Pinchart
2020-11-09 10:17     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 32/56] drm/omap: dsi: drop custom panel capability support Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 10:20   ` Laurent Pinchart
2020-11-09 10:20     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 33/56] drm/omap: dsi: convert to drm_panel Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 10:39   ` Laurent Pinchart
2020-11-09 10:39     ` Laurent Pinchart
2020-11-11 15:54     ` Tomi Valkeinen
2020-11-11 15:54       ` Tomi Valkeinen
2020-11-05 12:03 ` [PATCH v3 34/56] drm/omap: drop omapdss-boot-init Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 10:40   ` Laurent Pinchart
2020-11-09 10:40     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 35/56] drm/omap: dsi: implement check timings Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 10:47   ` Laurent Pinchart
2020-11-09 10:47     ` Laurent Pinchart
2020-11-11 12:36     ` Tomi Valkeinen
2020-11-11 12:36       ` Tomi Valkeinen
2020-11-05 12:03 ` [PATCH v3 36/56] drm/omap: panel-dsi-cm: use DEVICE_ATTR_RO Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 10:48   ` Laurent Pinchart
2020-11-09 10:48     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 37/56] drm/omap: panel-dsi-cm: support unbinding Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 10:49   ` Laurent Pinchart
2020-11-09 10:49     ` Laurent Pinchart
2020-11-11 12:03     ` Tomi Valkeinen
2020-11-11 12:03       ` Tomi Valkeinen
2020-11-05 12:03 ` [PATCH v3 38/56] drm/omap: panel-dsi-cm: fix remove() Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 10:50   ` Laurent Pinchart
2020-11-09 10:50     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 39/56] drm/omap: remove global dss_device variable Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 10:51   ` Laurent Pinchart
2020-11-09 10:51     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 40/56] drm/panel: Move OMAP's DSI command mode panel driver Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-05 15:16   ` Sam Ravnborg
2020-11-05 15:16     ` Sam Ravnborg
2020-11-05 15:27   ` Tomi Valkeinen
2020-11-05 15:27     ` Tomi Valkeinen
2020-11-09 10:53   ` Laurent Pinchart
2020-11-09 10:53     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 41/56] drm/omap: dsi: Register a drm_bridge Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 10:54   ` Laurent Pinchart
2020-11-09 10:54     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 42/56] drm/omap: remove legacy DSS device operations Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 11:01   ` Laurent Pinchart
2020-11-09 11:01     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 43/56] drm/omap: remove unused omap_connector Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 11:02   ` Laurent Pinchart
2020-11-09 11:02     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 44/56] drm/omap: simplify omap_display_id Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 11:03   ` Laurent Pinchart
2020-11-09 11:03     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 45/56] drm/omap: drop unused DSS next pointer Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 11:04   ` Laurent Pinchart
2020-11-09 11:04     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 46/56] drm/omap: drop empty omap_encoder helper functions Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 11:05   ` Laurent Pinchart
2020-11-09 11:05     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 47/56] drm/omap: drop DSS ops_flags Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 11:05   ` Laurent Pinchart
2020-11-09 11:05     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 48/56] drm/omap: drop dssdev display field Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 11:06   ` Laurent Pinchart
2020-11-09 11:06     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 49/56] drm/omap: simplify DSI manual update code Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 11:07   ` Laurent Pinchart
2020-11-09 11:07     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 50/56] drm/omap: dsi: simplify pin config Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 11:09   ` Laurent Pinchart
2020-11-09 11:09     ` Laurent Pinchart
2020-11-11 12:24     ` Tomi Valkeinen
2020-11-11 12:24       ` Tomi Valkeinen
2020-11-05 12:03 ` [PATCH v3 51/56] ARM: omap2plus_defconfig: Update for moved DSI command mode panel Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 11:10   ` Laurent Pinchart
2020-11-09 11:10     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 52/56] drm/omap: squash omapdrm sub-modules into one Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 11:15   ` Laurent Pinchart
2020-11-09 11:15     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 53/56] drm/omap: remove unused display.c Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 11:16   ` Laurent Pinchart
2020-11-09 11:16     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 54/56] drm/omap: drop unused owner field Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 11:16   ` Laurent Pinchart
2020-11-09 11:16     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 55/56] drm/omap: remove dispc_ops Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 11:17   ` Laurent Pinchart
2020-11-09 11:17     ` Laurent Pinchart
2020-11-05 12:03 ` [PATCH v3 56/56] drm/omap: remove dss_mgr_ops Tomi Valkeinen
2020-11-05 12:03   ` Tomi Valkeinen
2020-11-09 11:18   ` Laurent Pinchart
2020-11-09 11:18     ` Laurent Pinchart
2020-11-05 17:15 ` [PATCH v3 00/56] Convert DSI code to use drm_mipi_dsi and drm_panel H. Nikolaus Schaller
2020-11-05 17:15   ` H. Nikolaus Schaller
2020-11-05 17:36   ` Tomi Valkeinen
2020-11-05 17:36     ` Tomi Valkeinen
2020-11-05 18:14     ` H. Nikolaus Schaller
2020-11-05 18:14       ` H. Nikolaus Schaller
2020-11-05 18:28       ` Tomi Valkeinen
2020-11-05 18:28         ` Tomi Valkeinen
2020-11-05 18:56         ` H. Nikolaus Schaller
2020-11-05 18:56           ` H. Nikolaus Schaller
2020-11-06 14:37           ` Tomi Valkeinen
2020-11-06 14:37             ` Tomi Valkeinen
2020-11-06 15:04             ` Tomi Valkeinen
2020-11-06 15:04               ` Tomi Valkeinen
2020-11-07 12:19               ` H. Nikolaus Schaller
2020-11-07 12:19                 ` H. Nikolaus Schaller
2020-11-09  8:04                 ` Tomi Valkeinen
2020-11-09  8:04                   ` Tomi Valkeinen
2020-11-09  9:30                   ` H. Nikolaus Schaller
2020-11-09  9:30                     ` H. Nikolaus Schaller
2020-11-09 10:22                     ` Tomi Valkeinen
2020-11-09 10:22                       ` Tomi Valkeinen
2020-11-09 10:31                       ` H. Nikolaus Schaller
2020-11-09 10:31                         ` H. Nikolaus Schaller
2020-11-09 10:34                         ` Tomi Valkeinen
2020-11-09 10:34                           ` Tomi Valkeinen
2020-11-09 11:09                           ` H. Nikolaus Schaller
2020-11-09 11:09                             ` H. Nikolaus Schaller
2020-11-09 11:33                             ` Tomi Valkeinen
2020-11-09 11:33                               ` Tomi Valkeinen
2020-11-10 13:49                               ` H. Nikolaus Schaller
2020-11-10 13:49                                 ` H. Nikolaus Schaller
2020-11-10 15:25                                 ` Tomi Valkeinen
2020-11-10 15:25                                   ` Tomi Valkeinen
2020-11-10 16:49                                 ` H. Nikolaus Schaller
2020-11-10 16:49                                   ` H. Nikolaus Schaller
2020-11-10 16:52                                   ` Tomi Valkeinen
2020-11-10 16:52                                     ` Tomi Valkeinen
2020-11-10 21:04                                     ` H. Nikolaus Schaller
2020-11-10 21:04                                       ` H. Nikolaus Schaller
2020-11-11  6:40                                       ` Tomi Valkeinen
2020-11-11  6:40                                         ` Tomi Valkeinen
2020-11-11  7:48                                         ` H. Nikolaus Schaller
2020-11-11  7:48                                           ` H. Nikolaus Schaller
2020-11-11 10:11                                           ` Tomi Valkeinen
2020-11-11 10:11                                             ` Tomi Valkeinen
2020-11-11 19:27                                             ` H. Nikolaus Schaller
2020-11-11 19:27                                               ` H. Nikolaus Schaller
2020-11-05 21:31 ` Sam Ravnborg
2020-11-05 21:31   ` Sam Ravnborg
2020-11-08 16:33 ` Nikhil Devshatwar
2020-11-08 16:33   ` Nikhil Devshatwar
     [not found] ` <BAFBC885-9BBE-46D1-B4C4-79910705864A@goldelico.com>
     [not found]   ` <74abbdc4-cc1e-9caf-d4ee-0a5cdb557643@ti.com>
     [not found]     ` <b0677958-02ad-1d2f-d755-! 25a9d384eddc@ti.com>
     [not found]       ` <1A09B4DA-F726-4F37-8CF4-BC192C659950@goldelico.com>
     [not found]         ` <9a4e373e-9092-6d82-937a-bc663d2376b4@ti.com>
     [not found]           ` <09ebc3e3-72c7-41fb-fb21-bf28c! f883d3f@ti.com>
     [not found]             ` <E738362A-8ECE-4ED5-8057-2ABB6F5C3056@goldelico.com>
     [not found]               ` <9a21b475-eff0-9882-8d65-d1f! dd2139dc4@ti.com>
     [not found]                 ` <A1DEB54D-FEC0-493A-858C-E5C0DB24B35E@goldelico.com>
     [not found]                   ` <1150ba22-1ae2-39f3-0924-7! a1f1b468597@ti.com>
     [not found]                     ` <2999ED77-B9F7-4197-81B8-F1AFF329A1E9@goldelico.com>
     [not found]                       ` <cbc147d2-af41-2bed-5670-530d45cfb24e@ti.com>
     [not found]                         ` <106bfbee-c472-c04c-0f7b-db108a090a63@ti.com>
     [not found]                           ` <420b81bd-fc95-e294-fcbe-f34db1ef! f9e7@ti.c om>
     [not found]                             ` <B2FBCAE4-FAD9-4C0D-9C75-63A701215886@goldelico.com>
     [not found]                               ` <826B2E97-8B77-412A-8093-753BF7A65EE1@goldelico.com>
     [not found]                                 ` <acad2006-53a2-6587-b8e6-787e358! 8932a@ti.com>
     [not found]                                   ` <AF87C7B4-DCD2-4207-A300-567DB65B08ED@goldelico.com>
     [not found]                                     ` <27cfb13a-62e3-0a53-153f-92641c437cee@ti. com>
     [not found]                                       ` <27cfb13a-62e3-0a53-153f-92641c437cee@ti.com>
2020-11-16  9:16                                         ` H. Nikolaus Schaller
2020-11-16  9:16                                           ` H. Nikolaus Schaller

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=20201109100315.GZ6029@pendragon.ideasonboard.com \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hns@goldelico.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=tomi.valkeinen@ti.com \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.