int ux500_msp_i2s_close(struct ux500_msp *msp, unsigned int dir) { int status = 0; dev_dbg(msp->dev, "%s: Enter (dir = 0x%01x).\n", __func__, dir); status = disable_msp(msp, dir); if (msp->dir_busy == 0) { /* disable sample rate and frame generators */ msp->msp_state = MSP_STATE_IDLE; writel((readl(msp->registers + MSP_GCR) & (~(FRAME_GEN_ENABLE | SRG_ENABLE))), msp->registers + MSP_GCR); writel(0, msp->registers + MSP_GCR); writel(0, msp->registers + MSP_TCF); writel(0, msp->registers + MSP_RCF); writel(0, msp->registers + MSP_DMACR); writel(0, msp->registers + MSP_SRG); writel(0, msp->registers + MSP_MCR); writel(0, msp->registers + MSP_RCM); writel(0, msp->registers + MSP_RCV); writel(0, msp->registers + MSP_TCE0); writel(0, msp->registers + MSP_TCE1); writel(0, msp->registers + MSP_TCE2); writel(0, msp->registers + MSP_TCE3); writel(0, msp->registers + MSP_RCE0); writel(0, msp->registers + MSP_RCE1); writel(0, msp->registers + MSP_RCE2); writel(0, msp->registers + MSP_RCE3); } return status; }
int ux500_msp_i2s_close(struct ux500_msp *msp, unsigned int dir) { int status = 0, retval = 0; unsigned long flags; dev_dbg(msp->dev, "%s: Enter (dir = 0x%01x).\n", __func__, dir); status = disable_msp(msp, dir); if (msp->dir_busy == 0) { /* disable sample rate and frame generators */ msp->msp_state = MSP_STATE_IDLE; writel((readl(msp->registers + MSP_GCR) & (~(FRAME_GEN_ENABLE | SRG_ENABLE))), msp->registers + MSP_GCR); spin_lock_irqsave(&msp_rxtx_lock, flags); WARN_ON(!msp->pinctrl_rxtx_ref); msp->pinctrl_rxtx_ref--; if (msp->pinctrl_rxtx_ref == 0 && !(IS_ERR(msp->pinctrl_p) || IS_ERR(msp->pinctrl_sleep))) { retval = pinctrl_select_state(msp->pinctrl_p, msp->pinctrl_sleep); if (retval) pr_err("could not set MSP sleepstate\n"); } spin_unlock_irqrestore(&msp_rxtx_lock, flags); writel(0, msp->registers + MSP_GCR); writel(0, msp->registers + MSP_TCF); writel(0, msp->registers + MSP_RCF); writel(0, msp->registers + MSP_DMACR); writel(0, msp->registers + MSP_SRG); writel(0, msp->registers + MSP_MCR); writel(0, msp->registers + MSP_RCM); writel(0, msp->registers + MSP_RCV); writel(0, msp->registers + MSP_TCE0); writel(0, msp->registers + MSP_TCE1); writel(0, msp->registers + MSP_TCE2); writel(0, msp->registers + MSP_TCE3); writel(0, msp->registers + MSP_RCE0); writel(0, msp->registers + MSP_RCE1); writel(0, msp->registers + MSP_RCE2); writel(0, msp->registers + MSP_RCE3); } return status; }