183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0
2135aa950SStephen Warren /*
3135aa950SStephen Warren * Copyright (c) 2016, NVIDIA CORPORATION.
4135aa950SStephen Warren */
5135aa950SStephen Warren
6135aa950SStephen Warren #include <common.h>
7135aa950SStephen Warren #include <dm.h>
8135aa950SStephen Warren #include <clk.h>
9135aa950SStephen Warren #include <asm/clk.h>
10135aa950SStephen Warren
11135aa950SStephen Warren struct sandbox_clk_test {
12135aa950SStephen Warren struct clk clks[SANDBOX_CLK_TEST_ID_COUNT];
1365388d0dSNeil Armstrong struct clk_bulk bulk;
14135aa950SStephen Warren };
15135aa950SStephen Warren
16135aa950SStephen Warren static const char * const sandbox_clk_test_names[] = {
17135aa950SStephen Warren [SANDBOX_CLK_TEST_ID_FIXED] = "fixed",
18135aa950SStephen Warren [SANDBOX_CLK_TEST_ID_SPI] = "spi",
19135aa950SStephen Warren [SANDBOX_CLK_TEST_ID_I2C] = "i2c",
20135aa950SStephen Warren };
21135aa950SStephen Warren
sandbox_clk_test_get(struct udevice * dev)22135aa950SStephen Warren int sandbox_clk_test_get(struct udevice *dev)
23135aa950SStephen Warren {
24135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev);
25135aa950SStephen Warren int i, ret;
26135aa950SStephen Warren
27135aa950SStephen Warren for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
28135aa950SStephen Warren ret = clk_get_by_name(dev, sandbox_clk_test_names[i],
29135aa950SStephen Warren &sbct->clks[i]);
30135aa950SStephen Warren if (ret)
31135aa950SStephen Warren return ret;
32135aa950SStephen Warren }
33135aa950SStephen Warren
34135aa950SStephen Warren return 0;
35135aa950SStephen Warren }
36135aa950SStephen Warren
sandbox_clk_test_get_bulk(struct udevice * dev)3765388d0dSNeil Armstrong int sandbox_clk_test_get_bulk(struct udevice *dev)
3865388d0dSNeil Armstrong {
3965388d0dSNeil Armstrong struct sandbox_clk_test *sbct = dev_get_priv(dev);
4065388d0dSNeil Armstrong
4165388d0dSNeil Armstrong return clk_get_bulk(dev, &sbct->bulk);
4265388d0dSNeil Armstrong }
4365388d0dSNeil Armstrong
sandbox_clk_test_get_rate(struct udevice * dev,int id)44135aa950SStephen Warren ulong sandbox_clk_test_get_rate(struct udevice *dev, int id)
45135aa950SStephen Warren {
46135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev);
47135aa950SStephen Warren
48135aa950SStephen Warren if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
49135aa950SStephen Warren return -EINVAL;
50135aa950SStephen Warren
51135aa950SStephen Warren return clk_get_rate(&sbct->clks[id]);
52135aa950SStephen Warren }
53135aa950SStephen Warren
sandbox_clk_test_set_rate(struct udevice * dev,int id,ulong rate)54135aa950SStephen Warren ulong sandbox_clk_test_set_rate(struct udevice *dev, int id, ulong rate)
55135aa950SStephen Warren {
56135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev);
57135aa950SStephen Warren
58135aa950SStephen Warren if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
59135aa950SStephen Warren return -EINVAL;
60135aa950SStephen Warren
61135aa950SStephen Warren return clk_set_rate(&sbct->clks[id], rate);
62135aa950SStephen Warren }
63135aa950SStephen Warren
sandbox_clk_test_enable(struct udevice * dev,int id)64135aa950SStephen Warren int sandbox_clk_test_enable(struct udevice *dev, int id)
65135aa950SStephen Warren {
66135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev);
67135aa950SStephen Warren
68135aa950SStephen Warren if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
69135aa950SStephen Warren return -EINVAL;
70135aa950SStephen Warren
71135aa950SStephen Warren return clk_enable(&sbct->clks[id]);
72135aa950SStephen Warren }
73135aa950SStephen Warren
sandbox_clk_test_enable_bulk(struct udevice * dev)7465388d0dSNeil Armstrong int sandbox_clk_test_enable_bulk(struct udevice *dev)
7565388d0dSNeil Armstrong {
7665388d0dSNeil Armstrong struct sandbox_clk_test *sbct = dev_get_priv(dev);
7765388d0dSNeil Armstrong
7865388d0dSNeil Armstrong return clk_enable_bulk(&sbct->bulk);
7965388d0dSNeil Armstrong }
8065388d0dSNeil Armstrong
sandbox_clk_test_disable(struct udevice * dev,int id)81135aa950SStephen Warren int sandbox_clk_test_disable(struct udevice *dev, int id)
82135aa950SStephen Warren {
83135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev);
84135aa950SStephen Warren
85135aa950SStephen Warren if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
86135aa950SStephen Warren return -EINVAL;
87135aa950SStephen Warren
88135aa950SStephen Warren return clk_disable(&sbct->clks[id]);
89135aa950SStephen Warren }
90135aa950SStephen Warren
sandbox_clk_test_disable_bulk(struct udevice * dev)9165388d0dSNeil Armstrong int sandbox_clk_test_disable_bulk(struct udevice *dev)
9265388d0dSNeil Armstrong {
9365388d0dSNeil Armstrong struct sandbox_clk_test *sbct = dev_get_priv(dev);
9465388d0dSNeil Armstrong
9565388d0dSNeil Armstrong return clk_disable_bulk(&sbct->bulk);
9665388d0dSNeil Armstrong }
9765388d0dSNeil Armstrong
sandbox_clk_test_free(struct udevice * dev)98135aa950SStephen Warren int sandbox_clk_test_free(struct udevice *dev)
99135aa950SStephen Warren {
100135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev);
101135aa950SStephen Warren int i, ret;
102135aa950SStephen Warren
103135aa950SStephen Warren for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
104135aa950SStephen Warren ret = clk_free(&sbct->clks[i]);
105135aa950SStephen Warren if (ret)
106135aa950SStephen Warren return ret;
107135aa950SStephen Warren }
108135aa950SStephen Warren
109135aa950SStephen Warren return 0;
110135aa950SStephen Warren }
111135aa950SStephen Warren
sandbox_clk_test_release_bulk(struct udevice * dev)11265388d0dSNeil Armstrong int sandbox_clk_test_release_bulk(struct udevice *dev)
11365388d0dSNeil Armstrong {
11465388d0dSNeil Armstrong struct sandbox_clk_test *sbct = dev_get_priv(dev);
11565388d0dSNeil Armstrong
11665388d0dSNeil Armstrong return clk_release_bulk(&sbct->bulk);
11765388d0dSNeil Armstrong }
11865388d0dSNeil Armstrong
sandbox_clk_test_valid(struct udevice * dev)119*1fe243a1SFabrice Gasnier int sandbox_clk_test_valid(struct udevice *dev)
120*1fe243a1SFabrice Gasnier {
121*1fe243a1SFabrice Gasnier struct sandbox_clk_test *sbct = dev_get_priv(dev);
122*1fe243a1SFabrice Gasnier int i;
123*1fe243a1SFabrice Gasnier
124*1fe243a1SFabrice Gasnier for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
125*1fe243a1SFabrice Gasnier if (!clk_valid(&sbct->clks[i]))
126*1fe243a1SFabrice Gasnier return -EINVAL;
127*1fe243a1SFabrice Gasnier }
128*1fe243a1SFabrice Gasnier
129*1fe243a1SFabrice Gasnier return 0;
130*1fe243a1SFabrice Gasnier }
131*1fe243a1SFabrice Gasnier
132135aa950SStephen Warren static const struct udevice_id sandbox_clk_test_ids[] = {
133135aa950SStephen Warren { .compatible = "sandbox,clk-test" },
134135aa950SStephen Warren { }
135135aa950SStephen Warren };
136135aa950SStephen Warren
137135aa950SStephen Warren U_BOOT_DRIVER(sandbox_clk_test) = {
138135aa950SStephen Warren .name = "sandbox_clk_test",
139135aa950SStephen Warren .id = UCLASS_MISC,
140135aa950SStephen Warren .of_match = sandbox_clk_test_ids,
141135aa950SStephen Warren .priv_auto_alloc_size = sizeof(struct sandbox_clk_test),
142135aa950SStephen Warren };
143