|
@@ -785,3 +785,88 @@ static void __init omap_mux_free_names(struct omap_mux *m)
|
|
|
|
|
|
}
|
|
|
|
|
|
+/* Free all data except for GPIO pins unless CONFIG_DEBUG_FS is set */
|
|
|
+int __init omap_mux_late_init(void)
|
|
|
+{
|
|
|
+ struct omap_mux_partition *partition;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ list_for_each_entry(partition, &mux_partitions, node) {
|
|
|
+ struct omap_mux_entry *e, *tmp;
|
|
|
+ list_for_each_entry_safe(e, tmp, &partition->muxmodes, node) {
|
|
|
+ struct omap_mux *m = &e->mux;
|
|
|
+ u16 mode = omap_mux_read(partition, m->reg_offset);
|
|
|
+
|
|
|
+ if (OMAP_MODE_GPIO(partition, mode))
|
|
|
+ continue;
|
|
|
+
|
|
|
+#ifndef CONFIG_DEBUG_FS
|
|
|
+ mutex_lock(&muxmode_mutex);
|
|
|
+ list_del(&e->node);
|
|
|
+ mutex_unlock(&muxmode_mutex);
|
|
|
+ omap_mux_free_names(m);
|
|
|
+ kfree(m);
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = request_irq(omap_prcm_event_to_irq("io"),
|
|
|
+ omap_hwmod_mux_handle_irq, IRQF_SHARED | IRQF_NO_SUSPEND,
|
|
|
+ "hwmod_io", omap_mux_late_init);
|
|
|
+
|
|
|
+ if (ret)
|
|
|
+ pr_warning("mux: Failed to setup hwmod io irq %d\n", ret);
|
|
|
+
|
|
|
+ omap_mux_dbg_init();
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void __init omap_mux_package_fixup(struct omap_mux *p,
|
|
|
+ struct omap_mux *superset)
|
|
|
+{
|
|
|
+ while (p->reg_offset != OMAP_MUX_TERMINATOR) {
|
|
|
+ struct omap_mux *s = superset;
|
|
|
+ int found = 0;
|
|
|
+
|
|
|
+ while (s->reg_offset != OMAP_MUX_TERMINATOR) {
|
|
|
+ if (s->reg_offset == p->reg_offset) {
|
|
|
+ *s = *p;
|
|
|
+ found++;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ s++;
|
|
|
+ }
|
|
|
+ if (!found)
|
|
|
+ pr_err("%s: Unknown entry offset 0x%x\n", __func__,
|
|
|
+ p->reg_offset);
|
|
|
+ p++;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef CONFIG_DEBUG_FS
|
|
|
+
|
|
|
+static void __init omap_mux_package_init_balls(struct omap_ball *b,
|
|
|
+ struct omap_mux *superset)
|
|
|
+{
|
|
|
+ while (b->reg_offset != OMAP_MUX_TERMINATOR) {
|
|
|
+ struct omap_mux *s = superset;
|
|
|
+ int found = 0;
|
|
|
+
|
|
|
+ while (s->reg_offset != OMAP_MUX_TERMINATOR) {
|
|
|
+ if (s->reg_offset == b->reg_offset) {
|
|
|
+ s->balls[0] = b->balls[0];
|
|
|
+ s->balls[1] = b->balls[1];
|
|
|
+ found++;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ s++;
|
|
|
+ }
|
|
|
+ if (!found)
|
|
|
+ pr_err("%s: Unknown ball offset 0x%x\n", __func__,
|
|
|
+ b->reg_offset);
|
|
|
+ b++;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#else /* CONFIG_DEBUG_FS */
|