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