mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-16 09:54:35 +00:00
dm: Add Hardware Spinlock class
This is uclass for Hardware Spinlocks. It implements two mandatory operations: lock and unlock and one optional relax operation. Signed-off-by: Benjamin Gaignard <benjamin.gaignard@linaro.org> Reviewed-by: Simon Glass <sjg@chromium.org> Reviewed-by: Patrice Chotard <patrice.chotard@st.com>
This commit is contained in:
parent
3b074fb22b
commit
7f84fc670b
13 changed files with 414 additions and 0 deletions
|
@ -742,6 +742,10 @@
|
||||||
pinctrl {
|
pinctrl {
|
||||||
compatible = "sandbox,pinctrl";
|
compatible = "sandbox,pinctrl";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
hwspinlock@0 {
|
||||||
|
compatible = "sandbox,hwspinlock";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
#include "sandbox_pmic.dtsi"
|
#include "sandbox_pmic.dtsi"
|
||||||
|
|
|
@ -101,6 +101,7 @@ struct sandbox_state {
|
||||||
|
|
||||||
ulong next_tag; /* Next address tag to allocate */
|
ulong next_tag; /* Next address tag to allocate */
|
||||||
struct list_head mapmem_head; /* struct sandbox_mapmem_entry */
|
struct list_head mapmem_head; /* struct sandbox_mapmem_entry */
|
||||||
|
bool hwspinlock; /* Hardware Spinlock status */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Minimum space we guarantee in the state FDT when calling read/write*/
|
/* Minimum space we guarantee in the state FDT when calling read/write*/
|
||||||
|
|
|
@ -96,6 +96,8 @@ CONFIG_BOARD=y
|
||||||
CONFIG_BOARD_SANDBOX=y
|
CONFIG_BOARD_SANDBOX=y
|
||||||
CONFIG_PM8916_GPIO=y
|
CONFIG_PM8916_GPIO=y
|
||||||
CONFIG_SANDBOX_GPIO=y
|
CONFIG_SANDBOX_GPIO=y
|
||||||
|
CONFIG_DM_HWSPINLOCK=y
|
||||||
|
CONFIG_HWSPINLOCK_SANDBOX=y
|
||||||
CONFIG_DM_I2C_COMPAT=y
|
CONFIG_DM_I2C_COMPAT=y
|
||||||
CONFIG_I2C_CROS_EC_TUNNEL=y
|
CONFIG_I2C_CROS_EC_TUNNEL=y
|
||||||
CONFIG_I2C_CROS_EC_LDO=y
|
CONFIG_I2C_CROS_EC_LDO=y
|
||||||
|
|
|
@ -40,6 +40,8 @@ source "drivers/fpga/Kconfig"
|
||||||
|
|
||||||
source "drivers/gpio/Kconfig"
|
source "drivers/gpio/Kconfig"
|
||||||
|
|
||||||
|
source "drivers/hwspinlock/Kconfig"
|
||||||
|
|
||||||
source "drivers/i2c/Kconfig"
|
source "drivers/i2c/Kconfig"
|
||||||
|
|
||||||
source "drivers/input/Kconfig"
|
source "drivers/input/Kconfig"
|
||||||
|
|
|
@ -113,4 +113,5 @@ obj-$(CONFIG_W1) += w1/
|
||||||
obj-$(CONFIG_W1_EEPROM) += w1-eeprom/
|
obj-$(CONFIG_W1_EEPROM) += w1-eeprom/
|
||||||
|
|
||||||
obj-$(CONFIG_MACH_PIC32) += ddr/microchip/
|
obj-$(CONFIG_MACH_PIC32) += ddr/microchip/
|
||||||
|
obj-$(CONFIG_DM_HWSPINLOCK) += hwspinlock/
|
||||||
endif
|
endif
|
||||||
|
|
16
drivers/hwspinlock/Kconfig
Normal file
16
drivers/hwspinlock/Kconfig
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
menu "Hardware Spinlock Support"
|
||||||
|
|
||||||
|
config DM_HWSPINLOCK
|
||||||
|
bool "Enable U-Boot hardware spinlock support"
|
||||||
|
help
|
||||||
|
This option enables U-Boot hardware spinlock support
|
||||||
|
|
||||||
|
config HWSPINLOCK_SANDBOX
|
||||||
|
bool "Enable Hardware Spinlock support for Sandbox"
|
||||||
|
depends on SANDBOX && DM_HWSPINLOCK
|
||||||
|
help
|
||||||
|
Enable hardware spinlock support in Sandbox. This is a dummy device that
|
||||||
|
can be probed and support all the methods of HWSPINLOCK, but does not
|
||||||
|
really do anything.
|
||||||
|
|
||||||
|
endmenu
|
6
drivers/hwspinlock/Makefile
Normal file
6
drivers/hwspinlock/Makefile
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
|
||||||
|
#
|
||||||
|
# Copyright (C) 2018, STMicroelectronics - All Rights Reserved
|
||||||
|
|
||||||
|
obj-$(CONFIG_DM_HWSPINLOCK) += hwspinlock-uclass.o
|
||||||
|
obj-$(CONFIG_HWSPINLOCK_SANDBOX) += sandbox_hwspinlock.o
|
144
drivers/hwspinlock/hwspinlock-uclass.c
Normal file
144
drivers/hwspinlock/hwspinlock-uclass.c
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018, STMicroelectronics - All Rights Reserved
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <dm.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <hwspinlock.h>
|
||||||
|
#include <dm/device-internal.h>
|
||||||
|
|
||||||
|
static inline const struct hwspinlock_ops *
|
||||||
|
hwspinlock_dev_ops(struct udevice *dev)
|
||||||
|
{
|
||||||
|
return (const struct hwspinlock_ops *)dev->driver->ops;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int hwspinlock_of_xlate_default(struct hwspinlock *hws,
|
||||||
|
struct ofnode_phandle_args *args)
|
||||||
|
{
|
||||||
|
if (args->args_count > 1) {
|
||||||
|
debug("Invaild args_count: %d\n", args->args_count);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args->args_count)
|
||||||
|
hws->id = args->args[0];
|
||||||
|
else
|
||||||
|
hws->id = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int hwspinlock_get_by_index(struct udevice *dev, int index,
|
||||||
|
struct hwspinlock *hws)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
struct ofnode_phandle_args args;
|
||||||
|
struct udevice *dev_hws;
|
||||||
|
const struct hwspinlock_ops *ops;
|
||||||
|
|
||||||
|
assert(hws);
|
||||||
|
hws->dev = NULL;
|
||||||
|
|
||||||
|
ret = dev_read_phandle_with_args(dev, "hwlocks", "#hwlock-cells", 1,
|
||||||
|
index, &args);
|
||||||
|
if (ret) {
|
||||||
|
dev_dbg(dev, "%s: dev_read_phandle_with_args: err=%d\n",
|
||||||
|
__func__, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = uclass_get_device_by_ofnode(UCLASS_HWSPINLOCK,
|
||||||
|
args.node, &dev_hws);
|
||||||
|
if (ret) {
|
||||||
|
dev_dbg(dev,
|
||||||
|
"%s: uclass_get_device_by_of_offset failed: err=%d\n",
|
||||||
|
__func__, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
hws->dev = dev_hws;
|
||||||
|
|
||||||
|
ops = hwspinlock_dev_ops(dev_hws);
|
||||||
|
|
||||||
|
if (ops->of_xlate)
|
||||||
|
ret = ops->of_xlate(hws, &args);
|
||||||
|
else
|
||||||
|
ret = hwspinlock_of_xlate_default(hws, &args);
|
||||||
|
if (ret)
|
||||||
|
dev_dbg(dev, "of_xlate() failed: %d\n", ret);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int hwspinlock_lock_timeout(struct hwspinlock *hws, unsigned int timeout)
|
||||||
|
{
|
||||||
|
const struct hwspinlock_ops *ops;
|
||||||
|
ulong start;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
assert(hws);
|
||||||
|
|
||||||
|
if (!hws->dev)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
ops = hwspinlock_dev_ops(hws->dev);
|
||||||
|
if (!ops->lock)
|
||||||
|
return -ENOSYS;
|
||||||
|
|
||||||
|
start = get_timer(0);
|
||||||
|
do {
|
||||||
|
ret = ops->lock(hws->dev, hws->id);
|
||||||
|
if (!ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (ops->relax)
|
||||||
|
ops->relax(hws->dev);
|
||||||
|
} while (get_timer(start) < timeout);
|
||||||
|
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
int hwspinlock_unlock(struct hwspinlock *hws)
|
||||||
|
{
|
||||||
|
const struct hwspinlock_ops *ops;
|
||||||
|
|
||||||
|
assert(hws);
|
||||||
|
|
||||||
|
if (!hws->dev)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
ops = hwspinlock_dev_ops(hws->dev);
|
||||||
|
if (!ops->unlock)
|
||||||
|
return -ENOSYS;
|
||||||
|
|
||||||
|
return ops->unlock(hws->dev, hws->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int hwspinlock_post_bind(struct udevice *dev)
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_NEEDS_MANUAL_RELOC)
|
||||||
|
struct hwspinlock_ops *ops = device_get_ops(dev);
|
||||||
|
static int reloc_done;
|
||||||
|
|
||||||
|
if (!reloc_done) {
|
||||||
|
if (ops->lock)
|
||||||
|
ops->lock += gd->reloc_off;
|
||||||
|
if (ops->unlock)
|
||||||
|
ops->unlock += gd->reloc_off;
|
||||||
|
if (ops->relax)
|
||||||
|
ops->relax += gd->reloc_off;
|
||||||
|
|
||||||
|
reloc_done++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
UCLASS_DRIVER(hwspinlock) = {
|
||||||
|
.id = UCLASS_HWSPINLOCK,
|
||||||
|
.name = "hwspinlock",
|
||||||
|
.post_bind = hwspinlock_post_bind,
|
||||||
|
};
|
56
drivers/hwspinlock/sandbox_hwspinlock.c
Normal file
56
drivers/hwspinlock/sandbox_hwspinlock.c
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018, STMicroelectronics - All Rights Reserved
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <dm.h>
|
||||||
|
#include <hwspinlock.h>
|
||||||
|
#include <asm/state.h>
|
||||||
|
|
||||||
|
static int sandbox_lock(struct udevice *dev, int index)
|
||||||
|
{
|
||||||
|
struct sandbox_state *state = state_get_current();
|
||||||
|
|
||||||
|
if (index != 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (state->hwspinlock)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
state->hwspinlock = true;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sandbox_unlock(struct udevice *dev, int index)
|
||||||
|
{
|
||||||
|
struct sandbox_state *state = state_get_current();
|
||||||
|
|
||||||
|
if (index != 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (!state->hwspinlock)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
state->hwspinlock = false;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct hwspinlock_ops sandbox_hwspinlock_ops = {
|
||||||
|
.lock = sandbox_lock,
|
||||||
|
.unlock = sandbox_unlock,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct udevice_id sandbox_hwspinlock_ids[] = {
|
||||||
|
{ .compatible = "sandbox,hwspinlock" },
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
U_BOOT_DRIVER(hwspinlock_sandbox) = {
|
||||||
|
.name = "hwspinlock_sandbox",
|
||||||
|
.id = UCLASS_HWSPINLOCK,
|
||||||
|
.of_match = sandbox_hwspinlock_ids,
|
||||||
|
.ops = &sandbox_hwspinlock_ops,
|
||||||
|
};
|
|
@ -42,6 +42,7 @@ enum uclass_id {
|
||||||
UCLASS_FIRMWARE, /* Firmware */
|
UCLASS_FIRMWARE, /* Firmware */
|
||||||
UCLASS_FS_FIRMWARE_LOADER, /* Generic loader */
|
UCLASS_FS_FIRMWARE_LOADER, /* Generic loader */
|
||||||
UCLASS_GPIO, /* Bank of general-purpose I/O pins */
|
UCLASS_GPIO, /* Bank of general-purpose I/O pins */
|
||||||
|
UCLASS_HWSPINLOCK, /* Hardware semaphores */
|
||||||
UCLASS_I2C, /* I2C bus */
|
UCLASS_I2C, /* I2C bus */
|
||||||
UCLASS_I2C_EEPROM, /* I2C EEPROM device */
|
UCLASS_I2C_EEPROM, /* I2C EEPROM device */
|
||||||
UCLASS_I2C_GENERIC, /* Generic I2C device */
|
UCLASS_I2C_GENERIC, /* Generic I2C device */
|
||||||
|
|
140
include/hwspinlock.h
Normal file
140
include/hwspinlock.h
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018, STMicroelectronics - All Rights Reserved
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HWSPINLOCK_H_
|
||||||
|
#define _HWSPINLOCK_H_
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement a hwspinlock uclass.
|
||||||
|
* Hardware spinlocks are used to perform hardware protection of
|
||||||
|
* critical sections and synchronisation between multiprocessors.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct udevice;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct hwspinlock - A handle to (allowing control of) a single hardware
|
||||||
|
* spinlock.
|
||||||
|
*
|
||||||
|
* @dev: The device which implements the hardware spinlock.
|
||||||
|
* @id: The hardware spinlock ID within the provider.
|
||||||
|
*/
|
||||||
|
struct hwspinlock {
|
||||||
|
struct udevice *dev;
|
||||||
|
unsigned long id;
|
||||||
|
};
|
||||||
|
|
||||||
|
#if CONFIG_IS_ENABLED(DM_HWSPINLOCK)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hwspinlock_get_by_index - Get a hardware spinlock by integer index
|
||||||
|
*
|
||||||
|
* This looks up and request a hardware spinlock. The index is relative to the
|
||||||
|
* client device; each device is assumed to have n hardware spinlock associated
|
||||||
|
* with it somehow, and this function finds and requests one of them.
|
||||||
|
*
|
||||||
|
* @dev: The client device.
|
||||||
|
* @index: The index of the hardware spinlock to request, within the
|
||||||
|
* client's list of hardware spinlock.
|
||||||
|
* @hws: A pointer to a hardware spinlock struct to initialize.
|
||||||
|
* @return 0 if OK, or a negative error code.
|
||||||
|
*/
|
||||||
|
int hwspinlock_get_by_index(struct udevice *dev,
|
||||||
|
int index, struct hwspinlock *hws);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lock the hardware spinlock
|
||||||
|
*
|
||||||
|
* @hws: A hardware spinlock struct that previously requested by
|
||||||
|
* hwspinlock_get_by_index
|
||||||
|
* @timeout: Timeout value in msecs
|
||||||
|
* @return: 0 if OK, -ETIMEDOUT if timeout, -ve on other errors
|
||||||
|
*/
|
||||||
|
int hwspinlock_lock_timeout(struct hwspinlock *hws, unsigned int timeout);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unlock the hardware spinlock
|
||||||
|
*
|
||||||
|
* @hws: A hardware spinlock struct that previously requested by
|
||||||
|
* hwspinlock_get_by_index
|
||||||
|
* @return: 0 if OK, -ve on error
|
||||||
|
*/
|
||||||
|
int hwspinlock_unlock(struct hwspinlock *hws);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static inline int hwspinlock_get_by_index(struct udevice *dev,
|
||||||
|
int index,
|
||||||
|
struct hwspinlock *hws)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int hwspinlock_lock_timeout(struct hwspinlock *hws,
|
||||||
|
int timeout)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int hwspinlock_unlock(struct hwspinlock *hws)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_DM_HWSPINLOCK */
|
||||||
|
|
||||||
|
struct ofnode_phandle_args;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct hwspinlock_ops - Driver model hwspinlock operations
|
||||||
|
*
|
||||||
|
* The uclass interface is implemented by all hwspinlock devices which use
|
||||||
|
* driver model.
|
||||||
|
*/
|
||||||
|
struct hwspinlock_ops {
|
||||||
|
/**
|
||||||
|
* of_xlate - Translate a client's device-tree (OF) hardware specifier.
|
||||||
|
*
|
||||||
|
* The hardware core calls this function as the first step in
|
||||||
|
* implementing a client's hwspinlock_get_by_*() call.
|
||||||
|
*
|
||||||
|
* @hws: The hardware spinlock struct to hold the translation
|
||||||
|
* result.
|
||||||
|
* @args: The hardware spinlock specifier values from device tree.
|
||||||
|
* @return 0 if OK, or a negative error code.
|
||||||
|
*/
|
||||||
|
int (*of_xlate)(struct hwspinlock *hws,
|
||||||
|
struct ofnode_phandle_args *args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lock the hardware spinlock
|
||||||
|
*
|
||||||
|
* @dev: hwspinlock Device
|
||||||
|
* @index: index of the lock to be used
|
||||||
|
* @return 0 if OK, -ve on error
|
||||||
|
*/
|
||||||
|
int (*lock)(struct udevice *dev, int index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unlock the hardware spinlock
|
||||||
|
*
|
||||||
|
* @dev: hwspinlock Device
|
||||||
|
* @index: index of the lock to be unlocked
|
||||||
|
* @return 0 if OK, -ve on error
|
||||||
|
*/
|
||||||
|
int (*unlock)(struct udevice *dev, int index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Relax - optional
|
||||||
|
* Platform-specific relax method, called by hwspinlock core
|
||||||
|
* while spinning on a lock, between two successive call to
|
||||||
|
* lock
|
||||||
|
*
|
||||||
|
* @dev: hwspinlock Device
|
||||||
|
*/
|
||||||
|
void (*relax)(struct udevice *dev);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _HWSPINLOCK_H_ */
|
|
@ -19,6 +19,7 @@ obj-$(CONFIG_CLK) += clk.o
|
||||||
obj-$(CONFIG_DM_ETH) += eth.o
|
obj-$(CONFIG_DM_ETH) += eth.o
|
||||||
obj-$(CONFIG_FIRMWARE) += firmware.o
|
obj-$(CONFIG_FIRMWARE) += firmware.o
|
||||||
obj-$(CONFIG_DM_GPIO) += gpio.o
|
obj-$(CONFIG_DM_GPIO) += gpio.o
|
||||||
|
obj-$(CONFIG_DM_HWSPINLOCK) += hwspinlock.o
|
||||||
obj-$(CONFIG_DM_I2C) += i2c.o
|
obj-$(CONFIG_DM_I2C) += i2c.o
|
||||||
obj-$(CONFIG_LED) += led.o
|
obj-$(CONFIG_LED) += led.o
|
||||||
obj-$(CONFIG_DM_MAILBOX) += mailbox.o
|
obj-$(CONFIG_DM_MAILBOX) += mailbox.o
|
||||||
|
|
40
test/dm/hwspinlock.c
Normal file
40
test/dm/hwspinlock.c
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018, STMicroelectronics - All Rights Reserved
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <dm.h>
|
||||||
|
#include <hwspinlock.h>
|
||||||
|
#include <asm/state.h>
|
||||||
|
#include <asm/test.h>
|
||||||
|
#include <dm/test.h>
|
||||||
|
#include <test/ut.h>
|
||||||
|
|
||||||
|
/* Test that hwspinlock driver functions are called */
|
||||||
|
static int dm_test_hwspinlock_base(struct unit_test_state *uts)
|
||||||
|
{
|
||||||
|
struct sandbox_state *state = state_get_current();
|
||||||
|
struct hwspinlock hws;
|
||||||
|
|
||||||
|
ut_assertok(uclass_get_device(UCLASS_HWSPINLOCK, 0, &hws.dev));
|
||||||
|
ut_assertnonnull(hws.dev);
|
||||||
|
ut_asserteq(false, state->hwspinlock);
|
||||||
|
|
||||||
|
hws.id = 0;
|
||||||
|
ut_assertok(hwspinlock_lock_timeout(&hws, 1));
|
||||||
|
ut_asserteq(true, state->hwspinlock);
|
||||||
|
|
||||||
|
ut_assertok(hwspinlock_unlock(&hws));
|
||||||
|
ut_asserteq(false, state->hwspinlock);
|
||||||
|
|
||||||
|
ut_assertok(hwspinlock_lock_timeout(&hws, 1));
|
||||||
|
ut_assertok(!hwspinlock_lock_timeout(&hws, 1));
|
||||||
|
|
||||||
|
ut_assertok(hwspinlock_unlock(&hws));
|
||||||
|
ut_assertok(!hwspinlock_unlock(&hws));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
DM_TEST(dm_test_hwspinlock_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
|
Loading…
Add table
Reference in a new issue