xref: /OK3568_Linux_fs/u-boot/drivers/power/domain/sandbox-power-domain.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 2016, NVIDIA CORPORATION.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier: GPL-2.0
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <common.h>
8*4882a593Smuzhiyun #include <dm.h>
9*4882a593Smuzhiyun #include <power-domain-uclass.h>
10*4882a593Smuzhiyun #include <asm/io.h>
11*4882a593Smuzhiyun #include <asm/power-domain.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define SANDBOX_POWER_DOMAINS 3
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun struct sandbox_power_domain {
16*4882a593Smuzhiyun 	bool on[SANDBOX_POWER_DOMAINS];
17*4882a593Smuzhiyun };
18*4882a593Smuzhiyun 
sandbox_power_domain_request(struct power_domain * power_domain)19*4882a593Smuzhiyun static int sandbox_power_domain_request(struct power_domain *power_domain)
20*4882a593Smuzhiyun {
21*4882a593Smuzhiyun 	debug("%s(power_domain=%p)\n", __func__, power_domain);
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun 	if (power_domain->id >= SANDBOX_POWER_DOMAINS)
24*4882a593Smuzhiyun 		return -EINVAL;
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun 	return 0;
27*4882a593Smuzhiyun }
28*4882a593Smuzhiyun 
sandbox_power_domain_free(struct power_domain * power_domain)29*4882a593Smuzhiyun static int sandbox_power_domain_free(struct power_domain *power_domain)
30*4882a593Smuzhiyun {
31*4882a593Smuzhiyun 	debug("%s(power_domain=%p)\n", __func__, power_domain);
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun 	return 0;
34*4882a593Smuzhiyun }
35*4882a593Smuzhiyun 
sandbox_power_domain_on(struct power_domain * power_domain)36*4882a593Smuzhiyun static int sandbox_power_domain_on(struct power_domain *power_domain)
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun 	struct sandbox_power_domain *sbr = dev_get_priv(power_domain->dev);
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun 	debug("%s(power_domain=%p)\n", __func__, power_domain);
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun 	sbr->on[power_domain->id] = true;
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 	return 0;
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun 
sandbox_power_domain_off(struct power_domain * power_domain)47*4882a593Smuzhiyun static int sandbox_power_domain_off(struct power_domain *power_domain)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun 	struct sandbox_power_domain *sbr = dev_get_priv(power_domain->dev);
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun 	debug("%s(power_domain=%p)\n", __func__, power_domain);
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 	sbr->on[power_domain->id] = false;
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 	return 0;
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun 
sandbox_power_domain_bind(struct udevice * dev)58*4882a593Smuzhiyun static int sandbox_power_domain_bind(struct udevice *dev)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun 	debug("%s(dev=%p)\n", __func__, dev);
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	return 0;
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun 
sandbox_power_domain_probe(struct udevice * dev)65*4882a593Smuzhiyun static int sandbox_power_domain_probe(struct udevice *dev)
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun 	debug("%s(dev=%p)\n", __func__, dev);
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	return 0;
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun static const struct udevice_id sandbox_power_domain_ids[] = {
73*4882a593Smuzhiyun 	{ .compatible = "sandbox,power-domain" },
74*4882a593Smuzhiyun 	{ }
75*4882a593Smuzhiyun };
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun struct power_domain_ops sandbox_power_domain_ops = {
78*4882a593Smuzhiyun 	.request = sandbox_power_domain_request,
79*4882a593Smuzhiyun 	.free = sandbox_power_domain_free,
80*4882a593Smuzhiyun 	.on = sandbox_power_domain_on,
81*4882a593Smuzhiyun 	.off = sandbox_power_domain_off,
82*4882a593Smuzhiyun };
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun U_BOOT_DRIVER(sandbox_power_domain) = {
85*4882a593Smuzhiyun 	.name = "sandbox_power_domain",
86*4882a593Smuzhiyun 	.id = UCLASS_POWER_DOMAIN,
87*4882a593Smuzhiyun 	.of_match = sandbox_power_domain_ids,
88*4882a593Smuzhiyun 	.bind = sandbox_power_domain_bind,
89*4882a593Smuzhiyun 	.probe = sandbox_power_domain_probe,
90*4882a593Smuzhiyun 	.priv_auto_alloc_size = sizeof(struct sandbox_power_domain),
91*4882a593Smuzhiyun 	.ops = &sandbox_power_domain_ops,
92*4882a593Smuzhiyun };
93*4882a593Smuzhiyun 
sandbox_power_domain_query(struct udevice * dev,unsigned long id)94*4882a593Smuzhiyun int sandbox_power_domain_query(struct udevice *dev, unsigned long id)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun 	struct sandbox_power_domain *sbr = dev_get_priv(dev);
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	debug("%s(dev=%p, id=%ld)\n", __func__, dev, id);
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	if (id >= SANDBOX_POWER_DOMAINS)
101*4882a593Smuzhiyun 		return -EINVAL;
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun 	return sbr->on[id];
104*4882a593Smuzhiyun }
105