static long dip_misc_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { void __user *argp = (void __user *)arg; int i; struct comp_info_array temp_array; unsigned int rate = 0; struct comp_info_array *array = &dip_info->comp_info_array; if (cmd == DIP_START) { if (copy_from_user (&temp_array, argp, sizeof(struct comp_info_array))) return -EFAULT; array->comp_num = temp_array.comp_num; if (copy_from_user(array->comp_info, temp_array.comp_info, sizeof(struct comp_info) * array->comp_num)) return -EFAULT; for (i = 0; i < array->comp_num; i++) { if (array->comp_info[i].comp_id == CPU) { pm_qos_update_request(&dip_info->cpu_min_qos, array->comp_info[i]. min_freq); pm_qos_update_request(&dip_info->cpu_max_qos, array->comp_info[i]. max_freq); } else if (array->comp_info[i].comp_id == DDR) { pm_qos_update_request(&dip_info->ddr_min_qos, array->comp_info[i]. min_freq); pm_qos_update_request(&dip_info->ddr_max_qos, array->comp_info[i]. max_freq); } else if (array->comp_info[i].comp_id == LCD) { rate = array->comp_info[i].min_freq; } } dip_notifier(cmd, &rate); wake_lock(&dip_wakelock); return 0; } else if (cmd == DIP_END) { wake_unlock(&dip_wakelock); dip_notifier(cmd, &rate); pm_qos_update_request(&dip_info->cpu_min_qos, PM_QOS_DEFAULT_VALUE); pm_qos_update_request(&dip_info->cpu_max_qos, INT_MAX); pm_qos_update_request(&dip_info->ddr_min_qos, PM_QOS_DEFAULT_VALUE); pm_qos_update_request(&dip_info->ddr_max_qos, INT_MAX); return 0; } return -ENOSYS; }
static long dip_misc_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { struct comp_info_array temp_array; unsigned int rate = 0; int i; #ifdef CONFIG_COMPAT uint32_t buf[2]; #endif struct comp_info_array *array = &dip_info->comp_info_array; if (cmd == DIP_START) { #ifdef CONFIG_COMPAT if (copy_from_user(buf, compat_ptr(arg), sizeof(buf))) return -EFAULT; else { temp_array.comp_num = buf[0]; temp_array.comp_info = (struct comp_info *)(u64)buf[1]; } #else if (copy_from_user(&temp_array, (void __user *)arg, sizeof(struct comp_info_array))) return -EFAULT; #endif if (MAX_NUM < temp_array.comp_num) temp_array.comp_num = MAX_NUM; array->comp_num = temp_array.comp_num; #ifdef CONFIG_COMPAT if (copy_from_user(array->comp_info, compat_ptr((unsigned long)temp_array.comp_info), sizeof(struct comp_info) * array->comp_num)) #else if (copy_from_user(array->comp_info, (void __user *)temp_array.comp_info, sizeof(struct comp_info) * array->comp_num)) #endif return -EFAULT; for (i = 0; i < array->comp_num; i++) { #ifdef CONFIG_ARM_MMP_BL_CPUFREQ if (array->comp_info[i].comp_id == CLST0) { pm_qos_update_request(&dip_info->cpu_min_l_qos, array->comp_info[i]. min_freq); pm_qos_update_request(&dip_info->cpu_max_l_qos, array->comp_info[i]. max_freq); } else if (array->comp_info[i].comp_id == CLST1) { pm_qos_update_request(&dip_info->cpu_min_b_qos, array->comp_info[i]. min_freq); pm_qos_update_request(&dip_info->cpu_max_b_qos, array->comp_info[i]. max_freq); #else if (array->comp_info[i].comp_id == CPU) { pm_qos_update_request(&dip_info->cpu_min_qos, array->comp_info[i]. min_freq); pm_qos_update_request(&dip_info->cpu_max_qos, array->comp_info[i]. max_freq); #endif } else if (array->comp_info[i].comp_id == DDR) { pm_qos_update_request(&dip_info->ddr_min_qos, array->comp_info[i]. min_freq); pm_qos_update_request(&dip_info->ddr_max_qos, array->comp_info[i]. max_freq); } else if (array->comp_info[i].comp_id == LCD) { rate = array->comp_info[i].min_freq; } else if (array->comp_info[i].comp_id == USB) { printk("Try to re-set USB PLL on\n"); usb2_phy_dip_set(1); } } dip_notifier(cmd, &rate); return 0; } else if (cmd == DIP_END) { usb2_phy_dip_set(0); dip_notifier(cmd, &rate); #ifdef CONFIG_ARM_MMP_BL_CPUFREQ pm_qos_update_request(&dip_info->cpu_min_l_qos, PM_QOS_DEFAULT_VALUE); pm_qos_update_request(&dip_info->cpu_max_l_qos, INT_MAX); pm_qos_update_request(&dip_info->cpu_min_b_qos, PM_QOS_DEFAULT_VALUE); pm_qos_update_request(&dip_info->cpu_max_b_qos, INT_MAX); #else pm_qos_update_request(&dip_info->cpu_min_qos, PM_QOS_DEFAULT_VALUE); pm_qos_update_request(&dip_info->cpu_max_qos, INT_MAX); #endif pm_qos_update_request(&dip_info->ddr_min_qos, PM_QOS_DEFAULT_VALUE); pm_qos_update_request(&dip_info->ddr_max_qos, INT_MAX); return 0; } return -ENOSYS; }