xref: /openbmc/u-boot/drivers/hwspinlock/sandbox_hwspinlock.c (revision 3589025867274ff28f689029ab8323301771c8ec)
1*7f84fc67SBenjamin Gaignard // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
2*7f84fc67SBenjamin Gaignard /*
3*7f84fc67SBenjamin Gaignard  * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
4*7f84fc67SBenjamin Gaignard  */
5*7f84fc67SBenjamin Gaignard 
6*7f84fc67SBenjamin Gaignard #include <common.h>
7*7f84fc67SBenjamin Gaignard #include <dm.h>
8*7f84fc67SBenjamin Gaignard #include <hwspinlock.h>
9*7f84fc67SBenjamin Gaignard #include <asm/state.h>
10*7f84fc67SBenjamin Gaignard 
sandbox_lock(struct udevice * dev,int index)11*7f84fc67SBenjamin Gaignard static int sandbox_lock(struct udevice *dev, int index)
12*7f84fc67SBenjamin Gaignard {
13*7f84fc67SBenjamin Gaignard 	struct sandbox_state *state = state_get_current();
14*7f84fc67SBenjamin Gaignard 
15*7f84fc67SBenjamin Gaignard 	if (index != 0)
16*7f84fc67SBenjamin Gaignard 		return -1;
17*7f84fc67SBenjamin Gaignard 
18*7f84fc67SBenjamin Gaignard 	if (state->hwspinlock)
19*7f84fc67SBenjamin Gaignard 		return -1;
20*7f84fc67SBenjamin Gaignard 
21*7f84fc67SBenjamin Gaignard 	state->hwspinlock = true;
22*7f84fc67SBenjamin Gaignard 
23*7f84fc67SBenjamin Gaignard 	return 0;
24*7f84fc67SBenjamin Gaignard }
25*7f84fc67SBenjamin Gaignard 
sandbox_unlock(struct udevice * dev,int index)26*7f84fc67SBenjamin Gaignard static int sandbox_unlock(struct udevice *dev, int index)
27*7f84fc67SBenjamin Gaignard {
28*7f84fc67SBenjamin Gaignard 	struct sandbox_state *state = state_get_current();
29*7f84fc67SBenjamin Gaignard 
30*7f84fc67SBenjamin Gaignard 	if (index != 0)
31*7f84fc67SBenjamin Gaignard 		return -1;
32*7f84fc67SBenjamin Gaignard 
33*7f84fc67SBenjamin Gaignard 	if (!state->hwspinlock)
34*7f84fc67SBenjamin Gaignard 		return -1;
35*7f84fc67SBenjamin Gaignard 
36*7f84fc67SBenjamin Gaignard 	state->hwspinlock = false;
37*7f84fc67SBenjamin Gaignard 
38*7f84fc67SBenjamin Gaignard 	return 0;
39*7f84fc67SBenjamin Gaignard }
40*7f84fc67SBenjamin Gaignard 
41*7f84fc67SBenjamin Gaignard static const struct hwspinlock_ops sandbox_hwspinlock_ops = {
42*7f84fc67SBenjamin Gaignard 	.lock = sandbox_lock,
43*7f84fc67SBenjamin Gaignard 	.unlock = sandbox_unlock,
44*7f84fc67SBenjamin Gaignard };
45*7f84fc67SBenjamin Gaignard 
46*7f84fc67SBenjamin Gaignard static const struct udevice_id sandbox_hwspinlock_ids[] = {
47*7f84fc67SBenjamin Gaignard 	{ .compatible = "sandbox,hwspinlock" },
48*7f84fc67SBenjamin Gaignard 	{}
49*7f84fc67SBenjamin Gaignard };
50*7f84fc67SBenjamin Gaignard 
51*7f84fc67SBenjamin Gaignard U_BOOT_DRIVER(hwspinlock_sandbox) = {
52*7f84fc67SBenjamin Gaignard 	.name = "hwspinlock_sandbox",
53*7f84fc67SBenjamin Gaignard 	.id = UCLASS_HWSPINLOCK,
54*7f84fc67SBenjamin Gaignard 	.of_match = sandbox_hwspinlock_ids,
55*7f84fc67SBenjamin Gaignard 	.ops = &sandbox_hwspinlock_ops,
56*7f84fc67SBenjamin Gaignard };
57