linux/drivers/hwspinlock/hwspinlock_internal.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Hardware spinlocks internal header
   4 *
   5 * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com
   6 *
   7 * Contact: Ohad Ben-Cohen <ohad@wizery.com>
   8 */
   9
  10#ifndef __HWSPINLOCK_HWSPINLOCK_H
  11#define __HWSPINLOCK_HWSPINLOCK_H
  12
  13#include <linux/spinlock.h>
  14#include <linux/device.h>
  15
  16struct hwspinlock_device;
  17
  18/**
  19 * struct hwspinlock_ops - platform-specific hwspinlock handlers
  20 *
  21 * @trylock: make a single attempt to take the lock. returns 0 on
  22 *           failure and true on success. may _not_ sleep.
  23 * @unlock:  release the lock. always succeed. may _not_ sleep.
  24 * @relax:   optional, platform-specific relax handler, called by hwspinlock
  25 *           core while spinning on a lock, between two successive
  26 *           invocations of @trylock. may _not_ sleep.
  27 */
  28struct hwspinlock_ops {
  29        int (*trylock)(struct hwspinlock *lock);
  30        void (*unlock)(struct hwspinlock *lock);
  31        void (*relax)(struct hwspinlock *lock);
  32};
  33
  34/**
  35 * struct hwspinlock - this struct represents a single hwspinlock instance
  36 * @bank: the hwspinlock_device structure which owns this lock
  37 * @lock: initialized and used by hwspinlock core
  38 * @priv: private data, owned by the underlying platform-specific hwspinlock drv
  39 */
  40struct hwspinlock {
  41        struct hwspinlock_device *bank;
  42        spinlock_t lock;
  43        void *priv;
  44};
  45
  46/**
  47 * struct hwspinlock_device - a device which usually spans numerous hwspinlocks
  48 * @dev: underlying device, will be used to invoke runtime PM api
  49 * @ops: platform-specific hwspinlock handlers
  50 * @base_id: id index of the first lock in this device
  51 * @num_locks: number of locks in this device
  52 * @lock: dynamically allocated array of 'struct hwspinlock'
  53 */
  54struct hwspinlock_device {
  55        struct device *dev;
  56        const struct hwspinlock_ops *ops;
  57        int base_id;
  58        int num_locks;
  59        struct hwspinlock lock[];
  60};
  61
  62static inline int hwlock_to_id(struct hwspinlock *hwlock)
  63{
  64        int local_id = hwlock - &hwlock->bank->lock[0];
  65
  66        return hwlock->bank->base_id + local_id;
  67}
  68
  69#endif /* __HWSPINLOCK_HWSPINLOCK_H */
  70