All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrzej Hajda <a.hajda@samsung.com>
To: Thierry Reding <thierry.reding@gmail.com>,
	dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v2 01/15] drm/dsi: Make mipi_dsi_dcs_{read, write}() symmetrical
Date: Tue, 14 Oct 2014 10:00:32 +0200	[thread overview]
Message-ID: <543CD820.8080606@samsung.com> (raw)
In-Reply-To: <1413195395-3355-1-git-send-email-thierry.reding@gmail.com>

On 10/13/2014 12:16 PM, Thierry Reding wrote:
> From: Thierry Reding <treding@nvidia.com>
> 
> Currently the mipi_dsi_dcs_write() function requires the DCS command
> byte to be embedded within the write buffer whereas mipi_dsi_dcs_read()
> has a separate parameter. Make them more symmetrical by adding an extra
> command parameter to mipi_dsi_dcs_write().
> 
> The S6E8AA0 driver relies on the old asymmetric API and there's concern
> that moving to the new API may be less efficient. Provide a new function
> with the old semantics for those cases and make the S6E8AA0 driver use
> it instead.
> 
> Signed-off-by: Thierry Reding <treding@nvidia.com>
> ---
> Changes in v2:
> - provide mipi_dsi_dcs_write_buffer() for backwards compatibility
> 
>  drivers/gpu/drm/drm_mipi_dsi.c        | 127 +++++++++++++++++++++++++++++-----
>  drivers/gpu/drm/panel/panel-s6e8aa0.c |   2 +-
>  include/drm/drm_mipi_dsi.h            |   6 +-
>  3 files changed, 114 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_mipi_dsi.c b/drivers/gpu/drm/drm_mipi_dsi.c
> index eb6dfe52cab2..1702ffd07986 100644
> --- a/drivers/gpu/drm/drm_mipi_dsi.c
> +++ b/drivers/gpu/drm/drm_mipi_dsi.c
> @@ -199,33 +199,120 @@ int mipi_dsi_detach(struct mipi_dsi_device *dsi)
>  EXPORT_SYMBOL(mipi_dsi_detach);
>  
>  /**
> - * mipi_dsi_dcs_write - send DCS write command
> - * @dsi: DSI device
> - * @data: pointer to the command followed by parameters
> - * @len: length of @data
> + * mipi_dsi_dcs_write_buffer() - transmit a DCS command with payload
> + * @dsi: DSI peripheral device
> + * @data: buffer containing data to be transmitted
> + * @len: size of transmission buffer
> + *
> + * This function will automatically choose the right data type depending on
> + * the command payload length.
> + *
> + * Return: The number of bytes successfully transmitted or a negative error
> + * code on failure.
>   */
> -ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, const void *data,
> -			    size_t len)
> +ssize_t mipi_dsi_dcs_write_buffer(struct mipi_dsi_device *dsi,
> +				  const void *data, size_t len)
>  {
> -	const struct mipi_dsi_host_ops *ops = dsi->host->ops;
>  	struct mipi_dsi_msg msg = {
>  		.channel = dsi->channel,
>  		.tx_buf = data,
>  		.tx_len = len
>  	};
>  
> -	if (!ops || !ops->transfer)
> +	if (!dsi->host->ops || !dsi->host->ops->transfer)
>  		return -ENOSYS;
>  
>  	switch (len) {
>  	case 0:
>  		return -EINVAL;
> +
>  	case 1:
>  		msg.type = MIPI_DSI_DCS_SHORT_WRITE;
>  		break;
> +
>  	case 2:
>  		msg.type = MIPI_DSI_DCS_SHORT_WRITE_PARAM;
>  		break;
> +
> +	default:
> +		msg.type = MIPI_DSI_DCS_LONG_WRITE;
> +		break;
> +	}
> +
> +	return dsi->host->ops->transfer(dsi->host, &msg);
> +}
> +EXPORT_SYMBOL(mipi_dsi_dcs_write_buffer);
> +
> +/**
> + * mipi_dsi_dcs_write() - send DCS write command
> + * @dsi: DSI peripheral device
> + * @cmd: DCS command
> + * @data: buffer containing the command payload
> + * @len: command payload length
> + *
> + * This function will automatically choose the right data type depending on
> + * the command payload length.
> + *
> + * Return: The number of bytes successfully transmitted or a negative error
> + * code on failure.
> + */
> +ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, u8 cmd,
> +			   const void *data, size_t len)
> +{
> +	struct mipi_dsi_msg msg;
> +	ssize_t err;
> +	size_t size;
> +	u8 *tx;
> +
> +	if (!dsi->host->ops || !dsi->host->ops->transfer)
> +		return -ENOSYS;
> +
> +	if (len > 0) {
> +		unsigned int offset = 0;
> +
> +		/*
> +		 * DCS long write packets contain the word count in the header
> +		 * bytes 1 and 2 and have a payload containing the DCS command
> +		 * byte folowed by word count minus one bytes.
> +		 *
> +		 * DCS short write packets encode the DCS command and up to
> +		 * one parameter in header bytes 1 and 2.
> +		 */
> +		if (len > 1)
> +			size = 3 + len;
> +		else
> +			size = 1 + len;

I guess "size = 2" would be better here.

> +
> +		tx = kmalloc(size, GFP_KERNEL);
> +		if (!tx)
> +			return -ENOMEM;
> +
> +		/* write word count to header for DCS long write packets */
> +		if (len > 1) {
> +			tx[offset++] = ((1 + len) >> 0) & 0xff;
> +			tx[offset++] = ((1 + len) >> 8) & 0xff;
> +		}
> +
> +		/* write the DCS command byte followed by the payload */
> +		tx[offset++] = cmd;
> +		memcpy(tx + offset, data, len);
> +	} else {
> +		tx = &cmd;
> +		size = 1;
> +	}

Contents of this conditional is incompatible with the current API.
mipi_dsi_msg.tx_buf contains only data and mipi_dsi_msg.tx_len contains
lenght of this data. Now you try to embed length of data into tx_buf and
this breaks the API. And of course changing API would require also
changing current users of the API.
But in the first place it would be good to know why do you want to
change the API? What are benefits of this solution?


Regards
Andrzej


> +
> +	memset(&msg, 0, sizeof(msg));
> +	msg.channel = dsi->channel;
> +	msg.tx_len = size;
> +	msg.tx_buf = tx;
> +
> +	switch (len) {
> +	case 0:
> +		msg.type = MIPI_DSI_DCS_SHORT_WRITE;
> +		break;
> +	case 1:
> +		msg.type = MIPI_DSI_DCS_SHORT_WRITE_PARAM;
> +		break;
>  	default:
>  		msg.type = MIPI_DSI_DCS_LONG_WRITE;
>  		break;
> @@ -234,23 +321,27 @@ ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, const void *data,
>  	if (dsi->mode_flags & MIPI_DSI_MODE_LPM)
>  		msg.flags = MIPI_DSI_MSG_USE_LPM;
>  
> -	return ops->transfer(dsi->host, &msg);
> +	err = dsi->host->ops->transfer(dsi->host, &msg);
> +
> +	if (len > 0)
> +		kfree(tx);
> +
> +	return err;
>  }
>  EXPORT_SYMBOL(mipi_dsi_dcs_write);
>  
>  /**
> - * mipi_dsi_dcs_read - send DCS read request command
> - * @dsi: DSI device
> - * @cmd: DCS read command
> - * @data: pointer to read buffer
> - * @len: length of @data
> + * mipi_dsi_dcs_read() - send DCS read request command
> + * @dsi: DSI peripheral device
> + * @cmd: DCS command
> + * @data: buffer in which to receive data
> + * @len: size of receive buffer
>   *
> - * Function returns number of read bytes or error code.
> + * Return: The number of bytes read or a negative error code on failure.
>   */
>  ssize_t mipi_dsi_dcs_read(struct mipi_dsi_device *dsi, u8 cmd, void *data,
>  			  size_t len)
>  {
> -	const struct mipi_dsi_host_ops *ops = dsi->host->ops;
>  	struct mipi_dsi_msg msg = {
>  		.channel = dsi->channel,
>  		.type = MIPI_DSI_DCS_READ,
> @@ -260,13 +351,13 @@ ssize_t mipi_dsi_dcs_read(struct mipi_dsi_device *dsi, u8 cmd, void *data,
>  		.rx_len = len
>  	};
>  
> -	if (!ops || !ops->transfer)
> +	if (!dsi->host->ops || !dsi->host->ops->transfer)
>  		return -ENOSYS;
>  
>  	if (dsi->mode_flags & MIPI_DSI_MODE_LPM)
>  		msg.flags = MIPI_DSI_MSG_USE_LPM;
>  
> -	return ops->transfer(dsi->host, &msg);
> +	return dsi->host->ops->transfer(dsi->host, &msg);
>  }
>  EXPORT_SYMBOL(mipi_dsi_dcs_read);
>  
> diff --git a/drivers/gpu/drm/panel/panel-s6e8aa0.c b/drivers/gpu/drm/panel/panel-s6e8aa0.c
> index b5217fe37f02..0f85a7c37687 100644
> --- a/drivers/gpu/drm/panel/panel-s6e8aa0.c
> +++ b/drivers/gpu/drm/panel/panel-s6e8aa0.c
> @@ -141,7 +141,7 @@ static void s6e8aa0_dcs_write(struct s6e8aa0 *ctx, const void *data, size_t len)
>  	if (ctx->error < 0)
>  		return;
>  
> -	ret = mipi_dsi_dcs_write(dsi, data, len);
> +	ret = mipi_dsi_dcs_write_buffer(dsi, data, len);
>  	if (ret < 0) {
>  		dev_err(ctx->dev, "error %zd writing dcs seq: %*ph\n", ret, len,
>  			data);
> diff --git a/include/drm/drm_mipi_dsi.h b/include/drm/drm_mipi_dsi.h
> index 8569dc5a1026..ccc3869e137b 100644
> --- a/include/drm/drm_mipi_dsi.h
> +++ b/include/drm/drm_mipi_dsi.h
> @@ -132,8 +132,10 @@ static inline struct mipi_dsi_device *to_mipi_dsi_device(struct device *dev)
>  
>  int mipi_dsi_attach(struct mipi_dsi_device *dsi);
>  int mipi_dsi_detach(struct mipi_dsi_device *dsi);
> -ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, const void *data,
> -			    size_t len);
> +ssize_t mipi_dsi_dcs_write_buffer(struct mipi_dsi_device *dsi,
> +				  const void *data, size_t len);
> +ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, u8 cmd,
> +			   const void *data, size_t len);
>  ssize_t mipi_dsi_dcs_read(struct mipi_dsi_device *dsi, u8 cmd, void *data,
>  			  size_t len);
>  
> 

  parent reply	other threads:[~2014-10-14  8:00 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-13 10:16 [PATCH v2 01/15] drm/dsi: Make mipi_dsi_dcs_{read, write}() symmetrical Thierry Reding
2014-10-13 10:16 ` [PATCH 02/15] drm/dsi: Constify mipi_dsi_msg Thierry Reding
2014-10-13 13:41   ` Andrzej Hajda
2014-10-13 10:16 ` [PATCH 03/15] drm/dsi: Add mipi_dsi_set_maximum_return_packet_size() helper Thierry Reding
2014-10-13 14:10   ` Andrzej Hajda
2014-10-14  9:05     ` Thierry Reding
2014-10-13 14:23   ` Andrzej Hajda
2014-10-14  9:31     ` Thierry Reding
2014-10-13 10:16 ` [PATCH 04/15] drm/panel: s6e8aa0: Use standard MIPI DSI function Thierry Reding
2014-10-13 14:13   ` Andrzej Hajda
2014-10-14  9:46     ` Thierry Reding
2014-10-13 10:16 ` [PATCH 05/15] drm/dsi: Implement generic read and write commands Thierry Reding
2014-10-14  8:59   ` Andrzej Hajda
2014-10-14 10:03     ` Thierry Reding
2014-10-15 13:32       ` Andrzej Hajda
2014-10-13 10:16 ` [PATCH 06/15] drm/dsi: Implement some standard DCS commands Thierry Reding
2014-10-21  8:36   ` Andrzej Hajda
2014-10-13 10:16 ` [PATCH 07/15] drm/dsi: Add to DocBook documentation Thierry Reding
2014-10-21  9:26   ` Andrzej Hajda
2014-10-13 10:16 ` [PATCH 08/15] drm/dsi: Implement DCS nop command Thierry Reding
2014-10-21  9:53   ` Andrzej Hajda
2014-10-13 10:16 ` [PATCH 09/15] drm/dsi: Implement DCS soft_reset command Thierry Reding
2014-10-13 10:16 ` [PATCH 10/15] drm/dsi: Implement DCS get_power_mode command Thierry Reding
2014-10-21  9:48   ` Andrzej Hajda
2014-10-13 10:16 ` [PATCH 11/15] drm/dsi: Implement DCS {get,set}_pixel_format commands Thierry Reding
2014-10-13 10:16 ` [PATCH 12/15] drm/dsi: Implement DCS set_{column, page}_address commands Thierry Reding
2014-10-13 10:16 ` [PATCH 13/15] drm/dsi: Always use low-power mode for DCS commands Thierry Reding
2014-10-16  7:00   ` Andrzej Hajda
2014-10-13 10:16 ` [PATCH 14/15] drm/dsi: Resolve MIPI DSI device from phandle Thierry Reding
2014-10-16  7:03   ` Andrzej Hajda
2014-10-13 10:16 ` [PATCH 15/15] drm/panel: Add Sharp LQ101R1SX01 support Thierry Reding
2014-10-20 15:56   ` Andrzej Hajda
2014-10-31 14:28     ` Thierry Reding
2014-10-13 12:29 ` [PATCH v2 01/15] drm/dsi: Make mipi_dsi_dcs_{read,write}() symmetrical Andrzej Hajda
2014-10-14  9:00   ` Thierry Reding
2014-10-21 11:10     ` Andrzej Hajda
2014-10-21 11:19       ` Andrzej Hajda
2014-10-14  8:00 ` Andrzej Hajda [this message]
2014-10-14  9:44   ` [PATCH v2 01/15] drm/dsi: Make mipi_dsi_dcs_{read, write}() symmetrical Thierry Reding
2014-10-14 10:38     ` Andrzej Hajda
2014-10-14 10:57       ` Thierry Reding
2014-10-14 11:13         ` Thierry Reding
2014-10-14 11:47           ` Thierry Reding
2014-10-14 11:25         ` Andrzej Hajda
2014-10-14 11:29           ` Thierry Reding
2014-10-14 13:53             ` Andrzej Hajda
2014-10-14 14:16               ` Thierry Reding
2014-10-15 11:01                 ` Andrzej Hajda
2014-10-15 11:11                   ` Thierry Reding
2014-10-15 11:22                     ` Andrzej Hajda
2014-10-14 10:59     ` Andrzej Hajda

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=543CD820.8080606@samsung.com \
    --to=a.hajda@samsung.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=thierry.reding@gmail.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.