Unverified Commit 83436f2b authored by Stephen Boyd's avatar Stephen Boyd
Browse files

Merge tag 'renesas-clk-for-v6.20-tag2' of...

Merge tag 'renesas-clk-for-v6.20-tag2' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers into clk-renesas

Pull Renesas clk driver updates from Geert Uytterhoeven:

 - Fix s2ram on Renesas RZ/T2H and RZ/N2H
 - Add CAN-FD clocks and resets on Renesas RZ/T2H, RZ/N2H,
   RZ/V2H, and RZ/V2N

* tag 'renesas-clk-for-v6.20-tag2' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers:
  clk: renesas: Add missing log message terminators
  clk: renesas: rzg2l: Remove DSI clock rate restrictions
  clk: renesas: rzv2h: Deassert reset on assert timeout
  clk: renesas: rzg2l: Deassert reset on assert timeout
  clk: renesas: cpg-mssr: Unlock before reset verification
  clk: renesas: r9a09g056: Add entries for CANFD
  clk: renesas: r9a09g057: Add entries for CANFD
  clk: renesas: r9a09g077: Add CANFD clocks
  clk: renesas: cpg-mssr: Handle RZ/T2H register layout in PM callbacks
  dt-bindings: clock: renesas,r9a09g077/87: Add PCLKCAN ID
  clk: renesas: cpg-mssr: Simplify pointer math in cpg_rzt2h_mstp_read()
parents a46a9cd1 4fef3fd6
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -69,11 +69,11 @@ static void vbattb_clk_action(void *data)

	ret = reset_control_assert(rstc);
	if (ret)
		dev_err(dev, "Failed to de-assert reset!");
		dev_err(dev, "Failed to de-assert reset!\n");

	ret = pm_runtime_put_sync(dev);
	if (ret < 0)
		dev_err(dev, "Failed to runtime suspend!");
		dev_err(dev, "Failed to runtime suspend!\n");

	of_clk_del_provider(dev->of_node);
}
+10 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ enum clk_ids {
	CLK_PLLCLN_DIV2,
	CLK_PLLCLN_DIV8,
	CLK_PLLCLN_DIV16,
	CLK_PLLCLN_DIV20,
	CLK_PLLCLN_DIV64,
	CLK_PLLCLN_DIV256,
	CLK_PLLCLN_DIV1024,
@@ -183,6 +184,7 @@ static const struct cpg_core_clk r9a09g056_core_clks[] __initconst = {
	DEF_FIXED(".pllcln_div2", CLK_PLLCLN_DIV2, CLK_PLLCLN, 1, 2),
	DEF_FIXED(".pllcln_div8", CLK_PLLCLN_DIV8, CLK_PLLCLN, 1, 8),
	DEF_FIXED(".pllcln_div16", CLK_PLLCLN_DIV16, CLK_PLLCLN, 1, 16),
	DEF_FIXED(".pllcln_div20", CLK_PLLCLN_DIV20, CLK_PLLCLN, 1, 20),
	DEF_FIXED(".pllcln_div64", CLK_PLLCLN_DIV64, CLK_PLLCLN, 1, 64),
	DEF_FIXED(".pllcln_div256", CLK_PLLCLN_DIV256, CLK_PLLCLN, 1, 256),
	DEF_FIXED(".pllcln_div1024", CLK_PLLCLN_DIV1024, CLK_PLLCLN, 1, 1024),
@@ -431,6 +433,12 @@ static const struct rzv2h_mod_clk r9a09g056_mod_clks[] __initconst = {
						BUS_MSTOP(1, BIT(7))),
	DEF_MOD("riic_7_ckm",			CLK_PLLCLN_DIV16, 9, 11, 4, 27,
						BUS_MSTOP(1, BIT(8))),
	DEF_MOD("canfd_0_pclk",			CLK_PLLCLN_DIV16, 9, 12, 4, 28,
						BUS_MSTOP(10, BIT(14))),
	DEF_MOD("canfd_0_clk_ram",		CLK_PLLCLN_DIV8, 9, 13, 4, 29,
						BUS_MSTOP(10, BIT(14))),
	DEF_MOD("canfd_0_clkc",			CLK_PLLCLN_DIV20, 9, 14, 4, 30,
						BUS_MSTOP(10, BIT(14))),
	DEF_MOD("spi_hclk",			CLK_PLLCM33_GEAR, 9, 15, 4, 31,
						BUS_MSTOP(4, BIT(5))),
	DEF_MOD("spi_aclk",			CLK_PLLCM33_GEAR, 10, 0, 5, 0,
@@ -603,6 +611,8 @@ static const struct rzv2h_reset r9a09g056_resets[] __initconst = {
	DEF_RST(9, 14, 4, 15),		/* RIIC_6_MRST */
	DEF_RST(9, 15, 4, 16),		/* RIIC_7_MRST */
	DEF_RST(10, 0, 4, 17),		/* RIIC_8_MRST */
	DEF_RST(10, 1, 4, 18),		/* CANFD_0_RSTP_N */
	DEF_RST(10, 2, 4, 19),		/* CANFD_0_RSTC_N */
	DEF_RST(10, 3, 4, 20),		/* SPI_HRESETN */
	DEF_RST(10, 4, 4, 21),		/* SPI_ARESETN */
	DEF_RST(10, 7, 4, 24),		/* SDHI_0_IXRST */
+10 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ enum clk_ids {
	CLK_PLLCLN_DIV2,
	CLK_PLLCLN_DIV8,
	CLK_PLLCLN_DIV16,
	CLK_PLLCLN_DIV20,
	CLK_PLLCLN_DIV64,
	CLK_PLLCLN_DIV256,
	CLK_PLLCLN_DIV1024,
@@ -185,6 +186,7 @@ static const struct cpg_core_clk r9a09g057_core_clks[] __initconst = {
	DEF_FIXED(".pllcln_div2", CLK_PLLCLN_DIV2, CLK_PLLCLN, 1, 2),
	DEF_FIXED(".pllcln_div8", CLK_PLLCLN_DIV8, CLK_PLLCLN, 1, 8),
	DEF_FIXED(".pllcln_div16", CLK_PLLCLN_DIV16, CLK_PLLCLN, 1, 16),
	DEF_FIXED(".pllcln_div20", CLK_PLLCLN_DIV20, CLK_PLLCLN, 1, 20),
	DEF_FIXED(".pllcln_div64", CLK_PLLCLN_DIV64, CLK_PLLCLN, 1, 64),
	DEF_FIXED(".pllcln_div256", CLK_PLLCLN_DIV256, CLK_PLLCLN, 1, 256),
	DEF_FIXED(".pllcln_div1024", CLK_PLLCLN_DIV1024, CLK_PLLCLN, 1, 1024),
@@ -440,6 +442,12 @@ static const struct rzv2h_mod_clk r9a09g057_mod_clks[] __initconst = {
						BUS_MSTOP(1, BIT(7))),
	DEF_MOD("riic_7_ckm",			CLK_PLLCLN_DIV16, 9, 11, 4, 27,
						BUS_MSTOP(1, BIT(8))),
	DEF_MOD("canfd_0_pclk",			CLK_PLLCLN_DIV16, 9, 12, 4, 28,
						BUS_MSTOP(10, BIT(14))),
	DEF_MOD("canfd_0_clk_ram",		CLK_PLLCLN_DIV8, 9, 13, 4, 29,
						BUS_MSTOP(10, BIT(14))),
	DEF_MOD("canfd_0_clkc",			CLK_PLLCLN_DIV20, 9, 14, 4, 30,
						BUS_MSTOP(10, BIT(14))),
	DEF_MOD("spi_hclk",			CLK_PLLCM33_GEAR, 9, 15, 4, 31,
						BUS_MSTOP(4, BIT(5))),
	DEF_MOD("spi_aclk",			CLK_PLLCM33_GEAR, 10, 0, 5, 0,
@@ -634,6 +642,8 @@ static const struct rzv2h_reset r9a09g057_resets[] __initconst = {
	DEF_RST(9, 14, 4, 15),		/* RIIC_6_MRST */
	DEF_RST(9, 15, 4, 16),		/* RIIC_7_MRST */
	DEF_RST(10, 0, 4, 17),		/* RIIC_8_MRST */
	DEF_RST(10, 1, 4, 18),		/* CANFD_0_RSTP_N */
	DEF_RST(10, 2, 4, 19),		/* CANFD_0_RSTC_N */
	DEF_RST(10, 3, 4, 20),		/* SPI_HRESETN */
	DEF_RST(10, 4, 4, 21),		/* SPI_ARESETN */
	DEF_RST(10, 7, 4, 24),		/* SDHI_0_IXRST */
+12 −1
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@
#define FSELXSPI1	CONF_PACK(SCKCR, 8, 3)
#define DIVSEL_XSPI0	CONF_PACK(SCKCR, 6, 1)
#define DIVSEL_XSPI1	CONF_PACK(SCKCR, 14, 1)
#define FSELCANFD	CONF_PACK(SCKCR, 20, 1)
#define SEL_PLL		CONF_PACK(SCKCR, 22, 1)

#define DIVCA55C0	CONF_PACK(SCKCR2, 8, 1)
@@ -85,7 +86,7 @@ enum rzt2h_clk_types {

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

	/* External Input Clocks */
	CLK_EXTAL,
@@ -103,6 +104,9 @@ enum clk_ids {
	CLK_PLL4D1,
	CLK_PLL4D1_DIV3,
	CLK_PLL4D1_DIV4,
	CLK_PLL4D3,
	CLK_PLL4D3_DIV10,
	CLK_PLL4D3_DIV20,
	CLK_SCI0ASYNC,
	CLK_SCI1ASYNC,
	CLK_SCI2ASYNC,
@@ -150,6 +154,7 @@ static const char * const sel_clk_pll1[] = { ".loco", ".pll1" };
static const char * const sel_clk_pll2[] = { ".loco", ".pll2" };
static const char * const sel_clk_pll4[] = { ".loco", ".pll4" };
static const char * const sel_clk_pll4d1_div3_div4[] = { ".pll4d1_div3", ".pll4d1_div4" };
static const char * const sel_clk_pll4d3_div10_div20[] = { ".pll4d3_div10", ".pll4d3_div20" };

static const struct cpg_core_clk r9a09g077_core_clks[] __initconst = {
	/* External Clock Inputs */
@@ -174,6 +179,9 @@ static const struct cpg_core_clk r9a09g077_core_clks[] __initconst = {
	DEF_FIXED(".pll4d1", CLK_PLL4D1, CLK_SEL_CLK_PLL4, 1, 1),
	DEF_FIXED(".pll4d1_div3", CLK_PLL4D1_DIV3, CLK_PLL4D1, 3, 1),
	DEF_FIXED(".pll4d1_div4", CLK_PLL4D1_DIV4, CLK_PLL4D1, 4, 1),
	DEF_FIXED(".pll4d3", CLK_PLL4D3, CLK_SEL_CLK_PLL4, 3, 1),
	DEF_FIXED(".pll4d3_div10", CLK_PLL4D3_DIV10, CLK_PLL4D3, 10, 1),
	DEF_FIXED(".pll4d3_div20", CLK_PLL4D3_DIV20, CLK_PLL4D3, 20, 1),

	DEF_DIV(".sci0async", CLK_SCI0ASYNC, CLK_PLL4D1, DIVSCI0ASYNC,
		dtable_24_25_30_32),
@@ -232,6 +240,8 @@ static const struct cpg_core_clk r9a09g077_core_clks[] __initconst = {
			 FSELXSPI0, dtable_6_8_16_32_64),
	DEF_DIV_FSELXSPI("XSPI_CLK1", R9A09G077_XSPI_CLK1, CLK_DIVSELXSPI1_SCKCR,
			 FSELXSPI1, dtable_6_8_16_32_64),
	DEF_MUX("PCLKCAN", R9A09G077_PCLKCAN, FSELCANFD,
		sel_clk_pll4d3_div10_div20, ARRAY_SIZE(sel_clk_pll4d3_div10_div20), 0),
};

static const struct mssr_mod_clk r9a09g077_mod_clks[] __initconst = {
@@ -251,6 +261,7 @@ static const struct mssr_mod_clk r9a09g077_mod_clks[] __initconst = {
	DEF_MOD("adc1", 207, R9A09G077_CLK_PCLKH),
	DEF_MOD("adc2", 225, R9A09G077_CLK_PCLKM),
	DEF_MOD("tsu", 307, R9A09G077_CLK_PCLKL),
	DEF_MOD("canfd", 310, R9A09G077_CLK_PCLKM),
	DEF_MOD("gmac0", 400, R9A09G077_CLK_PCLKM),
	DEF_MOD("ethsw", 401, R9A09G077_CLK_PCLKM),
	DEF_MOD("ethss", 403, R9A09G077_CLK_PCLKM),
+31 −23
Original line number Diff line number Diff line
@@ -237,20 +237,16 @@ struct mstp_clock {

#define to_mstp_clock(_hw) container_of(_hw, struct mstp_clock, hw)

static u32 cpg_rzt2h_mstp_read(struct clk_hw *hw, u16 offset)
static u32 cpg_rzt2h_mstp_read(struct cpg_mssr_priv *priv, u16 offset)
{
	struct mstp_clock *clock = to_mstp_clock(hw);
	struct cpg_mssr_priv *priv = clock->priv;
	void __iomem *base =
		RZT2H_MSTPCR_BLOCK(offset) ? priv->pub.base1 : priv->pub.base0;

	return readl(base + RZT2H_MSTPCR_OFFSET(offset));
}

static void cpg_rzt2h_mstp_write(struct clk_hw *hw, u16 offset, u32 value)
static void cpg_rzt2h_mstp_write(struct cpg_mssr_priv *priv, u16 offset, u32 value)
{
	struct mstp_clock *clock = to_mstp_clock(hw);
	struct cpg_mssr_priv *priv = clock->priv;
	void __iomem *base =
		RZT2H_MSTPCR_BLOCK(offset) ? priv->pub.base1 : priv->pub.base0;

@@ -286,17 +282,14 @@ static int cpg_mstp_clock_endisable(struct clk_hw *hw, bool enable)
		barrier_data(priv->pub.base0 + priv->control_regs[reg]);

	} else if (priv->reg_layout == CLK_REG_LAYOUT_RZ_T2H) {
		value = cpg_rzt2h_mstp_read(hw,
					    priv->control_regs[reg]);
		value = cpg_rzt2h_mstp_read(priv, priv->control_regs[reg]);

		if (enable)
			value &= ~bitmask;
		else
			value |= bitmask;

		cpg_rzt2h_mstp_write(hw,
				     priv->control_regs[reg],
				     value);
		cpg_rzt2h_mstp_write(priv, priv->control_regs[reg], value);
	} else {
		value = readl(priv->pub.base0 + priv->control_regs[reg]);
		if (enable)
@@ -318,7 +311,7 @@ static int cpg_mstp_clock_endisable(struct clk_hw *hw, bool enable)
		 * the IP at least seven times. Instead of memory-mapping the IP
		 * register, we simply add a delay after the read operation.
		 */
		cpg_rzt2h_mstp_read(hw, priv->control_regs[reg]);
		cpg_rzt2h_mstp_read(priv, priv->control_regs[reg]);
		udelay(10);
		return 0;
	}
@@ -352,8 +345,7 @@ static int cpg_mstp_clock_is_enabled(struct clk_hw *hw)
	if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
		value = readb(priv->pub.base0 + priv->control_regs[reg]);
	else if (priv->reg_layout == CLK_REG_LAYOUT_RZ_T2H)
		value = cpg_rzt2h_mstp_read(hw,
					    priv->control_regs[reg]);
		value = cpg_rzt2h_mstp_read(priv, priv->control_regs[reg]);
	else
		value = readl(priv->pub.base0 + priv->status_regs[reg]);

@@ -412,7 +404,7 @@ struct clk *cpg_mssr_clk_src_twocell_get(struct of_phandle_args *clkspec,
	}

	if (IS_ERR(clk))
		dev_err(dev, "Cannot get %s clock %u: %ld", type, clkidx,
		dev_err(dev, "Cannot get %s clock %u: %ld\n", type, clkidx,
		       PTR_ERR(clk));
	else
		dev_dbg(dev, "clock (%u, %u) is %pC at %lu Hz\n",
@@ -802,14 +794,14 @@ static int cpg_mrcr_set_reset_state(struct reset_controller_dev *rcdev,

	/* Verify the operation */
	val = readl(reg_addr);

	spin_unlock_irqrestore(&priv->pub.rmw_lock, flags);

	if (set == !(bitmask & val)) {
		dev_err(priv->dev, "Reset register %u%02u operation failed\n", reg, bit);
		spin_unlock_irqrestore(&priv->pub.rmw_lock, flags);
		return -EIO;
	}

	spin_unlock_irqrestore(&priv->pub.rmw_lock, flags);

	return 0;
}

@@ -1085,11 +1077,19 @@ static int cpg_mssr_suspend_noirq(struct device *dev)

	/* Save module registers with bits under our control */
	for (reg = 0; reg < ARRAY_SIZE(priv->smstpcr_saved); reg++) {
		if (priv->smstpcr_saved[reg].mask)
			priv->smstpcr_saved[reg].val =
				priv->reg_layout == CLK_REG_LAYOUT_RZ_A ?
				readb(priv->pub.base0 + priv->control_regs[reg]) :
				readl(priv->pub.base0 + priv->control_regs[reg]);
		u32 val;

		if (!priv->smstpcr_saved[reg].mask)
			continue;

		if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
			val = readb(priv->pub.base0 + priv->control_regs[reg]);
		else if (priv->reg_layout == CLK_REG_LAYOUT_RZ_T2H)
			val = cpg_rzt2h_mstp_read(priv, priv->control_regs[reg]);
		else
			val = readl(priv->pub.base0 + priv->control_regs[reg]);

		priv->smstpcr_saved[reg].val = val;
	}

	/* Save core clocks */
@@ -1120,6 +1120,8 @@ static int cpg_mssr_resume_noirq(struct device *dev)

		if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
			oldval = readb(priv->pub.base0 + priv->control_regs[reg]);
		else if (priv->reg_layout == CLK_REG_LAYOUT_RZ_T2H)
			oldval = cpg_rzt2h_mstp_read(priv, priv->control_regs[reg]);
		else
			oldval = readl(priv->pub.base0 + priv->control_regs[reg]);
		newval = oldval & ~mask;
@@ -1133,6 +1135,12 @@ static int cpg_mssr_resume_noirq(struct device *dev)
			readb(priv->pub.base0 + priv->control_regs[reg]);
			barrier_data(priv->pub.base0 + priv->control_regs[reg]);
			continue;
		} else if (priv->reg_layout == CLK_REG_LAYOUT_RZ_T2H) {
			cpg_rzt2h_mstp_write(priv, priv->control_regs[reg], newval);
			/* See cpg_mstp_clock_endisable() on why this is necessary. */
			cpg_rzt2h_mstp_read(priv, priv->control_regs[reg]);
			udelay(10);
			continue;
		} else
			writel(newval, priv->pub.base0 + priv->control_regs[reg]);

Loading