Implement tpm_chip_find() for other subsystems to find a TPM chip and get a reference to that chip. Once done with using the chip, the reference is released using tpm_chip_put(). Signed-off-by: Stefan Berger <stefanb@xxxxxxxxxxxxxxxxxx> --- drivers/char/tpm/tpm-chip.c | 37 +++++++++++++++++++++++++++++++++++++ include/linux/tpm.h | 9 +++++++++ 2 files changed, 46 insertions(+) diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c index 0a62c19937b6..eaaf41ce73d8 100644 --- a/drivers/char/tpm/tpm-chip.c +++ b/drivers/char/tpm/tpm-chip.c @@ -81,6 +81,43 @@ void tpm_put_ops(struct tpm_chip *chip) EXPORT_SYMBOL_GPL(tpm_put_ops); /** + * tpm_chip_put() - Release a ref to the tpm_chip + * @chip: Chip to put + */ +void tpm_chip_put(struct tpm_chip *chip) +{ + if (chip) + put_device(&chip->dev); +} + +/** + * tpm_chip_find() - find a TPM chip and get a reference to it + */ +struct tpm_chip *tpm_chip_find(void) +{ + struct tpm_chip *chip, *res = NULL; + int chip_num = 0; + int chip_prev; + + mutex_lock(&idr_lock); + + do { + chip_prev = chip_num; + chip = idr_get_next(&dev_nums_idr, &chip_num); + if (chip) { + get_device(&chip->dev); + res = chip; + break; + } + } while (chip_prev != chip_num); + + mutex_unlock(&idr_lock); + + return res; +} +EXPORT_SYMBOL_GPL(tpm_chip_find); + +/** * tpm_chip_find_get() - find and reserve a TPM chip * @chip: a &struct tpm_chip instance, %NULL for the default chip * diff --git a/include/linux/tpm.h b/include/linux/tpm.h index 06639fb6ab85..f0d1abcaf4af 100644 --- a/include/linux/tpm.h +++ b/include/linux/tpm.h @@ -61,6 +61,8 @@ extern int tpm_seal_trusted(struct tpm_chip *chip, extern int tpm_unseal_trusted(struct tpm_chip *chip, struct trusted_key_payload *payload, struct trusted_key_options *options); +extern struct tpm_chip *tpm_chip_find(void); +extern void tpm_chip_put(struct tpm_chip *chip); #else static inline int tpm_is_tpm2(struct tpm_chip *chip) { @@ -96,5 +98,12 @@ static inline int tpm_unseal_trusted(struct tpm_chip *chip, { return -ENODEV; } +static inline struct tpm_chip *tpm_chip_find(void) +{ + return NULL; +} +static inline void tpm_chip_put(struct tpm_chip *chip) +{ +} #endif #endif -- 2.13.6