编译 smartass governor 时如何修复初始化程序中指定的未知字段 'suspend'?

How to fix unknown field 'suspend' specified in initializer when compiling smartass governor?

我一直在试图弄清楚为什么当我尝试编译我的 android 内核时,它会给我这个 smarts governor 错误:

drivers/cpufreq/cpufreq_smartass2.c:844:2: error: unknown field 'suspend' specified in initializer
      .suspend = smartass_early_suspend,
      ^
    drivers/cpufreq/cpufreq_smartass2.c:844:13: warning: excess elements in struct initializer
    error, forbidden warning: cpufreq_smartass2.c:844
    make[2]: *** [drivers/cpufreq/cpufreq_smartass2.o] Error 1
    make[1]: *** [drivers/cpufreq] Error 2
    make: *** [drivers] Error 2
    make: *** Waiting for unfinished jobs....

我检查了给我错误的行,它是变量的初始化,它是结构数据结构的成员。代码如下:

static struct early_suspend smartass_power_suspend = {
        .suspend = smartass_early_suspend,
        .resume = smartass_late_resume,
    #ifdef CONFIG_MACH_HERO
        .level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 1,
    #endif
    };

完整代码如下:

static void smartass_suspend(int cpu, int suspend)
{
    struct smartass_info_s *this_smartass = &per_cpu(smartass_info, smp_processor_id());
    struct cpufreq_policy *policy = this_smartass->cur_policy;
    unsigned int new_freq;

    if (!this_smartass->enable)
        return;

    smartass_update_min_max(this_smartass,policy,suspend);
    if (!suspend) { // resume at max speed:
        new_freq = validate_freq(policy,sleep_wakeup_freq);

        dprintk(SMARTASS_DEBUG_JUMPS,"SmartassS: awaking at %d\n",new_freq);
        __cpufreq_driver_target(policy, new_freq,
                    CPUFREQ_RELATION_L);
    } else {
        // to avoid wakeup issues with quick sleep/wakeup don't change actual frequency when entering sleep
        // to allow some time to settle down. Instead we just reset our statistics (and reset the timer).
        // Eventually, the timer will adjust the frequency if necessary.

        this_smartass->freq_change_time_in_idle =
            get_cpu_idle_time_us(cpu,&this_smartass->freq_change_time);

        dprintk(SMARTASS_DEBUG_JUMPS,"SmartassS: suspending at %d\n",policy->cur);
    }

    reset_timer(smp_processor_id(),this_smartass);
}

static void smartass_early_suspend(struct early_suspend *handler) {
    int i;
    if (suspended || sleep_ideal_freq==0) // disable behavior for sleep_ideal_freq==0
        return;
    suspended = 1;
    for_each_online_cpu(i)
        smartass_suspend(i,1);
}

static void smartass_late_resume(struct early_suspend *handler) {
    int i;
    if (!suspended) // already not suspended so nothing to do
        return;
    suspended = 0;
    for_each_online_cpu(i)
        smartass_suspend(i,0);
}

static struct early_suspend smartass_power_suspend = {
    .suspend = smartass_early_suspend,
    .resume = smartass_late_resume,
#ifdef CONFIG_MACH_HERO
    .level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 1,
#endif
};

代码在语法上似乎是正确的,我遇到了这个问题。有人可以帮忙吗?

感谢@Tsyvarev 我解决了 "unknown field 'suspend' specified in initializer"

的问题

在尝试添加其他调控器并尝试编译后,我收到了关于我添加的新调控器的错误消息

drivers/built-in.o: In function cpufreq_smartass_init':
/home/nick/android/LGD722LKernel/drivers/cpufreq/cpufreq_smartass2.c:898: undefined reference to `register_early_suspend'

Link to the complete code for cpufreq_smartass2.c

Link to the complete code for earlysuspend.h

我检查了函数 register_eary_suspend 及其调用方式和将参数传递给函数的方式看起来是正确的。我认为它可能来自 makefile,但这只是我的意见。如果有人有任何其他想法可能是什么问题,请分享我在内核开发方面没有太多经验,你的 ideas/suggestions 会真正帮助我。