]> Pileus Git - ~andy/linux/blobdiff - drivers/media/i2c/lm3560.c
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[~andy/linux] / drivers / media / i2c / lm3560.c
index 3317a9ae3961fcf11dcf4cd97254654af608e1d5..d98ca3aebe235d7ae494ec2381ebe801899f6aa1 100644 (file)
@@ -172,28 +172,28 @@ static int lm3560_flash_brt_ctrl(struct lm3560_flash *flash,
 static int lm3560_get_ctrl(struct v4l2_ctrl *ctrl, enum lm3560_led_id led_no)
 {
        struct lm3560_flash *flash = to_lm3560_flash(ctrl, led_no);
+       int rval = -EINVAL;
 
        mutex_lock(&flash->lock);
 
        if (ctrl->id == V4L2_CID_FLASH_FAULT) {
-               int rval;
                s32 fault = 0;
                unsigned int reg_val;
                rval = regmap_read(flash->regmap, REG_FLAG, &reg_val);
                if (rval < 0)
-                       return rval;
-               if (rval & FAULT_SHORT_CIRCUIT)
+                       goto out;
+               if (reg_val & FAULT_SHORT_CIRCUIT)
                        fault |= V4L2_FLASH_FAULT_SHORT_CIRCUIT;
-               if (rval & FAULT_OVERTEMP)
+               if (reg_val & FAULT_OVERTEMP)
                        fault |= V4L2_FLASH_FAULT_OVER_TEMPERATURE;
-               if (rval & FAULT_TIMEOUT)
+               if (reg_val & FAULT_TIMEOUT)
                        fault |= V4L2_FLASH_FAULT_TIMEOUT;
                ctrl->cur.val = fault;
-               return 0;
        }
 
+out:
        mutex_unlock(&flash->lock);
-       return -EINVAL;
+       return rval;
 }
 
 static int lm3560_set_ctrl(struct v4l2_ctrl *ctrl, enum lm3560_led_id led_no)
@@ -219,15 +219,19 @@ static int lm3560_set_ctrl(struct v4l2_ctrl *ctrl, enum lm3560_led_id led_no)
                break;
 
        case V4L2_CID_FLASH_STROBE:
-               if (flash->led_mode != V4L2_FLASH_LED_MODE_FLASH)
-                       return -EBUSY;
+               if (flash->led_mode != V4L2_FLASH_LED_MODE_FLASH) {
+                       rval = -EBUSY;
+                       goto err_out;
+               }
                flash->led_mode = V4L2_FLASH_LED_MODE_FLASH;
                rval = lm3560_mode_ctrl(flash);
                break;
 
        case V4L2_CID_FLASH_STROBE_STOP:
-               if (flash->led_mode != V4L2_FLASH_LED_MODE_FLASH)
-                       return -EBUSY;
+               if (flash->led_mode != V4L2_FLASH_LED_MODE_FLASH) {
+                       rval = -EBUSY;
+                       goto err_out;
+               }
                flash->led_mode = V4L2_FLASH_LED_MODE_NONE;
                rval = lm3560_mode_ctrl(flash);
                break;
@@ -247,8 +251,8 @@ static int lm3560_set_ctrl(struct v4l2_ctrl *ctrl, enum lm3560_led_id led_no)
                break;
        }
 
-       mutex_unlock(&flash->lock);
 err_out:
+       mutex_unlock(&flash->lock);
        return rval;
 }
 
@@ -444,14 +448,14 @@ static int lm3560_probe(struct i2c_client *client,
        if (rval < 0)
                return rval;
 
+       i2c_set_clientdata(client, flash);
+
        return 0;
 }
 
 static int lm3560_remove(struct i2c_client *client)
 {
-       struct v4l2_subdev *subdev = i2c_get_clientdata(client);
-       struct lm3560_flash *flash = container_of(subdev, struct lm3560_flash,
-                                                 subdev_led[LM3560_LED_MAX]);
+       struct lm3560_flash *flash = i2c_get_clientdata(client);
        unsigned int i;
 
        for (i = LM3560_LED0; i < LM3560_LED_MAX; i++) {