static int tegra_camera_release(struct inode *inode, struct file *file) { int ret = 0; struct tegra_camera_dev *dev = file->private_data; dev_info(dev->dev, "%s\n", __func__); mutex_lock(&dev->tegra_camera_lock); tegra_camera_disable_avp(dev); /* disable HW clock */ ret = tegra_camera_disable_clk(dev); if (ret) goto release_exit; /* nullify EMC request */ ret = tegra_camera_disable_emc(dev); if (ret) goto release_exit; /* turn off CSI regulator */ tegra_camera_power_off(dev); if (ret) goto release_exit; camera_hook = false; release_exit: mutex_unlock(&dev->tegra_camera_lock); WARN_ON(!atomic_xchg(&dev->in_use, 0)); return 0; }
static int tegra_camera_release(struct inode *inode, struct file *file) { int i; struct tegra_camera_dev *dev = file->private_data; dev_info(dev->dev, "%s\n", __func__); for (i = 0; i < ARRAY_SIZE(tegra_camera_block); i++) if (tegra_camera_block[i].is_enabled) { tegra_camera_block[i].disable(dev); tegra_camera_block[i].is_enabled = false; } /* If camera blocks are not powergated yet, do it now */ if (dev->power_refcnt > 0) { mutex_lock(&dev->tegra_camera_lock); dev->power_refcnt = 1; tegra_camera_power_off(dev); mutex_unlock(&dev->tegra_camera_lock); } tegra_camera_disable_avp(dev); tegra_camera_disable_emc(dev); return 0; }