Lines Matching refs:pd

62 static bool scpsys_domain_is_on(struct scpsys_domain *pd)
64 struct scpsys *scpsys = pd->scpsys;
67 regmap_read(scpsys->base, pd->data->pwr_sta_offs, &status);
68 status &= pd->data->sta_mask;
70 regmap_read(scpsys->base, pd->data->pwr_sta2nd_offs, &status2);
71 status2 &= pd->data->sta_mask;
77 static int scpsys_sram_enable(struct scpsys_domain *pd)
79 u32 pdn_ack = pd->data->sram_pdn_ack_bits;
80 struct scpsys *scpsys = pd->scpsys;
84 regmap_clear_bits(scpsys->base, pd->data->ctl_offs, pd->data->sram_pdn_bits);
87 ret = regmap_read_poll_timeout(scpsys->base, pd->data->ctl_offs, tmp,
92 if (MTK_SCPD_CAPS(pd, MTK_SCPD_SRAM_ISO)) {
93 regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_SRAM_ISOINT_B_BIT);
95 regmap_clear_bits(scpsys->base, pd->data->ctl_offs, PWR_SRAM_CLKISO_BIT);
101 static int scpsys_sram_disable(struct scpsys_domain *pd)
103 u32 pdn_ack = pd->data->sram_pdn_ack_bits;
104 struct scpsys *scpsys = pd->scpsys;
107 if (MTK_SCPD_CAPS(pd, MTK_SCPD_SRAM_ISO)) {
108 regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_SRAM_CLKISO_BIT);
110 regmap_clear_bits(scpsys->base, pd->data->ctl_offs, PWR_SRAM_ISOINT_B_BIT);
113 regmap_set_bits(scpsys->base, pd->data->ctl_offs, pd->data->sram_pdn_bits);
116 return regmap_read_poll_timeout(scpsys->base, pd->data->ctl_offs, tmp,
146 static int scpsys_bus_protect_enable(struct scpsys_domain *pd)
150 ret = _scpsys_bus_protect_enable(pd->data->bp_infracfg, pd->infracfg);
154 return _scpsys_bus_protect_enable(pd->data->bp_smi, pd->smi);
186 static int scpsys_bus_protect_disable(struct scpsys_domain *pd)
190 ret = _scpsys_bus_protect_disable(pd->data->bp_smi, pd->smi);
194 return _scpsys_bus_protect_disable(pd->data->bp_infracfg, pd->infracfg);
209 struct scpsys_domain *pd = container_of(genpd, struct scpsys_domain, genpd);
210 struct scpsys *scpsys = pd->scpsys;
214 ret = scpsys_regulator_enable(pd->supply);
218 ret = clk_bulk_prepare_enable(pd->num_clks, pd->clks);
222 if (pd->data->ext_buck_iso_offs && MTK_SCPD_CAPS(pd, MTK_SCPD_EXT_BUCK_ISO))
223 regmap_clear_bits(scpsys->base, pd->data->ext_buck_iso_offs,
224 pd->data->ext_buck_iso_mask);
227 regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_ON_BIT);
228 regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_ON_2ND_BIT);
231 ret = readx_poll_timeout(scpsys_domain_is_on, pd, tmp, tmp, MTK_POLL_DELAY_US,
236 regmap_clear_bits(scpsys->base, pd->data->ctl_offs, PWR_CLK_DIS_BIT);
237 regmap_clear_bits(scpsys->base, pd->data->ctl_offs, PWR_ISO_BIT);
238 regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_RST_B_BIT);
240 ret = clk_bulk_prepare_enable(pd->num_subsys_clks, pd->subsys_clks);
244 ret = scpsys_sram_enable(pd);
248 ret = scpsys_bus_protect_disable(pd);
255 scpsys_sram_disable(pd);
257 clk_bulk_disable_unprepare(pd->num_subsys_clks, pd->subsys_clks);
259 clk_bulk_disable_unprepare(pd->num_clks, pd->clks);
261 scpsys_regulator_disable(pd->supply);
267 struct scpsys_domain *pd = container_of(genpd, struct scpsys_domain, genpd);
268 struct scpsys *scpsys = pd->scpsys;
272 ret = scpsys_bus_protect_enable(pd);
276 ret = scpsys_sram_disable(pd);
280 if (pd->data->ext_buck_iso_offs && MTK_SCPD_CAPS(pd, MTK_SCPD_EXT_BUCK_ISO))
281 regmap_set_bits(scpsys->base, pd->data->ext_buck_iso_offs,
282 pd->data->ext_buck_iso_mask);
284 clk_bulk_disable_unprepare(pd->num_subsys_clks, pd->subsys_clks);
287 regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_ISO_BIT);
288 regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_CLK_DIS_BIT);
289 regmap_clear_bits(scpsys->base, pd->data->ctl_offs, PWR_RST_B_BIT);
290 regmap_clear_bits(scpsys->base, pd->data->ctl_offs, PWR_ON_2ND_BIT);
291 regmap_clear_bits(scpsys->base, pd->data->ctl_offs, PWR_ON_BIT);
294 ret = readx_poll_timeout(scpsys_domain_is_on, pd, tmp, !tmp, MTK_POLL_DELAY_US,
299 clk_bulk_disable_unprepare(pd->num_clks, pd->clks);
301 scpsys_regulator_disable(pd->supply);
310 struct scpsys_domain *pd;
338 pd = devm_kzalloc(scpsys->dev, sizeof(*pd), GFP_KERNEL);
339 if (!pd)
342 pd->data = domain_data;
343 pd->scpsys = scpsys;
345 if (MTK_SCPD_CAPS(pd, MTK_SCPD_DOMAIN_SUPPLY)) {
354 pd->supply = devm_regulator_get(scpsys->dev, "domain");
356 if (IS_ERR(pd->supply)) {
357 dev_err_probe(scpsys->dev, PTR_ERR(pd->supply),
360 return ERR_CAST(pd->supply);
364 pd->infracfg = syscon_regmap_lookup_by_phandle_optional(node, "mediatek,infracfg");
365 if (IS_ERR(pd->infracfg))
366 return ERR_CAST(pd->infracfg);
370 pd->smi = device_node_to_regmap(smi_node);
372 if (IS_ERR(pd->smi))
373 return ERR_CAST(pd->smi);
384 pd->num_subsys_clks++;
386 pd->num_clks++;
389 pd->clks = devm_kcalloc(scpsys->dev, pd->num_clks, sizeof(*pd->clks), GFP_KERNEL);
390 if (!pd->clks)
393 pd->subsys_clks = devm_kcalloc(scpsys->dev, pd->num_subsys_clks,
394 sizeof(*pd->subsys_clks), GFP_KERNEL);
395 if (!pd->subsys_clks)
400 for (i = 0; i < pd->num_clks; i++) {
409 pd->clks[clk_ind++].clk = clk;
412 for (i = 0; i < pd->num_subsys_clks; i++) {
422 pd->subsys_clks[i].clk = clk;
431 if (MTK_SCPD_CAPS(pd, MTK_SCPD_KEEP_DEFAULT_OFF)) {
432 if (scpsys_domain_is_on(pd))
436 ret = scpsys_power_on(&pd->genpd);
442 if (MTK_SCPD_CAPS(pd, MTK_SCPD_ALWAYS_ON))
443 pd->genpd.flags |= GENPD_FLAG_ALWAYS_ON;
453 if (!pd->data->name)
454 pd->genpd.name = node->name;
456 pd->genpd.name = pd->data->name;
458 pd->genpd.power_off = scpsys_power_off;
459 pd->genpd.power_on = scpsys_power_on;
461 if (MTK_SCPD_CAPS(pd, MTK_SCPD_ACTIVE_WAKEUP))
462 pd->genpd.flags |= GENPD_FLAG_ACTIVE_WAKEUP;
464 if (MTK_SCPD_CAPS(pd, MTK_SCPD_KEEP_DEFAULT_OFF))
465 pm_genpd_init(&pd->genpd, NULL, true);
467 pm_genpd_init(&pd->genpd, NULL, false);
469 scpsys->domains[id] = &pd->genpd;
474 clk_bulk_put(pd->num_subsys_clks, pd->subsys_clks);
476 clk_bulk_put(pd->num_clks, pd->clks);
534 static void scpsys_remove_one_domain(struct scpsys_domain *pd)
542 ret = pm_genpd_remove(&pd->genpd);
544 dev_err(pd->scpsys->dev,
546 pd->genpd.name, ret);
547 if (scpsys_domain_is_on(pd))
548 scpsys_power_off(&pd->genpd);
550 clk_bulk_put(pd->num_clks, pd->clks);
551 clk_bulk_put(pd->num_subsys_clks, pd->subsys_clks);
557 struct scpsys_domain *pd;
563 pd = to_scpsys_domain(genpd);
564 scpsys_remove_one_domain(pd);