0001
0002
0003
0004
0005 #include <linux/slab.h>
0006 #include "tpm-dev.h"
0007
0008 struct tpmrm_priv {
0009 struct file_priv priv;
0010 struct tpm_space space;
0011 };
0012
0013 static int tpmrm_open(struct inode *inode, struct file *file)
0014 {
0015 struct tpm_chip *chip;
0016 struct tpmrm_priv *priv;
0017 int rc;
0018
0019 chip = container_of(inode->i_cdev, struct tpm_chip, cdevs);
0020 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
0021 if (priv == NULL)
0022 return -ENOMEM;
0023
0024 rc = tpm2_init_space(&priv->space, TPM2_SPACE_BUFFER_SIZE);
0025 if (rc) {
0026 kfree(priv);
0027 return -ENOMEM;
0028 }
0029
0030 tpm_common_open(file, chip, &priv->priv, &priv->space);
0031
0032 return 0;
0033 }
0034
0035 static int tpmrm_release(struct inode *inode, struct file *file)
0036 {
0037 struct file_priv *fpriv = file->private_data;
0038 struct tpmrm_priv *priv = container_of(fpriv, struct tpmrm_priv, priv);
0039
0040 tpm_common_release(file, fpriv);
0041 tpm2_del_space(fpriv->chip, &priv->space);
0042 kfree(priv);
0043
0044 return 0;
0045 }
0046
0047 const struct file_operations tpmrm_fops = {
0048 .owner = THIS_MODULE,
0049 .llseek = no_llseek,
0050 .open = tpmrm_open,
0051 .read = tpm_common_read,
0052 .write = tpm_common_write,
0053 .poll = tpm_common_poll,
0054 .release = tpmrm_release,
0055 };