File Index
Files and directories
Sign in
FILE

renesas-cpg-mssr.c

File preview with syntax highlighting.

linux-6.19.14/drivers/clk/renesas/renesas-cpg-mssr.c C
   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/iopoll.h>
  21#include <linux/mod_devicetable.h>
  22#include <linux/module.h>
  23#include <linux/of_address.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#include <linux/string_choices.h>
  31
  32#include <dt-bindings/clock/renesas-cpg-mssr.h>
  33
  34#include "renesas-cpg-mssr.h"
  35#include "clk-div6.h"
  36
  37#ifdef DEBUG
  38#define WARN_DEBUG(x)	WARN_ON(x)
  39#else
  40#define WARN_DEBUG(x)	do { } while (0)
  41#endif
  42
  43#define RZT2H_RESET_REG_READ_COUNT	7
  44
  45/*
  46 * Module Standby and Software Reset register offsets.
  47 *
  48 * If the registers exist, these are valid for SH-Mobile, R-Mobile,
  49 * R-Car Gen2, R-Car Gen3, and RZ/G1.
  50 * These are NOT valid for R-Car Gen1 and RZ/A1!
  51 */
  52
  53/*
  54 * Module Stop Status Register offsets
  55 */
  56
  57static const u16 mstpsr[] = {
  58	0x030, 0x038, 0x040, 0x048, 0x04C, 0x03C, 0x1C0, 0x1C4,
  59	0x9A0, 0x9A4, 0x9A8, 0x9AC,
  60};
  61
  62static const u16 mstpsr_for_gen4[] = {
  63	0x2E00, 0x2E04, 0x2E08, 0x2E0C, 0x2E10, 0x2E14, 0x2E18, 0x2E1C,
  64	0x2E20, 0x2E24, 0x2E28, 0x2E2C, 0x2E30, 0x2E34, 0x2E38, 0x2E3C,
  65	0x2E40, 0x2E44, 0x2E48, 0x2E4C, 0x2E50, 0x2E54, 0x2E58, 0x2E5C,
  66	0x2E60, 0x2E64, 0x2E68, 0x2E6C, 0x2E70, 0x2E74,
  67};
  68
  69/*
  70 * System Module Stop Control Register offsets
  71 */
  72
  73static const u16 smstpcr[] = {
  74	0x130, 0x134, 0x138, 0x13C, 0x140, 0x144, 0x148, 0x14C,
  75	0x990, 0x994, 0x998, 0x99C,
  76};
  77
  78static const u16 mstpcr_for_gen4[] = {
  79	0x2D00, 0x2D04, 0x2D08, 0x2D0C, 0x2D10, 0x2D14, 0x2D18, 0x2D1C,
  80	0x2D20, 0x2D24, 0x2D28, 0x2D2C, 0x2D30, 0x2D34, 0x2D38, 0x2D3C,
  81	0x2D40, 0x2D44, 0x2D48, 0x2D4C, 0x2D50, 0x2D54, 0x2D58, 0x2D5C,
  82	0x2D60, 0x2D64, 0x2D68, 0x2D6C, 0x2D70, 0x2D74,
  83};
  84
  85/*
  86 * Module Stop Control Register (RZ/T2H)
  87 * RZ/T2H has 2 registers blocks,
  88 * Bit 12 is used to differentiate them
  89 */
  90
  91#define RZT2H_MSTPCR_BLOCK_SHIFT	12
  92#define RZT2H_MSTPCR_OFFSET_MASK	GENMASK(11, 0)
  93#define RZT2H_MSTPCR(block, offset)	(((block) << RZT2H_MSTPCR_BLOCK_SHIFT) | \
  94					((offset) & RZT2H_MSTPCR_OFFSET_MASK))
  95
  96#define RZT2H_MSTPCR_BLOCK(x)		((x) >> RZT2H_MSTPCR_BLOCK_SHIFT)
  97#define RZT2H_MSTPCR_OFFSET(x)		((x) & RZT2H_MSTPCR_OFFSET_MASK)
  98
  99static const u16 mstpcr_for_rzt2h[] = {
 100	RZT2H_MSTPCR(0, 0x300), /* MSTPCRA */
 101	RZT2H_MSTPCR(0, 0x304), /* MSTPCRB */
 102	RZT2H_MSTPCR(0, 0x308), /* MSTPCRC */
 103	RZT2H_MSTPCR(0, 0x30c),	/* MSTPCRD */
 104	RZT2H_MSTPCR(0, 0x310), /* MSTPCRE */
 105	0,
 106	RZT2H_MSTPCR(1, 0x318), /* MSTPCRG */
 107	0,
 108	RZT2H_MSTPCR(1, 0x320), /* MSTPCRI */
 109	RZT2H_MSTPCR(0, 0x324), /* MSTPCRJ */
 110	RZT2H_MSTPCR(0, 0x328), /* MSTPCRK */
 111	RZT2H_MSTPCR(0, 0x32c), /* MSTPCRL */
 112	RZT2H_MSTPCR(0, 0x330), /* MSTPCRM */
 113	RZT2H_MSTPCR(1, 0x334), /* MSTPCRN */
 114};
 115
 116/*
 117 * Standby Control Register offsets (RZ/A)
 118 * Base address is FRQCR register
 119 */
 120
 121static const u16 stbcr[] = {
 122	0xFFFF/*dummy*/, 0x010, 0x014, 0x410, 0x414, 0x418, 0x41C, 0x420,
 123	0x424, 0x428, 0x42C,
 124};
 125
 126/*
 127 * Software Reset Register offsets
 128 */
 129
 130static const u16 srcr[] = {
 131	0x0A0, 0x0A8, 0x0B0, 0x0B8, 0x0BC, 0x0C4, 0x1C8, 0x1CC,
 132	0x920, 0x924, 0x928, 0x92C,
 133};
 134
 135static const u16 srcr_for_gen4[] = {
 136	0x2C00, 0x2C04, 0x2C08, 0x2C0C, 0x2C10, 0x2C14, 0x2C18, 0x2C1C,
 137	0x2C20, 0x2C24, 0x2C28, 0x2C2C, 0x2C30, 0x2C34, 0x2C38, 0x2C3C,
 138	0x2C40, 0x2C44, 0x2C48, 0x2C4C, 0x2C50, 0x2C54, 0x2C58, 0x2C5C,
 139	0x2C60, 0x2C64, 0x2C68, 0x2C6C, 0x2C70, 0x2C74,
 140};
 141
 142static const u16 mrcr_for_rzt2h[] = {
 143	0x240,	/* MRCTLA */
 144	0x244,	/* Reserved */
 145	0x248,	/* Reserved */
 146	0x24C,	/* Reserved */
 147	0x250,	/* MRCTLE */
 148	0x254,	/* Reserved */
 149	0x258,	/* Reserved */
 150	0x25C,	/* Reserved */
 151	0x260,	/* MRCTLI */
 152	0x264,	/* Reserved */
 153	0x268,	/* Reserved */
 154	0x26C,	/* Reserved */
 155	0x270,	/* MRCTLM */
 156};
 157
 158/*
 159 * Software Reset Clearing Register offsets
 160 */
 161
 162static const u16 srstclr[] = {
 163	0x940, 0x944, 0x948, 0x94C, 0x950, 0x954, 0x958, 0x95C,
 164	0x960, 0x964, 0x968, 0x96C,
 165};
 166
 167static const u16 srstclr_for_gen4[] = {
 168	0x2C80, 0x2C84, 0x2C88, 0x2C8C, 0x2C90, 0x2C94, 0x2C98, 0x2C9C,
 169	0x2CA0, 0x2CA4, 0x2CA8, 0x2CAC, 0x2CB0, 0x2CB4, 0x2CB8, 0x2CBC,
 170	0x2CC0, 0x2CC4, 0x2CC8, 0x2CCC, 0x2CD0, 0x2CD4, 0x2CD8, 0x2CDC,
 171	0x2CE0, 0x2CE4, 0x2CE8, 0x2CEC, 0x2CF0, 0x2CF4,
 172};
 173
 174/**
 175 * struct cpg_mssr_priv - Clock Pulse Generator / Module Standby
 176 *                        and Software Reset Private Data
 177 *
 178 * @pub: Data passed to clock registration callback
 179 * @rcdev: Optional reset controller entity
 180 * @dev: CPG/MSSR device
 181 * @reg_layout: CPG/MSSR register layout
 182 * @np: Device node in DT for this CPG/MSSR module
 183 * @num_core_clks: Number of Core Clocks in clks[]
 184 * @num_mod_clks: Number of Module Clocks in clks[]
 185 * @last_dt_core_clk: ID of the last Core Clock exported to DT
 186 * @status_regs: Pointer to status registers array
 187 * @control_regs: Pointer to control registers array
 188 * @reset_regs: Pointer to reset registers array
 189 * @reset_clear_regs:  Pointer to reset clearing registers array
 190 * @smstpcr_saved: [].mask: Mask of SMSTPCR[] bits under our control
 191 *                 [].val: Saved values of SMSTPCR[]
 192 * @reserved_ids: Temporary used, reserved id list
 193 * @num_reserved_ids: Temporary used, number of reserved id list
 194 * @clks: Array containing all Core and Module Clocks
 195 */
 196struct cpg_mssr_priv {
 197	struct cpg_mssr_pub pub;
 198#ifdef CONFIG_RESET_CONTROLLER
 199	struct reset_controller_dev rcdev;
 200#endif
 201	struct device *dev;
 202	enum clk_reg_layout reg_layout;
 203	struct device_node *np;
 204
 205	unsigned int num_core_clks;
 206	unsigned int num_mod_clks;
 207	unsigned int last_dt_core_clk;
 208
 209	const u16 *status_regs;
 210	const u16 *control_regs;
 211	const u16 *reset_regs;
 212	const u16 *reset_clear_regs;
 213	struct {
 214		u32 mask;
 215		u32 val;
 216	} smstpcr_saved[ARRAY_SIZE(mstpsr_for_gen4)];
 217
 218	unsigned int *reserved_ids;
 219	unsigned int num_reserved_ids;
 220
 221	struct clk *clks[];
 222};
 223
 224static struct cpg_mssr_priv *cpg_mssr_priv;
 225
 226/**
 227 * struct mstp_clock - MSTP gating clock
 228 * @hw: handle between common and hardware-specific interfaces
 229 * @index: MSTP clock number
 230 * @priv: CPG/MSSR private data
 231 */
 232struct mstp_clock {
 233	struct clk_hw hw;
 234	u32 index;
 235	struct cpg_mssr_priv *priv;
 236};
 237
 238#define to_mstp_clock(_hw) container_of(_hw, struct mstp_clock, hw)
 239
 240static u32 cpg_rzt2h_mstp_read(struct clk_hw *hw, u16 offset)
 241{
 242	struct mstp_clock *clock = to_mstp_clock(hw);
 243	struct cpg_mssr_priv *priv = clock->priv;
 244	void __iomem *base =
 245		RZT2H_MSTPCR_BLOCK(offset) ? priv->pub.base1 : priv->pub.base0;
 246
 247	return readl(base + RZT2H_MSTPCR_OFFSET(offset));
 248}
 249
 250static void cpg_rzt2h_mstp_write(struct clk_hw *hw, u16 offset, u32 value)
 251{
 252	struct mstp_clock *clock = to_mstp_clock(hw);
 253	struct cpg_mssr_priv *priv = clock->priv;
 254	void __iomem *base =
 255		RZT2H_MSTPCR_BLOCK(offset) ? priv->pub.base1 : priv->pub.base0;
 256
 257	writel(value, base + RZT2H_MSTPCR_OFFSET(offset));
 258}
 259
 260static int cpg_mstp_clock_endisable(struct clk_hw *hw, bool enable)
 261{
 262	struct mstp_clock *clock = to_mstp_clock(hw);
 263	struct cpg_mssr_priv *priv = clock->priv;
 264	unsigned int reg = clock->index / 32;
 265	unsigned int bit = clock->index % 32;
 266	struct device *dev = priv->dev;
 267	u32 bitmask = BIT(bit);
 268	unsigned long flags;
 269	u32 value;
 270	int error;
 271
 272	dev_dbg(dev, "MSTP %u%02u/%pC %s\n", reg, bit, hw->clk,
 273		str_on_off(enable));
 274	spin_lock_irqsave(&priv->pub.rmw_lock, flags);
 275
 276	if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
 277		value = readb(priv->pub.base0 + priv->control_regs[reg]);
 278		if (enable)
 279			value &= ~bitmask;
 280		else
 281			value |= bitmask;
 282		writeb(value, priv->pub.base0 + priv->control_regs[reg]);
 283
 284		/* dummy read to ensure write has completed */
 285		readb(priv->pub.base0 + priv->control_regs[reg]);
 286		barrier_data(priv->pub.base0 + priv->control_regs[reg]);
 287
 288	} else if (priv->reg_layout == CLK_REG_LAYOUT_RZ_T2H) {
 289		value = cpg_rzt2h_mstp_read(hw,
 290					    priv->control_regs[reg]);
 291
 292		if (enable)
 293			value &= ~bitmask;
 294		else
 295			value |= bitmask;
 296
 297		cpg_rzt2h_mstp_write(hw,
 298				     priv->control_regs[reg],
 299				     value);
 300	} else {
 301		value = readl(priv->pub.base0 + priv->control_regs[reg]);
 302		if (enable)
 303			value &= ~bitmask;
 304		else
 305			value |= bitmask;
 306		writel(value, priv->pub.base0 + priv->control_regs[reg]);
 307	}
 308
 309	spin_unlock_irqrestore(&priv->pub.rmw_lock, flags);
 310
 311	if (!enable || priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
 312		return 0;
 313
 314	if (priv->reg_layout == CLK_REG_LAYOUT_RZ_T2H) {
 315		/*
 316		 * For the RZ/T2H case, it is necessary to perform a read-back after
 317		 * accessing the MSTPCRm register and to dummy-read any register of
 318		 * the IP at least seven times. Instead of memory-mapping the IP
 319		 * register, we simply add a delay after the read operation.
 320		 */
 321		cpg_rzt2h_mstp_read(hw, priv->control_regs[reg]);
 322		udelay(10);
 323		return 0;
 324	}
 325
 326	error = readl_poll_timeout_atomic(priv->pub.base0 + priv->status_regs[reg],
 327					  value, !(value & bitmask), 0, 10);
 328	if (error)
 329		dev_err(dev, "Failed to enable SMSTP %p[%d]\n",
 330			priv->pub.base0 + priv->control_regs[reg], bit);
 331
 332	return error;
 333}
 334
 335static int cpg_mstp_clock_enable(struct clk_hw *hw)
 336{
 337	return cpg_mstp_clock_endisable(hw, true);
 338}
 339
 340static void cpg_mstp_clock_disable(struct clk_hw *hw)
 341{
 342	cpg_mstp_clock_endisable(hw, false);
 343}
 344
 345static int cpg_mstp_clock_is_enabled(struct clk_hw *hw)
 346{
 347	struct mstp_clock *clock = to_mstp_clock(hw);
 348	struct cpg_mssr_priv *priv = clock->priv;
 349	unsigned int reg = clock->index / 32;
 350	u32 value;
 351
 352	if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
 353		value = readb(priv->pub.base0 + priv->control_regs[reg]);
 354	else if (priv->reg_layout == CLK_REG_LAYOUT_RZ_T2H)
 355		value = cpg_rzt2h_mstp_read(hw,
 356					    priv->control_regs[reg]);
 357	else
 358		value = readl(priv->pub.base0 + priv->status_regs[reg]);
 359
 360	return !(value & BIT(clock->index % 32));
 361}
 362
 363static const struct clk_ops cpg_mstp_clock_ops = {
 364	.enable = cpg_mstp_clock_enable,
 365	.disable = cpg_mstp_clock_disable,
 366	.is_enabled = cpg_mstp_clock_is_enabled,
 367};
 368
 369static
 370struct clk *cpg_mssr_clk_src_twocell_get(struct of_phandle_args *clkspec,
 371					 void *data)
 372{
 373	unsigned int clkidx = clkspec->args[1];
 374	struct cpg_mssr_priv *priv = data;
 375	struct device *dev = priv->dev;
 376	unsigned int idx;
 377	const char *type;
 378	struct clk *clk;
 379	int range_check;
 380
 381	switch (clkspec->args[0]) {
 382	case CPG_CORE:
 383		type = "core";
 384		if (clkidx > priv->last_dt_core_clk) {
 385			dev_err(dev, "Invalid %s clock index %u\n", type,
 386			       clkidx);
 387			return ERR_PTR(-EINVAL);
 388		}
 389		clk = priv->clks[clkidx];
 390		break;
 391
 392	case CPG_MOD:
 393		type = "module";
 394		if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
 395			idx = MOD_CLK_PACK_10(clkidx);
 396			range_check = 7 - (clkidx % 10);
 397		} else {
 398			idx = MOD_CLK_PACK(clkidx);
 399			range_check = 31 - (clkidx % 100);
 400		}
 401		if (range_check < 0 || idx >= priv->num_mod_clks) {
 402			dev_err(dev, "Invalid %s clock index %u\n", type,
 403				clkidx);
 404			return ERR_PTR(-EINVAL);
 405		}
 406		clk = priv->clks[priv->num_core_clks + idx];
 407		break;
 408
 409	default:
 410		dev_err(dev, "Invalid CPG clock type %u\n", clkspec->args[0]);
 411		return ERR_PTR(-EINVAL);
 412	}
 413
 414	if (IS_ERR(clk))
 415		dev_err(dev, "Cannot get %s clock %u: %ld", type, clkidx,
 416		       PTR_ERR(clk));
 417	else
 418		dev_dbg(dev, "clock (%u, %u) is %pC at %lu Hz\n",
 419			clkspec->args[0], clkspec->args[1], clk,
 420			clk_get_rate(clk));
 421	return clk;
 422}
 423
 424static void __init cpg_mssr_register_core_clk(const struct cpg_core_clk *core,
 425					      const struct cpg_mssr_info *info,
 426					      struct cpg_mssr_priv *priv)
 427{
 428	struct clk *clk = ERR_PTR(-ENOTSUPP), *parent;
 429	struct device *dev = priv->dev;
 430	unsigned int id = core->id, div = core->div;
 431	const char *parent_name;
 432
 433	WARN_DEBUG(id >= priv->num_core_clks);
 434	WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT);
 435
 436	switch (core->type) {
 437	case CLK_TYPE_IN:
 438		clk = of_clk_get_by_name(priv->np, core->name);
 439		break;
 440
 441	case CLK_TYPE_FF:
 442	case CLK_TYPE_DIV6P1:
 443	case CLK_TYPE_DIV6_RO:
 444		WARN_DEBUG(core->parent >= priv->num_core_clks);
 445		parent = priv->pub.clks[core->parent];
 446		if (IS_ERR(parent)) {
 447			clk = parent;
 448			goto fail;
 449		}
 450
 451		parent_name = __clk_get_name(parent);
 452
 453		if (core->type == CLK_TYPE_DIV6_RO)
 454			/* Multiply with the DIV6 register value */
 455			div *= (readl(priv->pub.base0 + core->offset) & 0x3f) + 1;
 456
 457		if (core->type == CLK_TYPE_DIV6P1) {
 458			clk = cpg_div6_register(core->name, 1, &parent_name,
 459						priv->pub.base0 + core->offset,
 460						&priv->pub.notifiers);
 461		} else {
 462			clk = clk_register_fixed_factor(NULL, core->name,
 463							parent_name, 0,
 464							core->mult, div);
 465		}
 466		break;
 467
 468	case CLK_TYPE_FR:
 469		clk = clk_register_fixed_rate(NULL, core->name, NULL, 0,
 470					      core->mult);
 471		break;
 472
 473	default:
 474		if (info->cpg_clk_register)
 475			clk = info->cpg_clk_register(dev, core, info,
 476						     &priv->pub);
 477		else
 478			dev_err(dev, "%s has unsupported core clock type %u\n",
 479				core->name, core->type);
 480		break;
 481	}
 482
 483	if (IS_ERR(clk))
 484		goto fail;
 485
 486	dev_dbg(dev, "Core clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
 487	priv->pub.clks[id] = clk;
 488	return;
 489
 490fail:
 491	dev_err(dev, "Failed to register %s clock %s: %ld\n", "core",
 492		core->name, PTR_ERR(clk));
 493}
 494
 495static void __init cpg_mssr_register_mod_clk(const struct mssr_mod_clk *mod,
 496					     const struct cpg_mssr_info *info,
 497					     struct cpg_mssr_priv *priv)
 498{
 499	struct mstp_clock *clock = NULL;
 500	struct device *dev = priv->dev;
 501	unsigned int id = mod->id;
 502	struct clk_init_data init = {};
 503	struct clk *parent, *clk;
 504	const char *parent_name;
 505	unsigned int i;
 506
 507	WARN_DEBUG(id < priv->num_core_clks);
 508	WARN_DEBUG(id >= priv->num_core_clks + priv->num_mod_clks);
 509	WARN_DEBUG(mod->parent >= priv->num_core_clks + priv->num_mod_clks);
 510	WARN_DEBUG(PTR_ERR(priv->pub.clks[id]) != -ENOENT);
 511
 512	if (!mod->name) {
 513		/* Skip NULLified clock */
 514		return;
 515	}
 516
 517	parent = priv->pub.clks[mod->parent];
 518	if (IS_ERR(parent)) {
 519		clk = parent;
 520		goto fail;
 521	}
 522
 523	clock = kzalloc(sizeof(*clock), GFP_KERNEL);
 524	if (!clock) {
 525		clk = ERR_PTR(-ENOMEM);
 526		goto fail;
 527	}
 528
 529	init.name = mod->name;
 530	init.ops = &cpg_mstp_clock_ops;
 531	init.flags = CLK_SET_RATE_PARENT;
 532	parent_name = __clk_get_name(parent);
 533	init.parent_names = &parent_name;
 534	init.num_parents = 1;
 535
 536	clock->index = id - priv->num_core_clks;
 537	clock->priv = priv;
 538	clock->hw.init = &init;
 539
 540	for (i = 0; i < info->num_crit_mod_clks; i++)
 541		if (id == info->crit_mod_clks[i] &&
 542		    cpg_mstp_clock_is_enabled(&clock->hw)) {
 543			dev_dbg(dev, "MSTP %s setting CLK_IS_CRITICAL\n",
 544				mod->name);
 545			init.flags |= CLK_IS_CRITICAL;
 546			break;
 547		}
 548
 549	/*
 550	 * Ignore reserved device.
 551	 * see
 552	 *	cpg_mssr_reserved_init()
 553	 */
 554	for (i = 0; i < priv->num_reserved_ids; i++) {
 555		if (id == priv->reserved_ids[i]) {
 556			dev_info(dev, "Ignore Linux non-assigned mod (%s)\n", mod->name);
 557			init.flags |= CLK_IGNORE_UNUSED;
 558			break;
 559		}
 560	}
 561
 562	clk = clk_register(NULL, &clock->hw);
 563	if (IS_ERR(clk))
 564		goto fail;
 565
 566	dev_dbg(dev, "Module clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
 567	priv->clks[id] = clk;
 568	priv->smstpcr_saved[clock->index / 32].mask |= BIT(clock->index % 32);
 569	return;
 570
 571fail:
 572	dev_err(dev, "Failed to register %s clock %s: %ld\n", "module",
 573		mod->name, PTR_ERR(clk));
 574	kfree(clock);
 575}
 576
 577struct cpg_mssr_clk_domain {
 578	struct generic_pm_domain genpd;
 579	unsigned int num_core_pm_clks;
 580	unsigned int core_pm_clks[];
 581};
 582
 583static struct cpg_mssr_clk_domain *cpg_mssr_clk_domain;
 584
 585static bool cpg_mssr_is_pm_clk(const struct of_phandle_args *clkspec,
 586			       struct cpg_mssr_clk_domain *pd)
 587{
 588	unsigned int i;
 589
 590	if (clkspec->np != pd->genpd.dev.of_node || clkspec->args_count != 2)
 591		return false;
 592
 593	switch (clkspec->args[0]) {
 594	case CPG_CORE:
 595		for (i = 0; i < pd->num_core_pm_clks; i++)
 596			if (clkspec->args[1] == pd->core_pm_clks[i])
 597				return true;
 598		return false;
 599
 600	case CPG_MOD:
 601		return true;
 602
 603	default:
 604		return false;
 605	}
 606}
 607
 608int cpg_mssr_attach_dev(struct generic_pm_domain *unused, struct device *dev)
 609{
 610	struct cpg_mssr_clk_domain *pd = cpg_mssr_clk_domain;
 611	struct device_node *np = dev->of_node;
 612	struct of_phandle_args clkspec;
 613	struct clk *clk;
 614	int i = 0;
 615	int error;
 616
 617	if (!pd) {
 618		dev_dbg(dev, "CPG/MSSR clock domain not yet available\n");
 619		return -EPROBE_DEFER;
 620	}
 621
 622	while (!of_parse_phandle_with_args(np, "clocks", "#clock-cells", i,
 623					   &clkspec)) {
 624		if (cpg_mssr_is_pm_clk(&clkspec, pd))
 625			goto found;
 626
 627		of_node_put(clkspec.np);
 628		i++;
 629	}
 630
 631	return 0;
 632
 633found:
 634	clk = of_clk_get_from_provider(&clkspec);
 635	of_node_put(clkspec.np);
 636
 637	if (IS_ERR(clk))
 638		return PTR_ERR(clk);
 639
 640	error = pm_clk_create(dev);
 641	if (error)
 642		goto fail_put;
 643
 644	error = pm_clk_add_clk(dev, clk);
 645	if (error)
 646		goto fail_destroy;
 647
 648	return 0;
 649
 650fail_destroy:
 651	pm_clk_destroy(dev);
 652fail_put:
 653	clk_put(clk);
 654	return error;
 655}
 656
 657void cpg_mssr_detach_dev(struct generic_pm_domain *unused, struct device *dev)
 658{
 659	if (!pm_clk_no_clocks(dev))
 660		pm_clk_destroy(dev);
 661}
 662
 663static void cpg_mssr_genpd_remove(void *data)
 664{
 665	pm_genpd_remove(data);
 666}
 667
 668static int __init cpg_mssr_add_clk_domain(struct device *dev,
 669					  const unsigned int *core_pm_clks,
 670					  unsigned int num_core_pm_clks)
 671{
 672	struct device_node *np = dev->of_node;
 673	struct generic_pm_domain *genpd;
 674	struct cpg_mssr_clk_domain *pd;
 675	size_t pm_size = num_core_pm_clks * sizeof(core_pm_clks[0]);
 676	int ret;
 677
 678	pd = devm_kzalloc(dev, sizeof(*pd) + pm_size, GFP_KERNEL);
 679	if (!pd)
 680		return -ENOMEM;
 681
 682	pd->num_core_pm_clks = num_core_pm_clks;
 683	memcpy(pd->core_pm_clks, core_pm_clks, pm_size);
 684
 685	genpd = &pd->genpd;
 686	genpd->name = np->name;
 687	genpd->flags = GENPD_FLAG_PM_CLK | GENPD_FLAG_ALWAYS_ON |
 688		       GENPD_FLAG_ACTIVE_WAKEUP;
 689	genpd->attach_dev = cpg_mssr_attach_dev;
 690	genpd->detach_dev = cpg_mssr_detach_dev;
 691	ret = pm_genpd_init(genpd, &pm_domain_always_on_gov, false);
 692	if (ret)
 693		return ret;
 694
 695	ret = devm_add_action_or_reset(dev, cpg_mssr_genpd_remove, genpd);
 696	if (ret)
 697		return ret;
 698
 699	cpg_mssr_clk_domain = pd;
 700
 701	return of_genpd_add_provider_simple(np, genpd);
 702}
 703
 704#ifdef CONFIG_RESET_CONTROLLER
 705
 706#define rcdev_to_priv(x)	container_of(x, struct cpg_mssr_priv, rcdev)
 707
 708static int cpg_mssr_reset_operate(struct reset_controller_dev *rcdev,
 709				  const char *func, bool set, unsigned long id)
 710{
 711	struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
 712	unsigned int reg = id / 32;
 713	unsigned int bit = id % 32;
 714	const u16 off = set ? priv->reset_regs[reg] : priv->reset_clear_regs[reg];
 715	u32 bitmask = BIT(bit);
 716
 717	if (func)
 718		dev_dbg(priv->dev, "%s %u%02u\n", func, reg, bit);
 719
 720	writel(bitmask, priv->pub.base0 + off);
 721	readl(priv->pub.base0 + off);
 722	barrier_data(priv->pub.base0 + off);
 723
 724	return 0;
 725}
 726
 727static int cpg_mssr_reset(struct reset_controller_dev *rcdev,
 728			  unsigned long id)
 729{
 730	struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
 731
 732	/* Reset module */
 733	cpg_mssr_reset_operate(rcdev, "reset", true, id);
 734
 735	/*
 736	 * On R-Car Gen4, delay after SRCR has been written is 1ms.
 737	 * On older SoCs, delay after SRCR has been written is 35us
 738	 * (one cycle of the RCLK clock @ ca. 32 kHz).
 739	 */
 740	if (priv->reg_layout == CLK_REG_LAYOUT_RCAR_GEN4)
 741		usleep_range(1000, 2000);
 742	else
 743		usleep_range(35, 1000);
 744
 745	/* Release module from reset state */
 746	return cpg_mssr_reset_operate(rcdev, NULL, false, id);
 747}
 748
 749static int cpg_mssr_assert(struct reset_controller_dev *rcdev, unsigned long id)
 750{
 751	return cpg_mssr_reset_operate(rcdev, "assert", true, id);
 752}
 753
 754static int cpg_mssr_deassert(struct reset_controller_dev *rcdev,
 755			     unsigned long id)
 756{
 757	return cpg_mssr_reset_operate(rcdev, "deassert", false, id);
 758}
 759
 760static int cpg_mssr_status(struct reset_controller_dev *rcdev,
 761			   unsigned long id)
 762{
 763	struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
 764	unsigned int reg = id / 32;
 765	unsigned int bit = id % 32;
 766	u32 bitmask = BIT(bit);
 767
 768	return !!(readl(priv->pub.base0 + priv->reset_regs[reg]) & bitmask);
 769}
 770
 771static int cpg_mrcr_set_reset_state(struct reset_controller_dev *rcdev,
 772				    unsigned long id, bool set)
 773{
 774	struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
 775	unsigned int reg = id / 32;
 776	unsigned int bit = id % 32;
 777	u32 bitmask = BIT(bit);
 778	void __iomem *reg_addr;
 779	unsigned long flags;
 780	unsigned int i;
 781	u32 val;
 782
 783	dev_dbg(priv->dev, "%s %u%02u\n", set ? "assert" : "deassert", reg, bit);
 784
 785	spin_lock_irqsave(&priv->pub.rmw_lock, flags);
 786
 787	reg_addr = priv->pub.base0 + priv->reset_regs[reg];
 788	/* Read current value and modify */
 789	val = readl(reg_addr);
 790	if (set)
 791		val |= bitmask;
 792	else
 793		val &= ~bitmask;
 794	writel(val, reg_addr);
 795
 796	/*
 797	 * For secure processing after release from a module reset, one must
 798	 * perform multiple dummy reads of the same register.
 799	 */
 800	for (i = 0; !set && i < RZT2H_RESET_REG_READ_COUNT; i++)
 801		readl(reg_addr);
 802
 803	/* Verify the operation */
 804	val = readl(reg_addr);
 805	if (set == !(bitmask & val)) {
 806		dev_err(priv->dev, "Reset register %u%02u operation failed\n", reg, bit);
 807		spin_unlock_irqrestore(&priv->pub.rmw_lock, flags);
 808		return -EIO;
 809	}
 810
 811	spin_unlock_irqrestore(&priv->pub.rmw_lock, flags);
 812
 813	return 0;
 814}
 815
 816static int cpg_mrcr_reset(struct reset_controller_dev *rcdev, unsigned long id)
 817{
 818	int ret;
 819
 820	ret = cpg_mrcr_set_reset_state(rcdev, id, true);
 821	if (ret)
 822		return ret;
 823
 824	return cpg_mrcr_set_reset_state(rcdev, id, false);
 825}
 826
 827static int cpg_mrcr_assert(struct reset_controller_dev *rcdev, unsigned long id)
 828{
 829	return cpg_mrcr_set_reset_state(rcdev, id, true);
 830}
 831
 832static int cpg_mrcr_deassert(struct reset_controller_dev *rcdev, unsigned long id)
 833{
 834	return cpg_mrcr_set_reset_state(rcdev, id, false);
 835}
 836
 837static const struct reset_control_ops cpg_mssr_reset_ops = {
 838	.reset = cpg_mssr_reset,
 839	.assert = cpg_mssr_assert,
 840	.deassert = cpg_mssr_deassert,
 841	.status = cpg_mssr_status,
 842};
 843
 844static const struct reset_control_ops cpg_mrcr_reset_ops = {
 845	.reset = cpg_mrcr_reset,
 846	.assert = cpg_mrcr_assert,
 847	.deassert = cpg_mrcr_deassert,
 848	.status = cpg_mssr_status,
 849};
 850
 851static int cpg_mssr_reset_xlate(struct reset_controller_dev *rcdev,
 852				const struct of_phandle_args *reset_spec)
 853{
 854	struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
 855	unsigned int unpacked = reset_spec->args[0];
 856	unsigned int idx = MOD_CLK_PACK(unpacked);
 857
 858	if (unpacked % 100 > 31 || idx >= rcdev->nr_resets) {
 859		dev_err(priv->dev, "Invalid reset index %u\n", unpacked);
 860		return -EINVAL;
 861	}
 862
 863	return idx;
 864}
 865
 866static int cpg_mssr_reset_controller_register(struct cpg_mssr_priv *priv)
 867{
 868	/*
 869	 * RZ/T2H (and family) has the Module Reset Control Registers
 870	 * which allows control resets of certain modules.
 871	 * The number of resets is not equal to the number of module clocks.
 872	 */
 873	if (priv->reg_layout == CLK_REG_LAYOUT_RZ_T2H) {
 874		priv->rcdev.ops = &cpg_mrcr_reset_ops;
 875		priv->rcdev.nr_resets = ARRAY_SIZE(mrcr_for_rzt2h) * 32;
 876	} else {
 877		priv->rcdev.ops = &cpg_mssr_reset_ops;
 878		priv->rcdev.nr_resets = priv->num_mod_clks;
 879	}
 880
 881	priv->rcdev.of_node = priv->dev->of_node;
 882	priv->rcdev.of_reset_n_cells = 1;
 883	priv->rcdev.of_xlate = cpg_mssr_reset_xlate;
 884
 885	return devm_reset_controller_register(priv->dev, &priv->rcdev);
 886}
 887
 888#else /* !CONFIG_RESET_CONTROLLER */
 889static inline int cpg_mssr_reset_controller_register(struct cpg_mssr_priv *priv)
 890{
 891	return 0;
 892}
 893#endif /* !CONFIG_RESET_CONTROLLER */
 894
 895static const struct of_device_id cpg_mssr_match[] = {
 896#ifdef CONFIG_CLK_R7S9210
 897	{
 898		.compatible = "renesas,r7s9210-cpg-mssr",
 899		.data = &r7s9210_cpg_mssr_info,
 900	},
 901#endif
 902#ifdef CONFIG_CLK_R8A7742
 903	{
 904		.compatible = "renesas,r8a7742-cpg-mssr",
 905		.data = &r8a7742_cpg_mssr_info,
 906	},
 907#endif
 908#ifdef CONFIG_CLK_R8A7743
 909	{
 910		.compatible = "renesas,r8a7743-cpg-mssr",
 911		.data = &r8a7743_cpg_mssr_info,
 912	},
 913	/* RZ/G1N is (almost) identical to RZ/G1M w.r.t. clocks. */
 914	{
 915		.compatible = "renesas,r8a7744-cpg-mssr",
 916		.data = &r8a7743_cpg_mssr_info,
 917	},
 918#endif
 919#ifdef CONFIG_CLK_R8A7745
 920	{
 921		.compatible = "renesas,r8a7745-cpg-mssr",
 922		.data = &r8a7745_cpg_mssr_info,
 923	},
 924#endif
 925#ifdef CONFIG_CLK_R8A77470
 926	{
 927		.compatible = "renesas,r8a77470-cpg-mssr",
 928		.data = &r8a77470_cpg_mssr_info,
 929	},
 930#endif
 931#ifdef CONFIG_CLK_R8A774A1
 932	{
 933		.compatible = "renesas,r8a774a1-cpg-mssr",
 934		.data = &r8a774a1_cpg_mssr_info,
 935	},
 936#endif
 937#ifdef CONFIG_CLK_R8A774B1
 938	{
 939		.compatible = "renesas,r8a774b1-cpg-mssr",
 940		.data = &r8a774b1_cpg_mssr_info,
 941	},
 942#endif
 943#ifdef CONFIG_CLK_R8A774C0
 944	{
 945		.compatible = "renesas,r8a774c0-cpg-mssr",
 946		.data = &r8a774c0_cpg_mssr_info,
 947	},
 948#endif
 949#ifdef CONFIG_CLK_R8A774E1
 950	{
 951		.compatible = "renesas,r8a774e1-cpg-mssr",
 952		.data = &r8a774e1_cpg_mssr_info,
 953	},
 954#endif
 955#ifdef CONFIG_CLK_R8A7790
 956	{
 957		.compatible = "renesas,r8a7790-cpg-mssr",
 958		.data = &r8a7790_cpg_mssr_info,
 959	},
 960#endif
 961#ifdef CONFIG_CLK_R8A7791
 962	{
 963		.compatible = "renesas,r8a7791-cpg-mssr",
 964		.data = &r8a7791_cpg_mssr_info,
 965	},
 966	/* R-Car M2-N is (almost) identical to R-Car M2-W w.r.t. clocks. */
 967	{
 968		.compatible = "renesas,r8a7793-cpg-mssr",
 969		.data = &r8a7791_cpg_mssr_info,
 970	},
 971#endif
 972#ifdef CONFIG_CLK_R8A7792
 973	{
 974		.compatible = "renesas,r8a7792-cpg-mssr",
 975		.data = &r8a7792_cpg_mssr_info,
 976	},
 977#endif
 978#ifdef CONFIG_CLK_R8A7794
 979	{
 980		.compatible = "renesas,r8a7794-cpg-mssr",
 981		.data = &r8a7794_cpg_mssr_info,
 982	},
 983#endif
 984#ifdef CONFIG_CLK_R8A7795
 985	{
 986		.compatible = "renesas,r8a7795-cpg-mssr",
 987		.data = &r8a7795_cpg_mssr_info,
 988	},
 989#endif
 990#ifdef CONFIG_CLK_R8A77960
 991	{
 992		.compatible = "renesas,r8a7796-cpg-mssr",
 993		.data = &r8a7796_cpg_mssr_info,
 994	},
 995#endif
 996#ifdef CONFIG_CLK_R8A77961
 997	{
 998		.compatible = "renesas,r8a77961-cpg-mssr",
 999		.data = &r8a7796_cpg_mssr_info,
1000	},
1001#endif
1002#ifdef CONFIG_CLK_R8A77965
1003	{
1004		.compatible = "renesas,r8a77965-cpg-mssr",
1005		.data = &r8a77965_cpg_mssr_info,
1006	},
1007#endif
1008#ifdef CONFIG_CLK_R8A77970
1009	{
1010		.compatible = "renesas,r8a77970-cpg-mssr",
1011		.data = &r8a77970_cpg_mssr_info,
1012	},
1013#endif
1014#ifdef CONFIG_CLK_R8A77980
1015	{
1016		.compatible = "renesas,r8a77980-cpg-mssr",
1017		.data = &r8a77980_cpg_mssr_info,
1018	},
1019#endif
1020#ifdef CONFIG_CLK_R8A77990
1021	{
1022		.compatible = "renesas,r8a77990-cpg-mssr",
1023		.data = &r8a77990_cpg_mssr_info,
1024	},
1025#endif
1026#ifdef CONFIG_CLK_R8A77995
1027	{
1028		.compatible = "renesas,r8a77995-cpg-mssr",
1029		.data = &r8a77995_cpg_mssr_info,
1030	},
1031#endif
1032#ifdef CONFIG_CLK_R8A779A0
1033	{
1034		.compatible = "renesas,r8a779a0-cpg-mssr",
1035		.data = &r8a779a0_cpg_mssr_info,
1036	},
1037#endif
1038#ifdef CONFIG_CLK_R8A779F0
1039	{
1040		.compatible = "renesas,r8a779f0-cpg-mssr",
1041		.data = &r8a779f0_cpg_mssr_info,
1042	},
1043#endif
1044#ifdef CONFIG_CLK_R8A779G0
1045	{
1046		.compatible = "renesas,r8a779g0-cpg-mssr",
1047		.data = &r8a779g0_cpg_mssr_info,
1048	},
1049#endif
1050#ifdef CONFIG_CLK_R8A779H0
1051	{
1052		.compatible = "renesas,r8a779h0-cpg-mssr",
1053		.data = &r8a779h0_cpg_mssr_info,
1054	},
1055#endif
1056#ifdef CONFIG_CLK_R9A09G077
1057	{
1058		.compatible = "renesas,r9a09g077-cpg-mssr",
1059		.data = &r9a09g077_cpg_mssr_info,
1060	},
1061#endif
1062#ifdef CONFIG_CLK_R9A09G087
1063	{
1064		.compatible = "renesas,r9a09g087-cpg-mssr",
1065		.data = &r9a09g077_cpg_mssr_info,
1066	},
1067#endif
1068	{ /* sentinel */ }
1069};
1070
1071static void cpg_mssr_del_clk_provider(void *data)
1072{
1073	of_clk_del_provider(data);
1074}
1075
1076#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_ARM_PSCI_FW)
1077static int cpg_mssr_suspend_noirq(struct device *dev)
1078{
1079	struct cpg_mssr_priv *priv = dev_get_drvdata(dev);
1080	unsigned int reg;
1081
1082	/* This is the best we can do to check for the presence of PSCI */
1083	if (!psci_ops.cpu_suspend)
1084		return 0;
1085
1086	/* Save module registers with bits under our control */
1087	for (reg = 0; reg < ARRAY_SIZE(priv->smstpcr_saved); reg++) {
1088		if (priv->smstpcr_saved[reg].mask)
1089			priv->smstpcr_saved[reg].val =
1090				priv->reg_layout == CLK_REG_LAYOUT_RZ_A ?
1091				readb(priv->pub.base0 + priv->control_regs[reg]) :
1092				readl(priv->pub.base0 + priv->control_regs[reg]);
1093	}
1094
1095	/* Save core clocks */
1096	raw_notifier_call_chain(&priv->pub.notifiers, PM_EVENT_SUSPEND, NULL);
1097
1098	return 0;
1099}
1100
1101static int cpg_mssr_resume_noirq(struct device *dev)
1102{
1103	struct cpg_mssr_priv *priv = dev_get_drvdata(dev);
1104	unsigned int reg;
1105	u32 mask, oldval, newval;
1106	int error;
1107
1108	/* This is the best we can do to check for the presence of PSCI */
1109	if (!psci_ops.cpu_suspend)
1110		return 0;
1111
1112	/* Restore core clocks */
1113	raw_notifier_call_chain(&priv->pub.notifiers, PM_EVENT_RESUME, NULL);
1114
1115	/* Restore module clocks */
1116	for (reg = 0; reg < ARRAY_SIZE(priv->smstpcr_saved); reg++) {
1117		mask = priv->smstpcr_saved[reg].mask;
1118		if (!mask)
1119			continue;
1120
1121		if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
1122			oldval = readb(priv->pub.base0 + priv->control_regs[reg]);
1123		else
1124			oldval = readl(priv->pub.base0 + priv->control_regs[reg]);
1125		newval = oldval & ~mask;
1126		newval |= priv->smstpcr_saved[reg].val & mask;
1127		if (newval == oldval)
1128			continue;
1129
1130		if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
1131			writeb(newval, priv->pub.base0 + priv->control_regs[reg]);
1132			/* dummy read to ensure write has completed */
1133			readb(priv->pub.base0 + priv->control_regs[reg]);
1134			barrier_data(priv->pub.base0 + priv->control_regs[reg]);
1135			continue;
1136		} else
1137			writel(newval, priv->pub.base0 + priv->control_regs[reg]);
1138
1139		/* Wait until enabled clocks are really enabled */
1140		mask &= ~priv->smstpcr_saved[reg].val;
1141		if (!mask)
1142			continue;
1143
1144		error = readl_poll_timeout_atomic(priv->pub.base0 + priv->status_regs[reg],
1145						oldval, !(oldval & mask), 0, 10);
1146		if (error)
1147			dev_warn(dev, "Failed to enable SMSTP%u[0x%x]\n", reg,
1148				 oldval & mask);
1149	}
1150
1151	return 0;
1152}
1153
1154static const struct dev_pm_ops cpg_mssr_pm = {
1155	SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(cpg_mssr_suspend_noirq,
1156				      cpg_mssr_resume_noirq)
1157};
1158#define DEV_PM_OPS	&cpg_mssr_pm
1159#else
1160#define DEV_PM_OPS	NULL
1161#endif /* CONFIG_PM_SLEEP && CONFIG_ARM_PSCI_FW */
1162
1163static void __init cpg_mssr_reserved_exit(struct cpg_mssr_priv *priv)
1164{
1165	kfree(priv->reserved_ids);
1166}
1167
1168static int __init cpg_mssr_reserved_init(struct cpg_mssr_priv *priv,
1169					 const struct cpg_mssr_info *info)
1170{
1171	struct device_node *soc __free(device_node) = of_find_node_by_path("/soc");
1172	struct device_node *node;
1173	uint32_t args[MAX_PHANDLE_ARGS];
1174	unsigned int *ids = NULL;
1175	unsigned int num = 0;
1176
1177	/*
1178	 * Because clk_disable_unused() will disable all unused clocks, the device which is assigned
1179	 * to a non-Linux system will be disabled when Linux is booted.
1180	 *
1181	 * To avoid such situation, renesas-cpg-mssr assumes the device which has
1182	 * status = "reserved" is assigned to a non-Linux system, and adds CLK_IGNORE_UNUSED flag
1183	 * to its CPG_MOD clocks.
1184	 * see also
1185	 *	cpg_mssr_register_mod_clk()
1186	 *
1187	 *	scif5: serial@e6f30000 {
1188	 *		...
1189	 * =>		clocks = <&cpg CPG_MOD 202>,
1190	 *			 <&cpg CPG_CORE R8A7795_CLK_S3D1>,
1191	 *			 <&scif_clk>;
1192	 *			 ...
1193	 *		 status = "reserved";
1194	 *	};
1195	 */
1196	for_each_reserved_child_of_node(soc, node) {
1197		struct of_phandle_iterator it;
1198		int rc;
1199
1200		of_for_each_phandle(&it, rc, node, "clocks", "#clock-cells", -1) {
1201			int idx;
1202			unsigned int *new_ids;
1203
1204			if (it.node != priv->np)
1205				continue;
1206
1207			if (of_phandle_iterator_args(&it, args, MAX_PHANDLE_ARGS) != 2)
1208				continue;
1209
1210			if (args[0] != CPG_MOD)
1211				continue;
1212
1213			new_ids = krealloc_array(ids, (num + 1), sizeof(*ids), GFP_KERNEL);
1214			if (!new_ids) {
1215				of_node_put(it.node);
1216				kfree(ids);
1217				return -ENOMEM;
1218			}
1219			ids = new_ids;
1220
1221			if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
1222				idx = MOD_CLK_PACK_10(args[1]);	/* for DEF_MOD_STB() */
1223			else
1224				idx = MOD_CLK_PACK(args[1]);	/* for DEF_MOD() */
1225
1226			ids[num] = info->num_total_core_clks + idx;
1227
1228			num++;
1229		}
1230	}
1231
1232	priv->num_reserved_ids	= num;
1233	priv->reserved_ids	= ids;
1234
1235	return 0;
1236}
1237
1238static int __init cpg_mssr_common_init(struct device *dev,
1239				       struct device_node *np,
1240				       const struct cpg_mssr_info *info)
1241{
1242	struct cpg_mssr_priv *priv;
1243	unsigned int nclks, i;
1244	int error;
1245
1246	if (info->init) {
1247		error = info->init(dev);
1248		if (error)
1249			return error;
1250	}
1251
1252	nclks = info->num_total_core_clks + info->num_hw_mod_clks;
1253	priv = kzalloc(struct_size(priv, clks, nclks), GFP_KERNEL);
1254	if (!priv)
1255		return -ENOMEM;
1256
1257	priv->pub.clks = priv->clks;
1258	priv->np = np;
1259	priv->dev = dev;
1260	spin_lock_init(&priv->pub.rmw_lock);
1261
1262	priv->pub.base0 = of_iomap(np, 0);
1263	if (!priv->pub.base0) {
1264		error = -ENOMEM;
1265		goto out_err;
1266	}
1267	if (info->reg_layout == CLK_REG_LAYOUT_RZ_T2H) {
1268		priv->pub.base1 = of_iomap(np, 1);
1269		if (!priv->pub.base1) {
1270			error = -ENOMEM;
1271			goto out_err;
1272		}
1273	}
1274
1275	priv->num_core_clks = info->num_total_core_clks;
1276	priv->num_mod_clks = info->num_hw_mod_clks;
1277	priv->last_dt_core_clk = info->last_dt_core_clk;
1278	RAW_INIT_NOTIFIER_HEAD(&priv->pub.notifiers);
1279	priv->reg_layout = info->reg_layout;
1280	if (priv->reg_layout == CLK_REG_LAYOUT_RCAR_GEN2_AND_GEN3) {
1281		priv->status_regs = mstpsr;
1282		priv->control_regs = smstpcr;
1283		priv->reset_regs = srcr;
1284		priv->reset_clear_regs = srstclr;
1285	} else if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
1286		priv->control_regs = stbcr;
1287	} else if (priv->reg_layout == CLK_REG_LAYOUT_RZ_T2H) {
1288		priv->control_regs = mstpcr_for_rzt2h;
1289		priv->reset_regs = mrcr_for_rzt2h;
1290	} else if (priv->reg_layout == CLK_REG_LAYOUT_RCAR_GEN4) {
1291		priv->status_regs = mstpsr_for_gen4;
1292		priv->control_regs = mstpcr_for_gen4;
1293		priv->reset_regs = srcr_for_gen4;
1294		priv->reset_clear_regs = srstclr_for_gen4;
1295	} else {
1296		error = -EINVAL;
1297		goto out_err;
1298	}
1299
1300	for (i = 0; i < nclks; i++)
1301		priv->pub.clks[i] = ERR_PTR(-ENOENT);
1302
1303	error = cpg_mssr_reserved_init(priv, info);
1304	if (error)
1305		goto out_err;
1306
1307	error = of_clk_add_provider(np, cpg_mssr_clk_src_twocell_get, priv);
1308	if (error)
1309		goto reserve_err;
1310
1311	cpg_mssr_priv = priv;
1312
1313	return 0;
1314
1315reserve_err:
1316	cpg_mssr_reserved_exit(priv);
1317out_err:
1318	if (priv->pub.base0)
1319		iounmap(priv->pub.base0);
1320	if (priv->pub.base1)
1321		iounmap(priv->pub.base1);
1322	kfree(priv);
1323
1324	return error;
1325}
1326
1327void __init cpg_mssr_early_init(struct device_node *np,
1328				const struct cpg_mssr_info *info)
1329{
1330	int error;
1331	int i;
1332
1333	error = cpg_mssr_common_init(NULL, np, info);
1334	if (error)
1335		return;
1336
1337	for (i = 0; i < info->num_early_core_clks; i++)
1338		cpg_mssr_register_core_clk(&info->early_core_clks[i], info,
1339					   cpg_mssr_priv);
1340
1341	for (i = 0; i < info->num_early_mod_clks; i++)
1342		cpg_mssr_register_mod_clk(&info->early_mod_clks[i], info,
1343					  cpg_mssr_priv);
1344
1345}
1346
1347static int __init cpg_mssr_probe(struct platform_device *pdev)
1348{
1349	struct device *dev = &pdev->dev;
1350	struct device_node *np = dev->of_node;
1351	const struct cpg_mssr_info *info;
1352	struct cpg_mssr_priv *priv;
1353	unsigned int i;
1354	int error;
1355
1356	info = of_device_get_match_data(dev);
1357
1358	if (!cpg_mssr_priv) {
1359		error = cpg_mssr_common_init(dev, dev->of_node, info);
1360		if (error)
1361			return error;
1362	}
1363
1364	priv = cpg_mssr_priv;
1365	priv->dev = dev;
1366	dev_set_drvdata(dev, priv);
1367
1368	for (i = 0; i < info->num_core_clks; i++)
1369		cpg_mssr_register_core_clk(&info->core_clks[i], info, priv);
1370
1371	for (i = 0; i < info->num_mod_clks; i++)
1372		cpg_mssr_register_mod_clk(&info->mod_clks[i], info, priv);
1373
1374	error = devm_add_action_or_reset(dev,
1375					 cpg_mssr_del_clk_provider,
1376					 np);
1377	if (error)
1378		goto reserve_exit;
1379
1380	error = cpg_mssr_add_clk_domain(dev, info->core_pm_clks,
1381					info->num_core_pm_clks);
1382	if (error)
1383		goto reserve_exit;
1384
1385	/* Reset Controller not supported for Standby Control SoCs */
1386	if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
1387		goto reserve_exit;
1388
1389	error = cpg_mssr_reset_controller_register(priv);
1390
1391reserve_exit:
1392	cpg_mssr_reserved_exit(priv);
1393
1394	return error;
1395}
1396
1397static struct platform_driver cpg_mssr_driver = {
1398	.driver		= {
1399		.name	= "renesas-cpg-mssr",
1400		.of_match_table = cpg_mssr_match,
1401		.pm = DEV_PM_OPS,
1402	},
1403};
1404
1405static int __init cpg_mssr_init(void)
1406{
1407	return platform_driver_probe(&cpg_mssr_driver, cpg_mssr_probe);
1408}
1409
1410subsys_initcall(cpg_mssr_init);
1411
1412void __init mssr_mod_nullify(struct mssr_mod_clk *mod_clks,
1413			     unsigned int num_mod_clks,
1414			     const unsigned int *clks, unsigned int n)
1415{
1416	unsigned int i, j;
1417
1418	for (i = 0, j = 0; i < num_mod_clks && j < n; i++)
1419		if (mod_clks[i].id == clks[j]) {
1420			mod_clks[i].name = NULL;
1421			j++;
1422		}
1423}
1424
1425MODULE_DESCRIPTION("Renesas CPG/MSSR Driver");
~/ Read-only file preview.