dev_dbg(rcdev->dev, "%s id:%ld offset:0x%x\n",
assert ? "assert" : "deassert", id, CLK_RST_R(reg));
+ if (assert) {
+ for (unsigned int i = 0; i < priv->info->num_crit_resets; i++) {
+ if (id == priv->info->crit_resets[i])
+ return 0;
+ }
+ }
+
if (!assert)
value |= mask;
writel(value, priv->base + CLK_RST_R(reg));
return __rzg2l_cpg_assert(rcdev, id, false);
}
+static int rzg2l_cpg_deassert_crit_resets(struct reset_controller_dev *rcdev,
+ const struct rzg2l_cpg_info *info)
+{
+ int ret;
+
+ for (unsigned int i = 0; i < info->num_crit_resets; i++) {
+ ret = rzg2l_cpg_deassert(rcdev, info->crit_resets[i]);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev,
unsigned long id)
{
if (error)
return error;
+ error = rzg2l_cpg_deassert_crit_resets(&priv->rcdev, info);
+ if (error)
+ return error;
+
debugfs_create_file("mstop", 0444, NULL, priv, &rzg2l_mod_clock_mstop_fops);
return 0;
}
static int rzg2l_cpg_resume(struct device *dev)
{
struct rzg2l_cpg_priv *priv = dev_get_drvdata(dev);
+ int ret;
+
+ ret = rzg2l_cpg_deassert_crit_resets(&priv->rcdev, priv->info);
+ if (ret)
+ return ret;
rzg2l_mod_clock_init_mstop(priv);
* @crit_mod_clks: Array with Module Clock IDs of critical clocks that
* should not be disabled without a knowledgeable driver
* @num_crit_mod_clks: Number of entries in crit_mod_clks[]
+ * @crit_resets: Array with Reset IDs of critical resets that should not be
+ * asserted without a knowledgeable driver
+ * @num_crit_resets: Number of entries in crit_resets[]
* @has_clk_mon_regs: Flag indicating whether the SoC has CLK_MON registers
*/
struct rzg2l_cpg_info {
const unsigned int *crit_mod_clks;
unsigned int num_crit_mod_clks;
+ /* Critical Resets that should not be asserted */
+ const unsigned int *crit_resets;
+ unsigned int num_crit_resets;
+
bool has_clk_mon_regs;
};