Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * r8a7796 (R-Car M3-W/W+) Clock Pulse Generator / Module Standby and Software
0004  * Reset
0005  *
0006  * Copyright (C) 2016-2019 Glider bvba
0007  * Copyright (C) 2018-2019 Renesas Electronics Corp.
0008  *
0009  * Based on r8a7795-cpg-mssr.c
0010  *
0011  * Copyright (C) 2015 Glider bvba
0012  * Copyright (C) 2015 Renesas Electronics Corp.
0013  */
0014 
0015 #include <linux/device.h>
0016 #include <linux/init.h>
0017 #include <linux/kernel.h>
0018 #include <linux/of.h>
0019 #include <linux/soc/renesas/rcar-rst.h>
0020 
0021 #include <dt-bindings/clock/r8a7796-cpg-mssr.h>
0022 
0023 #include "renesas-cpg-mssr.h"
0024 #include "rcar-gen3-cpg.h"
0025 
0026 enum clk_ids {
0027     /* Core Clock Outputs exported to DT */
0028     LAST_DT_CORE_CLK = R8A7796_CLK_OSC,
0029 
0030     /* External Input Clocks */
0031     CLK_EXTAL,
0032     CLK_EXTALR,
0033 
0034     /* Internal Core Clocks */
0035     CLK_MAIN,
0036     CLK_PLL0,
0037     CLK_PLL1,
0038     CLK_PLL2,
0039     CLK_PLL3,
0040     CLK_PLL4,
0041     CLK_PLL1_DIV2,
0042     CLK_PLL1_DIV4,
0043     CLK_S0,
0044     CLK_S1,
0045     CLK_S2,
0046     CLK_S3,
0047     CLK_SDSRC,
0048     CLK_SSPSRC,
0049     CLK_RPCSRC,
0050     CLK_RINT,
0051 
0052     /* Module Clocks */
0053     MOD_CLK_BASE
0054 };
0055 
0056 static const struct cpg_core_clk r8a7796_core_clks[] __initconst = {
0057     /* External Clock Inputs */
0058     DEF_INPUT("extal",      CLK_EXTAL),
0059     DEF_INPUT("extalr",     CLK_EXTALR),
0060 
0061     /* Internal Core Clocks */
0062     DEF_BASE(".main",       CLK_MAIN, CLK_TYPE_GEN3_MAIN, CLK_EXTAL),
0063     DEF_BASE(".pll0",       CLK_PLL0, CLK_TYPE_GEN3_PLL0, CLK_MAIN),
0064     DEF_BASE(".pll1",       CLK_PLL1, CLK_TYPE_GEN3_PLL1, CLK_MAIN),
0065     DEF_BASE(".pll2",       CLK_PLL2, CLK_TYPE_GEN3_PLL2, CLK_MAIN),
0066     DEF_BASE(".pll3",       CLK_PLL3, CLK_TYPE_GEN3_PLL3, CLK_MAIN),
0067     DEF_BASE(".pll4",       CLK_PLL4, CLK_TYPE_GEN3_PLL4, CLK_MAIN),
0068 
0069     DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2,     CLK_PLL1,       2, 1),
0070     DEF_FIXED(".pll1_div4", CLK_PLL1_DIV4,     CLK_PLL1_DIV2,  2, 1),
0071     DEF_FIXED(".s0",        CLK_S0,            CLK_PLL1_DIV2,  2, 1),
0072     DEF_FIXED(".s1",        CLK_S1,            CLK_PLL1_DIV2,  3, 1),
0073     DEF_FIXED(".s2",        CLK_S2,            CLK_PLL1_DIV2,  4, 1),
0074     DEF_FIXED(".s3",        CLK_S3,            CLK_PLL1_DIV2,  6, 1),
0075     DEF_FIXED(".sdsrc",     CLK_SDSRC,         CLK_PLL1_DIV2,  2, 1),
0076 
0077     DEF_BASE(".rpcsrc",     CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1),
0078 
0079     DEF_GEN3_OSC(".r",      CLK_RINT,          CLK_EXTAL,      32),
0080 
0081     /* Core Clock Outputs */
0082     DEF_GEN3_Z("z",         R8A7796_CLK_Z,     CLK_TYPE_GEN3_Z,  CLK_PLL0, 2, 8),
0083     DEF_GEN3_Z("z2",        R8A7796_CLK_Z2,    CLK_TYPE_GEN3_Z,  CLK_PLL2, 2, 0),
0084     DEF_FIXED("ztr",        R8A7796_CLK_ZTR,   CLK_PLL1_DIV2,  6, 1),
0085     DEF_FIXED("ztrd2",      R8A7796_CLK_ZTRD2, CLK_PLL1_DIV2, 12, 1),
0086     DEF_FIXED("zt",         R8A7796_CLK_ZT,    CLK_PLL1_DIV2,  4, 1),
0087     DEF_FIXED("zx",         R8A7796_CLK_ZX,    CLK_PLL1_DIV2,  2, 1),
0088     DEF_FIXED("s0d1",       R8A7796_CLK_S0D1,  CLK_S0,         1, 1),
0089     DEF_FIXED("s0d2",       R8A7796_CLK_S0D2,  CLK_S0,         2, 1),
0090     DEF_FIXED("s0d3",       R8A7796_CLK_S0D3,  CLK_S0,         3, 1),
0091     DEF_FIXED("s0d4",       R8A7796_CLK_S0D4,  CLK_S0,         4, 1),
0092     DEF_FIXED("s0d6",       R8A7796_CLK_S0D6,  CLK_S0,         6, 1),
0093     DEF_FIXED("s0d8",       R8A7796_CLK_S0D8,  CLK_S0,         8, 1),
0094     DEF_FIXED("s0d12",      R8A7796_CLK_S0D12, CLK_S0,        12, 1),
0095     DEF_FIXED("s1d1",       R8A7796_CLK_S1D1,  CLK_S1,         1, 1),
0096     DEF_FIXED("s1d2",       R8A7796_CLK_S1D2,  CLK_S1,         2, 1),
0097     DEF_FIXED("s1d4",       R8A7796_CLK_S1D4,  CLK_S1,         4, 1),
0098     DEF_FIXED("s2d1",       R8A7796_CLK_S2D1,  CLK_S2,         1, 1),
0099     DEF_FIXED("s2d2",       R8A7796_CLK_S2D2,  CLK_S2,         2, 1),
0100     DEF_FIXED("s2d4",       R8A7796_CLK_S2D4,  CLK_S2,         4, 1),
0101     DEF_FIXED("s3d1",       R8A7796_CLK_S3D1,  CLK_S3,         1, 1),
0102     DEF_FIXED("s3d2",       R8A7796_CLK_S3D2,  CLK_S3,         2, 1),
0103     DEF_FIXED("s3d4",       R8A7796_CLK_S3D4,  CLK_S3,         4, 1),
0104 
0105     DEF_GEN3_SDH("sd0h",    R8A7796_CLK_SD0H,  CLK_SDSRC,        0x074),
0106     DEF_GEN3_SDH("sd1h",    R8A7796_CLK_SD1H,  CLK_SDSRC,        0x078),
0107     DEF_GEN3_SDH("sd2h",    R8A7796_CLK_SD2H,  CLK_SDSRC,        0x268),
0108     DEF_GEN3_SDH("sd3h",    R8A7796_CLK_SD3H,  CLK_SDSRC,        0x26c),
0109     DEF_GEN3_SD("sd0",      R8A7796_CLK_SD0,   R8A7796_CLK_SD0H, 0x074),
0110     DEF_GEN3_SD("sd1",      R8A7796_CLK_SD1,   R8A7796_CLK_SD1H, 0x078),
0111     DEF_GEN3_SD("sd2",      R8A7796_CLK_SD2,   R8A7796_CLK_SD2H, 0x268),
0112     DEF_GEN3_SD("sd3",      R8A7796_CLK_SD3,   R8A7796_CLK_SD3H, 0x26c),
0113 
0114     DEF_BASE("rpc",         R8A7796_CLK_RPC,   CLK_TYPE_GEN3_RPC,   CLK_RPCSRC),
0115     DEF_BASE("rpcd2",       R8A7796_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2, R8A7796_CLK_RPC),
0116 
0117     DEF_FIXED("cl",         R8A7796_CLK_CL,    CLK_PLL1_DIV2, 48, 1),
0118     DEF_FIXED("cr",         R8A7796_CLK_CR,    CLK_PLL1_DIV4,  2, 1),
0119     DEF_FIXED("cp",         R8A7796_CLK_CP,    CLK_EXTAL,      2, 1),
0120     DEF_FIXED("cpex",       R8A7796_CLK_CPEX,  CLK_EXTAL,      2, 1),
0121 
0122     DEF_DIV6P1("canfd",     R8A7796_CLK_CANFD, CLK_PLL1_DIV4, 0x244),
0123     DEF_DIV6P1("csi0",      R8A7796_CLK_CSI0,  CLK_PLL1_DIV4, 0x00c),
0124     DEF_DIV6P1("mso",       R8A7796_CLK_MSO,   CLK_PLL1_DIV4, 0x014),
0125     DEF_DIV6P1("hdmi",      R8A7796_CLK_HDMI,  CLK_PLL1_DIV4, 0x250),
0126 
0127     DEF_GEN3_OSC("osc",     R8A7796_CLK_OSC,   CLK_EXTAL,     8),
0128 
0129     DEF_BASE("r",           R8A7796_CLK_R,     CLK_TYPE_GEN3_R, CLK_RINT),
0130 };
0131 
0132 static struct mssr_mod_clk r8a7796_mod_clks[] __initdata = {
0133     DEF_MOD("fdp1-0",        119,   R8A7796_CLK_S0D1),
0134     DEF_MOD("tmu4",          121,   R8A7796_CLK_S0D6),
0135     DEF_MOD("tmu3",          122,   R8A7796_CLK_S3D2),
0136     DEF_MOD("tmu2",          123,   R8A7796_CLK_S3D2),
0137     DEF_MOD("tmu1",          124,   R8A7796_CLK_S3D2),
0138     DEF_MOD("tmu0",          125,   R8A7796_CLK_CP),
0139     DEF_MOD("scif5",         202,   R8A7796_CLK_S3D4),
0140     DEF_MOD("scif4",         203,   R8A7796_CLK_S3D4),
0141     DEF_MOD("scif3",         204,   R8A7796_CLK_S3D4),
0142     DEF_MOD("scif1",         206,   R8A7796_CLK_S3D4),
0143     DEF_MOD("scif0",         207,   R8A7796_CLK_S3D4),
0144     DEF_MOD("msiof3",        208,   R8A7796_CLK_MSO),
0145     DEF_MOD("msiof2",        209,   R8A7796_CLK_MSO),
0146     DEF_MOD("msiof1",        210,   R8A7796_CLK_MSO),
0147     DEF_MOD("msiof0",        211,   R8A7796_CLK_MSO),
0148     DEF_MOD("sys-dmac2",         217,   R8A7796_CLK_S3D1),
0149     DEF_MOD("sys-dmac1",         218,   R8A7796_CLK_S3D1),
0150     DEF_MOD("sys-dmac0",         219,   R8A7796_CLK_S0D3),
0151     DEF_MOD("sceg-pub",      229,   R8A7796_CLK_CR),
0152     DEF_MOD("cmt3",          300,   R8A7796_CLK_R),
0153     DEF_MOD("cmt2",          301,   R8A7796_CLK_R),
0154     DEF_MOD("cmt1",          302,   R8A7796_CLK_R),
0155     DEF_MOD("cmt0",          303,   R8A7796_CLK_R),
0156     DEF_MOD("tpu0",          304,   R8A7796_CLK_S3D4),
0157     DEF_MOD("scif2",         310,   R8A7796_CLK_S3D4),
0158     DEF_MOD("sdif3",         311,   R8A7796_CLK_SD3),
0159     DEF_MOD("sdif2",         312,   R8A7796_CLK_SD2),
0160     DEF_MOD("sdif1",         313,   R8A7796_CLK_SD1),
0161     DEF_MOD("sdif0",         314,   R8A7796_CLK_SD0),
0162     DEF_MOD("pcie1",         318,   R8A7796_CLK_S3D1),
0163     DEF_MOD("pcie0",         319,   R8A7796_CLK_S3D1),
0164     DEF_MOD("usb3-if0",      328,   R8A7796_CLK_S3D1),
0165     DEF_MOD("usb-dmac0",         330,   R8A7796_CLK_S3D1),
0166     DEF_MOD("usb-dmac1",         331,   R8A7796_CLK_S3D1),
0167     DEF_MOD("rwdt",          402,   R8A7796_CLK_R),
0168     DEF_MOD("intc-ex",       407,   R8A7796_CLK_CP),
0169     DEF_MOD("intc-ap",       408,   R8A7796_CLK_S0D3),
0170     DEF_MOD("audmac1",       501,   R8A7796_CLK_S1D2),
0171     DEF_MOD("audmac0",       502,   R8A7796_CLK_S1D2),
0172     DEF_MOD("drif31",        508,   R8A7796_CLK_S3D2),
0173     DEF_MOD("drif30",        509,   R8A7796_CLK_S3D2),
0174     DEF_MOD("drif21",        510,   R8A7796_CLK_S3D2),
0175     DEF_MOD("drif20",        511,   R8A7796_CLK_S3D2),
0176     DEF_MOD("drif11",        512,   R8A7796_CLK_S3D2),
0177     DEF_MOD("drif10",        513,   R8A7796_CLK_S3D2),
0178     DEF_MOD("drif01",        514,   R8A7796_CLK_S3D2),
0179     DEF_MOD("drif00",        515,   R8A7796_CLK_S3D2),
0180     DEF_MOD("hscif4",        516,   R8A7796_CLK_S3D1),
0181     DEF_MOD("hscif3",        517,   R8A7796_CLK_S3D1),
0182     DEF_MOD("hscif2",        518,   R8A7796_CLK_S3D1),
0183     DEF_MOD("hscif1",        519,   R8A7796_CLK_S3D1),
0184     DEF_MOD("hscif0",        520,   R8A7796_CLK_S3D1),
0185     DEF_MOD("thermal",       522,   R8A7796_CLK_CP),
0186     DEF_MOD("pwm",           523,   R8A7796_CLK_S0D12),
0187     DEF_MOD("fcpvd2",        601,   R8A7796_CLK_S0D2),
0188     DEF_MOD("fcpvd1",        602,   R8A7796_CLK_S0D2),
0189     DEF_MOD("fcpvd0",        603,   R8A7796_CLK_S0D2),
0190     DEF_MOD("fcpvb0",        607,   R8A7796_CLK_S0D1),
0191     DEF_MOD("fcpvi0",        611,   R8A7796_CLK_S0D1),
0192     DEF_MOD("fcpf0",         615,   R8A7796_CLK_S0D1),
0193     DEF_MOD("fcpci0",        617,   R8A7796_CLK_S0D2),
0194     DEF_MOD("fcpcs",         619,   R8A7796_CLK_S0D2),
0195     DEF_MOD("vspd2",         621,   R8A7796_CLK_S0D2),
0196     DEF_MOD("vspd1",         622,   R8A7796_CLK_S0D2),
0197     DEF_MOD("vspd0",         623,   R8A7796_CLK_S0D2),
0198     DEF_MOD("vspb",          626,   R8A7796_CLK_S0D1),
0199     DEF_MOD("vspi0",         631,   R8A7796_CLK_S0D1),
0200     DEF_MOD("ehci1",         702,   R8A7796_CLK_S3D2),
0201     DEF_MOD("ehci0",         703,   R8A7796_CLK_S3D2),
0202     DEF_MOD("hsusb",         704,   R8A7796_CLK_S3D2),
0203     DEF_MOD("cmm2",          709,   R8A7796_CLK_S2D1),
0204     DEF_MOD("cmm1",          710,   R8A7796_CLK_S2D1),
0205     DEF_MOD("cmm0",          711,   R8A7796_CLK_S2D1),
0206     DEF_MOD("csi20",         714,   R8A7796_CLK_CSI0),
0207     DEF_MOD("csi40",         716,   R8A7796_CLK_CSI0),
0208     DEF_MOD("du2",           722,   R8A7796_CLK_S2D1),
0209     DEF_MOD("du1",           723,   R8A7796_CLK_S2D1),
0210     DEF_MOD("du0",           724,   R8A7796_CLK_S2D1),
0211     DEF_MOD("lvds",          727,   R8A7796_CLK_S2D1),
0212     DEF_MOD("hdmi0",         729,   R8A7796_CLK_HDMI),
0213     DEF_MOD("mlp",           802,   R8A7796_CLK_S2D1),
0214     DEF_MOD("vin7",          804,   R8A7796_CLK_S0D2),
0215     DEF_MOD("vin6",          805,   R8A7796_CLK_S0D2),
0216     DEF_MOD("vin5",          806,   R8A7796_CLK_S0D2),
0217     DEF_MOD("vin4",          807,   R8A7796_CLK_S0D2),
0218     DEF_MOD("vin3",          808,   R8A7796_CLK_S0D2),
0219     DEF_MOD("vin2",          809,   R8A7796_CLK_S0D2),
0220     DEF_MOD("vin1",          810,   R8A7796_CLK_S0D2),
0221     DEF_MOD("vin0",          811,   R8A7796_CLK_S0D2),
0222     DEF_MOD("etheravb",      812,   R8A7796_CLK_S0D6),
0223     DEF_MOD("imr1",          822,   R8A7796_CLK_S0D2),
0224     DEF_MOD("imr0",          823,   R8A7796_CLK_S0D2),
0225     DEF_MOD("gpio7",         905,   R8A7796_CLK_S3D4),
0226     DEF_MOD("gpio6",         906,   R8A7796_CLK_S3D4),
0227     DEF_MOD("gpio5",         907,   R8A7796_CLK_S3D4),
0228     DEF_MOD("gpio4",         908,   R8A7796_CLK_S3D4),
0229     DEF_MOD("gpio3",         909,   R8A7796_CLK_S3D4),
0230     DEF_MOD("gpio2",         910,   R8A7796_CLK_S3D4),
0231     DEF_MOD("gpio1",         911,   R8A7796_CLK_S3D4),
0232     DEF_MOD("gpio0",         912,   R8A7796_CLK_S3D4),
0233     DEF_MOD("can-fd",        914,   R8A7796_CLK_S3D2),
0234     DEF_MOD("can-if1",       915,   R8A7796_CLK_S3D4),
0235     DEF_MOD("can-if0",       916,   R8A7796_CLK_S3D4),
0236     DEF_MOD("rpc-if",        917,   R8A7796_CLK_RPCD2),
0237     DEF_MOD("i2c6",          918,   R8A7796_CLK_S0D6),
0238     DEF_MOD("i2c5",          919,   R8A7796_CLK_S0D6),
0239     DEF_MOD("i2c-dvfs",      926,   R8A7796_CLK_CP),
0240     DEF_MOD("i2c4",          927,   R8A7796_CLK_S0D6),
0241     DEF_MOD("i2c3",          928,   R8A7796_CLK_S0D6),
0242     DEF_MOD("i2c2",          929,   R8A7796_CLK_S3D2),
0243     DEF_MOD("i2c1",          930,   R8A7796_CLK_S3D2),
0244     DEF_MOD("i2c0",          931,   R8A7796_CLK_S3D2),
0245     DEF_MOD("ssi-all",      1005,   R8A7796_CLK_S3D4),
0246     DEF_MOD("ssi9",         1006,   MOD_CLK_ID(1005)),
0247     DEF_MOD("ssi8",         1007,   MOD_CLK_ID(1005)),
0248     DEF_MOD("ssi7",         1008,   MOD_CLK_ID(1005)),
0249     DEF_MOD("ssi6",         1009,   MOD_CLK_ID(1005)),
0250     DEF_MOD("ssi5",         1010,   MOD_CLK_ID(1005)),
0251     DEF_MOD("ssi4",         1011,   MOD_CLK_ID(1005)),
0252     DEF_MOD("ssi3",         1012,   MOD_CLK_ID(1005)),
0253     DEF_MOD("ssi2",         1013,   MOD_CLK_ID(1005)),
0254     DEF_MOD("ssi1",         1014,   MOD_CLK_ID(1005)),
0255     DEF_MOD("ssi0",         1015,   MOD_CLK_ID(1005)),
0256     DEF_MOD("scu-all",      1017,   R8A7796_CLK_S3D4),
0257     DEF_MOD("scu-dvc1",     1018,   MOD_CLK_ID(1017)),
0258     DEF_MOD("scu-dvc0",     1019,   MOD_CLK_ID(1017)),
0259     DEF_MOD("scu-ctu1-mix1",    1020,   MOD_CLK_ID(1017)),
0260     DEF_MOD("scu-ctu0-mix0",    1021,   MOD_CLK_ID(1017)),
0261     DEF_MOD("scu-src9",     1022,   MOD_CLK_ID(1017)),
0262     DEF_MOD("scu-src8",     1023,   MOD_CLK_ID(1017)),
0263     DEF_MOD("scu-src7",     1024,   MOD_CLK_ID(1017)),
0264     DEF_MOD("scu-src6",     1025,   MOD_CLK_ID(1017)),
0265     DEF_MOD("scu-src5",     1026,   MOD_CLK_ID(1017)),
0266     DEF_MOD("scu-src4",     1027,   MOD_CLK_ID(1017)),
0267     DEF_MOD("scu-src3",     1028,   MOD_CLK_ID(1017)),
0268     DEF_MOD("scu-src2",     1029,   MOD_CLK_ID(1017)),
0269     DEF_MOD("scu-src1",     1030,   MOD_CLK_ID(1017)),
0270     DEF_MOD("scu-src0",     1031,   MOD_CLK_ID(1017)),
0271 };
0272 
0273 static const unsigned int r8a7796_crit_mod_clks[] __initconst = {
0274     MOD_CLK_ID(402),    /* RWDT */
0275     MOD_CLK_ID(408),    /* INTC-AP (GIC) */
0276 };
0277 
0278 /*
0279  * CPG Clock Data
0280  */
0281 
0282 /*
0283  *   MD     EXTAL       PLL0    PLL1    PLL2    PLL3    PLL4    OSC
0284  * 14 13 19 17  (MHz)
0285  *-------------------------------------------------------------------------
0286  * 0  0  0  0   16.66 x 1   x180    x192    x144    x192    x144    /16
0287  * 0  0  0  1   16.66 x 1   x180    x192    x144    x128    x144    /16
0288  * 0  0  1  0   Prohibited setting
0289  * 0  0  1  1   16.66 x 1   x180    x192    x144    x192    x144    /16
0290  * 0  1  0  0   20    x 1   x150    x160    x120    x160    x120    /19
0291  * 0  1  0  1   20    x 1   x150    x160    x120    x106    x120    /19
0292  * 0  1  1  0   Prohibited setting
0293  * 0  1  1  1   20    x 1   x150    x160    x120    x160    x120    /19
0294  * 1  0  0  0   25    x 1   x120    x128    x96 x128    x96 /24
0295  * 1  0  0  1   25    x 1   x120    x128    x96 x84 x96 /24
0296  * 1  0  1  0   Prohibited setting
0297  * 1  0  1  1   25    x 1   x120    x128    x96 x128    x96 /24
0298  * 1  1  0  0   33.33 / 2   x180    x192    x144    x192    x144    /32
0299  * 1  1  0  1   33.33 / 2   x180    x192    x144    x128    x144    /32
0300  * 1  1  1  0   Prohibited setting
0301  * 1  1  1  1   33.33 / 2   x180    x192    x144    x192    x144    /32
0302  */
0303 #define CPG_PLL_CONFIG_INDEX(md)    ((((md) & BIT(14)) >> 11) | \
0304                      (((md) & BIT(13)) >> 11) | \
0305                      (((md) & BIT(19)) >> 18) | \
0306                      (((md) & BIT(17)) >> 17))
0307 
0308 static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[16] __initconst = {
0309     /* EXTAL div    PLL1 mult/div   PLL3 mult/div   OSC prediv */
0310     { 1,        192,    1,  192,    1,  16, },
0311     { 1,        192,    1,  128,    1,  16, },
0312     { 0, /* Prohibited setting */               },
0313     { 1,        192,    1,  192,    1,  16, },
0314     { 1,        160,    1,  160,    1,  19, },
0315     { 1,        160,    1,  106,    1,  19, },
0316     { 0, /* Prohibited setting */               },
0317     { 1,        160,    1,  160,    1,  19, },
0318     { 1,        128,    1,  128,    1,  24, },
0319     { 1,        128,    1,  84, 1,  24, },
0320     { 0, /* Prohibited setting */               },
0321     { 1,        128,    1,  128,    1,  24, },
0322     { 2,        192,    1,  192,    1,  32, },
0323     { 2,        192,    1,  128,    1,  32, },
0324     { 0, /* Prohibited setting */               },
0325     { 2,        192,    1,  192,    1,  32, },
0326 };
0327 
0328     /*
0329      * Fixups for R-Car M3-W+
0330      */
0331 
0332 static const unsigned int r8a77961_mod_nullify[] __initconst = {
0333     MOD_CLK_ID(617),            /* FCPCI0  */
0334 };
0335 
0336 static int __init r8a7796_cpg_mssr_init(struct device *dev)
0337 {
0338     const struct rcar_gen3_cpg_pll_config *cpg_pll_config;
0339     u32 cpg_mode;
0340     int error;
0341 
0342     error = rcar_rst_read_mode_pins(&cpg_mode);
0343     if (error)
0344         return error;
0345 
0346     cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)];
0347     if (!cpg_pll_config->extal_div) {
0348         dev_err(dev, "Prohibited setting (cpg_mode=0x%x)\n", cpg_mode);
0349         return -EINVAL;
0350     }
0351 
0352     if (of_device_is_compatible(dev->of_node, "renesas,r8a77961-cpg-mssr"))
0353         mssr_mod_nullify(r8a7796_mod_clks,
0354                  ARRAY_SIZE(r8a7796_mod_clks),
0355                  r8a77961_mod_nullify,
0356                  ARRAY_SIZE(r8a77961_mod_nullify));
0357 
0358     return rcar_gen3_cpg_init(cpg_pll_config, CLK_EXTALR, cpg_mode);
0359 }
0360 
0361 const struct cpg_mssr_info r8a7796_cpg_mssr_info __initconst = {
0362     /* Core Clocks */
0363     .core_clks = r8a7796_core_clks,
0364     .num_core_clks = ARRAY_SIZE(r8a7796_core_clks),
0365     .last_dt_core_clk = LAST_DT_CORE_CLK,
0366     .num_total_core_clks = MOD_CLK_BASE,
0367 
0368     /* Module Clocks */
0369     .mod_clks = r8a7796_mod_clks,
0370     .num_mod_clks = ARRAY_SIZE(r8a7796_mod_clks),
0371     .num_hw_mod_clks = 12 * 32,
0372 
0373     /* Critical Module Clocks */
0374     .crit_mod_clks = r8a7796_crit_mod_clks,
0375     .num_crit_mod_clks = ARRAY_SIZE(r8a7796_crit_mod_clks),
0376 
0377     /* Callbacks */
0378     .init = r8a7796_cpg_mssr_init,
0379     .cpg_clk_register = rcar_gen3_cpg_clk_register,
0380 };