From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754736AbdHVHlA (ORCPT ); Tue, 22 Aug 2017 03:41:00 -0400 Received: from mail-wr0-f176.google.com ([209.85.128.176]:37124 "EHLO mail-wr0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754637AbdHVHk6 (ORCPT ); Tue, 22 Aug 2017 03:40:58 -0400 Date: Tue, 22 Aug 2017 08:40:54 +0100 From: Lee Jones To: Furquan Shaikh Cc: linux-kernel@vger.kernel.org, rajatja@google.com, drinkcat@google.com, azhar.shaikh@intel.com, gregkh@linuxfoundation.org, mika.westerberg@linux.intel.com, andriy.shevchenko@linux.intel.com Subject: Re: [PATCH] mfd: intel-lpss: Put I2C and SPI controllers into reset state on suspend Message-ID: <20170822074054.enenrmp7kktfc3ww@dell> References: <20170724060219.12244-1-furquan@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20170724060219.12244-1-furquan@google.com> User-Agent: NeoMutt/20170113 (1.7.2) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, 23 Jul 2017, Furquan Shaikh wrote: > Commit 274e43edcda6f ("mfd: intel-lpss: Do not put device in reset > state on suspend") changed the behavior on suspend by not putting LPSS > controllers into reset. This was done because S3/S0ix fail if UART > device is put into reset and no_console_suspend flag is enabled. > > Because of the above change, I2C controller gets into a bad state if > it observes that the I2C lines are pulled low when power to I2C device > is cut off during suspend (generally, I2C lines are pulled to power > rail of the I2C device in order to ensure that there is no leakage > because of the pulls when device is turned off). This results in the > controller timing out for all future I2C operations after resume. It > is primarily because of the following sequence of operations: > > During suspend: > 1. I2C controller is disabled, but it is not put into reset. > 2. Power to I2C device is cut off. > 3. #2 results in the I2C lines being pulled low. > > ==> At this point the I2C controller gets into a bad state > > On resume: > 1. Power to I2C device is enabled. > 2. #2 results in the I2C lines being pulled high. > 3. I2C controller is enabled. > > However, even after enabling the I2C controller, all future I2C xfers > fail since the controller is in a bad state and does not attempt to > make any transactions and hence times out. > > In order to ensure that the controller does not get into a bad state, > this change puts it into reset if the controller type is not > UART. With this change, the order of operations is: > > During suspend: > 1. I2C controller is disabled and put into reset. > 2. Power to I2C device is cut off. > 3. #2 results in the I2C lines being pulled low. > > On resume: > 1. Power to I2C device is enabled. > 2. #2 results in the I2C lines being pulled high. > 3. I2C controller is enabled and taken out of reset. > > Signed-off-by: Furquan Shaikh > --- > drivers/mfd/intel-lpss.c | 8 ++++++++ > 1 file changed, 8 insertions(+) Applied, thanks. -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog