static int32_t msm_sensor_get_power_up_settings(void *setting,
        struct msm_camera_sensor_slave_info *slave_info,
        struct msm_camera_power_ctrl_t *power_info)
{
    int32_t rc = 0;
    uint16_t size = 0;
    uint16_t i = 0;
    struct msm_sensor_power_setting *pu = NULL;

    size = slave_info->power_setting_array.size;

    /* Validate size */
    if ((size == 0) || (size > MAX_POWER_CONFIG)) {
        pr_err("failed: invalid power_setting size_up = %d\n", size);
        return -EINVAL;
    }

    /* Allocate memory for power up setting */
    pu = kzalloc(sizeof(*pu) * size, GFP_KERNEL);
    if (!pu) {
        pr_err("failed: no memory power_setting %p", pu);
        return -ENOMEM;
    }

#ifdef CONFIG_COMPAT
    if (is_compat_task()) {
        rc = msm_sensor_get_pw_settings_compat(pu,
                                               slave_info->power_setting_array.
                                               power_setting, size);
        if (rc < 0) {
            pr_err("failed");
            kfree(pu);
            return -EFAULT;
        }
    } else
#endif
    {
        if (copy_from_user(pu,
                           (void *)slave_info->power_setting_array.power_setting,
                           sizeof(*pu) * size)) {
            pr_err("failed: copy_from_user");
            kfree(pu);
            return -EFAULT;
        }
    }

    /* Print power setting */
    for (i = 0; i < size; i++) {
        CDBG("UP seq_type %d seq_val %d config_val %ld delay %d",
             pu[i].seq_type, pu[i].seq_val,
             pu[i].config_val, pu[i].delay);
    }


    /* Fill power up setting and power up setting size */
    power_info->power_setting = pu;
    power_info->power_setting_size = size;

    return rc;
}
static int32_t msm_sensor_get_power_down_settings(void *setting,
        struct msm_camera_sensor_slave_info *slave_info,
        struct msm_camera_power_ctrl_t *power_info)
{
    int32_t rc = 0;
    uint16_t size_down = 0;
    uint16_t i = 0;
    struct msm_sensor_power_setting *pd = NULL;

    /* DOWN */
    size_down = slave_info->power_setting_array.size_down;
    if (!size_down || size_down > MAX_POWER_CONFIG)
        size_down = slave_info->power_setting_array.size;
    /* Validate size_down */
    if (size_down > MAX_POWER_CONFIG) {
        pr_err("failed: invalid size_down %d", size_down);
        return -EINVAL;
    }
    /* Allocate memory for power down setting */
    pd = kzalloc(sizeof(*pd) * size_down, GFP_KERNEL);
    if (!pd) {
        pr_err("failed: no memory power_setting %p", pd);
        return -EFAULT;
    }

    if (slave_info->power_setting_array.power_down_setting) {
#ifdef CONFIG_COMPAT
        if (is_compat_task()) {
            rc = msm_sensor_get_pw_settings_compat(
                     pd, slave_info->power_setting_array.
                     power_down_setting, size_down);
            if (rc < 0) {
                pr_err("failed");
                kfree(pd);
                return -EFAULT;
            }
        } else
#endif
            if (copy_from_user(pd, (void *)slave_info->power_setting_array.
                               power_down_setting, sizeof(*pd) * size_down)) {
                pr_err("failed: copy_from_user");
                kfree(pd);
                return -EFAULT;
            }
    } else {

        rc = msm_sensor_create_pd_settings(setting, pd, size_down,
                                           slave_info->power_setting_array.power_setting);
        if (rc < 0) {
            pr_err("failed");
            kfree(pd);
            return -EFAULT;
        }
    }

    /* Fill power down setting and power down setting size */
    power_info->power_down_setting = pd;
    power_info->power_down_setting_size = size_down;

    /* Print power setting */
    for (i = 0; i < size_down; i++) {
        CDBG("DOWN seq_type %d seq_val %d config_val %ld delay %d",
             pd[i].seq_type, pd[i].seq_val,
             pd[i].config_val, pd[i].delay);
    }
    return rc;
}
static int32_t msm_sensor_get_power_up_settings(void *setting,
	struct msm_camera_sensor_slave_info *slave_info,
	struct msm_camera_power_ctrl_t *power_info)
{
	int32_t rc = 0;
	uint16_t size = 0;
	uint16_t i = 0;
	struct msm_sensor_power_setting *pu = NULL;

/*                                                                       */
	hw_rev_type rev_type = 0;
	rev_type = lge_get_board_revno();
	pr_err("%s:%d, rev_type:%d\n", __func__, __LINE__, rev_type);

	if ((rev_type == HW_REV_A) && slave_info->power_setting_array.size_a)
		size = slave_info->power_setting_array.size_a;
	else //QCT
		size = slave_info->power_setting_array.size;
/*                                                                       */

	/* Validate size */
	if ((size == 0) || (size > MAX_POWER_CONFIG)) {
		pr_err("failed: invalid power_setting size_up = %d\n", size);
		return -EINVAL;
	}

	/* Allocate memory for power up setting */
	pu = kzalloc(sizeof(*pu) * size, GFP_KERNEL);
	if (!pu) {
		pr_err("failed: no memory power_setting %p", pu);
		return -ENOMEM;
	}

#ifdef CONFIG_COMPAT
	if (is_compat_task()) {
		rc = msm_sensor_get_pw_settings_compat(pu,
			slave_info->power_setting_array.
				power_setting, size);
		if (rc < 0) {
			pr_err("failed");
			kfree(pu);
			return -EFAULT;
		}
	} else
#endif
/*                                                                       */
	{
		switch(rev_type) {
		case HW_REV_A:
			if (slave_info->power_setting_array.power_setting_a != NULL){
				if (copy_from_user(pu,
					(void *)slave_info->power_setting_array.power_setting_a,
					sizeof(*pu) * size)) {
					pr_err("failed: copy_from_user");
					kfree(pu);
					return -EFAULT;
				}
			}else{
				if (copy_from_user(pu,
					(void *)slave_info->power_setting_array.power_setting,
					sizeof(*pu) * size)) {
					pr_err("failed: copy_from_user");
					kfree(pu);
					return -EFAULT;
				}
			}
			break;
		case HW_REV_B:
			if (copy_from_user(pu,
				(void *)slave_info->power_setting_array.power_setting,
				sizeof(*pu) * size)) {
				pr_err("failed: copy_from_user");
				kfree(pu);
				return -EFAULT;
			}
			break;
		default: //QCT
			if (copy_from_user(pu,
				(void *)slave_info->power_setting_array.power_setting,
				sizeof(*pu) * size)) {
				pr_err("failed: copy_from_user");
				kfree(pu);
				return -EFAULT;
			}
			break;
		}
	}
/*                                                                       */

	/* Print power setting */
	for (i = 0; i < size; i++) {
		CDBG("UP seq_type %d seq_val %d config_val %ld delay %d",
			pu[i].seq_type, pu[i].seq_val,
			pu[i].config_val, pu[i].delay);
	}

	/* Fill power up setting and power up setting size */
	power_info->power_setting = pu;
	power_info->power_setting_size = size;

	return rc;
}