* [PATCH 1/2] mfd: cros ec: spi: Don't send first message too soon @ 2017-11-13 21:05 ` Jon Hunter 0 siblings, 0 replies; 14+ messages in thread From: Jon Hunter @ 2017-11-13 21:05 UTC (permalink / raw) To: Lee Jones Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-tegra-u79uwXL29TY76Z2rM5mHXA, Brian Norris, Shawn Nematbakhsh, Jon Hunter On the Tegra124 Nyan-Big chromebook the very first SPI message sent to the EC is failing. The Tegra SPI driver configures the SPI chip-selects to be active-high by default (and always has for many years). The EC SPI requires an active-low chip-select and so the Tegra chip-select is reconfigured to be active-low when the EC SPI driver calls spi_setup(). The problem is that if the first SPI message to the EC is sent too soon after reconfiguring the SPI chip-select, it fails. The EC SPI driver prevents back-to-back SPI messages being sent too soon by keeping track of the time the last transfer was sent via the variable 'last_transfer_ns'. To prevent the very first transfer being sent too soon, initialise the 'last_transfer_ns' variable after calling spi_setup() and before sending the first SPI message. Signed-off-by: Jon Hunter <jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> --- Looks like this issue has been around for several Linux releases now and it just depends on timing if this issue is seen or not and so there is no specific commit this fixes. However, would be good to include for v4.15. drivers/mfd/cros_ec_spi.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/mfd/cros_ec_spi.c b/drivers/mfd/cros_ec_spi.c index c9714072e224..a14196e95e9b 100644 --- a/drivers/mfd/cros_ec_spi.c +++ b/drivers/mfd/cros_ec_spi.c @@ -667,6 +667,7 @@ static int cros_ec_spi_probe(struct spi_device *spi) sizeof(struct ec_response_get_protocol_info); ec_dev->dout_size = sizeof(struct ec_host_request); + ec_spi->last_transfer_ns = ktime_get_ns(); err = cros_ec_register(ec_dev); if (err) { -- 2.7.4 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 1/2] mfd: cros ec: spi: Don't send first message too soon @ 2017-11-13 21:05 ` Jon Hunter 0 siblings, 0 replies; 14+ messages in thread From: Jon Hunter @ 2017-11-13 21:05 UTC (permalink / raw) To: Lee Jones Cc: linux-kernel, linux-tegra, Brian Norris, Shawn Nematbakhsh, Jon Hunter On the Tegra124 Nyan-Big chromebook the very first SPI message sent to the EC is failing. The Tegra SPI driver configures the SPI chip-selects to be active-high by default (and always has for many years). The EC SPI requires an active-low chip-select and so the Tegra chip-select is reconfigured to be active-low when the EC SPI driver calls spi_setup(). The problem is that if the first SPI message to the EC is sent too soon after reconfiguring the SPI chip-select, it fails. The EC SPI driver prevents back-to-back SPI messages being sent too soon by keeping track of the time the last transfer was sent via the variable 'last_transfer_ns'. To prevent the very first transfer being sent too soon, initialise the 'last_transfer_ns' variable after calling spi_setup() and before sending the first SPI message. Signed-off-by: Jon Hunter <jonathanh@nvidia.com> --- Looks like this issue has been around for several Linux releases now and it just depends on timing if this issue is seen or not and so there is no specific commit this fixes. However, would be good to include for v4.15. drivers/mfd/cros_ec_spi.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/mfd/cros_ec_spi.c b/drivers/mfd/cros_ec_spi.c index c9714072e224..a14196e95e9b 100644 --- a/drivers/mfd/cros_ec_spi.c +++ b/drivers/mfd/cros_ec_spi.c @@ -667,6 +667,7 @@ static int cros_ec_spi_probe(struct spi_device *spi) sizeof(struct ec_response_get_protocol_info); ec_dev->dout_size = sizeof(struct ec_host_request); + ec_spi->last_transfer_ns = ktime_get_ns(); err = cros_ec_register(ec_dev); if (err) { -- 2.7.4 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/2] mfd: cros ec: spi: Simplify delay handling between SPI messages 2017-11-13 21:05 ` Jon Hunter @ 2017-11-13 21:05 ` Jon Hunter -1 siblings, 0 replies; 14+ messages in thread From: Jon Hunter @ 2017-11-13 21:05 UTC (permalink / raw) To: Lee Jones Cc: linux-kernel, linux-tegra, Brian Norris, Shawn Nematbakhsh, Jon Hunter The EC SPI driver prevents SPI transfers being to rapidly by keeping track of the time the last transfer was issued via the 'last_transfer_ns' variable. Previously, if the 'last_transfer_ns' variable was zero, this indicated that no previous transfer had been sent and that no delay was needed. However, the EC SPI driver has been updated to always initialise the 'last_transfer_ns' variable during probe and therefore, it is no longer necessary to test if it is zero. Remove the code that checks if this variable is zero. Signed-off-by: Jon Hunter <jonathanh@nvidia.com> --- drivers/mfd/cros_ec_spi.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/drivers/mfd/cros_ec_spi.c b/drivers/mfd/cros_ec_spi.c index a14196e95e9b..7849d781c6bb 100644 --- a/drivers/mfd/cros_ec_spi.c +++ b/drivers/mfd/cros_ec_spi.c @@ -72,8 +72,7 @@ * struct cros_ec_spi - information about a SPI-connected EC * * @spi: SPI device we are connected to - * @last_transfer_ns: time that we last finished a transfer, or 0 if there - * if no record + * @last_transfer_ns: time that we last finished a transfer. * @start_of_msg_delay: used to set the delay_usecs on the spi_transfer that * is sent when we want to turn on CS at the start of a transaction. * @end_of_msg_delay: used to set the delay_usecs on the spi_transfer that @@ -378,18 +377,15 @@ static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev, u8 *rx_buf; u8 sum; int ret = 0, final_ret; + unsigned long delay; len = cros_ec_prepare_tx(ec_dev, ec_msg); dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); /* If it's too soon to do another transaction, wait */ - if (ec_spi->last_transfer_ns) { - unsigned long delay; /* The delay completed so far */ - - delay = ktime_get_ns() - ec_spi->last_transfer_ns; - if (delay < EC_SPI_RECOVERY_TIME_NS) - ndelay(EC_SPI_RECOVERY_TIME_NS - delay); - } + delay = ktime_get_ns() - ec_spi->last_transfer_ns; + if (delay < EC_SPI_RECOVERY_TIME_NS) + ndelay(EC_SPI_RECOVERY_TIME_NS - delay); rx_buf = kzalloc(len, GFP_KERNEL); if (!rx_buf) @@ -510,18 +506,15 @@ static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, u8 *rx_buf; int sum; int ret = 0, final_ret; + unsigned long delay; len = cros_ec_prepare_tx(ec_dev, ec_msg); dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); /* If it's too soon to do another transaction, wait */ - if (ec_spi->last_transfer_ns) { - unsigned long delay; /* The delay completed so far */ - - delay = ktime_get_ns() - ec_spi->last_transfer_ns; - if (delay < EC_SPI_RECOVERY_TIME_NS) - ndelay(EC_SPI_RECOVERY_TIME_NS - delay); - } + delay = ktime_get_ns() - ec_spi->last_transfer_ns; + if (delay < EC_SPI_RECOVERY_TIME_NS) + ndelay(EC_SPI_RECOVERY_TIME_NS - delay); rx_buf = kzalloc(len, GFP_KERNEL); if (!rx_buf) -- 2.7.4 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/2] mfd: cros ec: spi: Simplify delay handling between SPI messages @ 2017-11-13 21:05 ` Jon Hunter 0 siblings, 0 replies; 14+ messages in thread From: Jon Hunter @ 2017-11-13 21:05 UTC (permalink / raw) To: Lee Jones Cc: linux-kernel, linux-tegra, Brian Norris, Shawn Nematbakhsh, Jon Hunter The EC SPI driver prevents SPI transfers being to rapidly by keeping track of the time the last transfer was issued via the 'last_transfer_ns' variable. Previously, if the 'last_transfer_ns' variable was zero, this indicated that no previous transfer had been sent and that no delay was needed. However, the EC SPI driver has been updated to always initialise the 'last_transfer_ns' variable during probe and therefore, it is no longer necessary to test if it is zero. Remove the code that checks if this variable is zero. Signed-off-by: Jon Hunter <jonathanh@nvidia.com> --- drivers/mfd/cros_ec_spi.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/drivers/mfd/cros_ec_spi.c b/drivers/mfd/cros_ec_spi.c index a14196e95e9b..7849d781c6bb 100644 --- a/drivers/mfd/cros_ec_spi.c +++ b/drivers/mfd/cros_ec_spi.c @@ -72,8 +72,7 @@ * struct cros_ec_spi - information about a SPI-connected EC * * @spi: SPI device we are connected to - * @last_transfer_ns: time that we last finished a transfer, or 0 if there - * if no record + * @last_transfer_ns: time that we last finished a transfer. * @start_of_msg_delay: used to set the delay_usecs on the spi_transfer that * is sent when we want to turn on CS at the start of a transaction. * @end_of_msg_delay: used to set the delay_usecs on the spi_transfer that @@ -378,18 +377,15 @@ static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev, u8 *rx_buf; u8 sum; int ret = 0, final_ret; + unsigned long delay; len = cros_ec_prepare_tx(ec_dev, ec_msg); dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); /* If it's too soon to do another transaction, wait */ - if (ec_spi->last_transfer_ns) { - unsigned long delay; /* The delay completed so far */ - - delay = ktime_get_ns() - ec_spi->last_transfer_ns; - if (delay < EC_SPI_RECOVERY_TIME_NS) - ndelay(EC_SPI_RECOVERY_TIME_NS - delay); - } + delay = ktime_get_ns() - ec_spi->last_transfer_ns; + if (delay < EC_SPI_RECOVERY_TIME_NS) + ndelay(EC_SPI_RECOVERY_TIME_NS - delay); rx_buf = kzalloc(len, GFP_KERNEL); if (!rx_buf) @@ -510,18 +506,15 @@ static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, u8 *rx_buf; int sum; int ret = 0, final_ret; + unsigned long delay; len = cros_ec_prepare_tx(ec_dev, ec_msg); dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); /* If it's too soon to do another transaction, wait */ - if (ec_spi->last_transfer_ns) { - unsigned long delay; /* The delay completed so far */ - - delay = ktime_get_ns() - ec_spi->last_transfer_ns; - if (delay < EC_SPI_RECOVERY_TIME_NS) - ndelay(EC_SPI_RECOVERY_TIME_NS - delay); - } + delay = ktime_get_ns() - ec_spi->last_transfer_ns; + if (delay < EC_SPI_RECOVERY_TIME_NS) + ndelay(EC_SPI_RECOVERY_TIME_NS - delay); rx_buf = kzalloc(len, GFP_KERNEL); if (!rx_buf) -- 2.7.4 ^ permalink raw reply related [flat|nested] 14+ messages in thread
[parent not found: <1510607140-30582-2-git-send-email-jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>]
* Re: [PATCH 2/2] mfd: cros ec: spi: Simplify delay handling between SPI messages 2017-11-13 21:05 ` Jon Hunter @ 2017-11-13 21:22 ` Brian Norris -1 siblings, 0 replies; 14+ messages in thread From: Brian Norris @ 2017-11-13 21:22 UTC (permalink / raw) To: Jon Hunter Cc: Lee Jones, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-tegra-u79uwXL29TY76Z2rM5mHXA, Shawn Nematbakhsh, Benson Leung, Doug Anderson On Mon, Nov 13, 2017 at 09:05:40PM +0000, Jon Hunter wrote: > The EC SPI driver prevents SPI transfers being to rapidly by keeping > track of the time the last transfer was issued via the > 'last_transfer_ns' variable. Previously, if the 'last_transfer_ns' > variable was zero, this indicated that no previous transfer had been > sent and that no delay was needed. However, the EC SPI driver has > been updated to always initialise the 'last_transfer_ns' variable > during probe and therefore, it is no longer necessary to test if it > is zero. Remove the code that checks if this variable is zero. > > Signed-off-by: Jon Hunter <jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> Reviewed-by: Brian Norris <briannorris-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org> > --- > drivers/mfd/cros_ec_spi.c | 25 +++++++++---------------- > 1 file changed, 9 insertions(+), 16 deletions(-) > > diff --git a/drivers/mfd/cros_ec_spi.c b/drivers/mfd/cros_ec_spi.c > index a14196e95e9b..7849d781c6bb 100644 > --- a/drivers/mfd/cros_ec_spi.c > +++ b/drivers/mfd/cros_ec_spi.c > @@ -72,8 +72,7 @@ > * struct cros_ec_spi - information about a SPI-connected EC > * > * @spi: SPI device we are connected to > - * @last_transfer_ns: time that we last finished a transfer, or 0 if there > - * if no record > + * @last_transfer_ns: time that we last finished a transfer. > * @start_of_msg_delay: used to set the delay_usecs on the spi_transfer that > * is sent when we want to turn on CS at the start of a transaction. > * @end_of_msg_delay: used to set the delay_usecs on the spi_transfer that > @@ -378,18 +377,15 @@ static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev, > u8 *rx_buf; > u8 sum; > int ret = 0, final_ret; > + unsigned long delay; > > len = cros_ec_prepare_tx(ec_dev, ec_msg); > dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); > > /* If it's too soon to do another transaction, wait */ > - if (ec_spi->last_transfer_ns) { > - unsigned long delay; /* The delay completed so far */ > - > - delay = ktime_get_ns() - ec_spi->last_transfer_ns; > - if (delay < EC_SPI_RECOVERY_TIME_NS) > - ndelay(EC_SPI_RECOVERY_TIME_NS - delay); > - } > + delay = ktime_get_ns() - ec_spi->last_transfer_ns; > + if (delay < EC_SPI_RECOVERY_TIME_NS) > + ndelay(EC_SPI_RECOVERY_TIME_NS - delay); > > rx_buf = kzalloc(len, GFP_KERNEL); > if (!rx_buf) > @@ -510,18 +506,15 @@ static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, > u8 *rx_buf; > int sum; > int ret = 0, final_ret; > + unsigned long delay; > > len = cros_ec_prepare_tx(ec_dev, ec_msg); > dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); > > /* If it's too soon to do another transaction, wait */ > - if (ec_spi->last_transfer_ns) { > - unsigned long delay; /* The delay completed so far */ > - > - delay = ktime_get_ns() - ec_spi->last_transfer_ns; > - if (delay < EC_SPI_RECOVERY_TIME_NS) > - ndelay(EC_SPI_RECOVERY_TIME_NS - delay); > - } > + delay = ktime_get_ns() - ec_spi->last_transfer_ns; > + if (delay < EC_SPI_RECOVERY_TIME_NS) > + ndelay(EC_SPI_RECOVERY_TIME_NS - delay); > > rx_buf = kzalloc(len, GFP_KERNEL); > if (!rx_buf) > -- > 2.7.4 > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] mfd: cros ec: spi: Simplify delay handling between SPI messages @ 2017-11-13 21:22 ` Brian Norris 0 siblings, 0 replies; 14+ messages in thread From: Brian Norris @ 2017-11-13 21:22 UTC (permalink / raw) To: Jon Hunter Cc: Lee Jones, linux-kernel, linux-tegra, Shawn Nematbakhsh, Benson Leung, Doug Anderson On Mon, Nov 13, 2017 at 09:05:40PM +0000, Jon Hunter wrote: > The EC SPI driver prevents SPI transfers being to rapidly by keeping > track of the time the last transfer was issued via the > 'last_transfer_ns' variable. Previously, if the 'last_transfer_ns' > variable was zero, this indicated that no previous transfer had been > sent and that no delay was needed. However, the EC SPI driver has > been updated to always initialise the 'last_transfer_ns' variable > during probe and therefore, it is no longer necessary to test if it > is zero. Remove the code that checks if this variable is zero. > > Signed-off-by: Jon Hunter <jonathanh@nvidia.com> Reviewed-by: Brian Norris <briannorris@chromium.org> > --- > drivers/mfd/cros_ec_spi.c | 25 +++++++++---------------- > 1 file changed, 9 insertions(+), 16 deletions(-) > > diff --git a/drivers/mfd/cros_ec_spi.c b/drivers/mfd/cros_ec_spi.c > index a14196e95e9b..7849d781c6bb 100644 > --- a/drivers/mfd/cros_ec_spi.c > +++ b/drivers/mfd/cros_ec_spi.c > @@ -72,8 +72,7 @@ > * struct cros_ec_spi - information about a SPI-connected EC > * > * @spi: SPI device we are connected to > - * @last_transfer_ns: time that we last finished a transfer, or 0 if there > - * if no record > + * @last_transfer_ns: time that we last finished a transfer. > * @start_of_msg_delay: used to set the delay_usecs on the spi_transfer that > * is sent when we want to turn on CS at the start of a transaction. > * @end_of_msg_delay: used to set the delay_usecs on the spi_transfer that > @@ -378,18 +377,15 @@ static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev, > u8 *rx_buf; > u8 sum; > int ret = 0, final_ret; > + unsigned long delay; > > len = cros_ec_prepare_tx(ec_dev, ec_msg); > dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); > > /* If it's too soon to do another transaction, wait */ > - if (ec_spi->last_transfer_ns) { > - unsigned long delay; /* The delay completed so far */ > - > - delay = ktime_get_ns() - ec_spi->last_transfer_ns; > - if (delay < EC_SPI_RECOVERY_TIME_NS) > - ndelay(EC_SPI_RECOVERY_TIME_NS - delay); > - } > + delay = ktime_get_ns() - ec_spi->last_transfer_ns; > + if (delay < EC_SPI_RECOVERY_TIME_NS) > + ndelay(EC_SPI_RECOVERY_TIME_NS - delay); > > rx_buf = kzalloc(len, GFP_KERNEL); > if (!rx_buf) > @@ -510,18 +506,15 @@ static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, > u8 *rx_buf; > int sum; > int ret = 0, final_ret; > + unsigned long delay; > > len = cros_ec_prepare_tx(ec_dev, ec_msg); > dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); > > /* If it's too soon to do another transaction, wait */ > - if (ec_spi->last_transfer_ns) { > - unsigned long delay; /* The delay completed so far */ > - > - delay = ktime_get_ns() - ec_spi->last_transfer_ns; > - if (delay < EC_SPI_RECOVERY_TIME_NS) > - ndelay(EC_SPI_RECOVERY_TIME_NS - delay); > - } > + delay = ktime_get_ns() - ec_spi->last_transfer_ns; > + if (delay < EC_SPI_RECOVERY_TIME_NS) > + ndelay(EC_SPI_RECOVERY_TIME_NS - delay); > > rx_buf = kzalloc(len, GFP_KERNEL); > if (!rx_buf) > -- > 2.7.4 > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] mfd: cros ec: spi: Simplify delay handling between SPI messages 2017-11-13 21:05 ` Jon Hunter @ 2017-11-29 11:07 ` Lee Jones -1 siblings, 0 replies; 14+ messages in thread From: Lee Jones @ 2017-11-29 11:07 UTC (permalink / raw) To: Jon Hunter Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-tegra-u79uwXL29TY76Z2rM5mHXA, Brian Norris, Shawn Nematbakhsh On Mon, 13 Nov 2017, Jon Hunter wrote: > The EC SPI driver prevents SPI transfers being to rapidly by keeping > track of the time the last transfer was issued via the > 'last_transfer_ns' variable. Previously, if the 'last_transfer_ns' > variable was zero, this indicated that no previous transfer had been > sent and that no delay was needed. However, the EC SPI driver has > been updated to always initialise the 'last_transfer_ns' variable > during probe and therefore, it is no longer necessary to test if it > is zero. Remove the code that checks if this variable is zero. > > Signed-off-by: Jon Hunter <jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> > --- > drivers/mfd/cros_ec_spi.c | 25 +++++++++---------------- > 1 file changed, 9 insertions(+), 16 deletions(-) Applied, thanks. -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] mfd: cros ec: spi: Simplify delay handling between SPI messages @ 2017-11-29 11:07 ` Lee Jones 0 siblings, 0 replies; 14+ messages in thread From: Lee Jones @ 2017-11-29 11:07 UTC (permalink / raw) To: Jon Hunter; +Cc: linux-kernel, linux-tegra, Brian Norris, Shawn Nematbakhsh On Mon, 13 Nov 2017, Jon Hunter wrote: > The EC SPI driver prevents SPI transfers being to rapidly by keeping > track of the time the last transfer was issued via the > 'last_transfer_ns' variable. Previously, if the 'last_transfer_ns' > variable was zero, this indicated that no previous transfer had been > sent and that no delay was needed. However, the EC SPI driver has > been updated to always initialise the 'last_transfer_ns' variable > during probe and therefore, it is no longer necessary to test if it > is zero. Remove the code that checks if this variable is zero. > > Signed-off-by: Jon Hunter <jonathanh@nvidia.com> > --- > drivers/mfd/cros_ec_spi.c | 25 +++++++++---------------- > 1 file changed, 9 insertions(+), 16 deletions(-) Applied, thanks. -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 14+ messages in thread
[parent not found: <1510607140-30582-1-git-send-email-jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>]
* Re: [PATCH 1/2] mfd: cros ec: spi: Don't send first message too soon 2017-11-13 21:05 ` Jon Hunter @ 2017-11-13 21:19 ` Brian Norris -1 siblings, 0 replies; 14+ messages in thread From: Brian Norris @ 2017-11-13 21:19 UTC (permalink / raw) To: Jon Hunter Cc: Lee Jones, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-tegra-u79uwXL29TY76Z2rM5mHXA, Shawn Nematbakhsh, Benson Leung, Doug Anderson + others On Mon, Nov 13, 2017 at 09:05:39PM +0000, Jon Hunter wrote: > On the Tegra124 Nyan-Big chromebook the very first SPI message sent to > the EC is failing. > > The Tegra SPI driver configures the SPI chip-selects to be active-high > by default (and always has for many years). The EC SPI requires an > active-low chip-select and so the Tegra chip-select is reconfigured to > be active-low when the EC SPI driver calls spi_setup(). The problem is > that if the first SPI message to the EC is sent too soon after > reconfiguring the SPI chip-select, it fails. > > The EC SPI driver prevents back-to-back SPI messages being sent too > soon by keeping track of the time the last transfer was sent via the > variable 'last_transfer_ns'. To prevent the very first transfer being > sent too soon, initialise the 'last_transfer_ns' variable after calling > spi_setup() and before sending the first SPI message. > > Signed-off-by: Jon Hunter <jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> > --- > Looks like this issue has been around for several Linux releases now > and it just depends on timing if this issue is seen or not and so there > is no specific commit this fixes. However, would be good to include for > v4.15. I wonder if that doesn't mean we should have a stable tag still? Cc: <stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org> > drivers/mfd/cros_ec_spi.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/mfd/cros_ec_spi.c b/drivers/mfd/cros_ec_spi.c > index c9714072e224..a14196e95e9b 100644 > --- a/drivers/mfd/cros_ec_spi.c > +++ b/drivers/mfd/cros_ec_spi.c > @@ -667,6 +667,7 @@ static int cros_ec_spi_probe(struct spi_device *spi) > sizeof(struct ec_response_get_protocol_info); > ec_dev->dout_size = sizeof(struct ec_host_request); > > + ec_spi->last_transfer_ns = ktime_get_ns(); Seems pretty reasonable to me: Reviewed-by: Brian Norris <briannorris-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org> > > err = cros_ec_register(ec_dev); > if (err) { > -- > 2.7.4 > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] mfd: cros ec: spi: Don't send first message too soon @ 2017-11-13 21:19 ` Brian Norris 0 siblings, 0 replies; 14+ messages in thread From: Brian Norris @ 2017-11-13 21:19 UTC (permalink / raw) To: Jon Hunter Cc: Lee Jones, linux-kernel, linux-tegra, Shawn Nematbakhsh, Benson Leung, Doug Anderson + others On Mon, Nov 13, 2017 at 09:05:39PM +0000, Jon Hunter wrote: > On the Tegra124 Nyan-Big chromebook the very first SPI message sent to > the EC is failing. > > The Tegra SPI driver configures the SPI chip-selects to be active-high > by default (and always has for many years). The EC SPI requires an > active-low chip-select and so the Tegra chip-select is reconfigured to > be active-low when the EC SPI driver calls spi_setup(). The problem is > that if the first SPI message to the EC is sent too soon after > reconfiguring the SPI chip-select, it fails. > > The EC SPI driver prevents back-to-back SPI messages being sent too > soon by keeping track of the time the last transfer was sent via the > variable 'last_transfer_ns'. To prevent the very first transfer being > sent too soon, initialise the 'last_transfer_ns' variable after calling > spi_setup() and before sending the first SPI message. > > Signed-off-by: Jon Hunter <jonathanh@nvidia.com> > --- > Looks like this issue has been around for several Linux releases now > and it just depends on timing if this issue is seen or not and so there > is no specific commit this fixes. However, would be good to include for > v4.15. I wonder if that doesn't mean we should have a stable tag still? Cc: <stable@vger.kernel.org> > drivers/mfd/cros_ec_spi.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/mfd/cros_ec_spi.c b/drivers/mfd/cros_ec_spi.c > index c9714072e224..a14196e95e9b 100644 > --- a/drivers/mfd/cros_ec_spi.c > +++ b/drivers/mfd/cros_ec_spi.c > @@ -667,6 +667,7 @@ static int cros_ec_spi_probe(struct spi_device *spi) > sizeof(struct ec_response_get_protocol_info); > ec_dev->dout_size = sizeof(struct ec_host_request); > > + ec_spi->last_transfer_ns = ktime_get_ns(); Seems pretty reasonable to me: Reviewed-by: Brian Norris <briannorris@chromium.org> > > err = cros_ec_register(ec_dev); > if (err) { > -- > 2.7.4 > ^ permalink raw reply [flat|nested] 14+ messages in thread
[parent not found: <20171113211900.GA126873-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>]
* Re: [PATCH 1/2] mfd: cros ec: spi: Don't send first message too soon 2017-11-13 21:19 ` Brian Norris @ 2017-11-14 14:44 ` Jon Hunter -1 siblings, 0 replies; 14+ messages in thread From: Jon Hunter @ 2017-11-14 14:44 UTC (permalink / raw) To: Brian Norris Cc: Lee Jones, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-tegra-u79uwXL29TY76Z2rM5mHXA, Shawn Nematbakhsh, Benson Leung, Doug Anderson On 13/11/17 21:19, Brian Norris wrote: > + others > > On Mon, Nov 13, 2017 at 09:05:39PM +0000, Jon Hunter wrote: >> On the Tegra124 Nyan-Big chromebook the very first SPI message sent to >> the EC is failing. >> >> The Tegra SPI driver configures the SPI chip-selects to be active-high >> by default (and always has for many years). The EC SPI requires an >> active-low chip-select and so the Tegra chip-select is reconfigured to >> be active-low when the EC SPI driver calls spi_setup(). The problem is >> that if the first SPI message to the EC is sent too soon after >> reconfiguring the SPI chip-select, it fails. >> >> The EC SPI driver prevents back-to-back SPI messages being sent too >> soon by keeping track of the time the last transfer was sent via the >> variable 'last_transfer_ns'. To prevent the very first transfer being >> sent too soon, initialise the 'last_transfer_ns' variable after calling >> spi_setup() and before sending the first SPI message. >> >> Signed-off-by: Jon Hunter <jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> >> --- >> Looks like this issue has been around for several Linux releases now >> and it just depends on timing if this issue is seen or not and so there >> is no specific commit this fixes. However, would be good to include for >> v4.15. > > I wonder if that doesn't mean we should have a stable tag still? > > Cc: <stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org> I was thinking about that as well after I sent it. I have resent as a V2 CC'ing stable. Cheers Jon -- nvpublic ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] mfd: cros ec: spi: Don't send first message too soon @ 2017-11-14 14:44 ` Jon Hunter 0 siblings, 0 replies; 14+ messages in thread From: Jon Hunter @ 2017-11-14 14:44 UTC (permalink / raw) To: Brian Norris Cc: Lee Jones, linux-kernel, linux-tegra, Shawn Nematbakhsh, Benson Leung, Doug Anderson On 13/11/17 21:19, Brian Norris wrote: > + others > > On Mon, Nov 13, 2017 at 09:05:39PM +0000, Jon Hunter wrote: >> On the Tegra124 Nyan-Big chromebook the very first SPI message sent to >> the EC is failing. >> >> The Tegra SPI driver configures the SPI chip-selects to be active-high >> by default (and always has for many years). The EC SPI requires an >> active-low chip-select and so the Tegra chip-select is reconfigured to >> be active-low when the EC SPI driver calls spi_setup(). The problem is >> that if the first SPI message to the EC is sent too soon after >> reconfiguring the SPI chip-select, it fails. >> >> The EC SPI driver prevents back-to-back SPI messages being sent too >> soon by keeping track of the time the last transfer was sent via the >> variable 'last_transfer_ns'. To prevent the very first transfer being >> sent too soon, initialise the 'last_transfer_ns' variable after calling >> spi_setup() and before sending the first SPI message. >> >> Signed-off-by: Jon Hunter <jonathanh@nvidia.com> >> --- >> Looks like this issue has been around for several Linux releases now >> and it just depends on timing if this issue is seen or not and so there >> is no specific commit this fixes. However, would be good to include for >> v4.15. > > I wonder if that doesn't mean we should have a stable tag still? > > Cc: <stable@vger.kernel.org> I was thinking about that as well after I sent it. I have resent as a V2 CC'ing stable. Cheers Jon -- nvpublic ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] mfd: cros ec: spi: Don't send first message too soon 2017-11-13 21:05 ` Jon Hunter @ 2017-11-29 11:07 ` Lee Jones -1 siblings, 0 replies; 14+ messages in thread From: Lee Jones @ 2017-11-29 11:07 UTC (permalink / raw) To: Jon Hunter Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-tegra-u79uwXL29TY76Z2rM5mHXA, Brian Norris, Shawn Nematbakhsh On Mon, 13 Nov 2017, Jon Hunter wrote: > On the Tegra124 Nyan-Big chromebook the very first SPI message sent to > the EC is failing. > > The Tegra SPI driver configures the SPI chip-selects to be active-high > by default (and always has for many years). The EC SPI requires an > active-low chip-select and so the Tegra chip-select is reconfigured to > be active-low when the EC SPI driver calls spi_setup(). The problem is > that if the first SPI message to the EC is sent too soon after > reconfiguring the SPI chip-select, it fails. > > The EC SPI driver prevents back-to-back SPI messages being sent too > soon by keeping track of the time the last transfer was sent via the > variable 'last_transfer_ns'. To prevent the very first transfer being > sent too soon, initialise the 'last_transfer_ns' variable after calling > spi_setup() and before sending the first SPI message. > > Signed-off-by: Jon Hunter <jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> > --- > Looks like this issue has been around for several Linux releases now > and it just depends on timing if this issue is seen or not and so there > is no specific commit this fixes. However, would be good to include for > v4.15. > > drivers/mfd/cros_ec_spi.c | 1 + > 1 file changed, 1 insertion(+) Applied, thanks. -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] mfd: cros ec: spi: Don't send first message too soon @ 2017-11-29 11:07 ` Lee Jones 0 siblings, 0 replies; 14+ messages in thread From: Lee Jones @ 2017-11-29 11:07 UTC (permalink / raw) To: Jon Hunter; +Cc: linux-kernel, linux-tegra, Brian Norris, Shawn Nematbakhsh On Mon, 13 Nov 2017, Jon Hunter wrote: > On the Tegra124 Nyan-Big chromebook the very first SPI message sent to > the EC is failing. > > The Tegra SPI driver configures the SPI chip-selects to be active-high > by default (and always has for many years). The EC SPI requires an > active-low chip-select and so the Tegra chip-select is reconfigured to > be active-low when the EC SPI driver calls spi_setup(). The problem is > that if the first SPI message to the EC is sent too soon after > reconfiguring the SPI chip-select, it fails. > > The EC SPI driver prevents back-to-back SPI messages being sent too > soon by keeping track of the time the last transfer was sent via the > variable 'last_transfer_ns'. To prevent the very first transfer being > sent too soon, initialise the 'last_transfer_ns' variable after calling > spi_setup() and before sending the first SPI message. > > Signed-off-by: Jon Hunter <jonathanh@nvidia.com> > --- > Looks like this issue has been around for several Linux releases now > and it just depends on timing if this issue is seen or not and so there > is no specific commit this fixes. However, would be good to include for > v4.15. > > drivers/mfd/cros_ec_spi.c | 1 + > 1 file changed, 1 insertion(+) Applied, thanks. -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2017-11-29 11:07 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-11-13 21:05 [PATCH 1/2] mfd: cros ec: spi: Don't send first message too soon Jon Hunter
2017-11-13 21:05 ` Jon Hunter
2017-11-13 21:05 ` [PATCH 2/2] mfd: cros ec: spi: Simplify delay handling between SPI messages Jon Hunter
2017-11-13 21:05 ` Jon Hunter
[not found] ` <1510607140-30582-2-git-send-email-jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2017-11-13 21:22 ` Brian Norris
2017-11-13 21:22 ` Brian Norris
2017-11-29 11:07 ` Lee Jones
2017-11-29 11:07 ` Lee Jones
[not found] ` <1510607140-30582-1-git-send-email-jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2017-11-13 21:19 ` [PATCH 1/2] mfd: cros ec: spi: Don't send first message too soon Brian Norris
2017-11-13 21:19 ` Brian Norris
[not found] ` <20171113211900.GA126873-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2017-11-14 14:44 ` Jon Hunter
2017-11-14 14:44 ` Jon Hunter
2017-11-29 11:07 ` Lee Jones
2017-11-29 11:07 ` Lee Jones
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.