static int lm3554_g_flash_status(struct v4l2_subdev *sd, s32 *val) { u8 value; 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_THERMAL_SHUTDOWN || value & LM3554_FLAG_LED_FAULT || value & LM3554_FLAG_LED_THERMAL_FAULT || value & LM3554_FLAG_INPUT_VOLTAGE_LOW) { *val = ATOMISP_FLASH_STATUS_HW_ERROR; } else *val = ATOMISP_FLASH_STATUS_OK; if (*val == ATOMISP_FLASH_STATUS_HW_ERROR) { struct i2c_client *client = v4l2_get_subdevdata(sd); dev_dbg(&client->dev, "LM3554 flag status: %d\n", value); } return 0; }
static int lm3556_g_indicator_intensity(struct v4l2_subdev *sd, u32 *val) { u8 value; get_reg_field(sd, &indicator_current, &value); *val = LM3556_VALUE_TO_PERCENT((u32)value, LM3556_INDICATOR_STEP); return 0; }
static int lm3556_g_torch_intensity(struct v4l2_subdev *sd, u32 *val) { u8 value; get_reg_field(sd, &torch_current, &value); *val = LM3556_VALUE_TO_PERCENT((u32)value, LM3556_TORCH_STEP); return 0; }
static int lm3556_g_flash_timeout(struct v4l2_subdev *sd, u32 *val) { u8 value; get_reg_field(sd, &flash_timeout, &value); *val = (u32)(value + 1) * LM3556_TIMEOUT_STEPSIZE; return 0; }
static int lm3554_g_flash_intensity(struct v4l2_subdev *sd, s32 *val) { u8 value; get_reg_field(sd, &flash_current, &value); *val = LM3554_VALUE_TO_PERCENT((u32)value, LM3554_FLASH_STEP); return 0; }
static int lm3556_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); if (value & LM3556_FLAG_TIMEOUT) *val = ATOMISP_FLASH_STATUS_TIMEOUT; else if (value & LM3556_FLAG_TX_EVENT) { *val = ATOMISP_FLASH_STATUS_INTERRUPTED; } else if (value & LM3556_FLAG_THERMAL_SHUTDOWN || value & LM3556_FLAG_LED_FAULT || value & LM3556_FLAG_OVP || value & LM3556_FLAG_UVLO) { *val = ATOMISP_FLASH_STATUS_HW_ERROR; } else *val = ATOMISP_FLASH_STATUS_OK; if (*val == ATOMISP_FLASH_STATUS_HW_ERROR) dev_err(&client->dev, "LM3556 flag status: %d\n", value); return 0; }