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 <malloc.h> 122e7d35d2SSimon Glass #include <dm.h> 132e7d35d2SSimon Glass #include <errno.h> 142e7d35d2SSimon Glass #include <dm/test.h> 152e7d35d2SSimon Glass #include <dm/ut.h> 162e7d35d2SSimon Glass #include <asm/io.h> 172e7d35d2SSimon Glass #include <linux/list.h> 182e7d35d2SSimon Glass 192e7d35d2SSimon Glass static struct dm_test_state *dms = &global_test_state; 202e7d35d2SSimon Glass 2154c5d08aSHeiko Schocher int test_ping(struct udevice *dev, int pingval, int *pingret) 222e7d35d2SSimon Glass { 232e7d35d2SSimon Glass const struct test_ops *ops = device_get_ops(dev); 242e7d35d2SSimon Glass 252e7d35d2SSimon Glass if (!ops->ping) 262e7d35d2SSimon Glass return -ENOSYS; 272e7d35d2SSimon Glass 282e7d35d2SSimon Glass return ops->ping(dev, pingval, pingret); 292e7d35d2SSimon Glass } 302e7d35d2SSimon Glass 3154c5d08aSHeiko Schocher static int test_post_bind(struct udevice *dev) 322e7d35d2SSimon Glass { 33*754e71e8SPrzemyslaw Marczak struct dm_test_perdev_uc_pdata *uc_pdata; 34*754e71e8SPrzemyslaw Marczak 352e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_POST_BIND]++; 36206d4d2bSSimon Glass ut_assert(!device_active(dev)); 372e7d35d2SSimon Glass 38*754e71e8SPrzemyslaw Marczak uc_pdata = dev_get_uclass_platdata(dev); 39*754e71e8SPrzemyslaw Marczak ut_assert(uc_pdata); 40*754e71e8SPrzemyslaw Marczak 41*754e71e8SPrzemyslaw Marczak uc_pdata->intval1 = TEST_UC_PDATA_INTVAL1; 42*754e71e8SPrzemyslaw Marczak uc_pdata->intval2 = TEST_UC_PDATA_INTVAL2; 43*754e71e8SPrzemyslaw Marczak uc_pdata->intval3 = TEST_UC_PDATA_INTVAL3; 44*754e71e8SPrzemyslaw Marczak 452e7d35d2SSimon Glass return 0; 462e7d35d2SSimon Glass } 472e7d35d2SSimon Glass 4854c5d08aSHeiko Schocher static int test_pre_unbind(struct udevice *dev) 492e7d35d2SSimon Glass { 502e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_PRE_UNBIND]++; 512e7d35d2SSimon Glass 522e7d35d2SSimon Glass return 0; 532e7d35d2SSimon Glass } 542e7d35d2SSimon Glass 5502c07b37SSimon Glass static int test_pre_probe(struct udevice *dev) 5602c07b37SSimon Glass { 5702c07b37SSimon Glass struct dm_test_uclass_perdev_priv *priv = dev_get_uclass_priv(dev); 5802c07b37SSimon Glass 5902c07b37SSimon Glass dm_testdrv_op_count[DM_TEST_OP_PRE_PROBE]++; 6002c07b37SSimon Glass ut_assert(priv); 61206d4d2bSSimon Glass ut_assert(device_active(dev)); 6202c07b37SSimon Glass 6302c07b37SSimon Glass return 0; 6402c07b37SSimon Glass } 6502c07b37SSimon Glass 6654c5d08aSHeiko Schocher static int test_post_probe(struct udevice *dev) 672e7d35d2SSimon Glass { 6854c5d08aSHeiko Schocher struct udevice *prev = list_entry(dev->uclass_node.prev, 6954c5d08aSHeiko Schocher struct udevice, uclass_node); 7054c5d08aSHeiko Schocher 71e564f054SSimon Glass struct dm_test_uclass_perdev_priv *priv = dev_get_uclass_priv(dev); 722e7d35d2SSimon Glass struct uclass *uc = dev->uclass; 732e7d35d2SSimon Glass 742e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_POST_PROBE]++; 752e7d35d2SSimon Glass ut_assert(priv); 762e7d35d2SSimon Glass ut_assert(device_active(dev)); 772e7d35d2SSimon Glass priv->base_add = 0; 782e7d35d2SSimon Glass if (dms->skip_post_probe) 792e7d35d2SSimon Glass return 0; 802e7d35d2SSimon Glass if (&prev->uclass_node != &uc->dev_head) { 812e7d35d2SSimon Glass struct dm_test_uclass_perdev_priv *prev_uc_priv 82e564f054SSimon Glass = dev_get_uclass_priv(prev); 832e7d35d2SSimon Glass struct dm_test_pdata *pdata = prev->platdata; 842e7d35d2SSimon Glass 852e7d35d2SSimon Glass ut_assert(pdata); 862e7d35d2SSimon Glass ut_assert(prev_uc_priv); 872e7d35d2SSimon Glass priv->base_add = prev_uc_priv->base_add + pdata->ping_add; 882e7d35d2SSimon Glass } 892e7d35d2SSimon Glass 902e7d35d2SSimon Glass return 0; 912e7d35d2SSimon Glass } 922e7d35d2SSimon Glass 9354c5d08aSHeiko Schocher static int test_pre_remove(struct udevice *dev) 942e7d35d2SSimon Glass { 952e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_PRE_REMOVE]++; 962e7d35d2SSimon Glass 972e7d35d2SSimon Glass return 0; 982e7d35d2SSimon Glass } 992e7d35d2SSimon Glass 1002e7d35d2SSimon Glass static int test_init(struct uclass *uc) 1012e7d35d2SSimon Glass { 1022e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_INIT]++; 1032e7d35d2SSimon Glass ut_assert(uc->priv); 1042e7d35d2SSimon Glass 1052e7d35d2SSimon Glass return 0; 1062e7d35d2SSimon Glass } 1072e7d35d2SSimon Glass 1082e7d35d2SSimon Glass static int test_destroy(struct uclass *uc) 1092e7d35d2SSimon Glass { 1102e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_DESTROY]++; 1112e7d35d2SSimon Glass 1122e7d35d2SSimon Glass return 0; 1132e7d35d2SSimon Glass } 1142e7d35d2SSimon Glass 1152e7d35d2SSimon Glass UCLASS_DRIVER(test) = { 1162e7d35d2SSimon Glass .name = "test", 1172e7d35d2SSimon Glass .id = UCLASS_TEST, 1182e7d35d2SSimon Glass .post_bind = test_post_bind, 1192e7d35d2SSimon Glass .pre_unbind = test_pre_unbind, 12002c07b37SSimon Glass .pre_probe = test_pre_probe, 1212e7d35d2SSimon Glass .post_probe = test_post_probe, 1222e7d35d2SSimon Glass .pre_remove = test_pre_remove, 1232e7d35d2SSimon Glass .init = test_init, 1242e7d35d2SSimon Glass .destroy = test_destroy, 1252e7d35d2SSimon Glass .priv_auto_alloc_size = sizeof(struct dm_test_uclass_priv), 1262e7d35d2SSimon Glass .per_device_auto_alloc_size = sizeof(struct dm_test_uclass_perdev_priv), 127*754e71e8SPrzemyslaw Marczak .per_device_platdata_auto_alloc_size = 128*754e71e8SPrzemyslaw Marczak sizeof(struct dm_test_perdev_uc_pdata), 1292e7d35d2SSimon Glass }; 130