@@ -4096,3 +4096,70 @@ const char *omap_hwmod_get_main_clk(struct omap_hwmod *oh)
return oh->main_clk;
}
+
+/**
+ * omap_hwmod_save_context - Saves the HW reset line state of submodules
+ * @oh: struct omap_hwmod *
+ * @unused: (unused, caller should pass NULL)
+ *
+ * Saves the HW reset line state of all the submodules in the hwmod
+ */
+static int omap_hwmod_save_context(struct omap_hwmod *oh, void *unused)
+{
+ int i;
+
+ for (i = 0; i < oh->rst_lines_cnt; i++)
+ oh->rst_lines[i].context =
+ _read_hardreset(oh, oh->rst_lines[i].name);
+ return 0;
+}
+
+/**
+ * omap_hwmod_restore_context - Restores the HW reset line state of submodules
+ * @oh: struct omap_hwmod *
+ * @unused: (unused, caller should pass NULL)
+ *
+ * Restores the HW reset line state of all the submodules in the hwmod
+ */
+static int omap_hwmod_restore_context(struct omap_hwmod *oh, void *unused)
+{
+ int i;
+
+ for (i = 0; i < oh->rst_lines_cnt; i++)
+ if (oh->rst_lines[i].context)
+ _assert_hardreset(oh, oh->rst_lines[i].name);
+ else
+ _deassert_hardreset(oh, oh->rst_lines[i].name);
+
+ if (oh->_state == _HWMOD_STATE_ENABLED) {
+ if (soc_ops.enable_module)
+ soc_ops.enable_module(oh);
+ } else {
+ if (oh->flags & HWMOD_NEEDS_REIDLE)
+ _reidle(oh);
+ else if (soc_ops.disable_module)
+ soc_ops.disable_module(oh);
+ }
+
+ return 0;
+}
+
+/**
+ * omap_hwmods_save_context - Saves the HW reset line state for all hwmods
+ *
+ * Saves the HW reset line state of all the registered hwmods
+ */
+void omap_hwmods_save_context(void)
+{
+ omap_hwmod_for_each(omap_hwmod_save_context, NULL);
+}
+
+/**
+ * omap_hwmods_restore_context - Restores the HW reset line state for all hwmods
+ *
+ * Restores the HW reset line state of all the registered hwmods
+ */
+void omap_hwmods_restore_context(void)
+{
+ omap_hwmod_for_each(omap_hwmod_restore_context, NULL);
+}
@@ -168,6 +168,7 @@ struct omap_hwmod_rst_info {
const char *name;
u8 rst_shift;
u8 st_shift;
+ u8 context;
};
/**
@@ -678,6 +679,9 @@ int omap_hwmod_for_each_by_class(const char *classname,
const char *omap_hwmod_get_main_clk(struct omap_hwmod *oh);
+void omap_hwmods_save_context(void);
+void omap_hwmods_restore_context(void);
+
/*
*
*/