[PORT FROM R2] lm3554: correct flash behavior when receive msic signal
authorJianxu zheng <jian.xu.zheng@intel.com>
Tue, 1 Nov 2011 04:22:11 +0000 (12:22 +0800)
committerbuildbot <buildbot@intel.com>
Mon, 19 Dec 2011 13:27:20 +0000 (05:27 -0800)
BZ: 17272

This patch changed the behavior when receive msic signal.With this patch
lm3554 driver will not take TX1/TX2 signal as an error. Because MSIC will not turn off flash,
but turn to torch mode according to gsm modem signal by hardware.

Also correct an error which make the flash brightness opposite to the setting.

Change-Id: I40e8b90e2bf5d677989701b2f837a850394fc086
Orig-Change-Id: Iedf0358bb11bcb2939672f9e671ffc50a72311c7
Signed-off-by: Jianxu zheng <jian.xu.zheng@intel.com>
Reviewed-on: http://android.intel.com:8080/22829
Reviewed-by: Toivonen, Tuukka <tuukka.toivonen@intel.com>
Reviewed-by: Yang, Ji <ji.yang@intel.com>
Reviewed-by: Wang, Wen W <wen.w.wang@intel.com>
Tested-by: Koski, Anttu <anttu.koski@intel.com>
Reviewed-by: Cohen, David A <david.a.cohen@intel.com>
Reviewed-by: Viry, RenaudX <renaudx.viry@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
Reviewed-on: http://android.intel.com:8080/27989
Reviewed-by: Tuominen, TeemuX <teemux.tuominen@intel.com>
Reviewed-by: Koski, Anttu <anttu.koski@intel.com>
drivers/media/video/lm3554.c

index 1c3bd96..28b3df5 100644 (file)
@@ -280,16 +280,17 @@ static int lm3554_g_flash_mode(struct v4l2_subdev *sd, u32 * val)
 static int lm3554_g_flash_status(struct v4l2_subdev *sd, u32 *val)
 {
        u8 value;
-       struct i2c_client *client = v4l2_get_subdevdata(sd);
 
        get_reg_field(sd, &flags, &value);
 
+       /*
+        * do not take TX1/TX2 signal as an error.
+        * because MSIC will not turn off flash, but turn to
+        * torch mode according to gsm modem signal by hardware.
+        */
        if (value & LM3554_FLAG_TIMEOUT)
                *val = ATOMISP_FLASH_STATUS_TIMEOUT;
-       else if (value & LM3554_FLAG_TX1_INTERRUPT ||
-                       value & LM3554_FLAG_TX2_INTERRUPT) {
-               *val = ATOMISP_FLASH_STATUS_INTERRUPTED;
-       } else if (value & LM3554_FLAG_THERMAL_SHUTDOWN ||
+       else if (value & LM3554_FLAG_THERMAL_SHUTDOWN ||
                        value & LM3554_FLAG_LED_FAULT ||
                        value & LM3554_FLAG_LED_THERMAL_FAULT ||
                        value & LM3554_FLAG_INPUT_VOLTAGE_LOW) {
@@ -297,8 +298,10 @@ static int lm3554_g_flash_status(struct v4l2_subdev *sd, u32 *val)
        } else
                *val = ATOMISP_FLASH_STATUS_OK;
 
-       if (*val == ATOMISP_FLASH_STATUS_HW_ERROR)
+       if (*val == ATOMISP_FLASH_STATUS_HW_ERROR) {
+               struct i2c_client *client = v4l2_get_subdevdata(sd);
                dev_err(&client->dev, "LM3554 flag status: %d\n", value);
+       }
        return 0;
 }
 
@@ -499,6 +502,10 @@ static int lm3554_detect(struct i2c_client *client)
        if (ret < 0)
                goto fail;
 
+       ret = set_reg_field(sd, &tx2_polarity, 0);
+       if (ret < 0)
+               goto fail;
+
        /* clear the flags register */
        ret = lm3554_g_flash_status(sd, &status);
        if (ret < 0)