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