static int cpuboost_time_set(const char *val, struct kernel_param *kp) { int ret = param_set_ulong(val, kp); mutex_lock(&lock); cpuboost_time = (cpuboost_time > OMAP_CPUBOOST_TIME_MAX) ? OMAP_CPUBOOST_TIME_MAX : cpuboost_time; cancel_delayed_work(&(cbs->work->work)); printk(KERN_INFO "cpuboost_time_set = %ld\n", cpuboost_time); if (cpuboost_time > 0) { omap_pm_set_min_mpu_freq(device, 1000000000); schedule_delayed_work(&(cbs->work->work), msecs_to_jiffies(cpuboost_time)); } if ((ret) || (cpuboost_time == 0)) { omap_pm_set_min_mpu_freq(device, -1); printk(KERN_INFO "cpuboost_time cleared\n"); } mutex_unlock(&lock); return ret; }
static void cpuboost_process_work(struct work_struct *work) { mutex_lock(&lock); omap_pm_set_min_mpu_freq(device, -1); printk(KERN_INFO "cpuboost_time cleared\n"); cpuboost_time = 0; mutex_unlock(&lock); }
static ssize_t vdd_opp_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t n) { unsigned long value; if (sscanf(buf, "%lu", &value) != 1) return -EINVAL; /* Check locks */ if (attr == &vdd1_lock_attr) { if (vdd1_locked) { /* vdd1 currently locked */ if (value == 0) { if (omap_pm_set_min_mpu_freq(&sysfs_cpufreq_dev, -1)) { printk(KERN_ERR "%s: Failed to remove vdd1_lock\n", __func__); } else { vdd1_locked = 0; return n; } } else { printk(KERN_ERR "%s: vdd1 already locked to %d\n", __func__, vdd1_locked); return -EINVAL; } } else { /* vdd1 currently unlocked */ if (value != 0) { u8 i = 0; unsigned long freq = 0; struct cpufreq_frequency_table *freq_table = *omap_pm_cpu_get_freq_table(); if (freq_table == NULL) { printk(KERN_ERR "%s: Could not get freq_table\n", __func__); return -ENODEV; } for (i = 0; freq_table[i].frequency != CPUFREQ_TABLE_END; i++) { if (freq_table[i].index == value - 1) { freq = freq_table[i].frequency; break; } } if (freq_table[i].frequency == CPUFREQ_TABLE_END) { printk(KERN_ERR "%s: Invalid value [0..%d]\n", __func__, i-1); return -EINVAL; } if (omap_pm_set_min_mpu_freq(&sysfs_cpufreq_dev, freq * 1000)) { printk(KERN_ERR "%s: Failed to add vdd1_lock\n", __func__); } else { vdd1_locked = value; } } else { printk(KERN_ERR "%s: vdd1 already unlocked\n", __func__); return -EINVAL; } } } else if (attr == &vdd2_lock_attr) { if (vdd2_locked) { /* vdd2 currently locked */ if (value == 0) { if (omap_pm_set_min_bus_tput(&sysfs_cpufreq_dev, OCP_INITIATOR_AGENT, 0)) { printk(KERN_ERR "%s: Failed to remove vdd2_lock\n", __func__); } else { vdd2_locked = 0; return n; } } else { printk(KERN_ERR "%s: vdd2 already locked to %d\n", __func__, vdd2_locked); return -EINVAL; } } else { /* vdd2 currently unlocked */ if (value != 0) { unsigned long freq = 0; if (cpu_is_omap3630()) { if(value == 1) { freq = 100*1000*4; } else if (value == 2) { freq = 200*1000*4; } else { printk(KERN_ERR "%s: Invalid value [1,2]\n", __func__); return -EINVAL; } } else if (cpu_is_omap44xx()) { if (omap_rev() <= OMAP4430_REV_ES2_0) { if(value == 1) { freq = 100*1000*4; } else if (value == 2) { freq = 200*1000*4; } else { printk(KERN_ERR "%s: Invalid value [1,2]\n", __func__); return -EINVAL; } } else { if(value == 1) { freq = 98304*4; } else if (value == 2) { freq = 100*1000*4; } else if (value == 3) { freq = 200*1000*4; } else { printk(KERN_ERR "%s: Invalid value [1,2,3]\n", __func__); return -EINVAL; } } } else { printk(KERN_ERR "%s: Unsupported HW [OMAP3630, OMAP44XX]\n", __func__); return -ENODEV; } if (omap_pm_set_min_bus_tput(&sysfs_cpufreq_dev, OCP_INITIATOR_AGENT, freq)) { printk(KERN_ERR "%s: Failed to add vdd2_lock\n", __func__); } else { vdd2_locked = value; } return n; } else { printk(KERN_ERR "%s: vdd2 already unlocked\n", __func__); return -EINVAL; } } } else if (attr == &dsp_freq_attr) { u8 i, opp_id = 0; struct omap_opp *opp_table = omap_pm_dsp_get_opp_table(); if (opp_table == NULL) { printk(KERN_ERR "%s: Could not get dsp opp_table\n", __func__); return -ENODEV; } for (i = 1; opp_table[i].rate; i++) { if (opp_table[i].rate >= value) { opp_id = i; break; } } if (opp_id == 0) { printk(KERN_ERR "%s: Invalid value\n", __func__); return -EINVAL; } omap_pm_dsp_set_min_opp(opp_id); } else if (attr == &vdd1_opp_attr) { printk(KERN_ERR "%s: changing vdd1_opp is not supported\n", __func__); return -EINVAL; } else if (attr == &vdd2_opp_attr) { printk(KERN_ERR "%s: changing vdd2_opp is not supported\n", __func__); return -EINVAL; } else { return -EINVAL; } return n; }