xref: /openbmc/u-boot/drivers/clk/clk_sandbox.c (revision e8f80a5a)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0
26a1c7cefSSimon Glass /*
36a1c7cefSSimon Glass  * (C) Copyright 2015 Google, Inc
46a1c7cefSSimon Glass  */
56a1c7cefSSimon Glass 
66a1c7cefSSimon Glass #include <common.h>
7135aa950SStephen Warren #include <clk-uclass.h>
86a1c7cefSSimon Glass #include <dm.h>
96a1c7cefSSimon Glass #include <errno.h>
10135aa950SStephen Warren #include <asm/clk.h>
116a1c7cefSSimon Glass 
126a1c7cefSSimon Glass struct sandbox_clk_priv {
13135aa950SStephen Warren 	ulong rate[SANDBOX_CLK_ID_COUNT];
14135aa950SStephen Warren 	bool enabled[SANDBOX_CLK_ID_COUNT];
156a1c7cefSSimon Glass };
166a1c7cefSSimon Glass 
sandbox_clk_get_rate(struct clk * clk)17135aa950SStephen Warren static ulong sandbox_clk_get_rate(struct clk *clk)
186a1c7cefSSimon Glass {
19135aa950SStephen Warren 	struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
206a1c7cefSSimon Glass 
21df8b0a03SStephen Warren 	if (clk->id >= SANDBOX_CLK_ID_COUNT)
22135aa950SStephen Warren 		return -EINVAL;
23135aa950SStephen Warren 
24135aa950SStephen Warren 	return priv->rate[clk->id];
256a1c7cefSSimon Glass }
266a1c7cefSSimon Glass 
sandbox_clk_set_rate(struct clk * clk,ulong rate)27135aa950SStephen Warren static ulong sandbox_clk_set_rate(struct clk *clk, ulong rate)
286a1c7cefSSimon Glass {
29135aa950SStephen Warren 	struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
30135aa950SStephen Warren 	ulong old_rate;
31135aa950SStephen Warren 
32df8b0a03SStephen Warren 	if (clk->id >= SANDBOX_CLK_ID_COUNT)
33135aa950SStephen Warren 		return -EINVAL;
346a1c7cefSSimon Glass 
356a1c7cefSSimon Glass 	if (!rate)
366a1c7cefSSimon Glass 		return -EINVAL;
376a1c7cefSSimon Glass 
38135aa950SStephen Warren 	old_rate = priv->rate[clk->id];
39135aa950SStephen Warren 	priv->rate[clk->id] = rate;
406a1c7cefSSimon Glass 
416a1c7cefSSimon Glass 	return old_rate;
426a1c7cefSSimon Glass }
436a1c7cefSSimon Glass 
sandbox_clk_enable(struct clk * clk)44135aa950SStephen Warren static int sandbox_clk_enable(struct clk *clk)
456a1c7cefSSimon Glass {
46135aa950SStephen Warren 	struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
476a1c7cefSSimon Glass 
48df8b0a03SStephen Warren 	if (clk->id >= SANDBOX_CLK_ID_COUNT)
49135aa950SStephen Warren 		return -EINVAL;
50135aa950SStephen Warren 
51135aa950SStephen Warren 	priv->enabled[clk->id] = true;
52135aa950SStephen Warren 
53135aa950SStephen Warren 	return 0;
54135aa950SStephen Warren }
55135aa950SStephen Warren 
sandbox_clk_disable(struct clk * clk)56135aa950SStephen Warren static int sandbox_clk_disable(struct clk *clk)
57135aa950SStephen Warren {
58135aa950SStephen Warren 	struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
59135aa950SStephen Warren 
60df8b0a03SStephen Warren 	if (clk->id >= SANDBOX_CLK_ID_COUNT)
61135aa950SStephen Warren 		return -EINVAL;
62135aa950SStephen Warren 
63135aa950SStephen Warren 	priv->enabled[clk->id] = false;
646a1c7cefSSimon Glass 
656a1c7cefSSimon Glass 	return 0;
666a1c7cefSSimon Glass }
676a1c7cefSSimon Glass 
686a1c7cefSSimon Glass static struct clk_ops sandbox_clk_ops = {
696a1c7cefSSimon Glass 	.get_rate	= sandbox_clk_get_rate,
706a1c7cefSSimon Glass 	.set_rate	= sandbox_clk_set_rate,
71135aa950SStephen Warren 	.enable		= sandbox_clk_enable,
72135aa950SStephen Warren 	.disable	= sandbox_clk_disable,
736a1c7cefSSimon Glass };
746a1c7cefSSimon Glass 
756a1c7cefSSimon Glass static const struct udevice_id sandbox_clk_ids[] = {
766a1c7cefSSimon Glass 	{ .compatible = "sandbox,clk" },
776a1c7cefSSimon Glass 	{ }
786a1c7cefSSimon Glass };
796a1c7cefSSimon Glass 
806a1c7cefSSimon Glass U_BOOT_DRIVER(clk_sandbox) = {
816a1c7cefSSimon Glass 	.name		= "clk_sandbox",
826a1c7cefSSimon Glass 	.id		= UCLASS_CLK,
836a1c7cefSSimon Glass 	.of_match	= sandbox_clk_ids,
846a1c7cefSSimon Glass 	.ops		= &sandbox_clk_ops,
856a1c7cefSSimon Glass 	.priv_auto_alloc_size = sizeof(struct sandbox_clk_priv),
866a1c7cefSSimon Glass };
87135aa950SStephen Warren 
sandbox_clk_query_rate(struct udevice * dev,int id)88135aa950SStephen Warren ulong sandbox_clk_query_rate(struct udevice *dev, int id)
89135aa950SStephen Warren {
90135aa950SStephen Warren 	struct sandbox_clk_priv *priv = dev_get_priv(dev);
91135aa950SStephen Warren 
92135aa950SStephen Warren 	if (id < 0 || id >= SANDBOX_CLK_ID_COUNT)
93135aa950SStephen Warren 		return -EINVAL;
94135aa950SStephen Warren 
95135aa950SStephen Warren 	return priv->rate[id];
96135aa950SStephen Warren }
97135aa950SStephen Warren 
sandbox_clk_query_enable(struct udevice * dev,int id)98135aa950SStephen Warren int sandbox_clk_query_enable(struct udevice *dev, int id)
99135aa950SStephen Warren {
100135aa950SStephen Warren 	struct sandbox_clk_priv *priv = dev_get_priv(dev);
101135aa950SStephen Warren 
102135aa950SStephen Warren 	if (id < 0 || id >= SANDBOX_CLK_ID_COUNT)
103135aa950SStephen Warren 		return -EINVAL;
104135aa950SStephen Warren 
105135aa950SStephen Warren 	return priv->enabled[id];
106135aa950SStephen Warren }
107