int imx214_set_expo_gain(struct hisi_sensor_t *cur_sensor, u32 expo, u16 gain)
{
	int rc = 0;
	u32 tmp_digital_gain = 0;
	u8 digital_ratio = 0;
	u8 digital_h = 0;
	u8 digital_l = 0;
	u32 analog_gain = 0;

	isp_write_sensor_byte(&cur_sensor->sensor_info->i2c_config,
		IMX214_GROUP_HOLD_REG, 0x01, 0x00);

	expo >>= 4;
	isp_write_sensor_byte(&cur_sensor->sensor_info->i2c_config,
		IMX214_EXPOSURE_REG_H, (expo >> 8) & 0xff, 0x00);
	isp_write_sensor_byte(&cur_sensor->sensor_info->i2c_config,
		IMX214_EXPOSURE_REG_L, expo & 0xff, 0x00);

	if (gain == 0)
		goto out;
	//isp2.2 gain = register_value/0x10
    /*
	digital_h = (gain/SONYIMX214_MAX_ANALOG_GAIN)/16;
    digital_l = (digital_h'decimal)*256
    analog_gain = 256 - (256/(gain/16))
    */
    if (gain > IMX214_MAX_ANALOG_GAIN * 16) {
		tmp_digital_gain = (gain * 256) >> 4;
		tmp_digital_gain = tmp_digital_gain >> 3;

		digital_ratio = (gain / IMX214_MAX_ANALOG_GAIN) >> 4;
		digital_h = digital_ratio;
		digital_l = tmp_digital_gain - digital_ratio * 256;
		analog_gain = IMX214_MAX_ANALOG_GAIN * 16;
	} else {
int hisi_sensor_i2c_write(struct hisi_sensor_ctrl_t *s_ctrl, void *data)
{
	struct sensor_cfg_data *cdata = (struct sensor_cfg_data *)data;
	long   rc = 0;
	unsigned int reg, val, mask;

	cam_debug("%s enter.\n", __func__);

	cam_debug("%s: address=0x%x, value=0x%x\n", __func__,
		cdata->cfg.reg.subaddr, cdata->cfg.reg.value);

	/* parse the I2C parameters */
	reg = cdata->cfg.reg.subaddr;
	val = cdata->cfg.reg.value;
	mask = cdata->cfg.reg.mask;

	rc = isp_write_sensor_byte(&s_ctrl->sensor->sensor_info->i2c_config, reg, val, mask, SCCB_BUS_MUTEX_WAIT);

	return rc;
}