1 // SPDX-License-Identifier: GPL-2.0
3 * (C) Copyright 2015 Google, Inc
7 #include <clk-uclass.h>
13 struct sandbox_clk_priv {
15 ulong rate[SANDBOX_CLK_ID_COUNT];
16 bool enabled[SANDBOX_CLK_ID_COUNT];
17 bool requested[SANDBOX_CLK_ID_COUNT];
20 static ulong sandbox_clk_get_rate(struct clk *clk)
22 struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
27 if (clk->id >= SANDBOX_CLK_ID_COUNT)
30 return priv->rate[clk->id];
33 static ulong sandbox_clk_set_rate(struct clk *clk, ulong rate)
35 struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
41 if (clk->id >= SANDBOX_CLK_ID_COUNT)
47 old_rate = priv->rate[clk->id];
48 priv->rate[clk->id] = rate;
53 static int sandbox_clk_enable(struct clk *clk)
55 struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
60 if (clk->id >= SANDBOX_CLK_ID_COUNT)
63 priv->enabled[clk->id] = true;
68 static int sandbox_clk_disable(struct clk *clk)
70 struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
75 if (clk->id >= SANDBOX_CLK_ID_COUNT)
78 priv->enabled[clk->id] = false;
83 static int sandbox_clk_request(struct clk *clk)
85 struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
87 if (clk->id >= SANDBOX_CLK_ID_COUNT)
90 priv->requested[clk->id] = true;
94 static int sandbox_clk_free(struct clk *clk)
96 struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
98 if (clk->id >= SANDBOX_CLK_ID_COUNT)
101 priv->requested[clk->id] = false;
105 static struct clk_ops sandbox_clk_ops = {
106 .get_rate = sandbox_clk_get_rate,
107 .set_rate = sandbox_clk_set_rate,
108 .enable = sandbox_clk_enable,
109 .disable = sandbox_clk_disable,
110 .request = sandbox_clk_request,
111 .rfree = sandbox_clk_free,
114 static int sandbox_clk_probe(struct udevice *dev)
116 struct sandbox_clk_priv *priv = dev_get_priv(dev);
122 static const struct udevice_id sandbox_clk_ids[] = {
123 { .compatible = "sandbox,clk" },
127 U_BOOT_DRIVER(clk_sandbox) = {
128 .name = "clk_sandbox",
130 .of_match = sandbox_clk_ids,
131 .ops = &sandbox_clk_ops,
132 .probe = sandbox_clk_probe,
133 .priv_auto_alloc_size = sizeof(struct sandbox_clk_priv),
136 ulong sandbox_clk_query_rate(struct udevice *dev, int id)
138 struct sandbox_clk_priv *priv = dev_get_priv(dev);
140 if (id < 0 || id >= SANDBOX_CLK_ID_COUNT)
143 return priv->rate[id];
146 int sandbox_clk_query_enable(struct udevice *dev, int id)
148 struct sandbox_clk_priv *priv = dev_get_priv(dev);
150 if (id < 0 || id >= SANDBOX_CLK_ID_COUNT)
153 return priv->enabled[id];
156 int sandbox_clk_query_requested(struct udevice *dev, int id)
158 struct sandbox_clk_priv *priv = dev_get_priv(dev);
160 if (id < 0 || id >= SANDBOX_CLK_ID_COUNT)
162 return priv->requested[id];