static int adp1653_set_ctrl(struct v4l2_ctrl *ctrl) { struct adp1653_flash *flash = container_of(ctrl->handler, struct adp1653_flash, ctrls); int rval; rval = adp1653_get_fault(flash); if (IS_ERR_VALUE(rval)) return rval; if ((rval & (ADP1653_REG_FAULT_FLT_SCP | ADP1653_REG_FAULT_FLT_OT | ADP1653_REG_FAULT_FLT_OV)) && (ctrl->id == V4L2_CID_FLASH_STROBE || ctrl->id == V4L2_CID_FLASH_TORCH_INTENSITY || ctrl->id == V4L2_CID_FLASH_LED_MODE)) return -EBUSY; switch (ctrl->id) { case V4L2_CID_FLASH_STROBE: return adp1653_strobe(flash, 1); case V4L2_CID_FLASH_STROBE_STOP: return adp1653_strobe(flash, 0); } return adp1653_update_hw(flash); }
static int adp1653_ioctl_s_ctrl(struct v4l2_int_device *s, struct v4l2_control *vc) { struct adp1653_flash *flash = s->priv; int ctrl; int *value; switch (vc->id) { case V4L2_CID_FLASH_STROBE: return adp1653_strobe(s); case V4L2_CID_FLASH_TIMEOUT: ctrl = CTRL_CAMERA_FLASH_TIMEOUT; value = &flash->flash_timeout; break; case V4L2_CID_FLASH_INTENSITY: ctrl = CTRL_CAMERA_FLASH_INTENSITY; value = &flash->flash_intensity; break; case V4L2_CID_TORCH_INTENSITY: ctrl = CTRL_CAMERA_FLASH_TORCH_INTENSITY; value = &flash->torch_intensity; break; case V4L2_CID_INDICATOR_INTENSITY: ctrl = CTRL_CAMERA_FLASH_INDICATOR_INTENSITY; value = &flash->indicator_intensity; break; default: return -EINVAL; } if (vc->value < adp1653_ctrls[ctrl].minimum) vc->value = adp1653_ctrls[ctrl].minimum; if (vc->value > adp1653_ctrls[ctrl].maximum) vc->value = adp1653_ctrls[ctrl].maximum; vc->value = (vc->value - adp1653_ctrls[ctrl].minimum + (adp1653_ctrls[ctrl].step >> 1)) / adp1653_ctrls[ctrl].step; vc->value = vc->value * adp1653_ctrls[ctrl].step + adp1653_ctrls[ctrl].minimum; *value = vc->value; return adp1653_update_hw(s); }