Lines Matching refs:pd

64 static bool scpsys_domain_is_on(struct scpsys_domain *pd)
66 struct scpsys *scpsys = pd->scpsys;
69 regmap_read(scpsys->base, pd->data->pwr_sta_offs, &status);
70 status &= pd->data->sta_mask;
72 regmap_read(scpsys->base, pd->data->pwr_sta2nd_offs, &status2);
73 status2 &= pd->data->sta_mask;
79 static int scpsys_sram_enable(struct scpsys_domain *pd)
81 u32 pdn_ack = pd->data->sram_pdn_ack_bits;
82 struct scpsys *scpsys = pd->scpsys;
86 regmap_clear_bits(scpsys->base, pd->data->ctl_offs, pd->data->sram_pdn_bits);
89 ret = regmap_read_poll_timeout(scpsys->base, pd->data->ctl_offs, tmp,
94 if (MTK_SCPD_CAPS(pd, MTK_SCPD_SRAM_ISO)) {
95 regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_SRAM_ISOINT_B_BIT);
97 regmap_clear_bits(scpsys->base, pd->data->ctl_offs, PWR_SRAM_CLKISO_BIT);
103 static int scpsys_sram_disable(struct scpsys_domain *pd)
105 u32 pdn_ack = pd->data->sram_pdn_ack_bits;
106 struct scpsys *scpsys = pd->scpsys;
109 if (MTK_SCPD_CAPS(pd, MTK_SCPD_SRAM_ISO)) {
110 regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_SRAM_CLKISO_BIT);
112 regmap_clear_bits(scpsys->base, pd->data->ctl_offs, PWR_SRAM_ISOINT_B_BIT);
115 regmap_set_bits(scpsys->base, pd->data->ctl_offs, pd->data->sram_pdn_bits);
118 return regmap_read_poll_timeout(scpsys->base, pd->data->ctl_offs, tmp,
123 static struct regmap *scpsys_bus_protect_get_regmap(struct scpsys_domain *pd,
127 return pd->smi;
129 return pd->infracfg;
132 static struct regmap *scpsys_bus_protect_get_sta_regmap(struct scpsys_domain *pd,
136 return pd->infracfg_nao;
138 return scpsys_bus_protect_get_regmap(pd, bpd);
141 static int scpsys_bus_protect_clear(struct scpsys_domain *pd,
144 struct regmap *sta_regmap = scpsys_bus_protect_get_sta_regmap(pd, bpd);
145 struct regmap *regmap = scpsys_bus_protect_get_regmap(pd, bpd);
165 static int scpsys_bus_protect_set(struct scpsys_domain *pd,
168 struct regmap *sta_regmap = scpsys_bus_protect_get_sta_regmap(pd, bpd);
169 struct regmap *regmap = scpsys_bus_protect_get_regmap(pd, bpd);
183 static int scpsys_bus_protect_enable(struct scpsys_domain *pd)
186 const struct scpsys_bus_prot_data *bpd = &pd->data->bp_cfg[i];
193 ret = scpsys_bus_protect_clear(pd, bpd);
195 ret = scpsys_bus_protect_set(pd, bpd);
203 static int scpsys_bus_protect_disable(struct scpsys_domain *pd)
206 const struct scpsys_bus_prot_data *bpd = &pd->data->bp_cfg[i];
213 ret = scpsys_bus_protect_set(pd, bpd);
215 ret = scpsys_bus_protect_clear(pd, bpd);
235 struct scpsys_domain *pd = container_of(genpd, struct scpsys_domain, genpd);
236 struct scpsys *scpsys = pd->scpsys;
240 ret = scpsys_regulator_enable(pd->supply);
244 ret = clk_bulk_prepare_enable(pd->num_clks, pd->clks);
248 if (pd->data->ext_buck_iso_offs && MTK_SCPD_CAPS(pd, MTK_SCPD_EXT_BUCK_ISO))
249 regmap_clear_bits(scpsys->base, pd->data->ext_buck_iso_offs,
250 pd->data->ext_buck_iso_mask);
253 regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_ON_BIT);
254 regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_ON_2ND_BIT);
257 ret = readx_poll_timeout(scpsys_domain_is_on, pd, tmp, tmp, MTK_POLL_DELAY_US,
262 regmap_clear_bits(scpsys->base, pd->data->ctl_offs, PWR_CLK_DIS_BIT);
263 regmap_clear_bits(scpsys->base, pd->data->ctl_offs, PWR_ISO_BIT);
264 regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_RST_B_BIT);
271 if (!MTK_SCPD_CAPS(pd, MTK_SCPD_STRICT_BUS_PROTECTION)) {
272 ret = clk_bulk_prepare_enable(pd->num_subsys_clks,
273 pd->subsys_clks);
278 ret = scpsys_sram_enable(pd);
282 ret = scpsys_bus_protect_disable(pd);
286 if (MTK_SCPD_CAPS(pd, MTK_SCPD_STRICT_BUS_PROTECTION)) {
287 ret = clk_bulk_prepare_enable(pd->num_subsys_clks,
288 pd->subsys_clks);
296 scpsys_bus_protect_enable(pd);
298 scpsys_sram_disable(pd);
300 if (!MTK_SCPD_CAPS(pd, MTK_SCPD_STRICT_BUS_PROTECTION))
301 clk_bulk_disable_unprepare(pd->num_subsys_clks,
302 pd->subsys_clks);
304 clk_bulk_disable_unprepare(pd->num_clks, pd->clks);
306 scpsys_regulator_disable(pd->supply);
312 struct scpsys_domain *pd = container_of(genpd, struct scpsys_domain, genpd);
313 struct scpsys *scpsys = pd->scpsys;
317 ret = scpsys_bus_protect_enable(pd);
321 ret = scpsys_sram_disable(pd);
325 if (pd->data->ext_buck_iso_offs && MTK_SCPD_CAPS(pd, MTK_SCPD_EXT_BUCK_ISO))
326 regmap_set_bits(scpsys->base, pd->data->ext_buck_iso_offs,
327 pd->data->ext_buck_iso_mask);
329 clk_bulk_disable_unprepare(pd->num_subsys_clks, pd->subsys_clks);
332 regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_ISO_BIT);
333 regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_CLK_DIS_BIT);
334 regmap_clear_bits(scpsys->base, pd->data->ctl_offs, PWR_RST_B_BIT);
335 regmap_clear_bits(scpsys->base, pd->data->ctl_offs, PWR_ON_2ND_BIT);
336 regmap_clear_bits(scpsys->base, pd->data->ctl_offs, PWR_ON_BIT);
339 ret = readx_poll_timeout(scpsys_domain_is_on, pd, tmp, !tmp, MTK_POLL_DELAY_US,
344 clk_bulk_disable_unprepare(pd->num_clks, pd->clks);
346 scpsys_regulator_disable(pd->supply);
355 struct scpsys_domain *pd;
383 pd = devm_kzalloc(scpsys->dev, sizeof(*pd), GFP_KERNEL);
384 if (!pd)
387 pd->data = domain_data;
388 pd->scpsys = scpsys;
390 if (MTK_SCPD_CAPS(pd, MTK_SCPD_DOMAIN_SUPPLY)) {
399 pd->supply = devm_regulator_get(scpsys->dev, "domain");
401 if (IS_ERR(pd->supply)) {
402 dev_err_probe(scpsys->dev, PTR_ERR(pd->supply),
405 return ERR_CAST(pd->supply);
409 pd->infracfg = syscon_regmap_lookup_by_phandle_optional(node, "mediatek,infracfg");
410 if (IS_ERR(pd->infracfg))
411 return ERR_CAST(pd->infracfg);
415 pd->smi = device_node_to_regmap(smi_node);
417 if (IS_ERR(pd->smi))
418 return ERR_CAST(pd->smi);
421 if (MTK_SCPD_CAPS(pd, MTK_SCPD_HAS_INFRA_NAO)) {
422 pd->infracfg_nao = syscon_regmap_lookup_by_phandle(node, "mediatek,infracfg-nao");
423 if (IS_ERR(pd->infracfg_nao))
424 return ERR_CAST(pd->infracfg_nao);
426 pd->infracfg_nao = NULL;
437 pd->num_subsys_clks++;
439 pd->num_clks++;
442 pd->clks = devm_kcalloc(scpsys->dev, pd->num_clks, sizeof(*pd->clks), GFP_KERNEL);
443 if (!pd->clks)
446 pd->subsys_clks = devm_kcalloc(scpsys->dev, pd->num_subsys_clks,
447 sizeof(*pd->subsys_clks), GFP_KERNEL);
448 if (!pd->subsys_clks)
453 for (i = 0; i < pd->num_clks; i++) {
462 pd->clks[clk_ind++].clk = clk;
465 for (i = 0; i < pd->num_subsys_clks; i++) {
475 pd->subsys_clks[i].clk = clk;
484 if (MTK_SCPD_CAPS(pd, MTK_SCPD_KEEP_DEFAULT_OFF)) {
485 if (scpsys_domain_is_on(pd))
489 ret = scpsys_power_on(&pd->genpd);
495 if (MTK_SCPD_CAPS(pd, MTK_SCPD_ALWAYS_ON))
496 pd->genpd.flags |= GENPD_FLAG_ALWAYS_ON;
506 if (!pd->data->name)
507 pd->genpd.name = node->name;
509 pd->genpd.name = pd->data->name;
511 pd->genpd.power_off = scpsys_power_off;
512 pd->genpd.power_on = scpsys_power_on;
514 if (MTK_SCPD_CAPS(pd, MTK_SCPD_ACTIVE_WAKEUP))
515 pd->genpd.flags |= GENPD_FLAG_ACTIVE_WAKEUP;
517 if (MTK_SCPD_CAPS(pd, MTK_SCPD_KEEP_DEFAULT_OFF))
518 pm_genpd_init(&pd->genpd, NULL, true);
520 pm_genpd_init(&pd->genpd, NULL, false);
522 scpsys->domains[id] = &pd->genpd;
527 clk_bulk_put(pd->num_subsys_clks, pd->subsys_clks);
529 clk_bulk_put(pd->num_clks, pd->clks);
587 static void scpsys_remove_one_domain(struct scpsys_domain *pd)
595 ret = pm_genpd_remove(&pd->genpd);
597 dev_err(pd->scpsys->dev,
599 pd->genpd.name, ret);
600 if (scpsys_domain_is_on(pd))
601 scpsys_power_off(&pd->genpd);
603 clk_bulk_put(pd->num_clks, pd->clks);
604 clk_bulk_put(pd->num_subsys_clks, pd->subsys_clks);
610 struct scpsys_domain *pd;
616 pd = to_scpsys_domain(genpd);
617 scpsys_remove_one_domain(pd);