static int msm_eeprom_config(struct msm_eeprom_ctrl_t *e_ctrl,
			     void __user *argp)
{
	struct msm_eeprom_cfg_data *cdata =
		(struct msm_eeprom_cfg_data *)argp;
	int rc = 0;

	CDBG("%s E\n", __func__);
	switch (cdata->cfgtype) {
	case CFG_EEPROM_GET_INFO:
		CDBG("%s E CFG_EEPROM_GET_INFO\n", __func__);
		cdata->is_supported = e_ctrl->is_supported;
		memcpy(cdata->cfg.eeprom_name,
			e_ctrl->eboard_info->eeprom_name,
			sizeof(cdata->cfg.eeprom_name));
		break;
	case CFG_EEPROM_GET_CAL_DATA:
		CDBG("%s E CFG_EEPROM_GET_CAL_DATA\n", __func__);
		cdata->cfg.get_data.num_bytes =
			e_ctrl->cal_data.num_data;
/*	+ add ljk for otp checksum*/
		cdata->cfg.get_data.is_3a_checksumed =
			is_3a_checksumed;
			pr_err("%s E CFG_EEPROM_GET_CAL_DATA is_3a_checksumed=%d\n", __func__,cdata->cfg.get_data.is_3a_checksumed);
/*+end*/
		break;
	case CFG_EEPROM_READ_CAL_DATA:
		CDBG("%s E CFG_EEPROM_READ_CAL_DATA\n", __func__);
		rc = eeprom_config_read_cal_data(e_ctrl, cdata);
		break;
	case CFG_EEPROM_GET_MM_INFO:
		CDBG("%s E CFG_EEPROM_GET_MM_INFO\n", __func__);
		rc = msm_eeprom_get_mm_data(e_ctrl, cdata);
		break;
	default:
		break;
	}

	CDBG("%s X rc: %d\n", __func__, rc);
	return rc;
}
static int msm_eeprom_config(struct msm_eeprom_ctrl_t *e_ctrl,
			     void __user *argp)
{
	struct msm_eeprom_cfg_data *cdata =
		(struct msm_eeprom_cfg_data *)argp;
	int rc = 0;

	CDBG("%s E\n", __func__);
	switch (cdata->cfgtype) {
	case CFG_EEPROM_GET_INFO:
    pr_info("%s E CFG_EEPROM_GET_INFO\n", __func__);
    cdata->is_supported = e_ctrl->is_supported;
    memcpy(cdata->cfg.eeprom_name,
    	e_ctrl->eboard_info->eeprom_name,
    	sizeof(cdata->cfg.eeprom_name));
    break;
	case CFG_EEPROM_GET_CAL_DATA:
		pr_info("%s E CFG_EEPROM_GET_CAL_DATA\n", __func__);
		cdata->cfg.get_data.num_bytes =
			e_ctrl->cal_data.num_data;
		break;
	case CFG_EEPROM_READ_CAL_DATA:
		pr_info("%s E CFG_EEPROM_READ_CAL_DATA\n", __func__);
		rc = eeprom_config_read_cal_data(e_ctrl, cdata);
		break;
	case CFG_EEPROM_READ_DATA:
		CDBG("%s E CFG_EEPROM_READ_DATA\n", __func__);
		rc = eeprom_config_read_data(e_ctrl, cdata);
		break;
	case CFG_EEPROM_READ_COMPRESSED_DATA:
		rc = eeprom_config_read_compressed_data(e_ctrl, cdata);
    if (rc < 0)
      pr_err("%s : eeprom_config_read_compressed_data failed", __func__);
		break;
	case CFG_EEPROM_WRITE_DATA:
		pr_warn("%s E CFG_EEPROM_WRITE_DATA\n", __func__);
		rc = eeprom_config_write_data(e_ctrl, cdata);
		break;
	case CFG_EEPROM_READ_DATA_FROM_HW:
		e_ctrl->is_supported = 0x01;
 		pr_err ("kernel is supported before%X\n",e_ctrl->is_supported);
		rc = msm_eeprom_read_eeprom_data(e_ctrl);
 		pr_err ("kernel is supported after%X\n",e_ctrl->is_supported);
		cdata->is_supported = e_ctrl->is_supported;
		if (rc < 0) {
			pr_err("%s:%d failed rc %d\n", __func__, __LINE__,  rc);
			break;
		}
		rc = copy_to_user(cdata->cfg.read_data.dbuffer,
			e_ctrl->cal_data.mapdata,
			cdata->cfg.read_data.num_bytes);
		break;
	case CFG_EEPROM_GET_ERASESIZE:
		CDBG("%s E CFG_EEPROM_GET_ERASESIZE\n", __func__);
		cdata->cfg.get_data.num_bytes =
			e_ctrl->i2c_client.spi_client->erase_size;
		break;
	case CFG_EEPROM_ERASE:
		pr_warn("%s E CFG_EEPROM_ERASE\n", __func__);
		rc = eeprom_config_erase(e_ctrl, cdata);
		break;
  case CFG_EEPROM_POWER_ON:
		rc = msm_eeprom_power_up(e_ctrl, NULL);
    if (rc < 0)
      pr_err("%s : msm_eeprom_power_up failed", __func__);
		break;
  case CFG_EEPROM_POWER_OFF:
		rc = msm_eeprom_power_down(e_ctrl, true);
    if (rc < 0)
      pr_err("%s : msm_eeprom_power_down failed", __func__);
		break;
	default:
		break;
	}

	CDBG("%s X rc: %d\n", __func__, rc);
	return rc;
}