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