1
2
3
4
5
6
7
8
9#include <common.h>
10#include <dm.h>
11#include <errno.h>
12#include <malloc.h>
13#include <dm/test.h>
14#include <test/ut.h>
15#include <asm/io.h>
16
17int dm_testdrv_op_count[DM_TEST_OP_COUNT];
18static struct unit_test_state *uts = &global_dm_test_state;
19
20static int testdrv_ping(struct udevice *dev, int pingval, int *pingret)
21{
22 const struct dm_test_pdata *pdata = dev_get_platdata(dev);
23 struct dm_test_priv *priv = dev_get_priv(dev);
24
25 *pingret = pingval + pdata->ping_add;
26 priv->ping_total += *pingret;
27
28 return 0;
29}
30
31static const struct test_ops test_ops = {
32 .ping = testdrv_ping,
33};
34
35static int test_bind(struct udevice *dev)
36{
37
38 ut_assert(!dev_get_priv(dev));
39
40 dm_testdrv_op_count[DM_TEST_OP_BIND]++;
41 return 0;
42}
43
44static int test_probe(struct udevice *dev)
45{
46 struct dm_test_priv *priv = dev_get_priv(dev);
47
48
49 ut_assert(priv);
50
51 dm_testdrv_op_count[DM_TEST_OP_PROBE]++;
52 priv->ping_total += DM_TEST_START_TOTAL;
53 return 0;
54}
55
56static int test_remove(struct udevice *dev)
57{
58
59 ut_assert(dev_get_priv(dev));
60
61 dm_testdrv_op_count[DM_TEST_OP_REMOVE]++;
62 return 0;
63}
64
65static int test_unbind(struct udevice *dev)
66{
67
68 ut_assert(!dev->priv);
69
70 dm_testdrv_op_count[DM_TEST_OP_UNBIND]++;
71 return 0;
72}
73
74U_BOOT_DRIVER(test_drv) = {
75 .name = "test_drv",
76 .id = UCLASS_TEST,
77 .ops = &test_ops,
78 .bind = test_bind,
79 .probe = test_probe,
80 .remove = test_remove,
81 .unbind = test_unbind,
82 .priv_auto_alloc_size = sizeof(struct dm_test_priv),
83};
84
85U_BOOT_DRIVER(test2_drv) = {
86 .name = "test2_drv",
87 .id = UCLASS_TEST,
88 .ops = &test_ops,
89 .bind = test_bind,
90 .probe = test_probe,
91 .remove = test_remove,
92 .unbind = test_unbind,
93 .priv_auto_alloc_size = sizeof(struct dm_test_priv),
94};
95
96static int test_manual_drv_ping(struct udevice *dev, int pingval, int *pingret)
97{
98 *pingret = pingval + 2;
99
100 return 0;
101}
102
103static const struct test_ops test_manual_ops = {
104 .ping = test_manual_drv_ping,
105};
106
107static int test_manual_bind(struct udevice *dev)
108{
109 dm_testdrv_op_count[DM_TEST_OP_BIND]++;
110
111 return 0;
112}
113
114static int test_manual_probe(struct udevice *dev)
115{
116 struct dm_test_state *dms = uts->priv;
117
118 dm_testdrv_op_count[DM_TEST_OP_PROBE]++;
119 if (!dms->force_fail_alloc)
120 dev->priv = calloc(1, sizeof(struct dm_test_priv));
121 if (!dev->priv)
122 return -ENOMEM;
123
124 return 0;
125}
126
127static int test_manual_remove(struct udevice *dev)
128{
129 dm_testdrv_op_count[DM_TEST_OP_REMOVE]++;
130 return 0;
131}
132
133static int test_manual_unbind(struct udevice *dev)
134{
135 dm_testdrv_op_count[DM_TEST_OP_UNBIND]++;
136 return 0;
137}
138
139U_BOOT_DRIVER(test_manual_drv) = {
140 .name = "test_manual_drv",
141 .id = UCLASS_TEST,
142 .ops = &test_manual_ops,
143 .bind = test_manual_bind,
144 .probe = test_manual_probe,
145 .remove = test_manual_remove,
146 .unbind = test_manual_unbind,
147};
148
149U_BOOT_DRIVER(test_pre_reloc_drv) = {
150 .name = "test_pre_reloc_drv",
151 .id = UCLASS_TEST,
152 .ops = &test_manual_ops,
153 .bind = test_manual_bind,
154 .probe = test_manual_probe,
155 .remove = test_manual_remove,
156 .unbind = test_manual_unbind,
157 .flags = DM_FLAG_PRE_RELOC,
158};
159
160U_BOOT_DRIVER(test_act_dma_drv) = {
161 .name = "test_act_dma_drv",
162 .id = UCLASS_TEST,
163 .ops = &test_manual_ops,
164 .bind = test_manual_bind,
165 .probe = test_manual_probe,
166 .remove = test_manual_remove,
167 .unbind = test_manual_unbind,
168 .flags = DM_FLAG_ACTIVE_DMA,
169};
170