diff options
Diffstat (limited to 'include/linux/hwspinlock.h')
| -rw-r--r-- | include/linux/hwspinlock.h | 46 |
1 files changed, 34 insertions, 12 deletions
diff --git a/include/linux/hwspinlock.h b/include/linux/hwspinlock.h index 8390efc457eb..08a2fee40659 100644 --- a/include/linux/hwspinlock.h +++ b/include/linux/hwspinlock.h | |||
| @@ -20,17 +20,49 @@ | |||
| 20 | 20 | ||
| 21 | #include <linux/err.h> | 21 | #include <linux/err.h> |
| 22 | #include <linux/sched.h> | 22 | #include <linux/sched.h> |
| 23 | #include <linux/device.h> | ||
| 23 | 24 | ||
| 24 | /* hwspinlock mode argument */ | 25 | /* hwspinlock mode argument */ |
| 25 | #define HWLOCK_IRQSTATE 0x01 /* Disable interrupts, save state */ | 26 | #define HWLOCK_IRQSTATE 0x01 /* Disable interrupts, save state */ |
| 26 | #define HWLOCK_IRQ 0x02 /* Disable interrupts, don't save state */ | 27 | #define HWLOCK_IRQ 0x02 /* Disable interrupts, don't save state */ |
| 27 | 28 | ||
| 28 | struct hwspinlock; | 29 | struct hwspinlock; |
| 30 | struct hwspinlock_device; | ||
| 31 | struct hwspinlock_ops; | ||
| 32 | |||
| 33 | /** | ||
| 34 | * struct hwspinlock_pdata - platform data for hwspinlock drivers | ||
| 35 | * @base_id: base id for this hwspinlock device | ||
| 36 | * | ||
| 37 | * hwspinlock devices provide system-wide hardware locks that are used | ||
| 38 | * by remote processors that have no other way to achieve synchronization. | ||
| 39 | * | ||
| 40 | * To achieve that, each physical lock must have a system-wide id number | ||
| 41 | * that is agreed upon, otherwise remote processors can't possibly assume | ||
| 42 | * they're using the same hardware lock. | ||
| 43 | * | ||
| 44 | * Usually boards have a single hwspinlock device, which provides several | ||
| 45 | * hwspinlocks, and in this case, they can be trivially numbered 0 to | ||
| 46 | * (num-of-locks - 1). | ||
| 47 | * | ||
| 48 | * In case boards have several hwspinlocks devices, a different base id | ||
| 49 | * should be used for each hwspinlock device (they can't all use 0 as | ||
| 50 | * a starting id!). | ||
| 51 | * | ||
| 52 | * This platform data structure should be used to provide the base id | ||
| 53 | * for each device (which is trivially 0 when only a single hwspinlock | ||
| 54 | * device exists). It can be shared between different platforms, hence | ||
| 55 | * its location. | ||
| 56 | */ | ||
| 57 | struct hwspinlock_pdata { | ||
| 58 | int base_id; | ||
| 59 | }; | ||
| 29 | 60 | ||
| 30 | #if defined(CONFIG_HWSPINLOCK) || defined(CONFIG_HWSPINLOCK_MODULE) | 61 | #if defined(CONFIG_HWSPINLOCK) || defined(CONFIG_HWSPINLOCK_MODULE) |
| 31 | 62 | ||
| 32 | int hwspin_lock_register(struct hwspinlock *lock); | 63 | int hwspin_lock_register(struct hwspinlock_device *bank, struct device *dev, |
| 33 | struct hwspinlock *hwspin_lock_unregister(unsigned int id); | 64 | const struct hwspinlock_ops *ops, int base_id, int num_locks); |
| 65 | int hwspin_lock_unregister(struct hwspinlock_device *bank); | ||
| 34 | struct hwspinlock *hwspin_lock_request(void); | 66 | struct hwspinlock *hwspin_lock_request(void); |
| 35 | struct hwspinlock *hwspin_lock_request_specific(unsigned int id); | 67 | struct hwspinlock *hwspin_lock_request_specific(unsigned int id); |
| 36 | int hwspin_lock_free(struct hwspinlock *hwlock); | 68 | int hwspin_lock_free(struct hwspinlock *hwlock); |
| @@ -94,16 +126,6 @@ static inline int hwspin_lock_get_id(struct hwspinlock *hwlock) | |||
| 94 | return 0; | 126 | return 0; |
| 95 | } | 127 | } |
| 96 | 128 | ||
| 97 | static inline int hwspin_lock_register(struct hwspinlock *hwlock) | ||
| 98 | { | ||
| 99 | return -ENODEV; | ||
| 100 | } | ||
| 101 | |||
| 102 | static inline struct hwspinlock *hwspin_lock_unregister(unsigned int id) | ||
| 103 | { | ||
| 104 | return NULL; | ||
| 105 | } | ||
| 106 | |||
| 107 | #endif /* !CONFIG_HWSPINLOCK */ | 129 | #endif /* !CONFIG_HWSPINLOCK */ |
| 108 | 130 | ||
| 109 | /** | 131 | /** |
