Lines Matching +full:pd +full:- +full:disable
1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright 2015-2017 Pengutronix, Lucas Stach <kernel@pengutronix.de>
4 * Copyright 2011-2013 Freescale Semiconductor, Inc.
61 struct imx_pm_domain *pd = to_imx_pm_domain(genpd); in imx6_pm_domain_power_off() local
66 regmap_read(pd->regmap, pd->reg_offs + GPC_PGC_PDNSCR_OFFS, &val); in imx6_pm_domain_power_off()
71 regmap_update_bits(pd->regmap, pd->reg_offs + GPC_PGC_CTRL_OFFS, in imx6_pm_domain_power_off()
75 val = BIT(pd->cntr_pdn_bit); in imx6_pm_domain_power_off()
76 regmap_update_bits(pd->regmap, GPC_CNTR, val, val); in imx6_pm_domain_power_off()
79 udelay(DIV_ROUND_UP(iso + iso2sw, pd->ipg_rate_mhz)); in imx6_pm_domain_power_off()
81 if (pd->supply) in imx6_pm_domain_power_off()
82 regulator_disable(pd->supply); in imx6_pm_domain_power_off()
89 struct imx_pm_domain *pd = to_imx_pm_domain(genpd); in imx6_pm_domain_power_on() local
93 if (pd->supply) { in imx6_pm_domain_power_on()
94 ret = regulator_enable(pd->supply); in imx6_pm_domain_power_on()
103 for (i = 0; i < pd->num_clks; i++) in imx6_pm_domain_power_on()
104 clk_prepare_enable(pd->clk[i]); in imx6_pm_domain_power_on()
107 regmap_update_bits(pd->regmap, pd->reg_offs + GPC_PGC_CTRL_OFFS, in imx6_pm_domain_power_on()
111 req = BIT(pd->cntr_pdn_bit + 1); in imx6_pm_domain_power_on()
112 regmap_update_bits(pd->regmap, GPC_CNTR, req, req); in imx6_pm_domain_power_on()
115 ret = regmap_read_poll_timeout(pd->regmap, GPC_CNTR, val, !(val & req), in imx6_pm_domain_power_on()
118 pr_err("powerup request on domain %s timed out\n", genpd->name); in imx6_pm_domain_power_on()
123 /* Disable reset clocks for all devices in the domain */ in imx6_pm_domain_power_on()
124 for (i = 0; i < pd->num_clks; i++) in imx6_pm_domain_power_on()
125 clk_disable_unprepare(pd->clk[i]); in imx6_pm_domain_power_on()
135 struct clk *clk = of_clk_get(dev->of_node, i); in imx_pgc_get_clocks()
140 ret = -EINVAL; in imx_pgc_get_clocks()
143 domain->clk[i] = clk; in imx_pgc_get_clocks()
145 domain->num_clks = i; in imx_pgc_get_clocks()
150 while (i--) in imx_pgc_get_clocks()
151 clk_put(domain->clk[i]); in imx_pgc_get_clocks()
160 for (i = domain->num_clks - 1; i >= 0; i--) in imx_pgc_put_clocks()
161 clk_put(domain->clk[i]); in imx_pgc_put_clocks()
167 domain->supply = devm_regulator_get_optional(dev, "power"); in imx_pgc_parse_dt()
168 if (IS_ERR(domain->supply)) { in imx_pgc_parse_dt()
169 if (PTR_ERR(domain->supply) == -ENODEV) in imx_pgc_parse_dt()
170 domain->supply = NULL; in imx_pgc_parse_dt()
172 return PTR_ERR(domain->supply); in imx_pgc_parse_dt()
181 struct imx_pm_domain *domain = pdev->dev.platform_data; in imx_pgc_power_domain_probe()
182 struct device *dev = &pdev->dev; in imx_pgc_power_domain_probe()
185 /* if this PD is associated with a DT node try to parse it */ in imx_pgc_power_domain_probe()
186 if (dev->of_node) { in imx_pgc_power_domain_probe()
193 if (domain->base.power_on) in imx_pgc_power_domain_probe()
194 domain->base.power_on(&domain->base); in imx_pgc_power_domain_probe()
197 pm_genpd_init(&domain->base, NULL, false); in imx_pgc_power_domain_probe()
198 ret = of_genpd_add_provider_simple(dev->of_node, &domain->base); in imx_pgc_power_domain_probe()
203 device_link_add(dev, dev->parent, DL_FLAG_AUTOREMOVE_CONSUMER); in imx_pgc_power_domain_probe()
208 pm_genpd_remove(&domain->base); in imx_pgc_power_domain_probe()
216 struct imx_pm_domain *domain = pdev->dev.platform_data; in imx_pgc_power_domain_remove()
219 of_genpd_del_provider(pdev->dev.of_node); in imx_pgc_power_domain_remove()
220 pm_genpd_remove(&domain->base); in imx_pgc_power_domain_remove()
228 { "imx-pgc-power-domain"},
234 .name = "imx-pgc-pd",
321 { .compatible = "fsl,imx6q-gpc", .data = &imx6q_dt_data },
322 { .compatible = "fsl,imx6qp-gpc", .data = &imx6qp_dt_data },
323 { .compatible = "fsl,imx6sl-gpc", .data = &imx6sl_dt_data },
324 { .compatible = "fsl,imx6sx-gpc", .data = &imx6sx_dt_data },
368 domain->regmap = regmap; in imx_gpc_old_dt_init()
369 domain->ipg_rate_mhz = 66; in imx_gpc_old_dt_init()
372 domain->supply = devm_regulator_get(dev, "pu"); in imx_gpc_old_dt_init()
373 if (IS_ERR(domain->supply)) in imx_gpc_old_dt_init()
374 return PTR_ERR(domain->supply); in imx_gpc_old_dt_init()
380 domain->base.power_on(&domain->base); in imx_gpc_old_dt_init()
388 ret = of_genpd_add_provider_onecell(dev->of_node, in imx_gpc_old_dt_init()
407 of_match_device(imx_gpc_dt_ids, &pdev->dev); in imx_gpc_probe()
408 const struct imx_gpc_dt_data *of_id_data = of_id->data; in imx_gpc_probe()
414 pgc_node = of_get_child_by_name(pdev->dev.of_node, "pgc"); in imx_gpc_probe()
417 if (!of_property_read_bool(pdev->dev.of_node, "#power-domain-cells") && in imx_gpc_probe()
425 regmap = devm_regmap_init_mmio_clk(&pdev->dev, NULL, base, in imx_gpc_probe()
429 dev_err(&pdev->dev, "failed to init regmap: %d\n", in imx_gpc_probe()
435 * Disable PU power down by runtime PM if ERR009619 is present. in imx_gpc_probe()
444 if (of_id_data->err009619_present) in imx_gpc_probe()
449 if (of_id_data->err006287_present) in imx_gpc_probe()
454 ret = imx_gpc_old_dt_init(&pdev->dev, regmap, in imx_gpc_probe()
455 of_id_data->num_domains); in imx_gpc_probe()
466 ipg_clk = devm_clk_get(&pdev->dev, "ipg"); in imx_gpc_probe()
477 if (domain_index >= of_id_data->num_domains) in imx_gpc_probe()
480 pd_pdev = platform_device_alloc("imx-pgc-power-domain", in imx_gpc_probe()
484 return -ENOMEM; in imx_gpc_probe()
495 domain = pd_pdev->dev.platform_data; in imx_gpc_probe()
496 domain->regmap = regmap; in imx_gpc_probe()
497 domain->ipg_rate_mhz = ipg_rate_mhz; in imx_gpc_probe()
499 pd_pdev->dev.parent = &pdev->dev; in imx_gpc_probe()
500 pd_pdev->dev.of_node = np; in imx_gpc_probe()
501 pd_pdev->dev.fwnode = of_fwnode_handle(np); in imx_gpc_probe()
520 pgc_node = of_get_child_by_name(pdev->dev.of_node, "pgc"); in imx_gpc_remove()
523 if (!of_property_read_bool(pdev->dev.of_node, "#power-domain-cells") && in imx_gpc_remove()
529 * de-register the power domains in imx_gpc_remove()
532 of_genpd_del_provider(pdev->dev.of_node); in imx_gpc_remove()
549 .name = "imx-gpc",