Lines Matching +full:semi +full:- +full:static
1 // SPDX-License-Identifier: GPL-2.0+
3 * Actions Semi Owl Smart Power System (SPS)
5 * Copyright 2012 Actions Semi Inc.
6 * Author: Actions Semi, Inc.
14 #include <linux/soc/actions/owl-sps.h>
15 #include <dt-bindings/power/owl-s500-powergate.h>
16 #include <dt-bindings/power/owl-s700-powergate.h>
17 #include <dt-bindings/power/owl-s900-powergate.h>
47 static int owl_sps_set_power(struct owl_sps_domain *pd, bool enable) in owl_sps_set_power()
51 ack_mask = BIT(pd->info->ack_bit); in owl_sps_set_power()
52 pwr_mask = BIT(pd->info->pwr_bit); in owl_sps_set_power()
54 return owl_sps_set_pg(pd->sps->base, pwr_mask, ack_mask, enable); in owl_sps_set_power()
57 static int owl_sps_power_on(struct generic_pm_domain *domain) in owl_sps_power_on()
61 dev_dbg(pd->sps->dev, "%s power on", pd->info->name); in owl_sps_power_on()
66 static int owl_sps_power_off(struct generic_pm_domain *domain) in owl_sps_power_off()
70 dev_dbg(pd->sps->dev, "%s power off", pd->info->name); in owl_sps_power_off()
75 static int owl_sps_init_domain(struct owl_sps *sps, int index) in owl_sps_init_domain()
79 pd = devm_kzalloc(sps->dev, sizeof(*pd), GFP_KERNEL); in owl_sps_init_domain()
81 return -ENOMEM; in owl_sps_init_domain()
83 pd->info = &sps->info->domains[index]; in owl_sps_init_domain()
84 pd->sps = sps; in owl_sps_init_domain()
86 pd->genpd.name = pd->info->name; in owl_sps_init_domain()
87 pd->genpd.power_on = owl_sps_power_on; in owl_sps_init_domain()
88 pd->genpd.power_off = owl_sps_power_off; in owl_sps_init_domain()
89 pd->genpd.flags = pd->info->genpd_flags; in owl_sps_init_domain()
90 pm_genpd_init(&pd->genpd, NULL, false); in owl_sps_init_domain()
92 sps->genpd_data.domains[index] = &pd->genpd; in owl_sps_init_domain()
97 static int owl_sps_probe(struct platform_device *pdev) in owl_sps_probe()
104 if (!pdev->dev.of_node) { in owl_sps_probe()
105 dev_err(&pdev->dev, "no device node\n"); in owl_sps_probe()
106 return -ENODEV; in owl_sps_probe()
109 match = of_match_device(pdev->dev.driver->of_match_table, &pdev->dev); in owl_sps_probe()
110 if (!match || !match->data) { in owl_sps_probe()
111 dev_err(&pdev->dev, "unknown compatible or missing data\n"); in owl_sps_probe()
112 return -EINVAL; in owl_sps_probe()
115 sps_info = match->data; in owl_sps_probe()
117 sps = devm_kzalloc(&pdev->dev, in owl_sps_probe()
118 struct_size(sps, domains, sps_info->num_domains), in owl_sps_probe()
121 return -ENOMEM; in owl_sps_probe()
123 sps->base = of_io_request_and_map(pdev->dev.of_node, 0, "owl-sps"); in owl_sps_probe()
124 if (IS_ERR(sps->base)) { in owl_sps_probe()
125 dev_err(&pdev->dev, "failed to map sps registers\n"); in owl_sps_probe()
126 return PTR_ERR(sps->base); in owl_sps_probe()
129 sps->dev = &pdev->dev; in owl_sps_probe()
130 sps->info = sps_info; in owl_sps_probe()
131 sps->genpd_data.domains = sps->domains; in owl_sps_probe()
132 sps->genpd_data.num_domains = sps_info->num_domains; in owl_sps_probe()
134 for (i = 0; i < sps_info->num_domains; i++) { in owl_sps_probe()
140 ret = of_genpd_add_provider_onecell(pdev->dev.of_node, &sps->genpd_data); in owl_sps_probe()
142 dev_err(&pdev->dev, "failed to add provider (%d)", ret); in owl_sps_probe()
149 static const struct owl_sps_domain_info s500_sps_domains[] = {
199 static const struct owl_sps_info s500_sps_info = {
204 static const struct owl_sps_domain_info s700_sps_domains[] = {
239 static const struct owl_sps_info s700_sps_info = {
244 static const struct owl_sps_domain_info s900_sps_domains[] = {
295 static const struct owl_sps_info s900_sps_info = {
300 static const struct of_device_id owl_sps_of_matches[] = {
301 { .compatible = "actions,s500-sps", .data = &s500_sps_info },
302 { .compatible = "actions,s700-sps", .data = &s700_sps_info },
303 { .compatible = "actions,s900-sps", .data = &s900_sps_info },
307 static struct platform_driver owl_sps_platform_driver = {
310 .name = "owl-sps",
316 static int __init owl_sps_init(void) in owl_sps_init()