static int msm_flash_lm3642_i2c_remove(struct i2c_client *client) { struct msm_camera_sensor_board_info *flashdata = NULL; struct msm_camera_power_ctrl_t *power_info = NULL; int rc = 0 ; LM3642_DBG("%s entry\n", __func__); flashdata = fctrl.flashdata; power_info = &flashdata->power_info; rc = msm_camera_request_gpio_table( power_info->gpio_conf->cam_gpio_req_tbl, power_info->gpio_conf->cam_gpio_req_tbl_size, 0); if (rc < 0) { pr_err("%s: request gpio failed\n", __func__); return rc; } if (fctrl.pinctrl_info.use_pinctrl == true) { rc = pinctrl_select_state(fctrl.pinctrl_info.pinctrl, fctrl.pinctrl_info.gpio_state_suspend); if (rc) pr_err("%s:%d cannot set pin to suspend state", __func__, __LINE__); } return rc; }
int msm_flash_lm3642_led_high(struct msm_led_flash_ctrl_t *fctrl) { int rc = 0; struct msm_camera_sensor_board_info *flashdata = NULL; struct msm_camera_power_ctrl_t *power_info = NULL; LM3642_DBG("%s:%d called\n", __func__, __LINE__); flashdata = fctrl->flashdata; power_info = &flashdata->power_info; gpio_set_value_cansleep( power_info->gpio_conf->gpio_num_info-> gpio_num[SENSOR_GPIO_FL_NOW], GPIO_OUT_HIGH); if (fctrl->flash_i2c_client && fctrl->reg_setting) { rc = fctrl->flash_i2c_client->i2c_func_tbl->i2c_write_table( fctrl->flash_i2c_client, fctrl->reg_setting->high_setting); if (rc < 0) pr_err("%s:%d failed\n", __func__, __LINE__); } return rc; }
/**************************************************************************** * FunctionName: msm_torch_lm3642_led_on; * Description : set torch func ; ***************************************************************************/ int msm_torch_lm3642_led_on(struct msm_led_flash_ctrl_t *fctrl) { int rc = 0; struct msm_camera_sensor_board_info *flashdata = NULL; struct msm_camera_power_ctrl_t *power_info = NULL; LM3642_DBG("%s:%d called\n", __func__, __LINE__); flashdata = fctrl->flashdata; power_info = &flashdata->power_info; //clear the err and unlock IC, this function must be called before read and write register msm_flash_clear_err_and_unlock(fctrl); if (fctrl->flash_i2c_client && fctrl->reg_setting) { rc = fctrl->flash_i2c_client->i2c_func_tbl->i2c_write_table( fctrl->flash_i2c_client, fctrl->reg_setting->torch_setting); if (rc < 0) pr_err("%s:%d failed\n", __func__, __LINE__); } gpio_set_value_cansleep( power_info->gpio_conf->gpio_num_info-> gpio_num[SENSOR_GPIO_FL_NOW], GPIO_OUT_HIGH); return rc; }
static int msm_flash_lm3642_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct msm_camera_sensor_board_info *flashdata = NULL; struct msm_camera_power_ctrl_t *power_info = NULL; int rc = 0 ; LM3642_DBG("%s entry\n", __func__); if (!id) { pr_err("msm_flash_lm3642_i2c_probe: id is NULL"); id = lm3642_i2c_id; } rc = msm_flash_i2c_probe(client, id); if(rc < 0){ pr_err("%s: probe failed\n", __func__); return rc; } else { /*when the flashlight open background, hold power key for more than 10s*/ /*would enter HW reset, without turn off the light. So we need to close*/ /*light after we reboot*/ msm_flash_lm3642_led_off(&fctrl); } /*if the high current defined in dts, use the current value*/ if(fctrl.flash_high_current){ fctrl.reg_setting->high_setting->reg_setting[0].reg_data = fctrl.flash_high_current; } flashdata = fctrl.flashdata; power_info = &flashdata->power_info; rc = msm_camera_request_gpio_table( power_info->gpio_conf->cam_gpio_req_tbl, power_info->gpio_conf->cam_gpio_req_tbl_size, 1); if (rc < 0) { pr_err("%s: request gpio failed\n", __func__); return rc; } if (fctrl.pinctrl_info.use_pinctrl == true) { pr_err("%s:%d PC:: flash pins setting to active state", __func__, __LINE__); rc = pinctrl_select_state(fctrl.pinctrl_info.pinctrl, fctrl.pinctrl_info.gpio_state_active); if (rc) pr_err("%s:%d cannot set pin to active state", __func__, __LINE__); } if (!rc) msm_lm3642_torch_create_classdev(&(client->dev),NULL); return rc; }
/**************************************************************************** * FunctionName: msm_flash_clear_err_and_unlock; * Description : clear the error and unlock the IC ; * NOTE: this funtion must be called before register is read and write ***************************************************************************/ int msm_flash_clear_err_and_unlock(struct msm_led_flash_ctrl_t *fctrl){ int rc = 0; uint16_t reg_value=0; LM3642_DBG("%s entry\n", __func__); if (!fctrl) { pr_err("%s:%d fctrl NULL\n", __func__, __LINE__); return -EINVAL; } if (fctrl->flash_i2c_client) { rc = fctrl->flash_i2c_client->i2c_func_tbl->i2c_read( fctrl->flash_i2c_client, FLASH_FLAG_REGISTER,®_value, MSM_CAMERA_I2C_BYTE_DATA); if (rc < 0){ pr_err("clear err and unlock %s:%d failed\n", __func__, __LINE__); } LM3642_DBG("clear err and unlock success:%02x\n",reg_value); #ifdef CONFIG_HUAWEI_DSM if (reg_value != 0) { camera_report_flash_dsm_err(reg_value, rc); } #endif }else{ pr_err("%s:%d flash_i2c_client NULL\n", __func__, __LINE__); return -EINVAL; } return 0; }
static int msm_flash_lm3642_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct msm_camera_sensor_board_info *flashdata = NULL; struct msm_camera_power_ctrl_t *power_info = NULL; int rc = 0 ; LM3642_DBG("%s entry\n", __func__); if (!id) { pr_err("msm_flash_lm3642_i2c_probe: id is NULL"); id = lm3642_i2c_id; } rc = msm_flash_i2c_probe(client, id); flashdata = fctrl.flashdata; power_info = &flashdata->power_info; rc = msm_camera_request_gpio_table( power_info->gpio_conf->cam_gpio_req_tbl, power_info->gpio_conf->cam_gpio_req_tbl_size, 1); if (rc < 0) { pr_err("%s: request gpio failed\n", __func__); return rc; } if (fctrl.pinctrl_info.use_pinctrl == true) { pr_err("%s:%d PC:: flash pins setting to active state", __func__, __LINE__); rc = pinctrl_select_state(fctrl.pinctrl_info.pinctrl, fctrl.pinctrl_info.gpio_state_active); if (rc) pr_err("%s:%d cannot set pin to active state", __func__, __LINE__); } if (!rc) msm_lm3642_torch_create_classdev(&(client->dev),NULL); return rc; }
static void __exit msm_flash_lm3642_exit(void) { LM3642_DBG("%s entry\n", __func__); i2c_del_driver(&lm3642_i2c_driver); return; }
static int __init msm_flash_lm3642_init(void) { LM3642_DBG("%s entry\n", __func__); return i2c_add_driver(&lm3642_i2c_driver); }