From: Andrzej Hajda <a.hajda@samsung.com>
To: Thierry Reding <thierry.reding@gmail.com>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 3/4] drm/dsi: Make mipi_dsi_dcs_{read, write}() symmetrical
Date: Tue, 22 Jul 2014 09:32:58 +0200 [thread overview]
Message-ID: <53CE13AA.5040408@samsung.com> (raw)
In-Reply-To: <1406013141-18552-3-git-send-email-thierry.reding@gmail.com>
On 07/22/2014 09:12 AM, 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().
>
> Also update the S6E8AA0 panel driver (the only user of this API) to
> adapt to this new API.
I do not agree with that. DCS read and write are not symmetrical by design:
- write just sends data,
- read sends data then reads response.
Forcing API to be symmetrical complicates the implementation without real gain.
Regards
Andrzej
>
> Signed-off-by: Thierry Reding <treding@nvidia.com>
> ---
> drivers/gpu/drm/drm_mipi_dsi.c | 45 ++++++++++++++++++++++++-----------
> drivers/gpu/drm/panel/panel-s6e8aa0.c | 4 ++--
> include/drm/drm_mipi_dsi.h | 4 ++--
> 3 files changed, 35 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_mipi_dsi.c b/drivers/gpu/drm/drm_mipi_dsi.c
> index 6aa6a9e95570..bbab06ef80c9 100644
> --- a/drivers/gpu/drm/drm_mipi_dsi.c
> +++ b/drivers/gpu/drm/drm_mipi_dsi.c
> @@ -201,29 +201,41 @@ 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
> + * @cmd: DCS command
> + * @data: pointer to the command payload
> + * @len: payload length
> */
> -ssize_t mipi_dsi_dcs_write(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)
> {
> const struct mipi_dsi_host_ops *ops = dsi->host->ops;
> - struct mipi_dsi_msg msg = {
> - .channel = dsi->channel,
> - .tx_buf = data,
> - .tx_len = len
> - };
> + struct mipi_dsi_msg msg;
> + ssize_t err;
> + u8 *tx;
>
> if (!ops || !ops->transfer)
> return -ENOSYS;
>
> + if (len > 0) {
> + tx = kmalloc(1 + len, GFP_KERNEL);
> + if (!tx)
> + return -ENOMEM;
> +
> + tx[0] = cmd;
> + memcpy(tx + 1, data, len);
> + } else {
> + tx = &cmd;
> + }
> +
> + msg.channel = dsi->channel;
> + msg.tx_len = 1 + len;
> + msg.tx_buf = tx;
> +
> switch (len) {
> case 0:
> - return -EINVAL;
> - case 1:
> msg.type = MIPI_DSI_DCS_SHORT_WRITE;
> break;
> - case 2:
> + case 1:
> msg.type = MIPI_DSI_DCS_SHORT_WRITE_PARAM;
> break;
> default:
> @@ -231,14 +243,19 @@ ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, const void *data,
> break;
> }
>
> - return ops->transfer(dsi->host, &msg);
> + err = 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
> + * @cmd: DCS command
> * @data: pointer to read buffer
> * @len: length of @data
> *
> diff --git a/drivers/gpu/drm/panel/panel-s6e8aa0.c b/drivers/gpu/drm/panel/panel-s6e8aa0.c
> index 5502ef6bc074..d39bee36816c 100644
> --- a/drivers/gpu/drm/panel/panel-s6e8aa0.c
> +++ b/drivers/gpu/drm/panel/panel-s6e8aa0.c
> @@ -130,7 +130,7 @@ static int s6e8aa0_clear_error(struct s6e8aa0 *ctx)
> return ret;
> }
>
> -static void s6e8aa0_dcs_write(struct s6e8aa0 *ctx, const void *data, size_t len)
> +static void s6e8aa0_dcs_write(struct s6e8aa0 *ctx, const u8 *data, size_t len)
> {
> struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
> ssize_t ret;
> @@ -138,7 +138,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(dsi, data[0], data + 1, len - 1);
> 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 7b5e1a9244e1..bea181121e8b 100644
> --- a/include/drm/drm_mipi_dsi.h
> +++ b/include/drm/drm_mipi_dsi.h
> @@ -127,8 +127,8 @@ struct mipi_dsi_device {
>
> 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(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);
>
next prev parent reply other threads:[~2014-07-22 7:33 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-22 7:12 [PATCH 1/4] drm/dsi: Make mipi_dsi_dcs_write() return ssize_t Thierry Reding
2014-07-22 7:12 ` [PATCH 2/4] drm/dsi: Use peripheral's channel for DCS commands Thierry Reding
2014-07-22 7:30 ` Andrzej Hajda
2014-07-22 7:12 ` [PATCH 3/4] drm/dsi: Make mipi_dsi_dcs_{read,write}() symmetrical Thierry Reding
2014-07-22 7:32 ` Andrzej Hajda [this message]
2014-07-22 8:12 ` [PATCH 3/4] drm/dsi: Make mipi_dsi_dcs_{read, write}() symmetrical Thierry Reding
2014-07-22 9:33 ` Andrzej Hajda
2014-07-23 7:51 ` Thierry Reding
2014-07-23 10:59 ` Andrzej Hajda
2014-07-23 13:37 ` Thierry Reding
2014-07-24 7:57 ` Andrzej Hajda
2014-07-24 9:31 ` Thierry Reding
2014-07-22 11:20 ` Daniel Vetter
2014-07-23 6:32 ` Andrzej Hajda
2014-07-22 7:12 ` [PATCH 4/4] drm/panel: s6e8aa0: Use static inline for upcasting Thierry Reding
2014-07-22 7:33 ` Andrzej Hajda
2014-07-22 7:28 ` [PATCH 1/4] drm/dsi: Make mipi_dsi_dcs_write() return ssize_t Andrzej Hajda
2014-07-22 9:50 ` YoungJun Cho
2014-07-22 10:05 ` Andrzej Hajda
2014-07-22 10:23 ` Andrzej Hajda
2014-07-23 7:27 ` Thierry Reding
2014-07-23 8:18 ` 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=53CE13AA.5040408@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.