summaryrefslogtreecommitdiffstats
path: root/drivers/clk/zte
diff options
context:
space:
mode:
authorJun Nie <jun.nie@linaro.org>2015-07-23 03:02:52 -0400
committerStephen Boyd <sboyd@codeaurora.org>2015-07-28 14:59:37 -0400
commit105644e59a2b1c43fe2eeba6595d142c390552c2 (patch)
tree2cb41bb2013f727af02066b3c2b3edee1aecafb6 /drivers/clk/zte
parent4599dd2c926915b5e8c27e0ca21a6172f9d6881c (diff)
clk: zx: Add audio and GPIO clock for zx296702
Add SPDIF/I2S and GPIO clock for zx296702 Signed-off-by: Jun Nie <jun.nie@linaro.org> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Diffstat (limited to 'drivers/clk/zte')
-rw-r--r--drivers/clk/zte/clk-zx296702.c92
1 files changed, 90 insertions, 2 deletions
diff --git a/drivers/clk/zte/clk-zx296702.c b/drivers/clk/zte/clk-zx296702.c
index 929d033594af..9dcac73480ba 100644
--- a/drivers/clk/zte/clk-zx296702.c
+++ b/drivers/clk/zte/clk-zx296702.c
@@ -36,10 +36,21 @@ static struct clk_onecell_data lsp1clk_data;
36#define CLK_MUX1 (topcrm_base + 0x8c) 36#define CLK_MUX1 (topcrm_base + 0x8c)
37 37
38#define CLK_SDMMC1 (lsp0crpm_base + 0x0c) 38#define CLK_SDMMC1 (lsp0crpm_base + 0x0c)
39#define CLK_GPIO (lsp0crpm_base + 0x2c)
40#define CLK_SPDIF0 (lsp0crpm_base + 0x10)
41#define SPDIF0_DIV (lsp0crpm_base + 0x14)
42#define CLK_I2S0 (lsp0crpm_base + 0x18)
43#define I2S0_DIV (lsp0crpm_base + 0x1c)
44#define CLK_I2S1 (lsp0crpm_base + 0x20)
45#define I2S1_DIV (lsp0crpm_base + 0x24)
46#define CLK_I2S2 (lsp0crpm_base + 0x34)
47#define I2S2_DIV (lsp0crpm_base + 0x38)
39 48
40#define CLK_UART0 (lsp1crpm_base + 0x20) 49#define CLK_UART0 (lsp1crpm_base + 0x20)
41#define CLK_UART1 (lsp1crpm_base + 0x24) 50#define CLK_UART1 (lsp1crpm_base + 0x24)
42#define CLK_SDMMC0 (lsp1crpm_base + 0x2c) 51#define CLK_SDMMC0 (lsp1crpm_base + 0x2c)
52#define CLK_SPDIF1 (lsp1crpm_base + 0x30)
53#define SPDIF1_DIV (lsp1crpm_base + 0x34)
43 54
44static const struct zx_pll_config pll_a9_config[] = { 55static const struct zx_pll_config pll_a9_config[] = {
45 { .rate = 700000000, .cfg0 = 0x800405d1, .cfg1 = 0x04555555 }, 56 { .rate = 700000000, .cfg0 = 0x800405d1, .cfg1 = 0x04555555 },
@@ -170,6 +181,21 @@ static const char * uart_wclk_sel[] = {
170 "lsp1_26M_wclk", 181 "lsp1_26M_wclk",
171}; 182};
172 183
184static const char * spdif0_wclk_sel[] = {
185 "lsp0_104M_wclk",
186 "lsp0_26M_wclk",
187};
188
189static const char * spdif1_wclk_sel[] = {
190 "lsp1_104M_wclk",
191 "lsp1_26M_wclk",
192};
193
194static const char * i2s_wclk_sel[] = {
195 "lsp0_104M_wclk",
196 "lsp0_26M_wclk",
197};
198
173static inline struct clk *zx_divtbl(const char *name, const char *parent, 199static inline struct clk *zx_divtbl(const char *name, const char *parent,
174 void __iomem *reg, u8 shift, u8 width, 200 void __iomem *reg, u8 shift, u8 width,
175 const struct clk_div_table *table) 201 const struct clk_div_table *table)
@@ -196,7 +222,7 @@ static inline struct clk *zx_gate(const char *name, const char *parent,
196 void __iomem *reg, u8 shift) 222 void __iomem *reg, u8 shift)
197{ 223{
198 return clk_register_gate(NULL, name, parent, CLK_IGNORE_UNUSED, 224 return clk_register_gate(NULL, name, parent, CLK_IGNORE_UNUSED,
199 reg, shift, 0, &reg_lock); 225 reg, shift, CLK_SET_RATE_PARENT, &reg_lock);
200} 226}
201 227
202static void __init zx296702_top_clocks_init(struct device_node *np) 228static void __init zx296702_top_clocks_init(struct device_node *np)
@@ -585,7 +611,57 @@ static void __init zx296702_lsp0_clocks_init(struct device_node *np)
585 clk[ZX296702_SDMMC1_WCLK] = 611 clk[ZX296702_SDMMC1_WCLK] =
586 zx_gate("sdmmc1_wclk", "sdmmc1_wclk_div", CLK_SDMMC1, 1); 612 zx_gate("sdmmc1_wclk", "sdmmc1_wclk_div", CLK_SDMMC1, 1);
587 clk[ZX296702_SDMMC1_PCLK] = 613 clk[ZX296702_SDMMC1_PCLK] =
588 zx_gate("sdmmc1_pclk", "lsp1_apb_pclk", CLK_SDMMC1, 0); 614 zx_gate("sdmmc1_pclk", "lsp0_apb_pclk", CLK_SDMMC1, 0);
615
616 clk[ZX296702_GPIO_CLK] =
617 zx_gate("gpio_clk", "lsp0_apb_pclk", CLK_GPIO, 0);
618
619 /* SPDIF */
620 clk[ZX296702_SPDIF0_WCLK_MUX] =
621 zx_mux("spdif0_wclk_mux", spdif0_wclk_sel,
622 ARRAY_SIZE(spdif0_wclk_sel), CLK_SPDIF0, 4, 1);
623 clk[ZX296702_SPDIF0_WCLK] =
624 zx_gate("spdif0_wclk", "spdif0_wclk_mux", CLK_SPDIF0, 1);
625 clk[ZX296702_SPDIF0_PCLK] =
626 zx_gate("spdif0_pclk", "lsp0_apb_pclk", CLK_SPDIF0, 0);
627
628 clk[ZX296702_SPDIF0_DIV] =
629 clk_register_zx_audio("spdif0_div", "spdif0_wclk", 0,
630 SPDIF0_DIV);
631
632 /* I2S */
633 clk[ZX296702_I2S0_WCLK_MUX] =
634 zx_mux("i2s0_wclk_mux", i2s_wclk_sel,
635 ARRAY_SIZE(i2s_wclk_sel), CLK_I2S0, 4, 1);
636 clk[ZX296702_I2S0_WCLK] =
637 zx_gate("i2s0_wclk", "i2s0_wclk_mux", CLK_I2S0, 1);
638 clk[ZX296702_I2S0_PCLK] =
639 zx_gate("i2s0_pclk", "lsp0_apb_pclk", CLK_I2S0, 0);
640
641 clk[ZX296702_I2S0_DIV] =
642 clk_register_zx_audio("i2s0_div", "i2s0_wclk", 0, I2S0_DIV);
643
644 clk[ZX296702_I2S1_WCLK_MUX] =
645 zx_mux("i2s1_wclk_mux", i2s_wclk_sel,
646 ARRAY_SIZE(i2s_wclk_sel), CLK_I2S1, 4, 1);
647 clk[ZX296702_I2S1_WCLK] =
648 zx_gate("i2s1_wclk", "i2s1_wclk_mux", CLK_I2S1, 1);
649 clk[ZX296702_I2S1_PCLK] =
650 zx_gate("i2s1_pclk", "lsp0_apb_pclk", CLK_I2S1, 0);
651
652 clk[ZX296702_I2S1_DIV] =
653 clk_register_zx_audio("i2s1_div", "i2s1_wclk", 0, I2S1_DIV);
654
655 clk[ZX296702_I2S2_WCLK_MUX] =
656 zx_mux("i2s2_wclk_mux", i2s_wclk_sel,
657 ARRAY_SIZE(i2s_wclk_sel), CLK_I2S2, 4, 1);
658 clk[ZX296702_I2S2_WCLK] =
659 zx_gate("i2s2_wclk", "i2s2_wclk_mux", CLK_I2S2, 1);
660 clk[ZX296702_I2S2_PCLK] =
661 zx_gate("i2s2_pclk", "lsp0_apb_pclk", CLK_I2S2, 0);
662
663 clk[ZX296702_I2S2_DIV] =
664 clk_register_zx_audio("i2s2_div", "i2s2_wclk", 0, I2S2_DIV);
589 665
590 for (i = 0; i < ARRAY_SIZE(lsp0clk); i++) { 666 for (i = 0; i < ARRAY_SIZE(lsp0clk); i++) {
591 if (IS_ERR(clk[i])) { 667 if (IS_ERR(clk[i])) {
@@ -641,6 +717,18 @@ static void __init zx296702_lsp1_clocks_init(struct device_node *np)
641 clk[ZX296702_SDMMC0_PCLK] = 717 clk[ZX296702_SDMMC0_PCLK] =
642 zx_gate("sdmmc0_pclk", "lsp1_apb_pclk", CLK_SDMMC0, 0); 718 zx_gate("sdmmc0_pclk", "lsp1_apb_pclk", CLK_SDMMC0, 0);
643 719
720 clk[ZX296702_SPDIF1_WCLK_MUX] =
721 zx_mux("spdif1_wclk_mux", spdif1_wclk_sel,
722 ARRAY_SIZE(spdif1_wclk_sel), CLK_SPDIF1, 4, 1);
723 clk[ZX296702_SPDIF1_WCLK] =
724 zx_gate("spdif1_wclk", "spdif1_wclk_mux", CLK_SPDIF1, 1);
725 clk[ZX296702_SPDIF1_PCLK] =
726 zx_gate("spdif1_pclk", "lsp1_apb_pclk", CLK_SPDIF1, 0);
727
728 clk[ZX296702_SPDIF1_DIV] =
729 clk_register_zx_audio("spdif1_div", "spdif1_wclk", 0,
730 SPDIF1_DIV);
731
644 for (i = 0; i < ARRAY_SIZE(lsp1clk); i++) { 732 for (i = 0; i < ARRAY_SIZE(lsp1clk); i++) {
645 if (IS_ERR(clk[i])) { 733 if (IS_ERR(clk[i])) {
646 pr_err("zx296702 clk %d: register failed with %ld\n", 734 pr_err("zx296702 clk %d: register failed with %ld\n",