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