Received: by 10.223.164.202 with SMTP id h10csp1730115wrb; Wed, 8 Nov 2017 08:46:24 -0800 (PST) X-Google-Smtp-Source: ABhQp+QgZGUxn9T6HKgtEStSKOX4kAIxndrnzvS7swefu3MskuiXjGydTQ6gotjennSLJQn+qMYx X-Received: by 10.101.67.200 with SMTP id n8mr1036339pgp.228.1510159584060; Wed, 08 Nov 2017 08:46:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1510159584; cv=none; d=google.com; s=arc-20160816; b=lMvDVuZngx83i5rxkSSNW/Ho5wOCQlj6e2DDKVszmzRG8xC5h2v71Rn7ycLuoLi0x7 wYVF9a4AhktPC5EG29zByAwQ3HdQU5G4aQPnFi9VYJ8ctiJISaZu+0xCZk0N1Andv/JE PhAgibraUyLBUHmVRHHYHmmCcKO4Zy0sntWA1ZFdHl1eeAHf0JzdL7dnwqwUxhZkpWpV 36ua5lSlJw4O5dHauHXlxOQ/X5YpAsPeIsGEt0VPzeMmAD1zEhKiL5QswSqP0dW3GYyb xbOZvfmN4q9QeRQQvOcSZPuAlKCu4o+9T2fbJVPf/rO+Arl4SMBKTQZ0AG51IU3X6iCt 7Z3A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature:dkim-signature :arc-authentication-results; bh=0y9HjqCN3Jsg48soyYr9IX/FgU1pOe+XERmx3K5PsoI=; b=My4JhPnbGGhAkKsrr8owfq632uM/YnYvE+20q26cO0az2wB83SwHFamVVfKEeBmHjf AJEYwyaa4Dui5qmy8y8L7d7aEz0hoUu5gBGTmV72xNwY5j+zSH4EiFZ1P0b76Yp83Ff3 zSwvwzetxHYPmTYdYy/heFkEOw46Ex4IRR4Gg3E3gCwH2czgPdzJSRpVi4J5Patv2rv1 ZfgytETLCxM09RlM25bbW06rNHH6cB2wdAhgQgtR+iy1FhsLUefplyRK1mlAfdWBpr8j WXWZMWDiFmwYM4FGw3gnn6gUoKX0jNfkcYbFA1P05jaSNg6Hl+SWazRCJ/mOTixwZ8Sd bd4g== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@google.com header.s=20161025 header.b=YEbQZ+v2; dkim=fail header.i=@chromium.org header.s=google header.b=GpABQGbf; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h9si4307608pgv.572.2017.11.08.08.46.11; Wed, 08 Nov 2017 08:46:24 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@google.com header.s=20161025 header.b=YEbQZ+v2; dkim=fail header.i=@chromium.org header.s=google header.b=GpABQGbf; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752759AbdKHQpb (ORCPT + 84 others); Wed, 8 Nov 2017 11:45:31 -0500 Received: from mail-vk0-f47.google.com ([209.85.213.47]:54445 "EHLO mail-vk0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752150AbdKHQp3 (ORCPT ); Wed, 8 Nov 2017 11:45:29 -0500 Received: by mail-vk0-f47.google.com with SMTP id n70so2120233vkf.11 for ; Wed, 08 Nov 2017 08:45:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=0y9HjqCN3Jsg48soyYr9IX/FgU1pOe+XERmx3K5PsoI=; b=YEbQZ+v2r6ECPRskRsop6KH7HVZA05QSDiwB4hebFDF/G6/px7TrR/nuKxXNpUZh6w ksjv5J5+yAaopCOYfsQ4jZC2XMYN+vJEoIpQBHHQjgz6tJTidGH48DXmpFmJu/Q/HVAB /HSku/FtGovk353HO0KLTLg9foIiyGg7YO6OeQ82PFALPZn/vsnS38IzT+1C2DzWztfH a1b4JiUU6kIrpSLFw6xQjFVYT/q2ux5AD2sTPVTBLjrXsci9UDleIPWQVgGdhEFn1WtU k/V/6XjLp1MKpCbq0WHcLZOsbAMqc8OHY3nTkjLNdyLtXS1kO3uGWw8MASdoTkKVJT1U V1kw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=0y9HjqCN3Jsg48soyYr9IX/FgU1pOe+XERmx3K5PsoI=; b=GpABQGbfbYH4gJtRG00EPI7kWIUdjynlIMoJAFZpgHrux382VjoNLM2oheEMwcg7F6 WomLDSYfY4k+RTzyTdejQBU466BXec1ixyuwg5QZ17Yfxuq0vxDkdiPb+QyRh+wJ44ic cJvSRWzO3vPftKxVOJ03vzB92fm/WMWFX2lEg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=0y9HjqCN3Jsg48soyYr9IX/FgU1pOe+XERmx3K5PsoI=; b=smw5xjUKpnqTzBMh6nupw88Ci72jwxECU1LJUzKwQSgNV21+Nrl0ef5ngYBbCBona9 mjhpLxrWbMBVFELsU4zo7rQak9oyPi8r0dk7Q/DI3qPTGEaPeQalA1W8Ino7/spklA6n Wzf963HoXPm4FZDqMAgokvBbl9GxQks3CnQxAHQE7Exs55WnFBonj6fbCSDWVvuo56JY N/XNO5cxgXryRV6tHorHz8g7t5s4XggmzmTlDgtsk9fxLeBfAxOWz6RA8ePi9rXHwaRe l8qZs97HbMecyYtaUVS/EAT+n7WcHv2aLk8sLddDZ0G+hiAzIVjDf7zg0ewWph6NhEfD bRPg== X-Gm-Message-State: AJaThX4rR3l/EqFN6khmnkTV23TMi+lvTciyKkUJqgxGwbhNz27LTmIh rGCQkGnvwAwdFYXmn0qRzxSftX+DoKI5HJ1BjIuG8Q== X-Received: by 10.31.55.137 with SMTP id e131mr865610vka.143.1510159527419; Wed, 08 Nov 2017 08:45:27 -0800 (PST) MIME-Version: 1.0 Received: by 10.31.147.81 with HTTP; Wed, 8 Nov 2017 08:45:26 -0800 (PST) In-Reply-To: References: <20170908205011.77986-1-briannorris@chromium.org> <02aa65e7-e967-055b-2af3-2e9b6ef77935@nvidia.com> <20170919171401.GA10968@google.com> <20170920061317.GB13616@google.com> <6beb7b8c-f602-112b-73b2-22188dcea28e@nvidia.com> <5ae1292d-14dc-b917-84cc-2758e82c4795@nvidia.com> From: Doug Anderson Date: Wed, 8 Nov 2017 08:45:26 -0800 X-Google-Sender-Auth: 6Tmuff0MlT6DvP035dFrMUnWm1s Message-ID: Subject: Re: [PATCH v3] platform/chrome: Use proper protocol transfer function To: Jon Hunter Cc: Shawn N , Olof Johansson , Benson Leung , Lee Jones , "linux-kernel@vger.kernel.org" , Brian Norris , Brian Norris , Gwendal Grignou , Enric Balletbo , Tomeu Vizoso , "linux-tegra@vger.kernel.org" , Alexandru M Stan Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, On Wed, Nov 8, 2017 at 2:20 AM, Jon Hunter wrote: > Hi Doug, > > On 07/11/17 17:22, Doug Anderson wrote: >> On Tue, Nov 7, 2017 at 3:28 AM, Jon Hunter wrote: >>> On 10/10/17 17:52, Doug Anderson wrote: >>> >>> ... >>> >>>>> I'm still not clear on why we see an error only on the first >>>>> transaction after boot. In this case, the embedded controller >>>>> previously handled host commands from firmware just fine, and the >>>>> handoff between firmware and the kernel shouldn't be significant, from >>>>> the EC point of view. If host command timing is consistent from the >>>>> master, I would expect to see some constant error rate, eg. some >>>>> chance any host command will fail, rather than the first host command >>>>> always failing. >>>> >>>> The AP itself is often quite busy at boot and so the timings for >>>> everything change. That could easily explain the problems. >>> >>> Sorry for the delay, but I have finally had some time to look at this a >>> bit closer. I have been able to track down where the additional delay is >>> really needed and seems to explain what is going on. >>> >>> For starters, the SPI chip-select is under h/w control and so the >>> software delay has no impact on the timing between the chip-select >>> going active and the transaction starting as I had first thought. >>> >>> I found that a delay is needed between completing the probe the Tegra >>> SPI device and the first SPI transaction issued to the EC. In the Tegra >>> SPI probe the SPI controller is programmed for master mode, but at the >>> same time it clears the chip-select inactive polarity bit meaning that >>> initially the SPI chip-select default to active-high (rather that low >>> which seems odd). I believe that this then drives the chip-select low >>> (active for the EC) and until it is then configured when spi_setup() is >>> called which configures it as active-low for the EC. >>> To get the first transaction to work for the EC there needs to be a >>> delay after we program the chip-select polarity when spi_setup() is >>> called. For example ... >>> >>> diff --git a/drivers/mfd/cros_ec_spi.c b/drivers/mfd/cros_ec_spi.c >>> index 584367f3a0ed..c1075c3c60c8 100644 >>> --- a/drivers/mfd/cros_ec_spi.c >>> +++ b/drivers/mfd/cros_ec_spi.c >>> @@ -648,6 +648,8 @@ static int cros_ec_spi_probe(struct spi_device *spi) >>> if (err < 0) >>> return err; >>> >>> + udelay(100); >>> + >> >> This isn't totally crazy, but actually you could probably do this: >> >> ec_spi->last_transfer_ns = ktime_get_ns(); >> >> ...that will leverage already existing code and constants and also >> will avoid doing a delay if it wasn't needed. You could also then get >> rid of some "if (ec_spi->last_transfer_ns)" tests in the code. I'd >> support landing that. >> >> >>> ec_spi = devm_kzalloc(dev, sizeof(*ec_spi), GFP_KERNEL); >>> if (ec_spi == NULL) >>> return -ENOMEM; >>> > > > OK, yes and that does work well too. I will send a patch with the > following for review. > > diff --git a/drivers/mfd/cros_ec_spi.c b/drivers/mfd/cros_ec_spi.c > index 584367f3a0ed..477f8e81dc34 100644 > --- a/drivers/mfd/cros_ec_spi.c > +++ b/drivers/mfd/cros_ec_spi.c > @@ -671,6 +671,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) { That's sufficient to make it work, but now that "last_transfer_ns" can never be 0 you should also fix that. It's hard to paste a patch in gmail and the change is trivial so I didn't try to find another way to post it, but roughly: - * @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. === + unsigned long delay; /* The delay completed so far */ 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); === + unsigned long delay; /* The delay completed so far */ 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); >>> You may say why not put a delay in the tegra_spi_setup() itself, but we >>> have some other SPI devices such as flash devices which are also use an >>> active-low chip-select which don't have any issues with this to date. >>> Furthermore, this delay is also probably device specific. >>> >>> From an EC perspective, if the chip-select is asserted is there a >>> turnaround time before it can be asserted again? Or in this case maybe >>> the issue is that the chip-select is asserted but no transaction occurs >>> before it is de-asserted and so is causing a problem. Please note that a >>> delay of around ~50us above still fails but 100us seems to be ok. >> >> Really nice detective work! >> >> >>> Finally, this also works-around the problem by avoiding the chip-select >>> from being pulsed low by defaulting all chip-selects to active-low but >>> maybe this just masks the problem. >>> >>> diff --git a/drivers/spi/spi-tegra114.c b/drivers/spi/spi-tegra114.c >>> index a76acedd7e2f..7c18204e61d9 100644 >>> --- a/drivers/spi/spi-tegra114.c >>> +++ b/drivers/spi/spi-tegra114.c >>> @@ -1117,7 +1117,7 @@ static int tegra_spi_probe(struct platform_device >>> goto exit_pm_disable; >>> } >>> - tspi->def_command1_reg = SPI_M_S; >>> + tspi->def_command1_reg = SPI_M_S | SPI_CS_POL_INACTIVE_MASK; >> >> Note that even though I'd support adding some sort of delay to the >> cros_ec driver, I'd also say that it _might_ make sense to mess with >> the SPI driver too, just to avoid glitching the lines at bootup. As >> you said, you shouldn't just willy nilly change the default but it >> seems like it could make sense to define an initial (board level) >> pinctrl state that's in effect until the first call to setup_bus(). > > I am thinking about making that above change as well, because the reset > value of the chip-select polarity bits default to active-low. For > active-high devices I don't think that you can ever avoid the > chip-select asserting for a period after reset as that is the default > setting, but I don't see why we are clearing these bits in probe. Is the default muxing option for these pins to be SPI? If not then you'd have to look at the default muxing option and possibly the default pull option. > I will do a bit more testing with this to avoid any regressions, but > both changes seem worthwhile IMO. It does seem slightly risky to change the default for all boards, but I'll leave it up to you. I think you can get this right with all the pinctrl stuff I mentioned, but that definitely would be a lot more work. Also: if you land the cros ec change, it's not exactly urgent... -Doug From 1583492877424717599@xxx Wed Nov 08 10:21:27 +0000 2017 X-GM-THRID: 1578006392712496529 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread