Add attr_group to phy_ops that a driver relying on tpm_tis_core_init can set to have its specific attributes registered in sysfs.
Signed-off-by: Andrey Pronin <apro...@chromium.org> --- drivers/char/tpm/tpm-sysfs.c | 1 - drivers/char/tpm/tpm.h | 8 +++++++- drivers/char/tpm/tpm_tis_core.c | 3 +++ drivers/char/tpm/tpm_tis_core.h | 1 + 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/char/tpm/tpm-sysfs.c b/drivers/char/tpm/tpm-sysfs.c index 95ce90d..22c9874 100644 --- a/drivers/char/tpm/tpm-sysfs.c +++ b/drivers/char/tpm/tpm-sysfs.c @@ -304,7 +304,6 @@ void tpm_sysfs_add_device(struct tpm_chip *chip) * is called before ops is null'd and the sysfs core synchronizes this * removal so that no callbacks are running or can run again */ - WARN_ON(chip->groups_cnt != 0); chip->groups[chip->groups_cnt++] = &tpm_dev_group; if (chip->flags & TPM_CHIP_FLAG_TPM2) chip->groups[chip->groups_cnt++] = &tpm2_dev_group; diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h index 8890df2..8c69649 100644 --- a/drivers/char/tpm/tpm.h +++ b/drivers/char/tpm/tpm.h @@ -173,7 +173,13 @@ struct tpm_chip { struct dentry **bios_dir; - const struct attribute_group *groups[3]; + /* up to 4 attribute groups: + * - driver-specific + * - common TPM1.2 and TPM2.0 + * - TPM1.2/2.0-specific + * - ppi + */ + const struct attribute_group *groups[5]; unsigned int groups_cnt; #ifdef CONFIG_ACPI acpi_handle acpi_dev_handle; diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c index 8110b52..6d5d8f4 100644 --- a/drivers/char/tpm/tpm_tis_core.c +++ b/drivers/char/tpm/tpm_tis_core.c @@ -796,6 +796,9 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, } } + if (priv->phy_ops->attr_group) + chip->groups[chip->groups_cnt++] = priv->phy_ops->attr_group; + return tpm_chip_register(chip); out_err: tpm_tis_remove(chip); diff --git a/drivers/char/tpm/tpm_tis_core.h b/drivers/char/tpm/tpm_tis_core.h index 9191aab..4417ed9 100644 --- a/drivers/char/tpm/tpm_tis_core.h +++ b/drivers/char/tpm/tpm_tis_core.h @@ -95,6 +95,7 @@ struct tpm_tis_data { }; struct tpm_tis_phy_ops { + const struct attribute_group *attr_group; int (*read_bytes)(struct tpm_tis_data *data, u32 addr, u16 len, u8 *result); int (*write_bytes)(struct tpm_tis_data *data, u32 addr, u16 len, -- 2.6.6