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 { 332e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_POST_BIND]++; 34*206d4d2bSSimon Glass ut_assert(!device_active(dev)); 352e7d35d2SSimon Glass 362e7d35d2SSimon Glass return 0; 372e7d35d2SSimon Glass } 382e7d35d2SSimon Glass 3954c5d08aSHeiko Schocher static int test_pre_unbind(struct udevice *dev) 402e7d35d2SSimon Glass { 412e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_PRE_UNBIND]++; 422e7d35d2SSimon Glass 432e7d35d2SSimon Glass return 0; 442e7d35d2SSimon Glass } 452e7d35d2SSimon Glass 4602c07b37SSimon Glass static int test_pre_probe(struct udevice *dev) 4702c07b37SSimon Glass { 4802c07b37SSimon Glass struct dm_test_uclass_perdev_priv *priv = dev_get_uclass_priv(dev); 4902c07b37SSimon Glass 5002c07b37SSimon Glass dm_testdrv_op_count[DM_TEST_OP_PRE_PROBE]++; 5102c07b37SSimon Glass ut_assert(priv); 52*206d4d2bSSimon Glass ut_assert(device_active(dev)); 5302c07b37SSimon Glass 5402c07b37SSimon Glass return 0; 5502c07b37SSimon Glass } 5602c07b37SSimon Glass 5754c5d08aSHeiko Schocher static int test_post_probe(struct udevice *dev) 582e7d35d2SSimon Glass { 5954c5d08aSHeiko Schocher struct udevice *prev = list_entry(dev->uclass_node.prev, 6054c5d08aSHeiko Schocher struct udevice, uclass_node); 6154c5d08aSHeiko Schocher 62e564f054SSimon Glass struct dm_test_uclass_perdev_priv *priv = dev_get_uclass_priv(dev); 632e7d35d2SSimon Glass struct uclass *uc = dev->uclass; 642e7d35d2SSimon Glass 652e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_POST_PROBE]++; 662e7d35d2SSimon Glass ut_assert(priv); 672e7d35d2SSimon Glass ut_assert(device_active(dev)); 682e7d35d2SSimon Glass priv->base_add = 0; 692e7d35d2SSimon Glass if (dms->skip_post_probe) 702e7d35d2SSimon Glass return 0; 712e7d35d2SSimon Glass if (&prev->uclass_node != &uc->dev_head) { 722e7d35d2SSimon Glass struct dm_test_uclass_perdev_priv *prev_uc_priv 73e564f054SSimon Glass = dev_get_uclass_priv(prev); 742e7d35d2SSimon Glass struct dm_test_pdata *pdata = prev->platdata; 752e7d35d2SSimon Glass 762e7d35d2SSimon Glass ut_assert(pdata); 772e7d35d2SSimon Glass ut_assert(prev_uc_priv); 782e7d35d2SSimon Glass priv->base_add = prev_uc_priv->base_add + pdata->ping_add; 792e7d35d2SSimon Glass } 802e7d35d2SSimon Glass 812e7d35d2SSimon Glass return 0; 822e7d35d2SSimon Glass } 832e7d35d2SSimon Glass 8454c5d08aSHeiko Schocher static int test_pre_remove(struct udevice *dev) 852e7d35d2SSimon Glass { 862e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_PRE_REMOVE]++; 872e7d35d2SSimon Glass 882e7d35d2SSimon Glass return 0; 892e7d35d2SSimon Glass } 902e7d35d2SSimon Glass 912e7d35d2SSimon Glass static int test_init(struct uclass *uc) 922e7d35d2SSimon Glass { 932e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_INIT]++; 942e7d35d2SSimon Glass ut_assert(uc->priv); 952e7d35d2SSimon Glass 962e7d35d2SSimon Glass return 0; 972e7d35d2SSimon Glass } 982e7d35d2SSimon Glass 992e7d35d2SSimon Glass static int test_destroy(struct uclass *uc) 1002e7d35d2SSimon Glass { 1012e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_DESTROY]++; 1022e7d35d2SSimon Glass 1032e7d35d2SSimon Glass return 0; 1042e7d35d2SSimon Glass } 1052e7d35d2SSimon Glass 1062e7d35d2SSimon Glass UCLASS_DRIVER(test) = { 1072e7d35d2SSimon Glass .name = "test", 1082e7d35d2SSimon Glass .id = UCLASS_TEST, 1092e7d35d2SSimon Glass .post_bind = test_post_bind, 1102e7d35d2SSimon Glass .pre_unbind = test_pre_unbind, 11102c07b37SSimon Glass .pre_probe = test_pre_probe, 1122e7d35d2SSimon Glass .post_probe = test_post_probe, 1132e7d35d2SSimon Glass .pre_remove = test_pre_remove, 1142e7d35d2SSimon Glass .init = test_init, 1152e7d35d2SSimon Glass .destroy = test_destroy, 1162e7d35d2SSimon Glass .priv_auto_alloc_size = sizeof(struct dm_test_uclass_priv), 1172e7d35d2SSimon Glass .per_device_auto_alloc_size = sizeof(struct dm_test_uclass_perdev_priv), 1182e7d35d2SSimon Glass }; 119