18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2017 James.Bottomley@HansenPartnership.com
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci#include <linux/slab.h>
68c2ecf20Sopenharmony_ci#include "tpm-dev.h"
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_cistruct tpmrm_priv {
98c2ecf20Sopenharmony_ci	struct file_priv priv;
108c2ecf20Sopenharmony_ci	struct tpm_space space;
118c2ecf20Sopenharmony_ci};
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_cistatic int tpmrm_open(struct inode *inode, struct file *file)
148c2ecf20Sopenharmony_ci{
158c2ecf20Sopenharmony_ci	struct tpm_chip *chip;
168c2ecf20Sopenharmony_ci	struct tpmrm_priv *priv;
178c2ecf20Sopenharmony_ci	int rc;
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci	chip = container_of(inode->i_cdev, struct tpm_chip, cdevs);
208c2ecf20Sopenharmony_ci	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
218c2ecf20Sopenharmony_ci	if (priv == NULL)
228c2ecf20Sopenharmony_ci		return -ENOMEM;
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	rc = tpm2_init_space(&priv->space, TPM2_SPACE_BUFFER_SIZE);
258c2ecf20Sopenharmony_ci	if (rc) {
268c2ecf20Sopenharmony_ci		kfree(priv);
278c2ecf20Sopenharmony_ci		return -ENOMEM;
288c2ecf20Sopenharmony_ci	}
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci	tpm_common_open(file, chip, &priv->priv, &priv->space);
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci	return 0;
338c2ecf20Sopenharmony_ci}
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_cistatic int tpmrm_release(struct inode *inode, struct file *file)
368c2ecf20Sopenharmony_ci{
378c2ecf20Sopenharmony_ci	struct file_priv *fpriv = file->private_data;
388c2ecf20Sopenharmony_ci	struct tpmrm_priv *priv = container_of(fpriv, struct tpmrm_priv, priv);
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci	tpm_common_release(file, fpriv);
418c2ecf20Sopenharmony_ci	tpm2_del_space(fpriv->chip, &priv->space);
428c2ecf20Sopenharmony_ci	kfree(priv);
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	return 0;
458c2ecf20Sopenharmony_ci}
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ciconst struct file_operations tpmrm_fops = {
488c2ecf20Sopenharmony_ci	.owner = THIS_MODULE,
498c2ecf20Sopenharmony_ci	.llseek = no_llseek,
508c2ecf20Sopenharmony_ci	.open = tpmrm_open,
518c2ecf20Sopenharmony_ci	.read = tpm_common_read,
528c2ecf20Sopenharmony_ci	.write = tpm_common_write,
538c2ecf20Sopenharmony_ci	.poll = tpm_common_poll,
548c2ecf20Sopenharmony_ci	.release = tpmrm_release,
558c2ecf20Sopenharmony_ci};
56