// SPDX-License-Identifier: GPL-2.0
/*
 * r8a7742 Clock Pulse Generator / Module Standby and Software Reset
 *
 * Copyright (C) 2020 Renesas Electronics Corp.
 */

#include <linux/device.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/soc/renesas/rcar-rst.h>

#include <dt-bindings/clock/r8a7742-cpg-mssr.h>

#include "renesas-cpg-mssr.h"
#include "rcar-gen2-cpg.h"

enum clk_ids {
	/* Core Clock Outputs exported to DT */
	LAST_DT_CORE_CLK = R8A7742_CLK_OSC,

	/* External Input Clocks */
	CLK_EXTAL,
	CLK_USB_EXTAL,

	/* Internal Core Clocks */
	CLK_MAIN,
	CLK_PLL0,
	CLK_PLL1,
	CLK_PLL3,
	CLK_PLL1_DIV2,

	/* Module Clocks */
	MOD_CLK_BASE
};

static const struct cpg_core_clk r8a7742_core_clks[] __initconst = {
	/* External Clock Inputs */
	DEF_INPUT("extal",	CLK_EXTAL),
	DEF_INPUT("usb_extal",	CLK_USB_EXTAL),

	/* Internal Core Clocks */
	DEF_BASE(".main",	CLK_MAIN, CLK_TYPE_GEN2_MAIN, CLK_EXTAL),
	DEF_BASE(".pll0",	CLK_PLL0, CLK_TYPE_GEN2_PLL0, CLK_MAIN),
	DEF_BASE(".pll1",	CLK_PLL1, CLK_TYPE_GEN2_PLL1, CLK_MAIN),
	DEF_BASE(".pll3",	CLK_PLL3, CLK_TYPE_GEN2_PLL3, CLK_MAIN),

	DEF_FIXED(".pll1_div2",	CLK_PLL1_DIV2, CLK_PLL1, 2, 1),

	/* Core Clock Outputs */
	DEF_BASE("z",    R8A7742_CLK_Z,    CLK_TYPE_GEN2_Z,	CLK_PLL0),
	DEF_BASE("lb",   R8A7742_CLK_LB,   CLK_TYPE_GEN2_LB,	CLK_PLL1),
	DEF_BASE("sdh",  R8A7742_CLK_SDH,  CLK_TYPE_GEN2_SDH,	CLK_PLL1),
	DEF_BASE("sd0",  R8A7742_CLK_SD0,  CLK_TYPE_GEN2_SD0,	CLK_PLL1),
	DEF_BASE("sd1",  R8A7742_CLK_SD1,  CLK_TYPE_GEN2_SD1,	CLK_PLL1),
	DEF_BASE("qspi", R8A7742_CLK_QSPI, CLK_TYPE_GEN2_QSPI,	CLK_PLL1_DIV2),
	DEF_BASE("rcan", R8A7742_CLK_RCAN, CLK_TYPE_GEN2_RCAN,	CLK_USB_EXTAL),

	DEF_FIXED("z2",    R8A7742_CLK_Z2,	CLK_PLL1,	    2, 1),
	DEF_FIXED("zg",    R8A7742_CLK_ZG,	CLK_PLL1,	    3, 1),
	DEF_FIXED("zx",    R8A7742_CLK_ZX,	CLK_PLL1,	    3, 1),
	DEF_FIXED("zs",    R8A7742_CLK_ZS,	CLK_PLL1,	    6, 1),
	DEF_FIXED("hp",    R8A7742_CLK_HP,	CLK_PLL1,	   12, 1),
	DEF_FIXED("b",     R8A7742_CLK_B,	CLK_PLL1,	   12, 1),
	DEF_FIXED("p",     R8A7742_CLK_P,	CLK_PLL1,	   24, 1),
	DEF_FIXED("cl",    R8A7742_CLK_CL,	CLK_PLL1,	   48, 1),
	DEF_FIXED("m2",    R8A7742_CLK_M2,	CLK_PLL1,	    8, 1),
	DEF_FIXED("zb3",   R8A7742_CLK_ZB3,	CLK_PLL3,	    4, 1),
	DEF_FIXED("zb3d2", R8A7742_CLK_ZB3D2,	CLK_PLL3,	    8, 1),
	DEF_FIXED("ddr",   R8A7742_CLK_DDR,	CLK_PLL3,	    8, 1),
	DEF_FIXED("mp",    R8A7742_CLK_MP,	CLK_PLL1_DIV2,	   15, 1),
	DEF_FIXED("cp",    R8A7742_CLK_CP,	CLK_EXTAL,	    2, 1),
	DEF_FIXED("r",     R8A7742_CLK_R,	CLK_PLL1,	49152, 1),
	DEF_FIXED("osc",   R8A7742_CLK_OSC,	CLK_PLL1,	12288, 1),

	DEF_DIV6P1("sd2",  R8A7742_CLK_SD2,	CLK_PLL1_DIV2,	0x078),
	DEF_DIV6P1("sd3",  R8A7742_CLK_SD3,	CLK_PLL1_DIV2,	0x26c),
	DEF_DIV6P1("mmc0", R8A7742_CLK_MMC0,	CLK_PLL1_DIV2,	0x240),
	DEF_DIV6P1("mmc1", R8A7742_CLK_MMC1,	CLK_PLL1_DIV2,	0x244),
};

static const struct mssr_mod_clk r8a7742_mod_clks[] __initconst = {
	DEF_MOD("msiof0",		   0,	R8A7742_CLK_MP),
	DEF_MOD("vcp1",			 100,	R8A7742_CLK_ZS),
	DEF_MOD("vcp0",			 101,	R8A7742_CLK_ZS),
	DEF_MOD("vpc1",			 102,	R8A7742_CLK_ZS),
	DEF_MOD("vpc0",			 103,	R8A7742_CLK_ZS),
	DEF_MOD("tmu1",			 111,	R8A7742_CLK_P),
	DEF_MOD("3dg",			 112,	R8A7742_CLK_ZG),
	DEF_MOD("2d-dmac",		 115,	R8A7742_CLK_ZS),
	DEF_MOD("fdp1-2",		 117,	R8A7742_CLK_ZS),
	DEF_MOD("fdp1-1",		 118,	R8A7742_CLK_ZS),
	DEF_MOD("fdp1-0",		 119,	R8A7742_CLK_ZS),
	DEF_MOD("tmu3",			 121,	R8A7742_CLK_P),
	DEF_MOD("tmu2",			 122,	R8A7742_CLK_P),
	DEF_MOD("cmt0",			 124,	R8A7742_CLK_R),
	DEF_MOD("tmu0",			 125,	R8A7742_CLK_CP),
	DEF_MOD("vsp1du1",		 127,	R8A7742_CLK_ZS),
	DEF_MOD("vsp1du0",		 128,	R8A7742_CLK_ZS),
	DEF_MOD("vsp1-sy",		 131,	R8A7742_CLK_ZS),
	DEF_MOD("scifa2",		 202,	R8A7742_CLK_MP),
	DEF_MOD("scifa1",		 203,	R8A7742_CLK_MP),
	DEF_MOD("scifa0",		 204,	R8A7742_CLK_MP),
	DEF_MOD("msiof2",		 205,	R8A7742_CLK_MP),
	DEF_MOD("scifb0",		 206,	R8A7742_CLK_MP),
	DEF_MOD("scifb1",		 207,	R8A7742_CLK_MP),
	DEF_MOD("msiof1",		 208,	R8A7742_CLK_MP),
	DEF_MOD("msiof3",		 215,	R8A7742_CLK_MP),
	DEF_MOD("scifb2",		 216,	R8A7742_CLK_MP),
	DEF_MOD("sys-dmac1",		 218,	R8A7742_CLK_ZS),
	DEF_MOD("sys-dmac0",		 219,	R8A7742_CLK_ZS),
	DEF_MOD("iic2",			 300,	R8A7742_CLK_HP),
	DEF_MOD("tpu0",			 304,	R8A7742_CLK_CP),
	DEF_MOD("mmcif1",		 305,	R8A7742_CLK_MMC1),
	DEF_MOD("scif2",		 310,	R8A7742_CLK_P),
	DEF_MOD("sdhi3",		 311,	R8A7742_CLK_SD3),
	DEF_MOD("sdhi2",		 312,	R8A7742_CLK_SD2),
	DEF_MOD("sdhi1",		 313,	R8A7742_CLK_SD1),
	DEF_MOD("sdhi0",		 314,	R8A7742_CLK_SD0),
	DEF_MOD("mmcif0",		 315,	R8A7742_CLK_MMC0),
	DEF_MOD("iic0",			 318,	R8A7742_CLK_HP),
	DEF_MOD("pciec",		 319,	R8A7742_CLK_MP),
	DEF_MOD("iic1",			 323,	R8A7742_CLK_HP),
	DEF_MOD("usb3.0",		 328,	R8A7742_CLK_MP),
	DEF_MOD("cmt1",			 329,	R8A7742_CLK_R),
	DEF_MOD("usbhs-dmac0",		 330,	R8A7742_CLK_HP),
	DEF_MOD("usbhs-dmac1",		 331,	R8A7742_CLK_HP),
	DEF_MOD("rwdt",			 402,	R8A7742_CLK_R),
	DEF_MOD("irqc",			 407,	R8A7742_CLK_CP),
	DEF_MOD("intc-sys",		 408,	R8A7742_CLK_ZS),
	DEF_MOD("audio-dmac1",		 501,	R8A7742_CLK_HP),
	DEF_MOD("audio-dmac0",		 502,	R8A7742_CLK_HP),
	DEF_MOD("thermal",		 522,	CLK_EXTAL),
	DEF_MOD("pwm",			 523,	R8A7742_CLK_P),
	DEF_MOD("usb-ehci",		 703,	R8A7742_CLK_MP),
	DEF_MOD("usbhs",		 704,	R8A7742_CLK_HP),
	DEF_MOD("hscif1",		 716,	R8A7742_CLK_ZS),
	DEF_MOD("hscif0",		 717,	R8A7742_CLK_ZS),
	DEF_MOD("scif1",		 720,	R8A7742_CLK_P),
	DEF_MOD("scif0",		 721,	R8A7742_CLK_P),
	DEF_MOD("du2",			 722,	R8A7742_CLK_ZX),
	DEF_MOD("du1",			 723,	R8A7742_CLK_ZX),
	DEF_MOD("du0",			 724,	R8A7742_CLK_ZX),
	DEF_MOD("lvds1",		 725,	R8A7742_CLK_ZX),
	DEF_MOD("lvds0",		 726,	R8A7742_CLK_ZX),
	DEF_MOD("r-gp2d",		 807,	R8A7742_CLK_ZX),
	DEF_MOD("vin3",			 808,	R8A7742_CLK_ZG),
	DEF_MOD("vin2",			 809,	R8A7742_CLK_ZG),
	DEF_MOD("vin1",			 810,	R8A7742_CLK_ZG),
	DEF_MOD("vin0",			 811,	R8A7742_CLK_ZG),
	DEF_MOD("etheravb",		 812,	R8A7742_CLK_HP),
	DEF_MOD("ether",		 813,	R8A7742_CLK_P),
	DEF_MOD("sata1",		 814,	R8A7742_CLK_ZS),
	DEF_MOD("sata0",		 815,	R8A7742_CLK_ZS),
	DEF_MOD("imr-x2-1",		 820,	R8A7742_CLK_ZG),
	DEF_MOD("imr-x2-0",		 821,	R8A7742_CLK_HP),
	DEF_MOD("imr-lsx2-1",		 822,	R8A7742_CLK_P),
	DEF_MOD("imr-lsx2-0",		 823,	R8A7742_CLK_ZS),
	DEF_MOD("gpio5",		 907,	R8A7742_CLK_CP),
	DEF_MOD("gpio4",		 908,	R8A7742_CLK_CP),
	DEF_MOD("gpio3",		 909,	R8A7742_CLK_CP),
	DEF_MOD("gpio2",		 910,	R8A7742_CLK_CP),
	DEF_MOD("gpio1",		 911,	R8A7742_CLK_CP),
	DEF_MOD("gpio0",		 912,	R8A7742_CLK_CP),
	DEF_MOD("can1",			 915,	R8A7742_CLK_P),
	DEF_MOD("can0",			 916,	R8A7742_CLK_P),
	DEF_MOD("qspi_mod",		 917,	R8A7742_CLK_QSPI),
	DEF_MOD("iicdvfs",		 926,	R8A7742_CLK_CP),
	DEF_MOD("i2c3",			 928,	R8A7742_CLK_HP),
	DEF_MOD("i2c2",			 929,	R8A7742_CLK_HP),
	DEF_MOD("i2c1",			 930,	R8A7742_CLK_HP),
	DEF_MOD("i2c0",			 931,	R8A7742_CLK_HP),
	DEF_MOD("ssi-all",		1005,	R8A7742_CLK_P),
	DEF_MOD("ssi9",			1006,	MOD_CLK_ID(1005)),
	DEF_MOD("ssi8",			1007,	MOD_CLK_ID(1005)),
	DEF_MOD("ssi7",			1008,	MOD_CLK_ID(1005)),
	DEF_MOD("ssi6",			1009,	MOD_CLK_ID(1005)),
	DEF_MOD("ssi5",			1010,	MOD_CLK_ID(1005)),
	DEF_MOD("ssi4",			1011,	MOD_CLK_ID(1005)),
	DEF_MOD("ssi3",			1012,	MOD_CLK_ID(1005)),
	DEF_MOD("ssi2",			1013,	MOD_CLK_ID(1005)),
	DEF_MOD("ssi1",			1014,	MOD_CLK_ID(1005)),
	DEF_MOD("ssi0",			1015,	MOD_CLK_ID(1005)),
	DEF_MOD("scu-all",		1017,	R8A7742_CLK_P),
	DEF_MOD("scu-dvc1",		1018,	MOD_CLK_ID(1017)),
	DEF_MOD("scu-dvc0",		1019,	MOD_CLK_ID(1017)),
	DEF_MOD("scu-ctu1-mix1",	1020,	MOD_CLK_ID(1017)),
	DEF_MOD("scu-ctu0-mix0",	1021,	MOD_CLK_ID(1017)),
	DEF_MOD("scu-src9",		1022,	MOD_CLK_ID(1017)),
	DEF_MOD("scu-src8",		1023,	MOD_CLK_ID(1017)),
	DEF_MOD("scu-src7",		1024,	MOD_CLK_ID(1017)),
	DEF_MOD("scu-src6",		1025,	MOD_CLK_ID(1017)),
	DEF_MOD("scu-src5",		1026,	MOD_CLK_ID(1017)),
	DEF_MOD("scu-src4",		1027,	MOD_CLK_ID(1017)),
	DEF_MOD("scu-src3",		1028,	MOD_CLK_ID(1017)),
	DEF_MOD("scu-src2",		1029,	MOD_CLK_ID(1017)),
	DEF_MOD("scu-src1",		1030,	MOD_CLK_ID(1017)),
	DEF_MOD("scu-src0",		1031,	MOD_CLK_ID(1017)),
};

static const unsigned int r8a7742_crit_mod_clks[] __initconst = {
	MOD_CLK_ID(402),	/* RWDT */
	MOD_CLK_ID(408),	/* INTC-SYS (GIC) */
};

/*
 * CPG Clock Data
 */

/*
 *    MD	EXTAL		PLL0	PLL1	PLL3
 * 14 13 19	(MHz)		*1	*1
 *---------------------------------------------------
 * 0  0  0	15		x172/2	x208/2	x106
 * 0  0  1	15		x172/2	x208/2	x88
 * 0  1  0	20		x130/2	x156/2	x80
 * 0  1  1	20		x130/2	x156/2	x66
 * 1  0  0	26 / 2		x200/2	x240/2	x122
 * 1  0  1	26 / 2		x200/2	x240/2	x102
 * 1  1  0	30 / 2		x172/2	x208/2	x106
 * 1  1  1	30 / 2		x172/2	x208/2	x88
 *
 * *1 :	Table 7.5a indicates VCO output (PLLx = VCO/2)
 */
#define CPG_PLL_CONFIG_INDEX(md)	((((md) & BIT(14)) >> 12) | \
					 (((md) & BIT(13)) >> 12) | \
					 (((md) & BIT(19)) >> 19))

static const struct rcar_gen2_cpg_pll_config cpg_pll_configs[8] __initconst = {
	/* EXTAL div	PLL1 mult	PLL3 mult */
	{ 1,		208,		106,	},
	{ 1,		208,		88,	},
	{ 1,		156,		80,	},
	{ 1,		156,		66,	},
	{ 2,		240,		122,	},
	{ 2,		240,		102,	},
	{ 2,		208,		106,	},
	{ 2,		208,		88,	},
};

static int __init r8a7742_cpg_mssr_init(struct device *dev)
{
	const struct rcar_gen2_cpg_pll_config *cpg_pll_config;
	u32 cpg_mode;
	int error;

	error = rcar_rst_read_mode_pins(&cpg_mode);
	if (error)
		return error;

	cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)];

	return rcar_gen2_cpg_init(cpg_pll_config, 2, cpg_mode);
}

const struct cpg_mssr_info r8a7742_cpg_mssr_info __initconst = {
	/* Core Clocks */
	.core_clks = r8a7742_core_clks,
	.num_core_clks = ARRAY_SIZE(r8a7742_core_clks),
	.last_dt_core_clk = LAST_DT_CORE_CLK,
	.num_total_core_clks = MOD_CLK_BASE,

	/* Module Clocks */
	.mod_clks = r8a7742_mod_clks,
	.num_mod_clks = ARRAY_SIZE(r8a7742_mod_clks),
	.num_hw_mod_clks = 12 * 32,

	/* Critical Module Clocks */
	.crit_mod_clks = r8a7742_crit_mod_clks,
	.num_crit_mod_clks = ARRAY_SIZE(r8a7742_crit_mod_clks),

	/* Callbacks */
	.init = r8a7742_cpg_mssr_init,
	.cpg_clk_register = rcar_gen2_cpg_clk_register,
};
