1 /*
2 * Copyright (c) 2016, NVIDIA CORPORATION.
3 *
4 * SPDX-License-Identifier: GPL-2.0
5 */
6
7 #include <common.h>
8 #include <dm.h>
9 #include <clk.h>
10 #include <asm/clk.h>
11
12 struct sandbox_clk_test {
13 struct clk clks[SANDBOX_CLK_TEST_ID_COUNT];
14 struct clk_bulk bulk;
15 };
16
17 static const char * const sandbox_clk_test_names[] = {
18 [SANDBOX_CLK_TEST_ID_FIXED] = "fixed",
19 [SANDBOX_CLK_TEST_ID_SPI] = "spi",
20 [SANDBOX_CLK_TEST_ID_I2C] = "i2c",
21 };
22
sandbox_clk_test_get(struct udevice * dev)23 int sandbox_clk_test_get(struct udevice *dev)
24 {
25 struct sandbox_clk_test *sbct = dev_get_priv(dev);
26 int i, ret;
27
28 for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
29 ret = clk_get_by_name(dev, sandbox_clk_test_names[i],
30 &sbct->clks[i]);
31 if (ret)
32 return ret;
33 }
34
35 return 0;
36 }
37
sandbox_clk_test_get_bulk(struct udevice * dev)38 int sandbox_clk_test_get_bulk(struct udevice *dev)
39 {
40 struct sandbox_clk_test *sbct = dev_get_priv(dev);
41
42 return clk_get_bulk(dev, &sbct->bulk);
43 }
44
sandbox_clk_test_get_rate(struct udevice * dev,int id)45 ulong sandbox_clk_test_get_rate(struct udevice *dev, int id)
46 {
47 struct sandbox_clk_test *sbct = dev_get_priv(dev);
48
49 if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
50 return -EINVAL;
51
52 return clk_get_rate(&sbct->clks[id]);
53 }
54
sandbox_clk_test_set_rate(struct udevice * dev,int id,ulong rate)55 ulong sandbox_clk_test_set_rate(struct udevice *dev, int id, ulong rate)
56 {
57 struct sandbox_clk_test *sbct = dev_get_priv(dev);
58
59 if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
60 return -EINVAL;
61
62 return clk_set_rate(&sbct->clks[id], rate);
63 }
64
sandbox_clk_test_enable(struct udevice * dev,int id)65 int sandbox_clk_test_enable(struct udevice *dev, int id)
66 {
67 struct sandbox_clk_test *sbct = dev_get_priv(dev);
68
69 if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
70 return -EINVAL;
71
72 return clk_enable(&sbct->clks[id]);
73 }
74
sandbox_clk_test_enable_bulk(struct udevice * dev)75 int sandbox_clk_test_enable_bulk(struct udevice *dev)
76 {
77 struct sandbox_clk_test *sbct = dev_get_priv(dev);
78
79 return clk_enable_bulk(&sbct->bulk);
80 }
81
sandbox_clk_test_disable(struct udevice * dev,int id)82 int sandbox_clk_test_disable(struct udevice *dev, int id)
83 {
84 struct sandbox_clk_test *sbct = dev_get_priv(dev);
85
86 if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
87 return -EINVAL;
88
89 return clk_disable(&sbct->clks[id]);
90 }
91
sandbox_clk_test_disable_bulk(struct udevice * dev)92 int sandbox_clk_test_disable_bulk(struct udevice *dev)
93 {
94 struct sandbox_clk_test *sbct = dev_get_priv(dev);
95
96 return clk_disable_bulk(&sbct->bulk);
97 }
98
sandbox_clk_test_free(struct udevice * dev)99 int sandbox_clk_test_free(struct udevice *dev)
100 {
101 struct sandbox_clk_test *sbct = dev_get_priv(dev);
102 int i, ret;
103
104 for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
105 ret = clk_free(&sbct->clks[i]);
106 if (ret)
107 return ret;
108 }
109
110 return 0;
111 }
112
sandbox_clk_test_release_bulk(struct udevice * dev)113 int sandbox_clk_test_release_bulk(struct udevice *dev)
114 {
115 struct sandbox_clk_test *sbct = dev_get_priv(dev);
116
117 return clk_release_bulk(&sbct->bulk);
118 }
119
sandbox_clk_test_valid(struct udevice * dev)120 int sandbox_clk_test_valid(struct udevice *dev)
121 {
122 struct sandbox_clk_test *sbct = dev_get_priv(dev);
123 int i;
124
125 for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
126 if (!clk_valid(&sbct->clks[i]))
127 return -EINVAL;
128 }
129
130 return 0;
131 }
132
133 static const struct udevice_id sandbox_clk_test_ids[] = {
134 { .compatible = "sandbox,clk-test" },
135 { }
136 };
137
138 U_BOOT_DRIVER(sandbox_clk_test) = {
139 .name = "sandbox_clk_test",
140 .id = UCLASS_MISC,
141 .of_match = sandbox_clk_test_ids,
142 .priv_auto_alloc_size = sizeof(struct sandbox_clk_test),
143 };
144