|
@@ -340,3 +340,174 @@ static struct clk_div_mult_table div4_div_mult_table = {
|
|
.divisors = divisors,
|
|
.divisors = divisors,
|
|
.nr_divisors = ARRAY_SIZE(divisors),
|
|
.nr_divisors = ARRAY_SIZE(divisors),
|
|
};
|
|
};
|
|
|
|
+
|
|
|
|
+static struct clk_div4_table div4_table = {
|
|
|
|
+ .div_mult_table = &div4_div_mult_table,
|
|
|
|
+ .kick = div4_kick,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/* DIV6 reparent */
|
|
|
|
+enum {
|
|
|
|
+ DIV6_HDMI,
|
|
|
|
+ DIV6_VCLK1, DIV6_VCLK2,
|
|
|
|
+ DIV6_FSIA, DIV6_FSIB,
|
|
|
|
+ DIV6_REPARENT_NR,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk *hdmi_parent[] = {
|
|
|
|
+ [0] = &pllc1_div2_clk,
|
|
|
|
+ [1] = &system_clk,
|
|
|
|
+ [2] = &dv_clk
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk *vclk_parents[8] = {
|
|
|
|
+ [0] = &pllc1_div2_clk,
|
|
|
|
+ [2] = &dv_clk,
|
|
|
|
+ [3] = &usb24s_clk,
|
|
|
|
+ [4] = &extal1_div2_clk,
|
|
|
|
+ [5] = &extalr_clk,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk *fsia_parents[] = {
|
|
|
|
+ [0] = &pllc1_div2_clk,
|
|
|
|
+ [1] = &fsiack_clk, /* external clock */
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk *fsib_parents[] = {
|
|
|
|
+ [0] = &pllc1_div2_clk,
|
|
|
|
+ [1] = &fsibck_clk, /* external clock */
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk div6_reparent_clks[DIV6_REPARENT_NR] = {
|
|
|
|
+ [DIV6_HDMI] = SH_CLK_DIV6_EXT(HDMICKCR, 0,
|
|
|
|
+ hdmi_parent, ARRAY_SIZE(hdmi_parent), 6, 2),
|
|
|
|
+ [DIV6_VCLK1] = SH_CLK_DIV6_EXT(VCLKCR1, 0,
|
|
|
|
+ vclk_parents, ARRAY_SIZE(vclk_parents), 12, 3),
|
|
|
|
+ [DIV6_VCLK2] = SH_CLK_DIV6_EXT(VCLKCR2, 0,
|
|
|
|
+ vclk_parents, ARRAY_SIZE(vclk_parents), 12, 3),
|
|
|
|
+ [DIV6_FSIA] = SH_CLK_DIV6_EXT(FSIACKCR, 0,
|
|
|
|
+ fsia_parents, ARRAY_SIZE(fsia_parents), 6, 2),
|
|
|
|
+ [DIV6_FSIB] = SH_CLK_DIV6_EXT(FSIBCKCR, 0,
|
|
|
|
+ fsib_parents, ARRAY_SIZE(fsib_parents), 6, 2),
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/* HDMI1/2 clock */
|
|
|
|
+static unsigned long hdmi12_recalc(struct clk *clk)
|
|
|
|
+{
|
|
|
|
+ u32 val = __raw_readl(HDMICKCR);
|
|
|
|
+ int shift = (int)clk->priv;
|
|
|
|
+
|
|
|
|
+ val >>= shift;
|
|
|
|
+ val &= 0x3;
|
|
|
|
+
|
|
|
|
+ return clk->parent->rate / (1 << val);
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static int hdmi12_set_rate(struct clk *clk, unsigned long rate)
|
|
|
|
+{
|
|
|
|
+ u32 val, mask;
|
|
|
|
+ int i, shift;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < 3; i++)
|
|
|
|
+ if (rate == clk->parent->rate / (1 << i))
|
|
|
|
+ goto find;
|
|
|
|
+ return -ENODEV;
|
|
|
|
+
|
|
|
|
+find:
|
|
|
|
+ shift = (int)clk->priv;
|
|
|
|
+
|
|
|
|
+ val = __raw_readl(HDMICKCR);
|
|
|
|
+ mask = ~(0x3 << shift);
|
|
|
|
+ val = (val & mask) | i << shift;
|
|
|
|
+ __raw_writel(val, HDMICKCR);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct sh_clk_ops hdmi12_clk_ops = {
|
|
|
|
+ .recalc = hdmi12_recalc,
|
|
|
|
+ .set_rate = hdmi12_set_rate,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk hdmi1_clk = {
|
|
|
|
+ .ops = &hdmi12_clk_ops,
|
|
|
|
+ .priv = (void *)9,
|
|
|
|
+ .parent = &div6_reparent_clks[DIV6_HDMI], /* late install */
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk hdmi2_clk = {
|
|
|
|
+ .ops = &hdmi12_clk_ops,
|
|
|
|
+ .priv = (void *)11,
|
|
|
|
+ .parent = &div6_reparent_clks[DIV6_HDMI], /* late install */
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk *late_main_clks[] = {
|
|
|
|
+ &hdmi1_clk,
|
|
|
|
+ &hdmi2_clk,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/* FSI DIV */
|
|
|
|
+enum { FSIDIV_A, FSIDIV_B, FSIDIV_REPARENT_NR };
|
|
|
|
+
|
|
|
|
+static struct clk fsidivs[] = {
|
|
|
|
+ [FSIDIV_A] = SH_CLK_FSIDIV(FSIDIVA, &div6_reparent_clks[DIV6_FSIA]),
|
|
|
|
+ [FSIDIV_B] = SH_CLK_FSIDIV(FSIDIVB, &div6_reparent_clks[DIV6_FSIB]),
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/* MSTP */
|
|
|
|
+enum {
|
|
|
|
+ DIV4_I, DIV4_ZG, DIV4_B, DIV4_M1, DIV4_HP,
|
|
|
|
+ DIV4_HPP, DIV4_USBP, DIV4_S, DIV4_ZB, DIV4_M3, DIV4_CP,
|
|
|
|
+ DIV4_NR
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct clk div4_clks[DIV4_NR] = {
|
|
|
|
+ [DIV4_I] = SH_CLK_DIV4(&pllc1_clk, FRQCRA, 20, 0x6fff, CLK_ENABLE_ON_INIT),
|
|
|
|
+ [DIV4_ZG] = SH_CLK_DIV4(&pllc1_clk, FRQCRA, 16, 0x6fff, CLK_ENABLE_ON_INIT),
|
|
|
|
+ [DIV4_B] = SH_CLK_DIV4(&pllc1_clk, FRQCRA, 8, 0x6fff, CLK_ENABLE_ON_INIT),
|
|
|
|
+ [DIV4_M1] = SH_CLK_DIV4(&pllc1_clk, FRQCRA, 4, 0x6fff, CLK_ENABLE_ON_INIT),
|
|
|
|
+ [DIV4_HP] = SH_CLK_DIV4(&pllc1_clk, FRQCRB, 4, 0x6fff, 0),
|
|
|
|
+ [DIV4_HPP] = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 20, 0x6fff, 0),
|
|
|
|
+ [DIV4_USBP] = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 16, 0x6fff, 0),
|
|
|
|
+ [DIV4_S] = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 12, 0x6fff, 0),
|
|
|
|
+ [DIV4_ZB] = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 8, 0x6fff, 0),
|
|
|
|
+ [DIV4_M3] = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 4, 0x6fff, 0),
|
|
|
|
+ [DIV4_CP] = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 0, 0x6fff, 0),
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+enum {
|
|
|
|
+ DIV6_SUB,
|
|
|
|
+ DIV6_NR
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk div6_clks[DIV6_NR] = {
|
|
|
|
+ [DIV6_SUB] = SH_CLK_DIV6(&pllc1_div2_clk, SUBCKCR, 0),
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+enum {
|
|
|
|
+ MSTP128, MSTP127, MSTP125,
|
|
|
|
+ MSTP116, MSTP111, MSTP100, MSTP117,
|
|
|
|
+
|
|
|
|
+ MSTP230,
|
|
|
|
+ MSTP222,
|
|
|
|
+ MSTP218, MSTP217, MSTP216, MSTP214,
|
|
|
|
+ MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200,
|
|
|
|
+
|
|
|
|
+ MSTP329, MSTP328, MSTP323, MSTP320,
|
|
|
|
+ MSTP314, MSTP313, MSTP312,
|
|
|
|
+ MSTP309,
|
|
|
|
+
|
|
|
|
+ MSTP416, MSTP415, MSTP407, MSTP406,
|
|
|
|
+
|
|
|
|
+ MSTP_NR
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk mstp_clks[MSTP_NR] = {
|
|
|
|
+ [MSTP128] = SH_CLK_MSTP32(&div4_clks[DIV4_S], SMSTPCR1, 28, 0), /* CEU21 */
|
|
|
|
+ [MSTP127] = SH_CLK_MSTP32(&div4_clks[DIV4_S], SMSTPCR1, 27, 0), /* CEU20 */
|
|
|
|
+ [MSTP125] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR1, 25, 0), /* TMU0 */
|
|
|
|
+ [MSTP117] = SH_CLK_MSTP32(&div4_clks[DIV4_B], SMSTPCR1, 17, 0), /* LCDC1 */
|
|
|
|
+ [MSTP116] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR1, 16, 0), /* IIC0 */
|
|
|
|
+ [MSTP111] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR1, 11, 0), /* TMU1 */
|
|
|
|
+ [MSTP100] = SH_CLK_MSTP32(&div4_clks[DIV4_B], SMSTPCR1, 0, 0), /* LCDC0 */
|
|
|
|
+
|