int send_mbox_callback(void *arg) { struct wmd_dev_context *dev_context; struct cfg_hostres *resources; u32 temp; struct dspbridge_platform_data *pdata = omap_dspbridge_dev->dev.platform_data; dev_get_wmd_context(dev_get_first(), &dev_context); if (!dev_context || !dev_context->resources) return -EFAULT; resources = dev_context->resources; if (dev_context->dw_brd_state == BRD_DSP_HIBERNATION || dev_context->dw_brd_state == BRD_HIBERNATION) { /* Restart the peripheral clocks */ dsp_peripheral_clocks_enable(dev_context, NULL); #ifdef CONFIG_BRIDGE_WDT3 dsp_wdt_enable(true); #endif /* * 2:0 AUTO_IVA2_DPLL - Enabling IVA2 DPLL auto control * in CM_AUTOIDLE_PLL_IVA2 register */ (*pdata->dsp_cm_write)(1 << OMAP3430_AUTO_IVA2_DPLL_SHIFT, OMAP3430_IVA2_MOD, OMAP3430_CM_AUTOIDLE_PLL); /* * 7:4 IVA2_DPLL_FREQSEL - IVA2 internal frq set to * 0.75 MHz - 1.0 MHz * 2:0 EN_IVA2_DPLL - Enable IVA2 DPLL in lock mode */ (*pdata->dsp_cm_rmw_bits)(OMAP3430_IVA2_DPLL_FREQSEL_MASK | OMAP3430_EN_IVA2_DPLL_MASK, 0x3 << OMAP3430_IVA2_DPLL_FREQSEL_SHIFT | 0x7 << OMAP3430_EN_IVA2_DPLL_SHIFT, OMAP3430_IVA2_MOD, OMAP3430_CM_CLKEN_PLL); /* Restore mailbox settings */ omap_mbox_restore_ctx(dev_context->mbox); /* Access MMU SYS CONFIG register to generate a short wakeup */ temp = *(reg_uword32 *) (resources->dw_dmmu_base + 0x10); dev_context->dw_brd_state = BRD_RUNNING; } else if (dev_context->dw_brd_state == BRD_RETENTION) { /* Restart the peripheral clocks */ dsp_peripheral_clocks_enable(dev_context, NULL); dev_context->dw_brd_state = BRD_RUNNING; } return 0; }
int sm_interrupt_dsp(struct wmd_dev_context *dev_context, u16 mb_val) { int status = 0; struct cfg_hostres *resources; u32 temp; struct dspbridge_platform_data *pdata = omap_dspbridge_dev->dev.platform_data; if (!dev_context || !dev_context->resources) return -EFAULT; if (!dev_context->mbox) return status; resources = dev_context->resources; if (dev_context->dw_brd_state == BRD_DSP_HIBERNATION || dev_context->dw_brd_state == BRD_HIBERNATION) { /* Restart the peripheral clocks */ dsp_peripheral_clocks_enable(dev_context, NULL); #ifdef CONFIG_BRIDGE_WDT3 dsp_wdt_enable(true); #endif /* * 2:0 AUTO_IVA2_DPLL - Enabling IVA2 DPLL auto control * in CM_AUTOIDLE_PLL_IVA2 register */ (*pdata->dsp_cm_write)(1 << OMAP3430_AUTO_IVA2_DPLL_SHIFT, OMAP3430_IVA2_MOD, OMAP3430_CM_AUTOIDLE_PLL); /* * 7:4 IVA2_DPLL_FREQSEL - IVA2 internal frq set to * 0.75 MHz - 1.0 MHz * 2:0 EN_IVA2_DPLL - Enable IVA2 DPLL in lock mode */ (*pdata->dsp_cm_rmw_bits)(OMAP3430_IVA2_DPLL_FREQSEL_MASK | OMAP3430_EN_IVA2_DPLL_MASK, 0x3 << OMAP3430_IVA2_DPLL_FREQSEL_SHIFT | 0x7 << OMAP3430_EN_IVA2_DPLL_SHIFT, OMAP3430_IVA2_MOD, OMAP3430_CM_CLKEN_PLL); /* Restore mailbox settings */ omap_mbox_restore_ctx(dev_context->mbox); /* Access MMU SYS CONFIG register to generate a short wakeup */ temp = *(reg_uword32 *) (resources->dw_dmmu_base + 0x10); dev_context->dw_brd_state = BRD_RUNNING; } else if (dev_context->dw_brd_state == BRD_RETENTION) { /* Restart the peripheral clocks */ dsp_peripheral_clocks_enable(dev_context, NULL); dev_context->dw_brd_state = BRD_RUNNING; } status = omap_mbox_msg_send(dev_context->mbox, mb_val); if (status) { pr_err("omap_mbox_msg_send Fail and status = %d\n", status); status = -EPERM; } dev_dbg(bridge, "MBX: writing %x to Mailbox\n", mb_val); return status; }