| From f8daafd4fae32c108caa34ed7c32c7221289740d Mon Sep 17 00:00:00 2001 |
| From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Date: Sat, 31 May 2014 08:50:32 -0300 |
| Subject: [media] v4l: vsp1: Propagate vsp1_device_get errors to the callers |
| |
| Modify the vsp1_device_get() function to return an error code instead of |
| a pointer to the VSP1 device, and use the return value in the callers. |
| |
| Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com> |
| (cherry picked from commit 4c16d6a079a4c9a64d664cc9c30ebae5f0bd0c64) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/media/platform/vsp1/vsp1.h | 2 +- |
| drivers/media/platform/vsp1/vsp1_drv.c | 16 ++++++---------- |
| drivers/media/platform/vsp1/vsp1_video.c | 4 ++-- |
| 3 files changed, 9 insertions(+), 13 deletions(-) |
| |
| --- a/drivers/media/platform/vsp1/vsp1.h |
| +++ b/drivers/media/platform/vsp1/vsp1.h |
| @@ -66,7 +66,7 @@ struct vsp1_device { |
| struct media_device media_dev; |
| }; |
| |
| -struct vsp1_device *vsp1_device_get(struct vsp1_device *vsp1); |
| +int vsp1_device_get(struct vsp1_device *vsp1); |
| void vsp1_device_put(struct vsp1_device *vsp1); |
| |
| static inline u32 vsp1_read(struct vsp1_device *vsp1, u32 reg) |
| --- a/drivers/media/platform/vsp1/vsp1_drv.c |
| +++ b/drivers/media/platform/vsp1/vsp1_drv.c |
| @@ -345,36 +345,32 @@ static int vsp1_device_init(struct vsp1_ |
| * Increment the VSP1 reference count and initialize the device if the first |
| * reference is taken. |
| * |
| - * Return a pointer to the VSP1 device or NULL if an error occurred. |
| + * Return 0 on success or a negative error code otherwise. |
| */ |
| -struct vsp1_device *vsp1_device_get(struct vsp1_device *vsp1) |
| +int vsp1_device_get(struct vsp1_device *vsp1) |
| { |
| - struct vsp1_device *__vsp1 = vsp1; |
| - int ret; |
| + int ret = 0; |
| |
| mutex_lock(&vsp1->lock); |
| if (vsp1->ref_count > 0) |
| goto done; |
| |
| ret = clk_prepare_enable(vsp1->clock); |
| - if (ret < 0) { |
| - __vsp1 = NULL; |
| + if (ret < 0) |
| goto done; |
| - } |
| |
| ret = vsp1_device_init(vsp1); |
| if (ret < 0) { |
| clk_disable_unprepare(vsp1->clock); |
| - __vsp1 = NULL; |
| goto done; |
| } |
| |
| done: |
| - if (__vsp1) |
| + if (!ret) |
| vsp1->ref_count++; |
| |
| mutex_unlock(&vsp1->lock); |
| - return __vsp1; |
| + return ret; |
| } |
| |
| /* |
| --- a/drivers/media/platform/vsp1/vsp1_video.c |
| +++ b/drivers/media/platform/vsp1/vsp1_video.c |
| @@ -957,8 +957,8 @@ static int vsp1_video_open(struct file * |
| |
| file->private_data = vfh; |
| |
| - if (!vsp1_device_get(video->vsp1)) { |
| - ret = -EBUSY; |
| + ret = vsp1_device_get(video->vsp1); |
| + if (ret < 0) { |
| v4l2_fh_del(vfh); |
| kfree(vfh); |
| } |