File Index
Files and directories
Sign in
FILE

hpios.h

File preview with syntax highlighting.

linux-6.19.14/sound/pci/asihpi/hpios.h C
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/******************************************************************************
  3
  4    AudioScience HPI driver
  5    Copyright (C) 1997-2011  AudioScience Inc. <support@audioscience.com>
  6
  7
  8HPI Operating System Specific macros for Linux Kernel driver
  9
 10(C) Copyright AudioScience Inc. 1997-2003
 11******************************************************************************/
 12#ifndef _HPIOS_H_
 13#define _HPIOS_H_
 14
 15#undef HPI_OS_LINUX_KERNEL
 16#define HPI_OS_LINUX_KERNEL
 17
 18#define HPI_OS_DEFINED
 19#define HPI_BUILD_KERNEL_MODE
 20
 21#include <linux/io.h>
 22#include <linux/ioctl.h>
 23#include <linux/kernel.h>
 24#include <linux/string.h>
 25#include <linux/device.h>
 26#include <linux/firmware.h>
 27#include <linux/interrupt.h>
 28#include <linux/pci.h>
 29#include <linux/mutex.h>
 30
 31#define HPI_NO_OS_FILE_OPS
 32
 33/** Details of a memory area allocated with  pci_alloc_consistent
 34Need all info for parameters to pci_free_consistent
 35*/
 36struct consistent_dma_area {
 37	struct device *pdev;
 38	/* looks like dma-mapping dma_devres ?! */
 39	size_t size;
 40	void *vaddr;
 41	dma_addr_t dma_handle;
 42};
 43
 44static inline u16 hpios_locked_mem_get_phys_addr(struct consistent_dma_area
 45	*locked_mem_handle, u32 *p_physical_addr)
 46{
 47	*p_physical_addr = locked_mem_handle->dma_handle;
 48	return 0;
 49}
 50
 51static inline u16 hpios_locked_mem_get_virt_addr(struct consistent_dma_area
 52	*locked_mem_handle, void **pp_virtual_addr)
 53{
 54	*pp_virtual_addr = locked_mem_handle->vaddr;
 55	return 0;
 56}
 57
 58static inline u16 hpios_locked_mem_valid(struct consistent_dma_area
 59	*locked_mem_handle)
 60{
 61	return locked_mem_handle->size != 0;
 62}
 63
 64struct hpi_ioctl_linux {
 65	void __user *phm;
 66	void __user *phr;
 67};
 68
 69/* Conflict?: H is already used by a number of drivers hid, bluetooth hci,
 70   and some sound drivers sb16, hdsp, emu10k. AFAIK 0xFC is unused command
 71*/
 72#define HPI_IOCTL_LINUX _IOWR('H', 0xFC, struct hpi_ioctl_linux)
 73
 74#define HPI_DEBUG_FLAG_ERROR   KERN_ERR
 75#define HPI_DEBUG_FLAG_WARNING KERN_WARNING
 76#define HPI_DEBUG_FLAG_NOTICE  KERN_NOTICE
 77#define HPI_DEBUG_FLAG_INFO    KERN_INFO
 78#define HPI_DEBUG_FLAG_DEBUG   KERN_DEBUG
 79#define HPI_DEBUG_FLAG_VERBOSE KERN_DEBUG	/* kernel has no verbose */
 80
 81#include <linux/spinlock.h>
 82
 83#define HPI_LOCKING
 84
 85struct hpios_spinlock {
 86	spinlock_t lock;	/* SEE hpios_spinlock */
 87	int lock_context;
 88};
 89
 90/* The reason for all this evilness is that ALSA calls some of a drivers
 91 * operators in atomic context, and some not.  But all our functions channel
 92 * through the HPI_Message conduit, so we can't handle the different context
 93 * per function
 94 */
 95#define IN_LOCK_BH 1
 96#define IN_LOCK_IRQ 0
 97static inline void cond_lock(struct hpios_spinlock *l)
 98{
 99	if (irqs_disabled()) {
100		/* NO bh or isr can execute on this processor,
101		   so ordinary lock will do
102		 */
103		spin_lock(&((l)->lock));
104		l->lock_context = IN_LOCK_IRQ;
105	} else {
106		spin_lock_bh(&((l)->lock));
107		l->lock_context = IN_LOCK_BH;
108	}
109}
110
111static inline void cond_unlock(struct hpios_spinlock *l)
112{
113	if (l->lock_context == IN_LOCK_BH)
114		spin_unlock_bh(&((l)->lock));
115	else
116		spin_unlock(&((l)->lock));
117}
118
119#define hpios_msgxlock_init(obj)      spin_lock_init(&(obj)->lock)
120#define hpios_msgxlock_lock(obj)   cond_lock(obj)
121#define hpios_msgxlock_unlock(obj) cond_unlock(obj)
122
123#define hpios_dsplock_init(obj)       spin_lock_init(&(obj)->dsp_lock.lock)
124#define hpios_dsplock_lock(obj)    cond_lock(&(obj)->dsp_lock)
125#define hpios_dsplock_unlock(obj)  cond_unlock(&(obj)->dsp_lock)
126
127#ifdef CONFIG_SND_DEBUG
128#define HPI_BUILD_DEBUG
129#endif
130
131#define HPI_ALIST_LOCKING
132#define hpios_alistlock_init(obj)    spin_lock_init(&((obj)->list_lock.lock))
133#define hpios_alistlock_lock(obj) spin_lock(&((obj)->list_lock.lock))
134#define hpios_alistlock_unlock(obj) spin_unlock(&((obj)->list_lock.lock))
135
136struct snd_card;
137
138/** pci drvdata points to an instance of this struct */
139struct hpi_adapter {
140	struct hpi_adapter_obj *adapter;
141	struct snd_card *snd_card;
142
143	int irq;
144	int interrupt_mode;
145	void (*interrupt_callback) (struct hpi_adapter *);
146
147	/* mutex prevents contention for one card
148	   between multiple user programs (via ioctl) */
149	struct mutex mutex;
150	char *p_buffer;
151	size_t buffer_size;
152};
153
154#endif
~/ Read-only file preview.