static void rockchip_do_pmu_set_power_domain(struct rockchip_pm_domain *pd, bool on) { struct rockchip_pmu *pmu = pd->pmu; struct generic_pm_domain *genpd = &pd->genpd; bool is_on; if (pd->info->pwr_mask == 0) return; else if (pd->info->pwr_w_mask) regmap_write(pmu->regmap, pmu->info->pwr_offset, on ? pd->info->pwr_w_mask : (pd->info->pwr_mask | pd->info->pwr_w_mask)); else regmap_update_bits(pmu->regmap, pmu->info->pwr_offset, pd->info->pwr_mask, on ? 0 : -1U); dsb(sy); if (readx_poll_timeout_atomic(rockchip_pmu_domain_is_on, pd, is_on, is_on == on, 0, 10000)) { dev_err(pmu->dev, "failed to set domain '%s', val=%d\n", genpd->name, is_on); return; } }
static int rockchip_pmu_set_idle_request(struct rockchip_pm_domain *pd, bool idle) { const struct rockchip_domain_info *pd_info = pd->info; struct generic_pm_domain *genpd = &pd->genpd; struct rockchip_pmu *pmu = pd->pmu; unsigned int target_ack; unsigned int val; bool is_idle; int ret; if (pd_info->req_mask == 0) return 0; else if (pd_info->req_w_mask) regmap_write(pmu->regmap, pmu->info->req_offset, idle ? (pd_info->req_mask | pd_info->req_w_mask) : pd_info->req_w_mask); else regmap_update_bits(pmu->regmap, pmu->info->req_offset, pd_info->req_mask, idle ? -1U : 0); dsb(sy); /* Wait util idle_ack = 1 */ target_ack = idle ? pd_info->ack_mask : 0; ret = readx_poll_timeout_atomic(rockchip_pmu_read_ack, pmu, val, (val & pd_info->ack_mask) == target_ack, 0, 10000); if (ret) { dev_err(pmu->dev, "failed to get ack on domain '%s', val=0x%x\n", genpd->name, val); return ret; } ret = readx_poll_timeout_atomic(rockchip_pmu_domain_is_idle, pd, is_idle, is_idle == idle, 0, 10000); if (ret) { dev_err(pmu->dev, "failed to set idle on domain '%s', val=%d\n", genpd->name, is_idle); return ret; } return 0; }
static void tegra_adma_stop(struct tegra_adma_chan *tdc) { unsigned int status; /* Disable ADMA */ tdma_ch_write(tdc, ADMA_CH_CMD, 0); /* Clear interrupt status */ tegra_adma_irq_clear(tdc); if (readx_poll_timeout_atomic(readl, tdc->chan_addr + ADMA_CH_STATUS, status, !(status & ADMA_CH_STATUS_XFER_EN), 20, 10000)) { dev_err(tdc2dev(tdc), "unable to stop DMA channel\n"); return; } kfree(tdc->desc); tdc->desc = NULL; }