int tegra1xx_unpowergate(int id, struct powergate_partition_info *pg_info) { int ret; /* If first clk_ptr is null, fill clk info for the partition */ if (!pg_info->clk_info[0].clk_ptr) get_clk_info(pg_info); if (tegra_powergate_is_powered(id)) return tegra_powergate_reset_module(pg_info); ret = tegra_powergate_set(id, true); if (ret) goto err_power; udelay(10); /* Un-Powergating fails if all clks are not enabled */ ret = partition_clk_enable(pg_info); if (ret) goto err_clk_on; udelay(10); ret = tegra_powergate_remove_clamping(id); if (ret) goto err_clamp; udelay(10); powergate_partition_deassert_reset(pg_info); udelay(10); tegra_powergate_mc_flush_done(id); udelay(10); /* Disable all clks enabled earlier. Drivers should enable clks */ partition_clk_disable(pg_info); return 0; err_clamp: partition_clk_disable(pg_info); err_clk_on: powergate_module(id); err_power: WARN(1, "Could not Un-Powergate %d", id); return ret; }
void nvhost_module_reset(struct device *dev, struct nvhost_module *mod) { dev_dbg(dev, "%s: asserting %s module reset (id %d, id2 %d)\n", __func__, mod->name, mod->desc->powergate_ids[0], mod->desc->powergate_ids[1]); /* assert module and mc client reset */ if (mod->desc->powergate_ids[0] != -1) { tegra_powergate_mc_disable(mod->desc->powergate_ids[0]); tegra_periph_reset_assert(mod->clk[0]); tegra_powergate_mc_flush(mod->desc->powergate_ids[0]); } if (mod->desc->powergate_ids[1] != -1) { tegra_powergate_mc_disable(mod->desc->powergate_ids[1]); tegra_periph_reset_assert(mod->clk[1]); tegra_powergate_mc_flush(mod->desc->powergate_ids[1]); } udelay(POWERGATE_DELAY); /* deassert reset */ if (mod->desc->powergate_ids[0] != -1) { tegra_powergate_mc_flush_done(mod->desc->powergate_ids[0]); tegra_periph_reset_deassert(mod->clk[0]); tegra_powergate_mc_enable(mod->desc->powergate_ids[0]); } if (mod->desc->powergate_ids[1] != -1) { tegra_powergate_mc_flush_done(mod->desc->powergate_ids[1]); tegra_periph_reset_deassert(mod->clk[1]); tegra_powergate_mc_enable(mod->desc->powergate_ids[1]); } dev_dbg(dev, "%s: module %s out of reset\n", __func__, mod->name); }
static int tegra_camera_reset(struct tegra_camera_dev *dev, uint id) { struct clk *clk; int mc_client = -1; switch (id) { case TEGRA_CAMERA_MODULE_VI: clk = dev->vi_clk; mc_client = TEGRA_POWERGATE_VENC; break; case TEGRA_CAMERA_MODULE_ISP: clk = dev->isp_clk; mc_client = TEGRA_POWERGATE_VENC; break; case TEGRA_CAMERA_MODULE_CSI: clk = dev->csi_clk; break; default: return -EINVAL; } if (mc_client != -1) { tegra_powergate_mc_disable(mc_client); } tegra_periph_reset_assert(clk); if (mc_client != -1) { tegra_powergate_mc_flush(mc_client); } udelay(10); if (mc_client != -1) { tegra_powergate_mc_flush_done(mc_client); } tegra_periph_reset_deassert(clk); if (mc_client != -1) { tegra_powergate_mc_enable(mc_client); } return 0; }