cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

renesas-cpg-mssr.c (28174B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Renesas Clock Pulse Generator / Module Standby and Software Reset
      4 *
      5 * Copyright (C) 2015 Glider bvba
      6 *
      7 * Based on clk-mstp.c, clk-rcar-gen2.c, and clk-rcar-gen3.c
      8 *
      9 * Copyright (C) 2013 Ideas On Board SPRL
     10 * Copyright (C) 2015 Renesas Electronics Corp.
     11 */
     12
     13#include <linux/clk.h>
     14#include <linux/clk-provider.h>
     15#include <linux/clk/renesas.h>
     16#include <linux/delay.h>
     17#include <linux/device.h>
     18#include <linux/init.h>
     19#include <linux/io.h>
     20#include <linux/mod_devicetable.h>
     21#include <linux/module.h>
     22#include <linux/of_address.h>
     23#include <linux/of_device.h>
     24#include <linux/platform_device.h>
     25#include <linux/pm_clock.h>
     26#include <linux/pm_domain.h>
     27#include <linux/psci.h>
     28#include <linux/reset-controller.h>
     29#include <linux/slab.h>
     30
     31#include <dt-bindings/clock/renesas-cpg-mssr.h>
     32
     33#include "renesas-cpg-mssr.h"
     34#include "clk-div6.h"
     35
     36#ifdef DEBUG
     37#define WARN_DEBUG(x)	WARN_ON(x)
     38#else
     39#define WARN_DEBUG(x)	do { } while (0)
     40#endif
     41
     42
     43/*
     44 * Module Standby and Software Reset register offets.
     45 *
     46 * If the registers exist, these are valid for SH-Mobile, R-Mobile,
     47 * R-Car Gen2, R-Car Gen3, and RZ/G1.
     48 * These are NOT valid for R-Car Gen1 and RZ/A1!
     49 */
     50
     51/*
     52 * Module Stop Status Register offsets
     53 */
     54
     55static const u16 mstpsr[] = {
     56	0x030, 0x038, 0x040, 0x048, 0x04C, 0x03C, 0x1C0, 0x1C4,
     57	0x9A0, 0x9A4, 0x9A8, 0x9AC,
     58};
     59
     60static const u16 mstpsr_for_gen4[] = {
     61	0x2E00, 0x2E04, 0x2E08, 0x2E0C, 0x2E10, 0x2E14, 0x2E18, 0x2E1C,
     62	0x2E20, 0x2E24, 0x2E28, 0x2E2C, 0x2E30, 0x2E34, 0x2E38, 0x2E3C,
     63	0x2E40, 0x2E44, 0x2E48, 0x2E4C, 0x2E50, 0x2E54, 0x2E58, 0x2E5C,
     64	0x2E60, 0x2E64, 0x2E68, 0x2E6C,
     65};
     66
     67/*
     68 * System Module Stop Control Register offsets
     69 */
     70
     71static const u16 smstpcr[] = {
     72	0x130, 0x134, 0x138, 0x13C, 0x140, 0x144, 0x148, 0x14C,
     73	0x990, 0x994, 0x998, 0x99C,
     74};
     75
     76static const u16 mstpcr_for_gen4[] = {
     77	0x2D00, 0x2D04, 0x2D08, 0x2D0C, 0x2D10, 0x2D14, 0x2D18, 0x2D1C,
     78	0x2D20, 0x2D24, 0x2D28, 0x2D2C, 0x2D30, 0x2D34, 0x2D38, 0x2D3C,
     79	0x2D40, 0x2D44, 0x2D48, 0x2D4C, 0x2D50, 0x2D54, 0x2D58, 0x2D5C,
     80	0x2D60, 0x2D64, 0x2D68, 0x2D6C,
     81};
     82
     83/*
     84 * Standby Control Register offsets (RZ/A)
     85 * Base address is FRQCR register
     86 */
     87
     88static const u16 stbcr[] = {
     89	0xFFFF/*dummy*/, 0x010, 0x014, 0x410, 0x414, 0x418, 0x41C, 0x420,
     90	0x424, 0x428, 0x42C,
     91};
     92
     93/*
     94 * Software Reset Register offsets
     95 */
     96
     97static const u16 srcr[] = {
     98	0x0A0, 0x0A8, 0x0B0, 0x0B8, 0x0BC, 0x0C4, 0x1C8, 0x1CC,
     99	0x920, 0x924, 0x928, 0x92C,
    100};
    101
    102static const u16 srcr_for_gen4[] = {
    103	0x2C00, 0x2C04, 0x2C08, 0x2C0C, 0x2C10, 0x2C14, 0x2C18, 0x2C1C,
    104	0x2C20, 0x2C24, 0x2C28, 0x2C2C, 0x2C30, 0x2C34, 0x2C38, 0x2C3C,
    105	0x2C40, 0x2C44, 0x2C48, 0x2C4C, 0x2C50, 0x2C54, 0x2C58, 0x2C5C,
    106	0x2C60, 0x2C64, 0x2C68, 0x2C6C,
    107};
    108
    109/*
    110 * Software Reset Clearing Register offsets
    111 */
    112
    113static const u16 srstclr[] = {
    114	0x940, 0x944, 0x948, 0x94C, 0x950, 0x954, 0x958, 0x95C,
    115	0x960, 0x964, 0x968, 0x96C,
    116};
    117
    118static const u16 srstclr_for_gen4[] = {
    119	0x2C80, 0x2C84, 0x2C88, 0x2C8C, 0x2C90, 0x2C94, 0x2C98, 0x2C9C,
    120	0x2CA0, 0x2CA4, 0x2CA8, 0x2CAC, 0x2CB0, 0x2CB4, 0x2CB8, 0x2CBC,
    121	0x2CC0, 0x2CC4, 0x2CC8, 0x2CCC, 0x2CD0, 0x2CD4, 0x2CD8, 0x2CDC,
    122	0x2CE0, 0x2CE4, 0x2CE8, 0x2CEC,
    123};
    124
    125/**
    126 * struct cpg_mssr_priv - Clock Pulse Generator / Module Standby
    127 *                        and Software Reset Private Data
    128 *
    129 * @rcdev: Optional reset controller entity
    130 * @dev: CPG/MSSR device
    131 * @base: CPG/MSSR register block base address
    132 * @reg_layout: CPG/MSSR register layout
    133 * @rmw_lock: protects RMW register accesses
    134 * @np: Device node in DT for this CPG/MSSR module
    135 * @num_core_clks: Number of Core Clocks in clks[]
    136 * @num_mod_clks: Number of Module Clocks in clks[]
    137 * @last_dt_core_clk: ID of the last Core Clock exported to DT
    138 * @notifiers: Notifier chain to save/restore clock state for system resume
    139 * @status_regs: Pointer to status registers array
    140 * @control_regs: Pointer to control registers array
    141 * @reset_regs: Pointer to reset registers array
    142 * @reset_clear_regs:  Pointer to reset clearing registers array
    143 * @smstpcr_saved: [].mask: Mask of SMSTPCR[] bits under our control
    144 *                 [].val: Saved values of SMSTPCR[]
    145 * @clks: Array containing all Core and Module Clocks
    146 */
    147struct cpg_mssr_priv {
    148#ifdef CONFIG_RESET_CONTROLLER
    149	struct reset_controller_dev rcdev;
    150#endif
    151	struct device *dev;
    152	void __iomem *base;
    153	enum clk_reg_layout reg_layout;
    154	spinlock_t rmw_lock;
    155	struct device_node *np;
    156
    157	unsigned int num_core_clks;
    158	unsigned int num_mod_clks;
    159	unsigned int last_dt_core_clk;
    160
    161	struct raw_notifier_head notifiers;
    162	const u16 *status_regs;
    163	const u16 *control_regs;
    164	const u16 *reset_regs;
    165	const u16 *reset_clear_regs;
    166	struct {
    167		u32 mask;
    168		u32 val;
    169	} smstpcr_saved[ARRAY_SIZE(mstpsr_for_gen4)];
    170
    171	struct clk *clks[];
    172};
    173
    174static struct cpg_mssr_priv *cpg_mssr_priv;
    175
    176/**
    177 * struct mstp_clock - MSTP gating clock
    178 * @hw: handle between common and hardware-specific interfaces
    179 * @index: MSTP clock number
    180 * @priv: CPG/MSSR private data
    181 */
    182struct mstp_clock {
    183	struct clk_hw hw;
    184	u32 index;
    185	struct cpg_mssr_priv *priv;
    186};
    187
    188#define to_mstp_clock(_hw) container_of(_hw, struct mstp_clock, hw)
    189
    190static int cpg_mstp_clock_endisable(struct clk_hw *hw, bool enable)
    191{
    192	struct mstp_clock *clock = to_mstp_clock(hw);
    193	struct cpg_mssr_priv *priv = clock->priv;
    194	unsigned int reg = clock->index / 32;
    195	unsigned int bit = clock->index % 32;
    196	struct device *dev = priv->dev;
    197	u32 bitmask = BIT(bit);
    198	unsigned long flags;
    199	unsigned int i;
    200	u32 value;
    201
    202	dev_dbg(dev, "MSTP %u%02u/%pC %s\n", reg, bit, hw->clk,
    203		enable ? "ON" : "OFF");
    204	spin_lock_irqsave(&priv->rmw_lock, flags);
    205
    206	if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
    207		value = readb(priv->base + priv->control_regs[reg]);
    208		if (enable)
    209			value &= ~bitmask;
    210		else
    211			value |= bitmask;
    212		writeb(value, priv->base + priv->control_regs[reg]);
    213
    214		/* dummy read to ensure write has completed */
    215		readb(priv->base + priv->control_regs[reg]);
    216		barrier_data(priv->base + priv->control_regs[reg]);
    217	} else {
    218		value = readl(priv->base + priv->control_regs[reg]);
    219		if (enable)
    220			value &= ~bitmask;
    221		else
    222			value |= bitmask;
    223		writel(value, priv->base + priv->control_regs[reg]);
    224	}
    225
    226	spin_unlock_irqrestore(&priv->rmw_lock, flags);
    227
    228	if (!enable || priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
    229		return 0;
    230
    231	for (i = 1000; i > 0; --i) {
    232		if (!(readl(priv->base + priv->status_regs[reg]) & bitmask))
    233			break;
    234		cpu_relax();
    235	}
    236
    237	if (!i) {
    238		dev_err(dev, "Failed to enable SMSTP %p[%d]\n",
    239			priv->base + priv->control_regs[reg], bit);
    240		return -ETIMEDOUT;
    241	}
    242
    243	return 0;
    244}
    245
    246static int cpg_mstp_clock_enable(struct clk_hw *hw)
    247{
    248	return cpg_mstp_clock_endisable(hw, true);
    249}
    250
    251static void cpg_mstp_clock_disable(struct clk_hw *hw)
    252{
    253	cpg_mstp_clock_endisable(hw, false);
    254}
    255
    256static int cpg_mstp_clock_is_enabled(struct clk_hw *hw)
    257{
    258	struct mstp_clock *clock = to_mstp_clock(hw);
    259	struct cpg_mssr_priv *priv = clock->priv;
    260	u32 value;
    261
    262	if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
    263		value = readb(priv->base + priv->control_regs[clock->index / 32]);
    264	else
    265		value = readl(priv->base + priv->status_regs[clock->index / 32]);
    266
    267	return !(value & BIT(clock->index % 32));
    268}
    269
    270static const struct clk_ops cpg_mstp_clock_ops = {
    271	.enable = cpg_mstp_clock_enable,
    272	.disable = cpg_mstp_clock_disable,
    273	.is_enabled = cpg_mstp_clock_is_enabled,
    274};
    275
    276static
    277struct clk *cpg_mssr_clk_src_twocell_get(struct of_phandle_args *clkspec,
    278					 void *data)
    279{
    280	unsigned int clkidx = clkspec->args[1];
    281	struct cpg_mssr_priv *priv = data;
    282	struct device *dev = priv->dev;
    283	unsigned int idx;
    284	const char *type;
    285	struct clk *clk;
    286	int range_check;
    287
    288	switch (clkspec->args[0]) {
    289	case CPG_CORE:
    290		type = "core";
    291		if (clkidx > priv->last_dt_core_clk) {
    292			dev_err(dev, "Invalid %s clock index %u\n", type,
    293			       clkidx);
    294			return ERR_PTR(-EINVAL);
    295		}
    296		clk = priv->clks[clkidx];
    297		break;
    298
    299	case CPG_MOD:
    300		type = "module";
    301		if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
    302			idx = MOD_CLK_PACK_10(clkidx);
    303			range_check = 7 - (clkidx % 10);
    304		} else {
    305			idx = MOD_CLK_PACK(clkidx);
    306			range_check = 31 - (clkidx % 100);
    307		}
    308		if (range_check < 0 || idx >= priv->num_mod_clks) {
    309			dev_err(dev, "Invalid %s clock index %u\n", type,
    310				clkidx);
    311			return ERR_PTR(-EINVAL);
    312		}
    313		clk = priv->clks[priv->num_core_clks + idx];
    314		break;
    315
    316	default:
    317		dev_err(dev, "Invalid CPG clock type %u\n", clkspec->args[0]);
    318		return ERR_PTR(-EINVAL);
    319	}
    320
    321	if (IS_ERR(clk))
    322		dev_err(dev, "Cannot get %s clock %u: %ld", type, clkidx,
    323		       PTR_ERR(clk));
    324	else
    325		dev_dbg(dev, "clock (%u, %u) is %pC at %lu Hz\n",
    326			clkspec->args[0], clkspec->args[1], clk,
    327			clk_get_rate(clk));
    328	return clk;
    329}
    330
    331static void __init cpg_mssr_register_core_clk(const struct cpg_core_clk *core,
    332					      const struct cpg_mssr_info *info,
    333					      struct cpg_mssr_priv *priv)
    334{
    335	struct clk *clk = ERR_PTR(-ENOTSUPP), *parent;
    336	struct device *dev = priv->dev;
    337	unsigned int id = core->id, div = core->div;
    338	const char *parent_name;
    339
    340	WARN_DEBUG(id >= priv->num_core_clks);
    341	WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT);
    342
    343	if (!core->name) {
    344		/* Skip NULLified clock */
    345		return;
    346	}
    347
    348	switch (core->type) {
    349	case CLK_TYPE_IN:
    350		clk = of_clk_get_by_name(priv->np, core->name);
    351		break;
    352
    353	case CLK_TYPE_FF:
    354	case CLK_TYPE_DIV6P1:
    355	case CLK_TYPE_DIV6_RO:
    356		WARN_DEBUG(core->parent >= priv->num_core_clks);
    357		parent = priv->clks[core->parent];
    358		if (IS_ERR(parent)) {
    359			clk = parent;
    360			goto fail;
    361		}
    362
    363		parent_name = __clk_get_name(parent);
    364
    365		if (core->type == CLK_TYPE_DIV6_RO)
    366			/* Multiply with the DIV6 register value */
    367			div *= (readl(priv->base + core->offset) & 0x3f) + 1;
    368
    369		if (core->type == CLK_TYPE_DIV6P1) {
    370			clk = cpg_div6_register(core->name, 1, &parent_name,
    371						priv->base + core->offset,
    372						&priv->notifiers);
    373		} else {
    374			clk = clk_register_fixed_factor(NULL, core->name,
    375							parent_name, 0,
    376							core->mult, div);
    377		}
    378		break;
    379
    380	case CLK_TYPE_FR:
    381		clk = clk_register_fixed_rate(NULL, core->name, NULL, 0,
    382					      core->mult);
    383		break;
    384
    385	default:
    386		if (info->cpg_clk_register)
    387			clk = info->cpg_clk_register(dev, core, info,
    388						     priv->clks, priv->base,
    389						     &priv->notifiers);
    390		else
    391			dev_err(dev, "%s has unsupported core clock type %u\n",
    392				core->name, core->type);
    393		break;
    394	}
    395
    396	if (IS_ERR_OR_NULL(clk))
    397		goto fail;
    398
    399	dev_dbg(dev, "Core clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
    400	priv->clks[id] = clk;
    401	return;
    402
    403fail:
    404	dev_err(dev, "Failed to register %s clock %s: %ld\n", "core",
    405		core->name, PTR_ERR(clk));
    406}
    407
    408static void __init cpg_mssr_register_mod_clk(const struct mssr_mod_clk *mod,
    409					     const struct cpg_mssr_info *info,
    410					     struct cpg_mssr_priv *priv)
    411{
    412	struct mstp_clock *clock = NULL;
    413	struct device *dev = priv->dev;
    414	unsigned int id = mod->id;
    415	struct clk_init_data init = {};
    416	struct clk *parent, *clk;
    417	const char *parent_name;
    418	unsigned int i;
    419
    420	WARN_DEBUG(id < priv->num_core_clks);
    421	WARN_DEBUG(id >= priv->num_core_clks + priv->num_mod_clks);
    422	WARN_DEBUG(mod->parent >= priv->num_core_clks + priv->num_mod_clks);
    423	WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT);
    424
    425	if (!mod->name) {
    426		/* Skip NULLified clock */
    427		return;
    428	}
    429
    430	parent = priv->clks[mod->parent];
    431	if (IS_ERR(parent)) {
    432		clk = parent;
    433		goto fail;
    434	}
    435
    436	clock = kzalloc(sizeof(*clock), GFP_KERNEL);
    437	if (!clock) {
    438		clk = ERR_PTR(-ENOMEM);
    439		goto fail;
    440	}
    441
    442	init.name = mod->name;
    443	init.ops = &cpg_mstp_clock_ops;
    444	init.flags = CLK_SET_RATE_PARENT;
    445	parent_name = __clk_get_name(parent);
    446	init.parent_names = &parent_name;
    447	init.num_parents = 1;
    448
    449	clock->index = id - priv->num_core_clks;
    450	clock->priv = priv;
    451	clock->hw.init = &init;
    452
    453	for (i = 0; i < info->num_crit_mod_clks; i++)
    454		if (id == info->crit_mod_clks[i] &&
    455		    cpg_mstp_clock_is_enabled(&clock->hw)) {
    456			dev_dbg(dev, "MSTP %s setting CLK_IS_CRITICAL\n",
    457				mod->name);
    458			init.flags |= CLK_IS_CRITICAL;
    459			break;
    460		}
    461
    462	clk = clk_register(NULL, &clock->hw);
    463	if (IS_ERR(clk))
    464		goto fail;
    465
    466	dev_dbg(dev, "Module clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
    467	priv->clks[id] = clk;
    468	priv->smstpcr_saved[clock->index / 32].mask |= BIT(clock->index % 32);
    469	return;
    470
    471fail:
    472	dev_err(dev, "Failed to register %s clock %s: %ld\n", "module",
    473		mod->name, PTR_ERR(clk));
    474	kfree(clock);
    475}
    476
    477struct cpg_mssr_clk_domain {
    478	struct generic_pm_domain genpd;
    479	unsigned int num_core_pm_clks;
    480	unsigned int core_pm_clks[];
    481};
    482
    483static struct cpg_mssr_clk_domain *cpg_mssr_clk_domain;
    484
    485static bool cpg_mssr_is_pm_clk(const struct of_phandle_args *clkspec,
    486			       struct cpg_mssr_clk_domain *pd)
    487{
    488	unsigned int i;
    489
    490	if (clkspec->np != pd->genpd.dev.of_node || clkspec->args_count != 2)
    491		return false;
    492
    493	switch (clkspec->args[0]) {
    494	case CPG_CORE:
    495		for (i = 0; i < pd->num_core_pm_clks; i++)
    496			if (clkspec->args[1] == pd->core_pm_clks[i])
    497				return true;
    498		return false;
    499
    500	case CPG_MOD:
    501		return true;
    502
    503	default:
    504		return false;
    505	}
    506}
    507
    508int cpg_mssr_attach_dev(struct generic_pm_domain *unused, struct device *dev)
    509{
    510	struct cpg_mssr_clk_domain *pd = cpg_mssr_clk_domain;
    511	struct device_node *np = dev->of_node;
    512	struct of_phandle_args clkspec;
    513	struct clk *clk;
    514	int i = 0;
    515	int error;
    516
    517	if (!pd) {
    518		dev_dbg(dev, "CPG/MSSR clock domain not yet available\n");
    519		return -EPROBE_DEFER;
    520	}
    521
    522	while (!of_parse_phandle_with_args(np, "clocks", "#clock-cells", i,
    523					   &clkspec)) {
    524		if (cpg_mssr_is_pm_clk(&clkspec, pd))
    525			goto found;
    526
    527		of_node_put(clkspec.np);
    528		i++;
    529	}
    530
    531	return 0;
    532
    533found:
    534	clk = of_clk_get_from_provider(&clkspec);
    535	of_node_put(clkspec.np);
    536
    537	if (IS_ERR(clk))
    538		return PTR_ERR(clk);
    539
    540	error = pm_clk_create(dev);
    541	if (error)
    542		goto fail_put;
    543
    544	error = pm_clk_add_clk(dev, clk);
    545	if (error)
    546		goto fail_destroy;
    547
    548	return 0;
    549
    550fail_destroy:
    551	pm_clk_destroy(dev);
    552fail_put:
    553	clk_put(clk);
    554	return error;
    555}
    556
    557void cpg_mssr_detach_dev(struct generic_pm_domain *unused, struct device *dev)
    558{
    559	if (!pm_clk_no_clocks(dev))
    560		pm_clk_destroy(dev);
    561}
    562
    563static void cpg_mssr_genpd_remove(void *data)
    564{
    565	pm_genpd_remove(data);
    566}
    567
    568static int __init cpg_mssr_add_clk_domain(struct device *dev,
    569					  const unsigned int *core_pm_clks,
    570					  unsigned int num_core_pm_clks)
    571{
    572	struct device_node *np = dev->of_node;
    573	struct generic_pm_domain *genpd;
    574	struct cpg_mssr_clk_domain *pd;
    575	size_t pm_size = num_core_pm_clks * sizeof(core_pm_clks[0]);
    576	int ret;
    577
    578	pd = devm_kzalloc(dev, sizeof(*pd) + pm_size, GFP_KERNEL);
    579	if (!pd)
    580		return -ENOMEM;
    581
    582	pd->num_core_pm_clks = num_core_pm_clks;
    583	memcpy(pd->core_pm_clks, core_pm_clks, pm_size);
    584
    585	genpd = &pd->genpd;
    586	genpd->name = np->name;
    587	genpd->flags = GENPD_FLAG_PM_CLK | GENPD_FLAG_ALWAYS_ON |
    588		       GENPD_FLAG_ACTIVE_WAKEUP;
    589	genpd->attach_dev = cpg_mssr_attach_dev;
    590	genpd->detach_dev = cpg_mssr_detach_dev;
    591	ret = pm_genpd_init(genpd, &pm_domain_always_on_gov, false);
    592	if (ret)
    593		return ret;
    594
    595	ret = devm_add_action_or_reset(dev, cpg_mssr_genpd_remove, genpd);
    596	if (ret)
    597		return ret;
    598
    599	cpg_mssr_clk_domain = pd;
    600
    601	return of_genpd_add_provider_simple(np, genpd);
    602}
    603
    604#ifdef CONFIG_RESET_CONTROLLER
    605
    606#define rcdev_to_priv(x)	container_of(x, struct cpg_mssr_priv, rcdev)
    607
    608static int cpg_mssr_reset(struct reset_controller_dev *rcdev,
    609			  unsigned long id)
    610{
    611	struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
    612	unsigned int reg = id / 32;
    613	unsigned int bit = id % 32;
    614	u32 bitmask = BIT(bit);
    615
    616	dev_dbg(priv->dev, "reset %u%02u\n", reg, bit);
    617
    618	/* Reset module */
    619	writel(bitmask, priv->base + priv->reset_regs[reg]);
    620
    621	/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
    622	udelay(35);
    623
    624	/* Release module from reset state */
    625	writel(bitmask, priv->base + priv->reset_clear_regs[reg]);
    626
    627	return 0;
    628}
    629
    630static int cpg_mssr_assert(struct reset_controller_dev *rcdev, unsigned long id)
    631{
    632	struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
    633	unsigned int reg = id / 32;
    634	unsigned int bit = id % 32;
    635	u32 bitmask = BIT(bit);
    636
    637	dev_dbg(priv->dev, "assert %u%02u\n", reg, bit);
    638
    639	writel(bitmask, priv->base + priv->reset_regs[reg]);
    640	return 0;
    641}
    642
    643static int cpg_mssr_deassert(struct reset_controller_dev *rcdev,
    644			     unsigned long id)
    645{
    646	struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
    647	unsigned int reg = id / 32;
    648	unsigned int bit = id % 32;
    649	u32 bitmask = BIT(bit);
    650
    651	dev_dbg(priv->dev, "deassert %u%02u\n", reg, bit);
    652
    653	writel(bitmask, priv->base + priv->reset_clear_regs[reg]);
    654	return 0;
    655}
    656
    657static int cpg_mssr_status(struct reset_controller_dev *rcdev,
    658			   unsigned long id)
    659{
    660	struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
    661	unsigned int reg = id / 32;
    662	unsigned int bit = id % 32;
    663	u32 bitmask = BIT(bit);
    664
    665	return !!(readl(priv->base + priv->reset_regs[reg]) & bitmask);
    666}
    667
    668static const struct reset_control_ops cpg_mssr_reset_ops = {
    669	.reset = cpg_mssr_reset,
    670	.assert = cpg_mssr_assert,
    671	.deassert = cpg_mssr_deassert,
    672	.status = cpg_mssr_status,
    673};
    674
    675static int cpg_mssr_reset_xlate(struct reset_controller_dev *rcdev,
    676				const struct of_phandle_args *reset_spec)
    677{
    678	struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
    679	unsigned int unpacked = reset_spec->args[0];
    680	unsigned int idx = MOD_CLK_PACK(unpacked);
    681
    682	if (unpacked % 100 > 31 || idx >= rcdev->nr_resets) {
    683		dev_err(priv->dev, "Invalid reset index %u\n", unpacked);
    684		return -EINVAL;
    685	}
    686
    687	return idx;
    688}
    689
    690static int cpg_mssr_reset_controller_register(struct cpg_mssr_priv *priv)
    691{
    692	priv->rcdev.ops = &cpg_mssr_reset_ops;
    693	priv->rcdev.of_node = priv->dev->of_node;
    694	priv->rcdev.of_reset_n_cells = 1;
    695	priv->rcdev.of_xlate = cpg_mssr_reset_xlate;
    696	priv->rcdev.nr_resets = priv->num_mod_clks;
    697	return devm_reset_controller_register(priv->dev, &priv->rcdev);
    698}
    699
    700#else /* !CONFIG_RESET_CONTROLLER */
    701static inline int cpg_mssr_reset_controller_register(struct cpg_mssr_priv *priv)
    702{
    703	return 0;
    704}
    705#endif /* !CONFIG_RESET_CONTROLLER */
    706
    707
    708static const struct of_device_id cpg_mssr_match[] = {
    709#ifdef CONFIG_CLK_R7S9210
    710	{
    711		.compatible = "renesas,r7s9210-cpg-mssr",
    712		.data = &r7s9210_cpg_mssr_info,
    713	},
    714#endif
    715#ifdef CONFIG_CLK_R8A7742
    716	{
    717		.compatible = "renesas,r8a7742-cpg-mssr",
    718		.data = &r8a7742_cpg_mssr_info,
    719	},
    720#endif
    721#ifdef CONFIG_CLK_R8A7743
    722	{
    723		.compatible = "renesas,r8a7743-cpg-mssr",
    724		.data = &r8a7743_cpg_mssr_info,
    725	},
    726	/* RZ/G1N is (almost) identical to RZ/G1M w.r.t. clocks. */
    727	{
    728		.compatible = "renesas,r8a7744-cpg-mssr",
    729		.data = &r8a7743_cpg_mssr_info,
    730	},
    731#endif
    732#ifdef CONFIG_CLK_R8A7745
    733	{
    734		.compatible = "renesas,r8a7745-cpg-mssr",
    735		.data = &r8a7745_cpg_mssr_info,
    736	},
    737#endif
    738#ifdef CONFIG_CLK_R8A77470
    739	{
    740		.compatible = "renesas,r8a77470-cpg-mssr",
    741		.data = &r8a77470_cpg_mssr_info,
    742	},
    743#endif
    744#ifdef CONFIG_CLK_R8A774A1
    745	{
    746		.compatible = "renesas,r8a774a1-cpg-mssr",
    747		.data = &r8a774a1_cpg_mssr_info,
    748	},
    749#endif
    750#ifdef CONFIG_CLK_R8A774B1
    751	{
    752		.compatible = "renesas,r8a774b1-cpg-mssr",
    753		.data = &r8a774b1_cpg_mssr_info,
    754	},
    755#endif
    756#ifdef CONFIG_CLK_R8A774C0
    757	{
    758		.compatible = "renesas,r8a774c0-cpg-mssr",
    759		.data = &r8a774c0_cpg_mssr_info,
    760	},
    761#endif
    762#ifdef CONFIG_CLK_R8A774E1
    763	{
    764		.compatible = "renesas,r8a774e1-cpg-mssr",
    765		.data = &r8a774e1_cpg_mssr_info,
    766	},
    767#endif
    768#ifdef CONFIG_CLK_R8A7790
    769	{
    770		.compatible = "renesas,r8a7790-cpg-mssr",
    771		.data = &r8a7790_cpg_mssr_info,
    772	},
    773#endif
    774#ifdef CONFIG_CLK_R8A7791
    775	{
    776		.compatible = "renesas,r8a7791-cpg-mssr",
    777		.data = &r8a7791_cpg_mssr_info,
    778	},
    779	/* R-Car M2-N is (almost) identical to R-Car M2-W w.r.t. clocks. */
    780	{
    781		.compatible = "renesas,r8a7793-cpg-mssr",
    782		.data = &r8a7791_cpg_mssr_info,
    783	},
    784#endif
    785#ifdef CONFIG_CLK_R8A7792
    786	{
    787		.compatible = "renesas,r8a7792-cpg-mssr",
    788		.data = &r8a7792_cpg_mssr_info,
    789	},
    790#endif
    791#ifdef CONFIG_CLK_R8A7794
    792	{
    793		.compatible = "renesas,r8a7794-cpg-mssr",
    794		.data = &r8a7794_cpg_mssr_info,
    795	},
    796#endif
    797#ifdef CONFIG_CLK_R8A7795
    798	{
    799		.compatible = "renesas,r8a7795-cpg-mssr",
    800		.data = &r8a7795_cpg_mssr_info,
    801	},
    802#endif
    803#ifdef CONFIG_CLK_R8A77960
    804	{
    805		.compatible = "renesas,r8a7796-cpg-mssr",
    806		.data = &r8a7796_cpg_mssr_info,
    807	},
    808#endif
    809#ifdef CONFIG_CLK_R8A77961
    810	{
    811		.compatible = "renesas,r8a77961-cpg-mssr",
    812		.data = &r8a7796_cpg_mssr_info,
    813	},
    814#endif
    815#ifdef CONFIG_CLK_R8A77965
    816	{
    817		.compatible = "renesas,r8a77965-cpg-mssr",
    818		.data = &r8a77965_cpg_mssr_info,
    819	},
    820#endif
    821#ifdef CONFIG_CLK_R8A77970
    822	{
    823		.compatible = "renesas,r8a77970-cpg-mssr",
    824		.data = &r8a77970_cpg_mssr_info,
    825	},
    826#endif
    827#ifdef CONFIG_CLK_R8A77980
    828	{
    829		.compatible = "renesas,r8a77980-cpg-mssr",
    830		.data = &r8a77980_cpg_mssr_info,
    831	},
    832#endif
    833#ifdef CONFIG_CLK_R8A77990
    834	{
    835		.compatible = "renesas,r8a77990-cpg-mssr",
    836		.data = &r8a77990_cpg_mssr_info,
    837	},
    838#endif
    839#ifdef CONFIG_CLK_R8A77995
    840	{
    841		.compatible = "renesas,r8a77995-cpg-mssr",
    842		.data = &r8a77995_cpg_mssr_info,
    843	},
    844#endif
    845#ifdef CONFIG_CLK_R8A779A0
    846	{
    847		.compatible = "renesas,r8a779a0-cpg-mssr",
    848		.data = &r8a779a0_cpg_mssr_info,
    849	},
    850#endif
    851#ifdef CONFIG_CLK_R8A779F0
    852	{
    853		.compatible = "renesas,r8a779f0-cpg-mssr",
    854		.data = &r8a779f0_cpg_mssr_info,
    855	},
    856#endif
    857#ifdef CONFIG_CLK_R8A779G0
    858	{
    859		.compatible = "renesas,r8a779g0-cpg-mssr",
    860		.data = &r8a779g0_cpg_mssr_info,
    861	},
    862#endif
    863	{ /* sentinel */ }
    864};
    865
    866static void cpg_mssr_del_clk_provider(void *data)
    867{
    868	of_clk_del_provider(data);
    869}
    870
    871#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_ARM_PSCI_FW)
    872static int cpg_mssr_suspend_noirq(struct device *dev)
    873{
    874	struct cpg_mssr_priv *priv = dev_get_drvdata(dev);
    875	unsigned int reg;
    876
    877	/* This is the best we can do to check for the presence of PSCI */
    878	if (!psci_ops.cpu_suspend)
    879		return 0;
    880
    881	/* Save module registers with bits under our control */
    882	for (reg = 0; reg < ARRAY_SIZE(priv->smstpcr_saved); reg++) {
    883		if (priv->smstpcr_saved[reg].mask)
    884			priv->smstpcr_saved[reg].val =
    885				priv->reg_layout == CLK_REG_LAYOUT_RZ_A ?
    886				readb(priv->base + priv->control_regs[reg]) :
    887				readl(priv->base + priv->control_regs[reg]);
    888	}
    889
    890	/* Save core clocks */
    891	raw_notifier_call_chain(&priv->notifiers, PM_EVENT_SUSPEND, NULL);
    892
    893	return 0;
    894}
    895
    896static int cpg_mssr_resume_noirq(struct device *dev)
    897{
    898	struct cpg_mssr_priv *priv = dev_get_drvdata(dev);
    899	unsigned int reg, i;
    900	u32 mask, oldval, newval;
    901
    902	/* This is the best we can do to check for the presence of PSCI */
    903	if (!psci_ops.cpu_suspend)
    904		return 0;
    905
    906	/* Restore core clocks */
    907	raw_notifier_call_chain(&priv->notifiers, PM_EVENT_RESUME, NULL);
    908
    909	/* Restore module clocks */
    910	for (reg = 0; reg < ARRAY_SIZE(priv->smstpcr_saved); reg++) {
    911		mask = priv->smstpcr_saved[reg].mask;
    912		if (!mask)
    913			continue;
    914
    915		if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
    916			oldval = readb(priv->base + priv->control_regs[reg]);
    917		else
    918			oldval = readl(priv->base + priv->control_regs[reg]);
    919		newval = oldval & ~mask;
    920		newval |= priv->smstpcr_saved[reg].val & mask;
    921		if (newval == oldval)
    922			continue;
    923
    924		if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
    925			writeb(newval, priv->base + priv->control_regs[reg]);
    926			/* dummy read to ensure write has completed */
    927			readb(priv->base + priv->control_regs[reg]);
    928			barrier_data(priv->base + priv->control_regs[reg]);
    929			continue;
    930		} else
    931			writel(newval, priv->base + priv->control_regs[reg]);
    932
    933		/* Wait until enabled clocks are really enabled */
    934		mask &= ~priv->smstpcr_saved[reg].val;
    935		if (!mask)
    936			continue;
    937
    938		for (i = 1000; i > 0; --i) {
    939			oldval = readl(priv->base + priv->status_regs[reg]);
    940			if (!(oldval & mask))
    941				break;
    942			cpu_relax();
    943		}
    944
    945		if (!i)
    946			dev_warn(dev, "Failed to enable %s%u[0x%x]\n",
    947				 priv->reg_layout == CLK_REG_LAYOUT_RZ_A ?
    948				 "STB" : "SMSTP", reg, oldval & mask);
    949	}
    950
    951	return 0;
    952}
    953
    954static const struct dev_pm_ops cpg_mssr_pm = {
    955	SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(cpg_mssr_suspend_noirq,
    956				      cpg_mssr_resume_noirq)
    957};
    958#define DEV_PM_OPS	&cpg_mssr_pm
    959#else
    960#define DEV_PM_OPS	NULL
    961#endif /* CONFIG_PM_SLEEP && CONFIG_ARM_PSCI_FW */
    962
    963static int __init cpg_mssr_common_init(struct device *dev,
    964				       struct device_node *np,
    965				       const struct cpg_mssr_info *info)
    966{
    967	struct cpg_mssr_priv *priv;
    968	unsigned int nclks, i;
    969	int error;
    970
    971	if (info->init) {
    972		error = info->init(dev);
    973		if (error)
    974			return error;
    975	}
    976
    977	nclks = info->num_total_core_clks + info->num_hw_mod_clks;
    978	priv = kzalloc(struct_size(priv, clks, nclks), GFP_KERNEL);
    979	if (!priv)
    980		return -ENOMEM;
    981
    982	priv->np = np;
    983	priv->dev = dev;
    984	spin_lock_init(&priv->rmw_lock);
    985
    986	priv->base = of_iomap(np, 0);
    987	if (!priv->base) {
    988		error = -ENOMEM;
    989		goto out_err;
    990	}
    991
    992	cpg_mssr_priv = priv;
    993	priv->num_core_clks = info->num_total_core_clks;
    994	priv->num_mod_clks = info->num_hw_mod_clks;
    995	priv->last_dt_core_clk = info->last_dt_core_clk;
    996	RAW_INIT_NOTIFIER_HEAD(&priv->notifiers);
    997	priv->reg_layout = info->reg_layout;
    998	if (priv->reg_layout == CLK_REG_LAYOUT_RCAR_GEN2_AND_GEN3) {
    999		priv->status_regs = mstpsr;
   1000		priv->control_regs = smstpcr;
   1001		priv->reset_regs = srcr;
   1002		priv->reset_clear_regs = srstclr;
   1003	} else if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
   1004		priv->control_regs = stbcr;
   1005	} else if (priv->reg_layout == CLK_REG_LAYOUT_RCAR_GEN4) {
   1006		priv->status_regs = mstpsr_for_gen4;
   1007		priv->control_regs = mstpcr_for_gen4;
   1008		priv->reset_regs = srcr_for_gen4;
   1009		priv->reset_clear_regs = srstclr_for_gen4;
   1010	} else {
   1011		error = -EINVAL;
   1012		goto out_err;
   1013	}
   1014
   1015	for (i = 0; i < nclks; i++)
   1016		priv->clks[i] = ERR_PTR(-ENOENT);
   1017
   1018	error = of_clk_add_provider(np, cpg_mssr_clk_src_twocell_get, priv);
   1019	if (error)
   1020		goto out_err;
   1021
   1022	return 0;
   1023
   1024out_err:
   1025	if (priv->base)
   1026		iounmap(priv->base);
   1027	kfree(priv);
   1028
   1029	return error;
   1030}
   1031
   1032void __init cpg_mssr_early_init(struct device_node *np,
   1033				const struct cpg_mssr_info *info)
   1034{
   1035	int error;
   1036	int i;
   1037
   1038	error = cpg_mssr_common_init(NULL, np, info);
   1039	if (error)
   1040		return;
   1041
   1042	for (i = 0; i < info->num_early_core_clks; i++)
   1043		cpg_mssr_register_core_clk(&info->early_core_clks[i], info,
   1044					   cpg_mssr_priv);
   1045
   1046	for (i = 0; i < info->num_early_mod_clks; i++)
   1047		cpg_mssr_register_mod_clk(&info->early_mod_clks[i], info,
   1048					  cpg_mssr_priv);
   1049
   1050}
   1051
   1052static int __init cpg_mssr_probe(struct platform_device *pdev)
   1053{
   1054	struct device *dev = &pdev->dev;
   1055	struct device_node *np = dev->of_node;
   1056	const struct cpg_mssr_info *info;
   1057	struct cpg_mssr_priv *priv;
   1058	unsigned int i;
   1059	int error;
   1060
   1061	info = of_device_get_match_data(dev);
   1062
   1063	if (!cpg_mssr_priv) {
   1064		error = cpg_mssr_common_init(dev, dev->of_node, info);
   1065		if (error)
   1066			return error;
   1067	}
   1068
   1069	priv = cpg_mssr_priv;
   1070	priv->dev = dev;
   1071	dev_set_drvdata(dev, priv);
   1072
   1073	for (i = 0; i < info->num_core_clks; i++)
   1074		cpg_mssr_register_core_clk(&info->core_clks[i], info, priv);
   1075
   1076	for (i = 0; i < info->num_mod_clks; i++)
   1077		cpg_mssr_register_mod_clk(&info->mod_clks[i], info, priv);
   1078
   1079	error = devm_add_action_or_reset(dev,
   1080					 cpg_mssr_del_clk_provider,
   1081					 np);
   1082	if (error)
   1083		return error;
   1084
   1085	error = cpg_mssr_add_clk_domain(dev, info->core_pm_clks,
   1086					info->num_core_pm_clks);
   1087	if (error)
   1088		return error;
   1089
   1090	/* Reset Controller not supported for Standby Control SoCs */
   1091	if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
   1092		return 0;
   1093
   1094	error = cpg_mssr_reset_controller_register(priv);
   1095	if (error)
   1096		return error;
   1097
   1098	return 0;
   1099}
   1100
   1101static struct platform_driver cpg_mssr_driver = {
   1102	.driver		= {
   1103		.name	= "renesas-cpg-mssr",
   1104		.of_match_table = cpg_mssr_match,
   1105		.pm = DEV_PM_OPS,
   1106	},
   1107};
   1108
   1109static int __init cpg_mssr_init(void)
   1110{
   1111	return platform_driver_probe(&cpg_mssr_driver, cpg_mssr_probe);
   1112}
   1113
   1114subsys_initcall(cpg_mssr_init);
   1115
   1116void __init cpg_core_nullify_range(struct cpg_core_clk *core_clks,
   1117				   unsigned int num_core_clks,
   1118				   unsigned int first_clk,
   1119				   unsigned int last_clk)
   1120{
   1121	unsigned int i;
   1122
   1123	for (i = 0; i < num_core_clks; i++)
   1124		if (core_clks[i].id >= first_clk &&
   1125		    core_clks[i].id <= last_clk)
   1126			core_clks[i].name = NULL;
   1127}
   1128
   1129void __init mssr_mod_nullify(struct mssr_mod_clk *mod_clks,
   1130			     unsigned int num_mod_clks,
   1131			     const unsigned int *clks, unsigned int n)
   1132{
   1133	unsigned int i, j;
   1134
   1135	for (i = 0, j = 0; i < num_mod_clks && j < n; i++)
   1136		if (mod_clks[i].id == clks[j]) {
   1137			mod_clks[i].name = NULL;
   1138			j++;
   1139		}
   1140}
   1141
   1142void __init mssr_mod_reparent(struct mssr_mod_clk *mod_clks,
   1143			      unsigned int num_mod_clks,
   1144			      const struct mssr_mod_reparent *clks,
   1145			      unsigned int n)
   1146{
   1147	unsigned int i, j;
   1148
   1149	for (i = 0, j = 0; i < num_mod_clks && j < n; i++)
   1150		if (mod_clks[i].id == clks[j].clk) {
   1151			mod_clks[i].parent = clks[j].parent;
   1152			j++;
   1153		}
   1154}
   1155
   1156MODULE_DESCRIPTION("Renesas CPG/MSSR Driver");
   1157MODULE_LICENSE("GPL v2");