]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
media: tegra_camera: add error check of nvhost_module_busy_ext
authorBryan Wu <pengw@nvidia.com>
Tue, 25 Mar 2014 20:23:12 +0000 (13:23 -0700)
committerTerje Bergstrom <tbergstrom@nvidia.com>
Tue, 1 Apr 2014 10:27:20 +0000 (03:27 -0700)
nvhost_module_busy_ext() needs error check, otherwise it might cause
kernel oops from nvhost.

Bug 1483752

Change-Id: Ib3b1d6c7ff53444f042725240073ea274e808ec2
Signed-off-by: Bryan Wu <pengw@nvidia.com>
Reviewed-on: http://git-master/r/386453
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
drivers/media/platform/soc_camera/tegra_camera/common.c

index 893dd3c3c46c422c7776dfe7c7cb9edb76501372..8ed262da1cf6393f1a0d0abecf4e6631681dcee8 100644 (file)
@@ -119,12 +119,16 @@ static const struct soc_mbus_pixelfmt tegra_camera_formats[] = {
        },
 };
 
-static void tegra_camera_activate(struct tegra_camera_dev *cam)
+static int tegra_camera_activate(struct tegra_camera_dev *cam)
 {
        struct tegra_camera_ops *cam_ops = cam->ops;
        int ret;
 
-       nvhost_module_busy_ext(cam->ndev);
+       ret = nvhost_module_busy_ext(cam->ndev);
+       if (ret) {
+               dev_err(&cam->ndev->dev, "nvhost module is busy\n");
+               return ret;
+       }
 
        /* Enable external power */
        if (cam->reg) {
@@ -147,6 +151,8 @@ static void tegra_camera_activate(struct tegra_camera_dev *cam)
 
        if (cam_ops->save_syncpts)
                cam_ops->save_syncpts(cam);
+
+       return 0;
 }
 
 static void tegra_camera_deactivate(struct tegra_camera_dev *cam)
@@ -550,9 +556,12 @@ static int tegra_camera_add_device(struct soc_camera_device *icd)
 {
        struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
        struct tegra_camera_dev *cam = ici->priv;
+       int ret;
 
        if (!cam->enable_refcnt) {
-               tegra_camera_activate(cam);
+               ret = tegra_camera_activate(cam);
+               if (ret)
+                       return ret;
                cam->num_frames = 0;
        }
        cam->enable_refcnt++;