Lines Matching +full:power +full:- +full:domain +full:-
1 // SPDX-License-Identifier: GPL-2.0
13 #include <dt-bindings/power/raspberrypi-power.h>
14 #include <soc/bcm2835/raspberrypi-firmware.h>
17 * Firmware indices for the old power domains interface. Only a few
24 u32 domain; member
43 u32 domain; member
48 * Asks the firmware to enable or disable power on a specific power
49 * domain.
55 packet.domain = rpi_domain->domain; in rpi_firmware_set_power()
57 return rpi_firmware_property(rpi_domain->fw, in rpi_firmware_set_power()
58 rpi_domain->old_interface ? in rpi_firmware_set_power()
64 static int rpi_domain_off(struct generic_pm_domain *domain) in rpi_domain_off() argument
67 container_of(domain, struct rpi_power_domain, base); in rpi_domain_off()
72 static int rpi_domain_on(struct generic_pm_domain *domain) in rpi_domain_on() argument
75 container_of(domain, struct rpi_power_domain, base); in rpi_domain_on()
83 struct rpi_power_domain *dom = &rpi_domains->domains[xlate_index]; in rpi_common_init_power_domain()
85 dom->fw = rpi_domains->fw; in rpi_common_init_power_domain()
87 dom->base.name = name; in rpi_common_init_power_domain()
88 dom->base.power_on = rpi_domain_on; in rpi_common_init_power_domain()
89 dom->base.power_off = rpi_domain_off; in rpi_common_init_power_domain()
92 * Treat all power domains as off at boot. in rpi_common_init_power_domain()
99 pm_genpd_init(&dom->base, NULL, true); in rpi_common_init_power_domain()
101 rpi_domains->xlate.domains[xlate_index] = &dom->base; in rpi_common_init_power_domain()
107 struct rpi_power_domain *dom = &rpi_domains->domains[xlate_index]; in rpi_init_power_domain()
109 if (!rpi_domains->has_new_interface) in rpi_init_power_domain()
112 /* The DT binding index is the firmware's domain index minus one. */ in rpi_init_power_domain()
113 dom->domain = xlate_index + 1; in rpi_init_power_domain()
119 int xlate_index, int domain, in rpi_init_old_power_domain() argument
122 struct rpi_power_domain *dom = &rpi_domains->domains[xlate_index]; in rpi_init_old_power_domain()
124 dom->old_interface = true; in rpi_init_old_power_domain()
125 dom->domain = domain; in rpi_init_old_power_domain()
131 * Detects whether the firmware supports the new power domains interface.
144 packet.domain = RPI_POWER_DOMAIN_ARM; in rpi_has_new_domain_support()
147 ret = rpi_firmware_property(rpi_domains->fw, in rpi_has_new_domain_support()
157 struct device *dev = &pdev->dev; in rpi_power_probe()
162 return -ENOMEM; in rpi_power_probe()
164 rpi_domains->xlate.domains = in rpi_power_probe()
167 sizeof(*rpi_domains->xlate.domains), in rpi_power_probe()
169 if (!rpi_domains->xlate.domains) in rpi_power_probe()
170 return -ENOMEM; in rpi_power_probe()
172 rpi_domains->xlate.num_domains = RPI_POWER_DOMAIN_COUNT; in rpi_power_probe()
174 fw_np = of_parse_phandle(pdev->dev.of_node, "firmware", 0); in rpi_power_probe()
176 dev_err(&pdev->dev, "no firmware node\n"); in rpi_power_probe()
177 return -ENODEV; in rpi_power_probe()
180 rpi_domains->fw = rpi_firmware_get(fw_np); in rpi_power_probe()
182 if (!rpi_domains->fw) in rpi_power_probe()
183 return -EPROBE_DEFER; in rpi_power_probe()
185 rpi_domains->has_new_interface = in rpi_power_probe()
197 * Use the old firmware interface for USB power, so that we in rpi_power_probe()
221 of_genpd_add_provider_onecell(dev->of_node, &rpi_domains->xlate); in rpi_power_probe()
229 { .compatible = "raspberrypi,bcm2835-power", },
236 .name = "raspberrypi-power",
245 MODULE_DESCRIPTION("Raspberry Pi power domain driver");