File Index
Files and directories
Sign in
FILE

rzg2l-cpg.c

File preview with syntax highlighting.

linux-6.19.14/drivers/clk/renesas/rzg2l-cpg.c C
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * RZ/G2L Clock Pulse Generator
   4 *
   5 * Copyright (C) 2021 Renesas Electronics Corp.
   6 *
   7 * Based on renesas-cpg-mssr.c
   8 *
   9 * Copyright (C) 2015 Glider bvba
  10 * Copyright (C) 2013 Ideas On Board SPRL
  11 * Copyright (C) 2015 Renesas Electronics Corp.
  12 */
  13
  14#include <linux/atomic.h>
  15#include <linux/bitfield.h>
  16#include <linux/cleanup.h>
  17#include <linux/clk.h>
  18#include <linux/clk-provider.h>
  19#include <linux/clk/renesas.h>
  20#include <linux/debugfs.h>
  21#include <linux/delay.h>
  22#include <linux/device.h>
  23#include <linux/init.h>
  24#include <linux/iopoll.h>
  25#include <linux/mod_devicetable.h>
  26#include <linux/module.h>
  27#include <linux/of.h>
  28#include <linux/platform_device.h>
  29#include <linux/pm_clock.h>
  30#include <linux/pm_domain.h>
  31#include <linux/reset-controller.h>
  32#include <linux/slab.h>
  33#include <linux/string_choices.h>
  34#include <linux/units.h>
  35
  36#include <dt-bindings/clock/renesas-cpg-mssr.h>
  37
  38#include "rzg2l-cpg.h"
  39
  40#ifdef DEBUG
  41#define WARN_DEBUG(x)	WARN_ON(x)
  42#else
  43#define WARN_DEBUG(x)	do { } while (0)
  44#endif
  45
  46#define GET_SHIFT(val)		((val >> 12) & 0xff)
  47#define GET_WIDTH(val)		((val >> 8) & 0xf)
  48
  49#define KDIV(val)		((s16)FIELD_GET(GENMASK(31, 16), val))
  50#define MDIV(val)		FIELD_GET(GENMASK(15, 6), val)
  51#define PDIV(val)		FIELD_GET(GENMASK(5, 0), val)
  52#define SDIV(val)		FIELD_GET(GENMASK(2, 0), val)
  53
  54#define RZG3S_DIV_P		GENMASK(28, 26)
  55#define RZG3S_DIV_M		GENMASK(25, 22)
  56#define RZG3S_DIV_NI		GENMASK(21, 13)
  57#define RZG3S_DIV_NF		GENMASK(12, 1)
  58#define RZG3S_SEL_PLL		BIT(0)
  59
  60#define CLK_ON_R(reg)		(reg)
  61#define CLK_MON_R(reg)		(0x180 + (reg))
  62#define CLK_RST_R(reg)		(reg)
  63#define CLK_MRST_R(reg)		(0x180 + (reg))
  64
  65#define GET_REG_OFFSET(val)		((val >> 20) & 0xfff)
  66#define GET_REG_SAMPLL_CLK1(val)	((val >> 22) & 0xfff)
  67#define GET_REG_SAMPLL_CLK2(val)	((val >> 12) & 0xfff)
  68#define GET_REG_SAMPLL_SETTING(val)	((val) & 0xfff)
  69
  70#define CPG_WEN_BIT		BIT(16)
  71
  72#define MAX_VCLK_FREQ		(148500000)
  73
  74#define MSTOP_OFF(conf)		FIELD_GET(GENMASK(31, 16), (conf))
  75#define MSTOP_MASK(conf)	FIELD_GET(GENMASK(15, 0), (conf))
  76
  77/**
  78 * struct clk_hw_data - clock hardware data
  79 * @hw: clock hw
  80 * @conf: clock configuration (register offset, shift, width)
  81 * @sconf: clock status configuration (register offset, shift, width)
  82 * @priv: CPG private data structure
  83 */
  84struct clk_hw_data {
  85	struct clk_hw hw;
  86	u32 conf;
  87	u32 sconf;
  88	struct rzg2l_cpg_priv *priv;
  89};
  90
  91#define to_clk_hw_data(_hw)	container_of(_hw, struct clk_hw_data, hw)
  92
  93/**
  94 * struct sd_mux_hw_data - SD MUX clock hardware data
  95 * @hw_data: clock hw data
  96 * @mtable: clock mux table
  97 */
  98struct sd_mux_hw_data {
  99	struct clk_hw_data hw_data;
 100	const u32 *mtable;
 101};
 102
 103#define to_sd_mux_hw_data(_hw)	container_of(_hw, struct sd_mux_hw_data, hw_data)
 104
 105/**
 106 * struct div_hw_data - divider clock hardware data
 107 * @hw_data: clock hw data
 108 * @dtable: pointer to divider table
 109 * @invalid_rate: invalid rate for divider
 110 * @max_rate: maximum rate for divider
 111 * @width: divider width
 112 */
 113struct div_hw_data {
 114	struct clk_hw_data hw_data;
 115	const struct clk_div_table *dtable;
 116	unsigned long invalid_rate;
 117	unsigned long max_rate;
 118	u32 width;
 119};
 120
 121#define to_div_hw_data(_hw)	container_of(_hw, struct div_hw_data, hw_data)
 122
 123struct rzg2l_pll5_param {
 124	u32 pl5_fracin;
 125	u16 pl5_intin;
 126	u8 pl5_refdiv;
 127	u8 pl5_postdiv1;
 128	u8 pl5_postdiv2;
 129	u8 pl5_spread;
 130};
 131
 132struct rzg2l_pll5_mux_dsi_div_param {
 133	u8 clksrc;
 134	u8 dsi_div_a;
 135	u8 dsi_div_b;
 136};
 137
 138/**
 139 * struct rzg2l_cpg_priv - Clock Pulse Generator Private Data
 140 *
 141 * @rcdev: Reset controller entity
 142 * @dev: CPG device
 143 * @base: CPG register block base address
 144 * @rmw_lock: protects register accesses
 145 * @clks: Array containing all Core and Module Clocks
 146 * @num_core_clks: Number of Core Clocks in clks[]
 147 * @num_mod_clks: Number of Module Clocks in clks[]
 148 * @num_resets: Number of Module Resets in info->resets[]
 149 * @last_dt_core_clk: ID of the last Core Clock exported to DT
 150 * @info: Pointer to platform data
 151 * @genpd: PM domain
 152 * @mux_dsi_div_params: pll5 mux and dsi div parameters
 153 */
 154struct rzg2l_cpg_priv {
 155	struct reset_controller_dev rcdev;
 156	struct device *dev;
 157	void __iomem *base;
 158	spinlock_t rmw_lock;
 159
 160	struct clk **clks;
 161	unsigned int num_core_clks;
 162	unsigned int num_mod_clks;
 163	unsigned int num_resets;
 164	unsigned int last_dt_core_clk;
 165
 166	const struct rzg2l_cpg_info *info;
 167
 168	struct generic_pm_domain genpd;
 169
 170	struct rzg2l_pll5_mux_dsi_div_param mux_dsi_div_params;
 171};
 172
 173static void rzg2l_cpg_del_clk_provider(void *data)
 174{
 175	of_clk_del_provider(data);
 176}
 177
 178/* Must be called in atomic context. */
 179static int rzg2l_cpg_wait_clk_update_done(void __iomem *base, u32 conf)
 180{
 181	u32 bitmask = GENMASK(GET_WIDTH(conf) - 1, 0) << GET_SHIFT(conf);
 182	u32 off = GET_REG_OFFSET(conf);
 183	u32 val;
 184
 185	return readl_poll_timeout_atomic(base + off, val, !(val & bitmask), 10, 200);
 186}
 187
 188int rzg2l_cpg_sd_clk_mux_notifier(struct notifier_block *nb, unsigned long event,
 189				  void *data)
 190{
 191	struct clk_notifier_data *cnd = data;
 192	struct clk_hw *hw = __clk_get_hw(cnd->clk);
 193	struct clk_hw_data *clk_hw_data = to_clk_hw_data(hw);
 194	struct rzg2l_cpg_priv *priv = clk_hw_data->priv;
 195	u32 off = GET_REG_OFFSET(clk_hw_data->conf);
 196	u32 shift = GET_SHIFT(clk_hw_data->conf);
 197	const u32 clk_src_266 = 3;
 198	unsigned long flags;
 199	int ret;
 200
 201	if (event != PRE_RATE_CHANGE || (cnd->new_rate / MEGA == 266))
 202		return NOTIFY_DONE;
 203
 204	spin_lock_irqsave(&priv->rmw_lock, flags);
 205
 206	/*
 207	 * As per the HW manual, we should not directly switch from 533 MHz to
 208	 * 400 MHz and vice versa. To change the setting from 2’b01 (533 MHz)
 209	 * to 2’b10 (400 MHz) or vice versa, Switch to 2’b11 (266 MHz) first,
 210	 * and then switch to the target setting (2’b01 (533 MHz) or 2’b10
 211	 * (400 MHz)).
 212	 * Setting a value of '0' to the SEL_SDHI0_SET or SEL_SDHI1_SET clock
 213	 * switching register is prohibited.
 214	 * The clock mux has 3 input clocks(533 MHz, 400 MHz, and 266 MHz), and
 215	 * the index to value mapping is done by adding 1 to the index.
 216	 */
 217
 218	writel((CPG_WEN_BIT | clk_src_266) << shift, priv->base + off);
 219
 220	/* Wait for the update done. */
 221	ret = rzg2l_cpg_wait_clk_update_done(priv->base, clk_hw_data->sconf);
 222
 223	spin_unlock_irqrestore(&priv->rmw_lock, flags);
 224
 225	if (ret)
 226		dev_err(priv->dev, "failed to switch to safe clk source\n");
 227
 228	return notifier_from_errno(ret);
 229}
 230
 231int rzg3s_cpg_div_clk_notifier(struct notifier_block *nb, unsigned long event,
 232			       void *data)
 233{
 234	struct clk_notifier_data *cnd = data;
 235	struct clk_hw *hw = __clk_get_hw(cnd->clk);
 236	struct clk_hw_data *clk_hw_data = to_clk_hw_data(hw);
 237	struct div_hw_data *div_hw_data = to_div_hw_data(clk_hw_data);
 238	struct rzg2l_cpg_priv *priv = clk_hw_data->priv;
 239	u32 off = GET_REG_OFFSET(clk_hw_data->conf);
 240	u32 shift = GET_SHIFT(clk_hw_data->conf);
 241	unsigned long flags;
 242	int ret = 0;
 243	u32 val;
 244
 245	if (event != PRE_RATE_CHANGE || !div_hw_data->invalid_rate ||
 246	    div_hw_data->invalid_rate % cnd->new_rate)
 247		return NOTIFY_DONE;
 248
 249	spin_lock_irqsave(&priv->rmw_lock, flags);
 250
 251	val = readl(priv->base + off);
 252	val >>= shift;
 253	val &= GENMASK(GET_WIDTH(clk_hw_data->conf) - 1, 0);
 254
 255	/*
 256	 * There are different constraints for the user of this notifiers as follows:
 257	 * 1/ SD div cannot be 1 (val == 0) if parent rate is 800MHz
 258	 * 2/ OCTA / SPI div cannot be 1 (val == 0) if parent rate is 400MHz
 259	 * As SD can have only one parent having 800MHz and OCTA div can have
 260	 * only one parent having 400MHz we took into account the parent rate
 261	 * at the beginning of function (by checking invalid_rate % new_rate).
 262	 * Now it is time to check the hardware divider and update it accordingly.
 263	 */
 264	if (!val) {
 265		writel((CPG_WEN_BIT | 1) << shift, priv->base + off);
 266		/* Wait for the update done. */
 267		ret = rzg2l_cpg_wait_clk_update_done(priv->base, clk_hw_data->sconf);
 268	}
 269
 270	spin_unlock_irqrestore(&priv->rmw_lock, flags);
 271
 272	if (ret)
 273		dev_err(priv->dev, "Failed to downgrade the div\n");
 274
 275	return notifier_from_errno(ret);
 276}
 277
 278static int rzg2l_register_notifier(struct clk_hw *hw, const struct cpg_core_clk *core,
 279				   struct rzg2l_cpg_priv *priv)
 280{
 281	struct notifier_block *nb;
 282
 283	if (!core->notifier)
 284		return 0;
 285
 286	nb = devm_kzalloc(priv->dev, sizeof(*nb), GFP_KERNEL);
 287	if (!nb)
 288		return -ENOMEM;
 289
 290	nb->notifier_call = core->notifier;
 291
 292	return clk_notifier_register(hw->clk, nb);
 293}
 294
 295static unsigned long rzg3s_div_clk_recalc_rate(struct clk_hw *hw,
 296					       unsigned long parent_rate)
 297{
 298	struct clk_hw_data *clk_hw_data = to_clk_hw_data(hw);
 299	struct div_hw_data *div_hw_data = to_div_hw_data(clk_hw_data);
 300	struct rzg2l_cpg_priv *priv = clk_hw_data->priv;
 301	u32 val;
 302
 303	val = readl(priv->base + GET_REG_OFFSET(clk_hw_data->conf));
 304	val >>= GET_SHIFT(clk_hw_data->conf);
 305	val &= GENMASK(GET_WIDTH(clk_hw_data->conf) - 1, 0);
 306
 307	return divider_recalc_rate(hw, parent_rate, val, div_hw_data->dtable,
 308				   CLK_DIVIDER_ROUND_CLOSEST, div_hw_data->width);
 309}
 310
 311static int rzg3s_div_clk_determine_rate(struct clk_hw *hw, struct clk_rate_request *req)
 312{
 313	struct clk_hw_data *clk_hw_data = to_clk_hw_data(hw);
 314	struct div_hw_data *div_hw_data = to_div_hw_data(clk_hw_data);
 315
 316	if (div_hw_data->max_rate && req->rate > div_hw_data->max_rate)
 317		req->rate = div_hw_data->max_rate;
 318
 319	return divider_determine_rate(hw, req, div_hw_data->dtable, div_hw_data->width,
 320				      CLK_DIVIDER_ROUND_CLOSEST);
 321}
 322
 323static int rzg3s_div_clk_set_rate(struct clk_hw *hw, unsigned long rate,
 324				  unsigned long parent_rate)
 325{
 326	struct clk_hw_data *clk_hw_data = to_clk_hw_data(hw);
 327	struct div_hw_data *div_hw_data = to_div_hw_data(clk_hw_data);
 328	struct rzg2l_cpg_priv *priv = clk_hw_data->priv;
 329	u32 off = GET_REG_OFFSET(clk_hw_data->conf);
 330	u32 shift = GET_SHIFT(clk_hw_data->conf);
 331	unsigned long flags;
 332	u32 val;
 333	int ret;
 334
 335	val = divider_get_val(rate, parent_rate, div_hw_data->dtable, div_hw_data->width,
 336			      CLK_DIVIDER_ROUND_CLOSEST);
 337
 338	spin_lock_irqsave(&priv->rmw_lock, flags);
 339	writel((CPG_WEN_BIT | val) << shift, priv->base + off);
 340	/* Wait for the update done. */
 341	ret = rzg2l_cpg_wait_clk_update_done(priv->base, clk_hw_data->sconf);
 342	spin_unlock_irqrestore(&priv->rmw_lock, flags);
 343
 344	return ret;
 345}
 346
 347static const struct clk_ops rzg3s_div_clk_ops = {
 348	.recalc_rate = rzg3s_div_clk_recalc_rate,
 349	.determine_rate = rzg3s_div_clk_determine_rate,
 350	.set_rate = rzg3s_div_clk_set_rate,
 351};
 352
 353static struct clk * __init
 354rzg3s_cpg_div_clk_register(const struct cpg_core_clk *core, struct rzg2l_cpg_priv *priv)
 355{
 356	struct div_hw_data *div_hw_data;
 357	struct clk_init_data init = {};
 358	const struct clk_div_table *clkt;
 359	struct clk_hw *clk_hw;
 360	const struct clk *parent;
 361	const char *parent_name;
 362	u32 max = 0;
 363	int ret;
 364
 365	parent = priv->clks[core->parent];
 366	if (IS_ERR(parent))
 367		return ERR_CAST(parent);
 368
 369	parent_name = __clk_get_name(parent);
 370
 371	div_hw_data = devm_kzalloc(priv->dev, sizeof(*div_hw_data), GFP_KERNEL);
 372	if (!div_hw_data)
 373		return ERR_PTR(-ENOMEM);
 374
 375	init.name = core->name;
 376	init.flags = core->flag;
 377	init.ops = &rzg3s_div_clk_ops;
 378	init.parent_names = &parent_name;
 379	init.num_parents = 1;
 380
 381	/* Get the maximum divider to retrieve div width. */
 382	for (clkt = core->dtable; clkt->div; clkt++) {
 383		if (max < clkt->div)
 384			max = clkt->div;
 385	}
 386
 387	div_hw_data->hw_data.priv = priv;
 388	div_hw_data->hw_data.conf = core->conf;
 389	div_hw_data->hw_data.sconf = core->sconf;
 390	div_hw_data->dtable = core->dtable;
 391	div_hw_data->invalid_rate = core->invalid_rate;
 392	div_hw_data->max_rate = core->max_rate;
 393	div_hw_data->width = fls(max) - 1;
 394
 395	clk_hw = &div_hw_data->hw_data.hw;
 396	clk_hw->init = &init;
 397
 398	ret = devm_clk_hw_register(priv->dev, clk_hw);
 399	if (ret)
 400		return ERR_PTR(ret);
 401
 402	ret = rzg2l_register_notifier(clk_hw, core, priv);
 403	if (ret) {
 404		dev_err(priv->dev, "Failed to register notifier for %s\n",
 405			core->name);
 406		return ERR_PTR(ret);
 407	}
 408
 409	return clk_hw->clk;
 410}
 411
 412static struct clk * __init
 413rzg2l_cpg_div_clk_register(const struct cpg_core_clk *core,
 414			   struct rzg2l_cpg_priv *priv)
 415{
 416	void __iomem *base = priv->base;
 417	struct device *dev = priv->dev;
 418	const struct clk *parent;
 419	const char *parent_name;
 420	struct clk_hw *clk_hw;
 421
 422	parent = priv->clks[core->parent];
 423	if (IS_ERR(parent))
 424		return ERR_CAST(parent);
 425
 426	parent_name = __clk_get_name(parent);
 427
 428	if (core->dtable)
 429		clk_hw = clk_hw_register_divider_table(dev, core->name,
 430						       parent_name, 0,
 431						       base + GET_REG_OFFSET(core->conf),
 432						       GET_SHIFT(core->conf),
 433						       GET_WIDTH(core->conf),
 434						       core->flag,
 435						       core->dtable,
 436						       &priv->rmw_lock);
 437	else
 438		clk_hw = clk_hw_register_divider(dev, core->name,
 439						 parent_name, 0,
 440						 base + GET_REG_OFFSET(core->conf),
 441						 GET_SHIFT(core->conf),
 442						 GET_WIDTH(core->conf),
 443						 core->flag, &priv->rmw_lock);
 444
 445	if (IS_ERR(clk_hw))
 446		return ERR_CAST(clk_hw);
 447
 448	return clk_hw->clk;
 449}
 450
 451static struct clk * __init
 452rzg2l_cpg_mux_clk_register(const struct cpg_core_clk *core,
 453			   struct rzg2l_cpg_priv *priv)
 454{
 455	const struct clk_hw *clk_hw;
 456
 457	clk_hw = devm_clk_hw_register_mux(priv->dev, core->name,
 458					  core->parent_names, core->num_parents,
 459					  core->flag,
 460					  priv->base + GET_REG_OFFSET(core->conf),
 461					  GET_SHIFT(core->conf),
 462					  GET_WIDTH(core->conf),
 463					  core->mux_flags, &priv->rmw_lock);
 464	if (IS_ERR(clk_hw))
 465		return ERR_CAST(clk_hw);
 466
 467	return clk_hw->clk;
 468}
 469
 470static int rzg2l_cpg_sd_clk_mux_set_parent(struct clk_hw *hw, u8 index)
 471{
 472	struct clk_hw_data *clk_hw_data = to_clk_hw_data(hw);
 473	struct sd_mux_hw_data *sd_mux_hw_data = to_sd_mux_hw_data(clk_hw_data);
 474	struct rzg2l_cpg_priv *priv = clk_hw_data->priv;
 475	u32 off = GET_REG_OFFSET(clk_hw_data->conf);
 476	u32 shift = GET_SHIFT(clk_hw_data->conf);
 477	unsigned long flags;
 478	u32 val;
 479	int ret;
 480
 481	val = clk_mux_index_to_val(sd_mux_hw_data->mtable, CLK_MUX_ROUND_CLOSEST, index);
 482
 483	spin_lock_irqsave(&priv->rmw_lock, flags);
 484
 485	writel((CPG_WEN_BIT | val) << shift, priv->base + off);
 486
 487	/* Wait for the update done. */
 488	ret = rzg2l_cpg_wait_clk_update_done(priv->base, clk_hw_data->sconf);
 489
 490	spin_unlock_irqrestore(&priv->rmw_lock, flags);
 491
 492	if (ret)
 493		dev_err(priv->dev, "Failed to switch parent\n");
 494
 495	return ret;
 496}
 497
 498static u8 rzg2l_cpg_sd_clk_mux_get_parent(struct clk_hw *hw)
 499{
 500	struct clk_hw_data *clk_hw_data = to_clk_hw_data(hw);
 501	struct sd_mux_hw_data *sd_mux_hw_data = to_sd_mux_hw_data(clk_hw_data);
 502	struct rzg2l_cpg_priv *priv = clk_hw_data->priv;
 503	u32 val;
 504
 505	val = readl(priv->base + GET_REG_OFFSET(clk_hw_data->conf));
 506	val >>= GET_SHIFT(clk_hw_data->conf);
 507	val &= GENMASK(GET_WIDTH(clk_hw_data->conf) - 1, 0);
 508
 509	return clk_mux_val_to_index(hw, sd_mux_hw_data->mtable, CLK_MUX_ROUND_CLOSEST, val);
 510}
 511
 512static const struct clk_ops rzg2l_cpg_sd_clk_mux_ops = {
 513	.determine_rate = __clk_mux_determine_rate_closest,
 514	.set_parent	= rzg2l_cpg_sd_clk_mux_set_parent,
 515	.get_parent	= rzg2l_cpg_sd_clk_mux_get_parent,
 516};
 517
 518static struct clk * __init
 519rzg2l_cpg_sd_mux_clk_register(const struct cpg_core_clk *core,
 520			      struct rzg2l_cpg_priv *priv)
 521{
 522	struct sd_mux_hw_data *sd_mux_hw_data;
 523	struct clk_init_data init;
 524	struct clk_hw *clk_hw;
 525	int ret;
 526
 527	sd_mux_hw_data = devm_kzalloc(priv->dev, sizeof(*sd_mux_hw_data), GFP_KERNEL);
 528	if (!sd_mux_hw_data)
 529		return ERR_PTR(-ENOMEM);
 530
 531	sd_mux_hw_data->hw_data.priv = priv;
 532	sd_mux_hw_data->hw_data.conf = core->conf;
 533	sd_mux_hw_data->hw_data.sconf = core->sconf;
 534	sd_mux_hw_data->mtable = core->mtable;
 535
 536	init.name = core->name;
 537	init.ops = &rzg2l_cpg_sd_clk_mux_ops;
 538	init.flags = core->flag;
 539	init.num_parents = core->num_parents;
 540	init.parent_names = core->parent_names;
 541
 542	clk_hw = &sd_mux_hw_data->hw_data.hw;
 543	clk_hw->init = &init;
 544
 545	ret = devm_clk_hw_register(priv->dev, clk_hw);
 546	if (ret)
 547		return ERR_PTR(ret);
 548
 549	ret = rzg2l_register_notifier(clk_hw, core, priv);
 550	if (ret) {
 551		dev_err(priv->dev, "Failed to register notifier for %s\n",
 552			core->name);
 553		return ERR_PTR(ret);
 554	}
 555
 556	return clk_hw->clk;
 557}
 558
 559static unsigned long
 560rzg2l_cpg_get_foutpostdiv_rate(struct rzg2l_pll5_param *params,
 561			       unsigned long rate)
 562{
 563	unsigned long foutpostdiv_rate, foutvco_rate;
 564
 565	params->pl5_intin = rate / MEGA;
 566	params->pl5_fracin = div_u64(((u64)rate % MEGA) << 24, MEGA);
 567	params->pl5_refdiv = 2;
 568	params->pl5_postdiv1 = 1;
 569	params->pl5_postdiv2 = 1;
 570	params->pl5_spread = 0x16;
 571
 572	foutvco_rate = div_u64(mul_u32_u32(EXTAL_FREQ_IN_MEGA_HZ * MEGA,
 573					   (params->pl5_intin << 24) + params->pl5_fracin),
 574			       params->pl5_refdiv) >> 24;
 575	foutpostdiv_rate = DIV_ROUND_CLOSEST(foutvco_rate,
 576					     params->pl5_postdiv1 * params->pl5_postdiv2);
 577
 578	return foutpostdiv_rate;
 579}
 580
 581struct dsi_div_hw_data {
 582	struct clk_hw hw;
 583	u32 conf;
 584	unsigned long rate;
 585	struct rzg2l_cpg_priv *priv;
 586};
 587
 588#define to_dsi_div_hw_data(_hw)	container_of(_hw, struct dsi_div_hw_data, hw)
 589
 590static unsigned long rzg2l_cpg_dsi_div_recalc_rate(struct clk_hw *hw,
 591						   unsigned long parent_rate)
 592{
 593	struct dsi_div_hw_data *dsi_div = to_dsi_div_hw_data(hw);
 594	unsigned long rate = dsi_div->rate;
 595
 596	if (!rate)
 597		rate = parent_rate;
 598
 599	return rate;
 600}
 601
 602static unsigned long rzg2l_cpg_get_vclk_parent_rate(struct clk_hw *hw,
 603						    unsigned long rate)
 604{
 605	struct dsi_div_hw_data *dsi_div = to_dsi_div_hw_data(hw);
 606	struct rzg2l_cpg_priv *priv = dsi_div->priv;
 607	struct rzg2l_pll5_param params;
 608	unsigned long parent_rate;
 609
 610	parent_rate = rzg2l_cpg_get_foutpostdiv_rate(&params, rate);
 611
 612	if (priv->mux_dsi_div_params.clksrc)
 613		parent_rate /= 2;
 614
 615	return parent_rate;
 616}
 617
 618static int rzg2l_cpg_dsi_div_determine_rate(struct clk_hw *hw,
 619					    struct clk_rate_request *req)
 620{
 621	if (req->rate > MAX_VCLK_FREQ)
 622		req->rate = MAX_VCLK_FREQ;
 623
 624	req->best_parent_rate = rzg2l_cpg_get_vclk_parent_rate(hw, req->rate);
 625
 626	return 0;
 627}
 628
 629static int rzg2l_cpg_dsi_div_set_rate(struct clk_hw *hw,
 630				      unsigned long rate,
 631				      unsigned long parent_rate)
 632{
 633	struct dsi_div_hw_data *dsi_div = to_dsi_div_hw_data(hw);
 634	struct rzg2l_cpg_priv *priv = dsi_div->priv;
 635
 636	/*
 637	 * MUX -->DIV_DSI_{A,B} -->M3 -->VCLK
 638	 *
 639	 * Based on the dot clock, the DSI divider clock sets the divider value,
 640	 * calculates the pll parameters for generating FOUTPOSTDIV and the clk
 641	 * source for the MUX and propagates that info to the parents.
 642	 */
 643
 644	if (!rate || rate > MAX_VCLK_FREQ)
 645		return -EINVAL;
 646
 647	dsi_div->rate = rate;
 648	writel(CPG_PL5_SDIV_DIV_DSI_A_WEN | CPG_PL5_SDIV_DIV_DSI_B_WEN |
 649	       (priv->mux_dsi_div_params.dsi_div_a << 0) |
 650	       (priv->mux_dsi_div_params.dsi_div_b << 8),
 651	       priv->base + CPG_PL5_SDIV);
 652
 653	return 0;
 654}
 655
 656static const struct clk_ops rzg2l_cpg_dsi_div_ops = {
 657	.recalc_rate = rzg2l_cpg_dsi_div_recalc_rate,
 658	.determine_rate = rzg2l_cpg_dsi_div_determine_rate,
 659	.set_rate = rzg2l_cpg_dsi_div_set_rate,
 660};
 661
 662static struct clk * __init
 663rzg2l_cpg_dsi_div_clk_register(const struct cpg_core_clk *core,
 664			       struct rzg2l_cpg_priv *priv)
 665{
 666	struct dsi_div_hw_data *clk_hw_data;
 667	const struct clk *parent;
 668	const char *parent_name;
 669	struct clk_init_data init;
 670	struct clk_hw *clk_hw;
 671	int ret;
 672
 673	parent = priv->clks[core->parent];
 674	if (IS_ERR(parent))
 675		return ERR_CAST(parent);
 676
 677	clk_hw_data = devm_kzalloc(priv->dev, sizeof(*clk_hw_data), GFP_KERNEL);
 678	if (!clk_hw_data)
 679		return ERR_PTR(-ENOMEM);
 680
 681	clk_hw_data->priv = priv;
 682
 683	parent_name = __clk_get_name(parent);
 684	init.name = core->name;
 685	init.ops = &rzg2l_cpg_dsi_div_ops;
 686	init.flags = CLK_SET_RATE_PARENT;
 687	init.parent_names = &parent_name;
 688	init.num_parents = 1;
 689
 690	clk_hw = &clk_hw_data->hw;
 691	clk_hw->init = &init;
 692
 693	ret = devm_clk_hw_register(priv->dev, clk_hw);
 694	if (ret)
 695		return ERR_PTR(ret);
 696
 697	return clk_hw->clk;
 698}
 699
 700struct pll5_mux_hw_data {
 701	struct clk_hw hw;
 702	u32 conf;
 703	unsigned long rate;
 704	struct rzg2l_cpg_priv *priv;
 705};
 706
 707#define to_pll5_mux_hw_data(_hw)	container_of(_hw, struct pll5_mux_hw_data, hw)
 708
 709static int rzg2l_cpg_pll5_4_clk_mux_determine_rate(struct clk_hw *hw,
 710						   struct clk_rate_request *req)
 711{
 712	struct clk_hw *parent;
 713	struct pll5_mux_hw_data *hwdata = to_pll5_mux_hw_data(hw);
 714	struct rzg2l_cpg_priv *priv = hwdata->priv;
 715
 716	parent = clk_hw_get_parent_by_index(hw, priv->mux_dsi_div_params.clksrc);
 717	req->best_parent_hw = parent;
 718	req->best_parent_rate = req->rate;
 719
 720	return 0;
 721}
 722
 723static int rzg2l_cpg_pll5_4_clk_mux_set_parent(struct clk_hw *hw, u8 index)
 724{
 725	struct pll5_mux_hw_data *hwdata = to_pll5_mux_hw_data(hw);
 726	struct rzg2l_cpg_priv *priv = hwdata->priv;
 727
 728	/*
 729	 * FOUTPOSTDIV--->|
 730	 *  |             | -->MUX -->DIV_DSIA_B -->M3 -->VCLK
 731	 *  |--FOUT1PH0-->|
 732	 *
 733	 * Based on the dot clock, the DSI divider clock calculates the parent
 734	 * rate and clk source for the MUX. It propagates that info to
 735	 * pll5_4_clk_mux which sets the clock source for DSI divider clock.
 736	 */
 737
 738	writel(CPG_OTHERFUNC1_REG_RES0_ON_WEN | index,
 739	       priv->base + CPG_OTHERFUNC1_REG);
 740
 741	return 0;
 742}
 743
 744static u8 rzg2l_cpg_pll5_4_clk_mux_get_parent(struct clk_hw *hw)
 745{
 746	struct pll5_mux_hw_data *hwdata = to_pll5_mux_hw_data(hw);
 747	struct rzg2l_cpg_priv *priv = hwdata->priv;
 748
 749	return readl(priv->base + GET_REG_OFFSET(hwdata->conf));
 750}
 751
 752static const struct clk_ops rzg2l_cpg_pll5_4_clk_mux_ops = {
 753	.determine_rate = rzg2l_cpg_pll5_4_clk_mux_determine_rate,
 754	.set_parent	= rzg2l_cpg_pll5_4_clk_mux_set_parent,
 755	.get_parent	= rzg2l_cpg_pll5_4_clk_mux_get_parent,
 756};
 757
 758static struct clk * __init
 759rzg2l_cpg_pll5_4_mux_clk_register(const struct cpg_core_clk *core,
 760				  struct rzg2l_cpg_priv *priv)
 761{
 762	struct pll5_mux_hw_data *clk_hw_data;
 763	struct clk_init_data init;
 764	struct clk_hw *clk_hw;
 765	int ret;
 766
 767	clk_hw_data = devm_kzalloc(priv->dev, sizeof(*clk_hw_data), GFP_KERNEL);
 768	if (!clk_hw_data)
 769		return ERR_PTR(-ENOMEM);
 770
 771	clk_hw_data->priv = priv;
 772	clk_hw_data->conf = core->conf;
 773
 774	init.name = core->name;
 775	init.ops = &rzg2l_cpg_pll5_4_clk_mux_ops;
 776	init.flags = CLK_SET_RATE_PARENT;
 777	init.num_parents = core->num_parents;
 778	init.parent_names = core->parent_names;
 779
 780	clk_hw = &clk_hw_data->hw;
 781	clk_hw->init = &init;
 782
 783	ret = devm_clk_hw_register(priv->dev, clk_hw);
 784	if (ret)
 785		return ERR_PTR(ret);
 786
 787	return clk_hw->clk;
 788}
 789
 790struct sipll5 {
 791	struct clk_hw hw;
 792	u32 conf;
 793	unsigned long foutpostdiv_rate;
 794	struct rzg2l_cpg_priv *priv;
 795};
 796
 797#define to_sipll5(_hw)	container_of(_hw, struct sipll5, hw)
 798
 799static unsigned long rzg2l_cpg_get_vclk_rate(struct clk_hw *hw,
 800					     unsigned long rate)
 801{
 802	struct sipll5 *sipll5 = to_sipll5(hw);
 803	struct rzg2l_cpg_priv *priv = sipll5->priv;
 804	unsigned long vclk;
 805
 806	vclk = rate / ((1 << priv->mux_dsi_div_params.dsi_div_a) *
 807		       (priv->mux_dsi_div_params.dsi_div_b + 1));
 808
 809	if (priv->mux_dsi_div_params.clksrc)
 810		vclk /= 2;
 811
 812	return vclk;
 813}
 814
 815static unsigned long rzg2l_cpg_sipll5_recalc_rate(struct clk_hw *hw,
 816						  unsigned long parent_rate)
 817{
 818	struct sipll5 *sipll5 = to_sipll5(hw);
 819	unsigned long pll5_rate = sipll5->foutpostdiv_rate;
 820
 821	if (!pll5_rate)
 822		pll5_rate = parent_rate;
 823
 824	return pll5_rate;
 825}
 826
 827static int rzg2l_cpg_sipll5_determine_rate(struct clk_hw *hw,
 828					   struct clk_rate_request *req)
 829{
 830	return 0;
 831}
 832
 833static int rzg2l_cpg_sipll5_set_rate(struct clk_hw *hw,
 834				     unsigned long rate,
 835				     unsigned long parent_rate)
 836{
 837	struct sipll5 *sipll5 = to_sipll5(hw);
 838	struct rzg2l_cpg_priv *priv = sipll5->priv;
 839	struct rzg2l_pll5_param params;
 840	unsigned long vclk_rate;
 841	int ret;
 842	u32 val;
 843
 844	/*
 845	 *  OSC --> PLL5 --> FOUTPOSTDIV-->|
 846	 *                   |             | -->MUX -->DIV_DSIA_B -->M3 -->VCLK
 847	 *                   |--FOUT1PH0-->|
 848	 *
 849	 * Based on the dot clock, the DSI divider clock calculates the parent
 850	 * rate and the pll5 parameters for generating FOUTPOSTDIV. It propagates
 851	 * that info to sipll5 which sets parameters for generating FOUTPOSTDIV.
 852	 *
 853	 * OSC --> PLL5 --> FOUTPOSTDIV
 854	 */
 855
 856	if (!rate)
 857		return -EINVAL;
 858
 859	vclk_rate = rzg2l_cpg_get_vclk_rate(hw, rate);
 860	sipll5->foutpostdiv_rate =
 861		rzg2l_cpg_get_foutpostdiv_rate(&params, vclk_rate);
 862
 863	/* Put PLL5 into standby mode */
 864	writel(CPG_SIPLL5_STBY_RESETB_WEN, priv->base + CPG_SIPLL5_STBY);
 865	ret = readl_poll_timeout(priv->base + CPG_SIPLL5_MON, val,
 866				 !(val & CPG_SIPLL5_MON_PLL5_LOCK), 100, 250000);
 867	if (ret) {
 868		dev_err(priv->dev, "failed to release pll5 lock");
 869		return ret;
 870	}
 871
 872	/* Output clock setting 1 */
 873	writel((params.pl5_postdiv1 << 0) | (params.pl5_postdiv2 << 4) |
 874	       (params.pl5_refdiv << 8), priv->base + CPG_SIPLL5_CLK1);
 875
 876	/* Output clock setting, SSCG modulation value setting 3 */
 877	writel((params.pl5_fracin << 8), priv->base + CPG_SIPLL5_CLK3);
 878
 879	/* Output clock setting 4 */
 880	writel(CPG_SIPLL5_CLK4_RESV_LSB | (params.pl5_intin << 16),
 881	       priv->base + CPG_SIPLL5_CLK4);
 882
 883	/* Output clock setting 5 */
 884	writel(params.pl5_spread, priv->base + CPG_SIPLL5_CLK5);
 885
 886	/* PLL normal mode setting */
 887	writel(CPG_SIPLL5_STBY_DOWNSPREAD_WEN | CPG_SIPLL5_STBY_SSCG_EN_WEN |
 888	       CPG_SIPLL5_STBY_RESETB_WEN | CPG_SIPLL5_STBY_RESETB,
 889	       priv->base + CPG_SIPLL5_STBY);
 890
 891	/* PLL normal mode transition, output clock stability check */
 892	ret = readl_poll_timeout(priv->base + CPG_SIPLL5_MON, val,
 893				 (val & CPG_SIPLL5_MON_PLL5_LOCK), 100, 250000);
 894	if (ret) {
 895		dev_err(priv->dev, "failed to lock pll5");
 896		return ret;
 897	}
 898
 899	return 0;
 900}
 901
 902static const struct clk_ops rzg2l_cpg_sipll5_ops = {
 903	.recalc_rate = rzg2l_cpg_sipll5_recalc_rate,
 904	.determine_rate = rzg2l_cpg_sipll5_determine_rate,
 905	.set_rate = rzg2l_cpg_sipll5_set_rate,
 906};
 907
 908static struct clk * __init
 909rzg2l_cpg_sipll5_register(const struct cpg_core_clk *core,
 910			  struct rzg2l_cpg_priv *priv)
 911{
 912	const struct clk *parent;
 913	struct clk_init_data init;
 914	const char *parent_name;
 915	struct sipll5 *sipll5;
 916	struct clk_hw *clk_hw;
 917	int ret;
 918
 919	parent = priv->clks[core->parent];
 920	if (IS_ERR(parent))
 921		return ERR_CAST(parent);
 922
 923	sipll5 = devm_kzalloc(priv->dev, sizeof(*sipll5), GFP_KERNEL);
 924	if (!sipll5)
 925		return ERR_PTR(-ENOMEM);
 926
 927	init.name = core->name;
 928	parent_name = __clk_get_name(parent);
 929	init.ops = &rzg2l_cpg_sipll5_ops;
 930	init.flags = 0;
 931	init.parent_names = &parent_name;
 932	init.num_parents = 1;
 933
 934	sipll5->hw.init = &init;
 935	sipll5->conf = core->conf;
 936	sipll5->priv = priv;
 937
 938	writel(CPG_SIPLL5_STBY_SSCG_EN_WEN | CPG_SIPLL5_STBY_RESETB_WEN |
 939	       CPG_SIPLL5_STBY_RESETB, priv->base + CPG_SIPLL5_STBY);
 940
 941	clk_hw = &sipll5->hw;
 942	clk_hw->init = &init;
 943
 944	ret = devm_clk_hw_register(priv->dev, clk_hw);
 945	if (ret)
 946		return ERR_PTR(ret);
 947
 948	priv->mux_dsi_div_params.clksrc = 1; /* Use clk src 1 for DSI */
 949	priv->mux_dsi_div_params.dsi_div_a = 1; /* Divided by 2 */
 950	priv->mux_dsi_div_params.dsi_div_b = 2; /* Divided by 3 */
 951
 952	return clk_hw->clk;
 953}
 954
 955struct pll_clk {
 956	struct clk_hw hw;
 957	unsigned long default_rate;
 958	unsigned int conf;
 959	unsigned int type;
 960	void __iomem *base;
 961	struct rzg2l_cpg_priv *priv;
 962};
 963
 964#define to_pll(_hw)	container_of(_hw, struct pll_clk, hw)
 965
 966static unsigned long rzg2l_cpg_pll_clk_recalc_rate(struct clk_hw *hw,
 967						   unsigned long parent_rate)
 968{
 969	struct pll_clk *pll_clk = to_pll(hw);
 970	struct rzg2l_cpg_priv *priv = pll_clk->priv;
 971	unsigned int val1, val2;
 972	u64 rate;
 973
 974	if (pll_clk->type != CLK_TYPE_SAM_PLL)
 975		return parent_rate;
 976
 977	val1 = readl(priv->base + GET_REG_SAMPLL_CLK1(pll_clk->conf));
 978	val2 = readl(priv->base + GET_REG_SAMPLL_CLK2(pll_clk->conf));
 979
 980	rate = mul_u64_u32_shr(parent_rate, (MDIV(val1) << 16) + KDIV(val1),
 981			       16 + SDIV(val2));
 982
 983	return DIV_ROUND_CLOSEST_ULL(rate, PDIV(val1));
 984}
 985
 986static const struct clk_ops rzg2l_cpg_pll_ops = {
 987	.recalc_rate = rzg2l_cpg_pll_clk_recalc_rate,
 988};
 989
 990static unsigned long rzg3s_cpg_pll_clk_recalc_rate(struct clk_hw *hw,
 991						   unsigned long parent_rate)
 992{
 993	struct pll_clk *pll_clk = to_pll(hw);
 994	struct rzg2l_cpg_priv *priv = pll_clk->priv;
 995	u32 nir, nfr, mr, pr, val, setting;
 996	u64 rate;
 997
 998	if (pll_clk->type != CLK_TYPE_G3S_PLL)
 999		return parent_rate;
1000
1001	setting = GET_REG_SAMPLL_SETTING(pll_clk->conf);
1002	if (setting) {
1003		val = readl(priv->base + setting);
1004		if (val & RZG3S_SEL_PLL)
1005			return pll_clk->default_rate;
1006	}
1007
1008	val = readl(priv->base + GET_REG_SAMPLL_CLK1(pll_clk->conf));
1009
1010	pr = 1 << FIELD_GET(RZG3S_DIV_P, val);
1011	/* Hardware interprets values higher than 8 as p = 16. */
1012	if (pr > 8)
1013		pr = 16;
1014
1015	mr  = FIELD_GET(RZG3S_DIV_M, val) + 1;
1016	nir = FIELD_GET(RZG3S_DIV_NI, val) + 1;
1017	nfr = FIELD_GET(RZG3S_DIV_NF, val);
1018
1019	rate = mul_u64_u32_shr(parent_rate, 4096 * nir + nfr, 12);
1020
1021	return DIV_ROUND_CLOSEST_ULL(rate, (mr * pr));
1022}
1023
1024static const struct clk_ops rzg3s_cpg_pll_ops = {
1025	.recalc_rate = rzg3s_cpg_pll_clk_recalc_rate,
1026};
1027
1028static struct clk * __init
1029rzg2l_cpg_pll_clk_register(const struct cpg_core_clk *core,
1030			   struct rzg2l_cpg_priv *priv,
1031			   const struct clk_ops *ops)
1032{
1033	struct device *dev = priv->dev;
1034	const struct clk *parent;
1035	struct clk_init_data init;
1036	const char *parent_name;
1037	struct pll_clk *pll_clk;
1038	int ret;
1039
1040	parent = priv->clks[core->parent];
1041	if (IS_ERR(parent))
1042		return ERR_CAST(parent);
1043
1044	pll_clk = devm_kzalloc(dev, sizeof(*pll_clk), GFP_KERNEL);
1045	if (!pll_clk)
1046		return ERR_PTR(-ENOMEM);
1047
1048	parent_name = __clk_get_name(parent);
1049	init.name = core->name;
1050	init.ops = ops;
1051	init.flags = 0;
1052	init.parent_names = &parent_name;
1053	init.num_parents = 1;
1054
1055	pll_clk->hw.init = &init;
1056	pll_clk->conf = core->conf;
1057	pll_clk->base = priv->base;
1058	pll_clk->priv = priv;
1059	pll_clk->type = core->type;
1060	pll_clk->default_rate = core->default_rate;
1061
1062	ret = devm_clk_hw_register(dev, &pll_clk->hw);
1063	if (ret)
1064		return ERR_PTR(ret);
1065
1066	return pll_clk->hw.clk;
1067}
1068
1069static struct clk
1070*rzg2l_cpg_clk_src_twocell_get(struct of_phandle_args *clkspec,
1071			       void *data)
1072{
1073	unsigned int clkidx = clkspec->args[1];
1074	struct rzg2l_cpg_priv *priv = data;
1075	struct device *dev = priv->dev;
1076	const char *type;
1077	struct clk *clk;
1078
1079	switch (clkspec->args[0]) {
1080	case CPG_CORE:
1081		type = "core";
1082		if (clkidx > priv->last_dt_core_clk) {
1083			dev_err(dev, "Invalid %s clock index %u\n", type, clkidx);
1084			return ERR_PTR(-EINVAL);
1085		}
1086		clk = priv->clks[clkidx];
1087		break;
1088
1089	case CPG_MOD:
1090		type = "module";
1091		if (clkidx >= priv->num_mod_clks) {
1092			dev_err(dev, "Invalid %s clock index %u\n", type,
1093				clkidx);
1094			return ERR_PTR(-EINVAL);
1095		}
1096		clk = priv->clks[priv->num_core_clks + clkidx];
1097		break;
1098
1099	default:
1100		dev_err(dev, "Invalid CPG clock type %u\n", clkspec->args[0]);
1101		return ERR_PTR(-EINVAL);
1102	}
1103
1104	if (IS_ERR(clk))
1105		dev_err(dev, "Cannot get %s clock %u: %ld", type, clkidx,
1106			PTR_ERR(clk));
1107	else
1108		dev_dbg(dev, "clock (%u, %u) is %pC at %lu Hz\n",
1109			clkspec->args[0], clkspec->args[1], clk,
1110			clk_get_rate(clk));
1111	return clk;
1112}
1113
1114static void __init
1115rzg2l_cpg_register_core_clk(const struct cpg_core_clk *core,
1116			    const struct rzg2l_cpg_info *info,
1117			    struct rzg2l_cpg_priv *priv)
1118{
1119	struct clk *clk = ERR_PTR(-EOPNOTSUPP), *parent;
1120	struct device *dev = priv->dev;
1121	unsigned int id = core->id, div = core->div;
1122	const char *parent_name;
1123	struct clk_hw *clk_hw;
1124
1125	WARN_DEBUG(id >= priv->num_core_clks);
1126	WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT);
1127
1128	switch (core->type) {
1129	case CLK_TYPE_IN:
1130		clk = of_clk_get_by_name(priv->dev->of_node, core->name);
1131		break;
1132	case CLK_TYPE_FF:
1133		WARN_DEBUG(core->parent >= priv->num_core_clks);
1134		parent = priv->clks[core->parent];
1135		if (IS_ERR(parent)) {
1136			clk = parent;
1137			goto fail;
1138		}
1139
1140		parent_name = __clk_get_name(parent);
1141		clk_hw = devm_clk_hw_register_fixed_factor(dev, core->name, parent_name,
1142							   CLK_SET_RATE_PARENT,
1143							   core->mult, div);
1144		if (IS_ERR(clk_hw))
1145			clk = ERR_CAST(clk_hw);
1146		else
1147			clk = clk_hw->clk;
1148		break;
1149	case CLK_TYPE_SAM_PLL:
1150		clk = rzg2l_cpg_pll_clk_register(core, priv, &rzg2l_cpg_pll_ops);
1151		break;
1152	case CLK_TYPE_G3S_PLL:
1153		clk = rzg2l_cpg_pll_clk_register(core, priv, &rzg3s_cpg_pll_ops);
1154		break;
1155	case CLK_TYPE_SIPLL5:
1156		clk = rzg2l_cpg_sipll5_register(core, priv);
1157		break;
1158	case CLK_TYPE_DIV:
1159		clk = rzg2l_cpg_div_clk_register(core, priv);
1160		break;
1161	case CLK_TYPE_G3S_DIV:
1162		clk = rzg3s_cpg_div_clk_register(core, priv);
1163		break;
1164	case CLK_TYPE_MUX:
1165		clk = rzg2l_cpg_mux_clk_register(core, priv);
1166		break;
1167	case CLK_TYPE_SD_MUX:
1168		clk = rzg2l_cpg_sd_mux_clk_register(core, priv);
1169		break;
1170	case CLK_TYPE_PLL5_4_MUX:
1171		clk = rzg2l_cpg_pll5_4_mux_clk_register(core, priv);
1172		break;
1173	case CLK_TYPE_DSI_DIV:
1174		clk = rzg2l_cpg_dsi_div_clk_register(core, priv);
1175		break;
1176	default:
1177		goto fail;
1178	}
1179
1180	if (IS_ERR(clk))
1181		goto fail;
1182
1183	dev_dbg(dev, "Core clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
1184	priv->clks[id] = clk;
1185	return;
1186
1187fail:
1188	dev_err(dev, "Failed to register %s clock %s: %ld\n", "core",
1189		core->name, PTR_ERR(clk));
1190}
1191
1192/**
1193 * struct mstop - MSTOP specific data structure
1194 * @usecnt: Usage counter for MSTOP settings (when zero the settings
1195 *          are applied to register)
1196 * @conf: MSTOP configuration (register offset, setup bits)
1197 */
1198struct mstop {
1199	atomic_t usecnt;
1200	u32 conf;
1201};
1202
1203/**
1204 * struct mod_clock - Module clock
1205 *
1206 * @hw: handle between common and hardware-specific interfaces
1207 * @priv: CPG/MSTP private data
1208 * @sibling: pointer to the other coupled clock
1209 * @mstop: MSTOP configuration
1210 * @shared_mstop_clks: clocks sharing the MSTOP with this clock
1211 * @off: register offset
1212 * @bit: ON/MON bit
1213 * @num_shared_mstop_clks: number of the clocks sharing MSTOP with this clock
1214 * @enabled: soft state of the clock, if it is coupled with another clock
1215 */
1216struct mod_clock {
1217	struct clk_hw hw;
1218	struct rzg2l_cpg_priv *priv;
1219	struct mod_clock *sibling;
1220	struct mstop *mstop;
1221	struct mod_clock **shared_mstop_clks;
1222	u16 off;
1223	u8 bit;
1224	u8 num_shared_mstop_clks;
1225	bool enabled;
1226};
1227
1228#define to_mod_clock(_hw) container_of(_hw, struct mod_clock, hw)
1229
1230#define for_each_mod_clock(mod_clock, hw, priv) \
1231	for (unsigned int i = 0; (priv) && i < (priv)->num_mod_clks; i++) \
1232		if ((priv)->clks[(priv)->num_core_clks + i] == ERR_PTR(-ENOENT)) \
1233			continue; \
1234		else if (((hw) = __clk_get_hw((priv)->clks[(priv)->num_core_clks + i])) && \
1235			 ((mod_clock) = to_mod_clock(hw)))
1236
1237/* Need to be called with a lock held to avoid concurrent access to mstop->usecnt. */
1238static void rzg2l_mod_clock_module_set_state(struct mod_clock *clock,
1239					     bool standby)
1240{
1241	struct rzg2l_cpg_priv *priv = clock->priv;
1242	struct mstop *mstop = clock->mstop;
1243	bool update = false;
1244	u32 value;
1245
1246	if (!mstop)
1247		return;
1248
1249	value = MSTOP_MASK(mstop->conf) << 16;
1250
1251	if (standby) {
1252		unsigned int criticals = 0;
1253
1254		for (unsigned int i = 0; i < clock->num_shared_mstop_clks; i++) {
1255			struct mod_clock *clk = clock->shared_mstop_clks[i];
1256
1257			if (clk_hw_get_flags(&clk->hw) & CLK_IS_CRITICAL)
1258				criticals++;
1259		}
1260
1261		if (!clock->num_shared_mstop_clks &&
1262		    clk_hw_get_flags(&clock->hw) & CLK_IS_CRITICAL)
1263			criticals++;
1264
1265		/*
1266		 * If this is a shared MSTOP and it is shared with critical clocks,
1267		 * and the system boots up with this clock enabled but no driver
1268		 * uses it the CCF will disable it (as it is unused). As we don't
1269		 * increment reference counter for it at registration (to avoid
1270		 * messing with clocks enabled at probe but later used by drivers)
1271		 * do not set the MSTOP here too if it is shared with critical
1272		 * clocks and ref counted only by those critical clocks.
1273		 */
1274		if (criticals && criticals == atomic_read(&mstop->usecnt))
1275			return;
1276
1277		value |= MSTOP_MASK(mstop->conf);
1278
1279		/* Allow updates on probe when usecnt = 0. */
1280		if (!atomic_read(&mstop->usecnt))
1281			update = true;
1282		else
1283			update = atomic_dec_and_test(&mstop->usecnt);
1284	} else {
1285		if (!atomic_read(&mstop->usecnt))
1286			update = true;
1287		atomic_inc(&mstop->usecnt);
1288	}
1289
1290	if (update)
1291		writel(value, priv->base + MSTOP_OFF(mstop->conf));
1292}
1293
1294static int rzg2l_mod_clock_mstop_show(struct seq_file *s, void *what)
1295{
1296	struct rzg2l_cpg_priv *priv = s->private;
1297	struct mod_clock *clk;
1298	struct clk_hw *hw;
1299
1300	seq_printf(s, "%-20s %-5s %-10s\n", "", "", "MSTOP");
1301	seq_printf(s, "%-20s %-5s %-10s\n", "", "clk", "-------------------------");
1302	seq_printf(s, "%-20s %-5s %-5s %-5s %-6s %-6s\n",
1303		   "clk_name", "cnt", "cnt", "off", "val", "shared");
1304	seq_printf(s, "%-20s %-5s %-5s %-5s %-6s %-6s\n",
1305		   "--------", "-----", "-----", "-----", "------", "------");
1306
1307	for_each_mod_clock(clk, hw, priv) {
1308		u32 val;
1309
1310		if (!clk->mstop)
1311			continue;
1312
1313		val = readl(priv->base + MSTOP_OFF(clk->mstop->conf)) &
1314		      MSTOP_MASK(clk->mstop->conf);
1315
1316		seq_printf(s, "%-20s %-5d %-5d 0x%-3lx 0x%-4x", clk_hw_get_name(hw),
1317			   __clk_get_enable_count(hw->clk), atomic_read(&clk->mstop->usecnt),
1318			   MSTOP_OFF(clk->mstop->conf), val);
1319
1320		for (unsigned int i = 0; i < clk->num_shared_mstop_clks; i++)
1321			seq_printf(s, " %pC", clk->shared_mstop_clks[i]->hw.clk);
1322
1323		seq_puts(s, "\n");
1324	}
1325
1326	return 0;
1327}
1328DEFINE_SHOW_ATTRIBUTE(rzg2l_mod_clock_mstop);
1329
1330static int rzg2l_mod_clock_endisable(struct clk_hw *hw, bool enable)
1331{
1332	struct mod_clock *clock = to_mod_clock(hw);
1333	struct rzg2l_cpg_priv *priv = clock->priv;
1334	unsigned int reg = clock->off;
1335	struct device *dev = priv->dev;
1336	u32 bitmask = BIT(clock->bit);
1337	u32 value;
1338	int error;
1339
1340	if (!clock->off) {
1341		dev_dbg(dev, "%pC does not support ON/OFF\n",  hw->clk);
1342		return 0;
1343	}
1344
1345	dev_dbg(dev, "CLK_ON 0x%x/%pC %s\n", CLK_ON_R(reg), hw->clk,
1346		str_on_off(enable));
1347
1348	value = bitmask << 16;
1349	if (enable)
1350		value |= bitmask;
1351
1352	scoped_guard(spinlock_irqsave, &priv->rmw_lock) {
1353		if (enable) {
1354			writel(value, priv->base + CLK_ON_R(reg));
1355			rzg2l_mod_clock_module_set_state(clock, false);
1356		} else {
1357			rzg2l_mod_clock_module_set_state(clock, true);
1358			writel(value, priv->base + CLK_ON_R(reg));
1359		}
1360	}
1361
1362	if (!enable)
1363		return 0;
1364
1365	if (!priv->info->has_clk_mon_regs)
1366		return 0;
1367
1368	error = readl_poll_timeout_atomic(priv->base + CLK_MON_R(reg), value,
1369					  value & bitmask, 0, 10);
1370	if (error)
1371		dev_err(dev, "Failed to enable CLK_ON 0x%x/%pC\n",
1372			CLK_ON_R(reg), hw->clk);
1373
1374	return error;
1375}
1376
1377static int rzg2l_mod_clock_enable(struct clk_hw *hw)
1378{
1379	struct mod_clock *clock = to_mod_clock(hw);
1380
1381	if (clock->sibling) {
1382		struct rzg2l_cpg_priv *priv = clock->priv;
1383		unsigned long flags;
1384		bool enabled;
1385
1386		spin_lock_irqsave(&priv->rmw_lock, flags);
1387		enabled = clock->sibling->enabled;
1388		clock->enabled = true;
1389		spin_unlock_irqrestore(&priv->rmw_lock, flags);
1390		if (enabled)
1391			return 0;
1392	}
1393
1394	return rzg2l_mod_clock_endisable(hw, true);
1395}
1396
1397static void rzg2l_mod_clock_disable(struct clk_hw *hw)
1398{
1399	struct mod_clock *clock = to_mod_clock(hw);
1400
1401	if (clock->sibling) {
1402		struct rzg2l_cpg_priv *priv = clock->priv;
1403		unsigned long flags;
1404		bool enabled;
1405
1406		spin_lock_irqsave(&priv->rmw_lock, flags);
1407		enabled = clock->sibling->enabled;
1408		clock->enabled = false;
1409		spin_unlock_irqrestore(&priv->rmw_lock, flags);
1410		if (enabled)
1411			return;
1412	}
1413
1414	rzg2l_mod_clock_endisable(hw, false);
1415}
1416
1417static int rzg2l_mod_clock_is_enabled(struct clk_hw *hw)
1418{
1419	struct mod_clock *clock = to_mod_clock(hw);
1420	struct rzg2l_cpg_priv *priv = clock->priv;
1421	u32 bitmask = BIT(clock->bit);
1422	u32 value;
1423
1424	if (!clock->off) {
1425		dev_dbg(priv->dev, "%pC does not support ON/OFF\n",  hw->clk);
1426		return 1;
1427	}
1428
1429	if (clock->sibling)
1430		return clock->enabled;
1431
1432	if (priv->info->has_clk_mon_regs)
1433		value = readl(priv->base + CLK_MON_R(clock->off));
1434	else
1435		value = readl(priv->base + clock->off);
1436
1437	return value & bitmask;
1438}
1439
1440static const struct clk_ops rzg2l_mod_clock_ops = {
1441	.enable = rzg2l_mod_clock_enable,
1442	.disable = rzg2l_mod_clock_disable,
1443	.is_enabled = rzg2l_mod_clock_is_enabled,
1444};
1445
1446static struct mod_clock
1447*rzg2l_mod_clock_get_sibling(struct mod_clock *clock,
1448			     struct rzg2l_cpg_priv *priv)
1449{
1450	struct mod_clock *clk;
1451	struct clk_hw *hw;
1452
1453	for_each_mod_clock(clk, hw, priv) {
1454		if (clock->off == clk->off && clock->bit == clk->bit)
1455			return clk;
1456	}
1457
1458	return NULL;
1459}
1460
1461static struct mstop *rzg2l_mod_clock_get_mstop(struct rzg2l_cpg_priv *priv, u32 conf)
1462{
1463	struct mod_clock *clk;
1464	struct clk_hw *hw;
1465
1466	for_each_mod_clock(clk, hw, priv) {
1467		if (!clk->mstop)
1468			continue;
1469
1470		if (clk->mstop->conf == conf)
1471			return clk->mstop;
1472	}
1473
1474	return NULL;
1475}
1476
1477static void rzg2l_mod_clock_init_mstop(struct rzg2l_cpg_priv *priv)
1478{
1479	struct mod_clock *clk;
1480	struct clk_hw *hw;
1481
1482	for_each_mod_clock(clk, hw, priv) {
1483		if (!clk->mstop)
1484			continue;
1485
1486		/*
1487		 * Out of reset all modules are enabled. Set module state
1488		 * in case associated clocks are disabled at probe. Otherwise
1489		 * module is in invalid HW state.
1490		 */
1491		scoped_guard(spinlock_irqsave, &priv->rmw_lock) {
1492			if (!rzg2l_mod_clock_is_enabled(&clk->hw))
1493				rzg2l_mod_clock_module_set_state(clk, true);
1494		}
1495	}
1496}
1497
1498static int rzg2l_mod_clock_update_shared_mstop_clks(struct rzg2l_cpg_priv *priv,
1499						    struct mod_clock *clock)
1500{
1501	struct mod_clock *clk;
1502	struct clk_hw *hw;
1503
1504	if (!clock->mstop)
1505		return 0;
1506
1507	for_each_mod_clock(clk, hw, priv) {
1508		int num_shared_mstop_clks, incr = 1;
1509		struct mod_clock **new_clks;
1510
1511		if (clk->mstop != clock->mstop)
1512			continue;
1513
1514		num_shared_mstop_clks = clk->num_shared_mstop_clks;
1515		if (!num_shared_mstop_clks)
1516			incr++;
1517
1518		new_clks = devm_krealloc(priv->dev, clk->shared_mstop_clks,
1519					 (num_shared_mstop_clks + incr) * sizeof(*new_clks),
1520					 GFP_KERNEL);
1521		if (!new_clks)
1522			return -ENOMEM;
1523
1524		if (!num_shared_mstop_clks)
1525			new_clks[num_shared_mstop_clks++] = clk;
1526		new_clks[num_shared_mstop_clks++] = clock;
1527
1528		for (unsigned int i = 0; i < num_shared_mstop_clks; i++) {
1529			new_clks[i]->shared_mstop_clks = new_clks;
1530			new_clks[i]->num_shared_mstop_clks = num_shared_mstop_clks;
1531		}
1532		break;
1533	}
1534
1535	return 0;
1536}
1537
1538static void __init
1539rzg2l_cpg_register_mod_clk(const struct rzg2l_mod_clk *mod,
1540			   const struct rzg2l_cpg_info *info,
1541			   struct rzg2l_cpg_priv *priv)
1542{
1543	struct mod_clock *clock = NULL;
1544	struct device *dev = priv->dev;
1545	unsigned int id = mod->id;
1546	struct clk_init_data init;
1547	struct clk *parent, *clk;
1548	const char *parent_name;
1549	unsigned int i;
1550	int ret;
1551
1552	WARN_DEBUG(id < priv->num_core_clks);
1553	WARN_DEBUG(id >= priv->num_core_clks + priv->num_mod_clks);
1554	WARN_DEBUG(mod->parent >= priv->num_core_clks + priv->num_mod_clks);
1555	WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT);
1556
1557	parent = priv->clks[mod->parent];
1558	if (IS_ERR(parent)) {
1559		clk = parent;
1560		goto fail;
1561	}
1562
1563	clock = devm_kzalloc(dev, sizeof(*clock), GFP_KERNEL);
1564	if (!clock) {
1565		clk = ERR_PTR(-ENOMEM);
1566		goto fail;
1567	}
1568
1569	init.name = mod->name;
1570	init.ops = &rzg2l_mod_clock_ops;
1571	init.flags = CLK_SET_RATE_PARENT;
1572	for (i = 0; i < info->num_crit_mod_clks; i++)
1573		if (id == info->crit_mod_clks[i]) {
1574			dev_dbg(dev, "CPG %s setting CLK_IS_CRITICAL\n",
1575				mod->name);
1576			init.flags |= CLK_IS_CRITICAL;
1577			break;
1578		}
1579
1580	parent_name = __clk_get_name(parent);
1581	init.parent_names = &parent_name;
1582	init.num_parents = 1;
1583
1584	clock->off = mod->off;
1585	clock->bit = mod->bit;
1586	clock->priv = priv;
1587	clock->hw.init = &init;
1588
1589	if (mod->mstop_conf) {
1590		struct mstop *mstop = rzg2l_mod_clock_get_mstop(priv, mod->mstop_conf);
1591
1592		if (!mstop) {
1593			mstop = devm_kzalloc(dev, sizeof(*mstop), GFP_KERNEL);
1594			if (!mstop) {
1595				clk = ERR_PTR(-ENOMEM);
1596				goto fail;
1597			}
1598			mstop->conf = mod->mstop_conf;
1599			atomic_set(&mstop->usecnt, 0);
1600		}
1601		clock->mstop = mstop;
1602	}
1603
1604	ret = devm_clk_hw_register(dev, &clock->hw);
1605	if (ret) {
1606		clk = ERR_PTR(ret);
1607		goto fail;
1608	}
1609
1610	if (mod->is_coupled) {
1611		struct mod_clock *sibling;
1612
1613		clock->enabled = rzg2l_mod_clock_is_enabled(&clock->hw);
1614		sibling = rzg2l_mod_clock_get_sibling(clock, priv);
1615		if (sibling) {
1616			clock->sibling = sibling;
1617			sibling->sibling = clock;
1618		}
1619	}
1620
1621	/* Keep this before priv->clks[id] is updated. */
1622	ret = rzg2l_mod_clock_update_shared_mstop_clks(priv, clock);
1623	if (ret) {
1624		clk = ERR_PTR(ret);
1625		goto fail;
1626	}
1627
1628	clk = clock->hw.clk;
1629	dev_dbg(dev, "Module clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
1630	priv->clks[id] = clk;
1631
1632	return;
1633
1634fail:
1635	dev_err(dev, "Failed to register %s clock %s: %ld\n", "module",
1636		mod->name, PTR_ERR(clk));
1637}
1638
1639#define rcdev_to_priv(x)	container_of(x, struct rzg2l_cpg_priv, rcdev)
1640
1641static int __rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
1642			      unsigned long id, bool assert)
1643{
1644	struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
1645	const struct rzg2l_cpg_info *info = priv->info;
1646	unsigned int reg = info->resets[id].off;
1647	u32 mask = BIT(info->resets[id].bit);
1648	s8 monbit = info->resets[id].monbit;
1649	u32 value = mask << 16;
1650	u32 mon;
1651	int ret;
1652
1653	dev_dbg(rcdev->dev, "%s id:%ld offset:0x%x\n",
1654		assert ? "assert" : "deassert", id, CLK_RST_R(reg));
1655
1656	if (!assert)
1657		value |= mask;
1658	writel(value, priv->base + CLK_RST_R(reg));
1659
1660	if (info->has_clk_mon_regs) {
1661		reg = CLK_MRST_R(reg);
1662	} else if (monbit >= 0) {
1663		reg = CPG_RST_MON;
1664		mask = BIT(monbit);
1665	} else {
1666		/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
1667		udelay(35);
1668		return 0;
1669	}
1670
1671	ret = readl_poll_timeout_atomic(priv->base + reg, mon,
1672					assert == !!(mon & mask), 10, 200);
1673	if (ret) {
1674		value ^= mask;
1675		writel(value, priv->base + CLK_RST_R(info->resets[id].off));
1676	}
1677
1678	return ret;
1679}
1680
1681static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
1682			    unsigned long id)
1683{
1684	return __rzg2l_cpg_assert(rcdev, id, true);
1685}
1686
1687static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev,
1688			      unsigned long id)
1689{
1690	return __rzg2l_cpg_assert(rcdev, id, false);
1691}
1692
1693static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev,
1694			   unsigned long id)
1695{
1696	int ret;
1697
1698	ret = rzg2l_cpg_assert(rcdev, id);
1699	if (ret)
1700		return ret;
1701
1702	return rzg2l_cpg_deassert(rcdev, id);
1703}
1704
1705static int rzg2l_cpg_status(struct reset_controller_dev *rcdev,
1706			    unsigned long id)
1707{
1708	struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
1709	const struct rzg2l_cpg_info *info = priv->info;
1710	s8 monbit = info->resets[id].monbit;
1711	unsigned int reg;
1712	u32 bitmask;
1713
1714	if (info->has_clk_mon_regs) {
1715		reg = CLK_MRST_R(info->resets[id].off);
1716		bitmask = BIT(info->resets[id].bit);
1717	} else if (monbit >= 0) {
1718		reg = CPG_RST_MON;
1719		bitmask = BIT(monbit);
1720	} else {
1721		return -ENOTSUPP;
1722	}
1723
1724	return !!(readl(priv->base + reg) & bitmask);
1725}
1726
1727static const struct reset_control_ops rzg2l_cpg_reset_ops = {
1728	.reset = rzg2l_cpg_reset,
1729	.assert = rzg2l_cpg_assert,
1730	.deassert = rzg2l_cpg_deassert,
1731	.status = rzg2l_cpg_status,
1732};
1733
1734static int rzg2l_cpg_reset_xlate(struct reset_controller_dev *rcdev,
1735				 const struct of_phandle_args *reset_spec)
1736{
1737	struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
1738	const struct rzg2l_cpg_info *info = priv->info;
1739	unsigned int id = reset_spec->args[0];
1740
1741	if (id >= rcdev->nr_resets || !info->resets[id].off) {
1742		dev_err(rcdev->dev, "Invalid reset index %u\n", id);
1743		return -EINVAL;
1744	}
1745
1746	return id;
1747}
1748
1749static int rzg2l_cpg_reset_controller_register(struct rzg2l_cpg_priv *priv)
1750{
1751	priv->rcdev.ops = &rzg2l_cpg_reset_ops;
1752	priv->rcdev.of_node = priv->dev->of_node;
1753	priv->rcdev.dev = priv->dev;
1754	priv->rcdev.of_reset_n_cells = 1;
1755	priv->rcdev.of_xlate = rzg2l_cpg_reset_xlate;
1756	priv->rcdev.nr_resets = priv->num_resets;
1757
1758	return devm_reset_controller_register(priv->dev, &priv->rcdev);
1759}
1760
1761static bool rzg2l_cpg_is_pm_clk(struct rzg2l_cpg_priv *priv,
1762				const struct of_phandle_args *clkspec)
1763{
1764	if (clkspec->np != priv->genpd.dev.of_node || clkspec->args_count != 2)
1765		return false;
1766
1767	switch (clkspec->args[0]) {
1768	case CPG_MOD: {
1769		const struct rzg2l_cpg_info *info = priv->info;
1770		unsigned int id = clkspec->args[1];
1771
1772		if (id >= priv->num_mod_clks)
1773			return false;
1774
1775		id += info->num_total_core_clks;
1776
1777		for (unsigned int i = 0; i < info->num_no_pm_mod_clks; i++) {
1778			if (info->no_pm_mod_clks[i] == id)
1779				return false;
1780		}
1781
1782		return true;
1783	}
1784
1785	case CPG_CORE:
1786	default:
1787		return false;
1788	}
1789}
1790
1791static int rzg2l_cpg_attach_dev(struct generic_pm_domain *domain, struct device *dev)
1792{
1793	struct rzg2l_cpg_priv *priv = container_of(domain, struct rzg2l_cpg_priv, genpd);
1794	struct device_node *np = dev->of_node;
1795	struct of_phandle_args clkspec;
1796	bool once = true;
1797	struct clk *clk;
1798	unsigned int i;
1799	int error;
1800
1801	for (i = 0; !of_parse_phandle_with_args(np, "clocks", "#clock-cells", i, &clkspec); i++) {
1802		if (!rzg2l_cpg_is_pm_clk(priv, &clkspec)) {
1803			of_node_put(clkspec.np);
1804			continue;
1805		}
1806
1807		if (once) {
1808			once = false;
1809			error = pm_clk_create(dev);
1810			if (error) {
1811				of_node_put(clkspec.np);
1812				goto err;
1813			}
1814		}
1815		clk = of_clk_get_from_provider(&clkspec);
1816		of_node_put(clkspec.np);
1817		if (IS_ERR(clk)) {
1818			error = PTR_ERR(clk);
1819			goto fail_destroy;
1820		}
1821
1822		error = pm_clk_add_clk(dev, clk);
1823		if (error) {
1824			dev_err(dev, "pm_clk_add_clk failed %d\n", error);
1825			goto fail_put;
1826		}
1827	}
1828
1829	return 0;
1830
1831fail_put:
1832	clk_put(clk);
1833
1834fail_destroy:
1835	pm_clk_destroy(dev);
1836err:
1837	return error;
1838}
1839
1840static void rzg2l_cpg_detach_dev(struct generic_pm_domain *unused, struct device *dev)
1841{
1842	if (!pm_clk_no_clocks(dev))
1843		pm_clk_destroy(dev);
1844}
1845
1846static void rzg2l_cpg_genpd_remove(void *data)
1847{
1848	pm_genpd_remove(data);
1849}
1850
1851static int __init rzg2l_cpg_add_clk_domain(struct rzg2l_cpg_priv *priv)
1852{
1853	struct device *dev = priv->dev;
1854	struct device_node *np = dev->of_node;
1855	struct generic_pm_domain *genpd = &priv->genpd;
1856	int ret;
1857
1858	genpd->name = np->name;
1859	genpd->flags = GENPD_FLAG_PM_CLK | GENPD_FLAG_ALWAYS_ON |
1860		       GENPD_FLAG_ACTIVE_WAKEUP;
1861	genpd->attach_dev = rzg2l_cpg_attach_dev;
1862	genpd->detach_dev = rzg2l_cpg_detach_dev;
1863	ret = pm_genpd_init(genpd, &pm_domain_always_on_gov, false);
1864	if (ret)
1865		return ret;
1866
1867	ret = devm_add_action_or_reset(dev, rzg2l_cpg_genpd_remove, genpd);
1868	if (ret)
1869		return ret;
1870
1871	return of_genpd_add_provider_simple(np, genpd);
1872}
1873
1874static int __init rzg2l_cpg_probe(struct platform_device *pdev)
1875{
1876	struct device *dev = &pdev->dev;
1877	struct device_node *np = dev->of_node;
1878	const struct rzg2l_cpg_info *info;
1879	struct rzg2l_cpg_priv *priv;
1880	unsigned int nclks, i;
1881	struct clk **clks;
1882	int error;
1883
1884	info = of_device_get_match_data(dev);
1885
1886	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
1887	if (!priv)
1888		return -ENOMEM;
1889
1890	priv->dev = dev;
1891	priv->info = info;
1892	spin_lock_init(&priv->rmw_lock);
1893
1894	priv->base = devm_platform_ioremap_resource(pdev, 0);
1895	if (IS_ERR(priv->base))
1896		return PTR_ERR(priv->base);
1897
1898	nclks = info->num_total_core_clks + info->num_hw_mod_clks;
1899	clks = devm_kmalloc_array(dev, nclks, sizeof(*clks), GFP_KERNEL);
1900	if (!clks)
1901		return -ENOMEM;
1902
1903	dev_set_drvdata(dev, priv);
1904	priv->clks = clks;
1905	priv->num_core_clks = info->num_total_core_clks;
1906	priv->num_mod_clks = info->num_hw_mod_clks;
1907	priv->num_resets = info->num_resets;
1908	priv->last_dt_core_clk = info->last_dt_core_clk;
1909
1910	for (i = 0; i < nclks; i++)
1911		clks[i] = ERR_PTR(-ENOENT);
1912
1913	for (i = 0; i < info->num_core_clks; i++)
1914		rzg2l_cpg_register_core_clk(&info->core_clks[i], info, priv);
1915
1916	for (i = 0; i < info->num_mod_clks; i++)
1917		rzg2l_cpg_register_mod_clk(&info->mod_clks[i], info, priv);
1918
1919	/*
1920	 * Initialize MSTOP after all the clocks were registered to avoid
1921	 * invalid reference counting when multiple clocks (critical,
1922	 * non-critical) share the same MSTOP.
1923	 */
1924	rzg2l_mod_clock_init_mstop(priv);
1925
1926	error = of_clk_add_provider(np, rzg2l_cpg_clk_src_twocell_get, priv);
1927	if (error)
1928		return error;
1929
1930	error = devm_add_action_or_reset(dev, rzg2l_cpg_del_clk_provider, np);
1931	if (error)
1932		return error;
1933
1934	error = rzg2l_cpg_add_clk_domain(priv);
1935	if (error)
1936		return error;
1937
1938	error = rzg2l_cpg_reset_controller_register(priv);
1939	if (error)
1940		return error;
1941
1942	debugfs_create_file("mstop", 0444, NULL, priv, &rzg2l_mod_clock_mstop_fops);
1943	return 0;
1944}
1945
1946static int rzg2l_cpg_resume(struct device *dev)
1947{
1948	struct rzg2l_cpg_priv *priv = dev_get_drvdata(dev);
1949
1950	rzg2l_mod_clock_init_mstop(priv);
1951
1952	return 0;
1953}
1954
1955static const struct dev_pm_ops rzg2l_cpg_pm_ops = {
1956	NOIRQ_SYSTEM_SLEEP_PM_OPS(NULL, rzg2l_cpg_resume)
1957};
1958
1959static const struct of_device_id rzg2l_cpg_match[] = {
1960#ifdef CONFIG_CLK_R9A07G043
1961	{
1962		.compatible = "renesas,r9a07g043-cpg",
1963		.data = &r9a07g043_cpg_info,
1964	},
1965#endif
1966#ifdef CONFIG_CLK_R9A07G044
1967	{
1968		.compatible = "renesas,r9a07g044-cpg",
1969		.data = &r9a07g044_cpg_info,
1970	},
1971#endif
1972#ifdef CONFIG_CLK_R9A07G054
1973	{
1974		.compatible = "renesas,r9a07g054-cpg",
1975		.data = &r9a07g054_cpg_info,
1976	},
1977#endif
1978#ifdef CONFIG_CLK_R9A08G045
1979	{
1980		.compatible = "renesas,r9a08g045-cpg",
1981		.data = &r9a08g045_cpg_info,
1982	},
1983#endif
1984#ifdef CONFIG_CLK_R9A09G011
1985	{
1986		.compatible = "renesas,r9a09g011-cpg",
1987		.data = &r9a09g011_cpg_info,
1988	},
1989#endif
1990	{ /* sentinel */ }
1991};
1992
1993static struct platform_driver rzg2l_cpg_driver = {
1994	.driver		= {
1995		.name	= "rzg2l-cpg",
1996		.of_match_table = rzg2l_cpg_match,
1997		.pm	= pm_sleep_ptr(&rzg2l_cpg_pm_ops),
1998	},
1999};
2000
2001static int __init rzg2l_cpg_init(void)
2002{
2003	return platform_driver_probe(&rzg2l_cpg_driver, rzg2l_cpg_probe);
2004}
2005
2006subsys_initcall(rzg2l_cpg_init);
2007
2008MODULE_DESCRIPTION("Renesas RZ/G2L CPG Driver");
~/ Read-only file preview.