From 778356e12d5a61dff588d7012accec009e79d65f Mon Sep 17 00:00:00 2001 From: Vedashree Vidwans Date: Fri, 25 Feb 2022 23:47:25 -0800 Subject: [PATCH] tegra: hwpm: add device_opened flag Add device_opened flag to indicate device node open success. Use device_opened flag to allow execution of IOCTL and device teardown functionality. Jira THWPM-41 Change-Id: I218a45abed1de9f314cba696fd86c9bd8596cacc Signed-off-by: Vedashree Vidwans Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2675514 Reviewed-by: svcacv Reviewed-by: svc_kernel_abi Reviewed-by: Seema Khowala Reviewed-by: Vasuki Shankar GVS: Gerrit_Virtual_Submit --- include/tegra_hwpm.h | 1 + os/linux/tegra_hwpm_ioctl.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/include/tegra_hwpm.h b/include/tegra_hwpm.h index 086eff2..14fdf4f 100644 --- a/include/tegra_hwpm.h +++ b/include/tegra_hwpm.h @@ -244,6 +244,7 @@ struct tegra_soc_hwpm { /* SW State */ bool bind_completed; + bool device_opened; u64 full_alist_size; atomic_t hwpm_in_use; diff --git a/os/linux/tegra_hwpm_ioctl.c b/os/linux/tegra_hwpm_ioctl.c index 36bd2c4..e6c4309 100644 --- a/os/linux/tegra_hwpm_ioctl.c +++ b/os/linux/tegra_hwpm_ioctl.c @@ -343,6 +343,12 @@ static long tegra_hwpm_ioctl(struct file *file, goto fail; } + if (!hwpm->device_opened) { + tegra_hwpm_err(hwpm, "Device open failed, can't process IOCTL"); + ret = -ENODEV; + goto fail; + } + /* Only allocate a buffer if the IOCTL needs a buffer */ if (!(ioc_dir & _IOC_NONE)) { arg_copy = kzalloc(arg_size, GFP_KERNEL); @@ -486,6 +492,8 @@ static int tegra_hwpm_open(struct inode *inode, struct file *filp) goto fail; } + hwpm->device_opened = true; + return 0; fail: ret = tegra_hwpm_release_hw(hwpm); @@ -531,6 +539,11 @@ static int tegra_hwpm_release(struct inode *inode, struct file *filp) return 0; } + if (hwpm->device_opened == false) { + /* Device was not opened, do nothing */ + return 0; + } + ret = tegra_hwpm_disable_triggers(hwpm); if (ret < 0) { tegra_hwpm_err(hwpm, "Failed to disable PMA triggers"); @@ -570,6 +583,8 @@ static int tegra_hwpm_release(struct inode *inode, struct file *filp) } clk_disable_unprepare(hwpm->la_clk); } + + hwpm->device_opened = false; fail: return ret; }