xref: /openbmc/u-boot/drivers/clk/clk_bcm6345.c (revision 2a046ff5e9ffc30025b698ea6751412e2a1f16ca)
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