xref: /rk3399_rockchip-uboot/drivers/clk/clk_bcm6345.c (revision a821c4af79e4f5ce9b629b20473863397bbe9b10)
15357eb95SÁlvaro Fernández Rojas /*
25357eb95SÁlvaro Fernández Rojas  * Copyright (C) 2017 Álvaro Fernández Rojas <noltari@gmail.com>
35357eb95SÁlvaro Fernández Rojas  *
45357eb95SÁlvaro Fernández Rojas  * Derived from linux/arch/mips/bcm63xx/clk.c:
55357eb95SÁlvaro Fernández Rojas  *	Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>
65357eb95SÁlvaro Fernández Rojas  *
75357eb95SÁlvaro Fernández Rojas  * SPDX-License-Identifier:	GPL-2.0+
85357eb95SÁlvaro Fernández Rojas  */
95357eb95SÁlvaro Fernández Rojas 
105357eb95SÁlvaro Fernández Rojas #include <common.h>
115357eb95SÁlvaro Fernández Rojas #include <clk-uclass.h>
125357eb95SÁlvaro Fernández Rojas #include <dm.h>
135357eb95SÁlvaro Fernández Rojas #include <errno.h>
145357eb95SÁlvaro Fernández Rojas #include <asm/io.h>
155357eb95SÁlvaro Fernández Rojas 
165357eb95SÁlvaro Fernández Rojas #define MAX_CLKS	32
175357eb95SÁlvaro Fernández Rojas 
185357eb95SÁlvaro Fernández Rojas struct bcm6345_clk_priv {
195357eb95SÁlvaro Fernández Rojas 	void __iomem *regs;
205357eb95SÁlvaro Fernández Rojas };
215357eb95SÁlvaro Fernández Rojas 
bcm6345_clk_enable(struct clk * clk)225357eb95SÁlvaro Fernández Rojas static int bcm6345_clk_enable(struct clk *clk)
235357eb95SÁlvaro Fernández Rojas {
245357eb95SÁlvaro Fernández Rojas 	struct bcm6345_clk_priv *priv = dev_get_priv(clk->dev);
255357eb95SÁlvaro Fernández Rojas 
265357eb95SÁlvaro Fernández Rojas 	if (clk->id >= MAX_CLKS)
275357eb95SÁlvaro Fernández Rojas 		return -EINVAL;
285357eb95SÁlvaro Fernández Rojas 
295357eb95SÁlvaro Fernández Rojas 	setbits_be32(priv->regs, BIT(clk->id));
305357eb95SÁlvaro Fernández Rojas 
315357eb95SÁlvaro Fernández Rojas 	return 0;
325357eb95SÁlvaro Fernández Rojas }
335357eb95SÁlvaro Fernández Rojas 
bcm6345_clk_disable(struct clk * clk)345357eb95SÁlvaro Fernández Rojas static int bcm6345_clk_disable(struct clk *clk)
355357eb95SÁlvaro Fernández Rojas {
365357eb95SÁlvaro Fernández Rojas 	struct bcm6345_clk_priv *priv = dev_get_priv(clk->dev);
375357eb95SÁlvaro Fernández Rojas 
385357eb95SÁlvaro Fernández Rojas 	if (clk->id >= MAX_CLKS)
395357eb95SÁlvaro Fernández Rojas 		return -EINVAL;
405357eb95SÁlvaro Fernández Rojas 
415357eb95SÁlvaro Fernández Rojas 	clrbits_be32(priv->regs, BIT(clk->id));
425357eb95SÁlvaro Fernández Rojas 
435357eb95SÁlvaro Fernández Rojas 	return 0;
445357eb95SÁlvaro Fernández Rojas }
455357eb95SÁlvaro Fernández Rojas 
465357eb95SÁlvaro Fernández Rojas static struct clk_ops bcm6345_clk_ops = {
475357eb95SÁlvaro Fernández Rojas 	.disable = bcm6345_clk_disable,
485357eb95SÁlvaro Fernández Rojas 	.enable = bcm6345_clk_enable,
495357eb95SÁlvaro Fernández Rojas };
505357eb95SÁlvaro Fernández Rojas 
515357eb95SÁlvaro Fernández Rojas static const struct udevice_id bcm6345_clk_ids[] = {
525357eb95SÁlvaro Fernández Rojas 	{ .compatible = "brcm,bcm6345-clk" },
535357eb95SÁlvaro Fernández Rojas 	{ /* sentinel */ }
545357eb95SÁlvaro Fernández Rojas };
555357eb95SÁlvaro Fernández Rojas 
bcm63xx_clk_probe(struct udevice * dev)565357eb95SÁlvaro Fernández Rojas static int bcm63xx_clk_probe(struct udevice *dev)
575357eb95SÁlvaro Fernández Rojas {
585357eb95SÁlvaro Fernández Rojas 	struct bcm6345_clk_priv *priv = dev_get_priv(dev);
595357eb95SÁlvaro Fernández Rojas 	fdt_addr_t addr;
605357eb95SÁlvaro Fernández Rojas 	fdt_size_t size;
615357eb95SÁlvaro Fernández Rojas 
62*a821c4afSSimon Glass 	addr = devfdt_get_addr_size_index(dev, 0, &size);
635357eb95SÁlvaro Fernández Rojas 	if (addr == FDT_ADDR_T_NONE)
645357eb95SÁlvaro Fernández Rojas 		return -EINVAL;
655357eb95SÁlvaro Fernández Rojas 
665357eb95SÁlvaro Fernández Rojas 	priv->regs = ioremap(addr, size);
675357eb95SÁlvaro Fernández Rojas 
685357eb95SÁlvaro Fernández Rojas 	return 0;
695357eb95SÁlvaro Fernández Rojas }
705357eb95SÁlvaro Fernández Rojas 
715357eb95SÁlvaro Fernández Rojas U_BOOT_DRIVER(clk_bcm6345) = {
725357eb95SÁlvaro Fernández Rojas 	.name = "clk_bcm6345",
735357eb95SÁlvaro Fernández Rojas 	.id = UCLASS_CLK,
745357eb95SÁlvaro Fernández Rojas 	.of_match = bcm6345_clk_ids,
755357eb95SÁlvaro Fernández Rojas 	.ops = &bcm6345_clk_ops,
765357eb95SÁlvaro Fernández Rojas 	.probe = bcm63xx_clk_probe,
775357eb95SÁlvaro Fernández Rojas 	.priv_auto_alloc_size = sizeof(struct bcm6345_clk_priv),
785357eb95SÁlvaro Fernández Rojas };
79