xref: /rk3399_rockchip-uboot/drivers/power/domain/bcm6328-power-domain.c (revision 2ec64758d97f631fc34f60d6a42415fc1bb1b943)
17810fb95SÁlvaro Fernández Rojas /*
27810fb95SÁlvaro Fernández Rojas  * Copyright (C) 2017 Álvaro Fernández Rojas <noltari@gmail.com>
37810fb95SÁlvaro Fernández Rojas  *
47810fb95SÁlvaro Fernández Rojas  * SPDX-License-Identifier: GPL-2.0+
57810fb95SÁlvaro Fernández Rojas  */
67810fb95SÁlvaro Fernández Rojas 
77810fb95SÁlvaro Fernández Rojas #include <common.h>
87810fb95SÁlvaro Fernández Rojas #include <dm.h>
97810fb95SÁlvaro Fernández Rojas #include <power-domain-uclass.h>
107810fb95SÁlvaro Fernández Rojas #include <asm/io.h>
117810fb95SÁlvaro Fernández Rojas 
127810fb95SÁlvaro Fernández Rojas #define MAX_DOMAINS	32
137810fb95SÁlvaro Fernández Rojas 
147810fb95SÁlvaro Fernández Rojas struct bcm6328_power_domain {
157810fb95SÁlvaro Fernández Rojas 	void __iomem *regs;
167810fb95SÁlvaro Fernández Rojas };
177810fb95SÁlvaro Fernández Rojas 
bcm6328_power_domain_request(struct power_domain * power_domain)187810fb95SÁlvaro Fernández Rojas static int bcm6328_power_domain_request(struct power_domain *power_domain)
197810fb95SÁlvaro Fernández Rojas {
207810fb95SÁlvaro Fernández Rojas 	if (power_domain->id >= MAX_DOMAINS)
217810fb95SÁlvaro Fernández Rojas 		return -EINVAL;
227810fb95SÁlvaro Fernández Rojas 
237810fb95SÁlvaro Fernández Rojas 	return 0;
247810fb95SÁlvaro Fernández Rojas }
257810fb95SÁlvaro Fernández Rojas 
bcm6328_power_domain_on(struct power_domain * power_domain)267810fb95SÁlvaro Fernández Rojas static int bcm6328_power_domain_on(struct power_domain *power_domain)
277810fb95SÁlvaro Fernández Rojas {
287810fb95SÁlvaro Fernández Rojas 	struct bcm6328_power_domain *priv = dev_get_priv(power_domain->dev);
297810fb95SÁlvaro Fernández Rojas 
307810fb95SÁlvaro Fernández Rojas 	clrbits_be32(priv->regs, BIT(power_domain->id));
317810fb95SÁlvaro Fernández Rojas 
327810fb95SÁlvaro Fernández Rojas 	return 0;
337810fb95SÁlvaro Fernández Rojas }
347810fb95SÁlvaro Fernández Rojas 
bcm6328_power_domain_off(struct power_domain * power_domain)357810fb95SÁlvaro Fernández Rojas static int bcm6328_power_domain_off(struct power_domain *power_domain)
367810fb95SÁlvaro Fernández Rojas {
377810fb95SÁlvaro Fernández Rojas 	struct bcm6328_power_domain *priv = dev_get_priv(power_domain->dev);
387810fb95SÁlvaro Fernández Rojas 
397810fb95SÁlvaro Fernández Rojas 	setbits_be32(priv->regs, BIT(power_domain->id));
407810fb95SÁlvaro Fernández Rojas 
417810fb95SÁlvaro Fernández Rojas 	return 0;
427810fb95SÁlvaro Fernández Rojas }
437810fb95SÁlvaro Fernández Rojas 
bcm6328_power_domain_probe(struct udevice * dev)447810fb95SÁlvaro Fernández Rojas static int bcm6328_power_domain_probe(struct udevice *dev)
457810fb95SÁlvaro Fernández Rojas {
467810fb95SÁlvaro Fernández Rojas 	struct bcm6328_power_domain *priv = dev_get_priv(dev);
477810fb95SÁlvaro Fernández Rojas 	fdt_addr_t addr;
487810fb95SÁlvaro Fernández Rojas 	fdt_size_t size;
497810fb95SÁlvaro Fernández Rojas 
50*a821c4afSSimon Glass 	addr = devfdt_get_addr_size_index(dev, 0, &size);
517810fb95SÁlvaro Fernández Rojas 	if (addr == FDT_ADDR_T_NONE)
527810fb95SÁlvaro Fernández Rojas 		return -EINVAL;
537810fb95SÁlvaro Fernández Rojas 
547810fb95SÁlvaro Fernández Rojas 	priv->regs = ioremap(addr, size);
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 	.off = bcm6328_power_domain_off,
667810fb95SÁlvaro Fernández Rojas 	.on = bcm6328_power_domain_on,
677810fb95SÁlvaro Fernández Rojas 	.request = bcm6328_power_domain_request,
687810fb95SÁlvaro Fernández Rojas };
697810fb95SÁlvaro Fernández Rojas 
707810fb95SÁlvaro Fernández Rojas U_BOOT_DRIVER(bcm6328_power_domain) = {
717810fb95SÁlvaro Fernández Rojas 	.name = "bcm6328_power_domain",
727810fb95SÁlvaro Fernández Rojas 	.id = UCLASS_POWER_DOMAIN,
737810fb95SÁlvaro Fernández Rojas 	.of_match = bcm6328_power_domain_ids,
747810fb95SÁlvaro Fernández Rojas 	.ops = &bcm6328_power_domain_ops,
757810fb95SÁlvaro Fernández Rojas 	.priv_auto_alloc_size = sizeof(struct bcm6328_power_domain),
767810fb95SÁlvaro Fernández Rojas 	.probe = bcm6328_power_domain_probe,
777810fb95SÁlvaro Fernández Rojas };
78