.owner = THIS_MODULE,
.name =“s3c”
.verify = s3c###_verity //用于对用户的CPUfreq策略设置进行有效性校验和数据修正。该函数常用到: //cpufreq_verify_within_limits(struct cpufreq_policy *policy, unsigned intmin_freq, unsigned intmax_freq) // .setpolicy = s3c###_setpolicy //传递一个policy参数,接受一个范围policy->max,policy->min,主要实现自动调节频率。只有少数驱动用此函数 .target = s3c###_target //用于把频率调节到一个指定的值,接受3个参数:policy、target_freq、relation。 //target_freq是目标频率,实际频率总是要设定CPU频率接近target_freq。并且设定的频率必须在policy->max和policy->min之间。 //在设定频率接近target_freq时,relation若为CPUFREQ_REL_L,则暗示设置的频率应该大于或等于target_freq; //relation若为CPUFREQ_REL_H,则暗示设置的频率应该小于或等于target_freq; .flag = CPUFREQ_CONST_LOOPS, //表示cpu频率不会因loops_per_jiffy改变而改变 } 根据芯片内部PLL和分频器的关系,ARM SoC一般不具备独立调整CPU频率的能力,往往SoC的CPUFreq驱动会提供一个频率表, 频率在该表的范围内改变,一般实现target函数。 CPUFreq核心提供了辅助函数: intcpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy, struct cpufreq_freqency_table *table) 这个函数主要用于init()中将policy->min和policy->max设置为与cpuinfo.min_freq和cpuinfo.max_freq相同的值。 intcpufreq_frequency_table_verify(struct cpufreq_policy *policy, struct cpufreq_freqency_table *table) 它是cpufreq_driver的verify()成员函数的助手,确保至少有1个有效的CPU频率位于policy->min到policy->max的范围 intcpufreq_frequency_table_target(struct cpufreq_policy *policy, struct cpufreq_frequency_table *table, unsigned int target_freq, unsigned int relation, unsigned int *index); 它主要用于cpufreq_driver的target()成员函数,返回需要设定的频率在频率表中的索引 以下为几个重要的结构体: struct cpufreq_policy { struct cpufreq_cpuinfo cpuinfo; unsigned int cur; //cpu当前频率 ................ } struct cpufreq_cpuinfo { unsigned int max; //该cpu所支持的最大频率 unsigned int min; //该cpu所支持的最小频率 unsigned int transition_latency; //cpu频率切换时所需要的延迟 } struct cpufreq_frequency_table{ unsigned int index; unsigned int frequency; }