1135aa950SStephen Warren /*
2135aa950SStephen Warren * Copyright (c) 2016, NVIDIA CORPORATION.
3135aa950SStephen Warren *
4135aa950SStephen Warren * SPDX-License-Identifier: GPL-2.0
5135aa950SStephen Warren */
6135aa950SStephen Warren
7135aa950SStephen Warren #include <common.h>
8135aa950SStephen Warren #include <dm.h>
9135aa950SStephen Warren #include <clk.h>
10135aa950SStephen Warren #include <asm/clk.h>
11135aa950SStephen Warren
12135aa950SStephen Warren struct sandbox_clk_test {
13135aa950SStephen Warren struct clk clks[SANDBOX_CLK_TEST_ID_COUNT];
140afa4b6cSNeil Armstrong struct clk_bulk bulk;
15135aa950SStephen Warren };
16135aa950SStephen Warren
17135aa950SStephen Warren static const char * const sandbox_clk_test_names[] = {
18135aa950SStephen Warren [SANDBOX_CLK_TEST_ID_FIXED] = "fixed",
19135aa950SStephen Warren [SANDBOX_CLK_TEST_ID_SPI] = "spi",
20135aa950SStephen Warren [SANDBOX_CLK_TEST_ID_I2C] = "i2c",
21135aa950SStephen Warren };
22135aa950SStephen Warren
sandbox_clk_test_get(struct udevice * dev)23135aa950SStephen Warren int sandbox_clk_test_get(struct udevice *dev)
24135aa950SStephen Warren {
25135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev);
26135aa950SStephen Warren int i, ret;
27135aa950SStephen Warren
28135aa950SStephen Warren for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
29135aa950SStephen Warren ret = clk_get_by_name(dev, sandbox_clk_test_names[i],
30135aa950SStephen Warren &sbct->clks[i]);
31135aa950SStephen Warren if (ret)
32135aa950SStephen Warren return ret;
33135aa950SStephen Warren }
34135aa950SStephen Warren
35135aa950SStephen Warren return 0;
36135aa950SStephen Warren }
37135aa950SStephen Warren
sandbox_clk_test_get_bulk(struct udevice * dev)380afa4b6cSNeil Armstrong int sandbox_clk_test_get_bulk(struct udevice *dev)
390afa4b6cSNeil Armstrong {
400afa4b6cSNeil Armstrong struct sandbox_clk_test *sbct = dev_get_priv(dev);
410afa4b6cSNeil Armstrong
420afa4b6cSNeil Armstrong return clk_get_bulk(dev, &sbct->bulk);
430afa4b6cSNeil Armstrong }
440afa4b6cSNeil Armstrong
sandbox_clk_test_get_rate(struct udevice * dev,int id)45135aa950SStephen Warren ulong sandbox_clk_test_get_rate(struct udevice *dev, int id)
46135aa950SStephen Warren {
47135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev);
48135aa950SStephen Warren
49135aa950SStephen Warren if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
50135aa950SStephen Warren return -EINVAL;
51135aa950SStephen Warren
52135aa950SStephen Warren return clk_get_rate(&sbct->clks[id]);
53135aa950SStephen Warren }
54135aa950SStephen Warren
sandbox_clk_test_set_rate(struct udevice * dev,int id,ulong rate)55135aa950SStephen Warren ulong sandbox_clk_test_set_rate(struct udevice *dev, int id, ulong rate)
56135aa950SStephen Warren {
57135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev);
58135aa950SStephen Warren
59135aa950SStephen Warren if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
60135aa950SStephen Warren return -EINVAL;
61135aa950SStephen Warren
62135aa950SStephen Warren return clk_set_rate(&sbct->clks[id], rate);
63135aa950SStephen Warren }
64135aa950SStephen Warren
sandbox_clk_test_enable(struct udevice * dev,int id)65135aa950SStephen Warren int sandbox_clk_test_enable(struct udevice *dev, int id)
66135aa950SStephen Warren {
67135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev);
68135aa950SStephen Warren
69135aa950SStephen Warren if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
70135aa950SStephen Warren return -EINVAL;
71135aa950SStephen Warren
72135aa950SStephen Warren return clk_enable(&sbct->clks[id]);
73135aa950SStephen Warren }
74135aa950SStephen Warren
sandbox_clk_test_enable_bulk(struct udevice * dev)750afa4b6cSNeil Armstrong int sandbox_clk_test_enable_bulk(struct udevice *dev)
760afa4b6cSNeil Armstrong {
770afa4b6cSNeil Armstrong struct sandbox_clk_test *sbct = dev_get_priv(dev);
780afa4b6cSNeil Armstrong
790afa4b6cSNeil Armstrong return clk_enable_bulk(&sbct->bulk);
800afa4b6cSNeil Armstrong }
810afa4b6cSNeil Armstrong
sandbox_clk_test_disable(struct udevice * dev,int id)82135aa950SStephen Warren int sandbox_clk_test_disable(struct udevice *dev, int id)
83135aa950SStephen Warren {
84135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev);
85135aa950SStephen Warren
86135aa950SStephen Warren if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
87135aa950SStephen Warren return -EINVAL;
88135aa950SStephen Warren
89135aa950SStephen Warren return clk_disable(&sbct->clks[id]);
90135aa950SStephen Warren }
91135aa950SStephen Warren
sandbox_clk_test_disable_bulk(struct udevice * dev)920afa4b6cSNeil Armstrong int sandbox_clk_test_disable_bulk(struct udevice *dev)
930afa4b6cSNeil Armstrong {
940afa4b6cSNeil Armstrong struct sandbox_clk_test *sbct = dev_get_priv(dev);
950afa4b6cSNeil Armstrong
960afa4b6cSNeil Armstrong return clk_disable_bulk(&sbct->bulk);
970afa4b6cSNeil Armstrong }
980afa4b6cSNeil Armstrong
sandbox_clk_test_free(struct udevice * dev)99135aa950SStephen Warren int sandbox_clk_test_free(struct udevice *dev)
100135aa950SStephen Warren {
101135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev);
102135aa950SStephen Warren int i, ret;
103135aa950SStephen Warren
104135aa950SStephen Warren for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
105135aa950SStephen Warren ret = clk_free(&sbct->clks[i]);
106135aa950SStephen Warren if (ret)
107135aa950SStephen Warren return ret;
108135aa950SStephen Warren }
109135aa950SStephen Warren
110135aa950SStephen Warren return 0;
111135aa950SStephen Warren }
112135aa950SStephen Warren
sandbox_clk_test_release_bulk(struct udevice * dev)1130afa4b6cSNeil Armstrong int sandbox_clk_test_release_bulk(struct udevice *dev)
1140afa4b6cSNeil Armstrong {
1150afa4b6cSNeil Armstrong struct sandbox_clk_test *sbct = dev_get_priv(dev);
1160afa4b6cSNeil Armstrong
1170afa4b6cSNeil Armstrong return clk_release_bulk(&sbct->bulk);
1180afa4b6cSNeil Armstrong }
1190afa4b6cSNeil Armstrong
sandbox_clk_test_valid(struct udevice * dev)120*827e2ae9SFabrice Gasnier int sandbox_clk_test_valid(struct udevice *dev)
121*827e2ae9SFabrice Gasnier {
122*827e2ae9SFabrice Gasnier struct sandbox_clk_test *sbct = dev_get_priv(dev);
123*827e2ae9SFabrice Gasnier int i;
124*827e2ae9SFabrice Gasnier
125*827e2ae9SFabrice Gasnier for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
126*827e2ae9SFabrice Gasnier if (!clk_valid(&sbct->clks[i]))
127*827e2ae9SFabrice Gasnier return -EINVAL;
128*827e2ae9SFabrice Gasnier }
129*827e2ae9SFabrice Gasnier
130*827e2ae9SFabrice Gasnier return 0;
131*827e2ae9SFabrice Gasnier }
132*827e2ae9SFabrice Gasnier
133135aa950SStephen Warren static const struct udevice_id sandbox_clk_test_ids[] = {
134135aa950SStephen Warren { .compatible = "sandbox,clk-test" },
135135aa950SStephen Warren { }
136135aa950SStephen Warren };
137135aa950SStephen Warren
138135aa950SStephen Warren U_BOOT_DRIVER(sandbox_clk_test) = {
139135aa950SStephen Warren .name = "sandbox_clk_test",
140135aa950SStephen Warren .id = UCLASS_MISC,
141135aa950SStephen Warren .of_match = sandbox_clk_test_ids,
142135aa950SStephen Warren .priv_auto_alloc_size = sizeof(struct sandbox_clk_test),
143135aa950SStephen Warren };
144