}
EXPORT_SYMBOL_GPL(starfive_jh7110_clk_ops);
-static struct clk_hw *jh7110_clk_get(struct of_phandle_args *clkspec, void *data)
+static struct clk_hw *jh7110_clk_get(struct of_phandle_args *clkspec,
+ void *data)
{
struct jh7110_clk_priv *priv = data;
unsigned int idx = clkspec->args[0];
if (idx < JH7110_CLK_END) {
#ifdef CONFIG_CLK_STARFIVE_JH7110_PLL
- if (idx <= JH7110_PLL2_OUT)
+ if ((idx == JH7110_PLL0_OUT) || (idx == JH7110_PLL2_OUT))
return &priv->pll_priv[PLL_OF(idx)].hw;
#endif
return priv->pll[PLL_OF(idx)];
if (ret)
return ret;
- req->rate = jh7110_pll0_syscon_freq[data->freq_select_idx].freq;
+ if (data->idx == PLL0_INDEX)
+ req->rate = jh7110_pll0_syscon_freq[data->freq_select_idx].freq;
+ else if (data->idx == PLL1_INDEX)
+ req->rate = jh7110_pll1_syscon_freq[data->freq_select_idx].freq;
+ else
+ req->rate = jh7110_pll2_syscon_freq[data->freq_select_idx].freq;
+
return 0;
}
{
struct jh7110_clk_pll_data *data = jh7110_pll_data_from(hw);
- if (parent_rate != data->refclk_freq) {
- dev_err(data->dev, "pll%d parent rate is err.\n", data->idx);
- goto rate_err;
- }
- if (rate != jh7110_pll0_syscon_freq[data->freq_select_idx].freq) {
- dev_err(data->dev, "pll%d rate is err.\n", data->idx);
- goto rate_err;
- }
-
return pll_set_freq_syscon(data);
-rate_err:
- return -EINVAL;
}
#ifdef CONFIG_DEBUG_FS
.num_parents = 1,
.flags = 0,
};
+
+ /* pll1 use default freq and does not be changed */
+ if (idx == PLL1_INDEX)
+ continue;
+
data = &pll_priv[idx];
data->dev = &pdev->dev;
data->sys_syscon_regmap = pll_syscon_regmap;
return ret;
}
- dev_info(&pdev->dev, "%d pll clock be set done\n", PLL_INDEX_MAX);
+ dev_info(&pdev->dev, "PLL0 and PLL2 clock be set done\n");
+
return 0;
pll_init_failed:
#ifndef _CLK_STARFIVE_JH7110_PLL_H_
#define _CLK_STARFIVE_JH7110_PLL_H_
-#define OSC_DEFAULT_FREQ 24000000
+#define PLL2_DEFAULT_FREQ PLL2_FREQ_1188_VALUE
+
#define PLL0_INDEX 0
-#define PLL0_DEFAULT_FREQ 1250000000
#define PLL1_INDEX 1
-#define PLL1_DEFAULT_FREQ 1066000000
#define PLL2_INDEX 2
-#define PLL2_DEFAULT_FREQ 1228800000
-/* If only pll0, PLL_INDEX_MAX should be 1.
- * If want to control pll1 and pll2 ,then should be 3.
- */
-#define PLL_INDEX_MAX 1
+
+#define PLL_INDEX_MAX 3
#define PLL0_DACPD_SHIFT 24
#define PLL0_DACPD_MASK 0x1000000
};
enum starfive_pll2_freq_value {
+ PLL2_FREQ_1188_VALUE = 1188000000,
PLL2_FREQ_12288_VALUE = 1228800000,
};
enum starfive_pll2_freq {
- PLL2_FREQ_12288 = 0,
+ PLL2_FREQ_1188 = 0,
+ PLL2_FREQ_12288,
};
static const struct starfive_pll_syscon_value
static const struct starfive_pll_syscon_value
jh7110_pll2_syscon_freq[] = {
+ [PLL2_FREQ_1188] = {
+ .freq = PLL2_FREQ_1188_VALUE,
+ .prediv = 2,
+ .fbdiv = 99,
+ .postdiv1 = 1,
+ .dacpd = 1,
+ .dsmpd = 1,
+ },
[PLL2_FREQ_12288] = {
.freq = PLL2_FREQ_12288_VALUE,
.prediv = 5,
if (IS_ERR(priv->pll[PLL_OF(JH7110_PLL1_OUT)]))
return PTR_ERR(priv->pll[PLL_OF(JH7110_PLL1_OUT)]);
+#ifndef CONFIG_CLK_STARFIVE_JH7110_PLL
priv->pll[PLL_OF(JH7110_PLL2_OUT)] =
clk_hw_register_fixed_rate(priv->dev,
"pll2_out", "osc", 0, 1228800000);
if (IS_ERR(priv->pll[PLL_OF(JH7110_PLL2_OUT)]))
return PTR_ERR(priv->pll[PLL_OF(JH7110_PLL2_OUT)]);
+#endif
priv->pll[PLL_OF(JH7110_AON_APB)] =
devm_clk_hw_register_fixed_factor(priv->dev,
if (pidx < JH7110_CLK_SYS_REG_END)
parents[i].hw = &priv->reg[pidx].hw;
#ifdef CONFIG_CLK_STARFIVE_JH7110_PLL
- else if (pidx == JH7110_PLL0_OUT)
+ else if ((pidx == JH7110_PLL0_OUT) || (pidx == JH7110_PLL2_OUT))
parents[i].hw = &priv->pll_priv[PLL_OF(pidx)].hw;
#endif
else if ((pidx < JH7110_CLK_SYS_END) &&