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);
}
Exemplo n.º 2
0
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);
}