Lines Matching +full:dra7 +full:- +full:vpe
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
6 * Tero Kristo <t-kristo@ti.com>
19 #include <linux/reset-controller.h>
22 #include <linux/platform_data/ti-prm.h>
33 unsigned long statechange:1; /* Optional low-power state change */
139 { .rst = -1 },
145 { .rst = -1 },
152 { .rst = -1 },
386 .name = "vpe", .base = 0x4ae07c80,
394 { .rst = -1 },
399 { .rst = -1 },
442 { .rst = -1 },
448 { .rst = -1 },
494 { .compatible = "ti,omap4-prm-inst", .data = omap4_prm_data },
495 { .compatible = "ti,omap5-prm-inst", .data = omap5_prm_data },
496 { .compatible = "ti,dra7-prm-inst", .data = dra7_prm_data },
497 { .compatible = "ti,am3-prm-inst", .data = am3_prm_data },
498 { .compatible = "ti,am4-prm-inst", .data = am4_prm_data },
506 dev_dbg(prmd->dev, "%s %s: %08x/%08x\n", in omap_prm_domain_show_state()
507 prmd->pd.name, desc, in omap_prm_domain_show_state()
508 readl_relaxed(prmd->prm->base + prmd->pwrstctrl), in omap_prm_domain_show_state()
509 readl_relaxed(prmd->prm->base + prmd->pwrstst)); in omap_prm_domain_show_state()
525 if (!prmd->cap) in omap_prm_domain_power_on()
530 if (prmd->pwrstctrl_saved) in omap_prm_domain_power_on()
531 v = prmd->pwrstctrl_saved; in omap_prm_domain_power_on()
533 v = readl_relaxed(prmd->prm->base + prmd->pwrstctrl); in omap_prm_domain_power_on()
535 if (prmd->prm->data->flags & OMAP_PRM_RET_WHEN_IDLE) in omap_prm_domain_power_on()
541 prmd->prm->base + prmd->pwrstctrl); in omap_prm_domain_power_on()
544 ret = readl_relaxed_poll_timeout(prmd->prm->base + prmd->pwrstst, in omap_prm_domain_power_on()
548 dev_err(prmd->dev, "%s: %s timed out\n", in omap_prm_domain_power_on()
549 prmd->pd.name, __func__); in omap_prm_domain_power_on()
559 return __ffs(prmd->cap->usable_modes); in omap_prm_domain_find_lowest()
569 if (!prmd->cap) in omap_prm_domain_power_off()
574 v = readl_relaxed(prmd->prm->base + prmd->pwrstctrl); in omap_prm_domain_power_off()
575 prmd->pwrstctrl_saved = v; in omap_prm_domain_power_off()
580 if (prmd->cap->statechange) in omap_prm_domain_power_off()
582 if (prmd->cap->logicretstate) in omap_prm_domain_power_off()
587 writel_relaxed(v, prmd->prm->base + prmd->pwrstctrl); in omap_prm_domain_power_off()
590 ret = readl_relaxed_poll_timeout(prmd->prm->base + prmd->pwrstst, in omap_prm_domain_power_off()
594 dev_warn(prmd->dev, "%s: %s timed out\n", in omap_prm_domain_power_off()
595 __func__, prmd->pd.name); in omap_prm_domain_power_off()
603 * Note that ti-sysc already manages the module clocks separately so
605 * for simple-pm-bus.
610 struct device_node *np = dev->of_node; in omap_prm_domain_attach_clock()
613 if (!of_device_is_compatible(np, "simple-pm-bus")) in omap_prm_domain_attach_clock()
629 prmd->uses_pm_clk = 1; in omap_prm_domain_attach_clock()
644 np = dev->of_node; in omap_prm_domain_attach_dev()
646 ret = of_parse_phandle_with_args(np, "power-domains", in omap_prm_domain_attach_dev()
647 "#power-domain-cells", 0, &pd_args); in omap_prm_domain_attach_dev()
652 dev_warn(dev, "%s: unusupported #power-domain-cells: %i\n", in omap_prm_domain_attach_dev()
653 prmd->pd.name, pd_args.args_count); in omap_prm_domain_attach_dev()
656 genpd_data->data = NULL; in omap_prm_domain_attach_dev()
672 if (prmd->uses_pm_clk) in omap_prm_domain_detach_dev()
675 genpd_data->data = NULL; in omap_prm_domain_detach_dev()
681 struct device_node *np = dev->of_node; in omap_prm_domain_init()
686 if (!of_property_present(dev->of_node, "#power-domain-cells")) in omap_prm_domain_init()
689 of_node_put(dev->of_node); in omap_prm_domain_init()
693 return -ENOMEM; in omap_prm_domain_init()
695 data = prm->data; in omap_prm_domain_init()
697 data->name); in omap_prm_domain_init()
699 prmd->dev = dev; in omap_prm_domain_init()
700 prmd->prm = prm; in omap_prm_domain_init()
701 prmd->cap = prmd->prm->data->dmap; in omap_prm_domain_init()
702 prmd->pwrstctrl = prmd->prm->data->pwrstctrl; in omap_prm_domain_init()
703 prmd->pwrstst = prmd->prm->data->pwrstst; in omap_prm_domain_init()
705 prmd->pd.name = name; in omap_prm_domain_init()
706 prmd->pd.power_on = omap_prm_domain_power_on; in omap_prm_domain_init()
707 prmd->pd.power_off = omap_prm_domain_power_off; in omap_prm_domain_init()
708 prmd->pd.attach_dev = omap_prm_domain_attach_dev; in omap_prm_domain_init()
709 prmd->pd.detach_dev = omap_prm_domain_detach_dev; in omap_prm_domain_init()
710 prmd->pd.flags = GENPD_FLAG_PM_CLK; in omap_prm_domain_init()
712 pm_genpd_init(&prmd->pd, NULL, true); in omap_prm_domain_init()
713 error = of_genpd_add_provider_simple(np, &prmd->pd); in omap_prm_domain_init()
715 pm_genpd_remove(&prmd->pd); in omap_prm_domain_init()
717 prm->prmd = prmd; in omap_prm_domain_init()
724 if (reset->mask & BIT(id)) in _is_valid_reset()
733 const struct omap_rst_map *map = reset->prm->data->rstmap; in omap_reset_get_st_bit()
735 while (map->rst >= 0) { in omap_reset_get_st_bit()
736 if (map->rst == id) in omap_reset_get_st_bit()
737 return map->st; in omap_reset_get_st_bit()
751 bool has_rstst = reset->prm->data->rstst || in omap_reset_status()
752 (reset->prm->data->flags & OMAP_PRM_HAS_RSTST); in omap_reset_status()
756 return -ENOTSUPP; in omap_reset_status()
759 v = readl_relaxed(reset->prm->base + reset->prm->data->rstctrl); in omap_reset_status()
767 v = readl_relaxed(reset->prm->base + reset->prm->data->rstst); in omap_reset_status()
782 spin_lock_irqsave(&reset->lock, flags); in omap_reset_assert()
783 v = readl_relaxed(reset->prm->base + reset->prm->data->rstctrl); in omap_reset_assert()
785 writel_relaxed(v, reset->prm->base + reset->prm->data->rstctrl); in omap_reset_assert()
786 spin_unlock_irqrestore(&reset->lock, flags); in omap_reset_assert()
799 struct ti_prm_platform_data *pdata = dev_get_platdata(reset->dev); in omap_reset_deassert()
806 has_rstst = reset->prm->data->rstst || in omap_reset_deassert()
807 (reset->prm->data->flags & OMAP_PRM_HAS_RSTST); in omap_reset_deassert()
814 writel_relaxed(v, reset->prm->base + reset->prm->data->rstst); in omap_reset_deassert()
817 if (reset->clkdm) in omap_reset_deassert()
818 pdata->clkdm_deny_idle(reset->clkdm); in omap_reset_deassert()
820 /* de-assert the reset control line */ in omap_reset_deassert()
821 spin_lock_irqsave(&reset->lock, flags); in omap_reset_deassert()
822 v = readl_relaxed(reset->prm->base + reset->prm->data->rstctrl); in omap_reset_deassert()
824 writel_relaxed(v, reset->prm->base + reset->prm->data->rstctrl); in omap_reset_deassert()
825 spin_unlock_irqrestore(&reset->lock, flags); in omap_reset_deassert()
828 ret = readl_relaxed_poll_timeout_atomic(reset->prm->base + in omap_reset_deassert()
829 reset->prm->data->rstctrl, in omap_reset_deassert()
834 reset->prm->data->name, id); in omap_reset_deassert()
838 ret = readl_relaxed_poll_timeout_atomic(reset->prm->base + in omap_reset_deassert()
839 reset->prm->data->rstst, in omap_reset_deassert()
844 reset->prm->data->name, id); in omap_reset_deassert()
847 if (reset->clkdm) in omap_reset_deassert()
848 pdata->clkdm_allow_idle(reset->clkdm); in omap_reset_deassert()
864 if (!_is_valid_reset(reset, reset_spec->args[0])) in omap_prm_reset_xlate()
865 return -EINVAL; in omap_prm_reset_xlate()
867 return reset_spec->args[0]; in omap_prm_reset_xlate()
875 struct ti_prm_platform_data *pdata = dev_get_platdata(&pdev->dev); in omap_prm_reset_init()
880 * Check if we have controllable resets. If either rstctrl is non-zero in omap_prm_reset_init()
884 if (!prm->data->rstctrl && !(prm->data->flags & OMAP_PRM_HAS_RSTCTRL)) in omap_prm_reset_init()
888 if (!pdata || !pdata->clkdm_lookup || !pdata->clkdm_deny_idle || in omap_prm_reset_init()
889 !pdata->clkdm_allow_idle) in omap_prm_reset_init()
890 return -EINVAL; in omap_prm_reset_init()
892 map = prm->data->rstmap; in omap_prm_reset_init()
894 return -EINVAL; in omap_prm_reset_init()
896 reset = devm_kzalloc(&pdev->dev, sizeof(*reset), GFP_KERNEL); in omap_prm_reset_init()
898 return -ENOMEM; in omap_prm_reset_init()
900 reset->rcdev.owner = THIS_MODULE; in omap_prm_reset_init()
901 reset->rcdev.ops = &omap_reset_ops; in omap_prm_reset_init()
902 reset->rcdev.of_node = pdev->dev.of_node; in omap_prm_reset_init()
903 reset->rcdev.nr_resets = OMAP_MAX_RESETS; in omap_prm_reset_init()
904 reset->rcdev.of_xlate = omap_prm_reset_xlate; in omap_prm_reset_init()
905 reset->rcdev.of_reset_n_cells = 1; in omap_prm_reset_init()
906 reset->dev = &pdev->dev; in omap_prm_reset_init()
907 spin_lock_init(&reset->lock); in omap_prm_reset_init()
909 reset->prm = prm; in omap_prm_reset_init()
911 sprintf(buf, "%s_clkdm", prm->data->clkdm_name ? prm->data->clkdm_name : in omap_prm_reset_init()
912 prm->data->name); in omap_prm_reset_init()
914 if (!(prm->data->flags & OMAP_PRM_HAS_NO_CLKDM)) { in omap_prm_reset_init()
915 reset->clkdm = pdata->clkdm_lookup(buf); in omap_prm_reset_init()
916 if (!reset->clkdm) in omap_prm_reset_init()
917 return -EINVAL; in omap_prm_reset_init()
920 while (map->rst >= 0) { in omap_prm_reset_init()
921 reset->mask |= BIT(map->rst); in omap_prm_reset_init()
926 if (prm->data->rstmap == rst_map_012) { in omap_prm_reset_init()
927 v = readl_relaxed(reset->prm->base + reset->prm->data->rstctrl); in omap_prm_reset_init()
928 if ((v & reset->mask) != reset->mask) { in omap_prm_reset_init()
929 dev_dbg(&pdev->dev, "Asserting all resets: %08x\n", v); in omap_prm_reset_init()
930 writel_relaxed(reset->mask, reset->prm->base + in omap_prm_reset_init()
931 reset->prm->data->rstctrl); in omap_prm_reset_init()
935 return devm_reset_controller_register(&pdev->dev, &reset->rcdev); in omap_prm_reset_init()
945 data = of_device_get_match_data(&pdev->dev); in omap_prm_probe()
947 return -ENOTSUPP; in omap_prm_probe()
949 prm = devm_kzalloc(&pdev->dev, sizeof(*prm), GFP_KERNEL); in omap_prm_probe()
951 return -ENOMEM; in omap_prm_probe()
953 prm->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in omap_prm_probe()
954 if (IS_ERR(prm->base)) in omap_prm_probe()
955 return PTR_ERR(prm->base); in omap_prm_probe()
957 while (data->base != res->start) { in omap_prm_probe()
958 if (!data->base) in omap_prm_probe()
959 return -EINVAL; in omap_prm_probe()
963 prm->data = data; in omap_prm_probe()
965 ret = omap_prm_domain_init(&pdev->dev, prm); in omap_prm_probe()
976 of_genpd_del_provider(pdev->dev.of_node); in omap_prm_probe()
977 pm_genpd_remove(&prm->prmd->pd); in omap_prm_probe()