/* 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; }