diff mbox series

[v3] char: tpm: cr50: Set TPM_FIRMWARE_POWER_MANAGED based on device property

Message ID 20211206120311.2844838-1-robbarnes@google.com (mailing list archive)
State New, archived
Headers show
Series [v3] char: tpm: cr50: Set TPM_FIRMWARE_POWER_MANAGED based on device property | expand

Commit Message

Rob Barnes Dec. 6, 2021, 12:03 p.m. UTC
Set TPM_FIRMWARE_POWER_MANAGED flag based on 'firmware-power-managed'
ACPI DSD property. For the CR50 TPM, this flag defaults to true when
the property is unset.

When this flag is set to false, the CR50 TPM driver will always send
a shutdown command whenever the system suspends.

Signed-off-by: Rob Barnes <robbarnes@google.com>
---
 drivers/char/tpm/tpm_tis_i2c_cr50.c | 16 +++++++++++++++-
 drivers/char/tpm/tpm_tis_spi_cr50.c | 16 +++++++++++++++-
 2 files changed, 30 insertions(+), 2 deletions(-)

Comments

Jarkko Sakkinen Dec. 11, 2021, 5:06 a.m. UTC | #1
On Mon, 2021-12-06 at 12:03 +0000, Rob Barnes wrote:
> Set TPM_FIRMWARE_POWER_MANAGED flag based on 'firmware-power-managed'
> ACPI DSD property. For the CR50 TPM, this flag defaults to true when
> the property is unset.
> 
> When this flag is set to false, the CR50 TPM driver will always send
> a shutdown command whenever the system suspends.
> 
> Signed-off-by: Rob Barnes <robbarnes@google.com>
> ---
>  drivers/char/tpm/tpm_tis_i2c_cr50.c | 16 +++++++++++++++-
>  drivers/char/tpm/tpm_tis_spi_cr50.c | 16 +++++++++++++++-
>  2 files changed, 30 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm_tis_i2c_cr50.c b/drivers/char/tpm/tpm_tis_i2c_cr50.c
> index c89278103703..f6c0affbb456 100644
> --- a/drivers/char/tpm/tpm_tis_i2c_cr50.c
> +++ b/drivers/char/tpm/tpm_tis_i2c_cr50.c
> @@ -628,6 +628,19 @@ static bool tpm_cr50_i2c_req_canceled(struct tpm_chip *chip, u8 status)
>  	return status == TPM_STS_COMMAND_READY;
>  }
>  
> +static bool tpm_cr50_i2c_is_firmware_power_managed(struct device *dev)
> +{
> +	u8 val;
> +	int ret;
> +
> +	/* This flag should default true when the device property is not present */
> +	ret = device_property_read_u8(dev, "firmware-power-managed", &val);
> +	if (ret)
> +		return true;
> +
> +	return val;
> +}
> +
>  static const struct tpm_class_ops cr50_i2c = {
>  	.flags = TPM_OPS_AUTO_STARTUP,
>  	.status = &tpm_cr50_i2c_tis_status,
> @@ -686,7 +699,8 @@ static int tpm_cr50_i2c_probe(struct i2c_client *client)
>  
>  	/* cr50 is a TPM 2.0 chip */
>  	chip->flags |= TPM_CHIP_FLAG_TPM2;
> -	chip->flags |= TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED;
> +	if (tpm_cr50_i2c_is_firmware_power_managed(dev))
> +		chip->flags |= TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED;
>  
>  	/* Default timeouts */
>  	chip->timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
> diff --git a/drivers/char/tpm/tpm_tis_spi_cr50.c b/drivers/char/tpm/tpm_tis_spi_cr50.c
> index dae98dbeeeac..7bf123d3c537 100644
> --- a/drivers/char/tpm/tpm_tis_spi_cr50.c
> +++ b/drivers/char/tpm/tpm_tis_spi_cr50.c
> @@ -185,6 +185,19 @@ static int cr50_spi_flow_control(struct tpm_tis_spi_phy *phy,
>  	return 0;
>  }
>  
> +static bool tpm_cr50_spi_is_firmware_power_managed(struct device *dev)
> +{
> +	u8 val;
> +	int ret;
> +
> +	/* This flag should default true when the device property is not present */
> +	ret = device_property_read_u8(dev, "firmware-power-managed", &val);
> +	if (ret)
> +		return true;
> +
> +	return val;
> +}
> +
>  static int tpm_tis_spi_cr50_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
>  				     u8 *in, const u8 *out)
>  {
> @@ -309,7 +322,8 @@ int cr50_spi_probe(struct spi_device *spi)
>  	cr50_print_fw_version(&phy->priv);
>  
>  	chip = dev_get_drvdata(&spi->dev);
> -	chip->flags |= TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED;
> +	if (tpm_cr50_spi_is_firmware_power_managed(&spi->dev))
> +		chip->flags |= TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED;
>  
>  	return 0;
>  }

Thank you.

Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>

I applied this to my tree, and it should be visible in linux-next soon.

/Jarkko
diff mbox series

Patch

diff --git a/drivers/char/tpm/tpm_tis_i2c_cr50.c b/drivers/char/tpm/tpm_tis_i2c_cr50.c
index c89278103703..f6c0affbb456 100644
--- a/drivers/char/tpm/tpm_tis_i2c_cr50.c
+++ b/drivers/char/tpm/tpm_tis_i2c_cr50.c
@@ -628,6 +628,19 @@  static bool tpm_cr50_i2c_req_canceled(struct tpm_chip *chip, u8 status)
 	return status == TPM_STS_COMMAND_READY;
 }
 
+static bool tpm_cr50_i2c_is_firmware_power_managed(struct device *dev)
+{
+	u8 val;
+	int ret;
+
+	/* This flag should default true when the device property is not present */
+	ret = device_property_read_u8(dev, "firmware-power-managed", &val);
+	if (ret)
+		return true;
+
+	return val;
+}
+
 static const struct tpm_class_ops cr50_i2c = {
 	.flags = TPM_OPS_AUTO_STARTUP,
 	.status = &tpm_cr50_i2c_tis_status,
@@ -686,7 +699,8 @@  static int tpm_cr50_i2c_probe(struct i2c_client *client)
 
 	/* cr50 is a TPM 2.0 chip */
 	chip->flags |= TPM_CHIP_FLAG_TPM2;
-	chip->flags |= TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED;
+	if (tpm_cr50_i2c_is_firmware_power_managed(dev))
+		chip->flags |= TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED;
 
 	/* Default timeouts */
 	chip->timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
diff --git a/drivers/char/tpm/tpm_tis_spi_cr50.c b/drivers/char/tpm/tpm_tis_spi_cr50.c
index dae98dbeeeac..7bf123d3c537 100644
--- a/drivers/char/tpm/tpm_tis_spi_cr50.c
+++ b/drivers/char/tpm/tpm_tis_spi_cr50.c
@@ -185,6 +185,19 @@  static int cr50_spi_flow_control(struct tpm_tis_spi_phy *phy,
 	return 0;
 }
 
+static bool tpm_cr50_spi_is_firmware_power_managed(struct device *dev)
+{
+	u8 val;
+	int ret;
+
+	/* This flag should default true when the device property is not present */
+	ret = device_property_read_u8(dev, "firmware-power-managed", &val);
+	if (ret)
+		return true;
+
+	return val;
+}
+
 static int tpm_tis_spi_cr50_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
 				     u8 *in, const u8 *out)
 {
@@ -309,7 +322,8 @@  int cr50_spi_probe(struct spi_device *spi)
 	cr50_print_fw_version(&phy->priv);
 
 	chip = dev_get_drvdata(&spi->dev);
-	chip->flags |= TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED;
+	if (tpm_cr50_spi_is_firmware_power_managed(&spi->dev))
+		chip->flags |= TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED;
 
 	return 0;
 }