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; }