12e7d35d2SSimon Glass /* 22e7d35d2SSimon Glass * Copyright (c) 2013 Google, Inc 32e7d35d2SSimon Glass * 42e7d35d2SSimon Glass * (C) Copyright 2012 52e7d35d2SSimon Glass * Pavel Herrmann <morpheus.ibis@gmail.com> 62e7d35d2SSimon Glass * 72e7d35d2SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 82e7d35d2SSimon Glass */ 92e7d35d2SSimon Glass 102e7d35d2SSimon Glass #include <common.h> 112e7d35d2SSimon Glass #include <dm.h> 122e7d35d2SSimon Glass #include <errno.h> 132e7d35d2SSimon Glass #include <malloc.h> 142e7d35d2SSimon Glass #include <dm/test.h> 152e7d35d2SSimon Glass #include <dm/ut.h> 162e7d35d2SSimon Glass #include <asm/io.h> 172e7d35d2SSimon Glass 182e7d35d2SSimon Glass int dm_testdrv_op_count[DM_TEST_OP_COUNT]; 192e7d35d2SSimon Glass static struct dm_test_state *dms = &global_test_state; 202e7d35d2SSimon Glass 2154c5d08aSHeiko Schocher static int testdrv_ping(struct udevice *dev, int pingval, int *pingret) 222e7d35d2SSimon Glass { 232e7d35d2SSimon Glass const struct dm_test_pdata *pdata = dev_get_platdata(dev); 242e7d35d2SSimon Glass struct dm_test_priv *priv = dev_get_priv(dev); 252e7d35d2SSimon Glass 262e7d35d2SSimon Glass *pingret = pingval + pdata->ping_add; 272e7d35d2SSimon Glass priv->ping_total += *pingret; 282e7d35d2SSimon Glass 292e7d35d2SSimon Glass return 0; 302e7d35d2SSimon Glass } 312e7d35d2SSimon Glass 322e7d35d2SSimon Glass static const struct test_ops test_ops = { 332e7d35d2SSimon Glass .ping = testdrv_ping, 342e7d35d2SSimon Glass }; 352e7d35d2SSimon Glass 3654c5d08aSHeiko Schocher static int test_bind(struct udevice *dev) 372e7d35d2SSimon Glass { 382e7d35d2SSimon Glass /* Private data should not be allocated */ 392e7d35d2SSimon Glass ut_assert(!dev_get_priv(dev)); 402e7d35d2SSimon Glass 412e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_BIND]++; 422e7d35d2SSimon Glass return 0; 432e7d35d2SSimon Glass } 442e7d35d2SSimon Glass 4554c5d08aSHeiko Schocher static int test_probe(struct udevice *dev) 462e7d35d2SSimon Glass { 472e7d35d2SSimon Glass struct dm_test_priv *priv = dev_get_priv(dev); 482e7d35d2SSimon Glass 492e7d35d2SSimon Glass /* Private data should be allocated */ 502e7d35d2SSimon Glass ut_assert(priv); 512e7d35d2SSimon Glass 522e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_PROBE]++; 532e7d35d2SSimon Glass priv->ping_total += DM_TEST_START_TOTAL; 542e7d35d2SSimon Glass return 0; 552e7d35d2SSimon Glass } 562e7d35d2SSimon Glass 5754c5d08aSHeiko Schocher static int test_remove(struct udevice *dev) 582e7d35d2SSimon Glass { 592e7d35d2SSimon Glass /* Private data should still be allocated */ 602e7d35d2SSimon Glass ut_assert(dev_get_priv(dev)); 612e7d35d2SSimon Glass 622e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_REMOVE]++; 632e7d35d2SSimon Glass return 0; 642e7d35d2SSimon Glass } 652e7d35d2SSimon Glass 6654c5d08aSHeiko Schocher static int test_unbind(struct udevice *dev) 672e7d35d2SSimon Glass { 682e7d35d2SSimon Glass /* Private data should not be allocated */ 692e7d35d2SSimon Glass ut_assert(!dev->priv); 702e7d35d2SSimon Glass 712e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_UNBIND]++; 722e7d35d2SSimon Glass return 0; 732e7d35d2SSimon Glass } 742e7d35d2SSimon Glass 752e7d35d2SSimon Glass U_BOOT_DRIVER(test_drv) = { 762e7d35d2SSimon Glass .name = "test_drv", 772e7d35d2SSimon Glass .id = UCLASS_TEST, 782e7d35d2SSimon Glass .ops = &test_ops, 792e7d35d2SSimon Glass .bind = test_bind, 802e7d35d2SSimon Glass .probe = test_probe, 812e7d35d2SSimon Glass .remove = test_remove, 822e7d35d2SSimon Glass .unbind = test_unbind, 832e7d35d2SSimon Glass .priv_auto_alloc_size = sizeof(struct dm_test_priv), 842e7d35d2SSimon Glass }; 852e7d35d2SSimon Glass 862e7d35d2SSimon Glass U_BOOT_DRIVER(test2_drv) = { 872e7d35d2SSimon Glass .name = "test2_drv", 882e7d35d2SSimon Glass .id = UCLASS_TEST, 892e7d35d2SSimon Glass .ops = &test_ops, 902e7d35d2SSimon Glass .bind = test_bind, 912e7d35d2SSimon Glass .probe = test_probe, 922e7d35d2SSimon Glass .remove = test_remove, 932e7d35d2SSimon Glass .unbind = test_unbind, 942e7d35d2SSimon Glass .priv_auto_alloc_size = sizeof(struct dm_test_priv), 952e7d35d2SSimon Glass }; 962e7d35d2SSimon Glass 9754c5d08aSHeiko Schocher static int test_manual_drv_ping(struct udevice *dev, int pingval, int *pingret) 982e7d35d2SSimon Glass { 992e7d35d2SSimon Glass *pingret = pingval + 2; 1002e7d35d2SSimon Glass 1012e7d35d2SSimon Glass return 0; 1022e7d35d2SSimon Glass } 1032e7d35d2SSimon Glass 1042e7d35d2SSimon Glass static const struct test_ops test_manual_ops = { 1052e7d35d2SSimon Glass .ping = test_manual_drv_ping, 1062e7d35d2SSimon Glass }; 1072e7d35d2SSimon Glass 10854c5d08aSHeiko Schocher static int test_manual_bind(struct udevice *dev) 1092e7d35d2SSimon Glass { 1102e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_BIND]++; 1112e7d35d2SSimon Glass 1122e7d35d2SSimon Glass return 0; 1132e7d35d2SSimon Glass } 1142e7d35d2SSimon Glass 11554c5d08aSHeiko Schocher static int test_manual_probe(struct udevice *dev) 1162e7d35d2SSimon Glass { 1172e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_PROBE]++; 1182e7d35d2SSimon Glass if (!dms->force_fail_alloc) 1192e7d35d2SSimon Glass dev->priv = calloc(1, sizeof(struct dm_test_priv)); 1202e7d35d2SSimon Glass if (!dev->priv) 1212e7d35d2SSimon Glass return -ENOMEM; 1222e7d35d2SSimon Glass 1232e7d35d2SSimon Glass return 0; 1242e7d35d2SSimon Glass } 1252e7d35d2SSimon Glass 12654c5d08aSHeiko Schocher static int test_manual_remove(struct udevice *dev) 1272e7d35d2SSimon Glass { 1282e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_REMOVE]++; 1292e7d35d2SSimon Glass return 0; 1302e7d35d2SSimon Glass } 1312e7d35d2SSimon Glass 13254c5d08aSHeiko Schocher static int test_manual_unbind(struct udevice *dev) 1332e7d35d2SSimon Glass { 1342e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_UNBIND]++; 1352e7d35d2SSimon Glass return 0; 1362e7d35d2SSimon Glass } 1372e7d35d2SSimon Glass 1382e7d35d2SSimon Glass U_BOOT_DRIVER(test_manual_drv) = { 1392e7d35d2SSimon Glass .name = "test_manual_drv", 1402e7d35d2SSimon Glass .id = UCLASS_TEST, 1412e7d35d2SSimon Glass .ops = &test_manual_ops, 1422e7d35d2SSimon Glass .bind = test_manual_bind, 1432e7d35d2SSimon Glass .probe = test_manual_probe, 1442e7d35d2SSimon Glass .remove = test_manual_remove, 1452e7d35d2SSimon Glass .unbind = test_manual_unbind, 1462e7d35d2SSimon Glass }; 147*00606d7eSSimon Glass 148*00606d7eSSimon Glass U_BOOT_DRIVER(test_pre_reloc_drv) = { 149*00606d7eSSimon Glass .name = "test_pre_reloc_drv", 150*00606d7eSSimon Glass .id = UCLASS_TEST, 151*00606d7eSSimon Glass .ops = &test_manual_ops, 152*00606d7eSSimon Glass .bind = test_manual_bind, 153*00606d7eSSimon Glass .probe = test_manual_probe, 154*00606d7eSSimon Glass .remove = test_manual_remove, 155*00606d7eSSimon Glass .unbind = test_manual_unbind, 156*00606d7eSSimon Glass .flags = DM_FLAG_PRE_RELOC, 157*00606d7eSSimon Glass }; 158