Add screen off profile to mpdecision
/arch/arm/mach-msm/msm_mpdecision.c
blob:8bb194dde5dae58e46affb2ba378927be2613a7e -> blob:758c84a41343b07b073a4bb48634c5322cd94f55
--- arch/arm/mach-msm/msm_mpdecision.c
+++ arch/arm/mach-msm/msm_mpdecision.c
@@ -37,12 +37,11 @@
#define DEBUG 0
-#define MPDEC_TAG "[MSM MPDEC]: "
-#define MSM_MPDEC_STARTDELAY CONFIG_MSM_MPDEC_STARTDELAY
-#define MSM_MPDEC_DELAY CONFIG_MSM_MPDEC_DELAY
-#define MSM_MPDEC_PAUSE CONFIG_MSM_MPDEC_PAUSE
-#define MSM_MPDEC_IDLE_FREQ CONFIG_MSM_MPDEC_IDLE_FREQ
-#define MSM_MPDEC_SCROFF_FREQ CONFIG_MSM_MPDEC_SCROFF_FREQ
+#define MPDEC_TAG "[AnThRaX MPDEC]: "
+#define MSM_MPDEC_STARTDELAY 20000
+#define MSM_MPDEC_DELAY 70
+#define MSM_MPDEC_PAUSE 10000
+#define MSM_MPDEC_IDLE_FREQ 486000
enum {
MSM_MPDEC_DISABLED = 0,
@@ -54,10 +53,8 @@ enum {
struct msm_mpdec_cpudata_t {
struct mutex suspend_mutex;
int online;
- bool device_suspended;
+ int device_suspended;
cputime64_t on_time;
- unsigned int max;
- bool cpu_sleeping;
};
static DEFINE_PER_CPU(struct msm_mpdec_cpudata_t, msm_mpdec_cpudata);
@@ -70,21 +67,17 @@ static struct msm_mpdec_tuners {
unsigned int delay;
unsigned int pause;
bool scroff_single_core;
- bool scroff_profile;
unsigned long int idle_freq;
- unsigned long int scroff_freq;
- unsigned int max_cpus;
- unsigned int min_cpus;
+ unsigned int max_cpus;
+ unsigned int min_cpus;
} msm_mpdec_tuners_ins = {
.startdelay = MSM_MPDEC_STARTDELAY,
.delay = MSM_MPDEC_DELAY,
.pause = MSM_MPDEC_PAUSE,
.scroff_single_core = true,
- .scroff_profile = true,
.idle_freq = MSM_MPDEC_IDLE_FREQ,
- .scroff_freq = MSM_MPDEC_SCROFF_FREQ,
- .max_cpus = CONFIG_NR_CPUS,
- .min_cpus = 1,
+ .max_cpus = CONFIG_NR_CPUS,
+ .min_cpus = 1,
};
static unsigned int NwNs_Threshold[8] = {12, 0, 25, 20, 32, 28, 0, 35};
@@ -96,63 +89,52 @@ extern unsigned long acpuclk_get_rate(in
unsigned int state = MSM_MPDEC_IDLE;
bool was_paused = false;
-static void update_cpu_max_freq(int max_freq)
-{
- pr_info(MPDEC_TAG"Update Max Freq enter --%d--\n", max_freq);
-
- if (max_freq >= MAX_FREQ_LIMIT)
- cpufreq_set_limit_defered(USER_MAX_STOP, max_freq);
- else if (max_freq >= MIN_FREQ_LIMIT)
- cpufreq_set_limit_defered(USER_MAX_START, max_freq);
-
- pr_info(MPDEC_TAG"Update Max Freq leave --%d--\n", max_freq);
-
- return;
-}
-
static unsigned long get_rate(int cpu)
{
- return acpuclk_get_rate(cpu);
+ return acpuclk_get_rate(cpu);
}
static int get_slowest_cpu(void)
{
- int i, cpu = 0;
- unsigned long rate, slow_rate = 0;
+ int i, cpu = 0;
+ unsigned long rate, slow_rate = 0;
- for (i = 1; i < CONFIG_NR_CPUS; i++) {
- if (!cpu_online(i))
- continue;
-
- rate = get_rate(i);
- if (slow_rate == 0)
- slow_rate = rate;
-
- if ((rate <= slow_rate) && (slow_rate != 0)) {
- cpu = i;
- slow_rate = rate;
- }
- }
+ for (i = 1; i < CONFIG_NR_CPUS; i++) {
+ if (!cpu_online(i))
+ continue;
+
+ rate = get_rate(i);
+ if (slow_rate == 0) {
+ slow_rate = rate;
+ }
+
+ if ((rate <= slow_rate) && (slow_rate != 0)) {
+ cpu = i;
+ slow_rate = rate;
+ }
+ }
- return cpu;
+ return cpu;
}
static unsigned long get_slowest_cpu_rate(void)
{
- int i = 0;
- unsigned long rate, slow_rate = 0;
+ int i = 0;
+ unsigned long rate, slow_rate = 0;
- for (i = 0; i < CONFIG_NR_CPUS; i++) {
- if (!cpu_online(i))
- continue;
- rate = get_rate(i);
- if ((rate < slow_rate) && (slow_rate != 0))
- slow_rate = rate;
- if (slow_rate == 0)
- slow_rate = rate;
- }
+ for (i = 0; i < CONFIG_NR_CPUS; i++) {
+ if (!cpu_online(i))
+ continue;
+ rate = get_rate(i);
+ if ((rate < slow_rate) && (slow_rate != 0)) {
+ slow_rate = rate;
+ }
+ if (slow_rate == 0) {
+ slow_rate = rate;
+ }
+ }
- return slow_rate;
+ return slow_rate;
}
static int mp_decision(void)
@@ -187,16 +169,18 @@ static int mp_decision(void)
if (nr_cpu_online) {
index = (nr_cpu_online - 1) * 2;
if ((nr_cpu_online < CONFIG_NR_CPUS) && (rq_depth >= NwNs_Threshold[index])) {
- if ((total_time >= TwTs_Threshold[index]) && (nr_cpu_online < msm_mpdec_tuners_ins.max_cpus)) {
+ if ((total_time >= TwTs_Threshold[index]) &&
+ (nr_cpu_online < msm_mpdec_tuners_ins.max_cpus)) {
new_state = MSM_MPDEC_UP;
- if (get_slowest_cpu_rate() <= msm_mpdec_tuners_ins.idle_freq)
- new_state = MSM_MPDEC_IDLE;
+ if (get_slowest_cpu_rate() <= msm_mpdec_tuners_ins.idle_freq)
+ new_state = MSM_MPDEC_IDLE;
}
} else if ((nr_cpu_online > 1) && (rq_depth <= NwNs_Threshold[index+1])) {
- if ((total_time >= TwTs_Threshold[index+1]) && (nr_cpu_online > msm_mpdec_tuners_ins.min_cpus)) {
+ if ((total_time >= TwTs_Threshold[index+1]) &&
+ (nr_cpu_online > msm_mpdec_tuners_ins.min_cpus)) {
new_state = MSM_MPDEC_DOWN;
- if (get_slowest_cpu_rate() > msm_mpdec_tuners_ins.idle_freq)
- new_state = MSM_MPDEC_IDLE;
+ if (get_slowest_cpu_rate() > msm_mpdec_tuners_ins.idle_freq)
+ new_state = MSM_MPDEC_IDLE;
}
} else {
new_state = MSM_MPDEC_IDLE;
@@ -212,8 +196,8 @@ static int mp_decision(void)
last_time = ktime_to_ms(ktime_get());
#if DEBUG
- pr_info(MPDEC_TAG"[DEBUG] rq: %u, new_state: %i | Mask=[%d%d%d%d]\n",
- rq_depth, new_state, cpu_online(0), cpu_online(1), cpu_online(2), cpu_online(3));
+ pr_info(MPDEC_TAG"[DEBUG] rq: %u, new_state: %i | Mask=[%d%d%d%d]\n",
+ rq_depth, new_state, cpu_online(0), cpu_online(1), cpu_online(2), cpu_online(3));
#endif
return new_state;
}
@@ -222,17 +206,17 @@ static void msm_mpdec_work_thread(struct
{
unsigned int cpu = nr_cpu_ids;
cputime64_t on_time = 0;
- bool suspended = false;
+ bool suspended = false;
- if (ktime_to_ms(ktime_get()) <= msm_mpdec_tuners_ins.startdelay)
- goto out;
+ if (ktime_to_ms(ktime_get()) <= msm_mpdec_tuners_ins.startdelay)
+ goto out;
- for_each_possible_cpu(cpu) {
- if ((per_cpu(msm_mpdec_cpudata, cpu).device_suspended == true)) {
- suspended = true;
- break;
- }
- }
+ for_each_possible_cpu(cpu) {
+ if ((per_cpu(msm_mpdec_cpudata, cpu).device_suspended == true)) {
+ suspended = true;
+ break;
+ }
+ }
if (suspended == true)
goto out;
@@ -262,15 +246,11 @@ static void msm_mpdec_work_thread(struct
cpu_down(cpu);
per_cpu(msm_mpdec_cpudata, cpu).online = false;
on_time = ktime_to_ms(ktime_get()) - per_cpu(msm_mpdec_cpudata, cpu).on_time;
-#if DEBUG
pr_info(MPDEC_TAG"CPU[%d] on->off | Mask=[%d%d%d%d] | time online: %llu\n",
cpu, cpu_online(0), cpu_online(1), cpu_online(2), cpu_online(3), on_time);
-#endif
} else if (per_cpu(msm_mpdec_cpudata, cpu).online != cpu_online(cpu)) {
-#if DEBUG
pr_info(MPDEC_TAG"CPU[%d] was controlled outside of mpdecision! | pausing [%d]ms\n",
cpu, msm_mpdec_tuners_ins.pause);
-#endif
msleep(msm_mpdec_tuners_ins.pause);
was_paused = true;
}
@@ -283,15 +263,11 @@ static void msm_mpdec_work_thread(struct
cpu_up(cpu);
per_cpu(msm_mpdec_cpudata, cpu).online = true;
per_cpu(msm_mpdec_cpudata, cpu).on_time = ktime_to_ms(ktime_get());
-#if DEBUG
pr_info(MPDEC_TAG"CPU[%d] off->on | Mask=[%d%d%d%d]\n",
cpu, cpu_online(0), cpu_online(1), cpu_online(2), cpu_online(3));
-#endif
} else if (per_cpu(msm_mpdec_cpudata, cpu).online != cpu_online(cpu)) {
-#if DEBUG
pr_info(MPDEC_TAG"CPU[%d] was controlled outside of mpdecision! | pausing [%d]ms\n",
cpu, msm_mpdec_tuners_ins.pause);
-#endif
msleep(msm_mpdec_tuners_ins.pause);
was_paused = true;
}
@@ -310,84 +286,50 @@ out:
return;
}
-static int checkuptime(void)
-{
- struct timespec uptime;
-
- do_posix_clock_monotonic_gettime(&uptime);
-
- if (uptime.tv_sec > CONFIG_MSM_MPDEC_SCROFF_BOOT_DELAY)
- return 1;
- else
- return 0;
-}
-
static void msm_mpdec_early_suspend(struct early_suspend *h)
{
int cpu = nr_cpu_ids;
- char cpu_mask[CONFIG_NR_CPUS +1] = "";
- char cpu_online_string[2] = "";
- struct cpufreq_policy *cpu_policy = NULL;
-
- pr_info(MPDEC_TAG"Screen -> off.\n");
for_each_possible_cpu(cpu) {
mutex_lock(&per_cpu(msm_mpdec_cpudata, cpu).suspend_mutex);
if ((cpu >= 1) && (cpu_online(cpu))) {
- cpu_down(cpu);
- pr_info(MPDEC_TAG"Screen -> off. Suspended CPU%d.\n", cpu);
+ cpu_down(cpu);
+ pr_info(MPDEC_TAG"Screen -> off. Suspended CPU[%d] | Mask=[%d%d%d%d]\n",
+ cpu, cpu_online(0), cpu_online(1), cpu_online(2), cpu_online(3));
per_cpu(msm_mpdec_cpudata, cpu).online = false;
}
- if ((cpu_online(cpu) == 1) && (msm_mpdec_tuners_ins.scroff_profile) && (checkuptime())) {
- cpu_policy = cpufreq_cpu_get(cpu);
- per_cpu(msm_mpdec_cpudata, cpu).max = cpu_policy->max;
- update_cpu_max_freq(msm_mpdec_tuners_ins.scroff_freq);
- pr_info(MPDEC_TAG"Entered sleep profile on CPU%d successfully.\n", cpu);
- per_cpu(msm_mpdec_cpudata, cpu).cpu_sleeping = true;
- }
per_cpu(msm_mpdec_cpudata, cpu).device_suspended = true;
- sprintf(cpu_online_string, "%d", cpu_online(cpu));
- strncat(cpu_mask,cpu_online_string,1);
mutex_unlock(&per_cpu(msm_mpdec_cpudata, cpu).suspend_mutex);
}
- /* main work thread can sleep now */
- cancel_delayed_work_sync(&msm_mpdec_work);
+ /* main work thread can sleep now */
+ cancel_delayed_work_sync(&msm_mpdec_work);
- pr_info(MPDEC_TAG"CPU Mask = [%s].\n",cpu_mask);
+ pr_info(MPDEC_TAG"Screen -> off. Deactivated mpdecision.\n");
}
static void msm_mpdec_late_resume(struct early_suspend *h)
{
int cpu = nr_cpu_ids;
- char cpu_mask[CONFIG_NR_CPUS +1] = "";
- char cpu_online_string[2] = "";
-
- pr_info(MPDEC_TAG"Screen -> on.\n");
- for_each_possible_cpu(cpu) {
- mutex_lock(&per_cpu(msm_mpdec_cpudata, 1).suspend_mutex);
+ for_each_possible_cpu(cpu)
per_cpu(msm_mpdec_cpudata, cpu).device_suspended = false;
- if ((cpu_online(cpu) == 1) && (msm_mpdec_tuners_ins.scroff_profile) && (checkuptime())) {
- update_cpu_max_freq(per_cpu(msm_mpdec_cpudata, cpu).max);
- pr_info(MPDEC_TAG"Entered wake profile on CPU%d successfully.\n", cpu);
- per_cpu(msm_mpdec_cpudata, cpu).cpu_sleeping = false;
- }
- if (!cpu_online(cpu)) {
- /* Turn on all cpus when the screen comes on
- * This boost the wakeup process. */
- cpu_up(cpu);
- per_cpu(msm_mpdec_cpudata, cpu).on_time = ktime_to_ms(ktime_get());
- per_cpu(msm_mpdec_cpudata, cpu).online = true;
- }
- sprintf(cpu_online_string, "%d", cpu_online(cpu));
- strncat(cpu_mask,cpu_online_string,1);
- mutex_unlock(&per_cpu(msm_mpdec_cpudata, 1).suspend_mutex);
- }
-
- pr_info(MPDEC_TAG"CPU Mask = [%s].\n",cpu_mask);
-
- /* wake up main work thread */
- was_paused = true;
- queue_delayed_work(msm_mpdec_workq, &msm_mpdec_work, 0);
+ mutex_lock(&per_cpu(msm_mpdec_cpudata, 1).suspend_mutex);
+ if (!cpu_online(1)) {
+ /* Always enable cpu1 when screen comes online.
+ * This boosts the wakeup process. */
+ cpu_up(1);
+ per_cpu(msm_mpdec_cpudata, 1).on_time = ktime_to_ms(ktime_get());
+ per_cpu(msm_mpdec_cpudata, 1).online = true;
+ pr_info(MPDEC_TAG"Screen -> on. Hot plugged CPU1 | Mask=[%d%d%d%d]\n",
+ cpu_online(0), cpu_online(1), cpu_online(2), cpu_online(3));
+ }
+ mutex_unlock(&per_cpu(msm_mpdec_cpudata, 1).suspend_mutex);
+
+ /* wake up main work thread */
+ was_paused = true;
+ queue_delayed_work(msm_mpdec_workq, &msm_mpdec_work, 0);
+
+ pr_info(MPDEC_TAG"Screen -> on. Activated mpdecision. | Mask=[%d%d%d%d]\n",
+ cpu_online(0), cpu_online(1), cpu_online(2), cpu_online(3));
}
static struct early_suspend msm_mpdec_early_suspend_handler = {
@@ -412,13 +354,6 @@ show_one(pause, pause);
show_one(scroff_single_core, scroff_single_core);
show_one(min_cpus, min_cpus);
show_one(max_cpus, max_cpus);
-show_one(scroff_profile, scroff_profile);
-
-static ssize_t show_scroff_freq (struct kobject *kobj, struct attribute *attr,
- char *buf)
-{
- return sprintf(buf, "%lu\n", msm_mpdec_tuners_ins.scroff_freq);
-}
#define show_one_twts(file_name, arraypos) \
static ssize_t show_##file_name \
@@ -575,19 +510,6 @@ static ssize_t store_idle_freq(struct ko
return count;
}
-static ssize_t store_scroff_freq(struct kobject *a, struct attribute *b,
- const char *buf, size_t count)
-{
- long unsigned int input;
- int ret;
- ret = sscanf(buf, "%lu", &input);
- if (ret != 1)
- return -EINVAL;
- msm_mpdec_tuners_ins.scroff_freq = input;
-
- return count;
-}
-
static ssize_t store_scroff_single_core(struct kobject *a, struct attribute *b,
const char *buf, size_t count)
{
@@ -616,7 +538,7 @@ static ssize_t store_max_cpus(struct kob
int ret;
ret = sscanf(buf, "%u", &input);
if ((ret != 1) || input > CONFIG_NR_CPUS)
- return -EINVAL;
+ return -EINVAL;
msm_mpdec_tuners_ins.max_cpus = input;
@@ -630,58 +552,13 @@ static ssize_t store_min_cpus(struct kob
int ret;
ret = sscanf(buf, "%u", &input);
if ((ret != 1) || input < 1)
- return -EINVAL;
+ return -EINVAL;
msm_mpdec_tuners_ins.min_cpus = input;
return count;
}
-static ssize_t store_scroff_profile(struct kobject *a, struct attribute *b,
- const char *buf, size_t count)
-{
- unsigned int input;
- size_t ret = count;
- int cpu;
- struct cpufreq_policy *cpu_policy = NULL;
-
- ret = sscanf(buf, "%u", &input);
- if (ret != 1)
- return -EINVAL;
- switch (buf[0]) {
- case '0':
- msm_mpdec_tuners_ins.scroff_profile = input;
- break;
- case '1':
- msm_mpdec_tuners_ins.scroff_profile = input;
- break;
- default:
- ret = -EINVAL;
- }
-
- for_each_possible_cpu(cpu) {
- if (per_cpu(msm_mpdec_cpudata, cpu).device_suspended == true) {
- if (per_cpu(msm_mpdec_cpudata, cpu).cpu_sleeping == true) {
- if ((cpu_online(cpu) == 1) && (msm_mpdec_tuners_ins.scroff_profile == false) && (checkuptime())) {
- update_cpu_max_freq(per_cpu(msm_mpdec_cpudata, cpu).max);
- pr_info(MPDEC_TAG"Entered wake profile on CPU%d successfully.\n", cpu);
- per_cpu(msm_mpdec_cpudata, cpu).cpu_sleeping = false;
- }
- } else {
- if ((cpu_online(cpu) == 1) && (msm_mpdec_tuners_ins.scroff_profile) && (checkuptime())) {
- cpu_policy = cpufreq_cpu_get(cpu);
- per_cpu(msm_mpdec_cpudata, cpu).max = cpu_policy->max;
- update_cpu_max_freq(msm_mpdec_tuners_ins.scroff_freq);
- pr_info(MPDEC_TAG"Entered sleep profile on CPU%d successfully.\n", cpu);
- per_cpu(msm_mpdec_cpudata, cpu).cpu_sleeping = true;
- }
- }
- }
- }
-
- return ret;
-}
-
static ssize_t store_enabled(struct kobject *a, struct attribute *b,
const char *buf, size_t count)
{
@@ -710,22 +587,23 @@ static ssize_t store_enabled(struct kobj
switch (buf[0]) {
case '0':
state = MSM_MPDEC_DISABLED;
- pr_info(MPDEC_TAG"nap time... Hot plugging offline CPUs...\n");
+ pr_info(MPDEC_TAG"nap time... Hot plugging offline CPUs...\n");
- for (cpu = 1; cpu < CONFIG_NR_CPUS; cpu++) {
- if (!cpu_online(cpu)) {
- per_cpu(msm_mpdec_cpudata, cpu).on_time = ktime_to_ms(ktime_get());
- per_cpu(msm_mpdec_cpudata, cpu).online = true;
- cpu_up(cpu);
- pr_info(MPDEC_TAG" DISABLED... Hot plugged CPU[%d] | Mask=[%d%d%d%d]\n",
- cpu, cpu_online(0), cpu_online(1), cpu_online(2), cpu_online(3));
- }
- }
+ for (cpu = 1; cpu < CONFIG_NR_CPUS; cpu++) {
+ if (!cpu_online(cpu)) {
+ per_cpu(msm_mpdec_cpudata, cpu).on_time = ktime_to_ms(ktime_get());
+ per_cpu(msm_mpdec_cpudata, cpu).online = true;
+ cpu_up(cpu);
+ pr_info(MPDEC_TAG" DISABLED... Hot plugged CPU[%d] | Mask=[%d%d%d%d]\n",
+ cpu, cpu_online(0), cpu_online(1), cpu_online(2), cpu_online(3));
+ }
+ }
break;
case '1':
state = MSM_MPDEC_IDLE;
was_paused = true;
- queue_delayed_work(msm_mpdec_workq, &msm_mpdec_work, msecs_to_jiffies(msm_mpdec_tuners_ins.delay));
+ queue_delayed_work(msm_mpdec_workq, &msm_mpdec_work,
+ msecs_to_jiffies(msm_mpdec_tuners_ins.delay));
pr_info(MPDEC_TAG" ENABLED mpdecision...\n");
break;
default:
@@ -738,9 +616,7 @@ define_one_global_rw(startdelay);
define_one_global_rw(delay);
define_one_global_rw(pause);
define_one_global_rw(scroff_single_core);
-define_one_global_rw(scroff_profile);
define_one_global_rw(idle_freq);
-define_one_global_rw(scroff_freq);
define_one_global_rw(min_cpus);
define_one_global_rw(max_cpus);
define_one_global_rw(enabled);
@@ -751,8 +627,8 @@ static struct attribute *msm_mpdec_attri
&pause.attr,
&scroff_single_core.attr,
&idle_freq.attr,
- &min_cpus.attr,
- &max_cpus.attr,
+ &min_cpus.attr,
+ &max_cpus.attr,
&enabled.attr,
&twts_threshold_0.attr,
&twts_threshold_1.attr,
@@ -770,8 +646,6 @@ static struct attribute *msm_mpdec_attri
&nwns_threshold_5.attr,
&nwns_threshold_6.attr,
&nwns_threshold_7.attr,
- &scroff_profile.attr,
- &scroff_freq.attr,
NULL
};
@@ -792,28 +666,28 @@ static int __init msm_mpdec_init(void)
per_cpu(msm_mpdec_cpudata, cpu).online = true;
}
- was_paused = true;
+ was_paused = true;
- msm_mpdec_workq = alloc_workqueue(
- "mpdec", WQ_UNBOUND | WQ_RESCUER | WQ_FREEZABLE, 1);
- if (!msm_mpdec_workq)
- return -ENOMEM;
+ msm_mpdec_workq = alloc_workqueue(
+ "mpdec", WQ_UNBOUND | WQ_RESCUER | WQ_FREEZABLE, 1);
+ if (!msm_mpdec_workq)
+ return -ENOMEM;
INIT_DELAYED_WORK(&msm_mpdec_work, msm_mpdec_work_thread);
if (state != MSM_MPDEC_DISABLED)
queue_delayed_work(msm_mpdec_workq, &msm_mpdec_work,
- msecs_to_jiffies(msm_mpdec_tuners_ins.delay));
+ msecs_to_jiffies(msm_mpdec_tuners_ins.delay));
register_early_suspend(&msm_mpdec_early_suspend_handler);
msm_mpdec_kobject = kobject_create_and_add("msm_mpdecision", kernel_kobj);
if (msm_mpdec_kobject) {
- rc = sysfs_create_group(msm_mpdec_kobject, &msm_mpdec_attr_group);
+ rc = sysfs_create_group(msm_mpdec_kobject,
+ &msm_mpdec_attr_group);
if (rc) {
pr_warn(MPDEC_TAG"sysfs: ERROR, could not create sysfs group");
}
- } else {
+ } else
pr_warn(MPDEC_TAG"sysfs: ERROR, could not create sysfs kobj");
- }
pr_info(MPDEC_TAG"%s init complete.", __func__);
@@ -823,8 +697,8 @@ late_initcall(msm_mpdec_init);
void msm_mpdec_exit(void)
{
- destroy_workqueue(msm_mpdec_workq);
- destroy_workqueue(msm_mpdec_workq);
+ destroy_workqueue(msm_mpdec_workq);
+ destroy_workqueue(msm_mpdec_workq);
}
-MODULE_DESCRIPTION("Kernel based MPDECISION (C) 2011-13 Chad Goodman");
+MODULE_DESCRIPTION("Kernel based MPDECISION (C) 2011-12 Chad Goodman");