#include <linux/hwspinlock.h>
#include <linux/kernel.h>
#include <linux/mfd/syscon.h>
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/regmap.h>
#include "hwspinlock_internal.h"
#define QCOM_MUTEX_APPS_PROC_ID 1
#define QCOM_MUTEX_NUM_LOCKS 32
static int qcom_hwspinlock_trylock(struct hwspinlock *lock)
struct regmap_field *field = lock->priv;
ret = regmap_field_write(field, QCOM_MUTEX_APPS_PROC_ID);
ret = regmap_field_read(field, &lock_owner);
return lock_owner == QCOM_MUTEX_APPS_PROC_ID;
static void qcom_hwspinlock_unlock(struct hwspinlock *lock)
struct regmap_field *field = lock->priv;
ret = regmap_field_read(field, &lock_owner);
pr_err("%s: unable to query spinlock owner\n", __func__);
if (lock_owner != QCOM_MUTEX_APPS_PROC_ID) {
pr_err("%s: spinlock not owned by us (actual owner is %d)\n",
ret = regmap_field_write(field, 0);
pr_err("%s: failed to unlock spinlock\n", __func__);
static const struct hwspinlock_ops qcom_hwspinlock_ops = {
.trylock = qcom_hwspinlock_trylock,