Esempio n. 1
0
static void touch_dvfs_work(struct work_struct *work)
{
	if (kona_dvfs_data.enable)
		omap_cpufreq_min_limit(DVFS_LOCK_ID_TSP, TOUCH_DVFS_FREQ);
	else
		omap_cpufreq_min_limit_free(DVFS_LOCK_ID_TSP);
}
static void espresso_set_dvfs(bool on)
{
#ifdef CONFIG_TOUCH_DVFS
	if (!board_is_espresso10()) {
		static bool is_on;

		if (on && !is_on) {
			omap_cpufreq_min_limit(DVFS_LOCK_ID_TSP, CONFIG_TOUCH_DVFS);
			is_on = true;
		} else if (!on && is_on) {
			omap_cpufreq_min_limit_free(DVFS_LOCK_ID_TSP);
			is_on = false;
		}
	}
#endif
}
static void cpufreq_min_limit(const char *buf, size_t count)
{
	int ret, temp;

	mutex_lock(&cpufreq_min_mutex);

	temp = cpufreq_min_limit_val;
	ret = sscanf(buf, "%d", &cpufreq_min_limit_val);
	if (ret != 1) {
		pr_warn("%s: invalid format(%d)\n", __func__, ret);
		ret = -EINVAL;
		goto out;
	}

	if (cpufreq_min_limit_val == -1) {
		if (cpufreq_min_locked) {
			omap_cpufreq_min_limit_free(DVFS_LOCK_ID_USER);
			cpufreq_min_locked = 0;
			ret = 0;
		} else {
			pr_warn("%s: there is no min limit!\n", __func__);
			ret = -EINVAL;
		}
		goto out;
	}

	pr_debug("%s: current max freq=%d req max freq=%d\n",
		__func__, cpufreq_max_limit_val, cpufreq_min_limit_val);

	if (cpufreq_min_locked)
		omap_cpufreq_min_limit_free(DVFS_LOCK_ID_USER);

	omap_cpufreq_min_limit(DVFS_LOCK_ID_USER, cpufreq_min_limit_val);
	cpufreq_min_locked = 1;

out:
	if (ret < 0)
		cpufreq_min_limit_val = temp;

	mutex_unlock(&cpufreq_min_mutex);
	return;
}
static void irled_work(struct work_struct *work)
{
	unsigned int period;
	unsigned int off_period;
	unsigned int duty;
	unsigned int on;
	unsigned int off;
	unsigned int i;
	unsigned int j;
	int ret;

	ret =
	    omap_cpufreq_max_limit(DVFS_LOCK_ID_IR_LED, ir_data.cpu_frequency);
	ret |=
	    omap_cpufreq_min_limit(DVFS_LOCK_ID_IR_LED, ir_data.cpu_frequency);

	if (unlikely(ret < 0))
		pr_err("irled: failed to lock cpufreq\n");

	gpio_direction_output(irled_gpios[GPIO_IRDA_EN].gpio, 1);

	__udelay(1000);

	period = (MICRO_SEC / ir_data.signal[0]) + ir_data.on_offset;

	duty = period / 4;
	on = duty;
	off = period - duty;

	local_irq_disable();
	for (i = 1; i < MAX_SIZE; i += 2) {
		if (ir_data.signal[i] == 0)
			break;

		for (j = 0; j < ir_data.signal[i]; j++) {
			gpio_direction_output(irled_gpios
					      [GPIO_IRDA_CONTROL].gpio, 1);
			__udelay(on);
			gpio_direction_output(irled_gpios
					      [GPIO_IRDA_CONTROL].gpio, 0);
			__udelay(off);
		}

		period = (MICRO_SEC / ir_data.signal[0]) + ir_data.off_offset;

		off_period = ir_data.signal[i + 1] * period;

		if (off_period <= 9999) {
			if (off_period > 1000) {
				__udelay(off_period % 1000);
				mdelay(off_period / 1000);
			} else
				__udelay(off_period);
		} else {
			local_irq_enable();
			__udelay(off_period % 1000);
			mdelay(off_period / 1000);
			local_irq_disable();
		}
	}
	gpio_direction_output(irled_gpios[GPIO_IRDA_CONTROL].gpio, 1);
	__udelay(on);
	gpio_direction_output(irled_gpios[GPIO_IRDA_CONTROL].gpio, 0);
	__udelay(off);

	local_irq_enable();

	omap_cpufreq_min_limit_free(DVFS_LOCK_ID_IR_LED);
	omap_cpufreq_max_limit_free(DVFS_LOCK_ID_IR_LED);

	gpio_direction_output(irled_gpios[GPIO_IRDA_EN].gpio, 0);
}