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 <dm.h> 12*2e7d35d2SSimon Glass #include <errno.h> 13*2e7d35d2SSimon Glass #include <malloc.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 18*2e7d35d2SSimon Glass int dm_testdrv_op_count[DM_TEST_OP_COUNT]; 19*2e7d35d2SSimon Glass static struct dm_test_state *dms = &global_test_state; 20*2e7d35d2SSimon Glass 21*2e7d35d2SSimon Glass static int testdrv_ping(struct device *dev, int pingval, int *pingret) 22*2e7d35d2SSimon Glass { 23*2e7d35d2SSimon Glass const struct dm_test_pdata *pdata = dev_get_platdata(dev); 24*2e7d35d2SSimon Glass struct dm_test_priv *priv = dev_get_priv(dev); 25*2e7d35d2SSimon Glass 26*2e7d35d2SSimon Glass *pingret = pingval + pdata->ping_add; 27*2e7d35d2SSimon Glass priv->ping_total += *pingret; 28*2e7d35d2SSimon Glass 29*2e7d35d2SSimon Glass return 0; 30*2e7d35d2SSimon Glass } 31*2e7d35d2SSimon Glass 32*2e7d35d2SSimon Glass static const struct test_ops test_ops = { 33*2e7d35d2SSimon Glass .ping = testdrv_ping, 34*2e7d35d2SSimon Glass }; 35*2e7d35d2SSimon Glass 36*2e7d35d2SSimon Glass static int test_bind(struct device *dev) 37*2e7d35d2SSimon Glass { 38*2e7d35d2SSimon Glass /* Private data should not be allocated */ 39*2e7d35d2SSimon Glass ut_assert(!dev_get_priv(dev)); 40*2e7d35d2SSimon Glass 41*2e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_BIND]++; 42*2e7d35d2SSimon Glass return 0; 43*2e7d35d2SSimon Glass } 44*2e7d35d2SSimon Glass 45*2e7d35d2SSimon Glass static int test_probe(struct device *dev) 46*2e7d35d2SSimon Glass { 47*2e7d35d2SSimon Glass struct dm_test_priv *priv = dev_get_priv(dev); 48*2e7d35d2SSimon Glass 49*2e7d35d2SSimon Glass /* Private data should be allocated */ 50*2e7d35d2SSimon Glass ut_assert(priv); 51*2e7d35d2SSimon Glass 52*2e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_PROBE]++; 53*2e7d35d2SSimon Glass priv->ping_total += DM_TEST_START_TOTAL; 54*2e7d35d2SSimon Glass return 0; 55*2e7d35d2SSimon Glass } 56*2e7d35d2SSimon Glass 57*2e7d35d2SSimon Glass static int test_remove(struct device *dev) 58*2e7d35d2SSimon Glass { 59*2e7d35d2SSimon Glass /* Private data should still be allocated */ 60*2e7d35d2SSimon Glass ut_assert(dev_get_priv(dev)); 61*2e7d35d2SSimon Glass 62*2e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_REMOVE]++; 63*2e7d35d2SSimon Glass return 0; 64*2e7d35d2SSimon Glass } 65*2e7d35d2SSimon Glass 66*2e7d35d2SSimon Glass static int test_unbind(struct device *dev) 67*2e7d35d2SSimon Glass { 68*2e7d35d2SSimon Glass /* Private data should not be allocated */ 69*2e7d35d2SSimon Glass ut_assert(!dev->priv); 70*2e7d35d2SSimon Glass 71*2e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_UNBIND]++; 72*2e7d35d2SSimon Glass return 0; 73*2e7d35d2SSimon Glass } 74*2e7d35d2SSimon Glass 75*2e7d35d2SSimon Glass U_BOOT_DRIVER(test_drv) = { 76*2e7d35d2SSimon Glass .name = "test_drv", 77*2e7d35d2SSimon Glass .id = UCLASS_TEST, 78*2e7d35d2SSimon Glass .ops = &test_ops, 79*2e7d35d2SSimon Glass .bind = test_bind, 80*2e7d35d2SSimon Glass .probe = test_probe, 81*2e7d35d2SSimon Glass .remove = test_remove, 82*2e7d35d2SSimon Glass .unbind = test_unbind, 83*2e7d35d2SSimon Glass .priv_auto_alloc_size = sizeof(struct dm_test_priv), 84*2e7d35d2SSimon Glass }; 85*2e7d35d2SSimon Glass 86*2e7d35d2SSimon Glass U_BOOT_DRIVER(test2_drv) = { 87*2e7d35d2SSimon Glass .name = "test2_drv", 88*2e7d35d2SSimon Glass .id = UCLASS_TEST, 89*2e7d35d2SSimon Glass .ops = &test_ops, 90*2e7d35d2SSimon Glass .bind = test_bind, 91*2e7d35d2SSimon Glass .probe = test_probe, 92*2e7d35d2SSimon Glass .remove = test_remove, 93*2e7d35d2SSimon Glass .unbind = test_unbind, 94*2e7d35d2SSimon Glass .priv_auto_alloc_size = sizeof(struct dm_test_priv), 95*2e7d35d2SSimon Glass }; 96*2e7d35d2SSimon Glass 97*2e7d35d2SSimon Glass static int test_manual_drv_ping(struct device *dev, int pingval, int *pingret) 98*2e7d35d2SSimon Glass { 99*2e7d35d2SSimon Glass *pingret = pingval + 2; 100*2e7d35d2SSimon Glass 101*2e7d35d2SSimon Glass return 0; 102*2e7d35d2SSimon Glass } 103*2e7d35d2SSimon Glass 104*2e7d35d2SSimon Glass static const struct test_ops test_manual_ops = { 105*2e7d35d2SSimon Glass .ping = test_manual_drv_ping, 106*2e7d35d2SSimon Glass }; 107*2e7d35d2SSimon Glass 108*2e7d35d2SSimon Glass static int test_manual_bind(struct device *dev) 109*2e7d35d2SSimon Glass { 110*2e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_BIND]++; 111*2e7d35d2SSimon Glass 112*2e7d35d2SSimon Glass return 0; 113*2e7d35d2SSimon Glass } 114*2e7d35d2SSimon Glass 115*2e7d35d2SSimon Glass static int test_manual_probe(struct device *dev) 116*2e7d35d2SSimon Glass { 117*2e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_PROBE]++; 118*2e7d35d2SSimon Glass if (!dms->force_fail_alloc) 119*2e7d35d2SSimon Glass dev->priv = calloc(1, sizeof(struct dm_test_priv)); 120*2e7d35d2SSimon Glass if (!dev->priv) 121*2e7d35d2SSimon Glass return -ENOMEM; 122*2e7d35d2SSimon Glass 123*2e7d35d2SSimon Glass return 0; 124*2e7d35d2SSimon Glass } 125*2e7d35d2SSimon Glass 126*2e7d35d2SSimon Glass static int test_manual_remove(struct device *dev) 127*2e7d35d2SSimon Glass { 128*2e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_REMOVE]++; 129*2e7d35d2SSimon Glass return 0; 130*2e7d35d2SSimon Glass } 131*2e7d35d2SSimon Glass 132*2e7d35d2SSimon Glass static int test_manual_unbind(struct device *dev) 133*2e7d35d2SSimon Glass { 134*2e7d35d2SSimon Glass dm_testdrv_op_count[DM_TEST_OP_UNBIND]++; 135*2e7d35d2SSimon Glass return 0; 136*2e7d35d2SSimon Glass } 137*2e7d35d2SSimon Glass 138*2e7d35d2SSimon Glass U_BOOT_DRIVER(test_manual_drv) = { 139*2e7d35d2SSimon Glass .name = "test_manual_drv", 140*2e7d35d2SSimon Glass .id = UCLASS_TEST, 141*2e7d35d2SSimon Glass .ops = &test_manual_ops, 142*2e7d35d2SSimon Glass .bind = test_manual_bind, 143*2e7d35d2SSimon Glass .probe = test_manual_probe, 144*2e7d35d2SSimon Glass .remove = test_manual_remove, 145*2e7d35d2SSimon Glass .unbind = test_manual_unbind, 146*2e7d35d2SSimon Glass }; 147