Lines Matching +full:pd +full:- +full:node

1 // SPDX-License-Identifier: GPL-2.0
9 * Murali Karicheri <m-[email protected]>
12 * And: arch/arm/mach-davinci/psc.c
16 #include <linux/clk-provider.h>
27 #include <linux/reset-controller.h>
65 * struct davinci_lpsc_clk - LPSC clock structure
72 * @pd: Power domain
82 u32 pd; member
90 * best_dev_name - get the "best" device name.
93 * Returns the device tree compatible name if the device has a DT node,
102 if (!of_property_read_string(dev->of_node, "compatible", &compatible)) in best_dev_name()
113 regmap_write_bits(lpsc->regmap, MDCTL(lpsc->md), MDSTAT_STATE_MASK, in davinci_lpsc_config()
116 if (lpsc->flags & LPSC_FORCE) in davinci_lpsc_config()
117 regmap_write_bits(lpsc->regmap, MDCTL(lpsc->md), MDCTL_FORCE, in davinci_lpsc_config()
120 regmap_read(lpsc->regmap, PDSTAT(lpsc->pd), &pdstat); in davinci_lpsc_config()
122 regmap_write_bits(lpsc->regmap, PDCTL(lpsc->pd), PDCTL_NEXT, in davinci_lpsc_config()
125 regmap_write(lpsc->regmap, PTCMD, BIT(lpsc->pd)); in davinci_lpsc_config()
127 regmap_read_poll_timeout(lpsc->regmap, EPCPR, epcpr, in davinci_lpsc_config()
128 epcpr & BIT(lpsc->pd), 0, 0); in davinci_lpsc_config()
130 regmap_write_bits(lpsc->regmap, PDCTL(lpsc->pd), PDCTL_EPCGOOD, in davinci_lpsc_config()
133 regmap_write(lpsc->regmap, PTCMD, BIT(lpsc->pd)); in davinci_lpsc_config()
136 regmap_read_poll_timeout(lpsc->regmap, PTSTAT, ptstat, in davinci_lpsc_config()
137 !(ptstat & BIT(lpsc->pd)), 0, 0); in davinci_lpsc_config()
139 regmap_read_poll_timeout(lpsc->regmap, MDSTAT(lpsc->md), mdstat, in davinci_lpsc_config()
165 regmap_read(lpsc->regmap, MDSTAT(lpsc->md), &mdstat); in davinci_lpsc_clk_is_enabled()
185 * to get the clock instead of using lpsc->hw.clk directly. in davinci_psc_genpd_attach_dev()
187 clk = clk_get_sys(best_dev_name(lpsc->dev), clk_hw_get_name(&lpsc->hw)); in davinci_psc_genpd_attach_dev()
199 lpsc->genpd_clk = clk; in davinci_psc_genpd_attach_dev()
216 pm_clk_remove_clk(dev, lpsc->genpd_clk); in davinci_psc_genpd_detach_dev()
219 lpsc->genpd_clk = NULL; in davinci_psc_genpd_detach_dev()
223 * davinci_lpsc_clk_register - register LPSC clock
229 * @pd: power domain
235 u32 md, u32 pd, u32 flags) in davinci_lpsc_clk_register() argument
244 return ERR_PTR(-ENOMEM); in davinci_lpsc_clk_register()
258 lpsc->dev = dev; in davinci_lpsc_clk_register()
259 lpsc->regmap = regmap; in davinci_lpsc_clk_register()
260 lpsc->hw.init = &init; in davinci_lpsc_clk_register()
261 lpsc->md = md; in davinci_lpsc_clk_register()
262 lpsc->pd = pd; in davinci_lpsc_clk_register()
263 lpsc->flags = flags; in davinci_lpsc_clk_register()
265 ret = clk_hw_register(dev, &lpsc->hw); in davinci_lpsc_clk_register()
271 /* for now, genpd is only registered when using device-tree */ in davinci_lpsc_clk_register()
272 if (!dev || !dev->of_node) in davinci_lpsc_clk_register()
276 ret = clk_hw_register_clkdev(&lpsc->hw, name, best_dev_name(dev)); in davinci_lpsc_clk_register()
278 lpsc->pm_domain.name = devm_kasprintf(dev, GFP_KERNEL, "%s: %s", in davinci_lpsc_clk_register()
280 lpsc->pm_domain.attach_dev = davinci_psc_genpd_attach_dev; in davinci_lpsc_clk_register()
281 lpsc->pm_domain.detach_dev = davinci_psc_genpd_detach_dev; in davinci_lpsc_clk_register()
282 lpsc->pm_domain.flags = GENPD_FLAG_PM_CLK; in davinci_lpsc_clk_register()
284 is_on = davinci_lpsc_clk_is_enabled(&lpsc->hw); in davinci_lpsc_clk_register()
285 pm_genpd_init(&lpsc->pm_domain, NULL, is_on); in davinci_lpsc_clk_register()
297 return -EINVAL; in davinci_lpsc_clk_reset()
300 regmap_write_bits(lpsc->regmap, MDCTL(lpsc->md), MDCTL_LRESET, mdctl); in davinci_lpsc_clk_reset()
309 struct clk *clk = psc->clk_data.clks[id]; in davinci_psc_reset_assert()
318 struct clk *clk = psc->clk_data.clks[id]; in davinci_psc_reset_deassert()
336 /* the clock node is the same as the reset node */ in davinci_psc_reset_of_xlate()
346 if (!(lpsc->flags & LPSC_LOCAL_RESET)) in davinci_psc_reset_of_xlate()
347 return -EINVAL; in davinci_psc_reset_of_xlate()
349 return lpsc->md; in davinci_psc_reset_of_xlate()
372 return ERR_PTR(-ENOMEM); in __davinci_psc_register_clocks()
376 ret = -ENOMEM; in __davinci_psc_register_clocks()
380 psc->clk_data.clks = clks; in __davinci_psc_register_clocks()
381 psc->clk_data.clk_num = num_clks; in __davinci_psc_register_clocks()
388 clks[i] = ERR_PTR(-ENOENT); in __davinci_psc_register_clocks()
392 ret = -ENOMEM; in __davinci_psc_register_clocks()
396 psc->pm_data.domains = pm_domains; in __davinci_psc_register_clocks()
397 psc->pm_data.num_domains = num_clks; in __davinci_psc_register_clocks()
405 for (; info->name; info++) { in __davinci_psc_register_clocks()
408 lpsc = davinci_lpsc_clk_register(dev, info->name, info->parent, in __davinci_psc_register_clocks()
409 regmap, info->md, info->pd, in __davinci_psc_register_clocks()
410 info->flags); in __davinci_psc_register_clocks()
413 info->name, PTR_ERR(lpsc)); in __davinci_psc_register_clocks()
417 clks[info->md] = lpsc->hw.clk; in __davinci_psc_register_clocks()
418 pm_domains[info->md] = &lpsc->pm_domain; in __davinci_psc_register_clocks()
428 psc->rcdev.ops = &davinci_psc_reset_ops; in __davinci_psc_register_clocks()
429 psc->rcdev.owner = THIS_MODULE; in __davinci_psc_register_clocks()
430 psc->rcdev.dev = dev; in __davinci_psc_register_clocks()
431 psc->rcdev.of_node = dev->of_node; in __davinci_psc_register_clocks()
432 psc->rcdev.of_reset_n_cells = 1; in __davinci_psc_register_clocks()
433 psc->rcdev.of_xlate = davinci_psc_reset_of_xlate; in __davinci_psc_register_clocks()
434 psc->rcdev.nr_resets = num_clks; in __davinci_psc_register_clocks()
436 ret = devm_reset_controller_register(dev, &psc->rcdev); in __davinci_psc_register_clocks()
463 for (; info->name; info++) { in davinci_psc_register_clocks()
464 const struct davinci_lpsc_clkdev_info *cdevs = info->cdevs; in davinci_psc_register_clocks()
465 struct clk *clk = psc->clk_data.clks[info->md]; in davinci_psc_register_clocks()
470 for (; cdevs->con_id || cdevs->dev_id; cdevs++) in davinci_psc_register_clocks()
471 clk_register_clkdev(clk, cdevs->con_id, cdevs->dev_id); in davinci_psc_register_clocks()
482 struct device_node *node = dev->of_node; in of_davinci_psc_clk_init() local
489 of_genpd_add_provider_onecell(node, &psc->pm_data); in of_davinci_psc_clk_init()
491 of_clk_add_provider(node, of_clk_src_onecell_get, &psc->clk_data); in of_davinci_psc_clk_init()
498 { .compatible = "ti,da850-psc0", .data = &of_da850_psc0_init_data },
499 { .compatible = "ti,da850-psc1", .data = &of_da850_psc1_init_data },
506 { .name = "da830-psc0", .driver_data = (kernel_ulong_t)&da830_psc0_init_data },
507 { .name = "da830-psc1", .driver_data = (kernel_ulong_t)&da830_psc1_init_data },
510 { .name = "da850-psc0", .driver_data = (kernel_ulong_t)&da850_psc0_init_data },
511 { .name = "da850-psc1", .driver_data = (kernel_ulong_t)&da850_psc1_init_data },
518 struct device *dev = &pdev->dev; in davinci_psc_probe()
524 if (!init_data && pdev->id_entry) in davinci_psc_probe()
525 init_data = (void *)pdev->id_entry->driver_data; in davinci_psc_probe()
529 return -EINVAL; in davinci_psc_probe()
536 ret = devm_clk_bulk_get(dev, init_data->num_parent_clks, in davinci_psc_probe()
537 init_data->parent_clks); in davinci_psc_probe()
541 return init_data->psc_init(dev, base); in davinci_psc_probe()
547 .name = "davinci-psc-clk",