Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752353AbdCAMRb (ORCPT ); Wed, 1 Mar 2017 07:17:31 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:43733 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751467AbdCAMRa (ORCPT ); Wed, 1 Mar 2017 07:17:30 -0500 Subject: Re: [PATCH] tpm: do not suspend/resume if power stays on To: Peter Huewe , Rob Herring References: <20170301115116.19696-1-enric.balletbo@collabora.com> Cc: linux-kernel@vger.kernel.org, tpmdd-devel@lists.sourceforge.net, Mark Rutland , Jarkko Sakkinen , Sonny Rao From: Enric Balletbo i Serra Message-ID: Date: Wed, 1 Mar 2017 13:08:55 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3810 Lines: 120 Hi Peter, On 01/03/17 13:00, Peter Huewe wrote: > > > Am 1. März 2017 12:51:16 MEZ schrieb Enric Balletbo i Serra : >> From: Sonny Rao >> >> The suspend/resume behavior of the TPM can be controlled >> by setting "powered-while-suspended" in the DTS. >> >> Signed-off-by: Sonny Rao >> Signed-off-by: Enric Balletbo i Serra >> --- >> Documentation/devicetree/bindings/tpm/tpm.txt | 25 >> +++++++++++++++++++++++++ >> drivers/char/tpm/tpm_i2c_infineon.c | 25 >> ++++++++++++++++++++++++- >> 2 files changed, 49 insertions(+), 1 deletion(-) >> create mode 100644 Documentation/devicetree/bindings/tpm/tpm.txt >> >> diff --git a/Documentation/devicetree/bindings/tpm/tpm.txt >> b/Documentation/devicetree/bindings/tpm/tpm.txt >> new file mode 100644 >> index 0000000..af4de0d >> --- /dev/null >> +++ b/Documentation/devicetree/bindings/tpm/tpm.txt > > Hi, for this device there exists a binding in the i2c subfolder > > https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/bindings/i2c/trivial-devices.txt?id=refs/tags/v4.10 > Thanks to catch this, I propose remove from trivial-devices.txt and create a new binding called Documentation/devicetree/bindings/i2c/i2c-tpm-infineon.txt for tpm-infineon devices? What do you think? Thanks, Enric > Peter >> @@ -0,0 +1,25 @@ >> +TPM (Trusted Platform Module) >> + >> +A TPM on the I2C bus is a child of the node for the bus. >> + >> +Required properties: >> +- compatible: should be "infineon," >> +- reg: the I2C address >> + >> +Optional properties: >> +- powered-while-suspended: present when the TPM is left powered on >> between >> + suspend and resume (makes the suspend/resume callbacks do nothing). >> + >> +Example: >> + i2c@12C90000 { >> + samsung,i2c-sda-delay = <100>; >> + samsung,i2c-max-bus-freq = <66000>; >> + gpios = <&gpa1 2 3 3 0>, >> + <&gpa1 3 3 3 0>; >> + >> + tpm { >> + compatible = "infineon,slb9635tt"; >> + reg = <0x20>; >> + powered-while-suspended; >> + }; >> + }; >> diff --git a/drivers/char/tpm/tpm_i2c_infineon.c >> b/drivers/char/tpm/tpm_i2c_infineon.c >> index 62ee44e..19d9522 100644 >> --- a/drivers/char/tpm/tpm_i2c_infineon.c >> +++ b/drivers/char/tpm/tpm_i2c_infineon.c >> @@ -70,6 +70,7 @@ struct tpm_inf_dev { >> u8 buf[TPM_BUFSIZE + sizeof(u8)]; /* max. buffer size + addr */ >> struct tpm_chip *chip; >> enum i2c_chip_type chip_type; >> + bool powered_while_suspended; >> }; >> >> static struct tpm_inf_dev tpm_dev; >> @@ -599,6 +600,11 @@ static int tpm_tis_i2c_init(struct device *dev) >> goto out_err; >> } >> >> + if (dev->of_node && >> + of_get_property(dev->of_node, "powered-while-suspended", NULL)) { >> + tpm_dev.powered_while_suspended = true; >> + } >> + >> /* read four bytes from DID_VID register */ >> if (iic_tpm_read(TPM_DID_VID(0), (u8 *)&vendor, 4) < 0) { >> dev_err(dev, "could not read vendor id\n"); >> @@ -662,7 +668,24 @@ static const struct of_device_id >> tpm_tis_i2c_of_match[] = { >> MODULE_DEVICE_TABLE(of, tpm_tis_i2c_of_match); >> #endif >> >> -static SIMPLE_DEV_PM_OPS(tpm_tis_i2c_ops, tpm_pm_suspend, >> tpm_pm_resume); >> +static int __maybe_unused tpm_tis_i2c_suspend(struct device *dev) >> +{ >> + if (tpm_dev.powered_while_suspended) >> + return 0; >> + >> + return tpm_pm_suspend(dev); >> +} >> + >> +static int __maybe_unused tpm_tis_i2c_resume(struct device *dev) >> +{ >> + if (tpm_dev.powered_while_suspended) >> + return 0; >> + >> + return tpm_pm_resume(dev); >> +} >> + >> +static SIMPLE_DEV_PM_OPS(tpm_tis_i2c_ops, tpm_tis_i2c_suspend, >> + tpm_tis_i2c_resume); >> >> static int tpm_tis_i2c_probe(struct i2c_client *client, >> const struct i2c_device_id *id) >