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