1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright (c) 2013 Google, Inc
4 *
5 * (C) Copyright 2012
6 * Pavel Herrmann <morpheus.ibis@gmail.com>
7 */
8
9 #include <common.h>
10 #include <dm.h>
11 #include <errno.h>
12 #include <log.h>
13 #include <malloc.h>
14 #include <asm/io.h>
15 #include <dm/device-internal.h>
16 #include <dm/test.h>
17 #include <test/test.h>
18 #include <test/ut.h>
19
20 int dm_testdrv_op_count[DM_TEST_OP_COUNT];
21
testdrv_ping(struct udevice * dev,int pingval,int * pingret)22 static int testdrv_ping(struct udevice *dev, int pingval, int *pingret)
23 {
24 const struct dm_test_pdata *pdata = dev_get_plat(dev);
25 struct dm_test_priv *priv = dev_get_priv(dev);
26
27 *pingret = pingval + pdata->ping_add;
28 priv->ping_total += *pingret;
29
30 return 0;
31 }
32
33 static const struct test_ops test_ops = {
34 .ping = testdrv_ping,
35 };
36
test_bind(struct udevice * dev)37 static int test_bind(struct udevice *dev)
38 {
39 struct unit_test_state *uts = test_get_state();
40
41 /* Private data should not be allocated */
42 ut_assert(!dev_get_priv(dev));
43
44 dm_testdrv_op_count[DM_TEST_OP_BIND]++;
45 return 0;
46 }
47
test_probe(struct udevice * dev)48 static int test_probe(struct udevice *dev)
49 {
50 struct unit_test_state *uts = test_get_state();
51 struct dm_test_priv *priv = dev_get_priv(dev);
52
53 /* Private data should be allocated */
54 ut_assert(priv);
55
56 dm_testdrv_op_count[DM_TEST_OP_PROBE]++;
57 priv->ping_total += DM_TEST_START_TOTAL;
58 return 0;
59 }
60
test_remove(struct udevice * dev)61 static int test_remove(struct udevice *dev)
62 {
63 struct unit_test_state *uts = test_get_state();
64
65 /* Private data should still be allocated */
66 ut_assert(dev_get_priv(dev));
67
68 dm_testdrv_op_count[DM_TEST_OP_REMOVE]++;
69 return 0;
70 }
71
test_unbind(struct udevice * dev)72 static int test_unbind(struct udevice *dev)
73 {
74 struct unit_test_state *uts = test_get_state();
75
76 /* Private data should not be allocated */
77 ut_assert(!dev_get_priv(dev));
78
79 dm_testdrv_op_count[DM_TEST_OP_UNBIND]++;
80 return 0;
81 }
82
83 U_BOOT_DRIVER(test_drv) = {
84 .name = "test_drv",
85 .id = UCLASS_TEST,
86 .ops = &test_ops,
87 .bind = test_bind,
88 .probe = test_probe,
89 .remove = test_remove,
90 .unbind = test_unbind,
91 .priv_auto = sizeof(struct dm_test_priv),
92 };
93
94 U_BOOT_DRIVER(test2_drv) = {
95 .name = "test2_drv",
96 .id = UCLASS_TEST,
97 .ops = &test_ops,
98 .bind = test_bind,
99 .probe = test_probe,
100 .remove = test_remove,
101 .unbind = test_unbind,
102 .priv_auto = sizeof(struct dm_test_priv),
103 };
104
test_manual_drv_ping(struct udevice * dev,int pingval,int * pingret)105 static int test_manual_drv_ping(struct udevice *dev, int pingval, int *pingret)
106 {
107 *pingret = pingval + 2;
108
109 return 0;
110 }
111
112 static const struct test_ops test_manual_ops = {
113 .ping = test_manual_drv_ping,
114 };
115
test_manual_bind(struct udevice * dev)116 static int test_manual_bind(struct udevice *dev)
117 {
118 dm_testdrv_op_count[DM_TEST_OP_BIND]++;
119
120 return 0;
121 }
122
test_manual_probe(struct udevice * dev)123 static int test_manual_probe(struct udevice *dev)
124 {
125 struct unit_test_state *uts = test_get_state();
126
127 dm_testdrv_op_count[DM_TEST_OP_PROBE]++;
128 if (!uts->force_fail_alloc)
129 dev_set_priv(dev, calloc(1, sizeof(struct dm_test_priv)));
130 if (!dev_get_priv(dev))
131 return -ENOMEM;
132
133 return 0;
134 }
135
test_manual_remove(struct udevice * dev)136 static int test_manual_remove(struct udevice *dev)
137 {
138 dm_testdrv_op_count[DM_TEST_OP_REMOVE]++;
139 return 0;
140 }
141
test_manual_unbind(struct udevice * dev)142 static int test_manual_unbind(struct udevice *dev)
143 {
144 dm_testdrv_op_count[DM_TEST_OP_UNBIND]++;
145 return 0;
146 }
147
148 U_BOOT_DRIVER(test_manual_drv) = {
149 .name = "test_manual_drv",
150 .id = UCLASS_TEST,
151 .ops = &test_manual_ops,
152 .bind = test_manual_bind,
153 .probe = test_manual_probe,
154 .remove = test_manual_remove,
155 .unbind = test_manual_unbind,
156 };
157
158 U_BOOT_DRIVER(test_pre_reloc_drv) = {
159 .name = "test_pre_reloc_drv",
160 .id = UCLASS_TEST,
161 .ops = &test_manual_ops,
162 .bind = test_manual_bind,
163 .probe = test_manual_probe,
164 .remove = test_manual_remove,
165 .unbind = test_manual_unbind,
166 .flags = DM_FLAG_PRE_RELOC,
167 };
168
169 U_BOOT_DRIVER(test_act_dma_drv) = {
170 .name = "test_act_dma_drv",
171 .id = UCLASS_TEST,
172 .ops = &test_manual_ops,
173 .bind = test_manual_bind,
174 .probe = test_manual_probe,
175 .remove = test_manual_remove,
176 .unbind = test_manual_unbind,
177 .flags = DM_FLAG_ACTIVE_DMA,
178 };
179
180 U_BOOT_DRIVER(test_vital_clk_drv) = {
181 .name = "test_vital_clk_drv",
182 .id = UCLASS_TEST,
183 .ops = &test_manual_ops,
184 .bind = test_manual_bind,
185 .probe = test_manual_probe,
186 .remove = test_manual_remove,
187 .unbind = test_manual_unbind,
188 .flags = DM_FLAG_VITAL,
189 };
190
191 U_BOOT_DRIVER(test_act_dma_vital_clk_drv) = {
192 .name = "test_act_dma_vital_clk_drv",
193 .id = UCLASS_TEST,
194 .ops = &test_manual_ops,
195 .bind = test_manual_bind,
196 .probe = test_manual_probe,
197 .remove = test_manual_remove,
198 .unbind = test_manual_unbind,
199 .flags = DM_FLAG_VITAL | DM_FLAG_ACTIVE_DMA,
200 };
201