|
@@ -19,163 +19,70 @@
|
|
static DEFINE_SPINLOCK(meson_clk_lock);
|
|
static DEFINE_SPINLOCK(meson_clk_lock);
|
|
|
|
|
|
static const struct pll_rate_table gxbb_gp0_pll_rate_table[] = {
|
|
static const struct pll_rate_table gxbb_gp0_pll_rate_table[] = {
|
|
- PLL_RATE(96000000, 32, 1, 3),
|
|
|
|
- PLL_RATE(99000000, 33, 1, 3),
|
|
|
|
- PLL_RATE(102000000, 34, 1, 3),
|
|
|
|
- PLL_RATE(105000000, 35, 1, 3),
|
|
|
|
- PLL_RATE(108000000, 36, 1, 3),
|
|
|
|
- PLL_RATE(111000000, 37, 1, 3),
|
|
|
|
- PLL_RATE(114000000, 38, 1, 3),
|
|
|
|
- PLL_RATE(117000000, 39, 1, 3),
|
|
|
|
- PLL_RATE(120000000, 40, 1, 3),
|
|
|
|
- PLL_RATE(123000000, 41, 1, 3),
|
|
|
|
- PLL_RATE(126000000, 42, 1, 3),
|
|
|
|
- PLL_RATE(129000000, 43, 1, 3),
|
|
|
|
- PLL_RATE(132000000, 44, 1, 3),
|
|
|
|
- PLL_RATE(135000000, 45, 1, 3),
|
|
|
|
- PLL_RATE(138000000, 46, 1, 3),
|
|
|
|
- PLL_RATE(141000000, 47, 1, 3),
|
|
|
|
- PLL_RATE(144000000, 48, 1, 3),
|
|
|
|
- PLL_RATE(147000000, 49, 1, 3),
|
|
|
|
- PLL_RATE(150000000, 50, 1, 3),
|
|
|
|
- PLL_RATE(153000000, 51, 1, 3),
|
|
|
|
- PLL_RATE(156000000, 52, 1, 3),
|
|
|
|
- PLL_RATE(159000000, 53, 1, 3),
|
|
|
|
- PLL_RATE(162000000, 54, 1, 3),
|
|
|
|
- PLL_RATE(165000000, 55, 1, 3),
|
|
|
|
- PLL_RATE(168000000, 56, 1, 3),
|
|
|
|
- PLL_RATE(171000000, 57, 1, 3),
|
|
|
|
- PLL_RATE(174000000, 58, 1, 3),
|
|
|
|
- PLL_RATE(177000000, 59, 1, 3),
|
|
|
|
- PLL_RATE(180000000, 60, 1, 3),
|
|
|
|
- PLL_RATE(183000000, 61, 1, 3),
|
|
|
|
- PLL_RATE(186000000, 62, 1, 3),
|
|
|
|
- PLL_RATE(192000000, 32, 1, 2),
|
|
|
|
- PLL_RATE(198000000, 33, 1, 2),
|
|
|
|
- PLL_RATE(204000000, 34, 1, 2),
|
|
|
|
- PLL_RATE(210000000, 35, 1, 2),
|
|
|
|
- PLL_RATE(216000000, 36, 1, 2),
|
|
|
|
- PLL_RATE(222000000, 37, 1, 2),
|
|
|
|
- PLL_RATE(228000000, 38, 1, 2),
|
|
|
|
- PLL_RATE(234000000, 39, 1, 2),
|
|
|
|
- PLL_RATE(240000000, 40, 1, 2),
|
|
|
|
- PLL_RATE(246000000, 41, 1, 2),
|
|
|
|
- PLL_RATE(252000000, 42, 1, 2),
|
|
|
|
- PLL_RATE(258000000, 43, 1, 2),
|
|
|
|
- PLL_RATE(264000000, 44, 1, 2),
|
|
|
|
- PLL_RATE(270000000, 45, 1, 2),
|
|
|
|
- PLL_RATE(276000000, 46, 1, 2),
|
|
|
|
- PLL_RATE(282000000, 47, 1, 2),
|
|
|
|
- PLL_RATE(288000000, 48, 1, 2),
|
|
|
|
- PLL_RATE(294000000, 49, 1, 2),
|
|
|
|
- PLL_RATE(300000000, 50, 1, 2),
|
|
|
|
- PLL_RATE(306000000, 51, 1, 2),
|
|
|
|
- PLL_RATE(312000000, 52, 1, 2),
|
|
|
|
- PLL_RATE(318000000, 53, 1, 2),
|
|
|
|
- PLL_RATE(324000000, 54, 1, 2),
|
|
|
|
- PLL_RATE(330000000, 55, 1, 2),
|
|
|
|
- PLL_RATE(336000000, 56, 1, 2),
|
|
|
|
- PLL_RATE(342000000, 57, 1, 2),
|
|
|
|
- PLL_RATE(348000000, 58, 1, 2),
|
|
|
|
- PLL_RATE(354000000, 59, 1, 2),
|
|
|
|
- PLL_RATE(360000000, 60, 1, 2),
|
|
|
|
- PLL_RATE(366000000, 61, 1, 2),
|
|
|
|
- PLL_RATE(372000000, 62, 1, 2),
|
|
|
|
- PLL_RATE(384000000, 32, 1, 1),
|
|
|
|
- PLL_RATE(396000000, 33, 1, 1),
|
|
|
|
- PLL_RATE(408000000, 34, 1, 1),
|
|
|
|
- PLL_RATE(420000000, 35, 1, 1),
|
|
|
|
- PLL_RATE(432000000, 36, 1, 1),
|
|
|
|
- PLL_RATE(444000000, 37, 1, 1),
|
|
|
|
- PLL_RATE(456000000, 38, 1, 1),
|
|
|
|
- PLL_RATE(468000000, 39, 1, 1),
|
|
|
|
- PLL_RATE(480000000, 40, 1, 1),
|
|
|
|
- PLL_RATE(492000000, 41, 1, 1),
|
|
|
|
- PLL_RATE(504000000, 42, 1, 1),
|
|
|
|
- PLL_RATE(516000000, 43, 1, 1),
|
|
|
|
- PLL_RATE(528000000, 44, 1, 1),
|
|
|
|
- PLL_RATE(540000000, 45, 1, 1),
|
|
|
|
- PLL_RATE(552000000, 46, 1, 1),
|
|
|
|
- PLL_RATE(564000000, 47, 1, 1),
|
|
|
|
- PLL_RATE(576000000, 48, 1, 1),
|
|
|
|
- PLL_RATE(588000000, 49, 1, 1),
|
|
|
|
- PLL_RATE(600000000, 50, 1, 1),
|
|
|
|
- PLL_RATE(612000000, 51, 1, 1),
|
|
|
|
- PLL_RATE(624000000, 52, 1, 1),
|
|
|
|
- PLL_RATE(636000000, 53, 1, 1),
|
|
|
|
- PLL_RATE(648000000, 54, 1, 1),
|
|
|
|
- PLL_RATE(660000000, 55, 1, 1),
|
|
|
|
- PLL_RATE(672000000, 56, 1, 1),
|
|
|
|
- PLL_RATE(684000000, 57, 1, 1),
|
|
|
|
- PLL_RATE(696000000, 58, 1, 1),
|
|
|
|
- PLL_RATE(708000000, 59, 1, 1),
|
|
|
|
- PLL_RATE(720000000, 60, 1, 1),
|
|
|
|
- PLL_RATE(732000000, 61, 1, 1),
|
|
|
|
- PLL_RATE(744000000, 62, 1, 1),
|
|
|
|
- PLL_RATE(768000000, 32, 1, 0),
|
|
|
|
- PLL_RATE(792000000, 33, 1, 0),
|
|
|
|
- PLL_RATE(816000000, 34, 1, 0),
|
|
|
|
- PLL_RATE(840000000, 35, 1, 0),
|
|
|
|
- PLL_RATE(864000000, 36, 1, 0),
|
|
|
|
- PLL_RATE(888000000, 37, 1, 0),
|
|
|
|
- PLL_RATE(912000000, 38, 1, 0),
|
|
|
|
- PLL_RATE(936000000, 39, 1, 0),
|
|
|
|
- PLL_RATE(960000000, 40, 1, 0),
|
|
|
|
- PLL_RATE(984000000, 41, 1, 0),
|
|
|
|
- PLL_RATE(1008000000, 42, 1, 0),
|
|
|
|
- PLL_RATE(1032000000, 43, 1, 0),
|
|
|
|
- PLL_RATE(1056000000, 44, 1, 0),
|
|
|
|
- PLL_RATE(1080000000, 45, 1, 0),
|
|
|
|
- PLL_RATE(1104000000, 46, 1, 0),
|
|
|
|
- PLL_RATE(1128000000, 47, 1, 0),
|
|
|
|
- PLL_RATE(1152000000, 48, 1, 0),
|
|
|
|
- PLL_RATE(1176000000, 49, 1, 0),
|
|
|
|
- PLL_RATE(1200000000, 50, 1, 0),
|
|
|
|
- PLL_RATE(1224000000, 51, 1, 0),
|
|
|
|
- PLL_RATE(1248000000, 52, 1, 0),
|
|
|
|
- PLL_RATE(1272000000, 53, 1, 0),
|
|
|
|
- PLL_RATE(1296000000, 54, 1, 0),
|
|
|
|
- PLL_RATE(1320000000, 55, 1, 0),
|
|
|
|
- PLL_RATE(1344000000, 56, 1, 0),
|
|
|
|
- PLL_RATE(1368000000, 57, 1, 0),
|
|
|
|
- PLL_RATE(1392000000, 58, 1, 0),
|
|
|
|
- PLL_RATE(1416000000, 59, 1, 0),
|
|
|
|
- PLL_RATE(1440000000, 60, 1, 0),
|
|
|
|
- PLL_RATE(1464000000, 61, 1, 0),
|
|
|
|
- PLL_RATE(1488000000, 62, 1, 0),
|
|
|
|
|
|
+ PLL_RATE(768000000, 32, 1),
|
|
|
|
+ PLL_RATE(792000000, 33, 1),
|
|
|
|
+ PLL_RATE(816000000, 34, 1),
|
|
|
|
+ PLL_RATE(840000000, 35, 1),
|
|
|
|
+ PLL_RATE(864000000, 36, 1),
|
|
|
|
+ PLL_RATE(888000000, 37, 1),
|
|
|
|
+ PLL_RATE(912000000, 38, 1),
|
|
|
|
+ PLL_RATE(936000000, 39, 1),
|
|
|
|
+ PLL_RATE(960000000, 40, 1),
|
|
|
|
+ PLL_RATE(984000000, 41, 1),
|
|
|
|
+ PLL_RATE(1008000000, 42, 1),
|
|
|
|
+ PLL_RATE(1032000000, 43, 1),
|
|
|
|
+ PLL_RATE(1056000000, 44, 1),
|
|
|
|
+ PLL_RATE(1080000000, 45, 1),
|
|
|
|
+ PLL_RATE(1104000000, 46, 1),
|
|
|
|
+ PLL_RATE(1128000000, 47, 1),
|
|
|
|
+ PLL_RATE(1152000000, 48, 1),
|
|
|
|
+ PLL_RATE(1176000000, 49, 1),
|
|
|
|
+ PLL_RATE(1200000000, 50, 1),
|
|
|
|
+ PLL_RATE(1224000000, 51, 1),
|
|
|
|
+ PLL_RATE(1248000000, 52, 1),
|
|
|
|
+ PLL_RATE(1272000000, 53, 1),
|
|
|
|
+ PLL_RATE(1296000000, 54, 1),
|
|
|
|
+ PLL_RATE(1320000000, 55, 1),
|
|
|
|
+ PLL_RATE(1344000000, 56, 1),
|
|
|
|
+ PLL_RATE(1368000000, 57, 1),
|
|
|
|
+ PLL_RATE(1392000000, 58, 1),
|
|
|
|
+ PLL_RATE(1416000000, 59, 1),
|
|
|
|
+ PLL_RATE(1440000000, 60, 1),
|
|
|
|
+ PLL_RATE(1464000000, 61, 1),
|
|
|
|
+ PLL_RATE(1488000000, 62, 1),
|
|
{ /* sentinel */ },
|
|
{ /* sentinel */ },
|
|
};
|
|
};
|
|
|
|
|
|
static const struct pll_rate_table gxl_gp0_pll_rate_table[] = {
|
|
static const struct pll_rate_table gxl_gp0_pll_rate_table[] = {
|
|
- PLL_RATE(504000000, 42, 1, 1),
|
|
|
|
- PLL_RATE(516000000, 43, 1, 1),
|
|
|
|
- PLL_RATE(528000000, 44, 1, 1),
|
|
|
|
- PLL_RATE(540000000, 45, 1, 1),
|
|
|
|
- PLL_RATE(552000000, 46, 1, 1),
|
|
|
|
- PLL_RATE(564000000, 47, 1, 1),
|
|
|
|
- PLL_RATE(576000000, 48, 1, 1),
|
|
|
|
- PLL_RATE(588000000, 49, 1, 1),
|
|
|
|
- PLL_RATE(600000000, 50, 1, 1),
|
|
|
|
- PLL_RATE(612000000, 51, 1, 1),
|
|
|
|
- PLL_RATE(624000000, 52, 1, 1),
|
|
|
|
- PLL_RATE(636000000, 53, 1, 1),
|
|
|
|
- PLL_RATE(648000000, 54, 1, 1),
|
|
|
|
- PLL_RATE(660000000, 55, 1, 1),
|
|
|
|
- PLL_RATE(672000000, 56, 1, 1),
|
|
|
|
- PLL_RATE(684000000, 57, 1, 1),
|
|
|
|
- PLL_RATE(696000000, 58, 1, 1),
|
|
|
|
- PLL_RATE(708000000, 59, 1, 1),
|
|
|
|
- PLL_RATE(720000000, 60, 1, 1),
|
|
|
|
- PLL_RATE(732000000, 61, 1, 1),
|
|
|
|
- PLL_RATE(744000000, 62, 1, 1),
|
|
|
|
- PLL_RATE(756000000, 63, 1, 1),
|
|
|
|
- PLL_RATE(768000000, 64, 1, 1),
|
|
|
|
- PLL_RATE(780000000, 65, 1, 1),
|
|
|
|
- PLL_RATE(792000000, 66, 1, 1),
|
|
|
|
|
|
+ PLL_RATE(1008000000, 42, 1),
|
|
|
|
+ PLL_RATE(1032000000, 43, 1),
|
|
|
|
+ PLL_RATE(1056000000, 44, 1),
|
|
|
|
+ PLL_RATE(1080000000, 45, 1),
|
|
|
|
+ PLL_RATE(1104000000, 46, 1),
|
|
|
|
+ PLL_RATE(1128000000, 47, 1),
|
|
|
|
+ PLL_RATE(1152000000, 48, 1),
|
|
|
|
+ PLL_RATE(1176000000, 49, 1),
|
|
|
|
+ PLL_RATE(1200000000, 50, 1),
|
|
|
|
+ PLL_RATE(1224000000, 51, 1),
|
|
|
|
+ PLL_RATE(1248000000, 52, 1),
|
|
|
|
+ PLL_RATE(1272000000, 53, 1),
|
|
|
|
+ PLL_RATE(1296000000, 54, 1),
|
|
|
|
+ PLL_RATE(1320000000, 55, 1),
|
|
|
|
+ PLL_RATE(1344000000, 56, 1),
|
|
|
|
+ PLL_RATE(1368000000, 57, 1),
|
|
|
|
+ PLL_RATE(1392000000, 58, 1),
|
|
|
|
+ PLL_RATE(1416000000, 59, 1),
|
|
|
|
+ PLL_RATE(1440000000, 60, 1),
|
|
|
|
+ PLL_RATE(1464000000, 61, 1),
|
|
|
|
+ PLL_RATE(1488000000, 62, 1),
|
|
|
|
+ PLL_RATE(1512000000, 63, 1),
|
|
|
|
+ PLL_RATE(1536000000, 64, 1),
|
|
|
|
+ PLL_RATE(1560000000, 65, 1),
|
|
|
|
+ PLL_RATE(1584000000, 66, 1),
|
|
{ /* sentinel */ },
|
|
{ /* sentinel */ },
|
|
};
|
|
};
|
|
|
|
|
|
-static struct clk_regmap gxbb_fixed_pll = {
|
|
|
|
|
|
+static struct clk_regmap gxbb_fixed_pll_dco = {
|
|
.data = &(struct meson_clk_pll_data){
|
|
.data = &(struct meson_clk_pll_data){
|
|
.en = {
|
|
.en = {
|
|
.reg_off = HHI_MPLL_CNTL,
|
|
.reg_off = HHI_MPLL_CNTL,
|
|
@@ -192,11 +99,6 @@ static struct clk_regmap gxbb_fixed_pll = {
|
|
.shift = 9,
|
|
.shift = 9,
|
|
.width = 5,
|
|
.width = 5,
|
|
},
|
|
},
|
|
- .od = {
|
|
|
|
- .reg_off = HHI_MPLL_CNTL,
|
|
|
|
- .shift = 16,
|
|
|
|
- .width = 2,
|
|
|
|
- },
|
|
|
|
.frac = {
|
|
.frac = {
|
|
.reg_off = HHI_MPLL_CNTL2,
|
|
.reg_off = HHI_MPLL_CNTL2,
|
|
.shift = 0,
|
|
.shift = 0,
|
|
@@ -214,13 +116,32 @@ static struct clk_regmap gxbb_fixed_pll = {
|
|
},
|
|
},
|
|
},
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.hw.init = &(struct clk_init_data){
|
|
- .name = "fixed_pll",
|
|
|
|
|
|
+ .name = "fixed_pll_dco",
|
|
.ops = &meson_clk_pll_ro_ops,
|
|
.ops = &meson_clk_pll_ro_ops,
|
|
.parent_names = (const char *[]){ "xtal" },
|
|
.parent_names = (const char *[]){ "xtal" },
|
|
.num_parents = 1,
|
|
.num_parents = 1,
|
|
},
|
|
},
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static struct clk_regmap gxbb_fixed_pll = {
|
|
|
|
+ .data = &(struct clk_regmap_div_data){
|
|
|
|
+ .offset = HHI_MPLL_CNTL,
|
|
|
|
+ .shift = 16,
|
|
|
|
+ .width = 2,
|
|
|
|
+ .flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
|
|
+ },
|
|
|
|
+ .hw.init = &(struct clk_init_data){
|
|
|
|
+ .name = "fixed_pll",
|
|
|
|
+ .ops = &clk_regmap_divider_ro_ops,
|
|
|
|
+ .parent_names = (const char *[]){ "fixed_pll_dco" },
|
|
|
|
+ .num_parents = 1,
|
|
|
|
+ /*
|
|
|
|
+ * This clock won't ever change at runtime so
|
|
|
|
+ * CLK_SET_RATE_PARENT is not required
|
|
|
|
+ */
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
static struct clk_fixed_factor gxbb_hdmi_pll_pre_mult = {
|
|
static struct clk_fixed_factor gxbb_hdmi_pll_pre_mult = {
|
|
.mult = 2,
|
|
.mult = 2,
|
|
.div = 1,
|
|
.div = 1,
|
|
@@ -232,7 +153,7 @@ static struct clk_fixed_factor gxbb_hdmi_pll_pre_mult = {
|
|
},
|
|
},
|
|
};
|
|
};
|
|
|
|
|
|
-static struct clk_regmap gxbb_hdmi_pll = {
|
|
|
|
|
|
+static struct clk_regmap gxbb_hdmi_pll_dco = {
|
|
.data = &(struct meson_clk_pll_data){
|
|
.data = &(struct meson_clk_pll_data){
|
|
.en = {
|
|
.en = {
|
|
.reg_off = HHI_HDMI_PLL_CNTL,
|
|
.reg_off = HHI_HDMI_PLL_CNTL,
|
|
@@ -254,21 +175,6 @@ static struct clk_regmap gxbb_hdmi_pll = {
|
|
.shift = 0,
|
|
.shift = 0,
|
|
.width = 12,
|
|
.width = 12,
|
|
},
|
|
},
|
|
- .od = {
|
|
|
|
- .reg_off = HHI_HDMI_PLL_CNTL2,
|
|
|
|
- .shift = 16,
|
|
|
|
- .width = 2,
|
|
|
|
- },
|
|
|
|
- .od2 = {
|
|
|
|
- .reg_off = HHI_HDMI_PLL_CNTL2,
|
|
|
|
- .shift = 22,
|
|
|
|
- .width = 2,
|
|
|
|
- },
|
|
|
|
- .od3 = {
|
|
|
|
- .reg_off = HHI_HDMI_PLL_CNTL2,
|
|
|
|
- .shift = 18,
|
|
|
|
- .width = 2,
|
|
|
|
- },
|
|
|
|
.l = {
|
|
.l = {
|
|
.reg_off = HHI_HDMI_PLL_CNTL,
|
|
.reg_off = HHI_HDMI_PLL_CNTL,
|
|
.shift = 31,
|
|
.shift = 31,
|
|
@@ -281,7 +187,7 @@ static struct clk_regmap gxbb_hdmi_pll = {
|
|
},
|
|
},
|
|
},
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.hw.init = &(struct clk_init_data){
|
|
- .name = "hdmi_pll",
|
|
|
|
|
|
+ .name = "hdmi_pll_dco",
|
|
.ops = &meson_clk_pll_ro_ops,
|
|
.ops = &meson_clk_pll_ro_ops,
|
|
.parent_names = (const char *[]){ "hdmi_pll_pre_mult" },
|
|
.parent_names = (const char *[]){ "hdmi_pll_pre_mult" },
|
|
.num_parents = 1,
|
|
.num_parents = 1,
|
|
@@ -293,74 +199,103 @@ static struct clk_regmap gxbb_hdmi_pll = {
|
|
},
|
|
},
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static struct clk_regmap gxbb_hdmi_pll_od = {
|
|
|
|
+ .data = &(struct clk_regmap_div_data){
|
|
|
|
+ .offset = HHI_HDMI_PLL_CNTL2,
|
|
|
|
+ .shift = 16,
|
|
|
|
+ .width = 2,
|
|
|
|
+ .flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
|
|
+ },
|
|
|
|
+ .hw.init = &(struct clk_init_data){
|
|
|
|
+ .name = "hdmi_pll_od",
|
|
|
|
+ .ops = &clk_regmap_divider_ro_ops,
|
|
|
|
+ .parent_names = (const char *[]){ "hdmi_pll_dco" },
|
|
|
|
+ .num_parents = 1,
|
|
|
|
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk_regmap gxbb_hdmi_pll_od2 = {
|
|
|
|
+ .data = &(struct clk_regmap_div_data){
|
|
|
|
+ .offset = HHI_HDMI_PLL_CNTL2,
|
|
|
|
+ .shift = 22,
|
|
|
|
+ .width = 2,
|
|
|
|
+ .flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
|
|
+ },
|
|
|
|
+ .hw.init = &(struct clk_init_data){
|
|
|
|
+ .name = "hdmi_pll_od2",
|
|
|
|
+ .ops = &clk_regmap_divider_ro_ops,
|
|
|
|
+ .parent_names = (const char *[]){ "hdmi_pll_od" },
|
|
|
|
+ .num_parents = 1,
|
|
|
|
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk_regmap gxbb_hdmi_pll = {
|
|
|
|
+ .data = &(struct clk_regmap_div_data){
|
|
|
|
+ .offset = HHI_HDMI_PLL_CNTL2,
|
|
|
|
+ .shift = 18,
|
|
|
|
+ .width = 2,
|
|
|
|
+ .flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
|
|
+ },
|
|
|
|
+ .hw.init = &(struct clk_init_data){
|
|
|
|
+ .name = "hdmi_pll",
|
|
|
|
+ .ops = &clk_regmap_divider_ro_ops,
|
|
|
|
+ .parent_names = (const char *[]){ "hdmi_pll_od2" },
|
|
|
|
+ .num_parents = 1,
|
|
|
|
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk_regmap gxl_hdmi_pll_od = {
|
|
|
|
+ .data = &(struct clk_regmap_div_data){
|
|
|
|
+ .offset = HHI_HDMI_PLL_CNTL + 8,
|
|
|
|
+ .shift = 21,
|
|
|
|
+ .width = 2,
|
|
|
|
+ .flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
|
|
+ },
|
|
|
|
+ .hw.init = &(struct clk_init_data){
|
|
|
|
+ .name = "hdmi_pll_od",
|
|
|
|
+ .ops = &clk_regmap_divider_ro_ops,
|
|
|
|
+ .parent_names = (const char *[]){ "hdmi_pll_dco" },
|
|
|
|
+ .num_parents = 1,
|
|
|
|
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk_regmap gxl_hdmi_pll_od2 = {
|
|
|
|
+ .data = &(struct clk_regmap_div_data){
|
|
|
|
+ .offset = HHI_HDMI_PLL_CNTL + 8,
|
|
|
|
+ .shift = 23,
|
|
|
|
+ .width = 2,
|
|
|
|
+ .flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
|
|
+ },
|
|
|
|
+ .hw.init = &(struct clk_init_data){
|
|
|
|
+ .name = "hdmi_pll_od2",
|
|
|
|
+ .ops = &clk_regmap_divider_ro_ops,
|
|
|
|
+ .parent_names = (const char *[]){ "hdmi_pll_od" },
|
|
|
|
+ .num_parents = 1,
|
|
|
|
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
static struct clk_regmap gxl_hdmi_pll = {
|
|
static struct clk_regmap gxl_hdmi_pll = {
|
|
- .data = &(struct meson_clk_pll_data){
|
|
|
|
- .en = {
|
|
|
|
- .reg_off = HHI_HDMI_PLL_CNTL,
|
|
|
|
- .shift = 30,
|
|
|
|
- .width = 1,
|
|
|
|
- },
|
|
|
|
- .m = {
|
|
|
|
- .reg_off = HHI_HDMI_PLL_CNTL,
|
|
|
|
- .shift = 0,
|
|
|
|
- .width = 9,
|
|
|
|
- },
|
|
|
|
- .n = {
|
|
|
|
- .reg_off = HHI_HDMI_PLL_CNTL,
|
|
|
|
- .shift = 9,
|
|
|
|
- .width = 5,
|
|
|
|
- },
|
|
|
|
- .frac = {
|
|
|
|
- /*
|
|
|
|
- * On gxl, there is a register shift due to
|
|
|
|
- * HHI_HDMI_PLL_CNTL1 which does not exist on gxbb,
|
|
|
|
- * so we compute the register offset based on the PLL
|
|
|
|
- * base to get it right
|
|
|
|
- */
|
|
|
|
- .reg_off = HHI_HDMI_PLL_CNTL + 4,
|
|
|
|
- .shift = 0,
|
|
|
|
- .width = 12,
|
|
|
|
- },
|
|
|
|
- .od = {
|
|
|
|
- .reg_off = HHI_HDMI_PLL_CNTL + 8,
|
|
|
|
- .shift = 21,
|
|
|
|
- .width = 2,
|
|
|
|
- },
|
|
|
|
- .od2 = {
|
|
|
|
- .reg_off = HHI_HDMI_PLL_CNTL + 8,
|
|
|
|
- .shift = 23,
|
|
|
|
- .width = 2,
|
|
|
|
- },
|
|
|
|
- .od3 = {
|
|
|
|
- .reg_off = HHI_HDMI_PLL_CNTL + 8,
|
|
|
|
- .shift = 19,
|
|
|
|
- .width = 2,
|
|
|
|
- },
|
|
|
|
- .l = {
|
|
|
|
- .reg_off = HHI_HDMI_PLL_CNTL,
|
|
|
|
- .shift = 31,
|
|
|
|
- .width = 1,
|
|
|
|
- },
|
|
|
|
- .rst = {
|
|
|
|
- .reg_off = HHI_HDMI_PLL_CNTL,
|
|
|
|
- .shift = 29,
|
|
|
|
- .width = 1,
|
|
|
|
- },
|
|
|
|
|
|
+ .data = &(struct clk_regmap_div_data){
|
|
|
|
+ .offset = HHI_HDMI_PLL_CNTL + 8,
|
|
|
|
+ .shift = 19,
|
|
|
|
+ .width = 2,
|
|
|
|
+ .flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
},
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "hdmi_pll",
|
|
.name = "hdmi_pll",
|
|
- .ops = &meson_clk_pll_ro_ops,
|
|
|
|
- .parent_names = (const char *[]){ "xtal" },
|
|
|
|
|
|
+ .ops = &clk_regmap_divider_ro_ops,
|
|
|
|
+ .parent_names = (const char *[]){ "hdmi_pll_od2" },
|
|
.num_parents = 1,
|
|
.num_parents = 1,
|
|
- /*
|
|
|
|
- * Display directly handle hdmi pll registers ATM, we need
|
|
|
|
- * NOCACHE to keep our view of the clock as accurate as possible
|
|
|
|
- */
|
|
|
|
- .flags = CLK_GET_RATE_NOCACHE,
|
|
|
|
|
|
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
|
|
},
|
|
},
|
|
};
|
|
};
|
|
|
|
|
|
-static struct clk_regmap gxbb_sys_pll = {
|
|
|
|
|
|
+static struct clk_regmap gxbb_sys_pll_dco = {
|
|
.data = &(struct meson_clk_pll_data){
|
|
.data = &(struct meson_clk_pll_data){
|
|
.en = {
|
|
.en = {
|
|
.reg_off = HHI_SYS_PLL_CNTL,
|
|
.reg_off = HHI_SYS_PLL_CNTL,
|
|
@@ -377,11 +312,6 @@ static struct clk_regmap gxbb_sys_pll = {
|
|
.shift = 9,
|
|
.shift = 9,
|
|
.width = 5,
|
|
.width = 5,
|
|
},
|
|
},
|
|
- .od = {
|
|
|
|
- .reg_off = HHI_SYS_PLL_CNTL,
|
|
|
|
- .shift = 10,
|
|
|
|
- .width = 2,
|
|
|
|
- },
|
|
|
|
.l = {
|
|
.l = {
|
|
.reg_off = HHI_SYS_PLL_CNTL,
|
|
.reg_off = HHI_SYS_PLL_CNTL,
|
|
.shift = 31,
|
|
.shift = 31,
|
|
@@ -394,20 +324,36 @@ static struct clk_regmap gxbb_sys_pll = {
|
|
},
|
|
},
|
|
},
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.hw.init = &(struct clk_init_data){
|
|
- .name = "sys_pll",
|
|
|
|
|
|
+ .name = "sys_pll_dco",
|
|
.ops = &meson_clk_pll_ro_ops,
|
|
.ops = &meson_clk_pll_ro_ops,
|
|
.parent_names = (const char *[]){ "xtal" },
|
|
.parent_names = (const char *[]){ "xtal" },
|
|
.num_parents = 1,
|
|
.num_parents = 1,
|
|
},
|
|
},
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static struct clk_regmap gxbb_sys_pll = {
|
|
|
|
+ .data = &(struct clk_regmap_div_data){
|
|
|
|
+ .offset = HHI_SYS_PLL_CNTL,
|
|
|
|
+ .shift = 10,
|
|
|
|
+ .width = 2,
|
|
|
|
+ .flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
|
|
+ },
|
|
|
|
+ .hw.init = &(struct clk_init_data){
|
|
|
|
+ .name = "sys_pll",
|
|
|
|
+ .ops = &clk_regmap_divider_ro_ops,
|
|
|
|
+ .parent_names = (const char *[]){ "sys_pll_dco" },
|
|
|
|
+ .num_parents = 1,
|
|
|
|
+ .flags = CLK_SET_RATE_PARENT,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
static const struct reg_sequence gxbb_gp0_init_regs[] = {
|
|
static const struct reg_sequence gxbb_gp0_init_regs[] = {
|
|
{ .reg = HHI_GP0_PLL_CNTL2, .def = 0x69c80000 },
|
|
{ .reg = HHI_GP0_PLL_CNTL2, .def = 0x69c80000 },
|
|
{ .reg = HHI_GP0_PLL_CNTL3, .def = 0x0a5590c4 },
|
|
{ .reg = HHI_GP0_PLL_CNTL3, .def = 0x0a5590c4 },
|
|
{ .reg = HHI_GP0_PLL_CNTL4, .def = 0x0000500d },
|
|
{ .reg = HHI_GP0_PLL_CNTL4, .def = 0x0000500d },
|
|
};
|
|
};
|
|
|
|
|
|
-static struct clk_regmap gxbb_gp0_pll = {
|
|
|
|
|
|
+static struct clk_regmap gxbb_gp0_pll_dco = {
|
|
.data = &(struct meson_clk_pll_data){
|
|
.data = &(struct meson_clk_pll_data){
|
|
.en = {
|
|
.en = {
|
|
.reg_off = HHI_GP0_PLL_CNTL,
|
|
.reg_off = HHI_GP0_PLL_CNTL,
|
|
@@ -424,11 +370,6 @@ static struct clk_regmap gxbb_gp0_pll = {
|
|
.shift = 9,
|
|
.shift = 9,
|
|
.width = 5,
|
|
.width = 5,
|
|
},
|
|
},
|
|
- .od = {
|
|
|
|
- .reg_off = HHI_GP0_PLL_CNTL,
|
|
|
|
- .shift = 16,
|
|
|
|
- .width = 2,
|
|
|
|
- },
|
|
|
|
.l = {
|
|
.l = {
|
|
.reg_off = HHI_GP0_PLL_CNTL,
|
|
.reg_off = HHI_GP0_PLL_CNTL,
|
|
.shift = 31,
|
|
.shift = 31,
|
|
@@ -444,7 +385,7 @@ static struct clk_regmap gxbb_gp0_pll = {
|
|
.init_count = ARRAY_SIZE(gxbb_gp0_init_regs),
|
|
.init_count = ARRAY_SIZE(gxbb_gp0_init_regs),
|
|
},
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.hw.init = &(struct clk_init_data){
|
|
- .name = "gp0_pll",
|
|
|
|
|
|
+ .name = "gp0_pll_dco",
|
|
.ops = &meson_clk_pll_ops,
|
|
.ops = &meson_clk_pll_ops,
|
|
.parent_names = (const char *[]){ "xtal" },
|
|
.parent_names = (const char *[]){ "xtal" },
|
|
.num_parents = 1,
|
|
.num_parents = 1,
|
|
@@ -459,7 +400,7 @@ static const struct reg_sequence gxl_gp0_init_regs[] = {
|
|
{ .reg = HHI_GP0_PLL_CNTL5, .def = 0x00078000 },
|
|
{ .reg = HHI_GP0_PLL_CNTL5, .def = 0x00078000 },
|
|
};
|
|
};
|
|
|
|
|
|
-static struct clk_regmap gxl_gp0_pll = {
|
|
|
|
|
|
+static struct clk_regmap gxl_gp0_pll_dco = {
|
|
.data = &(struct meson_clk_pll_data){
|
|
.data = &(struct meson_clk_pll_data){
|
|
.en = {
|
|
.en = {
|
|
.reg_off = HHI_GP0_PLL_CNTL,
|
|
.reg_off = HHI_GP0_PLL_CNTL,
|
|
@@ -476,11 +417,6 @@ static struct clk_regmap gxl_gp0_pll = {
|
|
.shift = 9,
|
|
.shift = 9,
|
|
.width = 5,
|
|
.width = 5,
|
|
},
|
|
},
|
|
- .od = {
|
|
|
|
- .reg_off = HHI_GP0_PLL_CNTL,
|
|
|
|
- .shift = 16,
|
|
|
|
- .width = 2,
|
|
|
|
- },
|
|
|
|
.frac = {
|
|
.frac = {
|
|
.reg_off = HHI_GP0_PLL_CNTL1,
|
|
.reg_off = HHI_GP0_PLL_CNTL1,
|
|
.shift = 0,
|
|
.shift = 0,
|
|
@@ -501,13 +437,29 @@ static struct clk_regmap gxl_gp0_pll = {
|
|
.init_count = ARRAY_SIZE(gxl_gp0_init_regs),
|
|
.init_count = ARRAY_SIZE(gxl_gp0_init_regs),
|
|
},
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.hw.init = &(struct clk_init_data){
|
|
- .name = "gp0_pll",
|
|
|
|
|
|
+ .name = "gp0_pll_dco",
|
|
.ops = &meson_clk_pll_ops,
|
|
.ops = &meson_clk_pll_ops,
|
|
.parent_names = (const char *[]){ "xtal" },
|
|
.parent_names = (const char *[]){ "xtal" },
|
|
.num_parents = 1,
|
|
.num_parents = 1,
|
|
},
|
|
},
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static struct clk_regmap gxbb_gp0_pll = {
|
|
|
|
+ .data = &(struct clk_regmap_div_data){
|
|
|
|
+ .offset = HHI_GP0_PLL_CNTL,
|
|
|
|
+ .shift = 16,
|
|
|
|
+ .width = 2,
|
|
|
|
+ .flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
|
|
+ },
|
|
|
|
+ .hw.init = &(struct clk_init_data){
|
|
|
|
+ .name = "gp0_pll",
|
|
|
|
+ .ops = &clk_regmap_divider_ops,
|
|
|
|
+ .parent_names = (const char *[]){ "gp0_pll_dco" },
|
|
|
|
+ .num_parents = 1,
|
|
|
|
+ .flags = CLK_SET_RATE_PARENT,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
static struct clk_fixed_factor gxbb_fclk_div2_div = {
|
|
static struct clk_fixed_factor gxbb_fclk_div2_div = {
|
|
.mult = 1,
|
|
.mult = 1,
|
|
.div = 2,
|
|
.div = 2,
|
|
@@ -1965,6 +1917,12 @@ static struct clk_hw_onecell_data gxbb_hw_onecell_data = {
|
|
[CLKID_GEN_CLK_SEL] = &gxbb_gen_clk_sel.hw,
|
|
[CLKID_GEN_CLK_SEL] = &gxbb_gen_clk_sel.hw,
|
|
[CLKID_GEN_CLK_DIV] = &gxbb_gen_clk_div.hw,
|
|
[CLKID_GEN_CLK_DIV] = &gxbb_gen_clk_div.hw,
|
|
[CLKID_GEN_CLK] = &gxbb_gen_clk.hw,
|
|
[CLKID_GEN_CLK] = &gxbb_gen_clk.hw,
|
|
|
|
+ [CLKID_FIXED_PLL_DCO] = &gxbb_fixed_pll_dco.hw,
|
|
|
|
+ [CLKID_HDMI_PLL_DCO] = &gxbb_hdmi_pll_dco.hw,
|
|
|
|
+ [CLKID_HDMI_PLL_OD] = &gxbb_hdmi_pll_od.hw,
|
|
|
|
+ [CLKID_HDMI_PLL_OD2] = &gxbb_hdmi_pll_od2.hw,
|
|
|
|
+ [CLKID_SYS_PLL_DCO] = &gxbb_sys_pll_dco.hw,
|
|
|
|
+ [CLKID_GP0_PLL_DCO] = &gxbb_gp0_pll_dco.hw,
|
|
[NR_CLKS] = NULL,
|
|
[NR_CLKS] = NULL,
|
|
},
|
|
},
|
|
.num = NR_CLKS,
|
|
.num = NR_CLKS,
|
|
@@ -1980,7 +1938,7 @@ static struct clk_hw_onecell_data gxl_hw_onecell_data = {
|
|
[CLKID_FCLK_DIV4] = &gxbb_fclk_div4.hw,
|
|
[CLKID_FCLK_DIV4] = &gxbb_fclk_div4.hw,
|
|
[CLKID_FCLK_DIV5] = &gxbb_fclk_div5.hw,
|
|
[CLKID_FCLK_DIV5] = &gxbb_fclk_div5.hw,
|
|
[CLKID_FCLK_DIV7] = &gxbb_fclk_div7.hw,
|
|
[CLKID_FCLK_DIV7] = &gxbb_fclk_div7.hw,
|
|
- [CLKID_GP0_PLL] = &gxl_gp0_pll.hw,
|
|
|
|
|
|
+ [CLKID_GP0_PLL] = &gxbb_gp0_pll.hw,
|
|
[CLKID_MPEG_SEL] = &gxbb_mpeg_clk_sel.hw,
|
|
[CLKID_MPEG_SEL] = &gxbb_mpeg_clk_sel.hw,
|
|
[CLKID_MPEG_DIV] = &gxbb_mpeg_clk_div.hw,
|
|
[CLKID_MPEG_DIV] = &gxbb_mpeg_clk_div.hw,
|
|
[CLKID_CLK81] = &gxbb_clk81.hw,
|
|
[CLKID_CLK81] = &gxbb_clk81.hw,
|
|
@@ -2130,19 +2088,29 @@ static struct clk_hw_onecell_data gxl_hw_onecell_data = {
|
|
[CLKID_GEN_CLK_SEL] = &gxbb_gen_clk_sel.hw,
|
|
[CLKID_GEN_CLK_SEL] = &gxbb_gen_clk_sel.hw,
|
|
[CLKID_GEN_CLK_DIV] = &gxbb_gen_clk_div.hw,
|
|
[CLKID_GEN_CLK_DIV] = &gxbb_gen_clk_div.hw,
|
|
[CLKID_GEN_CLK] = &gxbb_gen_clk.hw,
|
|
[CLKID_GEN_CLK] = &gxbb_gen_clk.hw,
|
|
|
|
+ [CLKID_FIXED_PLL_DCO] = &gxbb_fixed_pll_dco.hw,
|
|
|
|
+ [CLKID_HDMI_PLL_DCO] = &gxbb_hdmi_pll_dco.hw,
|
|
|
|
+ [CLKID_HDMI_PLL_OD] = &gxl_hdmi_pll_od.hw,
|
|
|
|
+ [CLKID_HDMI_PLL_OD2] = &gxl_hdmi_pll_od2.hw,
|
|
|
|
+ [CLKID_SYS_PLL_DCO] = &gxbb_sys_pll_dco.hw,
|
|
|
|
+ [CLKID_GP0_PLL_DCO] = &gxl_gp0_pll_dco.hw,
|
|
[NR_CLKS] = NULL,
|
|
[NR_CLKS] = NULL,
|
|
},
|
|
},
|
|
.num = NR_CLKS,
|
|
.num = NR_CLKS,
|
|
};
|
|
};
|
|
|
|
|
|
static struct clk_regmap *const gxbb_clk_regmaps[] = {
|
|
static struct clk_regmap *const gxbb_clk_regmaps[] = {
|
|
- &gxbb_gp0_pll,
|
|
|
|
|
|
+ &gxbb_gp0_pll_dco,
|
|
&gxbb_hdmi_pll,
|
|
&gxbb_hdmi_pll,
|
|
|
|
+ &gxbb_hdmi_pll_od,
|
|
|
|
+ &gxbb_hdmi_pll_od2,
|
|
};
|
|
};
|
|
|
|
|
|
static struct clk_regmap *const gxl_clk_regmaps[] = {
|
|
static struct clk_regmap *const gxl_clk_regmaps[] = {
|
|
- &gxl_gp0_pll,
|
|
|
|
|
|
+ &gxl_gp0_pll_dco,
|
|
&gxl_hdmi_pll,
|
|
&gxl_hdmi_pll,
|
|
|
|
+ &gxl_hdmi_pll_od,
|
|
|
|
+ &gxl_hdmi_pll_od2,
|
|
};
|
|
};
|
|
|
|
|
|
static struct clk_regmap *const gx_clk_regmaps[] = {
|
|
static struct clk_regmap *const gx_clk_regmaps[] = {
|
|
@@ -2297,6 +2265,10 @@ static struct clk_regmap *const gx_clk_regmaps[] = {
|
|
&gxbb_gen_clk_sel,
|
|
&gxbb_gen_clk_sel,
|
|
&gxbb_gen_clk_div,
|
|
&gxbb_gen_clk_div,
|
|
&gxbb_gen_clk,
|
|
&gxbb_gen_clk,
|
|
|
|
+ &gxbb_fixed_pll_dco,
|
|
|
|
+ &gxbb_hdmi_pll_dco,
|
|
|
|
+ &gxbb_sys_pll_dco,
|
|
|
|
+ &gxbb_gp0_pll,
|
|
};
|
|
};
|
|
|
|
|
|
struct clkc_data {
|
|
struct clkc_data {
|