Commit 2e2ee5a2 authored by Stephen Boyd's avatar Stephen Boyd Committed by Jarkko Sakkinen
Browse files

tpm: Add a flag to indicate TPM power is managed by firmware



On some platforms, the TPM power is managed by firmware and therefore we
don't need to stop the TPM on suspend when going to a light version of
suspend such as S0ix ("freeze" suspend state). Add a chip flag,
TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED, to indicate this so that certain
platforms can probe for the usage of this light suspend and avoid
touching the TPM state across suspend/resume.

Cc: Andrey Pronin <apronin@chromium.org>
Cc: Duncan Laurie <dlaurie@chromium.org>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Guenter Roeck <groeck@chromium.org>
Cc: Alexander Steffen <Alexander.Steffen@infineon.com>
Cc: Heiko Stuebner <heiko@sntech.de>
Tested-by: default avatarHeiko Stuebner <heiko@sntech.de>
Reviewed-by: default avatarHeiko Stuebner <heiko@sntech.de>
Signed-off-by: default avatarStephen Boyd <swboyd@chromium.org>
Reviewed-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
parent fb8d6c8d
Loading
Loading
Loading
Loading
+7 −1
Original line number Original line Diff line number Diff line
@@ -23,6 +23,7 @@
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/mutex.h>
#include <linux/mutex.h>
#include <linux/spinlock.h>
#include <linux/spinlock.h>
#include <linux/suspend.h>
#include <linux/freezer.h>
#include <linux/freezer.h>
#include <linux/tpm_eventlog.h>
#include <linux/tpm_eventlog.h>


@@ -394,7 +395,11 @@ int tpm_pm_suspend(struct device *dev)
		return -ENODEV;
		return -ENODEV;


	if (chip->flags & TPM_CHIP_FLAG_ALWAYS_POWERED)
	if (chip->flags & TPM_CHIP_FLAG_ALWAYS_POWERED)
		return 0;
		goto suspended;

	if ((chip->flags & TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED) &&
	    !pm_suspend_via_firmware())
		goto suspended;


	if (!tpm_chip_start(chip)) {
	if (!tpm_chip_start(chip)) {
		if (chip->flags & TPM_CHIP_FLAG_TPM2)
		if (chip->flags & TPM_CHIP_FLAG_TPM2)
@@ -405,6 +410,7 @@ int tpm_pm_suspend(struct device *dev)
		tpm_chip_stop(chip);
		tpm_chip_stop(chip);
	}
	}


suspended:
	return rc;
	return rc;
}
}
EXPORT_SYMBOL_GPL(tpm_pm_suspend);
EXPORT_SYMBOL_GPL(tpm_pm_suspend);
+1 −0
Original line number Original line Diff line number Diff line
@@ -162,6 +162,7 @@ enum tpm_chip_flags {
	TPM_CHIP_FLAG_VIRTUAL		= BIT(3),
	TPM_CHIP_FLAG_VIRTUAL		= BIT(3),
	TPM_CHIP_FLAG_HAVE_TIMEOUTS	= BIT(4),
	TPM_CHIP_FLAG_HAVE_TIMEOUTS	= BIT(4),
	TPM_CHIP_FLAG_ALWAYS_POWERED	= BIT(5),
	TPM_CHIP_FLAG_ALWAYS_POWERED	= BIT(5),
	TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED	= BIT(6),
};
};


#define to_tpm_chip(d) container_of(d, struct tpm_chip, dev)
#define to_tpm_chip(d) container_of(d, struct tpm_chip, dev)