161f5ddcbSStephen Warren /*
261f5ddcbSStephen Warren * Copyright (c) 2016, NVIDIA CORPORATION.
361f5ddcbSStephen Warren *
461f5ddcbSStephen Warren * SPDX-License-Identifier: GPL-2.0
561f5ddcbSStephen Warren */
661f5ddcbSStephen Warren
761f5ddcbSStephen Warren #include <common.h>
861f5ddcbSStephen Warren #include <dm.h>
961f5ddcbSStephen Warren #include <power-domain-uclass.h>
1061f5ddcbSStephen Warren #include <asm/io.h>
1161f5ddcbSStephen Warren #include <asm/power-domain.h>
1261f5ddcbSStephen Warren
1361f5ddcbSStephen Warren #define SANDBOX_POWER_DOMAINS 3
1461f5ddcbSStephen Warren
1561f5ddcbSStephen Warren struct sandbox_power_domain {
1661f5ddcbSStephen Warren bool on[SANDBOX_POWER_DOMAINS];
1761f5ddcbSStephen Warren };
1861f5ddcbSStephen Warren
sandbox_power_domain_request(struct power_domain * power_domain)1961f5ddcbSStephen Warren static int sandbox_power_domain_request(struct power_domain *power_domain)
2061f5ddcbSStephen Warren {
2161f5ddcbSStephen Warren debug("%s(power_domain=%p)\n", __func__, power_domain);
2261f5ddcbSStephen Warren
2361f5ddcbSStephen Warren if (power_domain->id >= SANDBOX_POWER_DOMAINS)
2461f5ddcbSStephen Warren return -EINVAL;
2561f5ddcbSStephen Warren
2661f5ddcbSStephen Warren return 0;
2761f5ddcbSStephen Warren }
2861f5ddcbSStephen Warren
sandbox_power_domain_free(struct power_domain * power_domain)2961f5ddcbSStephen Warren static int sandbox_power_domain_free(struct power_domain *power_domain)
3061f5ddcbSStephen Warren {
3161f5ddcbSStephen Warren debug("%s(power_domain=%p)\n", __func__, power_domain);
3261f5ddcbSStephen Warren
3361f5ddcbSStephen Warren return 0;
3461f5ddcbSStephen Warren }
3561f5ddcbSStephen Warren
sandbox_power_domain_on(struct power_domain * power_domain)3661f5ddcbSStephen Warren static int sandbox_power_domain_on(struct power_domain *power_domain)
3761f5ddcbSStephen Warren {
3861f5ddcbSStephen Warren struct sandbox_power_domain *sbr = dev_get_priv(power_domain->dev);
3961f5ddcbSStephen Warren
4061f5ddcbSStephen Warren debug("%s(power_domain=%p)\n", __func__, power_domain);
4161f5ddcbSStephen Warren
4261f5ddcbSStephen Warren sbr->on[power_domain->id] = true;
4361f5ddcbSStephen Warren
4461f5ddcbSStephen Warren return 0;
4561f5ddcbSStephen Warren }
4661f5ddcbSStephen Warren
sandbox_power_domain_off(struct power_domain * power_domain)4761f5ddcbSStephen Warren static int sandbox_power_domain_off(struct power_domain *power_domain)
4861f5ddcbSStephen Warren {
4961f5ddcbSStephen Warren struct sandbox_power_domain *sbr = dev_get_priv(power_domain->dev);
5061f5ddcbSStephen Warren
5161f5ddcbSStephen Warren debug("%s(power_domain=%p)\n", __func__, power_domain);
5261f5ddcbSStephen Warren
5361f5ddcbSStephen Warren sbr->on[power_domain->id] = false;
5461f5ddcbSStephen Warren
5561f5ddcbSStephen Warren return 0;
5661f5ddcbSStephen Warren }
5761f5ddcbSStephen Warren
sandbox_power_domain_bind(struct udevice * dev)5861f5ddcbSStephen Warren static int sandbox_power_domain_bind(struct udevice *dev)
5961f5ddcbSStephen Warren {
6061f5ddcbSStephen Warren debug("%s(dev=%p)\n", __func__, dev);
6161f5ddcbSStephen Warren
6261f5ddcbSStephen Warren return 0;
6361f5ddcbSStephen Warren }
6461f5ddcbSStephen Warren
sandbox_power_domain_probe(struct udevice * dev)6561f5ddcbSStephen Warren static int sandbox_power_domain_probe(struct udevice *dev)
6661f5ddcbSStephen Warren {
6761f5ddcbSStephen Warren debug("%s(dev=%p)\n", __func__, dev);
6861f5ddcbSStephen Warren
6961f5ddcbSStephen Warren return 0;
7061f5ddcbSStephen Warren }
7161f5ddcbSStephen Warren
7261f5ddcbSStephen Warren static const struct udevice_id sandbox_power_domain_ids[] = {
7361f5ddcbSStephen Warren { .compatible = "sandbox,power-domain" },
7461f5ddcbSStephen Warren { }
7561f5ddcbSStephen Warren };
7661f5ddcbSStephen Warren
7761f5ddcbSStephen Warren struct power_domain_ops sandbox_power_domain_ops = {
7861f5ddcbSStephen Warren .request = sandbox_power_domain_request,
79*72239ba9SSimon Glass .rfree = sandbox_power_domain_free,
8061f5ddcbSStephen Warren .on = sandbox_power_domain_on,
8161f5ddcbSStephen Warren .off = sandbox_power_domain_off,
8261f5ddcbSStephen Warren };
8361f5ddcbSStephen Warren
8461f5ddcbSStephen Warren U_BOOT_DRIVER(sandbox_power_domain) = {
8561f5ddcbSStephen Warren .name = "sandbox_power_domain",
8661f5ddcbSStephen Warren .id = UCLASS_POWER_DOMAIN,
8761f5ddcbSStephen Warren .of_match = sandbox_power_domain_ids,
8861f5ddcbSStephen Warren .bind = sandbox_power_domain_bind,
8961f5ddcbSStephen Warren .probe = sandbox_power_domain_probe,
9061f5ddcbSStephen Warren .priv_auto_alloc_size = sizeof(struct sandbox_power_domain),
9161f5ddcbSStephen Warren .ops = &sandbox_power_domain_ops,
9261f5ddcbSStephen Warren };
9361f5ddcbSStephen Warren
sandbox_power_domain_query(struct udevice * dev,unsigned long id)9461f5ddcbSStephen Warren int sandbox_power_domain_query(struct udevice *dev, unsigned long id)
9561f5ddcbSStephen Warren {
9661f5ddcbSStephen Warren struct sandbox_power_domain *sbr = dev_get_priv(dev);
9761f5ddcbSStephen Warren
9861f5ddcbSStephen Warren debug("%s(dev=%p, id=%ld)\n", __func__, dev, id);
9961f5ddcbSStephen Warren
10061f5ddcbSStephen Warren if (id >= SANDBOX_POWER_DOMAINS)
10161f5ddcbSStephen Warren return -EINVAL;
10261f5ddcbSStephen Warren
10361f5ddcbSStephen Warren return sbr->on[id];
10461f5ddcbSStephen Warren }
105