Esempio n. 1
0
/* Write values into ADP1653 registers. Do nothing if power is off. */
static int adp1653_update_hw(struct v4l2_int_device *s)
{
	struct adp1653_flash *flash = s->priv;
	int rval;
	u8 out_sel = 0;
	u8 config = 0;

	if (flash->power != V4L2_POWER_ON)
		return 0;

	out_sel |= flash->indicator_intensity << ADP1653_REG_OUT_SEL_ILED_SHIFT;
	/* Set torch intensity to zero--prevents false triggering of SC Fault */
	rval = i2c_smbus_write_byte_data(flash->i2c_client,
					 ADP1653_REG_OUT_SEL, out_sel);
	if (rval < 0)
		return rval;

	if (flash->torch_intensity > 0) {
		/* Torch mode, light immediately on, duration indefinite */
		out_sel |= flash->torch_intensity
			   << ADP1653_REG_OUT_SEL_HPLED_SHIFT;
	} else {
		/* Flash mode, light on with strobe, duration from timer */
		out_sel |= flash->flash_intensity
			   << ADP1653_REG_OUT_SEL_HPLED_SHIFT;
		config |= ADP1653_REG_CONFIG_TMR_CFG;
		config |= TIMEOUT_US_TO_CODE(flash->flash_timeout)
			  << ADP1653_REG_CONFIG_TMR_SET_SHIFT;
	}

	rval = i2c_smbus_write_byte_data(flash->i2c_client,
					 ADP1653_REG_OUT_SEL, out_sel);
	if (rval < 0)
		return rval;

	rval = i2c_smbus_write_byte_data(flash->i2c_client,
					 ADP1653_REG_CONFIG, config);
	if (rval < 0)
		return rval;

	return 0;
}
/* Write values into ADP1653 registers. */
static int adp1653_update_hw(struct adp1653_flash *flash)
{
	struct i2c_client *client = v4l2_get_subdevdata(&flash->subdev);
	u8 out_sel;
	u8 config = 0;
	int rval;

	out_sel = ADP1653_INDICATOR_INTENSITY_uA_TO_REG(
		flash->indicator_intensity->val)
		<< ADP1653_REG_OUT_SEL_ILED_SHIFT;

	switch (flash->led_mode->val) {
	case V4L2_FLASH_LED_MODE_NONE:
		break;
	case V4L2_FLASH_LED_MODE_FLASH:
		/* Flash mode, light on with strobe, duration from timer */
		config = ADP1653_REG_CONFIG_TMR_CFG;
		config |= TIMEOUT_US_TO_CODE(flash->flash_timeout->val)
			  << ADP1653_REG_CONFIG_TMR_SET_SHIFT;
		break;
	case V4L2_FLASH_LED_MODE_TORCH:
		/* Torch mode, light immediately on, duration indefinite */
		out_sel |= ADP1653_FLASH_INTENSITY_mA_TO_REG(
			flash->torch_intensity->val)
			<< ADP1653_REG_OUT_SEL_HPLED_SHIFT;
		break;
	}

	rval = i2c_smbus_write_byte_data(client, ADP1653_REG_OUT_SEL, out_sel);
	if (rval < 0)
		return rval;

	rval = i2c_smbus_write_byte_data(client, ADP1653_REG_CONFIG, config);
	if (rval < 0)
		return rval;

	return 0;
}