static int lm3554_detect(struct i2c_client *client) { s32 status; struct i2c_adapter *adapter = client->adapter; struct v4l2_subdev *sd = i2c_get_clientdata(client); struct lm3554_priv *p_lm3554_priv = to_lm3554_priv(sd); struct camera_flash_platform_data *pdata = p_lm3554_priv->platform_data; int ret; if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { dev_err(&client->dev, "lm3554_detect i2c error\n"); return -ENODEV; } lm3554_hw_reset(client); ret = set_gpio_output(pdata->gpio_strobe, "flash", 0); if (ret < 0) goto fail; ret = set_gpio_output(pdata->gpio_torch, "torch", 0); if (ret < 0) goto fail; /* Set to TX2 mode, then ENVM/TX2 pin is a power * amplifier sync input: * ENVM/TX pin asserted, flash forced into torch; * ENVM/TX pin desserted, flash set back; */ ret = set_reg_field(sd, &envm_tx2, 1); if (ret < 0) goto fail; ret = set_reg_field(sd, &tx2_polarity, 0); if (ret < 0) goto fail; /* set peak current limit to be 1000mA */ ret = set_reg_field(sd, ¤t_limit, 0); if (ret < 0) goto fail; /* clear the flags register */ ret = lm3554_g_flash_status(sd, &status); if (ret < 0) goto fail; dev_dbg(&client->dev, "Successfully detected lm3554 LED flash\n"); return 0; fail: dev_err(&client->dev, "gpio request/direction_output fail"); return ret; }
static int lm3554_g_volatile_ctrl(struct v4l2_ctrl *ctrl) { struct lm3554 *dev = container_of(ctrl->handler, struct lm3554, ctrl_handler); int ret = 0; switch (ctrl->id) { case V4L2_CID_FLASH_TIMEOUT: ret = lm3554_g_flash_timeout(&dev->sd, &ctrl->val); break; case V4L2_CID_FLASH_INTENSITY: ret = lm3554_g_flash_intensity(&dev->sd, &ctrl->val); break; case V4L2_CID_FLASH_TORCH_INTENSITY: ret = lm3554_g_torch_intensity(&dev->sd, &ctrl->val); break; case V4L2_CID_FLASH_INDICATOR_INTENSITY: ret = lm3554_g_indicator_intensity(&dev->sd, &ctrl->val); break; case V4L2_CID_FLASH_MODE: ret = lm3554_g_flash_mode(&dev->sd, &ctrl->val); break; case V4L2_CID_FLASH_STATUS: ret = lm3554_g_flash_status(&dev->sd, &ctrl->val); break; #ifndef CSS15 case V4L2_CID_FLASH_STATUS_REGISTER: ret = lm3554_g_flash_status_register(&dev->sd, &ctrl->val); break; #endif default: ret = -EINVAL; } return ret; }