初めての呼び出し元です。レガシーcpufreq_driverのcpufreq_frequency_table初期化の書き換え
私は以前のクアルコムSoCボード(apq8064、私が知っているばかげた取り組み)のために、4.12-rcのようなものを上流のコードから3.4ベースのカーネルにバックポートしてきました。
これまで私はcpufreqを除いて、クリエイティブなシムとダブテールで解決された互換性の問題を抱えて、ほぼすべてのコアAPIで成功を収めてきました。
私はまだレガシープラットフォームのドライバとクロッキングを使用していますが、dtのものや一般的な時計フレームのものは使用していません。
私の問題は、apcpのpercpuからper-policyへの移行の一環として、struct cpufreq_policyにstuct cpufreq_frequency_tableを含めることから始まります。 3.13では、cpufreq_frequency_table_get_attrの使用はもはやオプションではないため、プラットフォームのfreq_tableの登録は固有のケースでは難しくなりました。
私の場合、cpufreq_driverのinitは汎用で、私のプラットフォームのスケーリングドライバ(acpuclock-krait)に依存してfreq_tableを登録します。これは古いapiでは問題ありませんが、ポリシーごとの設定とは互換性がなくなります。上流側ではドライバが手動でpolicy-> freq_tableを初期化する必要があり、mineはcpuとプラットフォームコード内のテーブルを表す35の配列の両方を使用します。また、テーブルを選択するときに6種類のspeedbin/pvs値を考慮します。私はそれから "cpu"パラメータを落としてcpumask_copyを使うことを検討しています。おそらく2つのドライバを1つに組み合わせてクロックドライバをプローブにすることも考えていますが、これまでのinitは私の謎です。ここに私のテーブル登録のスニペットは、ある誰もがハッキング何かを考えることができれば、私は永遠に感謝するだろう...
ifdef CONFIG_CPU_FREQ_MSM
static struct cpufreq_frequency_table.freq_table[NR_CPUS][35];
extern int console_batt_stat;
static void __init cpufreq_table_init(void)
{
int cpu;
int freq_cnt = 0;
for_each_possible_cpu(cpu) {
int i;
/* Construct the freq_table tables from acpu_freq_tbl. */
for (i = 0, freq_cnt = 0; drv.acpu_freq_tbl[i].speed.khz != 0
&& freq_cnt < ARRAY_SIZE(*freq_table)-1; i++) {
if (drv.acpu_freq_tbl[i].use_for_scaling) {
freq_table[cpu][freq_cnt].index = freq_cnt;
freq_table[cpu][freq_cnt].frequency
= drv.acpu_freq_tbl[i].speed.khz;
freq_cnt++;
}
}
/* freq_table not big enough to store all usable freqs. */
BUG_ON(drv.acpu_freq_tbl[i].speed.khz != 0);
freq_table[cpu][freq_cnt].index = freq_cnt;
freq_table[cpu][freq_cnt].frequency = CPUFREQ_TABLE_END;
/* Register table with CPUFreq. */
cpufreq_frequency_table_get_attr(freq_table[cpu], cpu);
}
dev_info(drv.dev, "CPU Frequencies Supported: %d\n", freq_cnt);
}