This adds a sandbox reset implementation (provider), a test client device, instantiates them both from Sandbox's DT, and adds a DM test that excercises everything. Signed-off-by: Stephen Warren <swarren@nvidia.com> Acked-by: Simon Glass <sjg@chromium.org>master
parent
89c1e2da78
commit
4581b717b1
@ -0,0 +1,21 @@ |
||||
/*
|
||||
* Copyright (c) 2016, NVIDIA CORPORATION. |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0 |
||||
*/ |
||||
|
||||
#ifndef __SANDBOX_RESET_H |
||||
#define __SANDBOX_RESET_H |
||||
|
||||
#include <common.h> |
||||
|
||||
struct udevice; |
||||
|
||||
int sandbox_reset_query(struct udevice *dev, unsigned long id); |
||||
|
||||
int sandbox_reset_test_get(struct udevice *dev); |
||||
int sandbox_reset_test_assert(struct udevice *dev); |
||||
int sandbox_reset_test_deassert(struct udevice *dev); |
||||
int sandbox_reset_test_free(struct udevice *dev); |
||||
|
||||
#endif |
@ -0,0 +1,55 @@ |
||||
/*
|
||||
* Copyright (c) 2016, NVIDIA CORPORATION. |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0 |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <dm.h> |
||||
#include <reset.h> |
||||
#include <asm/io.h> |
||||
#include <asm/reset.h> |
||||
|
||||
struct sandbox_reset_test { |
||||
struct reset_ctl ctl; |
||||
}; |
||||
|
||||
int sandbox_reset_test_get(struct udevice *dev) |
||||
{ |
||||
struct sandbox_reset_test *sbrt = dev_get_priv(dev); |
||||
|
||||
return reset_get_by_name(dev, "test", &sbrt->ctl); |
||||
} |
||||
|
||||
int sandbox_reset_test_assert(struct udevice *dev) |
||||
{ |
||||
struct sandbox_reset_test *sbrt = dev_get_priv(dev); |
||||
|
||||
return reset_assert(&sbrt->ctl); |
||||
} |
||||
|
||||
int sandbox_reset_test_deassert(struct udevice *dev) |
||||
{ |
||||
struct sandbox_reset_test *sbrt = dev_get_priv(dev); |
||||
|
||||
return reset_deassert(&sbrt->ctl); |
||||
} |
||||
|
||||
int sandbox_reset_test_free(struct udevice *dev) |
||||
{ |
||||
struct sandbox_reset_test *sbrt = dev_get_priv(dev); |
||||
|
||||
return reset_free(&sbrt->ctl); |
||||
} |
||||
|
||||
static const struct udevice_id sandbox_reset_test_ids[] = { |
||||
{ .compatible = "sandbox,reset-ctl-test" }, |
||||
{ } |
||||
}; |
||||
|
||||
U_BOOT_DRIVER(sandbox_reset_test) = { |
||||
.name = "sandbox_reset_test", |
||||
.id = UCLASS_MISC, |
||||
.of_match = sandbox_reset_test_ids, |
||||
.priv_auto_alloc_size = sizeof(struct sandbox_reset_test), |
||||
}; |
@ -0,0 +1,108 @@ |
||||
/*
|
||||
* Copyright (c) 2016, NVIDIA CORPORATION. |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0 |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <dm.h> |
||||
#include <reset-uclass.h> |
||||
#include <asm/io.h> |
||||
#include <asm/reset.h> |
||||
|
||||
#define SANDBOX_RESET_SIGNALS 3 |
||||
|
||||
struct sandbox_reset_signal { |
||||
bool asserted; |
||||
}; |
||||
|
||||
struct sandbox_reset { |
||||
struct sandbox_reset_signal signals[SANDBOX_RESET_SIGNALS]; |
||||
}; |
||||
|
||||
static int sandbox_reset_request(struct reset_ctl *reset_ctl) |
||||
{ |
||||
debug("%s(reset_ctl=%p)\n", __func__, reset_ctl); |
||||
|
||||
if (reset_ctl->id >= SANDBOX_RESET_SIGNALS) |
||||
return -EINVAL; |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int sandbox_reset_free(struct reset_ctl *reset_ctl) |
||||
{ |
||||
debug("%s(reset_ctl=%p)\n", __func__, reset_ctl); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int sandbox_reset_assert(struct reset_ctl *reset_ctl) |
||||
{ |
||||
struct sandbox_reset *sbr = dev_get_priv(reset_ctl->dev); |
||||
|
||||
debug("%s(reset_ctl=%p)\n", __func__, reset_ctl); |
||||
|
||||
sbr->signals[reset_ctl->id].asserted = true; |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int sandbox_reset_deassert(struct reset_ctl *reset_ctl) |
||||
{ |
||||
struct sandbox_reset *sbr = dev_get_priv(reset_ctl->dev); |
||||
|
||||
debug("%s(reset_ctl=%p)\n", __func__, reset_ctl); |
||||
|
||||
sbr->signals[reset_ctl->id].asserted = false; |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int sandbox_reset_bind(struct udevice *dev) |
||||
{ |
||||
debug("%s(dev=%p)\n", __func__, dev); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int sandbox_reset_probe(struct udevice *dev) |
||||
{ |
||||
debug("%s(dev=%p)\n", __func__, dev); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static const struct udevice_id sandbox_reset_ids[] = { |
||||
{ .compatible = "sandbox,reset-ctl" }, |
||||
{ } |
||||
}; |
||||
|
||||
struct reset_ops sandbox_reset_reset_ops = { |
||||
.request = sandbox_reset_request, |
||||
.free = sandbox_reset_free, |
||||
.rst_assert = sandbox_reset_assert, |
||||
.rst_deassert = sandbox_reset_deassert, |
||||
}; |
||||
|
||||
U_BOOT_DRIVER(sandbox_reset) = { |
||||
.name = "sandbox_reset", |
||||
.id = UCLASS_RESET, |
||||
.of_match = sandbox_reset_ids, |
||||
.bind = sandbox_reset_bind, |
||||
.probe = sandbox_reset_probe, |
||||
.priv_auto_alloc_size = sizeof(struct sandbox_reset), |
||||
.ops = &sandbox_reset_reset_ops, |
||||
}; |
||||
|
||||
int sandbox_reset_query(struct udevice *dev, unsigned long id) |
||||
{ |
||||
struct sandbox_reset *sbr = dev_get_priv(dev); |
||||
|
||||
debug("%s(dev=%p, id=%ld)\n", __func__, dev, id); |
||||
|
||||
if (id >= SANDBOX_RESET_SIGNALS) |
||||
return -EINVAL; |
||||
|
||||
return sbr->signals[id].asserted; |
||||
} |
@ -0,0 +1,39 @@ |
||||
/*
|
||||
* Copyright (c) 2016, NVIDIA CORPORATION. |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0 |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <dm.h> |
||||
#include <dm/test.h> |
||||
#include <asm/reset.h> |
||||
#include <test/ut.h> |
||||
|
||||
/* This must match the specifier for mbox-names="test" in the DT node */ |
||||
#define TEST_RESET_ID 2 |
||||
|
||||
static int dm_test_reset(struct unit_test_state *uts) |
||||
{ |
||||
struct udevice *dev_reset; |
||||
struct udevice *dev_test; |
||||
|
||||
ut_assertok(uclass_get_device_by_name(UCLASS_RESET, "reset-ctl", |
||||
&dev_reset)); |
||||
ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID)); |
||||
|
||||
ut_assertok(uclass_get_device_by_name(UCLASS_MISC, "reset-ctl-test", |
||||
&dev_test)); |
||||
ut_assertok(sandbox_reset_test_get(dev_test)); |
||||
|
||||
ut_assertok(sandbox_reset_test_assert(dev_test)); |
||||
ut_asserteq(1, sandbox_reset_query(dev_reset, TEST_RESET_ID)); |
||||
|
||||
ut_assertok(sandbox_reset_test_deassert(dev_test)); |
||||
ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID)); |
||||
|
||||
ut_assertok(sandbox_reset_test_free(dev_test)); |
||||
|
||||
return 0; |
||||
} |
||||
DM_TEST(dm_test_reset, DM_TESTF_SCAN_FDT); |
Loading…
Reference in new issue