1*2e7d35d2SSimon Glass /* 2*2e7d35d2SSimon Glass * Copyright (c) 2013 Google, Inc 3*2e7d35d2SSimon Glass * 4*2e7d35d2SSimon Glass * (C) Copyright 2012 5*2e7d35d2SSimon Glass * Pavel Herrmann <morpheus.ibis@gmail.com> 6*2e7d35d2SSimon Glass * 7*2e7d35d2SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 8*2e7d35d2SSimon Glass */ 9*2e7d35d2SSimon Glass 10*2e7d35d2SSimon Glass #include <common.h> 11*2e7d35d2SSimon Glass #include <malloc.h> 12*2e7d35d2SSimon Glass #include <dm.h> 13*2e7d35d2SSimon Glass #include <errno.h> 14*2e7d35d2SSimon Glass #include <dm/test.h> 15*2e7d35d2SSimon Glass #include <dm/ut.h> 16*2e7d35d2SSimon Glass #include <asm/io.h> 17*2e7d35d2SSimon Glass #include <linux/list.h> 18*2e7d35d2SSimon Glass 19*2e7d35d2SSimon Glass static struct dm_test_state *dms = &global_test_state; 20*2e7d35d2SSimon Glass 21*2e7d35d2SSimon Glass int test_ping(struct device *dev, int pingval, int *pingret) 22*2e7d35d2SSimon Glass { 23*2e7d35d2SSimon Glass const struct test_ops *ops = device_get_ops(dev); 24*2e7d35d2SSimon Glass 25*2e7d35d2SSimon Glass if (!ops->ping) 26*2e7d35d2SSimon Glass return -ENOSYS; 27*2e7d35d2SSimon Glass 28*2e7d35d2SSimon Glass return ops->ping(dev, pingval, pingret); 29*2e7d35d2SSimon Glass } 30*2e7d35d2SSimon Glass 31*2e7d35d2SSimon Glass static int test_post_bind(struct device *dev) 32*2e7d35d2SSimon Glass { 33*2e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_POST_BIND]++; 34*2e7d35d2SSimon Glass 35*2e7d35d2SSimon Glass return 0; 36*2e7d35d2SSimon Glass } 37*2e7d35d2SSimon Glass 38*2e7d35d2SSimon Glass static int test_pre_unbind(struct device *dev) 39*2e7d35d2SSimon Glass { 40*2e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_PRE_UNBIND]++; 41*2e7d35d2SSimon Glass 42*2e7d35d2SSimon Glass return 0; 43*2e7d35d2SSimon Glass } 44*2e7d35d2SSimon Glass 45*2e7d35d2SSimon Glass static int test_post_probe(struct device *dev) 46*2e7d35d2SSimon Glass { 47*2e7d35d2SSimon Glass struct device *prev = list_entry(dev->uclass_node.prev, struct device, 48*2e7d35d2SSimon Glass uclass_node); 49*2e7d35d2SSimon Glass struct dm_test_uclass_perdev_priv *priv = dev->uclass_priv; 50*2e7d35d2SSimon Glass struct uclass *uc = dev->uclass; 51*2e7d35d2SSimon Glass 52*2e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_POST_PROBE]++; 53*2e7d35d2SSimon Glass ut_assert(priv); 54*2e7d35d2SSimon Glass ut_assert(device_active(dev)); 55*2e7d35d2SSimon Glass priv->base_add = 0; 56*2e7d35d2SSimon Glass if (dms->skip_post_probe) 57*2e7d35d2SSimon Glass return 0; 58*2e7d35d2SSimon Glass if (&prev->uclass_node != &uc->dev_head) { 59*2e7d35d2SSimon Glass struct dm_test_uclass_perdev_priv *prev_uc_priv 60*2e7d35d2SSimon Glass = prev->uclass_priv; 61*2e7d35d2SSimon Glass struct dm_test_pdata *pdata = prev->platdata; 62*2e7d35d2SSimon Glass 63*2e7d35d2SSimon Glass ut_assert(pdata); 64*2e7d35d2SSimon Glass ut_assert(prev_uc_priv); 65*2e7d35d2SSimon Glass priv->base_add = prev_uc_priv->base_add + pdata->ping_add; 66*2e7d35d2SSimon Glass } 67*2e7d35d2SSimon Glass 68*2e7d35d2SSimon Glass return 0; 69*2e7d35d2SSimon Glass } 70*2e7d35d2SSimon Glass 71*2e7d35d2SSimon Glass static int test_pre_remove(struct device *dev) 72*2e7d35d2SSimon Glass { 73*2e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_PRE_REMOVE]++; 74*2e7d35d2SSimon Glass 75*2e7d35d2SSimon Glass return 0; 76*2e7d35d2SSimon Glass } 77*2e7d35d2SSimon Glass 78*2e7d35d2SSimon Glass static int test_init(struct uclass *uc) 79*2e7d35d2SSimon Glass { 80*2e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_INIT]++; 81*2e7d35d2SSimon Glass ut_assert(uc->priv); 82*2e7d35d2SSimon Glass 83*2e7d35d2SSimon Glass return 0; 84*2e7d35d2SSimon Glass } 85*2e7d35d2SSimon Glass 86*2e7d35d2SSimon Glass static int test_destroy(struct uclass *uc) 87*2e7d35d2SSimon Glass { 88*2e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_DESTROY]++; 89*2e7d35d2SSimon Glass 90*2e7d35d2SSimon Glass return 0; 91*2e7d35d2SSimon Glass } 92*2e7d35d2SSimon Glass 93*2e7d35d2SSimon Glass UCLASS_DRIVER(test) = { 94*2e7d35d2SSimon Glass .name = "test", 95*2e7d35d2SSimon Glass .id = UCLASS_TEST, 96*2e7d35d2SSimon Glass .post_bind = test_post_bind, 97*2e7d35d2SSimon Glass .pre_unbind = test_pre_unbind, 98*2e7d35d2SSimon Glass .post_probe = test_post_probe, 99*2e7d35d2SSimon Glass .pre_remove = test_pre_remove, 100*2e7d35d2SSimon Glass .init = test_init, 101*2e7d35d2SSimon Glass .destroy = test_destroy, 102*2e7d35d2SSimon Glass .priv_auto_alloc_size = sizeof(struct dm_test_uclass_priv), 103*2e7d35d2SSimon Glass .per_device_auto_alloc_size = sizeof(struct dm_test_uclass_perdev_priv), 104*2e7d35d2SSimon Glass }; 105