diff options
author | Jun Nie <jun.nie@linaro.org> | 2015-07-23 03:02:52 -0400 |
---|---|---|
committer | Stephen Boyd <sboyd@codeaurora.org> | 2015-07-28 14:59:37 -0400 |
commit | 105644e59a2b1c43fe2eeba6595d142c390552c2 (patch) | |
tree | 2cb41bb2013f727af02066b3c2b3edee1aecafb6 /drivers/clk/zte | |
parent | 4599dd2c926915b5e8c27e0ca21a6172f9d6881c (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.c | 92 |
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 | ||
44 | static const struct zx_pll_config pll_a9_config[] = { | 55 | static 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 | ||
184 | static const char * spdif0_wclk_sel[] = { | ||
185 | "lsp0_104M_wclk", | ||
186 | "lsp0_26M_wclk", | ||
187 | }; | ||
188 | |||
189 | static const char * spdif1_wclk_sel[] = { | ||
190 | "lsp1_104M_wclk", | ||
191 | "lsp1_26M_wclk", | ||
192 | }; | ||
193 | |||
194 | static const char * i2s_wclk_sel[] = { | ||
195 | "lsp0_104M_wclk", | ||
196 | "lsp0_26M_wclk", | ||
197 | }; | ||
198 | |||
173 | static inline struct clk *zx_divtbl(const char *name, const char *parent, | 199 | static 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, ®_lock); | 225 | reg, shift, CLK_SET_RATE_PARENT, ®_lock); |
200 | } | 226 | } |
201 | 227 | ||
202 | static void __init zx296702_top_clocks_init(struct device_node *np) | 228 | static 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", |