1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * Copyright (C) 2017 James.Bottomley@HansenPartnership.com |
4 | */ |
5 | #include <linux/slab.h> |
6 | #include "tpm-dev.h" |
7 | |
8 | struct tpmrm_priv { |
9 | struct file_priv priv; |
10 | struct tpm_space space; |
11 | }; |
12 | |
13 | static int tpmrm_open(struct inode *inode, struct file *file) |
14 | { |
15 | struct tpm_chip *chip; |
16 | struct tpmrm_priv *priv; |
17 | int rc; |
18 | |
19 | chip = container_of(inode->i_cdev, struct tpm_chip, cdevs); |
20 | priv = kzalloc(size: sizeof(*priv), GFP_KERNEL); |
21 | if (priv == NULL) |
22 | return -ENOMEM; |
23 | |
24 | rc = tpm2_init_space(space: &priv->space, TPM2_SPACE_BUFFER_SIZE); |
25 | if (rc) { |
26 | kfree(objp: priv); |
27 | return -ENOMEM; |
28 | } |
29 | |
30 | tpm_common_open(file, chip, priv: &priv->priv, space: &priv->space); |
31 | |
32 | return 0; |
33 | } |
34 | |
35 | static int tpmrm_release(struct inode *inode, struct file *file) |
36 | { |
37 | struct file_priv *fpriv = file->private_data; |
38 | struct tpmrm_priv *priv = container_of(fpriv, struct tpmrm_priv, priv); |
39 | |
40 | tpm_common_release(file, priv: fpriv); |
41 | tpm2_del_space(chip: fpriv->chip, space: &priv->space); |
42 | kfree(objp: priv); |
43 | |
44 | return 0; |
45 | } |
46 | |
47 | const struct file_operations tpmrm_fops = { |
48 | .owner = THIS_MODULE, |
49 | .llseek = no_llseek, |
50 | .open = tpmrm_open, |
51 | .read = tpm_common_read, |
52 | .write = tpm_common_write, |
53 | .poll = tpm_common_poll, |
54 | .release = tpmrm_release, |
55 | }; |
56 | |