Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Jun Nie and committed by
Stephen Boyd
105644e5 4599dd2c

+105 -4
+90 -2
drivers/clk/zte/clk-zx296702.c
··· 36 36 #define CLK_MUX1 (topcrm_base + 0x8c) 37 37 38 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 49 #define CLK_UART0 (lsp1crpm_base + 0x20) 41 50 #define CLK_UART1 (lsp1crpm_base + 0x24) 42 51 #define CLK_SDMMC0 (lsp1crpm_base + 0x2c) 52 + #define CLK_SPDIF1 (lsp1crpm_base + 0x30) 53 + #define SPDIF1_DIV (lsp1crpm_base + 0x34) 43 54 44 55 static const struct zx_pll_config pll_a9_config[] = { 45 56 { .rate = 700000000, .cfg0 = 0x800405d1, .cfg1 = 0x04555555 }, ··· 181 170 "lsp1_26M_wclk", 182 171 }; 183 172 173 + static const char * spdif0_wclk_sel[] = { 174 + "lsp0_104M_wclk", 175 + "lsp0_26M_wclk", 176 + }; 177 + 178 + static const char * spdif1_wclk_sel[] = { 179 + "lsp1_104M_wclk", 180 + "lsp1_26M_wclk", 181 + }; 182 + 183 + static const char * i2s_wclk_sel[] = { 184 + "lsp0_104M_wclk", 185 + "lsp0_26M_wclk", 186 + }; 187 + 184 188 static inline struct clk *zx_divtbl(const char *name, const char *parent, 185 189 void __iomem *reg, u8 shift, u8 width, 186 190 const struct clk_div_table *table) ··· 222 196 void __iomem *reg, u8 shift) 223 197 { 224 198 return clk_register_gate(NULL, name, parent, CLK_IGNORE_UNUSED, 225 - reg, shift, 0, &reg_lock); 199 + reg, shift, CLK_SET_RATE_PARENT, &reg_lock); 226 200 } 227 201 228 202 static void __init zx296702_top_clocks_init(struct device_node *np) ··· 611 585 clk[ZX296702_SDMMC1_WCLK] = 612 586 zx_gate("sdmmc1_wclk", "sdmmc1_wclk_div", CLK_SDMMC1, 1); 613 587 clk[ZX296702_SDMMC1_PCLK] = 614 - zx_gate("sdmmc1_pclk", "lsp1_apb_pclk", CLK_SDMMC1, 0); 588 + zx_gate("sdmmc1_pclk", "lsp0_apb_pclk", CLK_SDMMC1, 0); 589 + 590 + clk[ZX296702_GPIO_CLK] = 591 + zx_gate("gpio_clk", "lsp0_apb_pclk", CLK_GPIO, 0); 592 + 593 + /* SPDIF */ 594 + clk[ZX296702_SPDIF0_WCLK_MUX] = 595 + zx_mux("spdif0_wclk_mux", spdif0_wclk_sel, 596 + ARRAY_SIZE(spdif0_wclk_sel), CLK_SPDIF0, 4, 1); 597 + clk[ZX296702_SPDIF0_WCLK] = 598 + zx_gate("spdif0_wclk", "spdif0_wclk_mux", CLK_SPDIF0, 1); 599 + clk[ZX296702_SPDIF0_PCLK] = 600 + zx_gate("spdif0_pclk", "lsp0_apb_pclk", CLK_SPDIF0, 0); 601 + 602 + clk[ZX296702_SPDIF0_DIV] = 603 + clk_register_zx_audio("spdif0_div", "spdif0_wclk", 0, 604 + SPDIF0_DIV); 605 + 606 + /* I2S */ 607 + clk[ZX296702_I2S0_WCLK_MUX] = 608 + zx_mux("i2s0_wclk_mux", i2s_wclk_sel, 609 + ARRAY_SIZE(i2s_wclk_sel), CLK_I2S0, 4, 1); 610 + clk[ZX296702_I2S0_WCLK] = 611 + zx_gate("i2s0_wclk", "i2s0_wclk_mux", CLK_I2S0, 1); 612 + clk[ZX296702_I2S0_PCLK] = 613 + zx_gate("i2s0_pclk", "lsp0_apb_pclk", CLK_I2S0, 0); 614 + 615 + clk[ZX296702_I2S0_DIV] = 616 + clk_register_zx_audio("i2s0_div", "i2s0_wclk", 0, I2S0_DIV); 617 + 618 + clk[ZX296702_I2S1_WCLK_MUX] = 619 + zx_mux("i2s1_wclk_mux", i2s_wclk_sel, 620 + ARRAY_SIZE(i2s_wclk_sel), CLK_I2S1, 4, 1); 621 + clk[ZX296702_I2S1_WCLK] = 622 + zx_gate("i2s1_wclk", "i2s1_wclk_mux", CLK_I2S1, 1); 623 + clk[ZX296702_I2S1_PCLK] = 624 + zx_gate("i2s1_pclk", "lsp0_apb_pclk", CLK_I2S1, 0); 625 + 626 + clk[ZX296702_I2S1_DIV] = 627 + clk_register_zx_audio("i2s1_div", "i2s1_wclk", 0, I2S1_DIV); 628 + 629 + clk[ZX296702_I2S2_WCLK_MUX] = 630 + zx_mux("i2s2_wclk_mux", i2s_wclk_sel, 631 + ARRAY_SIZE(i2s_wclk_sel), CLK_I2S2, 4, 1); 632 + clk[ZX296702_I2S2_WCLK] = 633 + zx_gate("i2s2_wclk", "i2s2_wclk_mux", CLK_I2S2, 1); 634 + clk[ZX296702_I2S2_PCLK] = 635 + zx_gate("i2s2_pclk", "lsp0_apb_pclk", CLK_I2S2, 0); 636 + 637 + clk[ZX296702_I2S2_DIV] = 638 + clk_register_zx_audio("i2s2_div", "i2s2_wclk", 0, I2S2_DIV); 615 639 616 640 for (i = 0; i < ARRAY_SIZE(lsp0clk); i++) { 617 641 if (IS_ERR(clk[i])) { ··· 716 640 zx_gate("sdmmc0_wclk", "sdmmc0_wclk_div", CLK_SDMMC0, 1); 717 641 clk[ZX296702_SDMMC0_PCLK] = 718 642 zx_gate("sdmmc0_pclk", "lsp1_apb_pclk", CLK_SDMMC0, 0); 643 + 644 + clk[ZX296702_SPDIF1_WCLK_MUX] = 645 + zx_mux("spdif1_wclk_mux", spdif1_wclk_sel, 646 + ARRAY_SIZE(spdif1_wclk_sel), CLK_SPDIF1, 4, 1); 647 + clk[ZX296702_SPDIF1_WCLK] = 648 + zx_gate("spdif1_wclk", "spdif1_wclk_mux", CLK_SPDIF1, 1); 649 + clk[ZX296702_SPDIF1_PCLK] = 650 + zx_gate("spdif1_pclk", "lsp1_apb_pclk", CLK_SPDIF1, 0); 651 + 652 + clk[ZX296702_SPDIF1_DIV] = 653 + clk_register_zx_audio("spdif1_div", "spdif1_wclk", 0, 654 + SPDIF1_DIV); 719 655 720 656 for (i = 0; i < ARRAY_SIZE(lsp1clk); i++) { 721 657 if (IS_ERR(clk[i])) {
+15 -2
include/dt-bindings/clock/zx296702-clock.h
··· 153 153 #define ZX296702_I2S0_WCLK 9 154 154 #define ZX296702_I2S0_PCLK 10 155 155 #define ZX296702_I2S0_DIV 11 156 - #define ZX296702_LSP0CLK_END 12 156 + #define ZX296702_I2S1_WCLK_MUX 12 157 + #define ZX296702_I2S1_WCLK 13 158 + #define ZX296702_I2S1_PCLK 14 159 + #define ZX296702_I2S1_DIV 15 160 + #define ZX296702_I2S2_WCLK_MUX 16 161 + #define ZX296702_I2S2_WCLK 17 162 + #define ZX296702_I2S2_PCLK 18 163 + #define ZX296702_I2S2_DIV 19 164 + #define ZX296702_GPIO_CLK 20 165 + #define ZX296702_LSP0CLK_END 21 157 166 158 167 #define ZX296702_UART0_WCLK_MUX 0 159 168 #define ZX296702_UART0_WCLK 1 ··· 174 165 #define ZX296702_SDMMC0_WCLK_DIV 7 175 166 #define ZX296702_SDMMC0_WCLK 8 176 167 #define ZX296702_SDMMC0_PCLK 9 177 - #define ZX296702_LSP1CLK_END 10 168 + #define ZX296702_SPDIF1_WCLK_MUX 10 169 + #define ZX296702_SPDIF1_WCLK 11 170 + #define ZX296702_SPDIF1_PCLK 12 171 + #define ZX296702_SPDIF1_DIV 13 172 + #define ZX296702_LSP1CLK_END 14 178 173 179 174 #endif /* __DT_BINDINGS_CLOCK_ZX296702_H */