|
@@ -425,3 +425,53 @@ static irqreturn_t omap_hwmod_mux_handle_irq(int irq, void *unused)
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
|
|
|
|
+/* Assumes the calling function takes care of locking */
|
|
|
+void omap_hwmod_mux(struct omap_hwmod_mux_info *hmux, u8 state)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ /* Runtime idling of dynamic pads */
|
|
|
+ if (state == _HWMOD_STATE_IDLE && hmux->enabled) {
|
|
|
+ for (i = 0; i < hmux->nr_pads_dynamic; i++) {
|
|
|
+ struct omap_device_pad *pad = hmux->pads_dynamic[i];
|
|
|
+ int val = -EINVAL;
|
|
|
+
|
|
|
+ val = pad->idle;
|
|
|
+ omap_mux_write(pad->partition, val,
|
|
|
+ pad->mux->reg_offset);
|
|
|
+ }
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Runtime enabling of dynamic pads */
|
|
|
+ if ((state == _HWMOD_STATE_ENABLED) && hmux->pads_dynamic
|
|
|
+ && hmux->enabled) {
|
|
|
+ for (i = 0; i < hmux->nr_pads_dynamic; i++) {
|
|
|
+ struct omap_device_pad *pad = hmux->pads_dynamic[i];
|
|
|
+ int val = -EINVAL;
|
|
|
+
|
|
|
+ val = pad->enable;
|
|
|
+ omap_mux_write(pad->partition, val,
|
|
|
+ pad->mux->reg_offset);
|
|
|
+ }
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Enabling or disabling of all pads */
|
|
|
+ for (i = 0; i < hmux->nr_pads; i++) {
|
|
|
+ struct omap_device_pad *pad = &hmux->pads[i];
|
|
|
+ int flags, val = -EINVAL;
|
|
|
+
|
|
|
+ flags = pad->flags;
|
|
|
+
|
|
|
+ switch (state) {
|
|
|
+ case _HWMOD_STATE_ENABLED:
|
|
|
+ val = pad->enable;
|
|
|
+ pr_debug("%s: Enabling %s %x\n", __func__,
|
|
|
+ pad->name, val);
|
|
|
+ break;
|
|
|
+ case _HWMOD_STATE_DISABLED:
|
|
|
+ /* Use safe mode unless OMAP_DEVICE_PAD_REMUX */
|
|
|
+ if (flags & OMAP_DEVICE_PAD_REMUX)
|