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