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 | 27 +++++++++++++++++++++++++++ include/linux/tpm.h | 5 +++++ 2 files changed, 32 insertions(+) diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c index 23b667c730f6..b04064291dab 100644 --- a/drivers/char/tpm/tpm-chip.c +++ b/drivers/char/tpm/tpm-chip.c @@ -84,6 +84,33 @@ void tpm_put_ops(struct tpm_chip *chip) EXPORT_SYMBOL_GPL(tpm_put_ops); /** + * 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) { + kref_get(&chip->kref); + 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 cdb3ecdfc933..f0d1abcaf4af 100644 --- a/include/linux/tpm.h +++ b/include/linux/tpm.h @@ -61,6 +61,7 @@ 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) @@ -97,6 +98,10 @@ 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) { } -- 2.13.6