Commit 64561a38 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

V4L/DVB: Fix unlock logic at medusa_video_init

As reported by Dan Carpenter:
> This was my patch:  "cx25821: fix double unlock in medusa_video_init()"
>
> It accidentally got merged two times.  The version from the staging tree
> is not correct.  Please can you revert it:
> 7a02f549 "Staging: cx25821: fix double
> unlock in medusa_video_init()"

After reviewing the logic at the function, instead of just adding a patch to
revert the wrong one, the better is to apply a different logic: add a goto
that will always unlock and return the error.

This simplifies the code a little bit, and, instead of just return -EINVAL,
it will return the error condition reported by the called functions.

This patch is folded with another patch from Dan that added one missing
goto.
Signed-off-by: default avatarDan Carpenter <error27@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent e36309f5
...@@ -778,9 +778,9 @@ int medusa_set_saturation(struct cx25821_dev *dev, int saturation, int decoder) ...@@ -778,9 +778,9 @@ int medusa_set_saturation(struct cx25821_dev *dev, int saturation, int decoder)
int medusa_video_init(struct cx25821_dev *dev) int medusa_video_init(struct cx25821_dev *dev)
{ {
u32 value = 0, tmp = 0; u32 value, tmp = 0;
int ret_val = 0; int ret_val;
int i = 0; int i;
mutex_lock(&dev->lock); mutex_lock(&dev->lock);
...@@ -790,18 +790,15 @@ int medusa_video_init(struct cx25821_dev *dev) ...@@ -790,18 +790,15 @@ int medusa_video_init(struct cx25821_dev *dev)
value = cx25821_i2c_read(&dev->i2c_bus[0], MON_A_CTRL, &tmp); value = cx25821_i2c_read(&dev->i2c_bus[0], MON_A_CTRL, &tmp);
value &= 0xFFFFF0FF; value &= 0xFFFFF0FF;
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], MON_A_CTRL, value); ret_val = cx25821_i2c_write(&dev->i2c_bus[0], MON_A_CTRL, value);
if (ret_val < 0)
goto error;
if (ret_val < 0) {
mutex_unlock(&dev->lock);
return -EINVAL;
}
/* Turn off Master source switch enable */ /* Turn off Master source switch enable */
value = cx25821_i2c_read(&dev->i2c_bus[0], MON_A_CTRL, &tmp); value = cx25821_i2c_read(&dev->i2c_bus[0], MON_A_CTRL, &tmp);
value &= 0xFFFFFFDF; value &= 0xFFFFFFDF;
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], MON_A_CTRL, value); ret_val = cx25821_i2c_write(&dev->i2c_bus[0], MON_A_CTRL, value);
if (ret_val < 0) if (ret_val < 0)
return -EINVAL; goto error;
mutex_unlock(&dev->lock); mutex_unlock(&dev->lock);
...@@ -815,31 +812,25 @@ int medusa_video_init(struct cx25821_dev *dev) ...@@ -815,31 +812,25 @@ int medusa_video_init(struct cx25821_dev *dev)
value &= 0xFF70FF70; value &= 0xFF70FF70;
value |= 0x00090008; /* set en_active */ value |= 0x00090008; /* set en_active */
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_AB_CTRL, value); ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_AB_CTRL, value);
if (ret_val < 0)
goto error;
if (ret_val < 0) {
mutex_unlock(&dev->lock);
return -EINVAL;
}
/* enable input is VIP/656 */ /* enable input is VIP/656 */
value = cx25821_i2c_read(&dev->i2c_bus[0], BYP_AB_CTRL, &tmp); value = cx25821_i2c_read(&dev->i2c_bus[0], BYP_AB_CTRL, &tmp);
value |= 0x00040100; /* enable VIP */ value |= 0x00040100; /* enable VIP */
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], BYP_AB_CTRL, value); ret_val = cx25821_i2c_write(&dev->i2c_bus[0], BYP_AB_CTRL, value);
if (ret_val < 0) { if (ret_val < 0)
mutex_unlock(&dev->lock); goto error;
return -EINVAL;
}
/* select AFE clock to output mode */ /* select AFE clock to output mode */
value = cx25821_i2c_read(&dev->i2c_bus[0], AFE_AB_DIAG_CTRL, &tmp); value = cx25821_i2c_read(&dev->i2c_bus[0], AFE_AB_DIAG_CTRL, &tmp);
value &= 0x83FFFFFF; value &= 0x83FFFFFF;
ret_val = ret_val = cx25821_i2c_write(&dev->i2c_bus[0], AFE_AB_DIAG_CTRL,
cx25821_i2c_write(&dev->i2c_bus[0], AFE_AB_DIAG_CTRL, value | 0x10000000);
value | 0x10000000); if (ret_val < 0)
goto error;
if (ret_val < 0) {
mutex_unlock(&dev->lock);
return -EINVAL;
}
/* Turn on all of the data out and control output pins. */ /* Turn on all of the data out and control output pins. */
value = cx25821_i2c_read(&dev->i2c_bus[0], PIN_OE_CTRL, &tmp); value = cx25821_i2c_read(&dev->i2c_bus[0], PIN_OE_CTRL, &tmp);
value &= 0xFEF0FE00; value &= 0xFEF0FE00;
...@@ -858,17 +849,15 @@ int medusa_video_init(struct cx25821_dev *dev) ...@@ -858,17 +849,15 @@ int medusa_video_init(struct cx25821_dev *dev)
value |= 7; value |= 7;
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], PIN_OE_CTRL, value); ret_val = cx25821_i2c_write(&dev->i2c_bus[0], PIN_OE_CTRL, value);
if (ret_val < 0) { if (ret_val < 0)
mutex_unlock(&dev->lock); goto error;
return -EINVAL;
}
mutex_unlock(&dev->lock); mutex_unlock(&dev->lock);
ret_val = medusa_set_videostandard(dev); ret_val = medusa_set_videostandard(dev);
return ret_val;
if (ret_val < 0) error:
return -EINVAL; mutex_unlock(&dev->lock);
return ret_val;
return 1;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment