Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * r8a7795 Clock Pulse Generator / Module Standby and Software Reset
0004  *
0005  * Copyright (C) 2015 Glider bvba
0006  * Copyright (C) 2018-2019 Renesas Electronics Corp.
0007  *
0008  * Based on clk-rcar-gen3.c
0009  *
0010  * Copyright (C) 2015 Renesas Electronics Corp.
0011  */
0012 
0013 #include <linux/device.h>
0014 #include <linux/init.h>
0015 #include <linux/kernel.h>
0016 #include <linux/soc/renesas/rcar-rst.h>
0017 #include <linux/sys_soc.h>
0018 
0019 #include <dt-bindings/clock/r8a7795-cpg-mssr.h>
0020 
0021 #include "renesas-cpg-mssr.h"
0022 #include "rcar-gen3-cpg.h"
0023 
0024 enum clk_ids {
0025     /* Core Clock Outputs exported to DT */
0026     LAST_DT_CORE_CLK = R8A7795_CLK_S0D12,
0027 
0028     /* External Input Clocks */
0029     CLK_EXTAL,
0030     CLK_EXTALR,
0031 
0032     /* Internal Core Clocks */
0033     CLK_MAIN,
0034     CLK_PLL0,
0035     CLK_PLL1,
0036     CLK_PLL2,
0037     CLK_PLL3,
0038     CLK_PLL4,
0039     CLK_PLL1_DIV2,
0040     CLK_PLL1_DIV4,
0041     CLK_S0,
0042     CLK_S1,
0043     CLK_S2,
0044     CLK_S3,
0045     CLK_SDSRC,
0046     CLK_SSPSRC,
0047     CLK_RPCSRC,
0048     CLK_RINT,
0049 
0050     /* Module Clocks */
0051     MOD_CLK_BASE
0052 };
0053 
0054 static struct cpg_core_clk r8a7795_core_clks[] __initdata = {
0055     /* External Clock Inputs */
0056     DEF_INPUT("extal",      CLK_EXTAL),
0057     DEF_INPUT("extalr",     CLK_EXTALR),
0058 
0059     /* Internal Core Clocks */
0060     DEF_BASE(".main",       CLK_MAIN, CLK_TYPE_GEN3_MAIN, CLK_EXTAL),
0061     DEF_BASE(".pll0",       CLK_PLL0, CLK_TYPE_GEN3_PLL0, CLK_MAIN),
0062     DEF_BASE(".pll1",       CLK_PLL1, CLK_TYPE_GEN3_PLL1, CLK_MAIN),
0063     DEF_BASE(".pll2",       CLK_PLL2, CLK_TYPE_GEN3_PLL2, CLK_MAIN),
0064     DEF_BASE(".pll3",       CLK_PLL3, CLK_TYPE_GEN3_PLL3, CLK_MAIN),
0065     DEF_BASE(".pll4",       CLK_PLL4, CLK_TYPE_GEN3_PLL4, CLK_MAIN),
0066 
0067     DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2,     CLK_PLL1,       2, 1),
0068     DEF_FIXED(".pll1_div4", CLK_PLL1_DIV4,     CLK_PLL1_DIV2,  2, 1),
0069     DEF_FIXED(".s0",        CLK_S0,            CLK_PLL1_DIV2,  2, 1),
0070     DEF_FIXED(".s1",        CLK_S1,            CLK_PLL1_DIV2,  3, 1),
0071     DEF_FIXED(".s2",        CLK_S2,            CLK_PLL1_DIV2,  4, 1),
0072     DEF_FIXED(".s3",        CLK_S3,            CLK_PLL1_DIV2,  6, 1),
0073     DEF_FIXED(".sdsrc",     CLK_SDSRC,         CLK_PLL1_DIV2,  2, 1),
0074 
0075     DEF_BASE(".rpcsrc",     CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1),
0076 
0077     DEF_GEN3_OSC(".r",      CLK_RINT,          CLK_EXTAL,      32),
0078 
0079     /* Core Clock Outputs */
0080     DEF_GEN3_Z("z",         R8A7795_CLK_Z,     CLK_TYPE_GEN3_Z,  CLK_PLL0, 2, 8),
0081     DEF_GEN3_Z("z2",        R8A7795_CLK_Z2,    CLK_TYPE_GEN3_Z,  CLK_PLL2, 2, 0),
0082     DEF_FIXED("ztr",        R8A7795_CLK_ZTR,   CLK_PLL1_DIV2,  6, 1),
0083     DEF_FIXED("ztrd2",      R8A7795_CLK_ZTRD2, CLK_PLL1_DIV2, 12, 1),
0084     DEF_FIXED("zt",         R8A7795_CLK_ZT,    CLK_PLL1_DIV2,  4, 1),
0085     DEF_FIXED("zx",         R8A7795_CLK_ZX,    CLK_PLL1_DIV2,  2, 1),
0086     DEF_FIXED("s0d1",       R8A7795_CLK_S0D1,  CLK_S0,         1, 1),
0087     DEF_FIXED("s0d2",       R8A7795_CLK_S0D2,  CLK_S0,         2, 1),
0088     DEF_FIXED("s0d3",       R8A7795_CLK_S0D3,  CLK_S0,         3, 1),
0089     DEF_FIXED("s0d4",       R8A7795_CLK_S0D4,  CLK_S0,         4, 1),
0090     DEF_FIXED("s0d6",       R8A7795_CLK_S0D6,  CLK_S0,         6, 1),
0091     DEF_FIXED("s0d8",       R8A7795_CLK_S0D8,  CLK_S0,         8, 1),
0092     DEF_FIXED("s0d12",      R8A7795_CLK_S0D12, CLK_S0,        12, 1),
0093     DEF_FIXED("s1d1",       R8A7795_CLK_S1D1,  CLK_S1,         1, 1),
0094     DEF_FIXED("s1d2",       R8A7795_CLK_S1D2,  CLK_S1,         2, 1),
0095     DEF_FIXED("s1d4",       R8A7795_CLK_S1D4,  CLK_S1,         4, 1),
0096     DEF_FIXED("s2d1",       R8A7795_CLK_S2D1,  CLK_S2,         1, 1),
0097     DEF_FIXED("s2d2",       R8A7795_CLK_S2D2,  CLK_S2,         2, 1),
0098     DEF_FIXED("s2d4",       R8A7795_CLK_S2D4,  CLK_S2,         4, 1),
0099     DEF_FIXED("s3d1",       R8A7795_CLK_S3D1,  CLK_S3,         1, 1),
0100     DEF_FIXED("s3d2",       R8A7795_CLK_S3D2,  CLK_S3,         2, 1),
0101     DEF_FIXED("s3d4",       R8A7795_CLK_S3D4,  CLK_S3,         4, 1),
0102 
0103     DEF_GEN3_SDH("sd0h",    R8A7795_CLK_SD0H,  CLK_SDSRC,        0x074),
0104     DEF_GEN3_SDH("sd1h",    R8A7795_CLK_SD1H,  CLK_SDSRC,        0x078),
0105     DEF_GEN3_SDH("sd2h",    R8A7795_CLK_SD2H,  CLK_SDSRC,        0x268),
0106     DEF_GEN3_SDH("sd3h",    R8A7795_CLK_SD3H,  CLK_SDSRC,        0x26c),
0107     DEF_GEN3_SD("sd0",      R8A7795_CLK_SD0,   R8A7795_CLK_SD0H, 0x074),
0108     DEF_GEN3_SD("sd1",      R8A7795_CLK_SD1,   R8A7795_CLK_SD1H, 0x078),
0109     DEF_GEN3_SD("sd2",      R8A7795_CLK_SD2,   R8A7795_CLK_SD2H, 0x268),
0110     DEF_GEN3_SD("sd3",      R8A7795_CLK_SD3,   R8A7795_CLK_SD3H, 0x26c),
0111 
0112     DEF_BASE("rpc",         R8A7795_CLK_RPC,   CLK_TYPE_GEN3_RPC,   CLK_RPCSRC),
0113     DEF_BASE("rpcd2",       R8A7795_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2, R8A7795_CLK_RPC),
0114 
0115     DEF_FIXED("cl",         R8A7795_CLK_CL,    CLK_PLL1_DIV2, 48, 1),
0116     DEF_FIXED("cr",         R8A7795_CLK_CR,    CLK_PLL1_DIV4,  2, 1),
0117     DEF_FIXED("cp",         R8A7795_CLK_CP,    CLK_EXTAL,      2, 1),
0118     DEF_FIXED("cpex",       R8A7795_CLK_CPEX,  CLK_EXTAL,      2, 1),
0119 
0120     DEF_DIV6P1("canfd",     R8A7795_CLK_CANFD, CLK_PLL1_DIV4, 0x244),
0121     DEF_DIV6P1("csi0",      R8A7795_CLK_CSI0,  CLK_PLL1_DIV4, 0x00c),
0122     DEF_DIV6P1("mso",       R8A7795_CLK_MSO,   CLK_PLL1_DIV4, 0x014),
0123     DEF_DIV6P1("hdmi",      R8A7795_CLK_HDMI,  CLK_PLL1_DIV4, 0x250),
0124 
0125     DEF_GEN3_OSC("osc",     R8A7795_CLK_OSC,   CLK_EXTAL,     8),
0126 
0127     DEF_BASE("r",           R8A7795_CLK_R,     CLK_TYPE_GEN3_R, CLK_RINT),
0128 };
0129 
0130 static struct mssr_mod_clk r8a7795_mod_clks[] __initdata = {
0131     DEF_MOD("fdp1-2",        117,   R8A7795_CLK_S2D1), /* ES1.x */
0132     DEF_MOD("fdp1-1",        118,   R8A7795_CLK_S0D1),
0133     DEF_MOD("fdp1-0",        119,   R8A7795_CLK_S0D1),
0134     DEF_MOD("tmu4",          121,   R8A7795_CLK_S0D6),
0135     DEF_MOD("tmu3",          122,   R8A7795_CLK_S3D2),
0136     DEF_MOD("tmu2",          123,   R8A7795_CLK_S3D2),
0137     DEF_MOD("tmu1",          124,   R8A7795_CLK_S3D2),
0138     DEF_MOD("tmu0",          125,   R8A7795_CLK_CP),
0139     DEF_MOD("scif5",         202,   R8A7795_CLK_S3D4),
0140     DEF_MOD("scif4",         203,   R8A7795_CLK_S3D4),
0141     DEF_MOD("scif3",         204,   R8A7795_CLK_S3D4),
0142     DEF_MOD("scif1",         206,   R8A7795_CLK_S3D4),
0143     DEF_MOD("scif0",         207,   R8A7795_CLK_S3D4),
0144     DEF_MOD("msiof3",        208,   R8A7795_CLK_MSO),
0145     DEF_MOD("msiof2",        209,   R8A7795_CLK_MSO),
0146     DEF_MOD("msiof1",        210,   R8A7795_CLK_MSO),
0147     DEF_MOD("msiof0",        211,   R8A7795_CLK_MSO),
0148     DEF_MOD("sys-dmac2",         217,   R8A7795_CLK_S3D1),
0149     DEF_MOD("sys-dmac1",         218,   R8A7795_CLK_S3D1),
0150     DEF_MOD("sys-dmac0",         219,   R8A7795_CLK_S0D3),
0151     DEF_MOD("sceg-pub",      229,   R8A7795_CLK_CR),
0152     DEF_MOD("cmt3",          300,   R8A7795_CLK_R),
0153     DEF_MOD("cmt2",          301,   R8A7795_CLK_R),
0154     DEF_MOD("cmt1",          302,   R8A7795_CLK_R),
0155     DEF_MOD("cmt0",          303,   R8A7795_CLK_R),
0156     DEF_MOD("tpu0",          304,   R8A7795_CLK_S3D4),
0157     DEF_MOD("scif2",         310,   R8A7795_CLK_S3D4),
0158     DEF_MOD("sdif3",         311,   R8A7795_CLK_SD3),
0159     DEF_MOD("sdif2",         312,   R8A7795_CLK_SD2),
0160     DEF_MOD("sdif1",         313,   R8A7795_CLK_SD1),
0161     DEF_MOD("sdif0",         314,   R8A7795_CLK_SD0),
0162     DEF_MOD("pcie1",         318,   R8A7795_CLK_S3D1),
0163     DEF_MOD("pcie0",         319,   R8A7795_CLK_S3D1),
0164     DEF_MOD("usb-dmac30",        326,   R8A7795_CLK_S3D1),
0165     DEF_MOD("usb3-if1",      327,   R8A7795_CLK_S3D1), /* ES1.x */
0166     DEF_MOD("usb3-if0",      328,   R8A7795_CLK_S3D1),
0167     DEF_MOD("usb-dmac31",        329,   R8A7795_CLK_S3D1),
0168     DEF_MOD("usb-dmac0",         330,   R8A7795_CLK_S3D1),
0169     DEF_MOD("usb-dmac1",         331,   R8A7795_CLK_S3D1),
0170     DEF_MOD("rwdt",          402,   R8A7795_CLK_R),
0171     DEF_MOD("intc-ex",       407,   R8A7795_CLK_CP),
0172     DEF_MOD("intc-ap",       408,   R8A7795_CLK_S0D3),
0173     DEF_MOD("audmac1",       501,   R8A7795_CLK_S1D2),
0174     DEF_MOD("audmac0",       502,   R8A7795_CLK_S1D2),
0175     DEF_MOD("drif31",        508,   R8A7795_CLK_S3D2),
0176     DEF_MOD("drif30",        509,   R8A7795_CLK_S3D2),
0177     DEF_MOD("drif21",        510,   R8A7795_CLK_S3D2),
0178     DEF_MOD("drif20",        511,   R8A7795_CLK_S3D2),
0179     DEF_MOD("drif11",        512,   R8A7795_CLK_S3D2),
0180     DEF_MOD("drif10",        513,   R8A7795_CLK_S3D2),
0181     DEF_MOD("drif01",        514,   R8A7795_CLK_S3D2),
0182     DEF_MOD("drif00",        515,   R8A7795_CLK_S3D2),
0183     DEF_MOD("hscif4",        516,   R8A7795_CLK_S3D1),
0184     DEF_MOD("hscif3",        517,   R8A7795_CLK_S3D1),
0185     DEF_MOD("hscif2",        518,   R8A7795_CLK_S3D1),
0186     DEF_MOD("hscif1",        519,   R8A7795_CLK_S3D1),
0187     DEF_MOD("hscif0",        520,   R8A7795_CLK_S3D1),
0188     DEF_MOD("thermal",       522,   R8A7795_CLK_CP),
0189     DEF_MOD("pwm",           523,   R8A7795_CLK_S0D12),
0190     DEF_MOD("fcpvd3",        600,   R8A7795_CLK_S2D1), /* ES1.x */
0191     DEF_MOD("fcpvd2",        601,   R8A7795_CLK_S0D2),
0192     DEF_MOD("fcpvd1",        602,   R8A7795_CLK_S0D2),
0193     DEF_MOD("fcpvd0",        603,   R8A7795_CLK_S0D2),
0194     DEF_MOD("fcpvb1",        606,   R8A7795_CLK_S0D1),
0195     DEF_MOD("fcpvb0",        607,   R8A7795_CLK_S0D1),
0196     DEF_MOD("fcpvi2",        609,   R8A7795_CLK_S2D1), /* ES1.x */
0197     DEF_MOD("fcpvi1",        610,   R8A7795_CLK_S0D1),
0198     DEF_MOD("fcpvi0",        611,   R8A7795_CLK_S0D1),
0199     DEF_MOD("fcpf2",         613,   R8A7795_CLK_S2D1), /* ES1.x */
0200     DEF_MOD("fcpf1",         614,   R8A7795_CLK_S0D1),
0201     DEF_MOD("fcpf0",         615,   R8A7795_CLK_S0D1),
0202     DEF_MOD("fcpci1",        616,   R8A7795_CLK_S2D1), /* ES1.x */
0203     DEF_MOD("fcpci0",        617,   R8A7795_CLK_S2D1), /* ES1.x */
0204     DEF_MOD("fcpcs",         619,   R8A7795_CLK_S0D1),
0205     DEF_MOD("vspd3",         620,   R8A7795_CLK_S2D1), /* ES1.x */
0206     DEF_MOD("vspd2",         621,   R8A7795_CLK_S0D2),
0207     DEF_MOD("vspd1",         622,   R8A7795_CLK_S0D2),
0208     DEF_MOD("vspd0",         623,   R8A7795_CLK_S0D2),
0209     DEF_MOD("vspbc",         624,   R8A7795_CLK_S0D1),
0210     DEF_MOD("vspbd",         626,   R8A7795_CLK_S0D1),
0211     DEF_MOD("vspi2",         629,   R8A7795_CLK_S2D1), /* ES1.x */
0212     DEF_MOD("vspi1",         630,   R8A7795_CLK_S0D1),
0213     DEF_MOD("vspi0",         631,   R8A7795_CLK_S0D1),
0214     DEF_MOD("ehci3",         700,   R8A7795_CLK_S3D2),
0215     DEF_MOD("ehci2",         701,   R8A7795_CLK_S3D2),
0216     DEF_MOD("ehci1",         702,   R8A7795_CLK_S3D2),
0217     DEF_MOD("ehci0",         703,   R8A7795_CLK_S3D2),
0218     DEF_MOD("hsusb",         704,   R8A7795_CLK_S3D2),
0219     DEF_MOD("hsusb3",        705,   R8A7795_CLK_S3D2),
0220     DEF_MOD("cmm3",          708,   R8A7795_CLK_S2D1),
0221     DEF_MOD("cmm2",          709,   R8A7795_CLK_S2D1),
0222     DEF_MOD("cmm1",          710,   R8A7795_CLK_S2D1),
0223     DEF_MOD("cmm0",          711,   R8A7795_CLK_S2D1),
0224     DEF_MOD("csi21",         713,   R8A7795_CLK_CSI0), /* ES1.x */
0225     DEF_MOD("csi20",         714,   R8A7795_CLK_CSI0),
0226     DEF_MOD("csi41",         715,   R8A7795_CLK_CSI0),
0227     DEF_MOD("csi40",         716,   R8A7795_CLK_CSI0),
0228     DEF_MOD("du3",           721,   R8A7795_CLK_S2D1),
0229     DEF_MOD("du2",           722,   R8A7795_CLK_S2D1),
0230     DEF_MOD("du1",           723,   R8A7795_CLK_S2D1),
0231     DEF_MOD("du0",           724,   R8A7795_CLK_S2D1),
0232     DEF_MOD("lvds",          727,   R8A7795_CLK_S0D4),
0233     DEF_MOD("hdmi1",         728,   R8A7795_CLK_HDMI),
0234     DEF_MOD("hdmi0",         729,   R8A7795_CLK_HDMI),
0235     DEF_MOD("mlp",           802,   R8A7795_CLK_S2D1),
0236     DEF_MOD("vin7",          804,   R8A7795_CLK_S0D2),
0237     DEF_MOD("vin6",          805,   R8A7795_CLK_S0D2),
0238     DEF_MOD("vin5",          806,   R8A7795_CLK_S0D2),
0239     DEF_MOD("vin4",          807,   R8A7795_CLK_S0D2),
0240     DEF_MOD("vin3",          808,   R8A7795_CLK_S0D2),
0241     DEF_MOD("vin2",          809,   R8A7795_CLK_S0D2),
0242     DEF_MOD("vin1",          810,   R8A7795_CLK_S0D2),
0243     DEF_MOD("vin0",          811,   R8A7795_CLK_S0D2),
0244     DEF_MOD("etheravb",      812,   R8A7795_CLK_S0D6),
0245     DEF_MOD("sata0",         815,   R8A7795_CLK_S3D2),
0246     DEF_MOD("imr3",          820,   R8A7795_CLK_S0D2),
0247     DEF_MOD("imr2",          821,   R8A7795_CLK_S0D2),
0248     DEF_MOD("imr1",          822,   R8A7795_CLK_S0D2),
0249     DEF_MOD("imr0",          823,   R8A7795_CLK_S0D2),
0250     DEF_MOD("gpio7",         905,   R8A7795_CLK_S3D4),
0251     DEF_MOD("gpio6",         906,   R8A7795_CLK_S3D4),
0252     DEF_MOD("gpio5",         907,   R8A7795_CLK_S3D4),
0253     DEF_MOD("gpio4",         908,   R8A7795_CLK_S3D4),
0254     DEF_MOD("gpio3",         909,   R8A7795_CLK_S3D4),
0255     DEF_MOD("gpio2",         910,   R8A7795_CLK_S3D4),
0256     DEF_MOD("gpio1",         911,   R8A7795_CLK_S3D4),
0257     DEF_MOD("gpio0",         912,   R8A7795_CLK_S3D4),
0258     DEF_MOD("can-fd",        914,   R8A7795_CLK_S3D2),
0259     DEF_MOD("can-if1",       915,   R8A7795_CLK_S3D4),
0260     DEF_MOD("can-if0",       916,   R8A7795_CLK_S3D4),
0261     DEF_MOD("rpc-if",        917,   R8A7795_CLK_RPCD2),
0262     DEF_MOD("i2c6",          918,   R8A7795_CLK_S0D6),
0263     DEF_MOD("i2c5",          919,   R8A7795_CLK_S0D6),
0264     DEF_MOD("i2c-dvfs",      926,   R8A7795_CLK_CP),
0265     DEF_MOD("i2c4",          927,   R8A7795_CLK_S0D6),
0266     DEF_MOD("i2c3",          928,   R8A7795_CLK_S0D6),
0267     DEF_MOD("i2c2",          929,   R8A7795_CLK_S3D2),
0268     DEF_MOD("i2c1",          930,   R8A7795_CLK_S3D2),
0269     DEF_MOD("i2c0",          931,   R8A7795_CLK_S3D2),
0270     DEF_MOD("ssi-all",      1005,   R8A7795_CLK_S3D4),
0271     DEF_MOD("ssi9",         1006,   MOD_CLK_ID(1005)),
0272     DEF_MOD("ssi8",         1007,   MOD_CLK_ID(1005)),
0273     DEF_MOD("ssi7",         1008,   MOD_CLK_ID(1005)),
0274     DEF_MOD("ssi6",         1009,   MOD_CLK_ID(1005)),
0275     DEF_MOD("ssi5",         1010,   MOD_CLK_ID(1005)),
0276     DEF_MOD("ssi4",         1011,   MOD_CLK_ID(1005)),
0277     DEF_MOD("ssi3",         1012,   MOD_CLK_ID(1005)),
0278     DEF_MOD("ssi2",         1013,   MOD_CLK_ID(1005)),
0279     DEF_MOD("ssi1",         1014,   MOD_CLK_ID(1005)),
0280     DEF_MOD("ssi0",         1015,   MOD_CLK_ID(1005)),
0281     DEF_MOD("scu-all",      1017,   R8A7795_CLK_S3D4),
0282     DEF_MOD("scu-dvc1",     1018,   MOD_CLK_ID(1017)),
0283     DEF_MOD("scu-dvc0",     1019,   MOD_CLK_ID(1017)),
0284     DEF_MOD("scu-ctu1-mix1",    1020,   MOD_CLK_ID(1017)),
0285     DEF_MOD("scu-ctu0-mix0",    1021,   MOD_CLK_ID(1017)),
0286     DEF_MOD("scu-src9",     1022,   MOD_CLK_ID(1017)),
0287     DEF_MOD("scu-src8",     1023,   MOD_CLK_ID(1017)),
0288     DEF_MOD("scu-src7",     1024,   MOD_CLK_ID(1017)),
0289     DEF_MOD("scu-src6",     1025,   MOD_CLK_ID(1017)),
0290     DEF_MOD("scu-src5",     1026,   MOD_CLK_ID(1017)),
0291     DEF_MOD("scu-src4",     1027,   MOD_CLK_ID(1017)),
0292     DEF_MOD("scu-src3",     1028,   MOD_CLK_ID(1017)),
0293     DEF_MOD("scu-src2",     1029,   MOD_CLK_ID(1017)),
0294     DEF_MOD("scu-src1",     1030,   MOD_CLK_ID(1017)),
0295     DEF_MOD("scu-src0",     1031,   MOD_CLK_ID(1017)),
0296 };
0297 
0298 static const unsigned int r8a7795_crit_mod_clks[] __initconst = {
0299     MOD_CLK_ID(402),    /* RWDT */
0300     MOD_CLK_ID(408),    /* INTC-AP (GIC) */
0301 };
0302 
0303 /*
0304  * CPG Clock Data
0305  */
0306 
0307 /*
0308  *   MD     EXTAL       PLL0    PLL1    PLL2    PLL3    PLL4    OSC
0309  * 14 13 19 17  (MHz)
0310  *-------------------------------------------------------------------------
0311  * 0  0  0  0   16.66 x 1   x180    x192    x144    x192    x144    /16
0312  * 0  0  0  1   16.66 x 1   x180    x192    x144    x128    x144    /16
0313  * 0  0  1  0   Prohibited setting
0314  * 0  0  1  1   16.66 x 1   x180    x192    x144    x192    x144    /16
0315  * 0  1  0  0   20    x 1   x150    x160    x120    x160    x120    /19
0316  * 0  1  0  1   20    x 1   x150    x160    x120    x106    x120    /19
0317  * 0  1  1  0   Prohibited setting
0318  * 0  1  1  1   20    x 1   x150    x160    x120    x160    x120    /19
0319  * 1  0  0  0   25    x 1   x120    x128    x96 x128    x96 /24
0320  * 1  0  0  1   25    x 1   x120    x128    x96 x84 x96 /24
0321  * 1  0  1  0   Prohibited setting
0322  * 1  0  1  1   25    x 1   x120    x128    x96 x128    x96 /24
0323  * 1  1  0  0   33.33 / 2   x180    x192    x144    x192    x144    /32
0324  * 1  1  0  1   33.33 / 2   x180    x192    x144    x128    x144    /32
0325  * 1  1  1  0   Prohibited setting
0326  * 1  1  1  1   33.33 / 2   x180    x192    x144    x192    x144    /32
0327  */
0328 #define CPG_PLL_CONFIG_INDEX(md)    ((((md) & BIT(14)) >> 11) | \
0329                      (((md) & BIT(13)) >> 11) | \
0330                      (((md) & BIT(19)) >> 18) | \
0331                      (((md) & BIT(17)) >> 17))
0332 
0333 static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[16] __initconst = {
0334     /* EXTAL div    PLL1 mult/div   PLL3 mult/div   OSC prediv */
0335     { 1,        192,    1,  192,    1,  16, },
0336     { 1,        192,    1,  128,    1,  16, },
0337     { 0, /* Prohibited setting */               },
0338     { 1,        192,    1,  192,    1,  16, },
0339     { 1,        160,    1,  160,    1,  19, },
0340     { 1,        160,    1,  106,    1,  19, },
0341     { 0, /* Prohibited setting */               },
0342     { 1,        160,    1,  160,    1,  19, },
0343     { 1,        128,    1,  128,    1,  24, },
0344     { 1,        128,    1,  84, 1,  24, },
0345     { 0, /* Prohibited setting */               },
0346     { 1,        128,    1,  128,    1,  24, },
0347     { 2,        192,    1,  192,    1,  32, },
0348     { 2,        192,    1,  128,    1,  32, },
0349     { 0, /* Prohibited setting */               },
0350     { 2,        192,    1,  192,    1,  32, },
0351 };
0352 
0353 static const struct soc_device_attribute r8a7795es1[] __initconst = {
0354     { .soc_id = "r8a7795", .revision = "ES1.*" },
0355     { /* sentinel */ }
0356 };
0357 
0358 
0359     /*
0360      * Fixups for R-Car H3 ES1.x
0361      */
0362 
0363 static const unsigned int r8a7795es1_mod_nullify[] __initconst = {
0364     MOD_CLK_ID(326),            /* USB-DMAC3-0 */
0365     MOD_CLK_ID(329),            /* USB-DMAC3-1 */
0366     MOD_CLK_ID(700),            /* EHCI/OHCI3 */
0367     MOD_CLK_ID(705),            /* HS-USB-IF3 */
0368 
0369 };
0370 
0371 static const struct mssr_mod_reparent r8a7795es1_mod_reparent[] __initconst = {
0372     { MOD_CLK_ID(118), R8A7795_CLK_S2D1 },  /* FDP1-1 */
0373     { MOD_CLK_ID(119), R8A7795_CLK_S2D1 },  /* FDP1-0 */
0374     { MOD_CLK_ID(121), R8A7795_CLK_S3D2 },  /* TMU4 */
0375     { MOD_CLK_ID(217), R8A7795_CLK_S3D1 },  /* SYS-DMAC2 */
0376     { MOD_CLK_ID(218), R8A7795_CLK_S3D1 },  /* SYS-DMAC1 */
0377     { MOD_CLK_ID(219), R8A7795_CLK_S3D1 },  /* SYS-DMAC0 */
0378     { MOD_CLK_ID(408), R8A7795_CLK_S3D1 },  /* INTC-AP */
0379     { MOD_CLK_ID(501), R8A7795_CLK_S3D1 },  /* AUDMAC1 */
0380     { MOD_CLK_ID(502), R8A7795_CLK_S3D1 },  /* AUDMAC0 */
0381     { MOD_CLK_ID(523), R8A7795_CLK_S3D4 },  /* PWM */
0382     { MOD_CLK_ID(601), R8A7795_CLK_S2D1 },  /* FCPVD2 */
0383     { MOD_CLK_ID(602), R8A7795_CLK_S2D1 },  /* FCPVD1 */
0384     { MOD_CLK_ID(603), R8A7795_CLK_S2D1 },  /* FCPVD0 */
0385     { MOD_CLK_ID(606), R8A7795_CLK_S2D1 },  /* FCPVB1 */
0386     { MOD_CLK_ID(607), R8A7795_CLK_S2D1 },  /* FCPVB0 */
0387     { MOD_CLK_ID(610), R8A7795_CLK_S2D1 },  /* FCPVI1 */
0388     { MOD_CLK_ID(611), R8A7795_CLK_S2D1 },  /* FCPVI0 */
0389     { MOD_CLK_ID(614), R8A7795_CLK_S2D1 },  /* FCPF1 */
0390     { MOD_CLK_ID(615), R8A7795_CLK_S2D1 },  /* FCPF0 */
0391     { MOD_CLK_ID(619), R8A7795_CLK_S2D1 },  /* FCPCS */
0392     { MOD_CLK_ID(621), R8A7795_CLK_S2D1 },  /* VSPD2 */
0393     { MOD_CLK_ID(622), R8A7795_CLK_S2D1 },  /* VSPD1 */
0394     { MOD_CLK_ID(623), R8A7795_CLK_S2D1 },  /* VSPD0 */
0395     { MOD_CLK_ID(624), R8A7795_CLK_S2D1 },  /* VSPBC */
0396     { MOD_CLK_ID(626), R8A7795_CLK_S2D1 },  /* VSPBD */
0397     { MOD_CLK_ID(630), R8A7795_CLK_S2D1 },  /* VSPI1 */
0398     { MOD_CLK_ID(631), R8A7795_CLK_S2D1 },  /* VSPI0 */
0399     { MOD_CLK_ID(804), R8A7795_CLK_S2D1 },  /* VIN7 */
0400     { MOD_CLK_ID(805), R8A7795_CLK_S2D1 },  /* VIN6 */
0401     { MOD_CLK_ID(806), R8A7795_CLK_S2D1 },  /* VIN5 */
0402     { MOD_CLK_ID(807), R8A7795_CLK_S2D1 },  /* VIN4 */
0403     { MOD_CLK_ID(808), R8A7795_CLK_S2D1 },  /* VIN3 */
0404     { MOD_CLK_ID(809), R8A7795_CLK_S2D1 },  /* VIN2 */
0405     { MOD_CLK_ID(810), R8A7795_CLK_S2D1 },  /* VIN1 */
0406     { MOD_CLK_ID(811), R8A7795_CLK_S2D1 },  /* VIN0 */
0407     { MOD_CLK_ID(812), R8A7795_CLK_S3D2 },  /* EAVB-IF */
0408     { MOD_CLK_ID(820), R8A7795_CLK_S2D1 },  /* IMR3 */
0409     { MOD_CLK_ID(821), R8A7795_CLK_S2D1 },  /* IMR2 */
0410     { MOD_CLK_ID(822), R8A7795_CLK_S2D1 },  /* IMR1 */
0411     { MOD_CLK_ID(823), R8A7795_CLK_S2D1 },  /* IMR0 */
0412     { MOD_CLK_ID(905), R8A7795_CLK_CP },    /* GPIO7 */
0413     { MOD_CLK_ID(906), R8A7795_CLK_CP },    /* GPIO6 */
0414     { MOD_CLK_ID(907), R8A7795_CLK_CP },    /* GPIO5 */
0415     { MOD_CLK_ID(908), R8A7795_CLK_CP },    /* GPIO4 */
0416     { MOD_CLK_ID(909), R8A7795_CLK_CP },    /* GPIO3 */
0417     { MOD_CLK_ID(910), R8A7795_CLK_CP },    /* GPIO2 */
0418     { MOD_CLK_ID(911), R8A7795_CLK_CP },    /* GPIO1 */
0419     { MOD_CLK_ID(912), R8A7795_CLK_CP },    /* GPIO0 */
0420     { MOD_CLK_ID(918), R8A7795_CLK_S3D2 },  /* I2C6 */
0421     { MOD_CLK_ID(919), R8A7795_CLK_S3D2 },  /* I2C5 */
0422     { MOD_CLK_ID(927), R8A7795_CLK_S3D2 },  /* I2C4 */
0423     { MOD_CLK_ID(928), R8A7795_CLK_S3D2 },  /* I2C3 */
0424 };
0425 
0426 
0427     /*
0428      * Fixups for R-Car H3 ES2.x
0429      */
0430 
0431 static const unsigned int r8a7795es2_mod_nullify[] __initconst = {
0432     MOD_CLK_ID(117),            /* FDP1-2 */
0433     MOD_CLK_ID(327),            /* USB3-IF1 */
0434     MOD_CLK_ID(600),            /* FCPVD3 */
0435     MOD_CLK_ID(609),            /* FCPVI2 */
0436     MOD_CLK_ID(613),            /* FCPF2 */
0437     MOD_CLK_ID(616),            /* FCPCI1 */
0438     MOD_CLK_ID(617),            /* FCPCI0 */
0439     MOD_CLK_ID(620),            /* VSPD3 */
0440     MOD_CLK_ID(629),            /* VSPI2 */
0441     MOD_CLK_ID(713),            /* CSI21 */
0442 };
0443 
0444 static int __init r8a7795_cpg_mssr_init(struct device *dev)
0445 {
0446     const struct rcar_gen3_cpg_pll_config *cpg_pll_config;
0447     u32 cpg_mode;
0448     int error;
0449 
0450     error = rcar_rst_read_mode_pins(&cpg_mode);
0451     if (error)
0452         return error;
0453 
0454     cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)];
0455     if (!cpg_pll_config->extal_div) {
0456         dev_err(dev, "Prohibited setting (cpg_mode=0x%x)\n", cpg_mode);
0457         return -EINVAL;
0458     }
0459 
0460     if (soc_device_match(r8a7795es1)) {
0461         cpg_core_nullify_range(r8a7795_core_clks,
0462                        ARRAY_SIZE(r8a7795_core_clks),
0463                        R8A7795_CLK_S0D2, R8A7795_CLK_S0D12);
0464         mssr_mod_nullify(r8a7795_mod_clks,
0465                  ARRAY_SIZE(r8a7795_mod_clks),
0466                  r8a7795es1_mod_nullify,
0467                  ARRAY_SIZE(r8a7795es1_mod_nullify));
0468         mssr_mod_reparent(r8a7795_mod_clks,
0469                   ARRAY_SIZE(r8a7795_mod_clks),
0470                   r8a7795es1_mod_reparent,
0471                   ARRAY_SIZE(r8a7795es1_mod_reparent));
0472     } else {
0473         mssr_mod_nullify(r8a7795_mod_clks,
0474                  ARRAY_SIZE(r8a7795_mod_clks),
0475                  r8a7795es2_mod_nullify,
0476                  ARRAY_SIZE(r8a7795es2_mod_nullify));
0477     }
0478 
0479     return rcar_gen3_cpg_init(cpg_pll_config, CLK_EXTALR, cpg_mode);
0480 }
0481 
0482 const struct cpg_mssr_info r8a7795_cpg_mssr_info __initconst = {
0483     /* Core Clocks */
0484     .core_clks = r8a7795_core_clks,
0485     .num_core_clks = ARRAY_SIZE(r8a7795_core_clks),
0486     .last_dt_core_clk = LAST_DT_CORE_CLK,
0487     .num_total_core_clks = MOD_CLK_BASE,
0488 
0489     /* Module Clocks */
0490     .mod_clks = r8a7795_mod_clks,
0491     .num_mod_clks = ARRAY_SIZE(r8a7795_mod_clks),
0492     .num_hw_mod_clks = 12 * 32,
0493 
0494     /* Critical Module Clocks */
0495     .crit_mod_clks = r8a7795_crit_mod_clks,
0496     .num_crit_mod_clks = ARRAY_SIZE(r8a7795_crit_mod_clks),
0497 
0498     /* Callbacks */
0499     .init = r8a7795_cpg_mssr_init,
0500     .cpg_clk_register = rcar_gen3_cpg_clk_register,
0501 };