/* Copyright (c) 2009, 2011, 2013-2015 The Linux Foundation. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ /* * Part of this this code is based on the standard ARM spinlock * implementation (asm/spinlock.h) found in the 2.6.29 kernel. */ #ifndef __ASM__ARCH_QC_REMOTE_SPINLOCK_H #define __ASM__ARCH_QC_REMOTE_SPINLOCK_H #include #include #define REMOTE_SPINLOCK_NUM_PID 128 #define REMOTE_SPINLOCK_TID_START REMOTE_SPINLOCK_NUM_PID /* Remote spinlock definitions. */ typedef struct { volatile uint32_t lock; } raw_remote_spinlock_t; typedef raw_remote_spinlock_t *_remote_spinlock_t; #define remote_spinlock_id_t const char * #if defined(CONFIG_REMOTE_SPINLOCK_MSM) int _remote_spin_lock_init(remote_spinlock_id_t, _remote_spinlock_t *lock); void _remote_spin_release_all(uint32_t pid); void _remote_spin_lock(_remote_spinlock_t *lock); void _remote_spin_unlock(_remote_spinlock_t *lock); int _remote_spin_trylock(_remote_spinlock_t *lock); int _remote_spin_release(_remote_spinlock_t *lock, uint32_t pid); int _remote_spin_owner(_remote_spinlock_t *lock); void _remote_spin_lock_rlock_id(_remote_spinlock_t *lock, uint32_t tid); void _remote_spin_unlock_rlock(_remote_spinlock_t *lock); int _remote_spin_get_hw_spinlocks_element(_remote_spinlock_t *lock); #else static inline int _remote_spin_lock_init(remote_spinlock_id_t id, _remote_spinlock_t *lock) { return -EINVAL; } static inline void _remote_spin_release_all(uint32_t pid) {} static inline void _remote_spin_lock(_remote_spinlock_t *lock) {} static inline void _remote_spin_unlock(_remote_spinlock_t *lock) {} static inline int _remote_spin_trylock(_remote_spinlock_t *lock) { return -ENODEV; } static inline int _remote_spin_release(_remote_spinlock_t *lock, uint32_t pid) { return -ENODEV; } static inline int _remote_spin_owner(_remote_spinlock_t *lock) { return -ENODEV; } static inline void _remote_spin_lock_rlock_id(_remote_spinlock_t *lock, uint32_t tid) {} static inline void _remote_spin_unlock_rlock(_remote_spinlock_t *lock) {} static inline int _remote_spin_get_hw_spinlocks_element( _remote_spinlock_t *lock) { return -ENODEV; } #endif #endif /* __ASM__ARCH_QC_REMOTE_SPINLOCK_H */