183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
27810fb95SÁlvaro Fernández Rojas /*
37810fb95SÁlvaro Fernández Rojas * Copyright (C) 2017 Álvaro Fernández Rojas <noltari@gmail.com>
47810fb95SÁlvaro Fernández Rojas */
57810fb95SÁlvaro Fernández Rojas
67810fb95SÁlvaro Fernández Rojas #include <common.h>
77810fb95SÁlvaro Fernández Rojas #include <dm.h>
87810fb95SÁlvaro Fernández Rojas #include <power-domain-uclass.h>
97810fb95SÁlvaro Fernández Rojas #include <asm/io.h>
107810fb95SÁlvaro Fernández Rojas
117810fb95SÁlvaro Fernández Rojas #define MAX_DOMAINS 32
127810fb95SÁlvaro Fernández Rojas
137810fb95SÁlvaro Fernández Rojas struct bcm6328_power_domain {
147810fb95SÁlvaro Fernández Rojas void __iomem *regs;
157810fb95SÁlvaro Fernández Rojas };
167810fb95SÁlvaro Fernández Rojas
bcm6328_power_domain_request(struct power_domain * power_domain)177810fb95SÁlvaro Fernández Rojas static int bcm6328_power_domain_request(struct power_domain *power_domain)
187810fb95SÁlvaro Fernández Rojas {
197810fb95SÁlvaro Fernández Rojas if (power_domain->id >= MAX_DOMAINS)
207810fb95SÁlvaro Fernández Rojas return -EINVAL;
217810fb95SÁlvaro Fernández Rojas
227810fb95SÁlvaro Fernández Rojas return 0;
237810fb95SÁlvaro Fernández Rojas }
247810fb95SÁlvaro Fernández Rojas
bcm6328_power_domain_free(struct power_domain * power_domain)257810fb95SÁlvaro Fernández Rojas static int bcm6328_power_domain_free(struct power_domain *power_domain)
267810fb95SÁlvaro Fernández Rojas {
277810fb95SÁlvaro Fernández Rojas return 0;
287810fb95SÁlvaro Fernández Rojas }
297810fb95SÁlvaro Fernández Rojas
bcm6328_power_domain_on(struct power_domain * power_domain)307810fb95SÁlvaro Fernández Rojas static int bcm6328_power_domain_on(struct power_domain *power_domain)
317810fb95SÁlvaro Fernández Rojas {
327810fb95SÁlvaro Fernández Rojas struct bcm6328_power_domain *priv = dev_get_priv(power_domain->dev);
337810fb95SÁlvaro Fernández Rojas
347810fb95SÁlvaro Fernández Rojas clrbits_be32(priv->regs, BIT(power_domain->id));
357810fb95SÁlvaro Fernández Rojas
367810fb95SÁlvaro Fernández Rojas return 0;
377810fb95SÁlvaro Fernández Rojas }
387810fb95SÁlvaro Fernández Rojas
bcm6328_power_domain_off(struct power_domain * power_domain)397810fb95SÁlvaro Fernández Rojas static int bcm6328_power_domain_off(struct power_domain *power_domain)
407810fb95SÁlvaro Fernández Rojas {
417810fb95SÁlvaro Fernández Rojas struct bcm6328_power_domain *priv = dev_get_priv(power_domain->dev);
427810fb95SÁlvaro Fernández Rojas
437810fb95SÁlvaro Fernández Rojas setbits_be32(priv->regs, BIT(power_domain->id));
447810fb95SÁlvaro Fernández Rojas
457810fb95SÁlvaro Fernández Rojas return 0;
467810fb95SÁlvaro Fernández Rojas }
477810fb95SÁlvaro Fernández Rojas
bcm6328_power_domain_probe(struct udevice * dev)487810fb95SÁlvaro Fernández Rojas static int bcm6328_power_domain_probe(struct udevice *dev)
497810fb95SÁlvaro Fernández Rojas {
507810fb95SÁlvaro Fernández Rojas struct bcm6328_power_domain *priv = dev_get_priv(dev);
517810fb95SÁlvaro Fernández Rojas
52*34c0fc3fSÁlvaro Fernández Rojas priv->regs = dev_remap_addr(dev);
53*34c0fc3fSÁlvaro Fernández Rojas if (!priv->regs)
547810fb95SÁlvaro Fernández Rojas return -EINVAL;
557810fb95SÁlvaro Fernández Rojas
567810fb95SÁlvaro Fernández Rojas return 0;
577810fb95SÁlvaro Fernández Rojas }
587810fb95SÁlvaro Fernández Rojas
597810fb95SÁlvaro Fernández Rojas static const struct udevice_id bcm6328_power_domain_ids[] = {
607810fb95SÁlvaro Fernández Rojas { .compatible = "brcm,bcm6328-power-domain" },
617810fb95SÁlvaro Fernández Rojas { /* sentinel */ }
627810fb95SÁlvaro Fernández Rojas };
637810fb95SÁlvaro Fernández Rojas
647810fb95SÁlvaro Fernández Rojas struct power_domain_ops bcm6328_power_domain_ops = {
657810fb95SÁlvaro Fernández Rojas .free = bcm6328_power_domain_free,
667810fb95SÁlvaro Fernández Rojas .off = bcm6328_power_domain_off,
677810fb95SÁlvaro Fernández Rojas .on = bcm6328_power_domain_on,
687810fb95SÁlvaro Fernández Rojas .request = bcm6328_power_domain_request,
697810fb95SÁlvaro Fernández Rojas };
707810fb95SÁlvaro Fernández Rojas
717810fb95SÁlvaro Fernández Rojas U_BOOT_DRIVER(bcm6328_power_domain) = {
727810fb95SÁlvaro Fernández Rojas .name = "bcm6328_power_domain",
737810fb95SÁlvaro Fernández Rojas .id = UCLASS_POWER_DOMAIN,
747810fb95SÁlvaro Fernández Rojas .of_match = bcm6328_power_domain_ids,
757810fb95SÁlvaro Fernández Rojas .ops = &bcm6328_power_domain_ops,
767810fb95SÁlvaro Fernández Rojas .priv_auto_alloc_size = sizeof(struct bcm6328_power_domain),
777810fb95SÁlvaro Fernández Rojas .probe = bcm6328_power_domain_probe,
787810fb95SÁlvaro Fernández Rojas };
79