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;
}
Exemple #2
0
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;
}