[PATCH 56/74] SPEAr13xx: Adding and Updating Clock definitions
From: Viresh KUMAR <hidden>
Date: 2010-08-30 10:39:19
Subsystem:
arm port, the rest · Maintainers:
Russell King, Linus Torvalds
From: Deepak Sikri <redacted> Signed-off-by: Deepak Sikri <redacted> Signed-off-by: shiraz hashim <redacted> Signed-off-by: Viresh Kumar <redacted> --- arch/arm/mach-spear13xx/clock.c | 196 +++++++++++++++++++++- arch/arm/mach-spear13xx/include/mach/misc_regs.h | 19 ++ arch/arm/mach-spear13xx/include/mach/spear1310.h | 5 + 3 files changed, 215 insertions(+), 5 deletions(-)
diff --git a/arch/arm/mach-spear13xx/clock.c b/arch/arm/mach-spear13xx/clock.c
index 33ec3ab..cad2bbb 100644
--- a/arch/arm/mach-spear13xx/clock.c
+++ b/arch/arm/mach-spear13xx/clock.c@@ -579,7 +579,7 @@ static struct pclk_sel gmac_phy_pclk_sel = { }; /* gmac phy clock */ -static struct clk gmac_phy_clk = { +static struct clk gmac_phy0_clk = { .flags = ALWAYS_ENABLED, .pclk_sel = &gmac_phy_pclk_sel, .pclk_sel_shift = GMAC_PHY_CLK_SHIFT,
@@ -697,8 +697,8 @@ static struct clk jpeg_clk = { .recalc = &follow_parent, }; -/* gmac clock */ -static struct clk gmac_clk = { +/* gmac clock :Fixed Part*/ +static struct clk gmac0_clk = { .pclk = &ahb_clk, .en_reg = PERIP1_CLK_ENB, .en_reg_bit = GMAC_CLK_ENB,
@@ -839,6 +839,92 @@ static struct clk kbd_clk = { .recalc = &follow_parent, }; +/* RAS CLOCKS */ +/* pll3 generated clock */ +static struct clk ras_pll3_clk = { + .pclk = &pll3_clk, + .en_reg = RAS_CLK_ENB, + .en_reg_bit = PLL3_CLK_ENB, + .recalc = &follow_parent, +}; + +/* pll2 generated clock */ +static struct clk ras_pll2_clk = { + .pclk = &pll2_clk, + .en_reg = RAS_CLK_ENB, + .en_reg_bit = PLL2_CLK_ENB, + .recalc = &follow_parent, +}; + +/* 125MHz clock generated on Tx pad */ +static struct clk ras_tx125_clk = { + .pclk = &gmii_txclk125_pad, + .en_reg = RAS_CLK_ENB, + .en_reg_bit = C125_CLK_ENB, + .recalc = &follow_parent, +}; + +/* 30 MHz clock generated by USB PHy Pll */ +static struct clk ras_30Mhz_clk = { + .rate = 30000000, + .en_reg = RAS_CLK_ENB, + .en_reg_bit = C30_CLK_ENB, +}; + +/* 48 MHz clock generated by USB PHy Pll */ +static struct clk ras_48Mhz_clk = { + .pclk = &pll5_clk, + .en_reg = RAS_CLK_ENB, + .en_reg_bit = C48_CLK_ENB, + .recalc = &follow_parent, +}; + +/* osc3 generated clock */ +static struct clk ras_osc3_clk = { + .pclk = &ahb_clk, + .en_reg = RAS_CLK_ENB, + .en_reg_bit = OSC3_CLK_ENB, + .recalc = &follow_parent, +}; + +/* osc2 generated clock */ +static struct clk ras_osc2_clk = { + .pclk = &osc2_32k_clk, + .en_reg = RAS_CLK_ENB, + .en_reg_bit = OSC2_CLK_ENB, + .recalc = &follow_parent, +}; + +/* osc1 generated clock */ +static struct clk ras_osc1_clk = { + .pclk = &osc1_24m_clk, + .en_reg = RAS_CLK_ENB, + .en_reg_bit = OSC1_CLK_ENB, + .recalc = &follow_parent, +}; + +/* apb generated clock */ +static struct clk ras_pclk_clk = { + .pclk = &apb_clk, + .en_reg = RAS_CLK_ENB, + .en_reg_bit = PCLK_CLK_ENB, + .recalc = &follow_parent, +}; + +/* ahb generated clock */ +static struct clk ras_aclk_clk = { + .pclk = &ahb_clk, + .en_reg = RAS_CLK_ENB, + .en_reg_bit = ACLK_CLK_ENB, + .recalc = &follow_parent, +}; + +/* External pad 50 MHz clock for phy operation */ +static struct clk ras_tx50_clk = { + .flags = ALWAYS_ENABLED, + .rate = 50000000, +}; + /* spear1300 machine specific clock structures */ #ifdef CONFIG_MACH_SPEAR1300
@@ -859,6 +945,85 @@ static struct clk can1_clk = { .pclk = &apb_clk, .recalc = &follow_parent, }; + +/* gmac clocks :RAS part*/ +static struct clk gmac_ras1_clk = { + .flags = ALWAYS_ENABLED, + .pclk = &ras_aclk_clk, + .recalc = &follow_parent, +}; + +static struct clk gmac_ras2_clk = { + .flags = ALWAYS_ENABLED, + .pclk = &ras_aclk_clk, + .recalc = &follow_parent, +}; + +static struct clk gmac_ras3_clk = { + .flags = ALWAYS_ENABLED, + .pclk = &ras_aclk_clk, + .recalc = &follow_parent, +}; + +static struct clk gmac_ras4_clk = { + .flags = ALWAYS_ENABLED, + .pclk = &ras_aclk_clk, + .recalc = &follow_parent, +}; + +/* phy clock parent select */ +static struct pclk_info phy_pclk_info[] = { + { + .pclk = &ras_pll2_clk, + .pclk_val = 0x8, + }, { + .pclk = &ras_tx125_clk, + .pclk_val = 0x4, + }, { + .pclk = &ras_tx50_clk, + .pclk_val = 0x0, + }, +}; + +static struct pclk_sel phy_pclk_sel = { + .pclk_info = phy_pclk_info, + .pclk_count = ARRAY_SIZE(phy_pclk_info), + .pclk_sel_reg = (unsigned int *)(IO_ADDRESS(RAS_CTRL_REG1)), + .pclk_sel_mask = PHY_CLK_MASK, +}; + +/* Phy 1 Clock */ +struct clk gmac_phy1_clk = { + .flags = ALWAYS_ENABLED, + .pclk_sel = &phy_pclk_sel, + .pclk_sel_shift = PHY_CLK_SHIFT, + .recalc = &follow_parent, +}; + +/* Phy 2 Clock */ +static struct clk gmac_phy2_clk = { + .flags = ALWAYS_ENABLED, + .pclk_sel = &phy_pclk_sel, + .pclk_sel_shift = PHY_CLK_SHIFT, + .recalc = &follow_parent, +}; + +/* Phy 3 Clock */ +static struct clk gmac_phy3_clk = { + .flags = ALWAYS_ENABLED, + .pclk_sel = &phy_pclk_sel, + .pclk_sel_shift = PHY_CLK_SHIFT, + .recalc = &follow_parent, +}; + +/* Phy 4 Clock */ +static struct clk gmac_phy4_clk = { + .flags = ALWAYS_ENABLED, + .pclk_sel = &phy_pclk_sel, + .pclk_sel_shift = PHY_CLK_SHIFT, + .recalc = &follow_parent, +}; + #endif /* array of all spear 13xx clock lookups */
@@ -896,7 +1061,20 @@ static struct clk_lookup spear_clk_lookups[] = { {.con_id = "cfxd_synth_clk", .clk = &cfxd_synth_clk}, {.con_id = "gmac_phy_input_clk", .clk = &gmac_phy_input_clk}, {.con_id = "gmac_phy_synth_clk", .clk = &gmac_phy_synth_clk}, - {.con_id = "gmac_phy_clk", .clk = &gmac_phy_clk}, + {.dev_id = "stmmacphy.0", .clk = &gmac_phy0_clk}, + + /* RAS clocks */ + {.con_id = "ras_pll3_clk", .clk = &ras_pll3_clk}, + {.con_id = "ras_pll2_clk", .clk = &ras_pll2_clk}, + {.con_id = "ras_tx125_clk", .clk = &ras_tx125_clk}, + {.con_id = "ras_30Mhz_clk", .clk = &ras_30Mhz_clk}, + {.con_id = "ras_48Mhz_clk", .clk = &ras_48Mhz_clk}, + {.con_id = "ras_osc3_clk", .clk = &ras_osc3_clk}, + {.con_id = "ras_osc2_clk", .clk = &ras_osc2_clk}, + {.con_id = "ras_osc1_clk", .clk = &ras_osc1_clk}, + {.con_id = "ras_pclk_clk", .clk = &ras_pclk_clk}, + {.con_id = "ras_aclk_clk", .clk = &ras_aclk_clk}, + {.con_id = "ras_tx50_clk", .clk = &ras_tx50_clk}, /* clocks having multiple parent source from above clocks */ {.dev_id = "clcd", .clk = &clcd_clk},
@@ -915,7 +1093,7 @@ static struct clk_lookup spear_clk_lookups[] = { {.dev_id = "dma0", .clk = &dma0_clk}, {.dev_id = "dma1", .clk = &dma1_clk}, {.dev_id = "jpeg", .clk = &jpeg_clk}, - {.dev_id = "gmac", .clk = &gmac_clk}, + {.dev_id = "stmmaceth.0", .clk = &gmac0_clk}, {.dev_id = "c3", .clk = &c3_clk}, {.dev_id = "pcie0", .clk = &pcie0_clk}, {.dev_id = "pcie1", .clk = &pcie1_clk},
@@ -944,6 +1122,14 @@ static struct clk_lookup spear_clk_lookups[] = { #ifdef CONFIG_MACH_SPEAR1310 {.dev_id = "spear_can.0", .clk = &can0_clk}, {.dev_id = "spear_can.1", .clk = &can1_clk}, + {.dev_id = "stmmaceth.1", .clk = &gmac_ras1_clk}, + {.dev_id = "stmmaceth.2", .clk = &gmac_ras2_clk}, + {.dev_id = "stmmaceth.3", .clk = &gmac_ras3_clk}, + {.dev_id = "stmmaceth.4", .clk = &gmac_ras4_clk}, + {.dev_id = "stmmacphy.1", .clk = &gmac_phy1_clk}, + {.dev_id = "stmmacphy.2", .clk = &gmac_phy2_clk}, + {.dev_id = "stmmacphy.3", .clk = &gmac_phy3_clk}, + {.dev_id = "stmmacphy.4", .clk = &gmac_phy4_clk}, #endif };
diff --git a/arch/arm/mach-spear13xx/include/mach/misc_regs.h b/arch/arm/mach-spear13xx/include/mach/misc_regs.h
index 3cfd4fc..ea6096f 100644
--- a/arch/arm/mach-spear13xx/include/mach/misc_regs.h
+++ b/arch/arm/mach-spear13xx/include/mach/misc_regs.h@@ -191,6 +191,25 @@ #define JPEG_SOF_RST 28 #define PERIP2_SW_RST ((unsigned int *)(MISC_BASE + 0x280)) #define RAS_CLK_ENB ((unsigned int *)(MISC_BASE + 0x284)) + /* RAS_CLK_ENB register masks */ + #define ACLK_CLK_ENB 0 + #define PCLK_CLK_ENB 1 + #define OSC1_CLK_ENB 2 + #define OSC2_CLK_ENB 3 + #define OSC3_CLK_ENB 4 + #define C48_CLK_ENB 5 + #define C30_CLK_ENB 6 + #define C125_CLK_ENB 7 + #define PLL2_CLK_ENB 8 + #define PLL3_CLK_ENB 9 + #define PCLK0_CLK_ENB 10 + #define PCLK1_CLK_ENB 11 + #define PCLK2_CLK_ENB 12 + #define PCLK3_CLK_ENB 13 + #define SYN0_CLK_ENB 14 + #define SYN1_CLK_ENB 15 + #define SYN2_CLK_ENB 16 + #define SYN3_CLK_ENB 17 #define RAS_SW_RST ((unsigned int *)(MISC_BASE + 0x288)) #define PLL1_SYNT ((unsigned int *)(MISC_BASE + 0x28c)) #define I2S_CLK_CFG ((unsigned int *)(MISC_BASE + 0x290))
diff --git a/arch/arm/mach-spear13xx/include/mach/spear1310.h b/arch/arm/mach-spear13xx/include/mach/spear1310.h
index e3d347c..fd97c64 100644
--- a/arch/arm/mach-spear13xx/include/mach/spear1310.h
+++ b/arch/arm/mach-spear13xx/include/mach/spear1310.h@@ -20,6 +20,11 @@ #define SPEAR1310_CAN1_BASE UL(0x6DB00000) #define SPEAR1310_RAS_BASE UL(0x6C800000) +/* RAS Area Control Register */ +#define RAS_CTRL_REG1 (SPEAR1310_RAS_BASE + 0x4) +#define PHY_CLK_MASK 0xF +#define PHY_CLK_SHIFT 0 + #endif /* __MACH_SPEAR1310_H */ #endif /* CONFIG_MACH_SPEAR1310 */
--
1.7.2.2