Merge tag 'renesas-r8a779a0-dt-binding-defs-tag' into clk-renesas-for-v5.10
authorGeert Uytterhoeven <geert+renesas@glider.be>
Thu, 17 Sep 2020 13:32:03 +0000 (15:32 +0200)
committerGeert Uytterhoeven <geert+renesas@glider.be>
Thu, 17 Sep 2020 13:32:03 +0000 (15:32 +0200)
Renesas R-Car V3U DT Binding Definitions

Clock and Power Domain definitions for the Renesas R-Car V3U (R8A779A0)
SoC, shared by driver and DT source files.

12 files changed:
Documentation/devicetree/bindings/clock/renesas,cpg-mssr.yaml
drivers/clk/renesas/r7s9210-cpg-mssr.c
drivers/clk/renesas/r8a7742-cpg-mssr.c
drivers/clk/renesas/r8a7743-cpg-mssr.c
drivers/clk/renesas/r8a7745-cpg-mssr.c
drivers/clk/renesas/r8a77470-cpg-mssr.c
drivers/clk/renesas/r8a7790-cpg-mssr.c
drivers/clk/renesas/r8a7791-cpg-mssr.c
drivers/clk/renesas/r8a7792-cpg-mssr.c
drivers/clk/renesas/r8a7794-cpg-mssr.c
drivers/clk/renesas/renesas-cpg-mssr.c
drivers/clk/renesas/renesas-cpg-mssr.h

index e13aee8..9b414fb 100644 (file)
@@ -47,6 +47,7 @@ properties:
       - renesas,r8a77980-cpg-mssr # R-Car V3H
       - renesas,r8a77990-cpg-mssr # R-Car E3
       - renesas,r8a77995-cpg-mssr # R-Car D3
+      - renesas,r8a779a0-cpg-mssr # R-Car V3U
 
   reg:
     maxItems: 1
index 443bff0..a85227c 100644 (file)
@@ -214,7 +214,7 @@ const struct cpg_mssr_info r7s9210_cpg_mssr_info __initconst = {
        .cpg_clk_register = rza2_cpg_clk_register,
 
        /* RZ/A2 has Standby Control Registers */
-       .stbyctrl = true,
+       .reg_layout = CLK_REG_LAYOUT_RZ_A,
 };
 
 static void __init r7s9210_cpg_mssr_early_init(struct device_node *np)
index e919828..e541489 100644 (file)
@@ -97,7 +97,8 @@ static const struct mssr_mod_clk r8a7742_mod_clks[] __initconst = {
        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("vspr",                  130,   R8A7742_CLK_ZS),
+       DEF_MOD("vsps",                  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),
index c01d9af..0bba12a 100644 (file)
@@ -92,7 +92,7 @@ static const struct mssr_mod_clk r8a7743_mod_clks[] __initconst = {
        DEF_MOD("tmu0",                  125,   R8A7743_CLK_CP),
        DEF_MOD("vsp1du1",               127,   R8A7743_CLK_ZS),
        DEF_MOD("vsp1du0",               128,   R8A7743_CLK_ZS),
-       DEF_MOD("vsp1-sy",               131,   R8A7743_CLK_ZS),
+       DEF_MOD("vsps",                  131,   R8A7743_CLK_ZS),
        DEF_MOD("scifa2",                202,   R8A7743_CLK_MP),
        DEF_MOD("scifa1",                203,   R8A7743_CLK_MP),
        DEF_MOD("scifa0",                204,   R8A7743_CLK_MP),
index 493874e..dc4a64e 100644 (file)
@@ -90,7 +90,7 @@ static const struct mssr_mod_clk r8a7745_mod_clks[] __initconst = {
        DEF_MOD("cmt0",                  124,   R8A7745_CLK_R),
        DEF_MOD("tmu0",                  125,   R8A7745_CLK_CP),
        DEF_MOD("vsp1du0",               128,   R8A7745_CLK_ZS),
-       DEF_MOD("vsp1-sy",               131,   R8A7745_CLK_ZS),
+       DEF_MOD("vsps",                  131,   R8A7745_CLK_ZS),
        DEF_MOD("scifa2",                202,   R8A7745_CLK_MP),
        DEF_MOD("scifa1",                203,   R8A7745_CLK_MP),
        DEF_MOD("scifa0",                204,   R8A7745_CLK_MP),
index d81ae65..f3d6e65 100644 (file)
@@ -85,7 +85,7 @@ static const struct mssr_mod_clk r8a77470_mod_clks[] __initconst = {
        DEF_MOD("tmu2",                  122,   R8A77470_CLK_P),
        DEF_MOD("cmt0",                  124,   R8A77470_CLK_R),
        DEF_MOD("vsp1du0",               128,   R8A77470_CLK_ZS),
-       DEF_MOD("vsp1-sy",               131,   R8A77470_CLK_ZS),
+       DEF_MOD("vsps",                  131,   R8A77470_CLK_ZS),
        DEF_MOD("msiof2",                205,   R8A77470_CLK_MP),
        DEF_MOD("msiof1",                208,   R8A77470_CLK_MP),
        DEF_MOD("sys-dmac1",             218,   R8A77470_CLK_ZS),
index c57cb93..f7d233e 100644 (file)
@@ -108,8 +108,8 @@ static const struct mssr_mod_clk r8a7790_mod_clks[] __initconst = {
        DEF_MOD("tmu0",                  125,   R8A7790_CLK_CP),
        DEF_MOD("vsp1du1",               127,   R8A7790_CLK_ZS),
        DEF_MOD("vsp1du0",               128,   R8A7790_CLK_ZS),
-       DEF_MOD("vsp1-rt",               130,   R8A7790_CLK_ZS),
-       DEF_MOD("vsp1-sy",               131,   R8A7790_CLK_ZS),
+       DEF_MOD("vspr",                  130,   R8A7790_CLK_ZS),
+       DEF_MOD("vsps",                  131,   R8A7790_CLK_ZS),
        DEF_MOD("scifa2",                202,   R8A7790_CLK_MP),
        DEF_MOD("scifa1",                203,   R8A7790_CLK_MP),
        DEF_MOD("scifa0",                204,   R8A7790_CLK_MP),
index 65702de..a0de784 100644 (file)
@@ -102,7 +102,7 @@ static const struct mssr_mod_clk r8a7791_mod_clks[] __initconst = {
        DEF_MOD("tmu0",                  125,   R8A7791_CLK_CP),
        DEF_MOD("vsp1du1",               127,   R8A7791_CLK_ZS),
        DEF_MOD("vsp1du0",               128,   R8A7791_CLK_ZS),
-       DEF_MOD("vsp1-sy",               131,   R8A7791_CLK_ZS),
+       DEF_MOD("vsps",                  131,   R8A7791_CLK_ZS),
        DEF_MOD("scifa2",                202,   R8A7791_CLK_MP),
        DEF_MOD("scifa1",                203,   R8A7791_CLK_MP),
        DEF_MOD("scifa0",                204,   R8A7791_CLK_MP),
index cf8b84a..77af250 100644 (file)
@@ -88,7 +88,7 @@ static const struct mssr_mod_clk r8a7792_mod_clks[] __initconst = {
        DEF_MOD("tmu0",                  125,   R8A7792_CLK_CP),
        DEF_MOD("vsp1du1",               127,   R8A7792_CLK_ZS),
        DEF_MOD("vsp1du0",               128,   R8A7792_CLK_ZS),
-       DEF_MOD("vsp1-sy",               131,   R8A7792_CLK_ZS),
+       DEF_MOD("vsps",                  131,   R8A7792_CLK_ZS),
        DEF_MOD("msiof1",                208,   R8A7792_CLK_MP),
        DEF_MOD("sys-dmac1",             218,   R8A7792_CLK_ZS),
        DEF_MOD("sys-dmac0",             219,   R8A7792_CLK_ZS),
index c194869..4d7fa26 100644 (file)
@@ -97,7 +97,7 @@ static const struct mssr_mod_clk r8a7794_mod_clks[] __initconst = {
        DEF_MOD("cmt0",                  124,   R8A7794_CLK_R),
        DEF_MOD("tmu0",                  125,   R8A7794_CLK_CP),
        DEF_MOD("vsp1du0",               128,   R8A7794_CLK_ZS),
-       DEF_MOD("vsp1-sy",               131,   R8A7794_CLK_ZS),
+       DEF_MOD("vsps",                  131,   R8A7794_CLK_ZS),
        DEF_MOD("scifa2",                202,   R8A7794_CLK_MP),
        DEF_MOD("scifa1",                203,   R8A7794_CLK_MP),
        DEF_MOD("scifa0",                204,   R8A7794_CLK_MP),
index 5a306d2..d74223e 100644 (file)
@@ -57,9 +57,6 @@ static const u16 mstpsr[] = {
        0x9A0, 0x9A4, 0x9A8, 0x9AC,
 };
 
-#define        MSTPSR(i)       mstpsr[i]
-
-
 /*
  * System Module Stop Control Register offsets
  */
@@ -69,8 +66,6 @@ static const u16 smstpcr[] = {
        0x990, 0x994, 0x998, 0x99C,
 };
 
-#define        SMSTPCR(i)      smstpcr[i]
-
 /*
  * Standby Control Register offsets (RZ/A)
  * Base address is FRQCR register
@@ -81,8 +76,6 @@ static const u16 stbcr[] = {
        0x424, 0x428, 0x42C,
 };
 
-#define        STBCR(i)        stbcr[i]
-
 /*
  * Software Reset Register offsets
  */
@@ -92,9 +85,6 @@ static const u16 srcr[] = {
        0x920, 0x924, 0x928, 0x92C,
 };
 
-#define        SRCR(i)         srcr[i]
-
-
 /* Realtime Module Stop Control Register offsets */
 #define RMSTPCR(i)     (smstpcr[i] - 0x20)
 
@@ -102,8 +92,11 @@ static const u16 srcr[] = {
 #define MMSTPCR(i)     (smstpcr[i] + 0x20)
 
 /* Software Reset Clearing Register offsets */
-#define        SRSTCLR(i)      (0x940 + (i) * 4)
 
+static const u16 srstclr[] = {
+       0x940, 0x944, 0x948, 0x94C, 0x950, 0x954, 0x958, 0x95C,
+       0x960, 0x964, 0x968, 0x96C,
+};
 
 /**
  * Clock Pulse Generator / Module Standby and Software Reset Private Data
@@ -111,13 +104,17 @@ static const u16 srcr[] = {
  * @rcdev: Optional reset controller entity
  * @dev: CPG/MSSR device
  * @base: CPG/MSSR register block base address
+ * @reg_layout: CPG/MSSR register layout
  * @rmw_lock: protects RMW register accesses
  * @np: Device node in DT for this CPG/MSSR module
  * @num_core_clks: Number of Core Clocks in clks[]
  * @num_mod_clks: Number of Module Clocks in clks[]
  * @last_dt_core_clk: ID of the last Core Clock exported to DT
- * @stbyctrl: This device has Standby Control Registers
  * @notifiers: Notifier chain to save/restore clock state for system resume
+ * @status_regs: Pointer to status registers array
+ * @control_regs: Pointer to control registers array
+ * @reset_regs: Pointer to reset registers array
+ * @reset_clear_regs:  Pointer to reset clearing registers array
  * @smstpcr_saved[].mask: Mask of SMSTPCR[] bits under our control
  * @smstpcr_saved[].val: Saved values of SMSTPCR[]
  * @clks: Array containing all Core and Module Clocks
@@ -128,15 +125,19 @@ struct cpg_mssr_priv {
 #endif
        struct device *dev;
        void __iomem *base;
+       enum clk_reg_layout reg_layout;
        spinlock_t rmw_lock;
        struct device_node *np;
 
        unsigned int num_core_clks;
        unsigned int num_mod_clks;
        unsigned int last_dt_core_clk;
-       bool stbyctrl;
 
        struct raw_notifier_head notifiers;
+       const u16 *status_regs;
+       const u16 *control_regs;
+       const u16 *reset_regs;
+       const u16 *reset_clear_regs;
        struct {
                u32 mask;
                u32 val;
@@ -177,40 +178,40 @@ static int cpg_mstp_clock_endisable(struct clk_hw *hw, bool enable)
                enable ? "ON" : "OFF");
        spin_lock_irqsave(&priv->rmw_lock, flags);
 
-       if (priv->stbyctrl) {
-               value = readb(priv->base + STBCR(reg));
+       if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
+               value = readb(priv->base + priv->control_regs[reg]);
                if (enable)
                        value &= ~bitmask;
                else
                        value |= bitmask;
-               writeb(value, priv->base + STBCR(reg));
+               writeb(value, priv->base + priv->control_regs[reg]);
 
                /* dummy read to ensure write has completed */
-               readb(priv->base + STBCR(reg));
-               barrier_data(priv->base + STBCR(reg));
+               readb(priv->base + priv->control_regs[reg]);
+               barrier_data(priv->base + priv->control_regs[reg]);
        } else {
-               value = readl(priv->base + SMSTPCR(reg));
+               value = readl(priv->base + priv->control_regs[reg]);
                if (enable)
                        value &= ~bitmask;
                else
                        value |= bitmask;
-               writel(value, priv->base + SMSTPCR(reg));
+               writel(value, priv->base + priv->control_regs[reg]);
        }
 
        spin_unlock_irqrestore(&priv->rmw_lock, flags);
 
-       if (!enable || priv->stbyctrl)
+       if (!enable || priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
                return 0;
 
        for (i = 1000; i > 0; --i) {
-               if (!(readl(priv->base + MSTPSR(reg)) & bitmask))
+               if (!(readl(priv->base + priv->status_regs[reg]) & bitmask))
                        break;
                cpu_relax();
        }
 
        if (!i) {
                dev_err(dev, "Failed to enable SMSTP %p[%d]\n",
-                       priv->base + SMSTPCR(reg), bit);
+                       priv->base + priv->control_regs[reg], bit);
                return -ETIMEDOUT;
        }
 
@@ -233,10 +234,10 @@ static int cpg_mstp_clock_is_enabled(struct clk_hw *hw)
        struct cpg_mssr_priv *priv = clock->priv;
        u32 value;
 
-       if (priv->stbyctrl)
-               value = readb(priv->base + STBCR(clock->index / 32));
+       if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
+               value = readb(priv->base + priv->control_regs[clock->index / 32]);
        else
-               value = readl(priv->base + MSTPSR(clock->index / 32));
+               value = readl(priv->base + priv->status_regs[clock->index / 32]);
 
        return !(value & BIT(clock->index % 32));
 }
@@ -272,7 +273,7 @@ struct clk *cpg_mssr_clk_src_twocell_get(struct of_phandle_args *clkspec,
 
        case CPG_MOD:
                type = "module";
-               if (priv->stbyctrl) {
+               if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
                        idx = MOD_CLK_PACK_10(clkidx);
                        range_check = 7 - (clkidx % 10);
                } else {
@@ -578,13 +579,13 @@ static int cpg_mssr_reset(struct reset_controller_dev *rcdev,
        dev_dbg(priv->dev, "reset %u%02u\n", reg, bit);
 
        /* Reset module */
-       writel(bitmask, priv->base + SRCR(reg));
+       writel(bitmask, priv->base + priv->reset_regs[reg]);
 
        /* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
        udelay(35);
 
        /* Release module from reset state */
-       writel(bitmask, priv->base + SRSTCLR(reg));
+       writel(bitmask, priv->base + priv->reset_clear_regs[reg]);
 
        return 0;
 }
@@ -598,7 +599,7 @@ static int cpg_mssr_assert(struct reset_controller_dev *rcdev, unsigned long id)
 
        dev_dbg(priv->dev, "assert %u%02u\n", reg, bit);
 
-       writel(bitmask, priv->base + SRCR(reg));
+       writel(bitmask, priv->base + priv->reset_regs[reg]);
        return 0;
 }
 
@@ -612,7 +613,7 @@ static int cpg_mssr_deassert(struct reset_controller_dev *rcdev,
 
        dev_dbg(priv->dev, "deassert %u%02u\n", reg, bit);
 
-       writel(bitmask, priv->base + SRSTCLR(reg));
+       writel(bitmask, priv->base + priv->reset_clear_regs[reg]);
        return 0;
 }
 
@@ -624,7 +625,7 @@ static int cpg_mssr_status(struct reset_controller_dev *rcdev,
        unsigned int bit = id % 32;
        u32 bitmask = BIT(bit);
 
-       return !!(readl(priv->base + SRCR(reg)) & bitmask);
+       return !!(readl(priv->base + priv->reset_regs[reg]) & bitmask);
 }
 
 static const struct reset_control_ops cpg_mssr_reset_ops = {
@@ -825,9 +826,10 @@ 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->stbyctrl ?
-                               readb(priv->base + STBCR(reg)) :
-                               readl(priv->base + SMSTPCR(reg));
+                       priv->smstpcr_saved[reg].val =
+                               priv->reg_layout == CLK_REG_LAYOUT_RZ_A ?
+                               readb(priv->base + priv->control_regs[reg]) :
+                               readl(priv->base + priv->control_regs[reg]);
        }
 
        /* Save core clocks */
@@ -855,23 +857,23 @@ static int cpg_mssr_resume_noirq(struct device *dev)
                if (!mask)
                        continue;
 
-               if (priv->stbyctrl)
-                       oldval = readb(priv->base + STBCR(reg));
+               if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
+                       oldval = readb(priv->base + priv->control_regs[reg]);
                else
-                       oldval = readl(priv->base + SMSTPCR(reg));
+                       oldval = readl(priv->base + priv->control_regs[reg]);
                newval = oldval & ~mask;
                newval |= priv->smstpcr_saved[reg].val & mask;
                if (newval == oldval)
                        continue;
 
-               if (priv->stbyctrl) {
-                       writeb(newval, priv->base + STBCR(reg));
+               if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
+                       writeb(newval, priv->base + priv->control_regs[reg]);
                        /* dummy read to ensure write has completed */
-                       readb(priv->base + STBCR(reg));
-                       barrier_data(priv->base + STBCR(reg));
+                       readb(priv->base + priv->control_regs[reg]);
+                       barrier_data(priv->base + priv->control_regs[reg]);
                        continue;
                } else
-                       writel(newval, priv->base + SMSTPCR(reg));
+                       writel(newval, priv->base + priv->control_regs[reg]);
 
                /* Wait until enabled clocks are really enabled */
                mask &= ~priv->smstpcr_saved[reg].val;
@@ -879,7 +881,7 @@ static int cpg_mssr_resume_noirq(struct device *dev)
                        continue;
 
                for (i = 1000; i > 0; --i) {
-                       oldval = readl(priv->base + MSTPSR(reg));
+                       oldval = readl(priv->base + priv->status_regs[reg]);
                        if (!(oldval & mask))
                                break;
                        cpu_relax();
@@ -887,8 +889,8 @@ static int cpg_mssr_resume_noirq(struct device *dev)
 
                if (!i)
                        dev_warn(dev, "Failed to enable %s%u[0x%x]\n",
-                                priv->stbyctrl ? "STB" : "SMSTP", reg,
-                                oldval & mask);
+                                priv->reg_layout == CLK_REG_LAYOUT_RZ_A ?
+                                "STB" : "SMSTP", reg, oldval & mask);
        }
 
        return 0;
@@ -937,7 +939,18 @@ static int __init cpg_mssr_common_init(struct device *dev,
        priv->num_mod_clks = info->num_hw_mod_clks;
        priv->last_dt_core_clk = info->last_dt_core_clk;
        RAW_INIT_NOTIFIER_HEAD(&priv->notifiers);
-       priv->stbyctrl = info->stbyctrl;
+       priv->reg_layout = info->reg_layout;
+       if (priv->reg_layout == CLK_REG_LAYOUT_RCAR_GEN2_AND_GEN3) {
+               priv->status_regs = mstpsr;
+               priv->control_regs = smstpcr;
+               priv->reset_regs = srcr;
+               priv->reset_clear_regs = srstclr;
+       } else if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
+               priv->control_regs = stbcr;
+       } else {
+               error = -EINVAL;
+               goto out_err;
+       }
 
        for (i = 0; i < nclks; i++)
                priv->clks[i] = ERR_PTR(-ENOENT);
@@ -1015,7 +1028,7 @@ static int __init cpg_mssr_probe(struct platform_device *pdev)
                return error;
 
        /* Reset Controller not supported for Standby Control SoCs */
-       if (info->stbyctrl)
+       if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
                return 0;
 
        error = cpg_mssr_reset_controller_register(priv);
index 1cc5694..f369b06 100644 (file)
@@ -85,6 +85,11 @@ struct mssr_mod_clk {
 
 struct device_node;
 
+enum clk_reg_layout {
+       CLK_REG_LAYOUT_RCAR_GEN2_AND_GEN3 = 0,
+       CLK_REG_LAYOUT_RZ_A,
+};
+
     /**
      * SoC-specific CPG/MSSR Description
      *
@@ -105,6 +110,7 @@ struct device_node;
      * @crit_mod_clks: Array with Module Clock IDs of critical clocks that
      *                 should not be disabled without a knowledgeable driver
      * @num_crit_mod_clks: Number of entries in crit_mod_clks[]
+     * @reg_layout: CPG/MSSR register layout from enum clk_reg_layout
      *
      * @core_pm_clks: Array with IDs of Core Clocks that are suitable for Power
      *                Management, in addition to Module Clocks
@@ -112,10 +118,6 @@ struct device_node;
      *
      * @init: Optional callback to perform SoC-specific initialization
      * @cpg_clk_register: Optional callback to handle special Core Clock types
-     *
-     * @stbyctrl: This device has Standby Control Registers which are 8-bits
-     *            wide, no status registers (MSTPSR) and have different address
-     *            offsets.
      */
 
 struct cpg_mssr_info {
@@ -130,7 +132,7 @@ struct cpg_mssr_info {
        unsigned int num_core_clks;
        unsigned int last_dt_core_clk;
        unsigned int num_total_core_clks;
-       bool stbyctrl;
+       enum clk_reg_layout reg_layout;
 
        /* Module Clocks */
        const struct mssr_mod_clk *mod_clks;