Am 1. März 2017 12:51:16 MEZ schrieb Enric Balletbo i Serra 
<enric.balle...@collabora.com>:
>From: Sonny Rao <sonny...@chromium.org>
>
>The suspend/resume behavior of the TPM can be controlled
>by setting "powered-while-suspended" in the DTS.
>
>Signed-off-by: Sonny Rao <sonny...@chromium.org>
>Signed-off-by: Enric Balletbo i Serra <enric.balle...@collabora.com>
>---
>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

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,<chip>"
>+- 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)

-- 
Sent from my mobile

Reply via email to