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

powerpc/512x: clk: support MPC5121/5123/5125 SoC variants

improve the common clock support code for MPC512x

- expand the CCM register set declaration with MPC5125 related registers
(which reside in the previously "reserved" area)
- tell the MPC5121, MPC5123, and MPC5125 SoC variants apart, and derive
the availability of components and their clocks from the detected SoC
(MBX, AXE, VIU, SPDIF, PATA, SATA, PCI, second FEC, second SDHC,
number of PSC components, type of NAND flash controller,
interpretation of the CPMF bitfield, PSC/CAN mux0 stage input clocks,
output clocks on SoC pins)
- add backwards compatibility (allow operation against a device tree
which lacks clock related specs) for MPC5125 FECs, too

telling SoC variants apart and adjusting the clock tree's generation
occurs at runtime, a common generic binary supports all of the chips

the MPC5125 approach to the NFC clock (one register with two counters
for the high and low periods of the clock) is not implemented, as there
are no users and there is no common implementation which supports this
kind of clock -- the new implementation would be unused and could not
get verified, so it shall wait until there is demand

Signed-off-by: Gerhard Sittig <gsi@denx.de>
Acked-by: Mike Turquette <mturquette@linaro.org>
Signed-off-by: Anatolij Gustschin <agust@denx.de>

authored by

Gerhard Sittig and committed by
Anatolij Gustschin
319bbe0e 76922ebb

+309 -46
+6 -1
arch/powerpc/include/asm/mpc5121.h
··· 37 37 u32 cccr; /* CFM Clock Control Register */ 38 38 u32 dccr; /* DIU Clock Control Register */ 39 39 u32 mscan_ccr[4]; /* MSCAN Clock Control Registers */ 40 - u8 res[0x98]; /* Reserved */ 40 + u32 out_ccr[4]; /* OUT CLK Configure Registers */ 41 + u32 rsv0[2]; /* Reserved */ 42 + u32 scfr3; /* System Clock Frequency Register 3 */ 43 + u32 rsv1[3]; /* Reserved */ 44 + u32 spll_lock_cnt; /* System PLL Lock Counter */ 45 + u8 res[0x6c]; /* Reserved */ 41 46 }; 42 47 43 48 /*
+295 -44
arch/powerpc/platforms/512x/clock-commonclk.c
··· 36 36 #define NR_PSCS 12 37 37 #define NR_MSCANS 4 38 38 #define NR_SPDIFS 1 39 - #define NR_MCLKS (NR_PSCS + NR_MSCANS + NR_SPDIFS) 39 + #define NR_OUTCLK 4 40 + #define NR_MCLKS (NR_PSCS + NR_MSCANS + NR_SPDIFS + NR_OUTCLK) 40 41 41 42 /* extend the public set of clocks by adding internal slots for management */ 42 43 enum { ··· 47 46 MPC512x_CLK_DDR, 48 47 MPC512x_CLK_MEM, 49 48 MPC512x_CLK_IIM, 50 - MPC512x_CLK_SDHC_2, 51 49 /* intermediates in div+gate combos or fractional dividers */ 52 50 MPC512x_CLK_DDR_UG, 53 51 MPC512x_CLK_SDHC_x4, 54 52 MPC512x_CLK_SDHC_UG, 53 + MPC512x_CLK_SDHC2_UG, 55 54 MPC512x_CLK_DIU_x4, 56 55 MPC512x_CLK_DIU_UG, 57 56 MPC512x_CLK_MBX_BUS_UG, ··· 77 76 static struct mpc512x_ccm __iomem *clkregs; 78 77 static DEFINE_SPINLOCK(clklock); 79 78 79 + /* SoC variants {{{ */ 80 + 81 + /* 82 + * tell SoC variants apart as they are rather similar yet not identical, 83 + * cache the result in an enum to not repeatedly run the expensive OF test 84 + * 85 + * MPC5123 is an MPC5121 without the MBX graphics accelerator 86 + * 87 + * MPC5125 has many more differences: no MBX, no AXE, no VIU, no SPDIF, 88 + * no PATA, no SATA, no PCI, two FECs (of different compatibility name), 89 + * only 10 PSCs (of different compatibility name), two SDHCs, different 90 + * NFC IP block, output clocks, system PLL status query, different CPMF 91 + * interpretation, no CFM, different fourth PSC/CAN mux0 input -- yet 92 + * those differences can get folded into this clock provider support 93 + * code and don't warrant a separate highly redundant implementation 94 + */ 95 + 96 + static enum soc_type { 97 + MPC512x_SOC_MPC5121, 98 + MPC512x_SOC_MPC5123, 99 + MPC512x_SOC_MPC5125, 100 + } soc; 101 + 102 + static void mpc512x_clk_determine_soc(void) 103 + { 104 + if (of_machine_is_compatible("fsl,mpc5121")) { 105 + soc = MPC512x_SOC_MPC5121; 106 + return; 107 + } 108 + if (of_machine_is_compatible("fsl,mpc5123")) { 109 + soc = MPC512x_SOC_MPC5123; 110 + return; 111 + } 112 + if (of_machine_is_compatible("fsl,mpc5125")) { 113 + soc = MPC512x_SOC_MPC5125; 114 + return; 115 + } 116 + } 117 + 118 + static bool soc_has_mbx(void) 119 + { 120 + if (soc == MPC512x_SOC_MPC5121) 121 + return true; 122 + return false; 123 + } 124 + 125 + static bool soc_has_axe(void) 126 + { 127 + if (soc == MPC512x_SOC_MPC5125) 128 + return false; 129 + return true; 130 + } 131 + 132 + static bool soc_has_viu(void) 133 + { 134 + if (soc == MPC512x_SOC_MPC5125) 135 + return false; 136 + return true; 137 + } 138 + 139 + static bool soc_has_spdif(void) 140 + { 141 + if (soc == MPC512x_SOC_MPC5125) 142 + return false; 143 + return true; 144 + } 145 + 146 + static bool soc_has_pata(void) 147 + { 148 + if (soc == MPC512x_SOC_MPC5125) 149 + return false; 150 + return true; 151 + } 152 + 153 + static bool soc_has_sata(void) 154 + { 155 + if (soc == MPC512x_SOC_MPC5125) 156 + return false; 157 + return true; 158 + } 159 + 160 + static bool soc_has_pci(void) 161 + { 162 + if (soc == MPC512x_SOC_MPC5125) 163 + return false; 164 + return true; 165 + } 166 + 167 + static bool soc_has_fec2(void) 168 + { 169 + if (soc == MPC512x_SOC_MPC5125) 170 + return true; 171 + return false; 172 + } 173 + 174 + static int soc_max_pscnum(void) 175 + { 176 + if (soc == MPC512x_SOC_MPC5125) 177 + return 10; 178 + return 12; 179 + } 180 + 181 + static bool soc_has_sdhc2(void) 182 + { 183 + if (soc == MPC512x_SOC_MPC5125) 184 + return true; 185 + return false; 186 + } 187 + 188 + static bool soc_has_nfc_5125(void) 189 + { 190 + if (soc == MPC512x_SOC_MPC5125) 191 + return true; 192 + return false; 193 + } 194 + 195 + static bool soc_has_outclk(void) 196 + { 197 + if (soc == MPC512x_SOC_MPC5125) 198 + return true; 199 + return false; 200 + } 201 + 202 + static bool soc_has_cpmf_0_bypass(void) 203 + { 204 + if (soc == MPC512x_SOC_MPC5125) 205 + return true; 206 + return false; 207 + } 208 + 209 + static bool soc_has_mclk_mux0_canin(void) 210 + { 211 + if (soc == MPC512x_SOC_MPC5125) 212 + return true; 213 + return false; 214 + } 215 + 216 + /* }}} SoC variants */ 80 217 /* common clk API wrappers {{{ */ 81 218 82 219 /* convenience wrappers around the common clk API */ ··· 335 196 */ 336 197 static int get_cpmf_mult_x2(void) 337 198 { 338 - static int cpmf_to_mult[] = { 199 + static int cpmf_to_mult_x36[] = { 200 + /* 0b000 is "times 36" */ 339 201 72, 2, 2, 3, 4, 5, 6, 7, 340 202 }; 203 + static int cpmf_to_mult_0by[] = { 204 + /* 0b000 is "bypass" */ 205 + 2, 2, 2, 3, 4, 5, 6, 7, 206 + }; 207 + 208 + int *cpmf_to_mult; 341 209 int cpmf; 342 210 343 211 cpmf = get_bit_field(&clkregs->spmr, 16, 4); 212 + if (soc_has_cpmf_0_bypass()) 213 + cpmf_to_mult = cpmf_to_mult_0by; 214 + else 215 + cpmf_to_mult = cpmf_to_mult_x36; 344 216 return cpmf_to_mult[cpmf]; 345 217 } 346 218 ··· 497 347 * it's the very data type dictated by <linux/clk-provider.h>, 498 348 * "fixing" this warning will break compilation 499 349 */ 500 - static const char *parent_names_mux0[] = { 350 + static const char *parent_names_mux0_spdif[] = { 501 351 "sys", "ref", "psc-mclk-in", "spdif-tx", 352 + }; 353 + 354 + static const char *parent_names_mux0_canin[] = { 355 + "sys", "ref", "psc-mclk-in", "can-clk-in", 502 356 }; 503 357 504 358 enum mclk_type { 505 359 MCLK_TYPE_PSC, 506 360 MCLK_TYPE_MSCAN, 507 361 MCLK_TYPE_SPDIF, 362 + MCLK_TYPE_OUTCLK, 508 363 }; 509 364 510 365 struct mclk_setup_data { ··· 549 394 "spdif_mclk", \ 550 395 } 551 396 397 + #define MCLK_SETUP_DATA_OUTCLK(id) { \ 398 + MCLK_TYPE_OUTCLK, 0, \ 399 + "out" #id "-mux0", \ 400 + "out" #id "-en0", \ 401 + "out" #id "_mclk_div", \ 402 + { "out" #id "_mclk_div", "dummy", }, \ 403 + "out" #id "_clk", \ 404 + } 405 + 552 406 static struct mclk_setup_data mclk_psc_data[] = { 553 407 MCLK_SETUP_DATA_PSC(0), 554 408 MCLK_SETUP_DATA_PSC(1), ··· 582 418 583 419 static struct mclk_setup_data mclk_spdif_data[] = { 584 420 MCLK_SETUP_DATA_SPDIF, 421 + }; 422 + 423 + static struct mclk_setup_data mclk_outclk_data[] = { 424 + MCLK_SETUP_DATA_OUTCLK(0), 425 + MCLK_SETUP_DATA_OUTCLK(1), 426 + MCLK_SETUP_DATA_OUTCLK(2), 427 + MCLK_SETUP_DATA_OUTCLK(3), 585 428 }; 586 429 587 430 /* setup the MCLK clock subtree of an individual PSC/MSCAN/SPDIF */ ··· 617 446 clks_idx_int = MPC512x_CLK_MCLKS_FIRST 618 447 + (NR_PSCS + NR_MSCANS) * MCLK_MAX_IDX; 619 448 mccr_reg = &clkregs->spccr; 449 + break; 450 + case MCLK_TYPE_OUTCLK: 451 + clks_idx_pub = MPC512x_CLK_OUT0_CLK + idx; 452 + clks_idx_int = MPC512x_CLK_MCLKS_FIRST 453 + + (NR_PSCS + NR_MSCANS + NR_SPDIFS + idx) 454 + * MCLK_MAX_IDX; 455 + mccr_reg = &clkregs->out_ccr[idx]; 620 456 break; 621 457 default: 622 458 return; ··· 673 495 */ 674 496 clks[clks_idx_int + MCLK_IDX_MUX0] = mpc512x_clk_muxed( 675 497 entry->name_mux0, 676 - &parent_names_mux0[0], ARRAY_SIZE(parent_names_mux0), 498 + soc_has_mclk_mux0_canin() 499 + ? &parent_names_mux0_canin[0] 500 + : &parent_names_mux0_spdif[0], 501 + ARRAY_SIZE(parent_names_mux0_spdif), 677 502 mccr_reg, 14, 2); 678 503 clks[clks_idx_int + MCLK_IDX_EN0] = mpc512x_clk_gated( 679 504 entry->name_en0, entry->name_mux0, ··· 757 576 clks[MPC512x_CLK_SDHC_UG] = mpc512x_clk_divider("sdhc-ug", "sdhc-x4", 0, 758 577 &clkregs->scfr2, 1, 7, 759 578 CLK_DIVIDER_ONE_BASED); 579 + if (soc_has_sdhc2()) { 580 + clks[MPC512x_CLK_SDHC2_UG] = mpc512x_clk_divider( 581 + "sdhc2-ug", "sdhc-x4", 0, &clkregs->scfr2, 582 + 9, 7, CLK_DIVIDER_ONE_BASED); 583 + } 584 + 760 585 clks[MPC512x_CLK_DIU_x4] = mpc512x_clk_factor("diu-x4", "csb", 4, 1); 761 586 clks[MPC512x_CLK_DIU_UG] = mpc512x_clk_divider("diu-ug", "diu-x4", 0, 762 587 &clkregs->scfr1, 0, 8, ··· 779 592 div = 2; /* compensate for the fractional factor */ 780 593 clks[MPC512x_CLK_E300] = mpc512x_clk_factor("e300", "csb", mul, div); 781 594 782 - clks[MPC512x_CLK_MBX_BUS_UG] = mpc512x_clk_factor("mbx-bus-ug", "csb", 783 - 1, 2); 784 - clks[MPC512x_CLK_MBX_UG] = mpc512x_clk_divtable("mbx-ug", "mbx-bus-ug", 785 - &clkregs->scfr1, 14, 3, 786 - divtab_1234); 787 - clks[MPC512x_CLK_MBX_3D_UG] = mpc512x_clk_factor("mbx-3d-ug", "mbx-ug", 788 - 1, 1); 789 - clks[MPC512x_CLK_PCI_UG] = mpc512x_clk_divtable("pci-ug", "csb", 790 - &clkregs->scfr1, 20, 3, 791 - divtab_2346); 792 - clks[MPC512x_CLK_NFC_UG] = mpc512x_clk_divtable("nfc-ug", "ips", 793 - &clkregs->scfr1, 8, 3, 794 - divtab_1234); 595 + if (soc_has_mbx()) { 596 + clks[MPC512x_CLK_MBX_BUS_UG] = mpc512x_clk_factor( 597 + "mbx-bus-ug", "csb", 1, 2); 598 + clks[MPC512x_CLK_MBX_UG] = mpc512x_clk_divtable( 599 + "mbx-ug", "mbx-bus-ug", &clkregs->scfr1, 600 + 14, 3, divtab_1234); 601 + clks[MPC512x_CLK_MBX_3D_UG] = mpc512x_clk_factor( 602 + "mbx-3d-ug", "mbx-ug", 1, 1); 603 + } 604 + if (soc_has_pci()) { 605 + clks[MPC512x_CLK_PCI_UG] = mpc512x_clk_divtable( 606 + "pci-ug", "csb", &clkregs->scfr1, 607 + 20, 3, divtab_2346); 608 + } 609 + if (soc_has_nfc_5125()) { 610 + /* 611 + * XXX TODO implement 5125 NFC clock setup logic, 612 + * with high/low period counters in clkregs->scfr3, 613 + * currently there are no users so it's ENOIMPL 614 + */ 615 + clks[MPC512x_CLK_NFC_UG] = ERR_PTR(-ENOTSUPP); 616 + } else { 617 + clks[MPC512x_CLK_NFC_UG] = mpc512x_clk_divtable( 618 + "nfc-ug", "ips", &clkregs->scfr1, 619 + 8, 3, divtab_1234); 620 + } 795 621 clks[MPC512x_CLK_LPC_UG] = mpc512x_clk_divtable("lpc-ug", "ips", 796 622 &clkregs->scfr1, 11, 3, 797 623 divtab_1234); ··· 813 613 &clkregs->sccr1, 30); 814 614 clks[MPC512x_CLK_NFC] = mpc512x_clk_gated("nfc", "nfc-ug", 815 615 &clkregs->sccr1, 29); 816 - clks[MPC512x_CLK_PATA] = mpc512x_clk_gated("pata", "ips", 817 - &clkregs->sccr1, 28); 616 + if (soc_has_pata()) { 617 + clks[MPC512x_CLK_PATA] = mpc512x_clk_gated( 618 + "pata", "ips", &clkregs->sccr1, 28); 619 + } 818 620 /* for PSCs there is a "registers" gate and a bitrate MCLK subtree */ 819 - for (mclk_idx = 0; mclk_idx < ARRAY_SIZE(mclk_psc_data); mclk_idx++) { 621 + for (mclk_idx = 0; mclk_idx < soc_max_pscnum(); mclk_idx++) { 820 622 char name[12]; 821 623 snprintf(name, sizeof(name), "psc%d", mclk_idx); 822 624 clks[MPC512x_CLK_PSC0 + mclk_idx] = mpc512x_clk_gated( ··· 827 625 } 828 626 clks[MPC512x_CLK_PSC_FIFO] = mpc512x_clk_gated("psc-fifo", "ips", 829 627 &clkregs->sccr1, 15); 830 - clks[MPC512x_CLK_SATA] = mpc512x_clk_gated("sata", "ips", 831 - &clkregs->sccr1, 14); 628 + if (soc_has_sata()) { 629 + clks[MPC512x_CLK_SATA] = mpc512x_clk_gated( 630 + "sata", "ips", &clkregs->sccr1, 14); 631 + } 832 632 clks[MPC512x_CLK_FEC] = mpc512x_clk_gated("fec", "ips", 833 633 &clkregs->sccr1, 13); 834 - clks[MPC512x_CLK_PCI] = mpc512x_clk_gated("pci", "pci-ug", 835 - &clkregs->sccr1, 11); 634 + if (soc_has_pci()) { 635 + clks[MPC512x_CLK_PCI] = mpc512x_clk_gated( 636 + "pci", "pci-ug", &clkregs->sccr1, 11); 637 + } 836 638 clks[MPC512x_CLK_DDR] = mpc512x_clk_gated("ddr", "ddr-ug", 837 639 &clkregs->sccr1, 10); 640 + if (soc_has_fec2()) { 641 + clks[MPC512x_CLK_FEC2] = mpc512x_clk_gated( 642 + "fec2", "ips", &clkregs->sccr1, 9); 643 + } 838 644 839 645 clks[MPC512x_CLK_DIU] = mpc512x_clk_gated("diu", "diu-ug", 840 646 &clkregs->sccr2, 31); 841 - clks[MPC512x_CLK_AXE] = mpc512x_clk_gated("axe", "csb", 842 - &clkregs->sccr2, 30); 647 + if (soc_has_axe()) { 648 + clks[MPC512x_CLK_AXE] = mpc512x_clk_gated( 649 + "axe", "csb", &clkregs->sccr2, 30); 650 + } 843 651 clks[MPC512x_CLK_MEM] = mpc512x_clk_gated("mem", "ips", 844 652 &clkregs->sccr2, 29); 845 653 clks[MPC512x_CLK_USB1] = mpc512x_clk_gated("usb1", "csb", ··· 866 654 clks[MPC512x_CLK_SDHC] = mpc512x_clk_gated("sdhc", "sdhc-ug", 867 655 &clkregs->sccr2, 24); 868 656 /* there is only one SPDIF component, which shares MCLK support code */ 869 - clks[MPC512x_CLK_SPDIF] = mpc512x_clk_gated("spdif", "ips", 870 - &clkregs->sccr2, 23); 871 - mpc512x_clk_setup_mclk(&mclk_spdif_data[0], 0); 872 - clks[MPC512x_CLK_MBX_BUS] = mpc512x_clk_gated("mbx-bus", "mbx-bus-ug", 873 - &clkregs->sccr2, 22); 874 - clks[MPC512x_CLK_MBX] = mpc512x_clk_gated("mbx", "mbx-ug", 875 - &clkregs->sccr2, 21); 876 - clks[MPC512x_CLK_MBX_3D] = mpc512x_clk_gated("mbx-3d", "mbx-3d-ug", 877 - &clkregs->sccr2, 20); 657 + if (soc_has_spdif()) { 658 + clks[MPC512x_CLK_SPDIF] = mpc512x_clk_gated( 659 + "spdif", "ips", &clkregs->sccr2, 23); 660 + mpc512x_clk_setup_mclk(&mclk_spdif_data[0], 0); 661 + } 662 + if (soc_has_mbx()) { 663 + clks[MPC512x_CLK_MBX_BUS] = mpc512x_clk_gated( 664 + "mbx-bus", "mbx-bus-ug", &clkregs->sccr2, 22); 665 + clks[MPC512x_CLK_MBX] = mpc512x_clk_gated( 666 + "mbx", "mbx-ug", &clkregs->sccr2, 21); 667 + clks[MPC512x_CLK_MBX_3D] = mpc512x_clk_gated( 668 + "mbx-3d", "mbx-3d-ug", &clkregs->sccr2, 20); 669 + } 878 670 clks[MPC512x_CLK_IIM] = mpc512x_clk_gated("iim", "csb", 879 671 &clkregs->sccr2, 19); 880 - clks[MPC512x_CLK_VIU] = mpc512x_clk_gated("viu", "csb", 881 - &clkregs->sccr2, 18); 882 - clks[MPC512x_CLK_SDHC_2] = mpc512x_clk_gated("sdhc-2", "sdhc-ug", 883 - &clkregs->sccr2, 17); 672 + if (soc_has_viu()) { 673 + clks[MPC512x_CLK_VIU] = mpc512x_clk_gated( 674 + "viu", "csb", &clkregs->sccr2, 18); 675 + } 676 + if (soc_has_sdhc2()) { 677 + clks[MPC512x_CLK_SDHC2] = mpc512x_clk_gated( 678 + "sdhc-2", "sdhc2-ug", &clkregs->sccr2, 17); 679 + } 680 + 681 + if (soc_has_outclk()) { 682 + size_t idx; /* used as mclk_idx, just to trim line length */ 683 + for (idx = 0; idx < ARRAY_SIZE(mclk_outclk_data); idx++) 684 + mpc512x_clk_setup_mclk(&mclk_outclk_data[idx], idx); 685 + } 884 686 885 687 /* 886 688 * externally provided clocks (when implemented in hardware, ··· 904 678 if (!freq) 905 679 freq = 25000000; 906 680 clks[MPC512x_CLK_PSC_MCLK_IN] = mpc512x_clk_fixed("psc_mclk_in", freq); 907 - freq = get_freq_from_dt("spdif_tx_in"); 908 - clks[MPC512x_CLK_SPDIF_TX_IN] = mpc512x_clk_fixed("spdif_tx_in", freq); 909 - freq = get_freq_from_dt("spdif_rx_in"); 910 - clks[MPC512x_CLK_SPDIF_TX_IN] = mpc512x_clk_fixed("spdif_rx_in", freq); 681 + if (soc_has_mclk_mux0_canin()) { 682 + freq = get_freq_from_dt("can_clk_in"); 683 + clks[MPC512x_CLK_CAN_CLK_IN] = mpc512x_clk_fixed( 684 + "can_clk_in", freq); 685 + } else { 686 + freq = get_freq_from_dt("spdif_tx_in"); 687 + clks[MPC512x_CLK_SPDIF_TX_IN] = mpc512x_clk_fixed( 688 + "spdif_tx_in", freq); 689 + freq = get_freq_from_dt("spdif_rx_in"); 690 + clks[MPC512x_CLK_SPDIF_TX_IN] = mpc512x_clk_fixed( 691 + "spdif_rx_in", freq); 692 + } 911 693 912 694 /* fixed frequency for AC97, always 24.567MHz */ 913 695 clks[MPC512x_CLK_AC97] = mpc512x_clk_fixed("ac97", 24567000); ··· 1117 883 NODE_PREP; 1118 884 NODE_CHK("per", clks[MPC512x_CLK_FEC], 0, FEC); 1119 885 } 886 + /* 887 + * MPC5125 has two FECs: FEC1 at 0x2800, FEC2 at 0x4800; 888 + * the clock items don't "form an array" since FEC2 was 889 + * added only later and was not allowed to shift all other 890 + * clock item indices, so the numbers aren't adjacent 891 + */ 892 + FOR_NODES("fsl,mpc5125-fec") { 893 + NODE_PREP; 894 + if (res.start & 0x4000) 895 + idx = MPC512x_CLK_FEC2; 896 + else 897 + idx = MPC512x_CLK_FEC; 898 + NODE_CHK("per", clks[idx], 0, FEC); 899 + } 1120 900 1121 901 FOR_NODES("fsl,mpc5121-usb2-dr") { 1122 902 NODE_PREP; ··· 1179 931 return -ENODEV; 1180 932 clkregs = of_iomap(clk_np, 0); 1181 933 WARN_ON(!clkregs); 934 + 935 + /* determine the SoC variant we run on */ 936 + mpc512x_clk_determine_soc(); 1182 937 1183 938 /* invalidate all not yet registered clock slots */ 1184 939 mpc512x_clk_preset_data();
+8 -1
include/dt-bindings/clock/mpc512x-clock.h
··· 63 63 #define MPC512x_CLK_PSC9 55 64 64 #define MPC512x_CLK_PSC10 56 65 65 #define MPC512x_CLK_PSC11 57 66 + #define MPC512x_CLK_SDHC2 58 67 + #define MPC512x_CLK_FEC2 59 68 + #define MPC512x_CLK_OUT0_CLK 60 69 + #define MPC512x_CLK_OUT1_CLK 61 70 + #define MPC512x_CLK_OUT2_CLK 62 71 + #define MPC512x_CLK_OUT3_CLK 63 72 + #define MPC512x_CLK_CAN_CLK_IN 64 66 73 67 - #define MPC512x_CLK_LAST_PUBLIC 57 74 + #define MPC512x_CLK_LAST_PUBLIC 64 68 75 69 76 #endif