From: Lee Jones <lee.jones@linaro.org>
To: Doug Anderson <dianders@chromium.org>
Cc: swarren@nvidia.com, wsa@the-dreams.de, abrestic@chromium.org,
dgreid@chromium.org, olof@lixom.net, sjg@chromium.org,
linux-samsung-soc@vger.kernel.org, linux-tegra@vger.kernel.org,
sameo@linux.intel.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 2/7] mfd: cros_ec: spi: Add mutex to cros_ec_spi
Date: Tue, 20 May 2014 09:44:29 +0100 [thread overview]
Message-ID: <20140520084429.GC24991@lee--X1> (raw)
In-Reply-To: <1398879850-9111-3-git-send-email-dianders@chromium.org>
On Wed, 30 Apr 2014, Doug Anderson wrote:
> The main transfer function for cros_ec_spi can be called by more than
> one client at a time. Make sure that those clients don't stomp on
> each other by locking the bus for the duration of the transfer
> function.
>
> Signed-off-by: Doug Anderson <dianders@chromium.org>
> Acked-by: Lee Jones <lee.jones@linaro.org>
> Reviewed-by: Simon Glass <sjg@chromium.org>
> Tested-by: Andrew Bresticker <abrestic@chromium.org>
> Tested-by: Stephen Warren <swarren@nvidia.com>
> ---
> Changes in v3: None
> Changes in v2: None
>
> drivers/mfd/cros_ec_spi.c | 26 +++++++++++++++++++++-----
> 1 file changed, 21 insertions(+), 5 deletions(-)
Applied, thanks.
> diff --git a/drivers/mfd/cros_ec_spi.c b/drivers/mfd/cros_ec_spi.c
> index c185eb6..a2a605d 100644
> --- a/drivers/mfd/cros_ec_spi.c
> +++ b/drivers/mfd/cros_ec_spi.c
> @@ -65,11 +65,13 @@
> * if no record
> * @end_of_msg_delay: used to set the delay_usecs on the spi_transfer that
> * is sent when we want to turn off CS at the end of a transaction.
> + * @lock: mutex to ensure only one user of cros_ec_command_spi_xfer at a time
> */
> struct cros_ec_spi {
> struct spi_device *spi;
> s64 last_transfer_ns;
> unsigned int end_of_msg_delay;
> + struct mutex lock;
> };
>
> static void debug_packet(struct device *dev, const char *name, u8 *ptr,
> @@ -208,6 +210,13 @@ static int cros_ec_command_spi_xfer(struct cros_ec_device *ec_dev,
> int ret = 0, final_ret;
> struct timespec ts;
>
> + /*
> + * We have the shared ec_dev buffer plus we do lots of separate spi_sync
> + * calls, so we need to make sure only one person is using this at a
> + * time.
> + */
> + mutex_lock(&ec_spi->lock);
> +
> len = cros_ec_prepare_tx(ec_dev, ec_msg);
> dev_dbg(ec_dev->dev, "prepared, len=%d\n", len);
>
> @@ -260,7 +269,7 @@ static int cros_ec_command_spi_xfer(struct cros_ec_device *ec_dev,
> ret = final_ret;
> if (ret < 0) {
> dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret);
> - return ret;
> + goto exit;
> }
>
> /* check response error code */
> @@ -269,14 +278,16 @@ static int cros_ec_command_spi_xfer(struct cros_ec_device *ec_dev,
> dev_warn(ec_dev->dev, "command 0x%02x returned an error %d\n",
> ec_msg->cmd, ptr[0]);
> debug_packet(ec_dev->dev, "in_err", ptr, len);
> - return -EINVAL;
> + ret = -EINVAL;
> + goto exit;
> }
> len = ptr[1];
> sum = ptr[0] + ptr[1];
> if (len > ec_msg->in_len) {
> dev_err(ec_dev->dev, "packet too long (%d bytes, expected %d)",
> len, ec_msg->in_len);
> - return -ENOSPC;
> + ret = -ENOSPC;
> + goto exit;
> }
>
> /* copy response packet payload and compute checksum */
> @@ -293,10 +304,14 @@ static int cros_ec_command_spi_xfer(struct cros_ec_device *ec_dev,
> dev_err(ec_dev->dev,
> "bad packet checksum, expected %02x, got %02x\n",
> sum, ptr[len + 2]);
> - return -EBADMSG;
> + ret = -EBADMSG;
> + goto exit;
> }
>
> - return 0;
> + ret = 0;
> +exit:
> + mutex_unlock(&ec_spi->lock);
> + return ret;
> }
>
> static void cros_ec_spi_dt_probe(struct cros_ec_spi *ec_spi, struct device *dev)
> @@ -327,6 +342,7 @@ static int cros_ec_spi_probe(struct spi_device *spi)
> if (ec_spi == NULL)
> return -ENOMEM;
> ec_spi->spi = spi;
> + mutex_init(&ec_spi->lock);
> ec_dev = devm_kzalloc(dev, sizeof(*ec_dev), GFP_KERNEL);
> if (!ec_dev)
> return -ENOMEM;
--
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
next prev parent reply other threads:[~2014-05-20 8:44 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-30 17:44 [PATCH v3 0/7] Add cros_ec changes for newer boards Doug Anderson
2014-04-30 17:44 ` Doug Anderson
2014-04-30 17:44 ` Doug Anderson
2014-04-30 17:44 ` [PATCH v3 1/7] mfd: cros_ec: spi: calculate delay between transfers correctly Doug Anderson
2014-05-20 8:43 ` Lee Jones
2014-04-30 17:44 ` [PATCH v3 3/7] mfd: cros_ec: spi: Make the cros_ec_spi timeout more reliable Doug Anderson
[not found] ` <1398879850-9111-4-git-send-email-dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2014-05-20 8:45 ` Lee Jones
2014-05-20 8:45 ` Lee Jones
2014-04-30 17:44 ` [PATCH v3 4/7] mfd: cros_ec: spi: Increase cros_ec_spi deadline from 5ms to 100ms Doug Anderson
2014-05-20 8:45 ` Lee Jones
2014-04-30 17:44 ` [PATCH v3 5/7] mfd: cros_ec: Sync to the latest cros_ec_commands.h from EC sources Doug Anderson
2014-05-20 8:46 ` Lee Jones
2014-06-11 10:37 ` Paul Bolle
2014-06-11 15:11 ` Doug Anderson
2014-06-11 15:11 ` Doug Anderson
[not found] ` <CAD=FV=XL9tnEqza8Zx8mt_Z7-bj8TCzdeyHMhnpewKp_1CR-ig-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-06-13 8:08 ` Paul Bolle
2014-06-13 8:08 ` Paul Bolle
2014-06-13 15:22 ` Doug Anderson
2014-06-13 15:22 ` Doug Anderson
2014-06-17 8:53 ` Paul Bolle
2014-06-17 16:20 ` Stephen Warren
[not found] ` <53A06AD4.3000704-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2014-06-17 16:43 ` Paul Bolle
2014-06-17 16:43 ` Paul Bolle
[not found] ` <1398879850-9111-1-git-send-email-dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2014-04-30 17:44 ` [PATCH v3 2/7] mfd: cros_ec: spi: Add mutex to cros_ec_spi Doug Anderson
2014-04-30 17:44 ` Doug Anderson
2014-05-20 8:44 ` Lee Jones [this message]
2014-04-30 17:44 ` [PATCH v3 6/7] i2c: ChromeOS EC tunnel driver Doug Anderson
2014-04-30 17:44 ` Doug Anderson
2014-05-01 19:05 ` Stephen Warren
2014-05-06 10:55 ` Rahul Sharma
2014-05-06 15:27 ` Doug Anderson
2014-05-12 20:18 ` Doug Anderson
2014-05-19 10:50 ` Wolfram Sang
2014-05-19 15:09 ` Doug Anderson
2014-05-19 17:22 ` Lee Jones
2014-05-19 22:19 ` Wolfram Sang
2014-05-19 22:19 ` Wolfram Sang
2014-05-20 8:43 ` Lee Jones
[not found] ` <1398879850-9111-7-git-send-email-dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2014-05-20 8:47 ` Lee Jones
2014-05-20 8:47 ` Lee Jones
2014-05-20 17:35 ` Stephen Warren
2014-05-20 17:35 ` Stephen Warren
2014-04-30 17:44 ` [PATCH v3 7/7] ARM: tegra: Add the EC i2c tunnel to tegra124-venice2 Doug Anderson
2014-04-30 17:44 ` Doug Anderson
2014-04-30 17:44 ` Doug Anderson
2014-05-01 19:06 ` Stephen Warren
2014-05-01 19:06 ` Stephen Warren
[not found] ` <53629B29.3050702-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2014-05-20 8:48 ` Lee Jones
2014-05-20 8:48 ` Lee Jones
2014-05-20 8:48 ` Lee Jones
2014-06-16 19:01 ` Stephen Warren
2014-06-16 19:01 ` Stephen Warren
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=20140520084429.GC24991@lee--X1 \
--to=lee.jones@linaro.org \
--cc=abrestic@chromium.org \
--cc=dgreid@chromium.org \
--cc=dianders@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=olof@lixom.net \
--cc=sameo@linux.intel.com \
--cc=sjg@chromium.org \
--cc=swarren@nvidia.com \
--cc=wsa@the-dreams.de \
/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.