|
@@ -43,6 +43,19 @@ int rl6231_calc_dmic_clk(int rate)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(rl6231_calc_dmic_clk);
|
|
|
|
|
|
+struct pll_calc_map {
|
|
|
+ unsigned int pll_in;
|
|
|
+ unsigned int pll_out;
|
|
|
+ int k;
|
|
|
+ int n;
|
|
|
+ int m;
|
|
|
+ bool m_bp;
|
|
|
+};
|
|
|
+
|
|
|
+static const struct pll_calc_map pll_preset_table[] = {
|
|
|
+ {19200000, 24576000, 3, 30, 3, false},
|
|
|
+};
|
|
|
+
|
|
|
/**
|
|
|
* rl6231_pll_calc - Calcualte PLL M/N/K code.
|
|
|
* @freq_in: external clock provided to codec.
|
|
@@ -57,7 +70,7 @@ int rl6231_pll_calc(const unsigned int freq_in,
|
|
|
const unsigned int freq_out, struct rl6231_pll_code *pll_code)
|
|
|
{
|
|
|
int max_n = RL6231_PLL_N_MAX, max_m = RL6231_PLL_M_MAX;
|
|
|
- int k, red, n_t, pll_out, in_t, out_t;
|
|
|
+ int i, k, red, n_t, pll_out, in_t, out_t;
|
|
|
int n = 0, m = 0, m_t = 0;
|
|
|
int red_t = abs(freq_out - freq_in);
|
|
|
bool bypass = false;
|
|
@@ -65,6 +78,18 @@ int rl6231_pll_calc(const unsigned int freq_in,
|
|
|
if (RL6231_PLL_INP_MAX < freq_in || RL6231_PLL_INP_MIN > freq_in)
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ for (i = 0; i < ARRAY_SIZE(pll_preset_table); i++) {
|
|
|
+ if (freq_in == pll_preset_table[i].pll_in &&
|
|
|
+ freq_out == pll_preset_table[i].pll_out) {
|
|
|
+ k = pll_preset_table[i].k;
|
|
|
+ m = pll_preset_table[i].m;
|
|
|
+ n = pll_preset_table[i].n;
|
|
|
+ bypass = pll_preset_table[i].m_bp;
|
|
|
+ pr_debug("Use preset PLL parameter table\n");
|
|
|
+ goto code_find;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
k = 100000000 / freq_out - 2;
|
|
|
if (k > RL6231_PLL_K_MAX)
|
|
|
k = RL6231_PLL_K_MAX;
|