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