diff options
author | Takashi Iwai <tiwai@suse.de> | 2010-04-21 18:43:17 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2010-04-21 18:45:19 +0200 |
commit | a0c3ac4d4ef0470e25b7dc3c5a4307a049fbf7ba (patch) | |
tree | 6da821a841f4eb715bd257215e1b0599062453de | |
parent | 64d63084da943796216ed259b11bf975995c6059 (diff) | |
download | alsa-driver-build-unstable-a0c3ac4d4ef0470e25b7dc3c5a4307a049fbf7ba.tar.gz |
Move asihpi driver to linux kernel tree
Fix the rest build stubs.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | INSTALL | 8 | ||||
-rw-r--r-- | pci/Kconfig | 9 | ||||
-rw-r--r-- | pci/asihpi/Makefile | 11 | ||||
-rw-r--r-- | pci/asihpi/asihpi.c | 3010 | ||||
-rw-r--r-- | pci/asihpi/hpi.h | 2001 | ||||
-rw-r--r-- | pci/asihpi/hpi6000.c | 1843 | ||||
-rw-r--r-- | pci/asihpi/hpi6000.h | 70 | ||||
-rw-r--r-- | pci/asihpi/hpi6205.c | 2334 | ||||
-rw-r--r-- | pci/asihpi/hpi6205.h | 93 | ||||
-rw-r--r-- | pci/asihpi/hpi_internal.h | 1641 | ||||
-rw-r--r-- | pci/asihpi/hpicmn.c | 645 | ||||
-rw-r--r-- | pci/asihpi/hpicmn.h | 64 | ||||
-rw-r--r-- | pci/asihpi/hpidebug.c | 227 | ||||
-rw-r--r-- | pci/asihpi/hpidebug.h | 385 | ||||
-rw-r--r-- | pci/asihpi/hpidspcd.c | 177 | ||||
-rw-r--r-- | pci/asihpi/hpidspcd.h | 104 | ||||
-rw-r--r-- | pci/asihpi/hpidspcd.patch | 21 | ||||
-rw-r--r-- | pci/asihpi/hpifunc.c | 3866 | ||||
-rw-r--r-- | pci/asihpi/hpimsginit.c | 132 | ||||
-rw-r--r-- | pci/asihpi/hpimsginit.h | 40 | ||||
-rw-r--r-- | pci/asihpi/hpimsgx.c | 909 | ||||
-rw-r--r-- | pci/asihpi/hpimsgx.h | 36 | ||||
-rw-r--r-- | pci/asihpi/hpioctl.c | 486 | ||||
-rw-r--r-- | pci/asihpi/hpioctl.h | 38 | ||||
-rw-r--r-- | pci/asihpi/hpios.c | 132 | ||||
-rw-r--r-- | pci/asihpi/hpios.h | 198 | ||||
-rw-r--r-- | pci/asihpi/hpios.patch | 35 | ||||
-rw-r--r-- | pci/asihpi/hpipcida.h | 37 |
29 files changed, 82 insertions, 18472 deletions
diff --git a/.gitignore b/.gitignore index 2ea3ed52c..f42d5d89d 100644 --- a/.gitignore +++ b/.gitignore @@ -72,6 +72,8 @@ pci/ac97/ac97_bus.c pci/ac97/ac97_codec.c pci/ad1889.c pci/ali5451/ali5451.c +pci/asihpi/hpidspcd.c +pci/asihpi/hpios.c pci/atiixp.c pci/atiixp_modem.c pci/au88x0/au88x0.c @@ -324,14 +324,6 @@ Information about Additional Modules This module supports multiple devices. - Module snd-asihpi - ----------------- - - Module for AudioScience ASI soundcards - - This module supports multiple cards. - The driver requires the firmware loader support on kernel. - Trouble Shooting ================ diff --git a/pci/Kconfig b/pci/Kconfig index 864f2fc4c..49a488018 100644 --- a/pci/Kconfig +++ b/pci/Kconfig @@ -10,14 +10,5 @@ config SND_PDPLUS To compile this driver as a module, choose M here: the module will be called snd-pdplus. -config SND_ASIHPI - tristate "AudioScience ASIxxxx" - depends on X86 - select FW_LOADER - select SND_PCM - select SND_HWDEP - help - Say 'Y' or 'M' to include support for AudioScience ASIxxxx soundcards. - endif diff --git a/pci/asihpi/Makefile b/pci/asihpi/Makefile index e11888510..95ee4498f 100644 --- a/pci/asihpi/Makefile +++ b/pci/asihpi/Makefile @@ -5,10 +5,13 @@ endif include $(SND_TOPDIR)/toplevel.config include $(SND_TOPDIR)/Makefile.conf -snd-asihpi-objs := asihpi.o hpioctl.o hpimsginit.o\ - hpicmn.o hpifunc.o hpidebug.o hpidspcd.o\ - hpios.o hpi6000.o hpi6205.o hpimsgx.o +clean-files := hpidspcd.c hpios.c -obj-$(CONFIG_SND_ASIHPI) += snd-asihpi.o +EXTRA_CFLAGS = -I$(SND_TOPDIR)/alsa-kernel/pci/asihpi + +include $(SND_TOPDIR)/alsa-kernel/pci/asihpi/Makefile include $(SND_TOPDIR)/Rules.make + +hpidspcd.c: hpidspcd.patch $(SND_TOPDIR)/alsa-kernel/pci/asihpi/hpidspcd.c +hpios.c: hpios.patch $(SND_TOPDIR)/alsa-kernel/pci/asihpi/hpios.c diff --git a/pci/asihpi/asihpi.c b/pci/asihpi/asihpi.c index d4e577595..edba5b128 100644 --- a/pci/asihpi/asihpi.c +++ b/pci/asihpi/asihpi.c @@ -1,3010 +1,2 @@ -/* - * Asihpi soundcard - * Copyright (c) by AudioScience Inc <alsa@audioscience.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of version 2 of the GNU General Public License 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * - * The following is not a condition of use, merely a request: - * If you modify this program, particularly if you fix errors, AudioScience Inc - * would appreciate it if you grant us the right to use those modifications - * for any purpose including commercial applications. - */ -/* >0: print Hw params, timer vars. >1: print stream write/copy sizes */ -#define REALLY_VERBOSE_LOGGING 0 - -#if REALLY_VERBOSE_LOGGING -#define VPRINTK1 snd_printd -#else -#define VPRINTK1(...) -#endif - -#if REALLY_VERBOSE_LOGGING > 1 -#define VPRINTK2 snd_printd -#else -#define VPRINTK2(...) -#endif - -#ifndef ASI_STYLE_NAMES -/* not sure how ALSA style name should look */ -#define ASI_STYLE_NAMES 1 -#endif - -#include "hpi_internal.h" -#include "hpimsginit.h" -#include "hpioctl.h" - -#ifndef KERNEL_ALSA_BUILD -/* building in ALSA source tree */ #include "adriver.h" -#else -/* building in kernel tree */ -#endif - -#include <linux/pci.h> -#include <linux/version.h> -#include <linux/init.h> -#include <linux/jiffies.h> -#include <linux/slab.h> -#include <linux/time.h> -#include <linux/wait.h> -#include <sound/core.h> -#include <sound/control.h> -#include <sound/pcm.h> -#include <sound/pcm_params.h> -#include <sound/info.h> -#include <sound/initval.h> -#include <sound/tlv.h> -#include <sound/hwdep.h> - - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("AudioScience inc. <support@audioscience.com>"); -MODULE_DESCRIPTION("AudioScience ALSA ASI5000 ASI6000 ASI87xx ASI89xx"); - -static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* index 0-MAX */ -static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ -static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; -static int enable_hpi_hwdep = 1; - -module_param_array(index, int, NULL, S_IRUGO); -MODULE_PARM_DESC(index, "ALSA index value for AudioScience soundcard."); - -module_param_array(id, charp, NULL, S_IRUGO); -MODULE_PARM_DESC(id, "ALSA ID string for AudioScience soundcard."); - -module_param_array(enable, bool, NULL, S_IRUGO); -MODULE_PARM_DESC(enable, "ALSA enable AudioScience soundcard."); - -module_param(enable_hpi_hwdep, bool, S_IRUGO|S_IWUSR); -MODULE_PARM_DESC(enable_hpi_hwdep, - "ALSA enable HPI hwdep for AudioScience soundcard "); - -/* identify driver */ -#ifdef KERNEL_ALSA_BUILD -static char *build_info = "built using headers from kernel source"; -module_param(build_info, charp, S_IRUGO); -MODULE_PARM_DESC(build_info, "built using headers from kernel source"); -#else -static char *build_info = "built within ALSA source"; -module_param(build_info, charp, S_IRUGO); -MODULE_PARM_DESC(build_info, "built within ALSA source"); -#endif - -/* set to 1 to dump every control from adapter to log */ -static const int mixer_dump; - -#define DEFAULT_SAMPLERATE 44100 -static int adapter_fs = DEFAULT_SAMPLERATE; - -static struct hpi_hsubsys *ss; /* handle to HPI audio subsystem */ - -/* defaults */ -#define PERIODS_MIN 2 -#define PERIOD_BYTES_MIN 2304 -#define BUFFER_BYTES_MAX (512 * 1024) - -/*#define TIMER_MILLISECONDS 20 -#define FORCE_TIMER_JIFFIES ((TIMER_MILLISECONDS * HZ + 999)/1000) -*/ - -#define MAX_CLOCKSOURCES (HPI_SAMPLECLOCK_SOURCE_LAST + 1 + 7) - -struct clk_source { - int source; - int index; - char *name; -}; - -struct clk_cache { - int count; - int has_local; - struct clk_source s[MAX_CLOCKSOURCES]; -}; - -/* Per card data */ -struct snd_card_asihpi { - struct snd_card *card; - struct pci_dev *pci; - u16 adapter_index; - u32 serial_number; - u16 type; - u16 version; - u16 num_outstreams; - u16 num_instreams; - - u32 h_mixer; - struct clk_cache cc; - - u16 support_mmap; - u16 support_grouping; - u16 support_mrx; - u16 update_interval_frames; - u16 in_max_chans; - u16 out_max_chans; -}; - -/* Per stream data */ -struct snd_card_asihpi_pcm { - struct timer_list timer; - unsigned int respawn_timer; - unsigned int hpi_buffer_attached; - unsigned int pcm_size; - unsigned int pcm_count; - unsigned int bytes_per_sec; - unsigned int pcm_irq_pos; /* IRQ position */ - unsigned int pcm_buf_pos; /* position in buffer */ - struct snd_pcm_substream *substream; - u32 h_stream; - struct hpi_format format; -}; - -/* universal stream verbs work with out or in stream handles */ - -/* Functions to allow driver to give a buffer to HPI for busmastering */ - -static u16 hpi_stream_host_buffer_attach( - struct hpi_hsubsys *hS, - u32 h_stream, /* handle to outstream. */ - u32 size_in_bytes, /* size in bytes of bus mastering buffer */ - u32 pci_address -) -{ - struct hpi_message hm; - struct hpi_response hr; - unsigned int obj = hpi_handle_object(h_stream); - - if (!h_stream) - return HPI_ERROR_INVALID_OBJ; - hpi_init_message_response(&hm, &hr, obj, - obj == HPI_OBJ_OSTREAM ? - HPI_OSTREAM_HOSTBUFFER_ALLOC : - HPI_ISTREAM_HOSTBUFFER_ALLOC); - - hpi_handle_to_indexes(h_stream, &hm.adapter_index, - &hm.obj_index); - - hm.u.d.u.buffer.buffer_size = size_in_bytes; - hm.u.d.u.buffer.pci_address = pci_address; - hm.u.d.u.buffer.command = HPI_BUFFER_CMD_INTERNAL_GRANTADAPTER; - hpi_send_recv(&hm, &hr); - return hr.error; -} - -static u16 hpi_stream_host_buffer_detach( - struct hpi_hsubsys *hS, - u32 h_stream -) -{ - struct hpi_message hm; - struct hpi_response hr; - unsigned int obj = hpi_handle_object(h_stream); - - if (!h_stream) - return HPI_ERROR_INVALID_OBJ; - - hpi_init_message_response(&hm, &hr, obj, - obj == HPI_OBJ_OSTREAM ? - HPI_OSTREAM_HOSTBUFFER_FREE : - HPI_ISTREAM_HOSTBUFFER_FREE); - - hpi_handle_to_indexes(h_stream, &hm.adapter_index, - &hm.obj_index); - hm.u.d.u.buffer.command = HPI_BUFFER_CMD_INTERNAL_REVOKEADAPTER; - hpi_send_recv(&hm, &hr); - return hr.error; -} - -static inline u16 hpi_stream_start(struct hpi_hsubsys *hS, u32 h_stream) -{ - if (hpi_handle_object(h_stream) == HPI_OBJ_OSTREAM) - return hpi_outstream_start(hS, h_stream); - else - return hpi_instream_start(hS, h_stream); -} - -static inline u16 hpi_stream_stop(struct hpi_hsubsys *hS, u32 h_stream) -{ - if (hpi_handle_object(h_stream) == HPI_OBJ_OSTREAM) - return hpi_outstream_stop(hS, h_stream); - else - return hpi_instream_stop(hS, h_stream); -} - -static inline u16 hpi_stream_get_info_ex( - struct hpi_hsubsys *hS, - u32 h_stream, - u16 *pw_state, - u32 *pbuffer_size, - u32 *pdata_in_buffer, - u32 *psample_count, - u32 *pauxiliary_data -) -{ - if (hpi_handle_object(h_stream) == HPI_OBJ_OSTREAM) - return hpi_outstream_get_info_ex(hS, h_stream, pw_state, - pbuffer_size, pdata_in_buffer, - psample_count, pauxiliary_data); - else - return hpi_instream_get_info_ex(hS, h_stream, pw_state, - pbuffer_size, pdata_in_buffer, - psample_count, pauxiliary_data); -} - -static inline u16 hpi_stream_group_add(struct hpi_hsubsys *hS, - u32 h_master, - u32 h_stream) -{ - if (hpi_handle_object(h_master) == HPI_OBJ_OSTREAM) - return hpi_outstream_group_add(hS, h_master, h_stream); - else - return hpi_instream_group_add(hS, h_master, h_stream); -} - -static inline u16 hpi_stream_group_reset(struct hpi_hsubsys *hS, - u32 h_stream) -{ - if (hpi_handle_object(h_stream) == HPI_OBJ_OSTREAM) - return hpi_outstream_group_reset(hS, h_stream); - else - return hpi_instream_group_reset(hS, h_stream); -} - -static inline u16 hpi_stream_group_get_map(struct hpi_hsubsys *hS, - u32 h_stream, u32 *mo, u32 *mi) -{ - if (hpi_handle_object(h_stream) == HPI_OBJ_OSTREAM) - return hpi_outstream_group_get_map(hS, h_stream, mo, mi); - else - return hpi_instream_group_get_map(hS, h_stream, mo, mi); -} - -static u16 handle_error(u16 err, int line, char *filename) -{ - if (err) - printk(KERN_WARNING - "in file %s, line %d: HPI error %d\n", - filename, line, err); - return err; -} - -#define hpi_handle_error(x) handle_error(x, __LINE__, __FILE__) - -/***************************** GENERAL PCM ****************/ -#if REALLY_VERBOSE_LOGGING -static void print_hwparams(struct snd_pcm_hw_params *p) -{ - snd_printd("HWPARAMS \n"); - snd_printd("samplerate %d \n", params_rate(p)); - snd_printd("channels %d \n", params_channels(p)); - snd_printd("format %d \n", params_format(p)); - snd_printd("subformat %d \n", params_subformat(p)); - snd_printd("buffer bytes %d \n", params_buffer_bytes(p)); - snd_printd("period bytes %d \n", params_period_bytes(p)); - snd_printd("access %d \n", params_access(p)); - snd_printd("period_size %d \n", params_period_size(p)); - snd_printd("periods %d \n", params_periods(p)); - snd_printd("buffer_size %d \n", params_buffer_size(p)); -} -#else -#define print_hwparams(x) -#endif - -static snd_pcm_format_t hpi_to_alsa_formats[] = { - -1, /* INVALID */ - SNDRV_PCM_FORMAT_U8, /* HPI_FORMAT_PCM8_UNSIGNED 1 */ - SNDRV_PCM_FORMAT_S16, /* HPI_FORMAT_PCM16_SIGNED 2 */ - -1, /* HPI_FORMAT_MPEG_L1 3 */ - SNDRV_PCM_FORMAT_MPEG, /* HPI_FORMAT_MPEG_L2 4 */ - SNDRV_PCM_FORMAT_MPEG, /* HPI_FORMAT_MPEG_L3 5 */ - -1, /* HPI_FORMAT_DOLBY_AC2 6 */ - -1, /* HPI_FORMAT_DOLBY_AC3 7 */ - SNDRV_PCM_FORMAT_S16_BE,/* HPI_FORMAT_PCM16_BIGENDIAN 8 */ - -1, /* HPI_FORMAT_AA_TAGIT1_HITS 9 */ - -1, /* HPI_FORMAT_AA_TAGIT1_INSERTS 10 */ - SNDRV_PCM_FORMAT_S32, /* HPI_FORMAT_PCM32_SIGNED 11 */ - -1, /* HPI_FORMAT_RAW_BITSTREAM 12 */ - -1, /* HPI_FORMAT_AA_TAGIT1_HITS_EX1 13 */ - SNDRV_PCM_FORMAT_FLOAT, /* HPI_FORMAT_PCM32_FLOAT 14 */ -#if 1 - /* ALSA can't handle 3 byte sample size together with power-of-2 - * constraint on buffer_bytes, so disable this format - */ - -1 -#else - /* SNDRV_PCM_FORMAT_S24_3LE */ /* { HPI_FORMAT_PCM24_SIGNED 15 */ -#endif -}; - - -static int snd_card_asihpi_format_alsa2hpi(snd_pcm_format_t alsa_format, - u16 *hpi_format) -{ - u16 format; - - for (format = HPI_FORMAT_PCM8_UNSIGNED; - format <= HPI_FORMAT_PCM24_SIGNED; format++) { - if (hpi_to_alsa_formats[format] == alsa_format) { - *hpi_format = format; - return 0; - } - } - - snd_printd(KERN_WARNING "failed match for alsa format %d\n", - alsa_format); - *hpi_format = 0; - return -EINVAL; -} - -static void snd_card_asihpi_pcm_samplerates(struct snd_card_asihpi *asihpi, - struct snd_pcm_hardware *pcmhw) -{ - u16 err; - u32 h_control; - u32 sample_rate; - int idx; - unsigned int rate_min = 200000; - unsigned int rate_max = 0; - unsigned int rates = 0; - - if (asihpi->support_mrx) { - rates |= SNDRV_PCM_RATE_CONTINUOUS; - rates |= SNDRV_PCM_RATE_8000_96000; - rate_min = 8000; - rate_max = 100000; - } else { - /* on cards without SRC, - valid rates are determined by sampleclock */ - err = hpi_mixer_get_control(ss, asihpi->h_mixer, - HPI_SOURCENODE_CLOCK_SOURCE, 0, 0, 0, - HPI_CONTROL_SAMPLECLOCK, &h_control); - if (err) { - snd_printk(KERN_ERR - "no local sampleclock, err %d\n", err); - } - - for (idx = 0; idx < 100; idx++) { - if (hpi_sample_clock_query_local_rate(ss, - h_control, idx, &sample_rate)) { - if (!idx) - snd_printk(KERN_ERR - "local rate query failed\n"); - - break; - } - - rate_min = min(rate_min, sample_rate); - rate_max = max(rate_max, sample_rate); - - switch (sample_rate) { - case 5512: - rates |= SNDRV_PCM_RATE_5512; - break; - case 8000: - rates |= SNDRV_PCM_RATE_8000; - break; - case 11025: - rates |= SNDRV_PCM_RATE_11025; - break; - case 16000: - rates |= SNDRV_PCM_RATE_16000; - break; - case 22050: - rates |= SNDRV_PCM_RATE_22050; - break; - case 32000: - rates |= SNDRV_PCM_RATE_32000; - break; - case 44100: - rates |= SNDRV_PCM_RATE_44100; - break; - case 48000: - rates |= SNDRV_PCM_RATE_48000; - break; - case 64000: - rates |= SNDRV_PCM_RATE_64000; - break; - case 88200: - rates |= SNDRV_PCM_RATE_88200; - break; - case 96000: - rates |= SNDRV_PCM_RATE_96000; - break; - case 176400: - rates |= SNDRV_PCM_RATE_176400; - break; - case 192000: - rates |= SNDRV_PCM_RATE_192000; - break; - default: /* some other rate */ - rates |= SNDRV_PCM_RATE_KNOT; - } - } - } - - /* printk(KERN_INFO "Supported rates %X %d %d\n", - rates, rate_min, rate_max); */ - pcmhw->rates = rates; - pcmhw->rate_min = rate_min; - pcmhw->rate_max = rate_max; -} - -static int snd_card_asihpi_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_card_asihpi_pcm *dpcm = runtime->private_data; - struct snd_card_asihpi *card = snd_pcm_substream_chip(substream); - int err; - u16 format; - unsigned int bytes_per_sec; - - print_hwparams(params); - err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(params)); - if (err < 0) - return err; - err = snd_card_asihpi_format_alsa2hpi(params_format(params), &format); - if (err) - return err; - - VPRINTK1(KERN_INFO "format %d, %d chans, %d_hz\n", - format, params_channels(params), - params_rate(params)); - - hpi_handle_error(hpi_format_create(&dpcm->format, - params_channels(params), - format, params_rate(params), 0, 0)); - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - if (hpi_instream_reset(ss, dpcm->h_stream) != 0) - return -EINVAL; - - if (hpi_instream_set_format(ss, - dpcm->h_stream, &dpcm->format) != 0) - return -EINVAL; - } - - dpcm->hpi_buffer_attached = 0; - if (card->support_mmap) { - - err = hpi_stream_host_buffer_attach(ss, dpcm->h_stream, - params_buffer_bytes(params), runtime->dma_addr); - if (err == 0) { - snd_printd(KERN_INFO - "stream_host_buffer_attach succeeded %u %lu\n", - params_buffer_bytes(params), - (unsigned long)runtime->dma_addr); - } else { - snd_printd(KERN_INFO - "stream_host_buffer_attach error %d\n", - err); - return -ENOMEM; - } - - err = hpi_stream_get_info_ex(ss, dpcm->h_stream, NULL, - &dpcm->hpi_buffer_attached, - NULL, NULL, NULL); - - snd_printd(KERN_INFO "stream_host_buffer_attach status 0x%x\n", - dpcm->hpi_buffer_attached); - } - bytes_per_sec = params_rate(params) * params_channels(params); - bytes_per_sec *= snd_pcm_format_width(params_format(params)); - bytes_per_sec /= 8; - if (bytes_per_sec <= 0) - return -EINVAL; - - dpcm->bytes_per_sec = bytes_per_sec; - dpcm->pcm_size = params_buffer_bytes(params); - dpcm->pcm_count = params_period_bytes(params); - snd_printd(KERN_INFO "pcm_size=%d, pcm_count=%d, bps=%d\n", - dpcm->pcm_size, dpcm->pcm_count, bytes_per_sec); - - dpcm->pcm_irq_pos = 0; - dpcm->pcm_buf_pos = 0; - return 0; -} - -static void snd_card_asihpi_pcm_timer_start(struct snd_pcm_substream * - substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_card_asihpi_pcm *dpcm = runtime->private_data; - int expiry; - - expiry = (dpcm->pcm_count * HZ / dpcm->bytes_per_sec); - /* wait longer the first time, for samples to propagate */ - expiry = max(expiry, 20); - dpcm->timer.expires = jiffies + expiry; - dpcm->respawn_timer = 1; - add_timer(&dpcm->timer); -} - -static void snd_card_asihpi_pcm_timer_stop(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_card_asihpi_pcm *dpcm = runtime->private_data; - - dpcm->respawn_timer = 0; - del_timer(&dpcm->timer); -} - -static int snd_card_asihpi_trigger(struct snd_pcm_substream *substream, - int cmd) -{ - struct snd_card_asihpi_pcm *dpcm = substream->runtime->private_data; - struct snd_card_asihpi *card = snd_pcm_substream_chip(substream); - struct snd_pcm_substream *s; - u16 e; - - snd_printd("trigger %dstream %d\n", - substream->stream, substream->number); - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - snd_pcm_group_for_each_entry(s, substream) { - struct snd_card_asihpi_pcm *ds; - ds = s->runtime->private_data; - - if (snd_pcm_substream_chip(s) != card) - continue; - - if ((s->stream == SNDRV_PCM_STREAM_PLAYBACK) && - (card->support_mmap)) { - /* How do I know how much valid data is present - * in buffer? Just guessing 2 periods, but if - * buffer is bigger it may contain even more - * data?? - */ - unsigned int preload = ds->pcm_count * 2; - VPRINTK2("preload %d\n", preload); - hpi_handle_error(hpi_outstream_write_buf( - ss, ds->h_stream, - &s->runtime->dma_area[0], - preload, - &ds->format)); - } - - if (card->support_grouping) { - VPRINTK1("\t_group %dstream %d\n", s->stream, - s->number); - e = hpi_stream_group_add(ss, - dpcm->h_stream, - ds->h_stream); - if (!e) { - snd_pcm_trigger_done(s, substream); - } else { - hpi_handle_error(e); - break; - } - } else - break; - } - snd_printd("start\n"); - /* start the master stream */ - snd_card_asihpi_pcm_timer_start(substream); - hpi_handle_error(hpi_stream_start(ss, dpcm->h_stream)); - break; - - case SNDRV_PCM_TRIGGER_STOP: - snd_card_asihpi_pcm_timer_stop(substream); - snd_pcm_group_for_each_entry(s, substream) { - if (snd_pcm_substream_chip(s) != card) - continue; - - /*? workaround linked streams don't - transition to SETUP 20070706*/ - s->runtime->status->state = SNDRV_PCM_STATE_SETUP; - - if (card->support_grouping) { - VPRINTK1("\t_group %dstream %d\n", s->stream, - s->number); - snd_pcm_trigger_done(s, substream); - } else - break; - } - snd_printd("stop\n"); - - /* _prepare and _hwparams reset the stream */ - hpi_handle_error(hpi_stream_stop(ss, dpcm->h_stream)); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - hpi_handle_error( - hpi_outstream_reset(ss, dpcm->h_stream)); - - if (card->support_grouping) - hpi_handle_error(hpi_stream_group_reset(ss, - dpcm->h_stream)); - break; - - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - snd_printd("pause release\n"); - hpi_handle_error(hpi_stream_start(ss, dpcm->h_stream)); - snd_card_asihpi_pcm_timer_start(substream); - break; - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - snd_printd("pause\n"); - snd_card_asihpi_pcm_timer_stop(substream); - hpi_handle_error(hpi_stream_stop(ss, dpcm->h_stream)); - break; - default: - snd_printd("\tINVALID\n"); - return -EINVAL; - } - - return 0; -} - -static int -snd_card_asihpi_hw_free(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_card_asihpi_pcm *dpcm = runtime->private_data; - if (dpcm->hpi_buffer_attached) - hpi_stream_host_buffer_detach(ss, dpcm->h_stream); - - snd_pcm_lib_free_pages(substream); - return 0; -} - -static void snd_card_asihpi_runtime_free(struct snd_pcm_runtime *runtime) -{ - struct snd_card_asihpi_pcm *dpcm = runtime->private_data; - kfree(dpcm); -} - -/*algorithm outline - Without linking degenerates to getting single stream pos etc - Without mmap 2nd loop degenerates to snd_pcm_period_elapsed -*/ -/* -buf_pos=get_buf_pos(s); -for_each_linked_stream(s) { - buf_pos=get_buf_pos(s); - min_buf_pos = modulo_min(min_buf_pos, buf_pos, pcm_size) - new_data = min(new_data, calc_new_data(buf_pos,irq_pos) -} -timer.expires = jiffies + predict_next_period_ready(min_buf_pos); -for_each_linked_stream(s) { - s->buf_pos = min_buf_pos; - if (new_data > pcm_count) { - if (mmap) { - irq_pos = (irq_pos + pcm_count) % pcm_size; - if (playback) { - write(pcm_count); - } else { - read(pcm_count); - } - } - snd_pcm_period_elapsed(s); - } -} -*/ - -/** Minimum of 2 modulo values. Works correctly when the difference between -* the values is less than half the modulus -*/ -static inline unsigned int modulo_min(unsigned int a, unsigned int b, - unsigned long int modulus) -{ - unsigned int result; - if (((a-b) % modulus) < (modulus/2)) - result = b; - else - result = a; - - return result; -} - -/** Timer function, equivalent to interrupt service routine for cards -*/ -static void snd_card_asihpi_timer_function(unsigned long data) -{ - struct snd_card_asihpi_pcm *dpcm = (struct snd_card_asihpi_pcm *)data; - struct snd_card_asihpi *card = snd_pcm_substream_chip(dpcm->substream); - struct snd_pcm_runtime *runtime; - struct snd_pcm_substream *s; - unsigned int newdata = 0; - unsigned int buf_pos, min_buf_pos = 0; - unsigned int remdata, xfercount, next_jiffies; - int first = 1; - u16 state; - u32 buffer_size, data_avail, samples_played, aux; - - /* find minimum newdata and buffer pos in group */ - snd_pcm_group_for_each_entry(s, dpcm->substream) { - struct snd_card_asihpi_pcm *ds = s->runtime->private_data; - runtime = s->runtime; - - if (snd_pcm_substream_chip(s) != card) - continue; - - hpi_handle_error(hpi_stream_get_info_ex(ss, - ds->h_stream, &state, - &buffer_size, &data_avail, - &samples_played, &aux)); - - /* number of bytes in on-card buffer */ - runtime->delay = aux; - - if (state == HPI_STATE_DRAINED) { - snd_printd(KERN_WARNING "outstream %d drained\n", - s->number); - snd_pcm_stop(s, SNDRV_PCM_STATE_XRUN); - return; - } - - if (s->stream == SNDRV_PCM_STREAM_PLAYBACK) { - buf_pos = frames_to_bytes(runtime, samples_played); - } else { - buf_pos = data_avail + ds->pcm_irq_pos; - } - - if (first) { - /* can't statically init min when wrap is involved */ - min_buf_pos = buf_pos; - newdata = (buf_pos - ds->pcm_irq_pos) % ds->pcm_size; - first = 0; - } else { - min_buf_pos = - modulo_min(min_buf_pos, buf_pos, UINT_MAX+1L); - newdata = min( - (buf_pos - ds->pcm_irq_pos) % ds->pcm_size, - newdata); - } - - VPRINTK1("PB timer hw_ptr x%04lX, appl_ptr x%04lX\n", - (unsigned long)frames_to_bytes(runtime, - runtime->status->hw_ptr), - (unsigned long)frames_to_bytes(runtime, - runtime->control->appl_ptr)); - VPRINTK1("%d S=%d, irq=%04X, pos=x%04X, left=x%04X," - " aux=x%04X space=x%04X\n", s->number, - state, ds->pcm_irq_pos, buf_pos, (int)data_avail, - (int)aux, buffer_size-data_avail); - } - - remdata = newdata % dpcm->pcm_count; - xfercount = newdata - remdata; /* a multiple of pcm_count */ - next_jiffies = ((dpcm->pcm_count-remdata) * HZ / dpcm->bytes_per_sec)+1; - next_jiffies = max(next_jiffies, 2U * HZ / 1000U); - dpcm->timer.expires = jiffies + next_jiffies; - VPRINTK1("jif %d buf pos x%04X newdata x%04X xc x%04X\n", - next_jiffies, min_buf_pos, newdata, xfercount); - - snd_pcm_group_for_each_entry(s, dpcm->substream) { - struct snd_card_asihpi_pcm *ds = s->runtime->private_data; - ds->pcm_buf_pos = min_buf_pos; - - if (xfercount) { - if (card->support_mmap) { - ds->pcm_irq_pos = ds->pcm_irq_pos + xfercount; - if (s->stream == SNDRV_PCM_STREAM_PLAYBACK) { - VPRINTK2("write OS%d x%04x\n", - s->number, - ds->pcm_count); - hpi_handle_error( - hpi_outstream_write_buf( - ss, ds->h_stream, - &s->runtime-> - dma_area[0], - xfercount, - &ds->format)); - } else { - VPRINTK2("read IS%d x%04x\n", - s->number, - dpcm->pcm_count); - hpi_handle_error( - hpi_instream_read_buf( - ss, ds->h_stream, - NULL, xfercount)); - } - } /* else R/W will be handled by read/write callbacks */ - snd_pcm_period_elapsed(s); - } - } - - if (dpcm->respawn_timer) - add_timer(&dpcm->timer); -} - -/***************************** PLAYBACK OPS ****************/ -static int snd_card_asihpi_playback_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - /* snd_printd(KERN_INFO "Playback ioctl %d\n", cmd); */ - return snd_pcm_lib_ioctl(substream, cmd, arg); -} - -static int snd_card_asihpi_playback_prepare(struct snd_pcm_substream * - substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_card_asihpi_pcm *dpcm = runtime->private_data; - - snd_printd(KERN_INFO "playback prepare %d\n", substream->number); - - hpi_handle_error(hpi_outstream_reset(ss, dpcm->h_stream)); - dpcm->pcm_irq_pos = 0; - dpcm->pcm_buf_pos = 0; - - return 0; -} - -static snd_pcm_uframes_t -snd_card_asihpi_playback_pointer(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_card_asihpi_pcm *dpcm = runtime->private_data; - snd_pcm_uframes_t ptr; - - u32 samples_played; - u16 err; - - if (!snd_pcm_stream_linked(substream)) { - /* NOTE, can use samples played for playback position here and - * in timer fn because it LAGS the actual read pointer, and is a - * better representation of actual playout position - */ - err = hpi_outstream_get_info_ex(ss, dpcm->h_stream, NULL, - NULL, NULL, - &samples_played, NULL); - hpi_handle_error(err); - - dpcm->pcm_buf_pos = frames_to_bytes(runtime, samples_played); - } - /* else must return most conservative value found in timer func - * by looping over all streams - */ - - ptr = bytes_to_frames(runtime, dpcm->pcm_buf_pos % dpcm->pcm_size); - VPRINTK2("playback_pointer=%04ld\n", (unsigned long)ptr); - return ptr; -} - -static void snd_card_asihpi_playback_format(struct snd_card_asihpi *asihpi, - u32 h_stream, - struct snd_pcm_hardware *pcmhw) -{ - struct hpi_format hpi_format; - u16 format; - u16 err; - u32 h_control; - u32 sample_rate = 48000; - - /* on cards without SRC, must query at valid rate, - * maybe set by external sync - */ - err = hpi_mixer_get_control(ss, asihpi->h_mixer, - HPI_SOURCENODE_CLOCK_SOURCE, 0, 0, 0, - HPI_CONTROL_SAMPLECLOCK, &h_control); - - if (!err) - err = hpi_sample_clock_get_sample_rate(ss, h_control, - &sample_rate); - - for (format = HPI_FORMAT_PCM8_UNSIGNED; - format <= HPI_FORMAT_PCM24_SIGNED; format++) { - err = hpi_format_create(&hpi_format, - 2, format, sample_rate, 128000, 0); - if (!err) - err = hpi_outstream_query_format(ss, h_stream, - &hpi_format); - if (!err && (hpi_to_alsa_formats[format] != -1)) - pcmhw->formats |= - (1ULL << hpi_to_alsa_formats[format]); - } -} - -static struct snd_pcm_hardware snd_card_asihpi_playback = { - .channels_min = 1, - .channels_max = 2, - .buffer_bytes_max = BUFFER_BYTES_MAX, - .period_bytes_min = PERIOD_BYTES_MIN, - .period_bytes_max = BUFFER_BYTES_MAX / PERIODS_MIN, - .periods_min = PERIODS_MIN, - .periods_max = BUFFER_BYTES_MAX / PERIOD_BYTES_MIN, - .fifo_size = 0, -}; - -static int snd_card_asihpi_playback_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_card_asihpi_pcm *dpcm; - struct snd_card_asihpi *card = snd_pcm_substream_chip(substream); - int err; - - dpcm = kzalloc(sizeof(*dpcm), GFP_KERNEL); - if (dpcm == NULL) - return -ENOMEM; - - err = - hpi_outstream_open(ss, card->adapter_index, - substream->number, &dpcm->h_stream); - hpi_handle_error(err); - if (err) - kfree(dpcm); - if (err == HPI_ERROR_OBJ_ALREADY_OPEN) - return -EBUSY; - if (err) - return -EIO; - - /*? also check ASI5000 samplerate source - If external, only support external rate. - If internal and other stream playing, cant switch - */ - - init_timer(&dpcm->timer); - dpcm->timer.data = (unsigned long) dpcm; - dpcm->timer.function = snd_card_asihpi_timer_function; - dpcm->substream = substream; - runtime->private_data = dpcm; - runtime->private_free = snd_card_asihpi_runtime_free; - - snd_card_asihpi_playback.channels_max = card->out_max_chans; - /*?snd_card_asihpi_playback.period_bytes_min = - card->out_max_chans * 4096; */ - - snd_card_asihpi_playback_format(card, dpcm->h_stream, - &snd_card_asihpi_playback); - - snd_card_asihpi_pcm_samplerates(card, &snd_card_asihpi_playback); - - snd_card_asihpi_playback.info = SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_DOUBLE | - SNDRV_PCM_INFO_BATCH | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_PAUSE; - - if (card->support_mmap) - snd_card_asihpi_playback.info |= SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_MMAP_VALID; - - if (card->support_grouping) - snd_card_asihpi_playback.info |= SNDRV_PCM_INFO_SYNC_START; - - /* struct is copied, so can create initializer dynamically */ - runtime->hw = snd_card_asihpi_playback; - - if (card->support_mmap) - err = snd_pcm_hw_constraint_pow2(runtime, 0, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES); - if (err < 0) - return err; - - snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, - card->update_interval_frames); - snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, - card->update_interval_frames * 4, UINT_MAX); - - snd_pcm_set_sync(substream); - - snd_printd(KERN_INFO "playback open\n"); - - return 0; -} - -static int snd_card_asihpi_playback_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_card_asihpi_pcm *dpcm = runtime->private_data; - - hpi_handle_error(hpi_outstream_close(ss, dpcm->h_stream)); - snd_printd(KERN_INFO "playback close\n"); - - return 0; -} - -static int snd_card_asihpi_playback_copy(struct snd_pcm_substream *substream, - int channel, - snd_pcm_uframes_t pos, - void __user *src, - snd_pcm_uframes_t count) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_card_asihpi_pcm *dpcm = runtime->private_data; - unsigned int len; - - len = frames_to_bytes(runtime, count); - - if (copy_from_user(runtime->dma_area, src, len)) - return -EFAULT; - - VPRINTK2(KERN_DEBUG "playback copy%d %u bytes\n", - substream->number, len); - - hpi_handle_error(hpi_outstream_write_buf(ss, dpcm->h_stream, - runtime->dma_area, len, &dpcm->format)); - - return 0; -} - -static int snd_card_asihpi_playback_silence(struct snd_pcm_substream * - substream, int channel, - snd_pcm_uframes_t pos, - snd_pcm_uframes_t count) -{ - unsigned int len; - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_card_asihpi_pcm *dpcm = runtime->private_data; - - len = frames_to_bytes(runtime, count); - snd_printd(KERN_INFO "playback silence %u bytes\n", len); - - memset(runtime->dma_area, 0, len); - hpi_handle_error(hpi_outstream_write_buf(ss, dpcm->h_stream, - runtime->dma_area, len, &dpcm->format)); - return 0; -} - -static struct snd_pcm_ops snd_card_asihpi_playback_ops = { - .open = snd_card_asihpi_playback_open, - .close = snd_card_asihpi_playback_close, - .ioctl = snd_card_asihpi_playback_ioctl, - .hw_params = snd_card_asihpi_pcm_hw_params, - .hw_free = snd_card_asihpi_hw_free, - .prepare = snd_card_asihpi_playback_prepare, - .trigger = snd_card_asihpi_trigger, - .pointer = snd_card_asihpi_playback_pointer, - .copy = snd_card_asihpi_playback_copy, - .silence = snd_card_asihpi_playback_silence, -}; - -static struct snd_pcm_ops snd_card_asihpi_playback_mmap_ops = { - .open = snd_card_asihpi_playback_open, - .close = snd_card_asihpi_playback_close, - .ioctl = snd_card_asihpi_playback_ioctl, - .hw_params = snd_card_asihpi_pcm_hw_params, - .hw_free = snd_card_asihpi_hw_free, - .prepare = snd_card_asihpi_playback_prepare, - .trigger = snd_card_asihpi_trigger, - .pointer = snd_card_asihpi_playback_pointer, -}; - -/***************************** CAPTURE OPS ****************/ -static snd_pcm_uframes_t -snd_card_asihpi_capture_pointer(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_card_asihpi_pcm *dpcm = runtime->private_data; - - VPRINTK2("capture pointer %d=%d\n", - substream->number, dpcm->pcm_buf_pos); - /* NOTE Unlike playback can't use actual dwSamplesPlayed - for the capture position, because those samples aren't yet in - the local buffer available for reading. - */ - return bytes_to_frames(runtime, dpcm->pcm_buf_pos % dpcm->pcm_size); -} - -static int snd_card_asihpi_capture_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - return snd_pcm_lib_ioctl(substream, cmd, arg); -} - -static int snd_card_asihpi_capture_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_card_asihpi_pcm *dpcm = runtime->private_data; - - hpi_handle_error(hpi_instream_reset(ss, dpcm->h_stream)); - dpcm->pcm_irq_pos = 0; - dpcm->pcm_buf_pos = 0; - - snd_printd("capture prepare %d\n", substream->number); - return 0; -} - - - -static void snd_card_asihpi_capture_format(struct snd_card_asihpi *asihpi, - u32 h_stream, - struct snd_pcm_hardware *pcmhw) -{ - struct hpi_format hpi_format; - u16 format; - u16 err; - u32 h_control; - u32 sample_rate = 48000; - - /* on cards without SRC, must query at valid rate, - maybe set by external sync */ - err = hpi_mixer_get_control(ss, asihpi->h_mixer, - HPI_SOURCENODE_CLOCK_SOURCE, 0, 0, 0, - HPI_CONTROL_SAMPLECLOCK, &h_control); - - if (!err) - err = hpi_sample_clock_get_sample_rate(ss, h_control, - &sample_rate); - - for (format = HPI_FORMAT_PCM8_UNSIGNED; - format <= HPI_FORMAT_PCM24_SIGNED; format++) { - - err = hpi_format_create(&hpi_format, 2, format, - sample_rate, 128000, 0); - if (!err) - err = hpi_instream_query_format(ss, h_stream, - &hpi_format); - if (!err) - pcmhw->formats |= - (1ULL << hpi_to_alsa_formats[format]); - } -} - - -static struct snd_pcm_hardware snd_card_asihpi_capture = { - .channels_min = 1, - .channels_max = 2, - .buffer_bytes_max = BUFFER_BYTES_MAX, - .period_bytes_min = PERIOD_BYTES_MIN, - .period_bytes_max = BUFFER_BYTES_MAX / PERIODS_MIN, - .periods_min = PERIODS_MIN, - .periods_max = BUFFER_BYTES_MAX / PERIOD_BYTES_MIN, - .fifo_size = 0, -}; - -static int snd_card_asihpi_capture_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_card_asihpi *card = snd_pcm_substream_chip(substream); - struct snd_card_asihpi_pcm *dpcm; - int err; - - dpcm = kzalloc(sizeof(*dpcm), GFP_KERNEL); - if (dpcm == NULL) - return -ENOMEM; - - snd_printd("hpi_instream_open adapter %d stream %d\n", - card->adapter_index, substream->number); - - err = hpi_handle_error( - hpi_instream_open(ss, card->adapter_index, - substream->number, &dpcm->h_stream)); - if (err) - kfree(dpcm); - if (err == HPI_ERROR_OBJ_ALREADY_OPEN) - return -EBUSY; - if (err) - return -EIO; - - - init_timer(&dpcm->timer); - dpcm->timer.data = (unsigned long) dpcm; - dpcm->timer.function = snd_card_asihpi_timer_function; - dpcm->substream = substream; - runtime->private_data = dpcm; - runtime->private_free = snd_card_asihpi_runtime_free; - - snd_card_asihpi_capture.channels_max = card->in_max_chans; - snd_card_asihpi_capture_format(card, dpcm->h_stream, - &snd_card_asihpi_capture); - snd_card_asihpi_pcm_samplerates(card, &snd_card_asihpi_capture); - snd_card_asihpi_capture.info = SNDRV_PCM_INFO_INTERLEAVED; - - if (card->support_mmap) - snd_card_asihpi_capture.info |= SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_MMAP_VALID; - - runtime->hw = snd_card_asihpi_capture; - - if (card->support_mmap) - err = snd_pcm_hw_constraint_pow2(runtime, 0, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES); - if (err < 0) - return err; - - snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, - card->update_interval_frames); - snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, - card->update_interval_frames * 2, UINT_MAX); - - snd_pcm_set_sync(substream); - - return 0; -} - -static int snd_card_asihpi_capture_close(struct snd_pcm_substream *substream) -{ - struct snd_card_asihpi_pcm *dpcm = substream->runtime->private_data; - - hpi_handle_error(hpi_instream_close(ss, dpcm->h_stream)); - return 0; -} - -static int snd_card_asihpi_capture_copy(struct snd_pcm_substream *substream, - int channel, snd_pcm_uframes_t pos, - void __user *dst, snd_pcm_uframes_t count) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_card_asihpi_pcm *dpcm = runtime->private_data; - u32 data_size; - - data_size = frames_to_bytes(runtime, count); - - VPRINTK2("capture copy%d %d bytes\n", substream->number, data_size); - hpi_handle_error(hpi_instream_read_buf(ss, dpcm->h_stream, - runtime->dma_area, data_size)); - - /* Used by capture_pointer */ - dpcm->pcm_irq_pos = dpcm->pcm_irq_pos + data_size; - - if (copy_to_user(dst, runtime->dma_area, data_size)) - return -EFAULT; - - return 0; -} - -static struct snd_pcm_ops snd_card_asihpi_capture_mmap_ops = { - .open = snd_card_asihpi_capture_open, - .close = snd_card_asihpi_capture_close, - .ioctl = snd_card_asihpi_capture_ioctl, - .hw_params = snd_card_asihpi_pcm_hw_params, - .hw_free = snd_card_asihpi_hw_free, - .prepare = snd_card_asihpi_capture_prepare, - .trigger = snd_card_asihpi_trigger, - .pointer = snd_card_asihpi_capture_pointer, -}; - -static struct snd_pcm_ops snd_card_asihpi_capture_ops = { - .open = snd_card_asihpi_capture_open, - .close = snd_card_asihpi_capture_close, - .ioctl = snd_card_asihpi_capture_ioctl, - .hw_params = snd_card_asihpi_pcm_hw_params, - .hw_free = snd_card_asihpi_hw_free, - .prepare = snd_card_asihpi_capture_prepare, - .trigger = snd_card_asihpi_trigger, - .pointer = snd_card_asihpi_capture_pointer, - .copy = snd_card_asihpi_capture_copy -}; - -static int __devinit snd_card_asihpi_pcm_new(struct snd_card_asihpi *asihpi, - int device, int substreams) -{ - struct snd_pcm *pcm; - int err; - - err = snd_pcm_new(asihpi->card, "asihpi PCM", device, - asihpi->num_outstreams, asihpi->num_instreams, - &pcm); - if (err < 0) - return err; - /* pointer to ops struct is stored, dont change ops afterwards! */ - if (asihpi->support_mmap) { - snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, - &snd_card_asihpi_playback_mmap_ops); - snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, - &snd_card_asihpi_capture_mmap_ops); - } else { - snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, - &snd_card_asihpi_playback_ops); - snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, - &snd_card_asihpi_capture_ops); - } - - pcm->private_data = asihpi; - pcm->info_flags = 0; - strcpy(pcm->name, "asihpi PCM"); - - /*? do we want to emulate MMAP for non-BBM cards? - Jack doesn't work with ALSAs MMAP emulation - WHY NOT? */ - snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, - snd_dma_pci_data(asihpi->pci), - 64*1024, BUFFER_BYTES_MAX); - - return 0; -} - -/***************************** MIXER CONTROLS ****************/ -struct hpi_control { - u32 h_control; - u16 control_type; - u16 src_node_type; - u16 src_node_index; - u16 dst_node_type; - u16 dst_node_index; - u16 band; - char name[44]; /* copied to snd_ctl_elem_id.name[44]; */ -}; - -static char *asihpi_tuner_band_names[] = -{ - "invalid", - "AM", - "FM mono", - "TV NTSC-M", - "FM stereo", - "AUX", - "TV PAL BG", - "TV PAL I", - "TV PAL DK", - "TV SECAM", -}; - -compile_time_assert( - (ARRAY_SIZE(asihpi_tuner_band_names) == - (HPI_TUNER_BAND_LAST+1)), - assert_tuner_band_names_size); - -#if ASI_STYLE_NAMES -static char *asihpi_src_names[] = -{ - "no source", - "outstream", - "line_in", - "aes_in", - "tuner", - "RF", - "clock", - "bitstr", - "mic", - "cobranet", - "analog_in", - "adapter", -}; -#else -static char *asihpi_src_names[] = -{ - "no source", - "PCM playback", - "line in", - "digital in", - "tuner", - "RF", - "clock", - "bitstream", - "mic", - "cobranet in", - "analog in", - "adapter", -}; -#endif - -compile_time_assert( - (ARRAY_SIZE(asihpi_src_names) == - (HPI_SOURCENODE_LAST_INDEX-HPI_SOURCENODE_BASE+1)), - assert_src_names_size); - -#if ASI_STYLE_NAMES -static char *asihpi_dst_names[] = -{ - "no destination", - "instream", - "line_out", - "aes_out", - "RF", - "speaker" , - "cobranet", - "analog_out", -}; -#else -static char *asihpi_dst_names[] = -{ - "no destination", - "PCM capture", - "line out", - "digital out", - "RF", - "speaker", - "cobranet out", - "analog out" -}; -#endif - -compile_time_assert( - (ARRAY_SIZE(asihpi_dst_names) == - (HPI_DESTNODE_LAST_INDEX-HPI_DESTNODE_BASE+1)), - assert_dst_names_size); - -static inline int ctl_add(struct snd_card *card, struct snd_kcontrol_new *ctl, - struct snd_card_asihpi *asihpi) -{ - int err; - - err = snd_ctl_add(card, snd_ctl_new1(ctl, asihpi)); - if (err < 0) - return err; - else if (mixer_dump) - snd_printk(KERN_INFO "added %s(%d)\n", ctl->name, ctl->index); - - return 0; -} - -/* Convert HPI control name and location into ALSA control name */ -static void asihpi_ctl_init(struct snd_kcontrol_new *snd_control, - struct hpi_control *hpi_ctl, - char *name) -{ - memset(snd_control, 0, sizeof(*snd_control)); - snd_control->name = hpi_ctl->name; - snd_control->private_value = hpi_ctl->h_control; - snd_control->iface = SNDRV_CTL_ELEM_IFACE_MIXER; - snd_control->index = 0; - - if (hpi_ctl->src_node_type && hpi_ctl->dst_node_type) - sprintf(hpi_ctl->name, "%s%d to %s%d %s", - asihpi_src_names[hpi_ctl->src_node_type], - hpi_ctl->src_node_index, - asihpi_dst_names[hpi_ctl->dst_node_type], - hpi_ctl->dst_node_index, - name); - else if (hpi_ctl->dst_node_type) { - sprintf(hpi_ctl->name, "%s%d %s", - asihpi_dst_names[hpi_ctl->dst_node_type], - hpi_ctl->dst_node_index, - name); - } else { - sprintf(hpi_ctl->name, "%s%d %s", - asihpi_src_names[hpi_ctl->src_node_type], - hpi_ctl->src_node_index, - name); - } -} - -/*------------------------------------------------------------ - Volume controls - ------------------------------------------------------------*/ -#define VOL_STEP_mB 1 -static int snd_asihpi_volume_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - u32 h_control = kcontrol->private_value; - u16 err; - /* native gains are in millibels */ - short min_gain_mB; - short max_gain_mB; - short step_gain_mB; - - err = hpi_volume_query_range(ss, h_control, - &min_gain_mB, &max_gain_mB, &step_gain_mB); - if (err) { - max_gain_mB = 0; - min_gain_mB = -10000; - step_gain_mB = VOL_STEP_mB; - } - - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 2; - uinfo->value.integer.min = min_gain_mB / VOL_STEP_mB; - uinfo->value.integer.max = max_gain_mB / VOL_STEP_mB; - uinfo->value.integer.step = step_gain_mB / VOL_STEP_mB; - return 0; -} - -static int snd_asihpi_volume_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u32 h_control = kcontrol->private_value; - short an_gain_mB[HPI_MAX_CHANNELS]; - - hpi_handle_error(hpi_volume_get_gain(ss, h_control, an_gain_mB)); - ucontrol->value.integer.value[0] = an_gain_mB[0] / VOL_STEP_mB; - ucontrol->value.integer.value[1] = an_gain_mB[1] / VOL_STEP_mB; - - return 0; -} - -static int snd_asihpi_volume_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int change; - u32 h_control = kcontrol->private_value; - short an_gain_mB[HPI_MAX_CHANNELS]; - - an_gain_mB[0] = - (ucontrol->value.integer.value[0]) * VOL_STEP_mB; - an_gain_mB[1] = - (ucontrol->value.integer.value[1]) * VOL_STEP_mB; - /* change = asihpi->mixer_volume[addr][0] != left || - asihpi->mixer_volume[addr][1] != right; - */ - change = 1; - hpi_handle_error(hpi_volume_set_gain(ss, h_control, an_gain_mB)); - return change; -} - -static const DECLARE_TLV_DB_SCALE(db_scale_100, -10000, VOL_STEP_mB, 0); - -static int __devinit snd_asihpi_volume_add(struct snd_card_asihpi *asihpi, - struct hpi_control *hpi_ctl) -{ - struct snd_card *card = asihpi->card; - struct snd_kcontrol_new snd_control; - - asihpi_ctl_init(&snd_control, hpi_ctl, "volume"); - snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_TLV_READ; - snd_control.info = snd_asihpi_volume_info; - snd_control.get = snd_asihpi_volume_get; - snd_control.put = snd_asihpi_volume_put; - snd_control.tlv.p = db_scale_100; - - return ctl_add(card, &snd_control, asihpi); -} - -/*------------------------------------------------------------ - Level controls - ------------------------------------------------------------*/ -static int snd_asihpi_level_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - u32 h_control = kcontrol->private_value; - u16 err; - short min_gain_mB; - short max_gain_mB; - short step_gain_mB; - - err = - hpi_level_query_range(ss, h_control, &min_gain_mB, - &max_gain_mB, &step_gain_mB); - if (err) { - max_gain_mB = 2400; - min_gain_mB = -1000; - step_gain_mB = 100; - } - - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 2; - uinfo->value.integer.min = min_gain_mB / HPI_UNITS_PER_dB; - uinfo->value.integer.max = max_gain_mB / HPI_UNITS_PER_dB; - uinfo->value.integer.step = step_gain_mB / HPI_UNITS_PER_dB; - return 0; -} - -static int snd_asihpi_level_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u32 h_control = kcontrol->private_value; - short an_gain_mB[HPI_MAX_CHANNELS]; - - hpi_handle_error(hpi_level_get_gain(ss, h_control, an_gain_mB)); - ucontrol->value.integer.value[0] = - an_gain_mB[0] / HPI_UNITS_PER_dB; - ucontrol->value.integer.value[1] = - an_gain_mB[1] / HPI_UNITS_PER_dB; - - return 0; -} - -static int snd_asihpi_level_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int change; - u32 h_control = kcontrol->private_value; - short an_gain_mB[HPI_MAX_CHANNELS]; - - an_gain_mB[0] = - (ucontrol->value.integer.value[0]) * HPI_UNITS_PER_dB; - an_gain_mB[1] = - (ucontrol->value.integer.value[1]) * HPI_UNITS_PER_dB; - /* change = asihpi->mixer_level[addr][0] != left || - asihpi->mixer_level[addr][1] != right; - */ - change = 1; - hpi_handle_error(hpi_level_set_gain(ss, h_control, an_gain_mB)); - return change; -} - -static const DECLARE_TLV_DB_SCALE(db_scale_level, -1000, 100, 0); - -static int __devinit snd_asihpi_level_add(struct snd_card_asihpi *asihpi, - struct hpi_control *hpi_ctl) -{ - struct snd_card *card = asihpi->card; - struct snd_kcontrol_new snd_control; - - /* can't use 'volume' cos some nodes have volume as well */ - asihpi_ctl_init(&snd_control, hpi_ctl, "level"); - snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_TLV_READ; - snd_control.info = snd_asihpi_level_info; - snd_control.get = snd_asihpi_level_get; - snd_control.put = snd_asihpi_level_put; - snd_control.tlv.p = db_scale_level; - - return ctl_add(card, &snd_control, asihpi); -} - -/*------------------------------------------------------------ - AESEBU controls - ------------------------------------------------------------*/ - -/* AESEBU format */ -static char *asihpi_aesebu_format_names[] = -{ - "N/A", - "S/PDIF", - "AES/EBU", -}; - -static int snd_asihpi_aesebu_format_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; - uinfo->count = 1; - uinfo->value.enumerated.items = 3; - - if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) - uinfo->value.enumerated.item = - uinfo->value.enumerated.items - 1; - - strcpy(uinfo->value.enumerated.name, - asihpi_aesebu_format_names[uinfo->value.enumerated.item]); - - return 0; -} - -static int snd_asihpi_aesebu_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol, - u16 (*func)(const struct hpi_hsubsys *, u32, u16 *)) -{ - u32 h_control = kcontrol->private_value; - u16 source, err; - - err = func(ss, h_control, &source); - - /* default to N/A */ - ucontrol->value.enumerated.item[0] = 0; - /* return success but set the control to N/A */ - if (err) - return 0; - if (source == HPI_AESEBU_FORMAT_SPDIF) - ucontrol->value.enumerated.item[0] = 1; - if (source == HPI_AESEBU_FORMAT_AESEBU) - ucontrol->value.enumerated.item[0] = 2; - - return 0; -} - -static int snd_asihpi_aesebu_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol, - u16 (*func)(const struct hpi_hsubsys *, u32, u16)) -{ - u32 h_control = kcontrol->private_value; - - /* default to S/PDIF */ - u16 source = HPI_AESEBU_FORMAT_SPDIF; - - if (ucontrol->value.enumerated.item[0] == 1) - source = HPI_AESEBU_FORMAT_SPDIF; - if (ucontrol->value.enumerated.item[0] == 2) - source = HPI_AESEBU_FORMAT_AESEBU; - - if (func(ss, h_control, source) != 0) - return -EINVAL; - - return 1; -} - -static int snd_asihpi_aesebu_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) { - return snd_asihpi_aesebu_format_get(kcontrol, ucontrol, - HPI_AESEBU__receiver_get_format); -} - -static int snd_asihpi_aesebu_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) { - return snd_asihpi_aesebu_format_put(kcontrol, ucontrol, - HPI_AESEBU__receiver_set_format); -} - -static int snd_asihpi_aesebu_rxstatus_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 1; - - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0X1F; - uinfo->value.integer.step = 1; - - return 0; -} - -static int snd_asihpi_aesebu_rxstatus_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) { - - u32 h_control = kcontrol->private_value; - u16 status; - - hpi_handle_error(HPI_AESEBU__receiver_get_error_status( - ss, h_control, &status)); - ucontrol->value.integer.value[0] = status; - return 0; -} - -static int __devinit snd_asihpi_aesebu_rx_add(struct snd_card_asihpi *asihpi, - struct hpi_control *hpi_ctl) -{ - struct snd_card *card = asihpi->card; - struct snd_kcontrol_new snd_control; - - asihpi_ctl_init(&snd_control, hpi_ctl, "format"); - snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE; - snd_control.info = snd_asihpi_aesebu_format_info; - snd_control.get = snd_asihpi_aesebu_rx_format_get; - snd_control.put = snd_asihpi_aesebu_rx_format_put; - - - if (ctl_add(card, &snd_control, asihpi) < 0) - return -EINVAL; - - asihpi_ctl_init(&snd_control, hpi_ctl, "status"); - snd_control.access = - SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ; - snd_control.info = snd_asihpi_aesebu_rxstatus_info; - snd_control.get = snd_asihpi_aesebu_rxstatus_get; - - return ctl_add(card, &snd_control, asihpi); -} - -static int snd_asihpi_aesebu_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) { - return snd_asihpi_aesebu_format_get(kcontrol, ucontrol, - HPI_AESEBU__transmitter_get_format); -} - -static int snd_asihpi_aesebu_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) { - return snd_asihpi_aesebu_format_put(kcontrol, ucontrol, - HPI_AESEBU__transmitter_set_format); -} - - -static int __devinit snd_asihpi_aesebu_tx_add(struct snd_card_asihpi *asihpi, - struct hpi_control *hpi_ctl) -{ - struct snd_card *card = asihpi->card; - struct snd_kcontrol_new snd_control; - - asihpi_ctl_init(&snd_control, hpi_ctl, "format"); - snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE; - snd_control.info = snd_asihpi_aesebu_format_info; - snd_control.get = snd_asihpi_aesebu_tx_format_get; - snd_control.put = snd_asihpi_aesebu_tx_format_put; - - return ctl_add(card, &snd_control, asihpi); -} - -/*------------------------------------------------------------ - Tuner controls - ------------------------------------------------------------*/ - -/* Gain */ - -static int snd_asihpi_tuner_gain_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - u32 h_control = kcontrol->private_value; - u16 err; - short idx; - u16 gain_range[3]; - - for (idx = 0; idx < 3; idx++) { - err = hpi_tuner_query_gain(ss, h_control, - idx, &gain_range[idx]); - if (err != 0) - return err; - } - - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 1; - uinfo->value.integer.min = ((int)gain_range[0]) / HPI_UNITS_PER_dB; - uinfo->value.integer.max = ((int)gain_range[1]) / HPI_UNITS_PER_dB; - uinfo->value.integer.step = ((int) gain_range[2]) / HPI_UNITS_PER_dB; - return 0; -} - -static int snd_asihpi_tuner_gain_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* - struct snd_card_asihpi *asihpi = snd_kcontrol_chip(kcontrol); - */ - u32 h_control = kcontrol->private_value; - short gain; - - hpi_handle_error(hpi_tuner_get_gain(ss, h_control, &gain)); - ucontrol->value.integer.value[0] = gain / HPI_UNITS_PER_dB; - - return 0; -} - -static int snd_asihpi_tuner_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* - struct snd_card_asihpi *asihpi = snd_kcontrol_chip(kcontrol); - */ - u32 h_control = kcontrol->private_value; - short gain; - - gain = (ucontrol->value.integer.value[0]) * HPI_UNITS_PER_dB; - hpi_handle_error(hpi_tuner_set_gain(ss, h_control, gain)); - - return 1; -} - -/* Band */ - -static int asihpi_tuner_band_query(struct snd_kcontrol *kcontrol, - u16 *band_list, u32 len) { - u32 h_control = kcontrol->private_value; - u16 err = 0; - u32 i; - - for (i = 0; i < len; i++) { - err = hpi_tuner_query_band(ss, - h_control, i, &band_list[i]); - if (err != 0) - break; - } - - if (err && (err != HPI_ERROR_INVALID_OBJ_INDEX)) - return -EIO; - - return i; -} - -static int snd_asihpi_tuner_band_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - u16 tuner_bands[HPI_TUNER_BAND_LAST]; - int num_bands = 0; - - num_bands = asihpi_tuner_band_query(kcontrol, tuner_bands, - HPI_TUNER_BAND_LAST); - - if (num_bands < 0) - return num_bands; - - uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; - uinfo->count = 1; - uinfo->value.enumerated.items = num_bands; - - if (num_bands > 0) { - if (uinfo->value.enumerated.item >= - uinfo->value.enumerated.items) - uinfo->value.enumerated.item = - uinfo->value.enumerated.items - 1; - - strcpy(uinfo->value.enumerated.name, - asihpi_tuner_band_names[ - tuner_bands[uinfo->value.enumerated.item]]); - - } - return 0; -} - -static int snd_asihpi_tuner_band_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u32 h_control = kcontrol->private_value; - /* - struct snd_card_asihpi *asihpi = snd_kcontrol_chip(kcontrol); - */ - u16 band, idx; - u16 tuner_bands[HPI_TUNER_BAND_LAST]; - u32 num_bands = 0; - - num_bands = asihpi_tuner_band_query(kcontrol, tuner_bands, - HPI_TUNER_BAND_LAST); - - hpi_handle_error(hpi_tuner_get_band(ss, h_control, &band)); - - ucontrol->value.enumerated.item[0] = -1; - for (idx = 0; idx < HPI_TUNER_BAND_LAST; idx++) - if (tuner_bands[idx] == band) { - ucontrol->value.enumerated.item[0] = idx; - break; - } - - return 0; -} - -static int snd_asihpi_tuner_band_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* - struct snd_card_asihpi *asihpi = snd_kcontrol_chip(kcontrol); - */ - u32 h_control = kcontrol->private_value; - u16 band; - u16 tuner_bands[HPI_TUNER_BAND_LAST]; - u32 num_bands = 0; - - num_bands = asihpi_tuner_band_query(kcontrol, tuner_bands, - HPI_TUNER_BAND_LAST); - - band = tuner_bands[ucontrol->value.enumerated.item[0]]; - hpi_handle_error(hpi_tuner_set_band(ss, h_control, band)); - - return 1; -} - -/* Freq */ - -static int snd_asihpi_tuner_freq_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - u32 h_control = kcontrol->private_value; - u16 err; - u16 tuner_bands[HPI_TUNER_BAND_LAST]; - u16 num_bands = 0, band_iter, idx; - u32 freq_range[3], temp_freq_range[3]; - - num_bands = asihpi_tuner_band_query(kcontrol, tuner_bands, - HPI_TUNER_BAND_LAST); - - freq_range[0] = INT_MAX; - freq_range[1] = 0; - freq_range[2] = INT_MAX; - - for (band_iter = 0; band_iter < num_bands; band_iter++) { - for (idx = 0; idx < 3; idx++) { - err = hpi_tuner_query_frequency(ss, h_control, - idx, tuner_bands[band_iter], - &temp_freq_range[idx]); - if (err != 0) - return err; - } - - /* skip band with bogus stepping */ - if (temp_freq_range[2] <= 0) - continue; - - if (temp_freq_range[0] < freq_range[0]) - freq_range[0] = temp_freq_range[0]; - if (temp_freq_range[1] > freq_range[1]) - freq_range[1] = temp_freq_range[1]; - if (temp_freq_range[2] < freq_range[2]) - freq_range[2] = temp_freq_range[2]; - } - - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 1; - uinfo->value.integer.min = ((int)freq_range[0]); - uinfo->value.integer.max = ((int)freq_range[1]); - uinfo->value.integer.step = ((int)freq_range[2]); - return 0; -} - -static int snd_asihpi_tuner_freq_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u32 h_control = kcontrol->private_value; - u32 freq; - - hpi_handle_error(hpi_tuner_get_frequency(ss, h_control, &freq)); - ucontrol->value.integer.value[0] = freq; - - return 0; -} - -static int snd_asihpi_tuner_freq_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u32 h_control = kcontrol->private_value; - u32 freq; - - freq = ucontrol->value.integer.value[0]; - hpi_handle_error(hpi_tuner_set_frequency(ss, h_control, freq)); - - return 1; -} - -/* Tuner control group initializer */ -static int __devinit snd_asihpi_tuner_add(struct snd_card_asihpi *asihpi, - struct hpi_control *hpi_ctl) -{ - struct snd_card *card = asihpi->card; - struct snd_kcontrol_new snd_control; - - snd_control.private_value = hpi_ctl->h_control; - snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE; - - if (!hpi_tuner_get_gain(ss, hpi_ctl->h_control, NULL)) { - asihpi_ctl_init(&snd_control, hpi_ctl, "gain"); - snd_control.info = snd_asihpi_tuner_gain_info; - snd_control.get = snd_asihpi_tuner_gain_get; - snd_control.put = snd_asihpi_tuner_gain_put; - - if (ctl_add(card, &snd_control, asihpi) < 0) - return -EINVAL; - } - - asihpi_ctl_init(&snd_control, hpi_ctl, "band"); - snd_control.info = snd_asihpi_tuner_band_info; - snd_control.get = snd_asihpi_tuner_band_get; - snd_control.put = snd_asihpi_tuner_band_put; - - if (ctl_add(card, &snd_control, asihpi) < 0) - return -EINVAL; - - asihpi_ctl_init(&snd_control, hpi_ctl, "freq"); - snd_control.info = snd_asihpi_tuner_freq_info; - snd_control.get = snd_asihpi_tuner_freq_get; - snd_control.put = snd_asihpi_tuner_freq_put; - - return ctl_add(card, &snd_control, asihpi); -} - -/*------------------------------------------------------------ - Meter controls - ------------------------------------------------------------*/ -static int snd_asihpi_meter_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = HPI_MAX_CHANNELS; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0x7FFFFFFF; - return 0; -} - -/* linear values for 10dB steps */ -static int log2lin[] = { - 0x7FFFFFFF, /* 0dB */ - 679093956, - 214748365, - 67909396, - 21474837, - 6790940, - 2147484, /* -60dB */ - 679094, - 214748, /* -80 */ - 67909, - 21475, /* -100 */ - 6791, - 2147, - 679, - 214, - 68, - 21, - 7, - 2 -}; - -static int snd_asihpi_meter_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u32 h_control = kcontrol->private_value; - short an_gain_mB[HPI_MAX_CHANNELS], i; - u16 err; - - err = hpi_meter_get_peak(ss, h_control, an_gain_mB); - - for (i = 0; i < HPI_MAX_CHANNELS; i++) { - if (err) { - ucontrol->value.integer.value[i] = 0; - } else if (an_gain_mB[i] >= 0) { - ucontrol->value.integer.value[i] = - an_gain_mB[i] << 16; - } else { - /* -ve is log value in millibels < -60dB, - * convert to (roughly!) linear, - */ - ucontrol->value.integer.value[i] = - log2lin[an_gain_mB[i] / -1000]; - } - } - return 0; -} - -static int __devinit snd_asihpi_meter_add(struct snd_card_asihpi *asihpi, - struct hpi_control *hpi_ctl, int subidx) -{ - struct snd_card *card = asihpi->card; - struct snd_kcontrol_new snd_control; - - asihpi_ctl_init(&snd_control, hpi_ctl, "meter"); - snd_control.access = - SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ; - snd_control.info = snd_asihpi_meter_info; - snd_control.get = snd_asihpi_meter_get; - - snd_control.index = subidx; - - return ctl_add(card, &snd_control, asihpi); -} - -/*------------------------------------------------------------ - Multiplexer controls - ------------------------------------------------------------*/ -static int snd_card_asihpi_mux_count_sources(struct snd_kcontrol *snd_control) -{ - u32 h_control = snd_control->private_value; - struct hpi_control hpi_ctl; - int s, err; - for (s = 0; s < 32; s++) { - err = hpi_multiplexer_query_source(ss, h_control, s, - &hpi_ctl. - src_node_type, - &hpi_ctl. - src_node_index); - if (err) - break; - } - return s; -} - -static int snd_asihpi_mux_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - int err; - u16 src_node_type, src_node_index; - u32 h_control = kcontrol->private_value; - - uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; - uinfo->count = 1; - uinfo->value.enumerated.items = - snd_card_asihpi_mux_count_sources(kcontrol); - - if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) - uinfo->value.enumerated.item = - uinfo->value.enumerated.items - 1; - - err = - hpi_multiplexer_query_source(ss, h_control, - uinfo->value.enumerated.item, - &src_node_type, &src_node_index); - - sprintf(uinfo->value.enumerated.name, "%s %d", - asihpi_src_names[src_node_type - HPI_SOURCENODE_BASE], - src_node_index); - return 0; -} - -static int snd_asihpi_mux_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u32 h_control = kcontrol->private_value; - u16 source_type, source_index; - u16 src_node_type, src_node_index; - int s; - - hpi_handle_error(hpi_multiplexer_get_source(ss, h_control, - &source_type, &source_index)); - /* Should cache this search result! */ - for (s = 0; s < 256; s++) { - if (hpi_multiplexer_query_source(ss, h_control, s, - &src_node_type, &src_node_index)) - break; - - if ((source_type == src_node_type) - && (source_index == src_node_index)) { - ucontrol->value.enumerated.item[0] = s; - return 0; - } - } - snd_printd(KERN_WARNING - "control %x failed to match mux source %hu %hu\n", - h_control, source_type, source_index); - ucontrol->value.enumerated.item[0] = 0; - return 0; -} - -static int snd_asihpi_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int change; - u32 h_control = kcontrol->private_value; - u16 source_type, source_index; - u16 e; - - change = 1; - - e = hpi_multiplexer_query_source(ss, h_control, - ucontrol->value.enumerated.item[0], - &source_type, &source_index); - if (!e) - hpi_handle_error( - hpi_multiplexer_set_source(ss, h_control, - source_type, source_index)); - return change; -} - - -static int __devinit snd_asihpi_mux_add(struct snd_card_asihpi *asihpi, - struct hpi_control *hpi_ctl) -{ - struct snd_card *card = asihpi->card; - struct snd_kcontrol_new snd_control; - -#if ASI_STYLE_NAMES - asihpi_ctl_init(&snd_control, hpi_ctl, "multiplexer"); -#else - asihpi_ctl_init(&snd_control, hpi_ctl, "route"); -#endif - snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE; - snd_control.info = snd_asihpi_mux_info; - snd_control.get = snd_asihpi_mux_get; - snd_control.put = snd_asihpi_mux_put; - - return ctl_add(card, &snd_control, asihpi); - -} - -/*------------------------------------------------------------ - Channel mode controls - ------------------------------------------------------------*/ -static int snd_asihpi_cmode_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - static char *mode_names[HPI_CHANNEL_MODE_LAST] = { - "normal", "swap", - "from_left", "from_right", - "to_left", "to_right" - }; - - u32 h_control = kcontrol->private_value; - u16 mode; - int i; - - /* HPI channel mode values can be from 1 to 6 - Some adapters only support a contiguous subset - */ - for (i = 0; i < HPI_CHANNEL_MODE_LAST; i++) - if (hpi_channel_mode_query_mode( - ss, h_control, i, &mode)) - break; - - uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; - uinfo->count = 1; - uinfo->value.enumerated.items = i; - - if (uinfo->value.enumerated.item >= i) - uinfo->value.enumerated.item = i - 1; - - strcpy(uinfo->value.enumerated.name, - mode_names[uinfo->value.enumerated.item]); - - return 0; -} - -static int snd_asihpi_cmode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u32 h_control = kcontrol->private_value; - u16 mode; - - if (hpi_channel_mode_get(ss, h_control, &mode)) - mode = 1; - - ucontrol->value.enumerated.item[0] = mode - 1; - - return 0; -} - -static int snd_asihpi_cmode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int change; - u32 h_control = kcontrol->private_value; - - change = 1; - - hpi_handle_error(hpi_channel_mode_set(ss, h_control, - ucontrol->value.enumerated.item[0] + 1)); - return change; -} - - -static int __devinit snd_asihpi_cmode_add(struct snd_card_asihpi *asihpi, - struct hpi_control *hpi_ctl) -{ - struct snd_card *card = asihpi->card; - struct snd_kcontrol_new snd_control; - - asihpi_ctl_init(&snd_control, hpi_ctl, "channel mode"); - snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE; - snd_control.info = snd_asihpi_cmode_info; - snd_control.get = snd_asihpi_cmode_get; - snd_control.put = snd_asihpi_cmode_put; - - return ctl_add(card, &snd_control, asihpi); -} - -/*------------------------------------------------------------ - Sampleclock source controls - ------------------------------------------------------------*/ - -static char *sampleclock_sources[MAX_CLOCKSOURCES] = - { "N/A", "local PLL", "AES/EBU sync", "word external", "word header", - "SMPTE", "AES/EBU in1", "auto", "network", "invalid", - "prev module", - "AES/EBU in2", "AES/EBU in3", "AES/EBU in4", "AES/EBU in5", - "AES/EBU in6", "AES/EBU in7", "AES/EBU in8"}; - - - -static int snd_asihpi_clksrc_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - struct snd_card_asihpi *asihpi = - (struct snd_card_asihpi *)(kcontrol->private_data); - struct clk_cache *clkcache = &asihpi->cc; - uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; - uinfo->count = 1; - uinfo->value.enumerated.items = clkcache->count; - - if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) - uinfo->value.enumerated.item = - uinfo->value.enumerated.items - 1; - - strcpy(uinfo->value.enumerated.name, - clkcache->s[uinfo->value.enumerated.item].name); - return 0; -} - -static int snd_asihpi_clksrc_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_card_asihpi *asihpi = - (struct snd_card_asihpi *)(kcontrol->private_data); - struct clk_cache *clkcache = &asihpi->cc; - u32 h_control = kcontrol->private_value; - u16 source, srcindex = 0; - int i; - - ucontrol->value.enumerated.item[0] = 0; - if (hpi_sample_clock_get_source(ss, h_control, &source)) - source = 0; - - if (source == HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT) - if (hpi_sample_clock_get_source_index(ss, h_control, &srcindex)) - srcindex = 0; - - for (i = 0; i < clkcache->count; i++) - if ((clkcache->s[i].source == source) && - (clkcache->s[i].index == srcindex)) - break; - - ucontrol->value.enumerated.item[0] = i; - - return 0; -} - -static int snd_asihpi_clksrc_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_card_asihpi *asihpi = - (struct snd_card_asihpi *)(kcontrol->private_data); - struct clk_cache *clkcache = &asihpi->cc; - int change, item; - u32 h_control = kcontrol->private_value; - - change = 1; - item = ucontrol->value.enumerated.item[0]; - if (item >= clkcache->count) - item = clkcache->count-1; - - hpi_handle_error(hpi_sample_clock_set_source(ss, - h_control, clkcache->s[item].source)); - - if (clkcache->s[item].source == HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT) - hpi_handle_error(hpi_sample_clock_set_source_index(ss, - h_control, clkcache->s[item].index)); - return change; -} - -/*------------------------------------------------------------ - Clkrate controls - ------------------------------------------------------------*/ -/* Need to change this to enumerated control with list of rates */ -static int snd_asihpi_clklocal_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 1; - uinfo->value.integer.min = 8000; - uinfo->value.integer.max = 192000; - uinfo->value.integer.step = 100; - - return 0; -} - -static int snd_asihpi_clklocal_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u32 h_control = kcontrol->private_value; - u32 rate; - u16 e; - - e = hpi_sample_clock_get_local_rate(ss, h_control, &rate); - if (!e) - ucontrol->value.integer.value[0] = rate; - else - ucontrol->value.integer.value[0] = 0; - return 0; -} - -static int snd_asihpi_clklocal_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int change; - u32 h_control = kcontrol->private_value; - - /* change = asihpi->mixer_clkrate[addr][0] != left || - asihpi->mixer_clkrate[addr][1] != right; - */ - change = 1; - hpi_handle_error(hpi_sample_clock_set_local_rate(ss, h_control, - ucontrol->value.integer.value[0])); - return change; -} - -static int snd_asihpi_clkrate_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 1; - uinfo->value.integer.min = 8000; - uinfo->value.integer.max = 192000; - uinfo->value.integer.step = 100; - - return 0; -} - -static int snd_asihpi_clkrate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u32 h_control = kcontrol->private_value; - u32 rate; - u16 e; - - e = hpi_sample_clock_get_sample_rate(ss, h_control, &rate); - if (!e) - ucontrol->value.integer.value[0] = rate; - else - ucontrol->value.integer.value[0] = 0; - return 0; -} - -static int __devinit snd_asihpi_sampleclock_add(struct snd_card_asihpi *asihpi, - struct hpi_control *hpi_ctl) -{ - struct snd_card *card = asihpi->card; - struct snd_kcontrol_new snd_control; - - struct clk_cache *clkcache = &asihpi->cc; - u32 hSC = hpi_ctl->h_control; - int has_aes_in = 0; - int i, j; - u16 source; - - snd_control.private_value = hpi_ctl->h_control; - - clkcache->has_local = 0; - - for (i = 0; i <= HPI_SAMPLECLOCK_SOURCE_LAST; i++) { - if (hpi_sample_clock_query_source(ss, hSC, - i, &source)) - break; - clkcache->s[i].source = source; - clkcache->s[i].index = 0; - clkcache->s[i].name = sampleclock_sources[source]; - if (source == HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT) - has_aes_in = 1; - if (source == HPI_SAMPLECLOCK_SOURCE_LOCAL) - clkcache->has_local = 1; - } - if (has_aes_in) - /* already will have picked up index 0 above */ - for (j = 1; j < 8; j++) { - if (hpi_sample_clock_query_source_index(ss, hSC, - j, HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT, - &source)) - break; - clkcache->s[i].source = - HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT; - clkcache->s[i].index = j; - clkcache->s[i].name = sampleclock_sources[ - j+HPI_SAMPLECLOCK_SOURCE_LAST]; - i++; - } - clkcache->count = i; - - asihpi_ctl_init(&snd_control, hpi_ctl, "source"); - snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE ; - snd_control.info = snd_asihpi_clksrc_info; - snd_control.get = snd_asihpi_clksrc_get; - snd_control.put = snd_asihpi_clksrc_put; - if (ctl_add(card, &snd_control, asihpi) < 0) - return -EINVAL; - - - if (clkcache->has_local) { - asihpi_ctl_init(&snd_control, hpi_ctl, "local_rate"); - snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE ; - snd_control.info = snd_asihpi_clklocal_info; - snd_control.get = snd_asihpi_clklocal_get; - snd_control.put = snd_asihpi_clklocal_put; - - - if (ctl_add(card, &snd_control, asihpi) < 0) - return -EINVAL; - } - - asihpi_ctl_init(&snd_control, hpi_ctl, "rate"); - snd_control.access = - SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ; - snd_control.info = snd_asihpi_clkrate_info; - snd_control.get = snd_asihpi_clkrate_get; - - return ctl_add(card, &snd_control, asihpi); -} -/*------------------------------------------------------------ - Mixer - ------------------------------------------------------------*/ - -static int __devinit snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi) -{ - struct snd_card *card = asihpi->card; - unsigned int idx = 0; - unsigned int subindex = 0; - int err; - struct hpi_control hpi_ctl, prev_ctl; - - if (snd_BUG_ON(!asihpi)) - return -EINVAL; - strcpy(card->mixername, "asihpi mixer"); - - err = - hpi_mixer_open(ss, asihpi->adapter_index, - &asihpi->h_mixer); - hpi_handle_error(err); - if (err) - return -err; - - for (idx = 0; idx < 2000; idx++) { - err = hpi_mixer_get_control_by_index( - ss, asihpi->h_mixer, - idx, - &hpi_ctl.src_node_type, - &hpi_ctl.src_node_index, - &hpi_ctl.dst_node_type, - &hpi_ctl.dst_node_index, - &hpi_ctl.control_type, - &hpi_ctl.h_control); - if (err) { - if (err == HPI_ERROR_CONTROL_DISABLED) { - if (mixer_dump) - snd_printk(KERN_INFO - "disabled HPI control(%d)\n", - idx); - continue; - } else - break; - - } - - hpi_ctl.src_node_type -= HPI_SOURCENODE_BASE; - hpi_ctl.dst_node_type -= HPI_DESTNODE_BASE; - - /* ASI50xx in SSX mode has multiple meters on the same node. - Use subindex to create distinct ALSA controls - for any duplicated controls. - */ - if ((hpi_ctl.control_type == prev_ctl.control_type) && - (hpi_ctl.src_node_type == prev_ctl.src_node_type) && - (hpi_ctl.src_node_index == prev_ctl.src_node_index) && - (hpi_ctl.dst_node_type == prev_ctl.dst_node_type) && - (hpi_ctl.dst_node_index == prev_ctl.dst_node_index)) - subindex++; - else - subindex = 0; - - prev_ctl = hpi_ctl; - - switch (hpi_ctl.control_type) { - case HPI_CONTROL_VOLUME: - err = snd_asihpi_volume_add(asihpi, &hpi_ctl); - break; - case HPI_CONTROL_LEVEL: - err = snd_asihpi_level_add(asihpi, &hpi_ctl); - break; - case HPI_CONTROL_MULTIPLEXER: - err = snd_asihpi_mux_add(asihpi, &hpi_ctl); - break; - case HPI_CONTROL_CHANNEL_MODE: - err = snd_asihpi_cmode_add(asihpi, &hpi_ctl); - break; - case HPI_CONTROL_METER: - err = snd_asihpi_meter_add(asihpi, &hpi_ctl, subindex); - break; - case HPI_CONTROL_SAMPLECLOCK: - err = snd_asihpi_sampleclock_add( - asihpi, &hpi_ctl); - break; - case HPI_CONTROL_CONNECTION: /* ignore these */ - continue; - case HPI_CONTROL_TUNER: - err = snd_asihpi_tuner_add(asihpi, &hpi_ctl); - break; - case HPI_CONTROL_AESEBU_TRANSMITTER: - err = snd_asihpi_aesebu_tx_add(asihpi, &hpi_ctl); - break; - case HPI_CONTROL_AESEBU_RECEIVER: - err = snd_asihpi_aesebu_rx_add(asihpi, &hpi_ctl); - break; - case HPI_CONTROL_VOX: - case HPI_CONTROL_BITSTREAM: - case HPI_CONTROL_MICROPHONE: - case HPI_CONTROL_PARAMETRIC_EQ: - case HPI_CONTROL_COMPANDER: - default: - if (mixer_dump) - snd_printk(KERN_INFO - "untranslated HPI control" - "(%d) %d %d %d %d %d\n", - idx, - hpi_ctl.control_type, - hpi_ctl.src_node_type, - hpi_ctl.src_node_index, - hpi_ctl.dst_node_type, - hpi_ctl.dst_node_index); - continue; - }; - if (err < 0) - return err; - } - if (HPI_ERROR_INVALID_OBJ_INDEX != err) - hpi_handle_error(err); - - snd_printk(KERN_INFO "%d mixer controls found\n", idx); - - return 0; -} - -/*------------------------------------------------------------ - /proc interface - ------------------------------------------------------------*/ - -static void -snd_asihpi_proc_read(struct snd_info_entry *entry, - struct snd_info_buffer *buffer) -{ - struct snd_card_asihpi *asihpi = entry->private_data; - u16 version; - u32 h_control; - u32 rate = 0; - u16 source = 0; - int err; - - snd_iprintf(buffer, "ASIHPI driver proc file\n"); - snd_iprintf(buffer, - "adapter ID=%4X\n_index=%d\n" - "num_outstreams=%d\n_num_instreams=%d\n", - asihpi->type, asihpi->adapter_index, - asihpi->num_outstreams, asihpi->num_instreams); - - version = asihpi->version; - snd_iprintf(buffer, - "serial#=%d\n_hw version %c%d\nDSP code version %03d\n", - asihpi->serial_number, ((version >> 3) & 0xf) + 'A', - version & 0x7, - ((version >> 13) * 100) + ((version >> 7) & 0x3f)); - - err = hpi_mixer_get_control(ss, asihpi->h_mixer, - HPI_SOURCENODE_CLOCK_SOURCE, 0, 0, 0, - HPI_CONTROL_SAMPLECLOCK, &h_control); - - if (!err) { - err = hpi_sample_clock_get_sample_rate(ss, - h_control, &rate); - err += hpi_sample_clock_get_source(ss, h_control, &source); - - if (!err) - snd_iprintf(buffer, "sample_clock=%d_hz, source %s\n", - rate, sampleclock_sources[source]); - } - -} - - -static void __devinit snd_asihpi_proc_init(struct snd_card_asihpi *asihpi) -{ - struct snd_info_entry *entry; - - if (!snd_card_proc_new(asihpi->card, "info", &entry)) - snd_info_set_text_ops(entry, asihpi, snd_asihpi_proc_read); -} - -/*------------------------------------------------------------ - HWDEP - ------------------------------------------------------------*/ - -static int snd_asihpi_hpi_open(struct snd_hwdep *hw, struct file *file) -{ - if (enable_hpi_hwdep) - return 0; - else - return -ENODEV; - -} - -static int snd_asihpi_hpi_release(struct snd_hwdep *hw, struct file *file) -{ - if (enable_hpi_hwdep) - return asihpi_hpi_release(file); - else - return -ENODEV; -} - -static int snd_asihpi_hpi_ioctl(struct snd_hwdep *hw, struct file *file, - unsigned int cmd, unsigned long arg) -{ - if (enable_hpi_hwdep) - return asihpi_hpi_ioctl(file, cmd, arg); - else - return -ENODEV; -} - - -/* results in /dev/snd/hwC#D0 file for each card with index # - also /proc/asound/hwdep will contain '#-00: asihpi (HPI) for each card' -*/ -static int __devinit snd_asihpi_hpi_new(struct snd_card_asihpi *asihpi, - int device, struct snd_hwdep **rhwdep) -{ - struct snd_hwdep *hw; - int err; - - if (rhwdep) - *rhwdep = NULL; - err = snd_hwdep_new(asihpi->card, "HPI", device, &hw); - if (err < 0) - return err; - strcpy(hw->name, "asihpi (HPI)"); - hw->iface = SNDRV_HWDEP_IFACE_LAST; - hw->ops.open = snd_asihpi_hpi_open; - hw->ops.ioctl = snd_asihpi_hpi_ioctl; - hw->ops.release = snd_asihpi_hpi_release; - hw->private_data = asihpi; - if (rhwdep) - *rhwdep = hw; - return 0; -} - -/*------------------------------------------------------------ - CARD - ------------------------------------------------------------*/ -static int __devinit snd_asihpi_probe(struct pci_dev *pci_dev, - const struct pci_device_id *pci_id) -{ - int err; - - u16 version; - int pcm_substreams; - - struct hpi_adapter *hpi_card; - struct snd_card *card; - struct snd_card_asihpi *asihpi; - - u32 h_control; - u32 h_stream; - - static int dev; - if (dev >= SNDRV_CARDS) - return -ENODEV; - - /* Should this be enable[hpi_card->index] ? */ - if (!enable[dev]) { - dev++; - return -ENOENT; - } - - err = asihpi_adapter_probe(pci_dev, pci_id); - if (err < 0) - return err; - - hpi_card = pci_get_drvdata(pci_dev); - /* first try to give the card the same index as its hardware index */ - err = snd_card_create(hpi_card->index, - id[hpi_card->index], THIS_MODULE, - sizeof(struct snd_card_asihpi), - &card); - if (err < 0) { - /* if that fails, try the default index==next available */ - err = - snd_card_create(index[dev], id[dev], - THIS_MODULE, - sizeof(struct snd_card_asihpi), - &card); - if (err < 0) - return err; - snd_printk(KERN_WARNING - "**** WARNING **** adapter index %d->ALSA index %d\n", - hpi_card->index, card->number); - } - - asihpi = (struct snd_card_asihpi *) card->private_data; - asihpi->card = card; - asihpi->pci = hpi_card->pci; - asihpi->adapter_index = hpi_card->index; - hpi_handle_error(hpi_adapter_get_info(ss, - asihpi->adapter_index, - &asihpi->num_outstreams, - &asihpi->num_instreams, - &asihpi->version, - &asihpi->serial_number, &asihpi->type)); - - version = asihpi->version; - snd_printk(KERN_INFO "adapter ID=%4X index=%d num_outstreams=%d " - "num_instreams=%d S/N=%d\n" - "hw version %c%d DSP code version %03d\n", - asihpi->type, asihpi->adapter_index, - asihpi->num_outstreams, - asihpi->num_instreams, asihpi->serial_number, - ((version >> 3) & 0xf) + 'A', - version & 0x7, - ((version >> 13) * 100) + ((version >> 7) & 0x3f)); - - pcm_substreams = asihpi->num_outstreams; - if (pcm_substreams < asihpi->num_instreams) - pcm_substreams = asihpi->num_instreams; - - err = hpi_adapter_get_property(ss, asihpi->adapter_index, - HPI_ADAPTER_PROPERTY_CAPS1, - NULL, &asihpi->support_grouping); - if (err) - asihpi->support_grouping = 0; - - err = hpi_adapter_get_property(ss, asihpi->adapter_index, - HPI_ADAPTER_PROPERTY_CAPS2, - &asihpi->support_mrx, NULL); - if (err) - asihpi->support_mrx = 0; - - err = hpi_adapter_get_property(ss, asihpi->adapter_index, - HPI_ADAPTER_PROPERTY_INTERVAL, - NULL, &asihpi->update_interval_frames); - if (err) - asihpi->update_interval_frames = 512; - - hpi_handle_error(hpi_instream_open(ss, asihpi->adapter_index, - 0, &h_stream)); - - err = hpi_instream_host_buffer_free(ss, h_stream); - asihpi->support_mmap = (!err); - - hpi_handle_error(hpi_instream_close(ss, h_stream)); - - err = hpi_adapter_get_property(ss, asihpi->adapter_index, - HPI_ADAPTER_PROPERTY_CURCHANNELS, - &asihpi->in_max_chans, &asihpi->out_max_chans); - if (err) { - asihpi->in_max_chans = 2; - asihpi->out_max_chans = 2; - } - - snd_printk(KERN_INFO "supports mmap:%d grouping:%d mrx:%d\n", - asihpi->support_mmap, - asihpi->support_grouping, - asihpi->support_mrx - ); - - - err = snd_card_asihpi_pcm_new(asihpi, 0, pcm_substreams); - if (err < 0) { - snd_printk(KERN_ERR "pcm_new failed\n"); - goto __nodev; - } - err = snd_card_asihpi_mixer_new(asihpi); - if (err < 0) { - snd_printk(KERN_ERR "mixer_new failed\n"); - goto __nodev; - } - - err = hpi_mixer_get_control(ss, asihpi->h_mixer, - HPI_SOURCENODE_CLOCK_SOURCE, 0, 0, 0, - HPI_CONTROL_SAMPLECLOCK, &h_control); - - if (!err) - err = hpi_sample_clock_set_local_rate( - ss, h_control, adapter_fs); - - snd_asihpi_proc_init(asihpi); - - /* always create, can be enabled or disabled dynamically - by enable_hwdep module param*/ - snd_asihpi_hpi_new(asihpi, 0, NULL); - - if (asihpi->support_mmap) - strcpy(card->driver, "ASIHPI-MMAP"); - else - strcpy(card->driver, "ASIHPI"); - - sprintf(card->shortname, "AudioScience ASI%4X", asihpi->type); - sprintf(card->longname, "%s %i", - card->shortname, asihpi->adapter_index); - err = snd_card_register(card); - if (!err) { - hpi_card->snd_card_asihpi = card; - dev++; - return 0; - } -__nodev: - snd_card_free(card); - snd_printk(KERN_ERR "snd_asihpi_probe error %d\n", err); - return err; - -} - -static void __devexit snd_asihpi_remove(struct pci_dev *pci_dev) -{ - struct hpi_adapter *hpi_card = pci_get_drvdata(pci_dev); - - snd_card_free(hpi_card->snd_card_asihpi); - hpi_card->snd_card_asihpi = NULL; - asihpi_adapter_remove(pci_dev); -} - -static DEFINE_PCI_DEVICE_TABLE(asihpi_pci_tbl) = { - {HPI_PCI_VENDOR_ID_TI, HPI_PCI_DEV_ID_DSP6205, - HPI_PCI_VENDOR_ID_AUDIOSCIENCE, PCI_ANY_ID, 0, 0, - (kernel_ulong_t)HPI_6205}, - {HPI_PCI_VENDOR_ID_TI, HPI_PCI_DEV_ID_PCI2040, - HPI_PCI_VENDOR_ID_AUDIOSCIENCE, PCI_ANY_ID, 0, 0, - (kernel_ulong_t)HPI_6000}, - {0,} -}; -MODULE_DEVICE_TABLE(pci, asihpi_pci_tbl); - -static struct pci_driver driver = { - .name = "asihpi", - .id_table = asihpi_pci_tbl, - .probe = snd_asihpi_probe, - .remove = __devexit_p(snd_asihpi_remove), -#ifdef CONFIG_PM -/* .suspend = snd_asihpi_suspend, - .resume = snd_asihpi_resume, */ -#endif -}; - -static int __init snd_asihpi_init(void) -{ - asihpi_init(); - return pci_register_driver(&driver); -} - -static void __exit snd_asihpi_exit(void) -{ - - pci_unregister_driver(&driver); - asihpi_exit(); -} - -module_init(snd_asihpi_init) -module_exit(snd_asihpi_exit) - +#include "../../alsa-kernel/pci/asihpi/asihpi.c" diff --git a/pci/asihpi/hpi.h b/pci/asihpi/hpi.h deleted file mode 100644 index 99400de6c..000000000 --- a/pci/asihpi/hpi.h +++ /dev/null @@ -1,2001 +0,0 @@ -/****************************************************************************** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*/ -/** \file hpi.h - - AudioScience Hardware Programming Interface (HPI) - public API definition. - - The HPI is a low-level hardware abstraction layer to all - AudioScience digital audio adapters -*/ -/* - You must define one operating system that the HPI is to be compiled under - HPI_OS_WIN32_USER 32bit Windows - HPI_OS_DSP_C6000 DSP TI C6000 (automatically set) - HPI_OS_WDM Windows WDM kernel driver - HPI_OS_LINUX Linux userspace - HPI_OS_LINUX_KERNEL Linux kernel (automatically set) - -(C) Copyright AudioScience Inc. 1998-2010 -******************************************************************************/ -#ifndef _HPI_H_ -#define _HPI_H_ -/* HPI Version -If HPI_VER_MINOR is odd then its a development release not intended for the -public. If HPI_VER_MINOR is even then is a release version -i.e 3.05.02 is a development version -*/ -#define HPI_VERSION_CONSTRUCTOR(maj, min, rel) \ - ((maj << 16) + (min << 8) + rel) - -#define HPI_VER_MAJOR(v) ((int)(v >> 16)) -#define HPI_VER_MINOR(v) ((int)((v >> 8) & 0xFF)) -#define HPI_VER_RELEASE(v) ((int)(v & 0xFF)) - -/* Use single digits for versions less that 10 to avoid octal. */ -#define HPI_VER HPI_VERSION_CONSTRUCTOR(4L, 3, 18) - -/* Library version as documented in hpi-api-versions.txt */ -#define HPI_LIB_VER HPI_VERSION_CONSTRUCTOR(9, 0, 0) - -#include <linux/types.h> -#define HPI_EXCLUDE_DEPRECATED - -/******************************************************************************/ -/******************************************************************************/ -/******** HPI API DEFINITIONS *****/ -/******************************************************************************/ -/******************************************************************************/ -/*******************************************/ -/** Audio format types -\ingroup stream -*/ -enum HPI_FORMATS { -/** Used internally on adapter. */ - HPI_FORMAT_MIXER_NATIVE = 0, -/** 8-bit unsigned PCM. Windows equivalent is WAVE_FORMAT_PCM. */ - HPI_FORMAT_PCM8_UNSIGNED = 1, -/** 16-bit signed PCM. Windows equivalent is WAVE_FORMAT_PCM. */ - HPI_FORMAT_PCM16_SIGNED = 2, -/** MPEG-1 Layer-1. */ - HPI_FORMAT_MPEG_L1 = 3, -/** MPEG-1 Layer-2. - -Windows equivalent is WAVE_FORMAT_MPEG. - -The following table shows what combinations of mode and bitrate are possible: - -<table border=1 cellspacing=0 cellpadding=5> -<tr> -<td><p><b>Bitrate (kbs)</b></p> -<td><p><b>Mono</b></p> -<td><p><b>Stereo,<br>Joint Stereo or<br>Dual Channel</b></p> - -<tr><td>32<td>X<td>_ -<tr><td>40<td>_<td>_ -<tr><td>48<td>X<td>_ -<tr><td>56<td>X<td>_ -<tr><td>64<td>X<td>X -<tr><td>80<td>X<td>_ -<tr><td>96<td>X<td>X -<tr><td>112<td>X<td>X -<tr><td>128<td>X<td>X -<tr><td>160<td>X<td>X -<tr><td>192<td>X<td>X -<tr><td>224<td>_<td>X -<tr><td>256<td>-<td>X -<tr><td>320<td>-<td>X -<tr><td>384<td>_<td>X -</table> -*/ - HPI_FORMAT_MPEG_L2 = 4, -/** MPEG-1 Layer-3. -Windows equivalent is WAVE_FORMAT_MPEG. - -The following table shows what combinations of mode and bitrate are possible: - -<table border=1 cellspacing=0 cellpadding=5> -<tr> -<td><p><b>Bitrate (kbs)</b></p> -<td><p><b>Mono<br>Stereo @ 8,<br>11.025 and<br>12kHz*</b></p> -<td><p><b>Mono<br>Stereo @ 16,<br>22.050 and<br>24kHz*</b></p> -<td><p><b>Mono<br>Stereo @ 32,<br>44.1 and<br>48kHz</b></p> - -<tr><td>16<td>X<td>X<td>_ -<tr><td>24<td>X<td>X<td>_ -<tr><td>32<td>X<td>X<td>X -<tr><td>40<td>X<td>X<td>X -<tr><td>48<td>X<td>X<td>X -<tr><td>56<td>X<td>X<td>X -<tr><td>64<td>X<td>X<td>X -<tr><td>80<td>_<td>X<td>X -<tr><td>96<td>_<td>X<td>X -<tr><td>112<td>_<td>X<td>X -<tr><td>128<td>_<td>X<td>X -<tr><td>144<td>_<td>X<td>_ -<tr><td>160<td>_<td>X<td>X -<tr><td>192<td>_<td>_<td>X -<tr><td>224<td>_<td>_<td>X -<tr><td>256<td>-<td>_<td>X -<tr><td>320<td>-<td>_<td>X -</table> -\b * Available on the ASI6000 series only -*/ - HPI_FORMAT_MPEG_L3 = 5, -/** Dolby AC-2. */ - HPI_FORMAT_DOLBY_AC2 = 6, -/** Dolbt AC-3. */ - HPI_FORMAT_DOLBY_AC3 = 7, -/** 16-bit PCM big-endian. */ - HPI_FORMAT_PCM16_BIGENDIAN = 8, -/** TAGIT-1 algorithm - hits. */ - HPI_FORMAT_AA_TAGIT1_HITS = 9, -/** TAGIT-1 algorithm - inserts. */ - HPI_FORMAT_AA_TAGIT1_INSERTS = 10, -/** 32-bit signed PCM. Windows equivalent is WAVE_FORMAT_PCM. -Each sample is a 32bit word. The most significant 24 bits contain a 24-bit -sample and the least significant 8 bits are set to 0. -*/ - HPI_FORMAT_PCM32_SIGNED = 11, -/** Raw bitstream - unknown format. */ - HPI_FORMAT_RAW_BITSTREAM = 12, -/** TAGIT-1 algorithm hits - extended. */ - HPI_FORMAT_AA_TAGIT1_HITS_EX1 = 13, -/** 32-bit PCM as an IEEE float. Windows equivalent is WAVE_FORMAT_IEEE_FLOAT. -Each sample is a 32bit word in IEEE754 floating point format. -The range is +1.0 to -1.0, which corresponds to digital fullscale. -*/ - HPI_FORMAT_PCM32_FLOAT = 14, -/** 24-bit PCM signed. Windows equivalent is WAVE_FORMAT_PCM. */ - HPI_FORMAT_PCM24_SIGNED = 15, -/** OEM format 1 - private. */ - HPI_FORMAT_OEM1 = 16, -/** OEM format 2 - private. */ - HPI_FORMAT_OEM2 = 17, -/** Undefined format. */ - HPI_FORMAT_UNDEFINED = 0xffff -}; - -/******************************************* in/out Stream states */ -/*******************************************/ -/** Stream States -\ingroup stream -*/ -enum HPI_STREAM_STATES { - /** State stopped - stream is stopped. */ - HPI_STATE_STOPPED = 1, - /** State playing - stream is playing audio. */ - HPI_STATE_PLAYING = 2, - /** State recording - stream is recording. */ - HPI_STATE_RECORDING = 3, - /** State drained - playing stream ran out of data to play. */ - HPI_STATE_DRAINED = 4, - /** State generate sine - to be implemented. */ - HPI_STATE_SINEGEN = 5, - /** State wait - used for inter-card sync to mean waiting for all - cards to be ready. */ - HPI_STATE_WAIT = 6 -}; -/******************************************* mixer source node types */ -/** Source node types -\ingroup mixer -*/ -enum HPI_SOURCENODES { - /** This define can be used instead of 0 to indicate - that there is no valid source node. A control that - exists on a destination node can be searched for using a source - node value of either 0, or HPI_SOURCENODE_NONE */ - HPI_SOURCENODE_NONE = 100, - /** \deprecated Use HPI_SOURCENODE_NONE instead. */ - HPI_SOURCENODE_BASE = 100, - /** Out Stream (Play) node. */ - HPI_SOURCENODE_OSTREAM = 101, - /** Line in node - could be analog, AES/EBU or network. */ - HPI_SOURCENODE_LINEIN = 102, - HPI_SOURCENODE_AESEBU_IN = 103, /**< AES/EBU input node. */ - HPI_SOURCENODE_TUNER = 104, /**< tuner node. */ - HPI_SOURCENODE_RF = 105, /**< RF input node. */ - HPI_SOURCENODE_CLOCK_SOURCE = 106, /**< clock source node. */ - HPI_SOURCENODE_RAW_BITSTREAM = 107, /**< raw bitstream node. */ - HPI_SOURCENODE_MICROPHONE = 108, /**< microphone node. */ - /** Cobranet input node - - Audio samples come from the Cobranet network and into the device. */ - HPI_SOURCENODE_COBRANET = 109, - HPI_SOURCENODE_ANALOG = 110, /**< analog input node. */ - HPI_SOURCENODE_ADAPTER = 111, /**< adapter node. */ - /* !!!Update this AND hpidebug.h if you add a new sourcenode type!!! */ - HPI_SOURCENODE_LAST_INDEX = 111 /**< largest ID */ - /* AX6 max sourcenode types = 15 */ -}; - -/******************************************* mixer dest node types */ -/** Destination node types -\ingroup mixer -*/ -enum HPI_DESTNODES { - /** This define can be used instead of 0 to indicate - that there is no valid destination node. A control that - exists on a source node can be searched for using a destination - node value of either 0, or HPI_DESTNODE_NONE */ - HPI_DESTNODE_NONE = 200, - /** \deprecated Use HPI_DESTNODE_NONE instead. */ - HPI_DESTNODE_BASE = 200, - /** In Stream (Record) node. */ - HPI_DESTNODE_ISTREAM = 201, - HPI_DESTNODE_LINEOUT = 202, /**< line out node. */ - HPI_DESTNODE_AESEBU_OUT = 203, /**< AES/EBU output node. */ - HPI_DESTNODE_RF = 204, /**< RF output node. */ - HPI_DESTNODE_SPEAKER = 205, /**< speaker output node. */ - /** Cobranet output node - - Audio samples from the device are sent out on the Cobranet network.*/ - HPI_DESTNODE_COBRANET = 206, - HPI_DESTNODE_ANALOG = 207, /**< analog output node. */ - - /* !!!Update this AND hpidebug.h if you add a new destnode type!!! */ - HPI_DESTNODE_LAST_INDEX = 207 /**< largest ID */ - /* AX6 max destnode types = 15 */ -}; - -/*******************************************/ -/** Mixer control types -\ingroup mixer -*/ -enum HPI_CONTROLS { - HPI_CONTROL_GENERIC = 0, /**< generic control. */ - HPI_CONTROL_CONNECTION = 1, /**< A connection between nodes. */ - HPI_CONTROL_VOLUME = 2, /**< volume control - works in dB_fs. */ - HPI_CONTROL_METER = 3, /**< peak meter control. */ - HPI_CONTROL_MUTE = 4, /*mute control - not used at present. */ - HPI_CONTROL_MULTIPLEXER = 5, /**< multiplexer control. */ - - HPI_CONTROL_AESEBU_TRANSMITTER = 6, /**< AES/EBU transmitter control. */ - HPI_CONTROL_AESEBUTX = HPI_CONTROL_AESEBU_TRANSMITTER, - - HPI_CONTROL_AESEBU_RECEIVER = 7, /**< AES/EBU receiver control. */ - HPI_CONTROL_AESEBURX = HPI_CONTROL_AESEBU_RECEIVER, - - HPI_CONTROL_LEVEL = 8, /**< level/trim control - works in d_bu. */ - HPI_CONTROL_TUNER = 9, /**< tuner control. */ -/* HPI_CONTROL_ONOFFSWITCH = 10 */ - HPI_CONTROL_VOX = 11, /**< vox control. */ -/* HPI_CONTROL_AES18_TRANSMITTER = 12 */ -/* HPI_CONTROL_AES18_RECEIVER = 13 */ -/* HPI_CONTROL_AES18_BLOCKGENERATOR = 14 */ - HPI_CONTROL_CHANNEL_MODE = 15, /**< channel mode control. */ - - HPI_CONTROL_BITSTREAM = 16, /**< bitstream control. */ - HPI_CONTROL_SAMPLECLOCK = 17, /**< sample clock control. */ - HPI_CONTROL_MICROPHONE = 18, /**< microphone control. */ - HPI_CONTROL_PARAMETRIC_EQ = 19, /**< parametric EQ control. */ - HPI_CONTROL_EQUALIZER = HPI_CONTROL_PARAMETRIC_EQ, - - HPI_CONTROL_COMPANDER = 20, /**< compander control. */ - HPI_CONTROL_COBRANET = 21, /**< cobranet control. */ - HPI_CONTROL_TONEDETECTOR = 22, /**< tone detector control. */ - HPI_CONTROL_SILENCEDETECTOR = 23, /**< silence detector control. */ - HPI_CONTROL_PAD = 24, /**< tuner PAD control. */ - HPI_CONTROL_SRC = 25, /**< samplerate converter control. */ - HPI_CONTROL_UNIVERSAL = 26, /**< universal control. */ - -/* !!! Update this AND hpidebug.h if you add a new control type!!!*/ - HPI_CONTROL_LAST_INDEX = 26 /**<highest control type ID */ -/* WARNING types 256 or greater impact bit packing in all AX6 DSP code */ -}; - -/* Shorthand names that match attribute names */ - -/******************************************* ADAPTER ATTRIBUTES ****/ - -/** Adapter properties -These are used in HPI_AdapterSetProperty() and HPI_AdapterGetProperty() -\ingroup adapter -*/ -enum HPI_ADAPTER_PROPERTIES { -/** \internal Used in dwProperty field of HPI_AdapterSetProperty() and -HPI_AdapterGetProperty(). This errata applies to all ASI6000 cards with both -analog and digital outputs. The CS4224 A/D+D/A has a one sample delay between -left and right channels on both its input (ADC) and output (DAC). -More details are available in Cirrus Logic errata ER284B2. -PDF available from www.cirrus.com, released by Cirrus in 2001. -*/ - HPI_ADAPTER_PROPERTY_ERRATA_1 = 1, - -/** Adapter grouping property -Indicates whether the adapter supports the grouping API (for ASIO and SSX2) -*/ - HPI_ADAPTER_PROPERTY_GROUPING = 2, - -/** Driver SSX2 property -Tells the kernel driver to turn on SSX2 stream mapping. -This feature is not used by the DSP. In fact the call is completely processed -by the driver and is not passed on to the DSP at all. -*/ - HPI_ADAPTER_PROPERTY_ENABLE_SSX2 = 3, - -/** Adapter SSX2 property -Indicates the state of the adapter's SSX2 setting. This setting is stored in -non-volatile memory on the adapter. A typical call sequence would be to use -HPI_ADAPTER_PROPERTY_SSX2_SETTING to set SSX2 on the adapter and then to reload -the driver. The driver would query HPI_ADAPTER_PROPERTY_SSX2_SETTING during startup -and if SSX2 is set, it would then call HPI_ADAPTER_PROPERTY_ENABLE_SSX2 to enable -SSX2 stream mapping within the kernel level of the driver. -*/ - HPI_ADAPTER_PROPERTY_SSX2_SETTING = 4, - -/** Base number for readonly properties */ - HPI_ADAPTER_PROPERTY_READONLYBASE = 256, - -/** Readonly adapter latency property. -This property returns in the input and output latency in samples. -Property 1 is the estimated input latency -in samples, while Property 2 is that output latency in samples. -*/ - HPI_ADAPTER_PROPERTY_LATENCY = 256, - -/** Readonly adapter granularity property. -The granulariy is the smallest size chunk of stereo samples that is processed by -the adapter. -This property returns the record granularity in samples in Property 1. -Property 2 returns the play granularity. -*/ - HPI_ADAPTER_PROPERTY_GRANULARITY = 257, - -/** Readonly adapter number of current channels property. -Property 1 is the number of record channels per record device. -Property 2 is the number of play channels per playback device.*/ - HPI_ADAPTER_PROPERTY_CURCHANNELS = 258, - -/** Readonly adapter software version. -The SOFTWARE_VERSION property returns the version of the software running -on the adapter as Major.Minor.Release. -Property 1 contains Major in bits 15..8 and Minor in bits 7..0. -Property 2 contains Release in bits 7..0. */ - HPI_ADAPTER_PROPERTY_SOFTWARE_VERSION = 259, - -/** Readonly adapter MAC address MSBs. -The MAC_ADDRESS_MSB property returns -the most significant 32 bits of the MAC address. -Property 1 contains bits 47..32 of the MAC address. -Property 2 contains bits 31..16 of the MAC address. */ - HPI_ADAPTER_PROPERTY_MAC_ADDRESS_MSB = 260, - -/** Readonly adapter MAC address LSBs -The MAC_ADDRESS_LSB property returns -the least significant 16 bits of the MAC address. -Property 1 contains bits 15..0 of the MAC address. */ - HPI_ADAPTER_PROPERTY_MAC_ADDRESS_LSB = 261, - -/** Readonly extended adapter type number -The EXTENDED_ADAPTER_TYPE property returns the 4 digits of an extended -adapter type, i.e ASI8920-0022, 0022 is the extended type. -The digits are returned as ASCII characters rather than the hex digits that -are returned for the main type -Property 1 returns the 1st two (left most) digits, i.e "00" -in the example above, the upper byte being the left most digit. -Property 2 returns the 2nd two digits, i.e "22" in the example above*/ - HPI_ADAPTER_PROPERTY_EXTENDED_ADAPTER_TYPE = 262, - -/** Readonly debug log buffer information */ - HPI_ADAPTER_PROPERTY_LOGTABLEN = 263, - HPI_ADAPTER_PROPERTY_LOGTABBEG = 264, - -/** Readonly adapter IP address -For 192.168.1.101 -Property 1 returns the 1st two (left most) digits, i.e 192*256 + 168 -in the example above, the upper byte being the left most digit. -Property 2 returns the 2nd two digits, i.e 1*256 + 101 in the example above, */ - HPI_ADAPTER_PROPERTY_IP_ADDRESS = 265, - -/** Readonly adapter buffer processed count. Returns a buffer processed count -that is incremented every time all buffers for all streams are updated. This -is useful for checking completion of all stream operations across the adapter -when using grouped streams. -*/ - HPI_ADAPTER_PROPERTY_BUFFER_UPDATE_COUNT = 266, - -/** Readonly mixer and stream intervals - -These intervals are measured in mixer frames. -To convert to time, divide by the adapter samplerate. - -The mixer interval is the number of frames processed in one mixer iteration. -The stream update interval is the interval at which streams check for and -process data, and BBM host buffer counters are updated. - -Property 1 is the mixer interval in mixer frames. -Property 2 is the stream update interval in mixer frames. -*/ - HPI_ADAPTER_PROPERTY_INTERVAL = 267, -/** Adapter capabilities 1 -Property 1 - adapter can do multichannel (SSX1) -Property 2 - adapter can do stream grouping (supports SSX2) -*/ - HPI_ADAPTER_PROPERTY_CAPS1 = 268, -/** Adapter capabilities 2 -Property 1 - adapter can do samplerate conversion (MRX) -Property 2 - adapter can do timestretch (TSX) -*/ - HPI_ADAPTER_PROPERTY_CAPS2 = 269 -}; - -/** Adapter mode commands - -Used in wQueryOrSet field of HPI_AdapterSetModeEx(). -\ingroup adapter -*/ -enum HPI_ADAPTER_MODE_CMDS { - HPI_ADAPTER_MODE_SET = 0, - HPI_ADAPTER_MODE_QUERY = 1 -}; - -/** Adapter Modes - These are used by HPI_AdapterSetModeEx() - -\warning - more than 16 possible modes breaks -a bitmask in the Windows WAVE DLL -\ingroup adapter -*/ -enum HPI_ADAPTER_MODES { -/** 4 outstream mode. -- ASI6114: 1 instream -- ASI6044: 4 instreams -- ASI6012: 1 instream -- ASI6102: no instreams -- ASI6022, ASI6122: 2 instreams -- ASI5111, ASI5101: 2 instreams -- ASI652x, ASI662x: 2 instreams -- ASI654x, ASI664x: 4 instreams -*/ - HPI_ADAPTER_MODE_4OSTREAM = 1, - -/** 6 outstream mode. -- ASI6012: 1 instream, -- ASI6022, ASI6122: 2 instreams -- ASI652x, ASI662x: 4 instreams -*/ - HPI_ADAPTER_MODE_6OSTREAM = 2, - -/** 8 outstream mode. -- ASI6114: 8 instreams -- ASI6118: 8 instreams -- ASI6585: 8 instreams -*/ - HPI_ADAPTER_MODE_8OSTREAM = 3, - -/** 16 outstream mode. -- ASI6416 16 instreams -- ASI6518, ASI6618 16 instreams -- ASI6118 16 mono out and in streams -*/ - HPI_ADAPTER_MODE_16OSTREAM = 4, - -/** one outstream mode. -- ASI5111 1 outstream, 1 instream -*/ - HPI_ADAPTER_MODE_1OSTREAM = 5, - -/** ASI504X mode 1. 12 outstream, 4 instream 0 to 48kHz sample rates - (see ASI504X datasheet for more info). -*/ - HPI_ADAPTER_MODE_1 = 6, - -/** ASI504X mode 2. 4 outstreams, 4 instreams at 0 to 192kHz sample rates - (see ASI504X datasheet for more info). -*/ - HPI_ADAPTER_MODE_2 = 7, - -/** ASI504X mode 3. 4 outstreams, 4 instreams at 0 to 192kHz sample rates - (see ASI504X datasheet for more info). -*/ - HPI_ADAPTER_MODE_3 = 8, - -/** ASI504X multichannel mode. - 2 outstreams -> 4 line outs = 1 to 8 channel streams), - 4 lineins -> 1 instream (1 to 8 channel streams) at 0-48kHz. - For more info see the SSX Specification. -*/ - HPI_ADAPTER_MODE_MULTICHANNEL = 9, - -/** 12 outstream mode. -- ASI6514, ASI6614: 2 instreams -- ASI6540,ASI6544: 8 instreams -- ASI6640,ASI6644: 8 instreams -*/ - HPI_ADAPTER_MODE_12OSTREAM = 10, - -/** 9 outstream mode. -- ASI6044: 8 instreams -*/ - HPI_ADAPTER_MODE_9OSTREAM = 11, - -/** mono mode. -- ASI6416: 16 outstreams/instreams -- ASI5402: 2 outstreams/instreams -*/ - HPI_ADAPTER_MODE_MONO = 12, - -/** Low latency mode. -- ASI6416/ASI6316: 1 16 channel outstream and instream -*/ - HPI_ADAPTER_MODE_LOW_LATENCY = 13 -}; - -/* Note, adapters can have more than one capability - -encoding as bitfield is recommended. */ -#define HPI_CAPABILITY_NONE (0) -#define HPI_CAPABILITY_MPEG_LAYER3 (1) - -/* Set this equal to maximum capability index, -Must not be greater than 32 - see axnvdef.h */ -#define HPI_CAPABILITY_MAX 1 -/* #define HPI_CAPABILITY_AAC 2 */ - -/******************************************* STREAM ATTRIBUTES ****/ - -/** MPEG Ancillary Data modes - -The mode for the ancillary data insertion or extraction to operate in. -\ingroup stream -*/ -enum HPI_MPEG_ANC_MODES { - /** the MPEG frames have energy information stored in them (5 bytes per stereo frame, 3 per mono) */ - HPI_MPEG_ANC_HASENERGY = 0, - /** the entire ancillary data field is taken up by data from the Anc data buffer - On encode, the encoder will insert the energy bytes before filling the remainder - of the ancillary data space with data from the ancillary data buffer. - */ - HPI_MPEG_ANC_RAW = 1 -}; - -/** Ancillary Data Alignment -\ingroup instream -*/ -enum HPI_ISTREAM_MPEG_ANC_ALIGNS { - /** data is packed against the end of data, then padded to the end of frame */ - HPI_MPEG_ANC_ALIGN_LEFT = 0, - /** data is packed against the end of the frame */ - HPI_MPEG_ANC_ALIGN_RIGHT = 1 -}; - -/** MPEG modes -MPEG modes - can be used optionally for HPI_FormatCreate() -parameter dwAttributes. - -Using any mode setting other than HPI_MPEG_MODE_DEFAULT -with single channel format will return an error. -\ingroup stream -*/ -enum HPI_MPEG_MODES { -/** Causes the MPEG-1 Layer II bitstream to be recorded -in single_channel mode when the number of channels is 1 and in stereo when the -number of channels is 2. */ - HPI_MPEG_MODE_DEFAULT = 0, - /** Standard stereo without joint-stereo compression */ - HPI_MPEG_MODE_STEREO = 1, - /** Joint stereo */ - HPI_MPEG_MODE_JOINTSTEREO = 2, - /** Left and Right channels are completely independent */ - HPI_MPEG_MODE_DUALCHANNEL = 3 -}; -/******************************************* MIXER ATTRIBUTES ****/ - -/* \defgroup mixer_flags Mixer flags for HPI_MIXER_GET_CONTROL_MULTIPLE_VALUES -{ -*/ -#define HPI_MIXER_GET_CONTROL_MULTIPLE_CHANGED (0) -#define HPI_MIXER_GET_CONTROL_MULTIPLE_RESET (1) -/*}*/ - -/** Commands used by HPI_MixerStore() -\ingroup mixer -*/ -enum HPI_MIXER_STORE_COMMAND { -/** Save all mixer control settings. */ - HPI_MIXER_STORE_SAVE = 1, -/** Restore all controls from saved. */ - HPI_MIXER_STORE_RESTORE = 2, -/** Delete saved control settings. */ - HPI_MIXER_STORE_DELETE = 3, -/** Enable auto storage of some control settings. */ - HPI_MIXER_STORE_ENABLE = 4, -/** Disable auto storage of some control settings. */ - HPI_MIXER_STORE_DISABLE = 5, -/** Save the attributes of a single control. */ - HPI_MIXER_STORE_SAVE_SINGLE = 6 -}; - -/************************************* CONTROL ATTRIBUTE VALUES ****/ -/** Used by mixer plugin enable functions - -E.g. HPI_ParametricEQ_SetState() -\ingroup mixer -*/ -enum HPI_SWITCH_STATES { - HPI_SWITCH_OFF = 0, /**< turn the mixer plugin on. */ - HPI_SWITCH_ON = 1 /**< turn the mixer plugin off. */ -}; - -/* Volume control special gain values */ -/** volumes units are 100ths of a dB -\ingroup volume -*/ -#define HPI_UNITS_PER_dB 100 -/** turns volume control OFF or MUTE -\ingroup volume -*/ -#define HPI_GAIN_OFF (-100 * HPI_UNITS_PER_dB) - -/** value returned for no signal -\ingroup meter -*/ -#define HPI_METER_MINIMUM (-150 * HPI_UNITS_PER_dB) - -/** autofade profiles -\ingroup volume -*/ -enum HPI_VOLUME_AUTOFADES { -/** log fade - dB attenuation changes linearly over time */ - HPI_VOLUME_AUTOFADE_LOG = 2, -/** linear fade - amplitude changes linearly */ - HPI_VOLUME_AUTOFADE_LINEAR = 3 -}; - -/** The physical encoding format of the AESEBU I/O. - -Used in HPI_AESEBU_Transmitter_SetFormat(), HPI_AESEBU_Receiver_SetFormat() -along with related Get and Query functions -\ingroup aestx -*/ -enum HPI_AESEBU_FORMATS { -/** AES/EBU physical format - AES/EBU balanced "professional" */ - HPI_AESEBU_FORMAT_AESEBU = 1, -/** AES/EBU physical format - S/PDIF unbalanced "consumer" */ - HPI_AESEBU_FORMAT_SPDIF = 2 -}; - -/** AES/EBU error status bits - -Returned by HPI_AESEBU_Receiver_GetErrorStatus() -\ingroup aesrx -*/ -enum HPI_AESEBU_ERRORS { -/** bit0: 1 when PLL is not locked */ - HPI_AESEBU_ERROR_NOT_LOCKED = 0x01, -/** bit1: 1 when signal quality is poor */ - HPI_AESEBU_ERROR_POOR_QUALITY = 0x02, -/** bit2: 1 when there is a parity error */ - HPI_AESEBU_ERROR_PARITY_ERROR = 0x04, -/** bit3: 1 when there is a bi-phase coding violation */ - HPI_AESEBU_ERROR_BIPHASE_VIOLATION = 0x08, -/** bit4: 1 when the validity bit is high */ - HPI_AESEBU_ERROR_VALIDITY = 0x10, -/** bit5: 1 when the CRC error bit is high */ - HPI_AESEBU_ERROR_CRC = 0x20 -}; - -/** \addtogroup pad -\{ -*/ -/** The text string containing the station/channel combination. */ -#define HPI_PAD_CHANNEL_NAME_LEN 16 -/** The text string containing the artist. */ -#define HPI_PAD_ARTIST_LEN 64 -/** The text string containing the title. */ -#define HPI_PAD_TITLE_LEN 64 -/** The text string containing the comment. */ -#define HPI_PAD_COMMENT_LEN 256 -/** The PTY when the tuner has not recieved any PTY. */ -#define HPI_PAD_PROGRAM_TYPE_INVALID 0xffff -/** \} */ - -/** Data types for PTY string translation. -\ingroup rds -*/ -enum eHPI_RDS_type { - HPI_RDS_DATATYPE_RDS = 0, /**< RDS bitstream.*/ - HPI_RDS_DATATYPE_RBDS = 1 /**< RBDS bitstream.*/ -}; - -/** Tuner bands - -Used for HPI_Tuner_SetBand(),HPI_Tuner_GetBand() -\ingroup tuner -*/ -enum HPI_TUNER_BAND { - HPI_TUNER_BAND_AM = 1, /**< AM band */ - HPI_TUNER_BAND_FM = 2, /**< FM band (mono) */ - HPI_TUNER_BAND_TV_NTSC_M = 3, /**< NTSC-M TV band*/ - HPI_TUNER_BAND_TV = 3, /* use TV_NTSC_M */ - HPI_TUNER_BAND_FM_STEREO = 4, /**< FM band (stereo) */ - HPI_TUNER_BAND_AUX = 5, /**< auxiliary input */ - HPI_TUNER_BAND_TV_PAL_BG = 6, /**< PAL-B/G TV band*/ - HPI_TUNER_BAND_TV_PAL_I = 7, /**< PAL-I TV band*/ - HPI_TUNER_BAND_TV_PAL_DK = 8, /**< PAL-D/K TV band*/ - HPI_TUNER_BAND_TV_SECAM_L = 9, /**< SECAM-L TV band*/ - HPI_TUNER_BAND_LAST = 9 /**< the index of the last tuner band. */ -}; - -/** Tuner mode attributes - -Used by HPI_Tuner_SetMode(), HPI_Tuner_GetMode() -\ingroup tuner - -*/ -enum HPI_TUNER_MODES { - HPI_TUNER_MODE_RSS = 1, /**< control RSS */ - HPI_TUNER_MODE_RDS = 2 /**< control RBDS/RDS */ -}; - -/** Tuner mode attribute values - -Used by HPI_Tuner_SetMode(), HPI_Tuner_GetMode() -\ingroup tuner -*/ -enum HPI_TUNER_MODE_VALUES { -/* RSS attribute values */ - HPI_TUNER_MODE_RSS_DISABLE = 0, /**< RSS disable */ - HPI_TUNER_MODE_RSS_ENABLE = 1, /**< RSS enable */ - -/* RDS mode attributes */ - HPI_TUNER_MODE_RDS_DISABLE = 0, /**< RDS - disabled */ - HPI_TUNER_MODE_RDS_RDS = 1, /**< RDS - RDS mode */ - HPI_TUNER_MODE_RDS_RBDS = 2 /**< RDS - RBDS mode */ -}; - -/** Tuner Level settings -\ingroup tuner -*/ -enum HPI_TUNER_LEVEL { - HPI_TUNER_LEVEL_AVERAGE = 0, - HPI_TUNER_LEVEL_RAW = 1 -}; - -/** Tuner Status Bits - -These bitfield values are returned by a call to HPI_Tuner_GetStatus(). -Multiple fields are returned from a single call. -\ingroup tuner -*/ -enum HPI_TUNER_STATUS_BITS { - HPI_TUNER_VIDEO_COLOR_PRESENT = 0x0001, /**< video color is present. */ - HPI_TUNER_VIDEO_IS_60HZ = 0x0020, /**< 60 hz video detected. */ - HPI_TUNER_VIDEO_HORZ_SYNC_MISSING = 0x0040, /**< video HSYNC is missing. */ - HPI_TUNER_VIDEO_STATUS_VALID = 0x0100, /**< video status is valid. */ - HPI_TUNER_PLL_LOCKED = 0x1000, /**< the tuner's PLL is locked. */ - HPI_TUNER_FM_STEREO = 0x2000, /**< tuner reports back FM stereo. */ - HPI_TUNER_DIGITAL = 0x0200, /**< tuner reports digital programming. */ - HPI_TUNER_MULTIPROGRAM = 0x0400 /**< tuner reports multiple programs. */ -}; - -/** Channel Modes -Used for HPI_ChannelModeSet/Get() -\ingroup channelmode -*/ -enum HPI_CHANNEL_MODES { -/** Left channel out = left channel in, Right channel out = right channel in. */ - HPI_CHANNEL_MODE_NORMAL = 1, -/** Left channel out = right channel in, Right channel out = left channel in. */ - HPI_CHANNEL_MODE_SWAP = 2, -/** Left channel out = left channel in, Right channel out = left channel in. */ - HPI_CHANNEL_MODE_LEFT_TO_STEREO = 3, -/** Left channel out = right channel in, Right channel out = right channel in.*/ - HPI_CHANNEL_MODE_RIGHT_TO_STEREO = 4, -/** Left channel out = (left channel in + right channel in)/2, - Right channel out = mute. */ - HPI_CHANNEL_MODE_STEREO_TO_LEFT = 5, -/** Left channel out = mute, - Right channel out = (right channel in + left channel in)/2. */ - HPI_CHANNEL_MODE_STEREO_TO_RIGHT = 6, - HPI_CHANNEL_MODE_LAST = 6 -}; - -/** SampleClock source values -\ingroup sampleclock -*/ -enum HPI_SAMPLECLOCK_SOURCES { -/** The sampleclock output is derived from its local samplerate generator. - The local samplerate may be set using HPI_SampleClock_SetLocalRate(). */ - HPI_SAMPLECLOCK_SOURCE_LOCAL = 1, -/** \deprecated Use HPI_SAMPLECLOCK_SOURCE_LOCAL instead */ - HPI_SAMPLECLOCK_SOURCE_ADAPTER = 1, -/** The adapter is clocked from a dedicated AES/EBU SampleClock input.*/ - HPI_SAMPLECLOCK_SOURCE_AESEBU_SYNC = 2, -/** From external wordclock connector */ - HPI_SAMPLECLOCK_SOURCE_WORD = 3, -/** Board-to-board header */ - HPI_SAMPLECLOCK_SOURCE_WORD_HEADER = 4, -/** FUTURE - SMPTE clock. */ - HPI_SAMPLECLOCK_SOURCE_SMPTE = 5, -/** One of the aesebu inputs */ - HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT = 6, -/** \deprecated The first aesebu input with a valid signal -Superseded by separate Auto enable flag -*/ - HPI_SAMPLECLOCK_SOURCE_AESEBU_AUTO = 7, -/** From a network interface e.g. Cobranet or Livewire at either 48 or 96kHz */ - HPI_SAMPLECLOCK_SOURCE_NETWORK = 8, -/** From previous adjacent module (ASI2416 only)*/ - HPI_SAMPLECLOCK_SOURCE_PREV_MODULE = 10, -/*! Update this if you add a new clock source.*/ - HPI_SAMPLECLOCK_SOURCE_LAST = 10 -}; - -/** Equalizer filter types. Used by HPI_ParametricEQ_SetBand() -\ingroup parmeq -*/ -enum HPI_FILTER_TYPE { - HPI_FILTER_TYPE_BYPASS = 0, /**< filter is turned off */ - - HPI_FILTER_TYPE_LOWSHELF = 1, /**< EQ low shelf */ - HPI_FILTER_TYPE_HIGHSHELF = 2, /**< EQ high shelf */ - HPI_FILTER_TYPE_EQ_BAND = 3, /**< EQ gain */ - - HPI_FILTER_TYPE_LOWPASS = 4, /**< standard low pass */ - HPI_FILTER_TYPE_HIGHPASS = 5, /**< standard high pass */ - HPI_FILTER_TYPE_BANDPASS = 6, /**< standard band pass */ - HPI_FILTER_TYPE_BANDSTOP = 7 /**< standard band stop/notch */ -}; - -/** Async Event sources -\ingroup async -*/ -enum ASYNC_EVENT_SOURCES { - HPI_ASYNC_EVENT_GPIO = 1, /**< GPIO event. */ - HPI_ASYNC_EVENT_SILENCE = 2, /**< silence event detected. */ - HPI_ASYNC_EVENT_TONE = 3 /**< tone event detected. */ -}; -/*******************************************/ -/** HPI Error codes - -Almost all HPI functions return an error code -A return value of zero means there was no error. -Otherwise one of these error codes is returned. -Error codes can be converted to a descriptive string using HPI_GetErrorText() - -\note When a new error code is added HPI_GetErrorText() MUST be updated. -\note Codes 1-100 are reserved for driver use -\ingroup utility -*/ -enum HPI_ERROR_CODES { - /** Message type does not exist. */ - HPI_ERROR_INVALID_TYPE = 100, - /** Object type does not exist. */ - HPI_ERROR_INVALID_OBJ = 101, - /** Function does not exist. */ - HPI_ERROR_INVALID_FUNC = 102, - /** The specified object (adapter/Stream) does not exist. */ - HPI_ERROR_INVALID_OBJ_INDEX = 103, - /** Trying to access an object that has not been opened yet. */ - HPI_ERROR_OBJ_NOT_OPEN = 104, - /** Trying to open an already open object. */ - HPI_ERROR_OBJ_ALREADY_OPEN = 105, - /** PCI, ISA resource not valid. */ - HPI_ERROR_INVALID_RESOURCE = 106, - /** GetInfo call from SubSysFindAdapters failed. */ - HPI_ERROR_SUBSYSFINDADAPTERS_GETINFO = 107, - /** Default response was never updated with actual error code. */ - HPI_ERROR_INVALID_RESPONSE = 108, - /** wSize field of response was not updated, - indicating that the message was not processed. */ - HPI_ERROR_PROCESSING_MESSAGE = 109, - /** The network did not respond in a timely manner. */ - HPI_ERROR_NETWORK_TIMEOUT = 110, - /** An HPI handle is invalid (uninitialised?). */ - HPI_ERROR_INVALID_HANDLE = 111, - /** A function or attribute has not been implemented yet. */ - HPI_ERROR_UNIMPLEMENTED = 112, - /** There are too many clients attempting to access a network resource. */ - HPI_ERROR_NETWORK_TOO_MANY_CLIENTS = 113, - /** Response buffer passed to HPI_Message was smaller than returned response */ - HPI_ERROR_RESPONSE_BUFFER_TOO_SMALL = 114, - /** The returned response did not match the sent message */ - HPI_ERROR_RESPONSE_MISMATCH = 115, - - /** Too many adapters.*/ - HPI_ERROR_TOO_MANY_ADAPTERS = 200, - /** Bad adpater. */ - HPI_ERROR_BAD_ADAPTER = 201, - /** Adapter number out of range or not set properly. */ - HPI_ERROR_BAD_ADAPTER_NUMBER = 202, - /** 2 adapters with the same adapter number. */ - HPI_DUPLICATE_ADAPTER_NUMBER = 203, - /** DSP code failed to bootload. */ - HPI_ERROR_DSP_BOOTLOAD = 204, - /** Adapter failed DSP code self test. */ - HPI_ERROR_DSP_SELFTEST = 205, - /** Couldn't find or open the DSP code file. */ - HPI_ERROR_DSP_FILE_NOT_FOUND = 206, - /** Internal DSP hardware error. */ - HPI_ERROR_DSP_HARDWARE = 207, - /** Could not allocate memory in DOS. */ - HPI_ERROR_DOS_MEMORY_ALLOC = 208, - /** Could not allocate memory */ - HPI_ERROR_MEMORY_ALLOC = 208, - /** Failed to correctly load/config PLD .*/ - HPI_ERROR_PLD_LOAD = 209, - /** Unexpected end of file, block length too big etc. */ - HPI_ERROR_DSP_FILE_FORMAT = 210, - - /** Found but could not open DSP code file. */ - HPI_ERROR_DSP_FILE_ACCESS_DENIED = 211, - /** First DSP code section header not found in DSP file. */ - HPI_ERROR_DSP_FILE_NO_HEADER = 212, - /** File read operation on DSP code file failed. */ - HPI_ERROR_DSP_FILE_READ_ERROR = 213, - /** DSP code for adapter family not found. */ - HPI_ERROR_DSP_SECTION_NOT_FOUND = 214, - /** Other OS specific error opening DSP file. */ - HPI_ERROR_DSP_FILE_OTHER_ERROR = 215, - /** Sharing violation opening DSP code file. */ - HPI_ERROR_DSP_FILE_SHARING_VIOLATION = 216, - /** DSP code section header had size == 0. */ - HPI_ERROR_DSP_FILE_NULL_HEADER = 217, - - /** Base number for flash errors. */ - HPI_ERROR_FLASH = 220, - - /** Flash has bad checksum */ - HPI_ERROR_BAD_CHECKSUM = (HPI_ERROR_FLASH + 1), - HPI_ERROR_BAD_SEQUENCE = (HPI_ERROR_FLASH + 2), - HPI_ERROR_FLASH_ERASE = (HPI_ERROR_FLASH + 3), - HPI_ERROR_FLASH_PROGRAM = (HPI_ERROR_FLASH + 4), - HPI_ERROR_FLASH_VERIFY = (HPI_ERROR_FLASH + 5), - HPI_ERROR_FLASH_TYPE = (HPI_ERROR_FLASH + 6), - HPI_ERROR_FLASH_START = (HPI_ERROR_FLASH + 7), - - /** Reserved for OEMs. */ - HPI_ERROR_RESERVED_1 = 290, - - /** Stream does not exist. */ - HPI_ERROR_INVALID_STREAM = 300, - /** Invalid compression format. */ - HPI_ERROR_INVALID_FORMAT = 301, - /** Invalid format samplerate */ - HPI_ERROR_INVALID_SAMPLERATE = 302, - /** Invalid format number of channels. */ - HPI_ERROR_INVALID_CHANNELS = 303, - /** Invalid format bitrate. */ - HPI_ERROR_INVALID_BITRATE = 304, - /** Invalid datasize used for stream read/write. */ - HPI_ERROR_INVALID_DATASIZE = 305, - /** Stream buffer is full during stream write. */ - HPI_ERROR_BUFFER_FULL = 306, - /** Stream buffer is empty during stream read. */ - HPI_ERROR_BUFFER_EMPTY = 307, - /** Invalid datasize used for stream read/write. */ - HPI_ERROR_INVALID_DATA_TRANSFER = 308, - /** Packet ordering error for stream read/write. */ - HPI_ERROR_INVALID_PACKET_ORDER = 309, - - /** Object can't do requested operation in its current - state, eg set format, change rec mux state while recording.*/ - HPI_ERROR_INVALID_OPERATION = 310, - - /** Where an SRG is shared amongst streams, an incompatible samplerate is one - that is different to any currently playing or recording stream. */ - HPI_ERROR_INCOMPATIBLE_SAMPLERATE = 311, - /** Adapter mode is illegal.*/ - HPI_ERROR_BAD_ADAPTER_MODE = 312, - - /** There have been too many attempts to set the adapter's - capabilities (using bad keys), the card should be returned - to ASI if further capabilities updates are required */ - HPI_ERROR_TOO_MANY_CAPABILITY_CHANGE_ATTEMPTS = 313, - /** Streams on different adapters cannot be grouped. */ - HPI_ERROR_NO_INTERADAPTER_GROUPS = 314, - /** Streams on different DSPs cannot be grouped. */ - HPI_ERROR_NO_INTERDSP_GROUPS = 315, - - /** Invalid mixer node for this adapter. */ - HPI_ERROR_INVALID_NODE = 400, - /** Invalid control. */ - HPI_ERROR_INVALID_CONTROL = 401, - /** Invalid control value was passed. */ - HPI_ERROR_INVALID_CONTROL_VALUE = 402, - /** Control attribute not supported by this control. */ - HPI_ERROR_INVALID_CONTROL_ATTRIBUTE = 403, - /** Control is disabled. */ - HPI_ERROR_CONTROL_DISABLED = 404, - /** I2C transaction failed due to a missing ACK. */ - HPI_ERROR_CONTROL_I2C_MISSING_ACK = 405, - /** Control attribute is valid, but not supported by this hardware. */ - HPI_ERROR_UNSUPPORTED_CONTROL_ATTRIBUTE = 406, - /** Control is busy, or coming out of - reset and cannot be accessed at this time. */ - HPI_ERROR_CONTROL_NOT_READY = 407, - - /** Non volatile memory */ - HPI_ERROR_NVMEM_BUSY = 450, - HPI_ERROR_NVMEM_FULL = 451, - HPI_ERROR_NVMEM_FAIL = 452, - - /** I2C */ - HPI_ERROR_I2C_MISSING_ACK = HPI_ERROR_CONTROL_I2C_MISSING_ACK, - HPI_ERROR_I2C_BAD_ADR = 460, - - /** Entity errors */ - HPI_ERROR_ENTITY_TYPE_MISMATCH = 470, - HPI_ERROR_ENTITY_ITEM_COUNT = 471, - HPI_ERROR_ENTITY_TYPE_INVALID = 472, - HPI_ERROR_ENTITY_ROLE_INVALID = 473, - - /* AES18 specific errors were 500..507 */ - - /** custom error to use for debugging */ - HPI_ERROR_CUSTOM = 600, - - /** hpioct32.c can't obtain mutex */ - HPI_ERROR_MUTEX_TIMEOUT = 700, - - /** errors from HPI backends have values >= this */ - HPI_ERROR_BACKEND_BASE = 900, - - /** indicates a cached u16 value is invalid. */ - HPI_ERROR_ILLEGAL_CACHE_VALUE = 0xffff -}; - -/** \defgroup maximums HPI maximum values -\{ -*/ -/** Maximum number of adapters per HPI sub-system - WARNING: modifying this value changes the response structure size.*/ -#define HPI_MAX_ADAPTERS 20 -/** Maximum number of in or out streams per adapter */ -#define HPI_MAX_STREAMS 16 -#define HPI_MAX_CHANNELS 2 /* per stream */ -#define HPI_MAX_NODES 8 /* per mixer ? */ -#define HPI_MAX_CONTROLS 4 /* per node ? */ -/** maximum number of ancillary bytes per MPEG frame */ -#define HPI_MAX_ANC_BYTES_PER_FRAME (64) -#define HPI_STRING_LEN 16 - -/** Velocity units */ -#define HPI_OSTREAM_VELOCITY_UNITS 4096 -/** OutStream timescale units */ -#define HPI_OSTREAM_TIMESCALE_UNITS 10000 -/** OutStream timescale passthrough - turns timescaling on in passthough mode */ -#define HPI_OSTREAM_TIMESCALE_PASSTHROUGH 99999 - -/**\}*/ - -/* ////////////////////////////////////////////////////////////////////// */ -/* STRUCTURES */ -#ifndef DISABLE_PRAGMA_PACK1 -#pragma pack(push, 1) -#endif - -/** Structure containing sample format information. - See also HPI_FormatCreate(). - */ -struct hpi_format { - u32 sample_rate; - /**< 11025, 32000, 44100 ... */ - u32 bit_rate; /**< for MPEG */ - u32 attributes; - /**< Stereo/JointStereo/Mono */ - u16 mode_legacy; - /**< Legacy ancillary mode or idle bit */ - u16 unused; /**< unused */ - u16 channels; /**< 1,2..., (or ancillary mode or idle bit */ - u16 format; /**< HPI_FORMAT_PCM16, _MPEG etc. see #HPI_FORMATS. */ -}; - -struct hpi_anc_frame { - u32 valid_bits_in_this_frame; - u8 b_data[HPI_MAX_ANC_BYTES_PER_FRAME]; -}; - -/** An object for containing a single async event. -*/ -struct hpi_async_event { - u16 event_type; /**< type of event. \sa async_event */ - u16 sequence; /**< sequence number, allows lost event detection */ - u32 state; /**< new state */ - u32 h_object; /**< handle to the object returning the event. */ - union { - struct { - u16 index; /**< GPIO bit index. */ - } gpio; - struct { - u16 node_index; /**< what node is the control on ? */ - u16 node_type; /**< what type of node is the control on ? */ - } control; - } u; -}; - -/*/////////////////////////////////////////////////////////////////////////// */ -/* Public HPI Entity related definitions */ - -struct hpi_entity; - -enum e_entity_type { - entity_type_null, - entity_type_sequence, /* sequence of potentially heterogeneous TLV entities */ - - entity_type_reference, /* refers to a TLV entity or NULL */ - - entity_type_int, /* 32 bit */ - entity_type_float, /* ieee754 binary 32 bit encoding */ - entity_type_double, - - entity_type_cstring, - entity_type_octet, - entity_type_ip4_address, - entity_type_ip6_address, - entity_type_mac_address, - - LAST_ENTITY_TYPE -}; - -enum e_entity_role { - entity_role_null, - entity_role_value, - entity_role_classname, - - entity_role_units, - entity_role_flags, - entity_role_range, - - entity_role_mapping, - entity_role_enum, - - entity_role_instance_of, - entity_role_depends_on, - entity_role_member_of_group, - entity_role_value_constraint, - entity_role_parameter_port, - - entity_role_block, - entity_role_node_group, - entity_role_audio_port, - entity_role_clock_port, - LAST_ENTITY_ROLE -}; - -/* skip host side function declarations for - DSP compile and documentation extraction */ - -struct hpi_hsubsys { - int not_really_used; -}; - -#ifndef DISABLE_PRAGMA_PACK1 -#pragma pack(pop) -#endif - -/*////////////////////////////////////////////////////////////////////////// */ -/* HPI FUNCTIONS */ - -/*/////////////////////////// */ -/* DATA and FORMAT and STREAM */ - -u16 hpi_stream_estimate_buffer_size(struct hpi_format *pF, - u32 host_polling_rate_in_milli_seconds, u32 *recommended_buffer_size); - -/*/////////// */ -/* SUB SYSTEM */ -struct hpi_hsubsys *hpi_subsys_create(void - ); - -void hpi_subsys_free(const struct hpi_hsubsys *ph_subsys); - -u16 hpi_subsys_get_version(const struct hpi_hsubsys *ph_subsys, - u32 *pversion); - -u16 hpi_subsys_get_version_ex(const struct hpi_hsubsys *ph_subsys, - u32 *pversion_ex); - -u16 hpi_subsys_get_info(const struct hpi_hsubsys *ph_subsys, u32 *pversion, - u16 *pw_num_adapters, u16 aw_adapter_list[], u16 list_length); - -u16 hpi_subsys_find_adapters(const struct hpi_hsubsys *ph_subsys, - u16 *pw_num_adapters, u16 aw_adapter_list[], u16 list_length); - -u16 hpi_subsys_get_num_adapters(const struct hpi_hsubsys *ph_subsys, - int *pn_num_adapters); - -u16 hpi_subsys_get_adapter(const struct hpi_hsubsys *ph_subsys, int iterator, - u32 *padapter_index, u16 *pw_adapter_type); - -u16 hpi_subsys_ssx2_bypass(const struct hpi_hsubsys *ph_subsys, u16 bypass); - -u16 hpi_subsys_set_host_network_interface(const struct hpi_hsubsys *ph_subsys, - const char *sz_interface); - -/*///////// */ -/* ADAPTER */ - -u16 hpi_adapter_open(const struct hpi_hsubsys *ph_subsys, u16 adapter_index); - -u16 hpi_adapter_close(const struct hpi_hsubsys *ph_subsys, u16 adapter_index); - -u16 hpi_adapter_get_info(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 *pw_num_outstreams, u16 *pw_num_instreams, - u16 *pw_version, u32 *pserial_number, u16 *pw_adapter_type); - -u16 hpi_adapter_get_module_by_index(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 module_index, u16 *pw_num_outputs, - u16 *pw_num_inputs, u16 *pw_version, u32 *pserial_number, - u16 *pw_module_type, u32 *ph_module); - -u16 hpi_adapter_set_mode(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u32 adapter_mode); - -u16 hpi_adapter_set_mode_ex(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u32 adapter_mode, u16 query_or_set); - -u16 hpi_adapter_get_mode(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u32 *padapter_mode); - -u16 hpi_adapter_get_assert(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 *assert_present, char *psz_assert, - u16 *pw_line_number); - -u16 hpi_adapter_get_assert_ex(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 *assert_present, char *psz_assert, - u32 *pline_number, u16 *pw_assert_on_dsp); - -u16 hpi_adapter_test_assert(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 assert_id); - -u16 hpi_adapter_enable_capability(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 capability, u32 key); - -u16 hpi_adapter_self_test(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index); - -u16 hpi_adapter_debug_read(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u32 dsp_address, char *p_bytes, int *count_bytes); - -u16 hpi_adapter_set_property(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 property, u16 paramter1, u16 paramter2); - -u16 hpi_adapter_get_property(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 property, u16 *pw_paramter1, - u16 *pw_paramter2); - -u16 hpi_adapter_enumerate_property(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 index, u16 what_to_enumerate, - u16 property_index, u32 *psetting); - -/*////////////// */ -/* NonVol Memory */ -u16 hpi_nv_memory_open(const struct hpi_hsubsys *ph_subsys, u16 adapter_index, - u32 *ph_nv_memory, u16 *pw_size_in_bytes); - -u16 hpi_nv_memory_read_byte(const struct hpi_hsubsys *ph_subsys, - u32 h_nv_memory, u16 index, u16 *pw_data); - -u16 hpi_nv_memory_write_byte(const struct hpi_hsubsys *ph_subsys, - u32 h_nv_memory, u16 index, u16 data); - -/*////////////// */ -/* Digital I/O */ -u16 hpi_gpio_open(const struct hpi_hsubsys *ph_subsys, u16 adapter_index, - u32 *ph_gpio, u16 *pw_number_input_bits, u16 *pw_number_output_bits); - -u16 hpi_gpio_read_bit(const struct hpi_hsubsys *ph_subsys, u32 h_gpio, - u16 bit_index, u16 *pw_bit_data); - -u16 hpi_gpio_read_all_bits(const struct hpi_hsubsys *ph_subsys, u32 h_gpio, - u16 aw_all_bit_data[4] - ); - -u16 hpi_gpio_write_bit(const struct hpi_hsubsys *ph_subsys, u32 h_gpio, - u16 bit_index, u16 bit_data); - -u16 hpi_gpio_write_status(const struct hpi_hsubsys *ph_subsys, u32 h_gpio, - u16 aw_all_bit_data[4] - ); - -/**********************/ -/* Async Event Object */ -/**********************/ -u16 hpi_async_event_open(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u32 *ph_async); - -u16 hpi_async_event_close(const struct hpi_hsubsys *ph_subsys, u32 h_async); - -u16 hpi_async_event_wait(const struct hpi_hsubsys *ph_subsys, u32 h_async, - u16 maximum_events, struct hpi_async_event *p_events, - u16 *pw_number_returned); - -u16 hpi_async_event_get_count(const struct hpi_hsubsys *ph_subsys, - u32 h_async, u16 *pw_count); - -u16 hpi_async_event_get(const struct hpi_hsubsys *ph_subsys, u32 h_async, - u16 maximum_events, struct hpi_async_event *p_events, - u16 *pw_number_returned); - -/*/////////// */ -/* WATCH-DOG */ -u16 hpi_watchdog_open(const struct hpi_hsubsys *ph_subsys, u16 adapter_index, - u32 *ph_watchdog); - -u16 hpi_watchdog_set_time(const struct hpi_hsubsys *ph_subsys, u32 h_watchdog, - u32 time_millisec); - -u16 hpi_watchdog_ping(const struct hpi_hsubsys *ph_subsys, u32 h_watchdog); - -/**************/ -/* OUT STREAM */ -/**************/ -u16 hpi_outstream_open(const struct hpi_hsubsys *ph_subsys, u16 adapter_index, - u16 outstream_index, u32 *ph_outstream); - -u16 hpi_outstream_close(const struct hpi_hsubsys *ph_subsys, u32 h_outstream); - -u16 hpi_outstream_get_info_ex(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u16 *pw_state, u32 *pbuffer_size, u32 *pdata_to_play, - u32 *psamples_played, u32 *pauxiliary_data_to_play); - -u16 hpi_outstream_write_buf(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, const u8 *pb_write_buf, u32 bytes_to_write, - const struct hpi_format *p_format); - -u16 hpi_outstream_start(const struct hpi_hsubsys *ph_subsys, u32 h_outstream); - -u16 hpi_outstream_wait_start(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream); - -u16 hpi_outstream_stop(const struct hpi_hsubsys *ph_subsys, u32 h_outstream); - -u16 hpi_outstream_sinegen(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream); - -u16 hpi_outstream_reset(const struct hpi_hsubsys *ph_subsys, u32 h_outstream); - -u16 hpi_outstream_query_format(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, struct hpi_format *p_format); - -u16 hpi_outstream_set_format(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, struct hpi_format *p_format); - -u16 hpi_outstream_set_punch_in_out(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u32 punch_in_sample, u32 punch_out_sample); - -u16 hpi_outstream_set_velocity(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, short velocity); - -u16 hpi_outstream_ancillary_reset(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u16 mode); - -u16 hpi_outstream_ancillary_get_info(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u32 *pframes_available); - -u16 hpi_outstream_ancillary_read(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, struct hpi_anc_frame *p_anc_frame_buffer, - u32 anc_frame_buffer_size_in_bytes, - u32 number_of_ancillary_frames_to_read); - -u16 hpi_outstream_set_time_scale(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u32 time_scaleX10000); - -u16 hpi_outstream_host_buffer_allocate(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u32 size_in_bytes); - -u16 hpi_outstream_host_buffer_free(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream); - -u16 hpi_outstream_group_add(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u32 h_stream); - -u16 hpi_outstream_group_get_map(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u32 *poutstream_map, u32 *pinstream_map); - -u16 hpi_outstream_group_reset(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream); - -/*////////// */ -/* IN_STREAM */ -u16 hpi_instream_open(const struct hpi_hsubsys *ph_subsys, u16 adapter_index, - u16 instream_index, u32 *ph_instream); - -u16 hpi_instream_close(const struct hpi_hsubsys *ph_subsys, u32 h_instream); - -u16 hpi_instream_query_format(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, const struct hpi_format *p_format); - -u16 hpi_instream_set_format(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, const struct hpi_format *p_format); - -u16 hpi_instream_read_buf(const struct hpi_hsubsys *ph_subsys, u32 h_instream, - u8 *pb_read_buf, u32 bytes_to_read); - -u16 hpi_instream_start(const struct hpi_hsubsys *ph_subsys, u32 h_instream); - -u16 hpi_instream_wait_start(const struct hpi_hsubsys *ph_subsys, - u32 h_instream); - -u16 hpi_instream_stop(const struct hpi_hsubsys *ph_subsys, u32 h_instream); - -u16 hpi_instream_reset(const struct hpi_hsubsys *ph_subsys, u32 h_instream); - -u16 hpi_instream_get_info_ex(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, u16 *pw_state, u32 *pbuffer_size, u32 *pdata_recorded, - u32 *psamples_recorded, u32 *pauxiliary_data_recorded); - -u16 hpi_instream_ancillary_reset(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, u16 bytes_per_frame, u16 mode, u16 alignment, - u16 idle_bit); - -u16 hpi_instream_ancillary_get_info(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, u32 *pframe_space); - -u16 hpi_instream_ancillary_write(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, const struct hpi_anc_frame *p_anc_frame_buffer, - u32 anc_frame_buffer_size_in_bytes, - u32 number_of_ancillary_frames_to_write); - -u16 hpi_instream_host_buffer_allocate(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, u32 size_in_bytes); - -u16 hpi_instream_host_buffer_free(const struct hpi_hsubsys *ph_subsys, - u32 h_instream); - -u16 hpi_instream_group_add(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, u32 h_stream); - -u16 hpi_instream_group_get_map(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, u32 *poutstream_map, u32 *pinstream_map); - -u16 hpi_instream_group_reset(const struct hpi_hsubsys *ph_subsys, - u32 h_instream); - -/*********/ -/* MIXER */ -/*********/ -u16 hpi_mixer_open(const struct hpi_hsubsys *ph_subsys, u16 adapter_index, - u32 *ph_mixer); - -u16 hpi_mixer_close(const struct hpi_hsubsys *ph_subsys, u32 h_mixer); - -u16 hpi_mixer_get_control(const struct hpi_hsubsys *ph_subsys, u32 h_mixer, - u16 src_node_type, u16 src_node_type_index, u16 dst_node_type, - u16 dst_node_type_index, u16 control_type, u32 *ph_control); - -u16 hpi_mixer_get_control_by_index(const struct hpi_hsubsys *ph_subsys, - u32 h_mixer, u16 control_index, u16 *pw_src_node_type, - u16 *pw_src_node_index, u16 *pw_dst_node_type, u16 *pw_dst_node_index, - u16 *pw_control_type, u32 *ph_control); - -u16 hpi_mixer_store(const struct hpi_hsubsys *ph_subsys, u32 h_mixer, - enum HPI_MIXER_STORE_COMMAND command, u16 index); -/*************************/ -/* mixer CONTROLS */ -/*************************/ -/*************************/ -/* volume control */ -/*************************/ -u16 hpi_volume_set_gain(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short an_gain0_01dB[HPI_MAX_CHANNELS] - ); - -u16 hpi_volume_get_gain(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short an_gain0_01dB_out[HPI_MAX_CHANNELS] - ); - -#define hpi_volume_get_range hpi_volume_query_range -u16 hpi_volume_query_range(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short *min_gain_01dB, short *max_gain_01dB, short *step_gain_01dB); - -u16 hpi_volume_query_channels(const struct hpi_hsubsys *ph_subsys, - const u32 h_volume, u32 *p_channels); - -u16 hpi_volume_auto_fade(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms); - -u16 hpi_volume_auto_fade_profile(const struct hpi_hsubsys *ph_subsys, - u32 h_control, short an_stop_gain0_01dB[HPI_MAX_CHANNELS], - u32 duration_ms, u16 profile); - -/*************************/ -/* level control */ -/*************************/ -u16 hpi_level_query_range(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short *min_gain_01dB, short *max_gain_01dB, short *step_gain_01dB); - -u16 hpi_level_set_gain(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short an_gain0_01dB[HPI_MAX_CHANNELS] - ); - -u16 hpi_level_get_gain(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short an_gain0_01dB_out[HPI_MAX_CHANNELS] - ); - -/*************************/ -/* meter control */ -/*************************/ -u16 hpi_meter_query_channels(const struct hpi_hsubsys *ph_subsys, - const u32 h_meter, u32 *p_channels); - -u16 hpi_meter_get_peak(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short an_peak0_01dB_out[HPI_MAX_CHANNELS] - ); - -u16 hpi_meter_get_rms(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short an_peak0_01dB_out[HPI_MAX_CHANNELS] - ); - -u16 hpi_meter_set_peak_ballistics(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 attack, u16 decay); - -u16 hpi_meter_set_rms_ballistics(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 attack, u16 decay); - -u16 hpi_meter_get_peak_ballistics(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *attack, u16 *decay); - -u16 hpi_meter_get_rms_ballistics(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *attack, u16 *decay); - -/*************************/ -/* channel mode control */ -/*************************/ -u16 hpi_channel_mode_query_mode(const struct hpi_hsubsys *ph_subsys, - const u32 h_mode, const u32 index, u16 *pw_mode); - -u16 hpi_channel_mode_set(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 mode); - -u16 hpi_channel_mode_get(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 *mode); - -/*************************/ -/* Tuner control */ -/*************************/ -u16 hpi_tuner_query_band(const struct hpi_hsubsys *ph_subsys, - const u32 h_tuner, const u32 index, u16 *pw_band); - -u16 hpi_tuner_set_band(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 band); - -u16 hpi_tuner_get_band(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 *pw_band); - -u16 hpi_tuner_query_frequency(const struct hpi_hsubsys *ph_subsys, - const u32 h_tuner, const u32 index, const u16 band, u32 *pfreq); - -u16 hpi_tuner_set_frequency(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 freq_ink_hz); - -u16 hpi_tuner_get_frequency(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *pw_freq_ink_hz); - -u16 hpi_tuner_getRF_level(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short *pw_level); - -u16 hpi_tuner_get_rawRF_level(const struct hpi_hsubsys *ph_subsys, - u32 h_control, short *pw_level); - -u16 hpi_tuner_query_gain(const struct hpi_hsubsys *ph_subsys, - const u32 h_tuner, const u32 index, u16 *pw_gain); - -u16 hpi_tuner_set_gain(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short gain); - -u16 hpi_tuner_get_gain(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short *pn_gain); - -u16 hpi_tuner_get_status(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 *pw_status_mask, u16 *pw_status); - -u16 hpi_tuner_set_mode(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u32 mode, u32 value); - -u16 hpi_tuner_get_mode(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u32 mode, u32 *pn_value); - -u16 hpi_tuner_getRDS(const struct hpi_hsubsys *ph_subsys, u32 h_control, - char *p_rds_data); - -u16 hpi_tuner_query_deemphasis(const struct hpi_hsubsys *ph_subsys, - const u32 h_tuner, const u32 index, const u16 band, u32 *pdeemphasis); - -u16 hpi_tuner_set_deemphasis(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 deemphasis); -u16 hpi_tuner_get_deemphasis(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *pdeemphasis); - -u16 hpi_tuner_query_program(const struct hpi_hsubsys *ph_subsys, - const u32 h_tuner, u32 *pbitmap_program); - -u16 hpi_tuner_set_program(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u32 program); - -u16 hpi_tuner_get_program(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u32 *pprogram); - -u16 hpi_tuner_get_hd_radio_dsp_version(const struct hpi_hsubsys *ph_subsys, - u32 h_control, char *psz_dsp_version, const u32 string_size); - -u16 hpi_tuner_get_hd_radio_sdk_version(const struct hpi_hsubsys *ph_subsys, - u32 h_control, char *psz_sdk_version, const u32 string_size); - -u16 hpi_tuner_get_hd_radio_signal_quality(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *pquality); - -/****************************/ -/* PADs control */ -/****************************/ - -u16 HPI_PAD__get_channel_name(const struct hpi_hsubsys *ph_subsys, - u32 h_control, char *psz_string, const u32 string_length); - -u16 HPI_PAD__get_artist(const struct hpi_hsubsys *ph_subsys, u32 h_control, - char *psz_string, const u32 string_length); - -u16 HPI_PAD__get_title(const struct hpi_hsubsys *ph_subsys, u32 h_control, - char *psz_string, const u32 string_length); - -u16 HPI_PAD__get_comment(const struct hpi_hsubsys *ph_subsys, u32 h_control, - char *psz_string, const u32 string_length); - -u16 HPI_PAD__get_program_type(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *ppTY); - -u16 HPI_PAD__get_rdsPI(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u32 *ppI); - -u16 HPI_PAD__get_program_type_string(const struct hpi_hsubsys *ph_subsys, - u32 h_control, const u32 data_type, const u32 pTY, char *psz_string, - const u32 string_length); - -/****************************/ -/* AES/EBU Receiver control */ -/****************************/ -u16 HPI_AESEBU__receiver_query_format(const struct hpi_hsubsys *ph_subsys, - const u32 h_aes_rx, const u32 index, u16 *pw_format); - -u16 HPI_AESEBU__receiver_set_format(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 source); - -u16 HPI_AESEBU__receiver_get_format(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pw_source); - -u16 HPI_AESEBU__receiver_get_sample_rate(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *psample_rate); - -u16 HPI_AESEBU__receiver_get_user_data(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 index, u16 *pw_data); - -u16 HPI_AESEBU__receiver_get_channel_status(const struct hpi_hsubsys - *ph_subsys, u32 h_control, u16 index, u16 *pw_data); - -u16 HPI_AESEBU__receiver_get_error_status(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pw_error_data); - -/*******************************/ -/* AES/EBU Transmitter control */ -/*******************************/ -u16 HPI_AESEBU__transmitter_set_sample_rate(const struct hpi_hsubsys - *ph_subsys, u32 h_control, u32 sample_rate); - -u16 HPI_AESEBU__transmitter_set_user_data(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 index, u16 data); - -u16 HPI_AESEBU__transmitter_set_channel_status(const struct hpi_hsubsys - *ph_subsys, u32 h_control, u16 index, u16 data); - -u16 HPI_AESEBU__transmitter_get_channel_status(const struct hpi_hsubsys - *ph_subsys, u32 h_control, u16 index, u16 *pw_data); - -u16 HPI_AESEBU__transmitter_query_format(const struct hpi_hsubsys *ph_subsys, - const u32 h_aes_tx, const u32 index, u16 *pw_format); - -u16 HPI_AESEBU__transmitter_set_format(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 output_format); - -u16 HPI_AESEBU__transmitter_get_format(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pw_output_format); - -/***********************/ -/* multiplexer control */ -/***********************/ -u16 hpi_multiplexer_set_source(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 source_node_type, u16 source_node_index); - -u16 hpi_multiplexer_get_source(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *source_node_type, u16 *source_node_index); - -u16 hpi_multiplexer_query_source(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 index, u16 *source_node_type, - u16 *source_node_index); - -/***************/ -/* VOX control */ -/***************/ -u16 hpi_vox_set_threshold(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short an_gain0_01dB); - -u16 hpi_vox_get_threshold(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short *an_gain0_01dB); - -/*********************/ -/* Bitstream control */ -/*********************/ -u16 hpi_bitstream_set_clock_edge(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 edge_type); - -u16 hpi_bitstream_set_data_polarity(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 polarity); - -u16 hpi_bitstream_get_activity(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pw_clk_activity, u16 *pw_data_activity); - -/***********************/ -/* SampleClock control */ -/***********************/ - -u16 hpi_sample_clock_query_source(const struct hpi_hsubsys *ph_subsys, - const u32 h_clock, const u32 index, u16 *pw_source); - -u16 hpi_sample_clock_set_source(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 source); - -u16 hpi_sample_clock_get_source(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pw_source); - -u16 hpi_sample_clock_query_source_index(const struct hpi_hsubsys *ph_subsys, - const u32 h_clock, const u32 index, const u32 source, - u16 *pw_source_index); - -u16 hpi_sample_clock_set_source_index(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 source_index); - -u16 hpi_sample_clock_get_source_index(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pw_source_index); - -u16 hpi_sample_clock_get_sample_rate(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *psample_rate); - -u16 hpi_sample_clock_query_local_rate(const struct hpi_hsubsys *ph_subsys, - const u32 h_clock, const u32 index, u32 *psource); - -u16 hpi_sample_clock_set_local_rate(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 sample_rate); - -u16 hpi_sample_clock_get_local_rate(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *psample_rate); - -u16 hpi_sample_clock_set_auto(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 enable); - -u16 hpi_sample_clock_get_auto(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *penable); - -u16 hpi_sample_clock_set_local_rate_lock(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 lock); - -u16 hpi_sample_clock_get_local_rate_lock(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *plock); - -/***********************/ -/* Microphone control */ -/***********************/ -u16 hpi_microphone_set_phantom_power(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 on_off); - -u16 hpi_microphone_get_phantom_power(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pw_on_off); - -/******************************* - Parametric Equalizer control -*******************************/ -u16 hpi_parametricEQ__get_info(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pw_number_of_bands, u16 *pw_enabled); - -u16 hpi_parametricEQ__set_state(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 on_off); - -u16 hpi_parametricEQ__set_band(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 index, u16 type, u32 frequency_hz, short q100, - short gain0_01dB); - -u16 hpi_parametricEQ__get_band(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 index, u16 *pn_type, u32 *pfrequency_hz, - short *pnQ100, short *pn_gain0_01dB); - -u16 hpi_parametricEQ__get_coeffs(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 index, short coeffs[5] - ); - -/******************************* - Compressor Expander control -*******************************/ - -u16 hpi_compander_set(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 attack, u16 decay, short ratio100, short threshold0_01dB, - short makeup_gain0_01dB); - -u16 hpi_compander_get(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 *pw_attack, u16 *pw_decay, short *pw_ratio100, - short *pn_threshold0_01dB, short *pn_makeup_gain0_01dB); - -/******************************* - Cobranet HMI control -*******************************/ -u16 hpi_cobranet_hmi_write(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u32 hmi_address, u32 byte_count, u8 *pb_data); - -u16 hpi_cobranet_hmi_read(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u32 hmi_address, u32 max_byte_count, u32 *pbyte_count, u8 *pb_data); - -u16 hpi_cobranet_hmi_get_status(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *pstatus, u32 *preadable_size, - u32 *pwriteable_size); - -/*Read the current IP address -*/ -u16 hpi_cobranet_getI_paddress(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *pi_paddress); - -/* Write the current IP address -*/ -u16 hpi_cobranet_setI_paddress(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 i_paddress); - -/* Read the static IP address -*/ -u16 hpi_cobranet_get_staticI_paddress(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *pi_paddress); - -/* Write the static IP address -*/ -u16 hpi_cobranet_set_staticI_paddress(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 i_paddress); - -/* Read the MAC address -*/ -u16 hpi_cobranet_getMA_caddress(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *pmAC_MS_bs, u32 *pmAC_LS_bs); - -/******************************* - Tone Detector control -*******************************/ -u16 hpi_tone_detector_get_state(const struct hpi_hsubsys *ph_subsys, u32 hC, - u32 *state); - -u16 hpi_tone_detector_set_enable(const struct hpi_hsubsys *ph_subsys, u32 hC, - u32 enable); - -u16 hpi_tone_detector_get_enable(const struct hpi_hsubsys *ph_subsys, u32 hC, - u32 *enable); - -u16 hpi_tone_detector_set_event_enable(const struct hpi_hsubsys *ph_subsys, - u32 hC, u32 event_enable); - -u16 hpi_tone_detector_get_event_enable(const struct hpi_hsubsys *ph_subsys, - u32 hC, u32 *event_enable); - -u16 hpi_tone_detector_set_threshold(const struct hpi_hsubsys *ph_subsys, - u32 hC, int threshold); - -u16 hpi_tone_detector_get_threshold(const struct hpi_hsubsys *ph_subsys, - u32 hC, int *threshold); - -u16 hpi_tone_detector_get_frequency(const struct hpi_hsubsys *ph_subsys, - u32 hC, u32 index, u32 *frequency); - -/******************************* - Silence Detector control -*******************************/ -u16 hpi_silence_detector_get_state(const struct hpi_hsubsys *ph_subsys, - u32 hC, u32 *state); - -u16 hpi_silence_detector_set_enable(const struct hpi_hsubsys *ph_subsys, - u32 hC, u32 enable); - -u16 hpi_silence_detector_get_enable(const struct hpi_hsubsys *ph_subsys, - u32 hC, u32 *enable); - -u16 hpi_silence_detector_set_event_enable(const struct hpi_hsubsys *ph_subsys, - u32 hC, u32 event_enable); - -u16 hpi_silence_detector_get_event_enable(const struct hpi_hsubsys *ph_subsys, - u32 hC, u32 *event_enable); - -u16 hpi_silence_detector_set_delay(const struct hpi_hsubsys *ph_subsys, - u32 hC, u32 delay); - -u16 hpi_silence_detector_get_delay(const struct hpi_hsubsys *ph_subsys, - u32 hC, u32 *delay); - -u16 hpi_silence_detector_set_threshold(const struct hpi_hsubsys *ph_subsys, - u32 hC, int threshold); - -u16 hpi_silence_detector_get_threshold(const struct hpi_hsubsys *ph_subsys, - u32 hC, int *threshold); - -/******************************* - Universal control -*******************************/ -u16 hpi_entity_find_next(struct hpi_entity *container_entity, - enum e_entity_type type, enum e_entity_role role, int recursive_flag, - struct hpi_entity **current_match); - -u16 hpi_entity_copy_value_from(struct hpi_entity *entity, - enum e_entity_type type, size_t item_count, void *value_dst_p); - -u16 hpi_entity_unpack(struct hpi_entity *entity, enum e_entity_type *type, - size_t *items, enum e_entity_role *role, void **value); - -u16 hpi_entity_alloc_and_pack(const enum e_entity_type type, - const size_t item_count, const enum e_entity_role role, void *value, - struct hpi_entity **entity); - -void hpi_entity_free(struct hpi_entity *entity); - -u16 hpi_universal_info(const struct hpi_hsubsys *ph_subsys, u32 hC, - struct hpi_entity **info); - -u16 hpi_universal_get(const struct hpi_hsubsys *ph_subsys, u32 hC, - struct hpi_entity **value); - -u16 hpi_universal_set(const struct hpi_hsubsys *ph_subsys, u32 hC, - struct hpi_entity *value); - -/*/////////// */ -/* DSP CLOCK */ -/*/////////// */ -u16 hpi_clock_open(const struct hpi_hsubsys *ph_subsys, u16 adapter_index, - u32 *ph_dsp_clock); - -u16 hpi_clock_set_time(const struct hpi_hsubsys *ph_subsys, u32 h_clock, - u16 hour, u16 minute, u16 second, u16 milli_second); - -u16 hpi_clock_get_time(const struct hpi_hsubsys *ph_subsys, u32 h_clock, - u16 *pw_hour, u16 *pw_minute, u16 *pw_second, u16 *pw_milli_second); - -/*/////////// */ -/* PROFILE */ -/*/////////// */ -u16 hpi_profile_open_all(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 profile_index, u32 *ph_profile, - u16 *pw_max_profiles); - -u16 hpi_profile_get(const struct hpi_hsubsys *ph_subsys, u32 h_profile, - u16 index, u16 *pw_seconds, u32 *pmicro_seconds, u32 *pcall_count, - u32 *pmax_micro_seconds, u32 *pmin_micro_seconds); - -u16 hpi_profile_start_all(const struct hpi_hsubsys *ph_subsys, u32 h_profile); - -u16 hpi_profile_stop_all(const struct hpi_hsubsys *ph_subsys, u32 h_profile); - -u16 hpi_profile_get_name(const struct hpi_hsubsys *ph_subsys, u32 h_profile, - u16 index, char *sz_profile_name, u16 profile_name_length); - -u16 hpi_profile_get_utilization(const struct hpi_hsubsys *ph_subsys, - u32 h_profile, u32 *putilization); - -/*//////////////////// */ -/* UTILITY functions */ - -u16 hpi_format_create(struct hpi_format *p_format, u16 channels, u16 format, - u32 sample_rate, u32 bit_rate, u32 attributes); - -/* Until it's verified, this function is for Windows OSs only */ - -#endif /*_H_HPI_ */ -/* -/////////////////////////////////////////////////////////////////////////////// -// See CVS for history. Last complete set in rev 1.146 -//////////////////////////////////////////////////////////////////////////////// -*/ diff --git a/pci/asihpi/hpi6000.c b/pci/asihpi/hpi6000.c index 9c5093173..d858e89e1 100644 --- a/pci/asihpi/hpi6000.c +++ b/pci/asihpi/hpi6000.c @@ -1,1841 +1,2 @@ -/****************************************************************************** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Hardware Programming Interface (HPI) for AudioScience ASI6200 series adapters. - These PCI bus adapters are based on the TI C6711 DSP. - - Exported functions: - void HPI_6000(struct hpi_message *phm, struct hpi_response *phr) - - #defines - HIDE_PCI_ASSERTS to show the PCI asserts - PROFILE_DSP2 get profile data from DSP2 if present (instead of DSP 1) - -(C) Copyright AudioScience Inc. 1998-2003 -*******************************************************************************/ -#define SOURCEFILE_NAME "hpi6000.c" - -#include "hpi_internal.h" -#include "hpimsginit.h" -#include "hpidebug.h" -#include "hpi6000.h" -#include "hpidspcd.h" -#include "hpicmn.h" - -#define HPI_HIF_BASE (0x00000200) /* start of C67xx internal RAM */ -#define HPI_HIF_ADDR(member) \ - (HPI_HIF_BASE + offsetof(struct hpi_hif_6000, member)) -#define HPI_HIF_ERROR_MASK 0x4000 - -/* HPI6000 specific error codes */ - -#define HPI6000_ERROR_BASE 900 -#define HPI6000_ERROR_MSG_RESP_IDLE_TIMEOUT 901 -#define HPI6000_ERROR_MSG_RESP_SEND_MSG_ACK 902 -#define HPI6000_ERROR_MSG_RESP_GET_RESP_ACK 903 -#define HPI6000_ERROR_MSG_GET_ADR 904 -#define HPI6000_ERROR_RESP_GET_ADR 905 -#define HPI6000_ERROR_MSG_RESP_BLOCKWRITE32 906 -#define HPI6000_ERROR_MSG_RESP_BLOCKREAD32 907 -#define HPI6000_ERROR_MSG_INVALID_DSP_INDEX 908 -#define HPI6000_ERROR_CONTROL_CACHE_PARAMS 909 - -#define HPI6000_ERROR_SEND_DATA_IDLE_TIMEOUT 911 -#define HPI6000_ERROR_SEND_DATA_ACK 912 -#define HPI6000_ERROR_SEND_DATA_ADR 913 -#define HPI6000_ERROR_SEND_DATA_TIMEOUT 914 -#define HPI6000_ERROR_SEND_DATA_CMD 915 -#define HPI6000_ERROR_SEND_DATA_WRITE 916 -#define HPI6000_ERROR_SEND_DATA_IDLECMD 917 -#define HPI6000_ERROR_SEND_DATA_VERIFY 918 - -#define HPI6000_ERROR_GET_DATA_IDLE_TIMEOUT 921 -#define HPI6000_ERROR_GET_DATA_ACK 922 -#define HPI6000_ERROR_GET_DATA_CMD 923 -#define HPI6000_ERROR_GET_DATA_READ 924 -#define HPI6000_ERROR_GET_DATA_IDLECMD 925 - -#define HPI6000_ERROR_CONTROL_CACHE_ADDRLEN 951 -#define HPI6000_ERROR_CONTROL_CACHE_READ 952 -#define HPI6000_ERROR_CONTROL_CACHE_FLUSH 953 - -#define HPI6000_ERROR_MSG_RESP_GETRESPCMD 961 -#define HPI6000_ERROR_MSG_RESP_IDLECMD 962 -#define HPI6000_ERROR_MSG_RESP_BLOCKVERIFY32 963 - -/* adapter init errors */ -#define HPI6000_ERROR_UNHANDLED_SUBSYS_ID 930 - -/* can't access PCI2040 */ -#define HPI6000_ERROR_INIT_PCI2040 931 -/* can't access DSP HPI i/f */ -#define HPI6000_ERROR_INIT_DSPHPI 932 -/* can't access internal DSP memory */ -#define HPI6000_ERROR_INIT_DSPINTMEM 933 -/* can't access SDRAM - test#1 */ -#define HPI6000_ERROR_INIT_SDRAM1 934 -/* can't access SDRAM - test#2 */ -#define HPI6000_ERROR_INIT_SDRAM2 935 - -#define HPI6000_ERROR_INIT_VERIFY 938 - -#define HPI6000_ERROR_INIT_NOACK 939 - -#define HPI6000_ERROR_INIT_PLDTEST1 941 -#define HPI6000_ERROR_INIT_PLDTEST2 942 - -/* local defines */ - -#define HIDE_PCI_ASSERTS -#define PROFILE_DSP2 - -/* for PCI2040 i/f chip */ -/* HPI CSR registers */ -/* word offsets from CSR base */ -/* use when io addresses defined as u32 * */ - -#define INTERRUPT_EVENT_SET 0 -#define INTERRUPT_EVENT_CLEAR 1 -#define INTERRUPT_MASK_SET 2 -#define INTERRUPT_MASK_CLEAR 3 -#define HPI_ERROR_REPORT 4 -#define HPI_RESET 5 -#define HPI_DATA_WIDTH 6 - -#define MAX_DSPS 2 -/* HPI registers, spaced 8K bytes = 2K words apart */ -#define DSP_SPACING 0x800 - -#define CONTROL 0x0000 -#define ADDRESS 0x0200 -#define DATA_AUTOINC 0x0400 -#define DATA 0x0600 - -#define TIMEOUT 500000 - -struct dsp_obj { - __iomem u32 *prHPI_control; - __iomem u32 *prHPI_address; - __iomem u32 *prHPI_data; - __iomem u32 *prHPI_data_auto_inc; - char c_dsp_rev; /*A, B */ - u32 control_cache_address_on_dsp; - u32 control_cache_length_on_dsp; - struct hpi_adapter_obj *pa_parent_adapter; -}; - -struct hpi_hw_obj { - __iomem u32 *dw2040_HPICSR; - __iomem u32 *dw2040_HPIDSP; - - u16 num_dsp; - struct dsp_obj ado[MAX_DSPS]; - - u32 message_buffer_address_on_dsp; - u32 response_buffer_address_on_dsp; - u32 pCI2040HPI_error_count; - - struct hpi_control_cache_single control_cache[HPI_NMIXER_CONTROLS]; - struct hpi_control_cache *p_cache; -}; - -static u16 hpi6000_dsp_block_write32(struct hpi_adapter_obj *pao, - u16 dsp_index, u32 hpi_address, u32 *source, u32 count); -static u16 hpi6000_dsp_block_read32(struct hpi_adapter_obj *pao, - u16 dsp_index, u32 hpi_address, u32 *dest, u32 count); - -static short hpi6000_adapter_boot_load_dsp(struct hpi_adapter_obj *pao, - u32 *pos_error_code); -static short hpi6000_check_PCI2040_error_flag(struct hpi_adapter_obj *pao, - u16 read_or_write); -#define H6READ 1 -#define H6WRITE 0 - -static short hpi6000_update_control_cache(struct hpi_adapter_obj *pao, - struct hpi_message *phm); -static short hpi6000_message_response_sequence(struct hpi_adapter_obj *pao, - u16 dsp_index, struct hpi_message *phm, struct hpi_response *phr); - -static void hw_message(struct hpi_adapter_obj *pao, struct hpi_message *phm, - struct hpi_response *phr); - -static short hpi6000_wait_dsp_ack(struct hpi_adapter_obj *pao, u16 dsp_index, - u32 ack_value); - -static short hpi6000_send_host_command(struct hpi_adapter_obj *pao, - u16 dsp_index, u32 host_cmd); - -static void hpi6000_send_dsp_interrupt(struct dsp_obj *pdo); - -static short hpi6000_send_data(struct hpi_adapter_obj *pao, u16 dsp_index, - struct hpi_message *phm, struct hpi_response *phr); - -static short hpi6000_get_data(struct hpi_adapter_obj *pao, u16 dsp_index, - struct hpi_message *phm, struct hpi_response *phr); - -static void hpi_write_word(struct dsp_obj *pdo, u32 address, u32 data); - -static u32 hpi_read_word(struct dsp_obj *pdo, u32 address); - -static void hpi_write_block(struct dsp_obj *pdo, u32 address, u32 *pdata, - u32 length); - -static void hpi_read_block(struct dsp_obj *pdo, u32 address, u32 *pdata, - u32 length); - -static void subsys_create_adapter(struct hpi_message *phm, - struct hpi_response *phr); - -static void subsys_delete_adapter(struct hpi_message *phm, - struct hpi_response *phr); - -static void adapter_get_asserts(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr); - -static short create_adapter_obj(struct hpi_adapter_obj *pao, - u32 *pos_error_code); - -/* local globals */ - -static u16 gw_pci_read_asserts; /* used to count PCI2040 errors */ -static u16 gw_pci_write_asserts; /* used to count PCI2040 errors */ - -static void subsys_message(struct hpi_message *phm, struct hpi_response *phr) -{ - - switch (phm->function) { - case HPI_SUBSYS_OPEN: - case HPI_SUBSYS_CLOSE: - case HPI_SUBSYS_GET_INFO: - case HPI_SUBSYS_DRIVER_UNLOAD: - case HPI_SUBSYS_DRIVER_LOAD: - case HPI_SUBSYS_FIND_ADAPTERS: - /* messages that should not get here */ - phr->error = HPI_ERROR_UNIMPLEMENTED; - break; - case HPI_SUBSYS_CREATE_ADAPTER: - subsys_create_adapter(phm, phr); - break; - case HPI_SUBSYS_DELETE_ADAPTER: - subsys_delete_adapter(phm, phr); - break; - default: - phr->error = HPI_ERROR_INVALID_FUNC; - break; - } -} - -static void control_message(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - - switch (phm->function) { - case HPI_CONTROL_GET_STATE: - if (pao->has_control_cache) { - u16 err; - err = hpi6000_update_control_cache(pao, phm); - - if (err) { - phr->error = err; - break; - } - - if (hpi_check_control_cache(((struct hpi_hw_obj *) - pao->priv)->p_cache, phm, - phr)) - break; - } - hw_message(pao, phm, phr); - break; - case HPI_CONTROL_GET_INFO: - hw_message(pao, phm, phr); - break; - case HPI_CONTROL_SET_STATE: - hw_message(pao, phm, phr); - hpi_sync_control_cache(((struct hpi_hw_obj *)pao->priv)-> - p_cache, phm, phr); - break; - default: - phr->error = HPI_ERROR_INVALID_FUNC; - break; - } -} - -static void adapter_message(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - switch (phm->function) { - case HPI_ADAPTER_GET_INFO: - hw_message(pao, phm, phr); - break; - case HPI_ADAPTER_GET_ASSERT: - adapter_get_asserts(pao, phm, phr); - break; - case HPI_ADAPTER_OPEN: - case HPI_ADAPTER_CLOSE: - case HPI_ADAPTER_TEST_ASSERT: - case HPI_ADAPTER_SELFTEST: - case HPI_ADAPTER_GET_MODE: - case HPI_ADAPTER_SET_MODE: - case HPI_ADAPTER_FIND_OBJECT: - case HPI_ADAPTER_GET_PROPERTY: - case HPI_ADAPTER_SET_PROPERTY: - case HPI_ADAPTER_ENUM_PROPERTY: - hw_message(pao, phm, phr); - break; - default: - phr->error = HPI_ERROR_INVALID_FUNC; - break; - } -} - -static void outstream_message(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - switch (phm->function) { - case HPI_OSTREAM_HOSTBUFFER_ALLOC: - case HPI_OSTREAM_HOSTBUFFER_FREE: - /* Don't let these messages go to the HW function because - * they're called without allocating the spinlock. - * For the HPI6000 adapters the HW would return - * HPI_ERROR_INVALID_FUNC anyway. - */ - phr->error = HPI_ERROR_INVALID_FUNC; - break; - default: - hw_message(pao, phm, phr); - return; - } -} - -static void instream_message(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - - switch (phm->function) { - case HPI_ISTREAM_HOSTBUFFER_ALLOC: - case HPI_ISTREAM_HOSTBUFFER_FREE: - /* Don't let these messages go to the HW function because - * they're called without allocating the spinlock. - * For the HPI6000 adapters the HW would return - * HPI_ERROR_INVALID_FUNC anyway. - */ - phr->error = HPI_ERROR_INVALID_FUNC; - break; - default: - hw_message(pao, phm, phr); - return; - } -} - -/************************************************************************/ -/** HPI_6000() - * Entry point from HPIMAN - * All calls to the HPI start here - */ -void HPI_6000(struct hpi_message *phm, struct hpi_response *phr) -{ - struct hpi_adapter_obj *pao = NULL; - - /* subsytem messages get executed by every HPI. */ - /* All other messages are ignored unless the adapter index matches */ - /* an adapter in the HPI */ - HPI_DEBUG_LOG(DEBUG, "O %d,F %x\n", phm->object, phm->function); - - /* if Dsp has crashed then do not communicate with it any more */ - if (phm->object != HPI_OBJ_SUBSYSTEM) { - pao = hpi_find_adapter(phm->adapter_index); - if (!pao) { - HPI_DEBUG_LOG(DEBUG, - " %d,%d refused, for another HPI?\n", - phm->object, phm->function); - return; - } - - if (pao->dsp_crashed >= 10) { - hpi_init_response(phr, phm->object, phm->function, - HPI_ERROR_DSP_HARDWARE); - HPI_DEBUG_LOG(DEBUG, " %d,%d dsp crashed.\n", - phm->object, phm->function); - return; - } - } - /* Init default response including the size field */ - if (phm->function != HPI_SUBSYS_CREATE_ADAPTER) - hpi_init_response(phr, phm->object, phm->function, - HPI_ERROR_PROCESSING_MESSAGE); - - switch (phm->type) { - case HPI_TYPE_MESSAGE: - switch (phm->object) { - case HPI_OBJ_SUBSYSTEM: - subsys_message(phm, phr); - break; - - case HPI_OBJ_ADAPTER: - phr->size = - sizeof(struct hpi_response_header) + - sizeof(struct hpi_adapter_res); - adapter_message(pao, phm, phr); - break; - - case HPI_OBJ_CONTROL: - control_message(pao, phm, phr); - break; - - case HPI_OBJ_OSTREAM: - outstream_message(pao, phm, phr); - break; - - case HPI_OBJ_ISTREAM: - instream_message(pao, phm, phr); - break; - - default: - hw_message(pao, phm, phr); - break; - } - break; - - default: - phr->error = HPI_ERROR_INVALID_TYPE; - break; - } -} - -/************************************************************************/ -/* SUBSYSTEM */ - -/* create an adapter object and initialise it based on resource information - * passed in in the message - * NOTE - you cannot use this function AND the FindAdapters function at the - * same time, the application must use only one of them to get the adapters - */ -static void subsys_create_adapter(struct hpi_message *phm, - struct hpi_response *phr) -{ - /* create temp adapter obj, because we don't know what index yet */ - struct hpi_adapter_obj ao; - struct hpi_adapter_obj *pao; - u32 os_error_code; - short error = 0; - u32 dsp_index = 0; - - HPI_DEBUG_LOG(VERBOSE, "subsys_create_adapter\n"); - - memset(&ao, 0, sizeof(ao)); - - /* this HPI only creates adapters for TI/PCI2040 based devices */ - if (phm->u.s.resource.bus_type != HPI_BUS_PCI) - return; - if (phm->u.s.resource.r.pci->vendor_id != HPI_PCI_VENDOR_ID_TI) - return; - if (phm->u.s.resource.r.pci->device_id != HPI_PCI_DEV_ID_PCI2040) - return; - - ao.priv = kmalloc(sizeof(struct hpi_hw_obj), GFP_KERNEL); - if (!ao.priv) { - HPI_DEBUG_LOG(ERROR, "cant get mem for adapter object\n"); - phr->error = HPI_ERROR_MEMORY_ALLOC; - return; - } - - memset(ao.priv, 0, sizeof(struct hpi_hw_obj)); - /* create the adapter object based on the resource information */ - /*? memcpy(&ao.Pci,&phm->u.s.Resource.r.Pci,sizeof(ao.Pci)); */ - ao.pci = *phm->u.s.resource.r.pci; - - error = create_adapter_obj(&ao, &os_error_code); - if (!error) - error = hpi_add_adapter(&ao); - if (error) { - phr->u.s.data = os_error_code; - kfree(ao.priv); - phr->error = error; - return; - } - /* need to update paParentAdapter */ - pao = hpi_find_adapter(ao.index); - if (!pao) { - /* We just added this adapter, why can't we find it!? */ - HPI_DEBUG_LOG(ERROR, "lost adapter after boot\n"); - phr->error = 950; - return; - } - - for (dsp_index = 0; dsp_index < MAX_DSPS; dsp_index++) { - struct hpi_hw_obj *phw = (struct hpi_hw_obj *)pao->priv; - phw->ado[dsp_index].pa_parent_adapter = pao; - } - - phr->u.s.aw_adapter_list[ao.index] = ao.adapter_type; - phr->u.s.adapter_index = ao.index; - phr->u.s.num_adapters++; - phr->error = 0; -} - -static void subsys_delete_adapter(struct hpi_message *phm, - struct hpi_response *phr) -{ - struct hpi_adapter_obj *pao = NULL; - struct hpi_hw_obj *phw; - - pao = hpi_find_adapter(phm->adapter_index); - if (!pao) - return; - - phw = (struct hpi_hw_obj *)pao->priv; - - if (pao->has_control_cache) - hpi_free_control_cache(phw->p_cache); - - hpi_delete_adapter(pao); - kfree(phw); - - phr->error = 0; -} - -/* this routine is called from SubSysFindAdapter and SubSysCreateAdapter */ -static short create_adapter_obj(struct hpi_adapter_obj *pao, - u32 *pos_error_code) -{ - short boot_error = 0; - u32 dsp_index = 0; - u32 control_cache_size = 0; - u32 control_cache_count = 0; - struct hpi_hw_obj *phw = (struct hpi_hw_obj *)pao->priv; - - /* init error reporting */ - pao->dsp_crashed = 0; - - /* The PCI2040 has the following address map */ - /* BAR0 - 4K = HPI control and status registers on PCI2040 (HPI CSR) */ - /* BAR1 - 32K = HPI registers on DSP */ - phw->dw2040_HPICSR = pao->pci.ap_mem_base[0]; - phw->dw2040_HPIDSP = pao->pci.ap_mem_base[1]; - HPI_DEBUG_LOG(VERBOSE, "csr %p, dsp %p\n", phw->dw2040_HPICSR, - phw->dw2040_HPIDSP); - - /* set addresses for the possible DSP HPI interfaces */ - for (dsp_index = 0; dsp_index < MAX_DSPS; dsp_index++) { - phw->ado[dsp_index].prHPI_control = - phw->dw2040_HPIDSP + (CONTROL + - DSP_SPACING * dsp_index); - - phw->ado[dsp_index].prHPI_address = - phw->dw2040_HPIDSP + (ADDRESS + - DSP_SPACING * dsp_index); - phw->ado[dsp_index].prHPI_data = - phw->dw2040_HPIDSP + (DATA + DSP_SPACING * dsp_index); - - phw->ado[dsp_index].prHPI_data_auto_inc = - phw->dw2040_HPIDSP + (DATA_AUTOINC + - DSP_SPACING * dsp_index); - - HPI_DEBUG_LOG(VERBOSE, "ctl %p, adr %p, dat %p, dat++ %p\n", - phw->ado[dsp_index].prHPI_control, - phw->ado[dsp_index].prHPI_address, - phw->ado[dsp_index].prHPI_data, - phw->ado[dsp_index].prHPI_data_auto_inc); - - phw->ado[dsp_index].pa_parent_adapter = pao; - } - - phw->pCI2040HPI_error_count = 0; - pao->has_control_cache = 0; - - /* Set the default number of DSPs on this card */ - /* This is (conditionally) adjusted after bootloading */ - /* of the first DSP in the bootload section. */ - phw->num_dsp = 1; - - boot_error = hpi6000_adapter_boot_load_dsp(pao, pos_error_code); - if (boot_error) - return boot_error; - - HPI_DEBUG_LOG(INFO, "bootload DSP OK\n"); - - phw->message_buffer_address_on_dsp = 0L; - phw->response_buffer_address_on_dsp = 0L; - - /* get info about the adapter by asking the adapter */ - /* send a HPI_ADAPTER_GET_INFO message */ - { - struct hpi_message hM; - struct hpi_response hR0; /* response from DSP 0 */ - struct hpi_response hR1; /* response from DSP 1 */ - u16 error = 0; - - HPI_DEBUG_LOG(VERBOSE, "send ADAPTER_GET_INFO\n"); - memset(&hM, 0, sizeof(hM)); - hM.type = HPI_TYPE_MESSAGE; - hM.size = sizeof(struct hpi_message); - hM.object = HPI_OBJ_ADAPTER; - hM.function = HPI_ADAPTER_GET_INFO; - hM.adapter_index = 0; - memset(&hR0, 0, sizeof(hR0)); - memset(&hR1, 0, sizeof(hR1)); - hR0.size = sizeof(hR0); - hR1.size = sizeof(hR1); - - error = hpi6000_message_response_sequence(pao, 0, &hM, &hR0); - if (hR0.error) { - HPI_DEBUG_LOG(DEBUG, "message error %d\n", hR0.error); - return hR0.error; - } - if (phw->num_dsp == 2) { - error = hpi6000_message_response_sequence(pao, 1, &hM, - &hR1); - if (error) - return error; - } - pao->adapter_type = hR0.u.a.adapter_type; - pao->index = hR0.u.a.adapter_index; - } - - memset(&phw->control_cache[0], 0, - sizeof(struct hpi_control_cache_single) * - HPI_NMIXER_CONTROLS); - /* Read the control cache length to figure out if it is turned on */ - control_cache_size = - hpi_read_word(&phw->ado[0], - HPI_HIF_ADDR(control_cache_size_in_bytes)); - if (control_cache_size) { - control_cache_count = - hpi_read_word(&phw->ado[0], - HPI_HIF_ADDR(control_cache_count)); - pao->has_control_cache = 1; - - phw->p_cache = - hpi_alloc_control_cache(control_cache_count, - control_cache_size, (struct hpi_control_cache_info *) - &phw->control_cache[0] - ); - } else - pao->has_control_cache = 0; - - HPI_DEBUG_LOG(DEBUG, "get adapter info ASI%04X index %d\n", - pao->adapter_type, pao->index); - pao->open = 0; /* upon creation the adapter is closed */ - return 0; -} - -/************************************************************************/ -/* ADAPTER */ - -static void adapter_get_asserts(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ -#ifndef HIDE_PCI_ASSERTS - /* if we have PCI2040 asserts then collect them */ - if ((gw_pci_read_asserts > 0) || (gw_pci_write_asserts > 0)) { - phr->u.a.serial_number = - gw_pci_read_asserts * 100 + gw_pci_write_asserts; - phr->u.a.adapter_index = 1; /* assert count */ - phr->u.a.adapter_type = -1; /* "dsp index" */ - strcpy(phr->u.a.sz_adapter_assert, "PCI2040 error"); - gw_pci_read_asserts = 0; - gw_pci_write_asserts = 0; - phr->error = 0; - } else -#endif - hw_message(pao, phm, phr); /*get DSP asserts */ - - return; -} - -/************************************************************************/ -/* LOW-LEVEL */ - -static short hpi6000_adapter_boot_load_dsp(struct hpi_adapter_obj *pao, - u32 *pos_error_code) -{ - struct hpi_hw_obj *phw = (struct hpi_hw_obj *)pao->priv; - short error; - u32 timeout; - u32 read = 0; - u32 i = 0; - u32 data = 0; - u32 j = 0; - u32 test_addr = 0x80000000; - u32 test_data = 0x00000001; - u32 dw2040_reset = 0; - u32 dsp_index = 0; - u32 endian = 0; - u32 adapter_info = 0; - u32 delay = 0; - - struct dsp_code dsp_code; - u16 boot_load_family = 0; - - /* NOTE don't use wAdapterType in this routine. It is not setup yet */ - - switch (pao->pci.subsys_device_id) { - case 0x5100: - case 0x5110: /* ASI5100 revB or higher with C6711D */ - case 0x6100: - case 0x6200: - boot_load_family = HPI_ADAPTER_FAMILY_ASI(0x6200); - break; - case 0x8800: - boot_load_family = HPI_ADAPTER_FAMILY_ASI(0x8800); - break; - default: - return HPI6000_ERROR_UNHANDLED_SUBSYS_ID; - } - - /* reset all DSPs, indicate two DSPs are present - * set RST3-=1 to disconnect HAD8 to set DSP in little endian mode - */ - endian = 0; - dw2040_reset = 0x0003000F; - iowrite32(dw2040_reset, phw->dw2040_HPICSR + HPI_RESET); - - /* read back register to make sure PCI2040 chip is functioning - * note that bits 4..15 are read-only and so should always return zero, - * even though we wrote 1 to them - */ - for (i = 0; i < 1000; i++) - delay = ioread32(phw->dw2040_HPICSR + HPI_RESET); - if (delay != dw2040_reset) { - HPI_DEBUG_LOG(ERROR, "INIT_PCI2040 %x %x\n", dw2040_reset, - delay); - return HPI6000_ERROR_INIT_PCI2040; - } - - /* Indicate that DSP#0,1 is a C6X */ - iowrite32(0x00000003, phw->dw2040_HPICSR + HPI_DATA_WIDTH); - /* set Bit30 and 29 - which will prevent Target aborts from being - * issued upon HPI or GP error - */ - iowrite32(0x60000000, phw->dw2040_HPICSR + INTERRUPT_MASK_SET); - - /* isolate DSP HAD8 line from PCI2040 so that - * Little endian can be set by pullup - */ - dw2040_reset = dw2040_reset & (~(endian << 3)); - iowrite32(dw2040_reset, phw->dw2040_HPICSR + HPI_RESET); - - phw->ado[0].c_dsp_rev = 'B'; /* revB */ - phw->ado[1].c_dsp_rev = 'B'; /* revB */ - - /*Take both DSPs out of reset, setting HAD8 to the correct Endian */ - dw2040_reset = dw2040_reset & (~0x00000001); /* start DSP 0 */ - iowrite32(dw2040_reset, phw->dw2040_HPICSR + HPI_RESET); - dw2040_reset = dw2040_reset & (~0x00000002); /* start DSP 1 */ - iowrite32(dw2040_reset, phw->dw2040_HPICSR + HPI_RESET); - - /* set HAD8 back to PCI2040, now that DSP set to little endian mode */ - dw2040_reset = dw2040_reset & (~0x00000008); - iowrite32(dw2040_reset, phw->dw2040_HPICSR + HPI_RESET); - /*delay to allow DSP to get going */ - for (i = 0; i < 100; i++) - delay = ioread32(phw->dw2040_HPICSR + HPI_RESET); - - /* loop through all DSPs, downloading DSP code */ - for (dsp_index = 0; dsp_index < phw->num_dsp; dsp_index++) { - struct dsp_obj *pdo = &phw->ado[dsp_index]; - - /* configure DSP so that we download code into the SRAM */ - /* set control reg for little endian, HWOB=1 */ - iowrite32(0x00010001, pdo->prHPI_control); - - /* test access to the HPI address register (HPIA) */ - test_data = 0x00000001; - for (j = 0; j < 32; j++) { - iowrite32(test_data, pdo->prHPI_address); - data = ioread32(pdo->prHPI_address); - if (data != test_data) { - HPI_DEBUG_LOG(ERROR, "INIT_DSPHPI %x %x %x\n", - test_data, data, dsp_index); - return HPI6000_ERROR_INIT_DSPHPI; - } - test_data = test_data << 1; - } - -/* if C6713 the setup PLL to generate 225MHz from 25MHz. -* Since the PLLDIV1 read is sometimes wrong, even on a C6713, -* we're going to do this unconditionally -*/ -/* PLLDIV1 should have a value of 8000 after reset */ -/* - if (HpiReadWord(pdo,0x01B7C118) == 0x8000) -*/ - { - /* C6713 datasheet says we cannot program PLL from HPI, - * and indeed if we try to set the PLL multiply from the - * HPI, the PLL does not seem to lock, - * so we enable the PLL and use the default of x 7 - */ - /* bypass PLL */ - hpi_write_word(pdo, 0x01B7C100, 0x0000); - for (i = 0; i < 100; i++) - delay = ioread32(phw->dw2040_HPICSR + - HPI_RESET); - - /* ** use default of PLL x7 ** */ - /* EMIF = 225/3=75MHz */ - hpi_write_word(pdo, 0x01B7C120, 0x8002); - /* peri = 225/2 */ - hpi_write_word(pdo, 0x01B7C11C, 0x8001); - /* cpu = 225/1 */ - hpi_write_word(pdo, 0x01B7C118, 0x8000); - /* ~200us delay */ - for (i = 0; i < 2000; i++) - delay = ioread32(phw->dw2040_HPICSR + - HPI_RESET); - /* PLL not bypassed */ - hpi_write_word(pdo, 0x01B7C100, 0x0001); - /* ~200us delay */ - for (i = 0; i < 2000; i++) - delay = ioread32(phw->dw2040_HPICSR + - HPI_RESET); - } - - /* test r/w to internal DSP memory - * C6711 has L2 cache mapped to 0x0 when reset - * - * revB - because of bug 3.0.1 last HPI read - * (before HPI address issued) must be non-autoinc - */ - /* test each bit in the 32bit word */ - for (i = 0; i < 100; i++) { - test_addr = 0x00000000; - test_data = 0x00000001; - for (j = 0; j < 32; j++) { - hpi_write_word(pdo, test_addr + i, test_data); - data = hpi_read_word(pdo, test_addr + i); - if (data != test_data) { - HPI_DEBUG_LOG(ERROR, - "DSP mem %x %x %x %x\n", - test_addr + i, test_data, - data, dsp_index); - - return HPI6000_ERROR_INIT_DSPINTMEM; - } - test_data = test_data << 1; - } - } - - /* memory map of ASI6200 - 00000000-0000FFFF 16Kx32 internal program - 01800000-019FFFFF Internal peripheral - 80000000-807FFFFF CE0 2Mx32 SDRAM running @ 100MHz - 90000000-9000FFFF CE1 Async peripherals: - - EMIF config - ------------ - Global EMIF control - 0 - - 1 - - 2 - - 3 CLK2EN = 1 CLKOUT2 enabled - 4 CLK1EN = 0 CLKOUT1 disabled - 5 EKEN = 1 <--!! C6713 specific, enables ECLKOUT - 6 - - 7 NOHOLD = 1 external HOLD disabled - 8 HOLDA = 0 HOLDA output is low - 9 HOLD = 0 HOLD input is low - 10 ARDY = 1 ARDY input is high - 11 BUSREQ = 0 BUSREQ output is low - 12,13 Reserved = 1 - */ - hpi_write_word(pdo, 0x01800000, 0x34A8); - - /* EMIF CE0 setup - 2Mx32 Sync DRAM - 31..28 Wr setup - 27..22 Wr strobe - 21..20 Wr hold - 19..16 Rd setup - 15..14 - - 13..8 Rd strobe - 7..4 MTYPE 0011 Sync DRAM 32bits - 3 Wr hold MSB - 2..0 Rd hold - */ - hpi_write_word(pdo, 0x01800008, 0x00000030); - - /* EMIF SDRAM Extension - 31-21 0 - 20 WR2RD = 0 - 19-18 WR2DEAC = 1 - 17 WR2WR = 0 - 16-15 R2WDQM = 2 - 14-12 RD2WR = 4 - 11-10 RD2DEAC = 1 - 9 RD2RD = 1 - 8-7 THZP = 10b - 6-5 TWR = 2-1 = 01b (tWR = 10ns) - 4 TRRD = 0b = 2 ECLK (tRRD = 14ns) - 3-1 TRAS = 5-1 = 100b (Tras=42ns = 5 ECLK) - 1 CAS latency = 3 ECLK - (for Micron 2M32-7 operating at 100Mhz) - */ - - /* need to use this else DSP code crashes */ - hpi_write_word(pdo, 0x01800020, 0x001BDF29); - - /* EMIF SDRAM control - set up for a 2Mx32 SDRAM (512x32x4 bank) - 31 - - - 30 SDBSZ 1 4 bank - 29..28 SDRSZ 00 11 row address pins - 27..26 SDCSZ 01 8 column address pins - 25 RFEN 1 refersh enabled - 24 INIT 1 init SDRAM - 23..20 TRCD 0001 - 19..16 TRP 0001 - 15..12 TRC 0110 - 11..0 - - - */ - /* need to use this else DSP code crashes */ - hpi_write_word(pdo, 0x01800018, 0x47117000); - - /* EMIF SDRAM Refresh Timing */ - hpi_write_word(pdo, 0x0180001C, 0x00000410); - - /*MIF CE1 setup - Async peripherals - @100MHz bus speed, each cycle is 10ns, - 31..28 Wr setup = 1 - 27..22 Wr strobe = 3 30ns - 21..20 Wr hold = 1 - 19..16 Rd setup =1 - 15..14 Ta = 2 - 13..8 Rd strobe = 3 30ns - 7..4 MTYPE 0010 Async 32bits - 3 Wr hold MSB =0 - 2..0 Rd hold = 1 - */ - { - u32 cE1 = - (1L << 28) | (3L << 22) | (1L << 20) | (1L << - 16) | (2L << 14) | (3L << 8) | (2L << 4) | 1L; - hpi_write_word(pdo, 0x01800004, cE1); - } - - /* delay a little to allow SDRAM and DSP to "get going" */ - - for (i = 0; i < 1000; i++) - delay = ioread32(phw->dw2040_HPICSR + HPI_RESET); - - /* test access to SDRAM */ - { - test_addr = 0x80000000; - test_data = 0x00000001; - /* test each bit in the 32bit word */ - for (j = 0; j < 32; j++) { - hpi_write_word(pdo, test_addr, test_data); - data = hpi_read_word(pdo, test_addr); - if (data != test_data) { - HPI_DEBUG_LOG(ERROR, - "DSP dram %x %x %x %x\n", - test_addr, test_data, data, - dsp_index); - - return HPI6000_ERROR_INIT_SDRAM1; - } - test_data = test_data << 1; - } - /* test every Nth address in the DRAM */ -#define DRAM_SIZE_WORDS 0x200000 /*2_mx32 */ -#define DRAM_INC 1024 - test_addr = 0x80000000; - test_data = 0x0; - for (i = 0; i < DRAM_SIZE_WORDS; i = i + DRAM_INC) { - hpi_write_word(pdo, test_addr + i, test_data); - test_data++; - } - test_addr = 0x80000000; - test_data = 0x0; - for (i = 0; i < DRAM_SIZE_WORDS; i = i + DRAM_INC) { - data = hpi_read_word(pdo, test_addr + i); - if (data != test_data) { - HPI_DEBUG_LOG(ERROR, - "DSP dram %x %x %x %x\n", - test_addr + i, test_data, - data, dsp_index); - return HPI6000_ERROR_INIT_SDRAM2; - } - test_data++; - } - - } - - /* write the DSP code down into the DSPs memory */ - /*HpiDspCode_Open(nBootLoadFamily,&DspCode,pdwOsErrorCode); */ - dsp_code.ps_dev = pao->pci.p_os_data; - - error = hpi_dsp_code_open(boot_load_family, &dsp_code, - pos_error_code); - - if (error) - return error; - - while (1) { - u32 length; - u32 address; - u32 type; - u32 *pcode; - - error = hpi_dsp_code_read_word(&dsp_code, &length); - if (error) - break; - if (length == 0xFFFFFFFF) - break; /* end of code */ - - error = hpi_dsp_code_read_word(&dsp_code, &address); - if (error) - break; - error = hpi_dsp_code_read_word(&dsp_code, &type); - if (error) - break; - error = hpi_dsp_code_read_block(length, &dsp_code, - &pcode); - if (error) - break; - error = hpi6000_dsp_block_write32(pao, (u16)dsp_index, - address, pcode, length); - if (error) - break; - } - - if (error) { - hpi_dsp_code_close(&dsp_code); - return error; - } - /* verify that code was written correctly */ - /* this time through, assume no errors in DSP code file/array */ - hpi_dsp_code_rewind(&dsp_code); - while (1) { - u32 length; - u32 address; - u32 type; - u32 *pcode; - - hpi_dsp_code_read_word(&dsp_code, &length); - if (length == 0xFFFFFFFF) - break; /* end of code */ - - hpi_dsp_code_read_word(&dsp_code, &address); - hpi_dsp_code_read_word(&dsp_code, &type); - hpi_dsp_code_read_block(length, &dsp_code, &pcode); - - for (i = 0; i < length; i++) { - data = hpi_read_word(pdo, address); - if (data != *pcode) { - error = HPI6000_ERROR_INIT_VERIFY; - HPI_DEBUG_LOG(ERROR, - "DSP verify %x %x %x %x\n", - address, *pcode, data, - dsp_index); - break; - } - pcode++; - address += 4; - } - if (error) - break; - } - hpi_dsp_code_close(&dsp_code); - if (error) - return error; - - /* zero out the hostmailbox */ - { - u32 address = HPI_HIF_ADDR(host_cmd); - for (i = 0; i < 4; i++) { - hpi_write_word(pdo, address, 0); - address += 4; - } - } - /* write the DSP number into the hostmailbox */ - /* structure before starting the DSP */ - hpi_write_word(pdo, HPI_HIF_ADDR(dsp_number), dsp_index); - - /* write the DSP adapter Info into the */ - /* hostmailbox before starting the DSP */ - if (dsp_index > 0) - hpi_write_word(pdo, HPI_HIF_ADDR(adapter_info), - adapter_info); - - /* step 3. Start code by sending interrupt */ - iowrite32(0x00030003, pdo->prHPI_control); - for (i = 0; i < 10000; i++) - delay = ioread32(phw->dw2040_HPICSR + HPI_RESET); - - /* wait for a non-zero value in hostcmd - - * indicating initialization is complete - * - * Init could take a while if DSP checks SDRAM memory - * Was 200000. Increased to 2000000 for ASI8801 so we - * don't get 938 errors. - */ - timeout = 2000000; - while (timeout) { - do { - read = hpi_read_word(pdo, - HPI_HIF_ADDR(host_cmd)); - } while (--timeout - && hpi6000_check_PCI2040_error_flag(pao, - H6READ)); - - if (read) - break; - /* The following is a workaround for bug #94: - * Bluescreen on install and subsequent boots on a - * DELL PowerEdge 600SC PC with 1.8GHz P4 and - * ServerWorks chipset. Without this delay the system - * locks up with a bluescreen (NOT GPF or pagefault). - */ - else - hpios_delay_micro_seconds(1000); - } - if (timeout == 0) - return HPI6000_ERROR_INIT_NOACK; - - /* read the DSP adapter Info from the */ - /* hostmailbox structure after starting the DSP */ - if (dsp_index == 0) { - /*u32 dwTestData=0; */ - u32 mask = 0; - - adapter_info = - hpi_read_word(pdo, - HPI_HIF_ADDR(adapter_info)); - if (HPI_ADAPTER_FAMILY_ASI - (HPI_HIF_ADAPTER_INFO_EXTRACT_ADAPTER - (adapter_info)) == - HPI_ADAPTER_FAMILY_ASI(0x6200)) - /* all 6200 cards have this many DSPs */ - phw->num_dsp = 2; - - /* test that the PLD is programmed */ - /* and we can read/write 24bits */ -#define PLD_BASE_ADDRESS 0x90000000L /*for ASI6100/6200/8800 */ - - switch (boot_load_family) { - case HPI_ADAPTER_FAMILY_ASI(0x6200): - /* ASI6100/6200 has 24bit path to FPGA */ - mask = 0xFFFFFF00L; - /* ASI5100 uses AX6 code, */ - /* but has no PLD r/w register to test */ - if (HPI_ADAPTER_FAMILY_ASI(pao->pci. - subsys_device_id) == - HPI_ADAPTER_FAMILY_ASI(0x5100)) - mask = 0x00000000L; - break; - case HPI_ADAPTER_FAMILY_ASI(0x8800): - /* ASI8800 has 16bit path to FPGA */ - mask = 0xFFFF0000L; - break; - } - test_data = 0xAAAAAA00L & mask; - /* write to 24 bit Debug register (D31-D8) */ - hpi_write_word(pdo, PLD_BASE_ADDRESS + 4L, test_data); - read = hpi_read_word(pdo, - PLD_BASE_ADDRESS + 4L) & mask; - if (read != test_data) { - HPI_DEBUG_LOG(ERROR, "PLD %x %x\n", test_data, - read); - return HPI6000_ERROR_INIT_PLDTEST1; - } - test_data = 0x55555500L & mask; - hpi_write_word(pdo, PLD_BASE_ADDRESS + 4L, test_data); - read = hpi_read_word(pdo, - PLD_BASE_ADDRESS + 4L) & mask; - if (read != test_data) { - HPI_DEBUG_LOG(ERROR, "PLD %x %x\n", test_data, - read); - return HPI6000_ERROR_INIT_PLDTEST2; - } - } - } /* for numDSP */ - return 0; -} - -#define PCI_TIMEOUT 100 - -static int hpi_set_address(struct dsp_obj *pdo, u32 address) -{ - u32 timeout = PCI_TIMEOUT; - - do { - iowrite32(address, pdo->prHPI_address); - } while (hpi6000_check_PCI2040_error_flag(pdo->pa_parent_adapter, - H6WRITE) - && --timeout); - - if (timeout) - return 0; - - return 1; -} - -/* write one word to the HPI port */ -static void hpi_write_word(struct dsp_obj *pdo, u32 address, u32 data) -{ - if (hpi_set_address(pdo, address)) - return; - iowrite32(data, pdo->prHPI_data); -} - -/* read one word from the HPI port */ -static u32 hpi_read_word(struct dsp_obj *pdo, u32 address) -{ - u32 data = 0; - - if (hpi_set_address(pdo, address)) - return 0; /*? no way to return error */ - - /* take care of errata in revB DSP (2.0.1) */ - data = ioread32(pdo->prHPI_data); - return data; -} - -/* write a block of 32bit words to the DSP HPI port using auto-inc mode */ -static void hpi_write_block(struct dsp_obj *pdo, u32 address, u32 *pdata, - u32 length) -{ - u16 length16 = length - 1; - - if (length == 0) - return; - - if (hpi_set_address(pdo, address)) - return; - - iowrite32_rep(pdo->prHPI_data_auto_inc, pdata, length16); - - /* take care of errata in revB DSP (2.0.1) */ - /* must end with non auto-inc */ - iowrite32(*(pdata + length - 1), pdo->prHPI_data); -} - -/** read a block of 32bit words from the DSP HPI port using auto-inc mode - */ -static void hpi_read_block(struct dsp_obj *pdo, u32 address, u32 *pdata, - u32 length) -{ - u16 length16 = length - 1; - - if (length == 0) - return; - - if (hpi_set_address(pdo, address)) - return; - - ioread32_rep(pdo->prHPI_data_auto_inc, pdata, length16); - - /* take care of errata in revB DSP (2.0.1) */ - /* must end with non auto-inc */ - *(pdata + length - 1) = ioread32(pdo->prHPI_data); -} - -static u16 hpi6000_dsp_block_write32(struct hpi_adapter_obj *pao, - u16 dsp_index, u32 hpi_address, u32 *source, u32 count) -{ - struct dsp_obj *pdo = - &(*(struct hpi_hw_obj *)pao->priv).ado[dsp_index]; - u32 time_out = PCI_TIMEOUT; - int c6711_burst_size = 128; - u32 local_hpi_address = hpi_address; - int local_count = count; - int xfer_size; - u32 *pdata = source; - - while (local_count) { - if (local_count > c6711_burst_size) - xfer_size = c6711_burst_size; - else - xfer_size = local_count; - - time_out = PCI_TIMEOUT; - do { - hpi_write_block(pdo, local_hpi_address, pdata, - xfer_size); - } while (hpi6000_check_PCI2040_error_flag(pao, H6WRITE) - && --time_out); - - if (!time_out) - break; - pdata += xfer_size; - local_hpi_address += sizeof(u32) * xfer_size; - local_count -= xfer_size; - } - - if (time_out) - return 0; - else - return 1; -} - -static u16 hpi6000_dsp_block_read32(struct hpi_adapter_obj *pao, - u16 dsp_index, u32 hpi_address, u32 *dest, u32 count) -{ - struct dsp_obj *pdo = - &(*(struct hpi_hw_obj *)pao->priv).ado[dsp_index]; - u32 time_out = PCI_TIMEOUT; - int c6711_burst_size = 16; - u32 local_hpi_address = hpi_address; - int local_count = count; - int xfer_size; - u32 *pdata = dest; - u32 loop_count = 0; - - while (local_count) { - if (local_count > c6711_burst_size) - xfer_size = c6711_burst_size; - else - xfer_size = local_count; - - time_out = PCI_TIMEOUT; - do { - hpi_read_block(pdo, local_hpi_address, pdata, - xfer_size); - } while (hpi6000_check_PCI2040_error_flag(pao, H6READ) - && --time_out); - if (!time_out) - break; - - pdata += xfer_size; - local_hpi_address += sizeof(u32) * xfer_size; - local_count -= xfer_size; - loop_count++; - } - - if (time_out) - return 0; - else - return 1; -} - -static short hpi6000_message_response_sequence(struct hpi_adapter_obj *pao, - u16 dsp_index, struct hpi_message *phm, struct hpi_response *phr) -{ - struct hpi_hw_obj *phw = (struct hpi_hw_obj *)pao->priv; - struct dsp_obj *pdo = &phw->ado[dsp_index]; - u32 timeout; - u16 ack; - u32 address; - u32 length; - u32 *p_data; - u16 error = 0; - - /* does the DSP we are referencing exist? */ - if (dsp_index >= phw->num_dsp) - return HPI6000_ERROR_MSG_INVALID_DSP_INDEX; - - ack = hpi6000_wait_dsp_ack(pao, dsp_index, HPI_HIF_IDLE); - if (ack & HPI_HIF_ERROR_MASK) { - pao->dsp_crashed++; - return HPI6000_ERROR_MSG_RESP_IDLE_TIMEOUT; - } - pao->dsp_crashed = 0; - - /* send the message */ - - /* get the address and size */ - if (phw->message_buffer_address_on_dsp == 0) { - timeout = TIMEOUT; - do { - address = - hpi_read_word(pdo, - HPI_HIF_ADDR(message_buffer_address)); - phw->message_buffer_address_on_dsp = address; - } while (hpi6000_check_PCI2040_error_flag(pao, H6READ) - && --timeout); - if (!timeout) - return HPI6000_ERROR_MSG_GET_ADR; - } else - address = phw->message_buffer_address_on_dsp; - - /* dwLength = sizeof(struct hpi_message); */ - length = phm->size; - - /* send it */ - p_data = (u32 *)phm; - if (hpi6000_dsp_block_write32(pao, dsp_index, address, p_data, - (u16)length / 4)) - return HPI6000_ERROR_MSG_RESP_BLOCKWRITE32; - - if (hpi6000_send_host_command(pao, dsp_index, HPI_HIF_GET_RESP)) - return HPI6000_ERROR_MSG_RESP_GETRESPCMD; - hpi6000_send_dsp_interrupt(pdo); - - ack = hpi6000_wait_dsp_ack(pao, dsp_index, HPI_HIF_GET_RESP); - if (ack & HPI_HIF_ERROR_MASK) - return HPI6000_ERROR_MSG_RESP_GET_RESP_ACK; - - /* get the address and size */ - if (phw->response_buffer_address_on_dsp == 0) { - timeout = TIMEOUT; - do { - address = - hpi_read_word(pdo, - HPI_HIF_ADDR(response_buffer_address)); - } while (hpi6000_check_PCI2040_error_flag(pao, H6READ) - && --timeout); - phw->response_buffer_address_on_dsp = address; - - if (!timeout) - return HPI6000_ERROR_RESP_GET_ADR; - } else - address = phw->response_buffer_address_on_dsp; - - /* read the length of the response back from the DSP */ - timeout = TIMEOUT; - do { - length = hpi_read_word(pdo, HPI_HIF_ADDR(length)); - } while (hpi6000_check_PCI2040_error_flag(pao, H6READ) && --timeout); - if (!timeout) - length = sizeof(struct hpi_response); - - /* get it */ - p_data = (u32 *)phr; - if (hpi6000_dsp_block_read32(pao, dsp_index, address, p_data, - (u16)length / 4)) - return HPI6000_ERROR_MSG_RESP_BLOCKREAD32; - - /* set i/f back to idle */ - if (hpi6000_send_host_command(pao, dsp_index, HPI_HIF_IDLE)) - return HPI6000_ERROR_MSG_RESP_IDLECMD; - hpi6000_send_dsp_interrupt(pdo); - - error = hpi_validate_response(phm, phr); - return error; -} - -/* have to set up the below defines to match stuff in the MAP file */ - -#define MSG_ADDRESS (HPI_HIF_BASE+0x18) -#define MSG_LENGTH 11 -#define RESP_ADDRESS (HPI_HIF_BASE+0x44) -#define RESP_LENGTH 16 -#define QUEUE_START (HPI_HIF_BASE+0x88) -#define QUEUE_SIZE 0x8000 - -static short hpi6000_send_data_check_adr(u32 address, u32 length_in_dwords) -{ -/*#define CHECKING // comment this line in to enable checking */ -#ifdef CHECKING - if (address < (u32)MSG_ADDRESS) - return 0; - if (address > (u32)(QUEUE_START + QUEUE_SIZE)) - return 0; - if ((address + (length_in_dwords << 2)) > - (u32)(QUEUE_START + QUEUE_SIZE)) - return 0; -#else - (void)address; - (void)length_in_dwords; - return 1; -#endif -} - -static short hpi6000_send_data(struct hpi_adapter_obj *pao, u16 dsp_index, - struct hpi_message *phm, struct hpi_response *phr) -{ - struct dsp_obj *pdo = - &(*(struct hpi_hw_obj *)pao->priv).ado[dsp_index]; - u32 data_sent = 0; - u16 ack; - u32 length, address; - u32 *p_data = (u32 *)phm->u.d.u.data.pb_data; - u16 time_out = 8; - - (void)phr; - - /* round dwDataSize down to nearest 4 bytes */ - while ((data_sent < (phm->u.d.u.data.data_size & ~3L)) - && --time_out) { - ack = hpi6000_wait_dsp_ack(pao, dsp_index, HPI_HIF_IDLE); - if (ack & HPI_HIF_ERROR_MASK) - return HPI6000_ERROR_SEND_DATA_IDLE_TIMEOUT; - - if (hpi6000_send_host_command(pao, dsp_index, - HPI_HIF_SEND_DATA)) - return HPI6000_ERROR_SEND_DATA_CMD; - - hpi6000_send_dsp_interrupt(pdo); - - ack = hpi6000_wait_dsp_ack(pao, dsp_index, HPI_HIF_SEND_DATA); - - if (ack & HPI_HIF_ERROR_MASK) - return HPI6000_ERROR_SEND_DATA_ACK; - - do { - /* get the address and size */ - address = hpi_read_word(pdo, HPI_HIF_ADDR(address)); - /* DSP returns number of DWORDS */ - length = hpi_read_word(pdo, HPI_HIF_ADDR(length)); - } while (hpi6000_check_PCI2040_error_flag(pao, H6READ)); - - if (!hpi6000_send_data_check_adr(address, length)) - return HPI6000_ERROR_SEND_DATA_ADR; - - /* send the data. break data into 512 DWORD blocks (2K bytes) - * and send using block write. 2Kbytes is the max as this is the - * memory window given to the HPI data register by the PCI2040 - */ - - { - u32 len = length; - u32 blk_len = 512; - while (len) { - if (len < blk_len) - blk_len = len; - if (hpi6000_dsp_block_write32(pao, dsp_index, - address, p_data, blk_len)) - return HPI6000_ERROR_SEND_DATA_WRITE; - address += blk_len * 4; - p_data += blk_len; - len -= blk_len; - } - } - - if (hpi6000_send_host_command(pao, dsp_index, HPI_HIF_IDLE)) - return HPI6000_ERROR_SEND_DATA_IDLECMD; - - hpi6000_send_dsp_interrupt(pdo); - - data_sent += length * 4; - } - if (!time_out) - return HPI6000_ERROR_SEND_DATA_TIMEOUT; - return 0; -} - -static short hpi6000_get_data(struct hpi_adapter_obj *pao, u16 dsp_index, - struct hpi_message *phm, struct hpi_response *phr) -{ - struct dsp_obj *pdo = - &(*(struct hpi_hw_obj *)pao->priv).ado[dsp_index]; - u32 data_got = 0; - u16 ack; - u32 length, address; - u32 *p_data = (u32 *)phm->u.d.u.data.pb_data; - - (void)phr; /* this parameter not used! */ - - /* round dwDataSize down to nearest 4 bytes */ - while (data_got < (phm->u.d.u.data.data_size & ~3L)) { - ack = hpi6000_wait_dsp_ack(pao, dsp_index, HPI_HIF_IDLE); - if (ack & HPI_HIF_ERROR_MASK) - return HPI6000_ERROR_GET_DATA_IDLE_TIMEOUT; - - if (hpi6000_send_host_command(pao, dsp_index, - HPI_HIF_GET_DATA)) - return HPI6000_ERROR_GET_DATA_CMD; - hpi6000_send_dsp_interrupt(pdo); - - ack = hpi6000_wait_dsp_ack(pao, dsp_index, HPI_HIF_GET_DATA); - - if (ack & HPI_HIF_ERROR_MASK) - return HPI6000_ERROR_GET_DATA_ACK; - - /* get the address and size */ - do { - address = hpi_read_word(pdo, HPI_HIF_ADDR(address)); - length = hpi_read_word(pdo, HPI_HIF_ADDR(length)); - } while (hpi6000_check_PCI2040_error_flag(pao, H6READ)); - - /* read the data */ - { - u32 len = length; - u32 blk_len = 512; - while (len) { - if (len < blk_len) - blk_len = len; - if (hpi6000_dsp_block_read32(pao, dsp_index, - address, p_data, blk_len)) - return HPI6000_ERROR_GET_DATA_READ; - address += blk_len * 4; - p_data += blk_len; - len -= blk_len; - } - } - - if (hpi6000_send_host_command(pao, dsp_index, HPI_HIF_IDLE)) - return HPI6000_ERROR_GET_DATA_IDLECMD; - hpi6000_send_dsp_interrupt(pdo); - - data_got += length * 4; - } - return 0; -} - -static void hpi6000_send_dsp_interrupt(struct dsp_obj *pdo) -{ - iowrite32(0x00030003, pdo->prHPI_control); /* DSPINT */ -} - -static short hpi6000_send_host_command(struct hpi_adapter_obj *pao, - u16 dsp_index, u32 host_cmd) -{ - struct dsp_obj *pdo = - &(*(struct hpi_hw_obj *)pao->priv).ado[dsp_index]; - u32 timeout = TIMEOUT; - - /* set command */ - do { - hpi_write_word(pdo, HPI_HIF_ADDR(host_cmd), host_cmd); - /* flush the FIFO */ - hpi_set_address(pdo, HPI_HIF_ADDR(host_cmd)); - } while (hpi6000_check_PCI2040_error_flag(pao, H6WRITE) && --timeout); - - /* reset the interrupt bit */ - iowrite32(0x00040004, pdo->prHPI_control); - - if (timeout) - return 0; - else - return 1; -} - -/* if the PCI2040 has recorded an HPI timeout, reset the error and return 1 */ -static short hpi6000_check_PCI2040_error_flag(struct hpi_adapter_obj *pao, - u16 read_or_write) -{ - u32 hPI_error; - - struct hpi_hw_obj *phw = (struct hpi_hw_obj *)pao->priv; - - /* read the error bits from the PCI2040 */ - hPI_error = ioread32(phw->dw2040_HPICSR + HPI_ERROR_REPORT); - if (hPI_error) { - /* reset the error flag */ - iowrite32(0L, phw->dw2040_HPICSR + HPI_ERROR_REPORT); - phw->pCI2040HPI_error_count++; - if (read_or_write == 1) - gw_pci_read_asserts++; /************* inc global */ - else - gw_pci_write_asserts++; - return 1; - } else - return 0; -} - -static short hpi6000_wait_dsp_ack(struct hpi_adapter_obj *pao, u16 dsp_index, - u32 ack_value) -{ - struct dsp_obj *pdo = - &(*(struct hpi_hw_obj *)pao->priv).ado[dsp_index]; - u32 ack = 0L; - u32 timeout; - u32 hPIC = 0L; - - /* wait for host interrupt to signal ack is ready */ - timeout = TIMEOUT; - while (--timeout) { - hPIC = ioread32(pdo->prHPI_control); - if (hPIC & 0x04) /* 0x04 = HINT from DSP */ - break; - } - if (timeout == 0) - return HPI_HIF_ERROR_MASK; - - /* wait for dwAckValue */ - timeout = TIMEOUT; - while (--timeout) { - /* read the ack mailbox */ - ack = hpi_read_word(pdo, HPI_HIF_ADDR(dsp_ack)); - if (ack == ack_value) - break; - if ((ack & HPI_HIF_ERROR_MASK) - && !hpi6000_check_PCI2040_error_flag(pao, H6READ)) - break; - /*for (i=0;i<1000;i++) */ - /* dwPause=i+1; */ - } - if (ack & HPI_HIF_ERROR_MASK) - /* indicates bad read from DSP - - typically 0xffffff is read for some reason */ - ack = HPI_HIF_ERROR_MASK; - - if (timeout == 0) - ack = HPI_HIF_ERROR_MASK; - return (short)ack; -} - -static short hpi6000_update_control_cache(struct hpi_adapter_obj *pao, - struct hpi_message *phm) -{ - const u16 dsp_index = 0; - struct hpi_hw_obj *phw = (struct hpi_hw_obj *)pao->priv; - struct dsp_obj *pdo = &phw->ado[dsp_index]; - u32 timeout; - u32 cache_dirty_flag; - u16 err; - - hpios_dsplock_lock(pao); - - timeout = TIMEOUT; - do { - cache_dirty_flag = - hpi_read_word((struct dsp_obj *)pdo, - HPI_HIF_ADDR(control_cache_is_dirty)); - } while (hpi6000_check_PCI2040_error_flag(pao, H6READ) && --timeout); - if (!timeout) { - err = HPI6000_ERROR_CONTROL_CACHE_PARAMS; - goto unlock; - } - - if (cache_dirty_flag) { - /* read the cached controls */ - u32 address; - u32 length; - - timeout = TIMEOUT; - if (pdo->control_cache_address_on_dsp == 0) { - do { - address = - hpi_read_word((struct dsp_obj *)pdo, - HPI_HIF_ADDR(control_cache_address)); - - length = hpi_read_word((struct dsp_obj *)pdo, - HPI_HIF_ADDR - (control_cache_size_in_bytes)); - } while (hpi6000_check_PCI2040_error_flag(pao, H6READ) - && --timeout); - if (!timeout) { - err = HPI6000_ERROR_CONTROL_CACHE_ADDRLEN; - goto unlock; - } - pdo->control_cache_address_on_dsp = address; - pdo->control_cache_length_on_dsp = length; - } else { - address = pdo->control_cache_address_on_dsp; - length = pdo->control_cache_length_on_dsp; - } - - if (hpi6000_dsp_block_read32(pao, dsp_index, address, - (u32 *)&phw->control_cache[0], - length / sizeof(u32))) { - err = HPI6000_ERROR_CONTROL_CACHE_READ; - goto unlock; - } - do { - hpi_write_word((struct dsp_obj *)pdo, - HPI_HIF_ADDR(control_cache_is_dirty), 0); - /* flush the FIFO */ - hpi_set_address(pdo, HPI_HIF_ADDR(host_cmd)); - } while (hpi6000_check_PCI2040_error_flag(pao, H6WRITE) - && --timeout); - if (!timeout) { - err = HPI6000_ERROR_CONTROL_CACHE_FLUSH; - goto unlock; - } - - } - err = 0; - -unlock: - hpios_dsplock_unlock(pao); - return err; -} - -/** Get dsp index for multi DSP adapters only */ -static u16 get_dsp_index(struct hpi_adapter_obj *pao, struct hpi_message *phm) -{ - u16 ret = 0; - switch (phm->object) { - case HPI_OBJ_ISTREAM: - if (phm->obj_index < 2) - ret = 1; - break; - case HPI_OBJ_PROFILE: - ret = phm->obj_index; - break; - default: - break; - } - return ret; -} - -/** Complete transaction with DSP - -Send message, get response, send or get stream data if any. -*/ -static void hw_message(struct hpi_adapter_obj *pao, struct hpi_message *phm, - struct hpi_response *phr) -{ - u16 error = 0; - u16 dsp_index = 0; - u16 num_dsp = ((struct hpi_hw_obj *)pao->priv)->num_dsp; - hpios_dsplock_lock(pao); - - if (num_dsp < 2) - dsp_index = 0; - else { - dsp_index = get_dsp_index(pao, phm); - - /* is this checked on the DSP anyway? */ - if ((phm->function == HPI_ISTREAM_GROUP_ADD) - || (phm->function == HPI_OSTREAM_GROUP_ADD)) { - struct hpi_message hm; - u16 add_index; - hm.obj_index = phm->u.d.u.stream.stream_index; - hm.object = phm->u.d.u.stream.object_type; - add_index = get_dsp_index(pao, &hm); - if (add_index != dsp_index) { - phr->error = HPI_ERROR_NO_INTERDSP_GROUPS; - return; - } - } - } - error = hpi6000_message_response_sequence(pao, dsp_index, phm, phr); - - /* maybe an error response */ - if (error) { - /* something failed in the HPI/DSP interface */ - phr->error = error; - /* just the header of the response is valid */ - phr->size = sizeof(struct hpi_response_header); - goto err; - } - - if (phr->error != 0) /* something failed in the DSP */ - goto err; - - switch (phm->function) { - case HPI_OSTREAM_WRITE: - case HPI_ISTREAM_ANC_WRITE: - error = hpi6000_send_data(pao, dsp_index, phm, phr); - break; - case HPI_ISTREAM_READ: - case HPI_OSTREAM_ANC_READ: - error = hpi6000_get_data(pao, dsp_index, phm, phr); - break; - case HPI_ADAPTER_GET_ASSERT: - phr->u.a.adapter_index = 0; /* dsp 0 default */ - if (num_dsp == 2) { - if (!phr->u.a.adapter_type) { - /* no assert from dsp 0, check dsp 1 */ - error = hpi6000_message_response_sequence(pao, - 1, phm, phr); - phr->u.a.adapter_index = 1; - } - } - } - - if (error) - phr->error = error; - -err: - hpios_dsplock_unlock(pao); - return; -} +#include "adriver.h" +#include "../../alsa-kernel/pci/asihpi/hpi6000.c" diff --git a/pci/asihpi/hpi6000.h b/pci/asihpi/hpi6000.h deleted file mode 100644 index 4c7d507c0..000000000 --- a/pci/asihpi/hpi6000.h +++ /dev/null @@ -1,70 +0,0 @@ -/***************************************************************************** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Public declarations for DSP Proramming Interface to TI C6701 - -Shared between hpi6000.c and DSP code - -(C) Copyright AudioScience Inc. 1998-2003 -******************************************************************************/ - -#ifndef _HPI6000_H_ -#define _HPI6000_H_ - -#define HPI_NMIXER_CONTROLS 200 - -/* - * Control caching is always supported in the HPI code. - * The DSP should make sure that dwControlCacheSizeInBytes is initialized to 0 - * during boot to make it in-active. - */ -struct hpi_hif_6000 { - u32 host_cmd; - u32 dsp_ack; - u32 address; - u32 length; - u32 message_buffer_address; - u32 response_buffer_address; - u32 dsp_number; - u32 adapter_info; - u32 control_cache_is_dirty; - u32 control_cache_address; - u32 control_cache_size_in_bytes; - u32 control_cache_count; -}; - -#define HPI_HIF_PACK_ADAPTER_INFO(adapter, version_major, version_minor) \ - ((adapter << 16) | (version_major << 8) | version_minor) -#define HPI_HIF_ADAPTER_INFO_EXTRACT_ADAPTER(adapterinfo) \ - ((adapterinfo >> 16) & 0xffff) -#define HPI_HIF_ADAPTER_INFO_EXTRACT_HWVERSION_MAJOR(adapterinfo) \ - ((adapterinfo >> 8) & 0xff) -#define HPI_HIF_ADAPTER_INFO_EXTRACT_HWVERSION_MINOR(adapterinfo) \ - (adapterinfo & 0xff) - -/* Command/status exchanged between host and DSP */ -#define HPI_HIF_IDLE 0 -#define HPI_HIF_SEND_MSG 1 -#define HPI_HIF_GET_RESP 2 -#define HPI_HIF_DATA_MASK 0x10 -#define HPI_HIF_SEND_DATA 0x13 -#define HPI_HIF_GET_DATA 0x14 -#define HPI_HIF_SEND_DONE 5 -#define HPI_HIF_RESET 9 - -#endif /* _HPI6000_H_ */ diff --git a/pci/asihpi/hpi6205.c b/pci/asihpi/hpi6205.c index 8df2ff76d..bfa9bf259 100644 --- a/pci/asihpi/hpi6205.c +++ b/pci/asihpi/hpi6205.c @@ -1,2332 +1,2 @@ -/****************************************************************************** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Hardware Programming Interface (HPI) for AudioScience - ASI50xx, AS51xx, ASI6xxx, ASI87xx ASI89xx series adapters. - These PCI and PCIe bus adapters are based on a - TMS320C6205 PCI bus mastering DSP, - and (except ASI50xx) TI TMS320C6xxx floating point DSP - - Exported function: - void HPI_6205(struct hpi_message *phm, struct hpi_response *phr) - -(C) Copyright AudioScience Inc. 1998-2010 -*******************************************************************************/ -#define SOURCEFILE_NAME "hpi6205.c" - -#include "hpi_internal.h" -#include "hpimsginit.h" -#include "hpidebug.h" -#include "hpi6205.h" -#include "hpidspcd.h" -#include "hpicmn.h" - -/*****************************************************************************/ -/* HPI6205 specific error codes */ -#define HPI6205_ERROR_BASE 1000 -/*#define HPI6205_ERROR_MEM_ALLOC 1001 */ -#define HPI6205_ERROR_6205_NO_IRQ 1002 -#define HPI6205_ERROR_6205_INIT_FAILED 1003 -/*#define HPI6205_ERROR_MISSING_DSPCODE 1004 */ -#define HPI6205_ERROR_UNKNOWN_PCI_DEVICE 1005 -#define HPI6205_ERROR_6205_REG 1006 -#define HPI6205_ERROR_6205_DSPPAGE 1007 -#define HPI6205_ERROR_BAD_DSPINDEX 1008 -#define HPI6205_ERROR_C6713_HPIC 1009 -#define HPI6205_ERROR_C6713_HPIA 1010 -#define HPI6205_ERROR_C6713_PLL 1011 -#define HPI6205_ERROR_DSP_INTMEM 1012 -#define HPI6205_ERROR_DSP_EXTMEM 1013 -#define HPI6205_ERROR_DSP_PLD 1014 -#define HPI6205_ERROR_MSG_RESP_IDLE_TIMEOUT 1015 -#define HPI6205_ERROR_MSG_RESP_TIMEOUT 1016 -#define HPI6205_ERROR_6205_EEPROM 1017 -#define HPI6205_ERROR_DSP_EMIF 1018 - -#define hpi6205_error(dsp_index, err) (err) -/*****************************************************************************/ -/* for C6205 PCI i/f */ -/* Host Status Register (HSR) bitfields */ -#define C6205_HSR_INTSRC 0x01 -#define C6205_HSR_INTAVAL 0x02 -#define C6205_HSR_INTAM 0x04 -#define C6205_HSR_CFGERR 0x08 -#define C6205_HSR_EEREAD 0x10 -/* Host-to-DSP Control Register (HDCR) bitfields */ -#define C6205_HDCR_WARMRESET 0x01 -#define C6205_HDCR_DSPINT 0x02 -#define C6205_HDCR_PCIBOOT 0x04 -/* DSP Page Register (DSPP) bitfields, */ -/* defines 4 Mbyte page that BAR0 points to */ -#define C6205_DSPP_MAP1 0x400 - -/* BAR0 maps to prefetchable 4 Mbyte memory block set by DSPP. - * BAR1 maps to non-prefetchable 8 Mbyte memory block - * of DSP memory mapped registers (starting at 0x01800000). - * 0x01800000 is hardcoded in the PCI i/f, so that only the offset from this - * needs to be added to the BAR1 base address set in the PCI config reg - */ -#define C6205_BAR1_PCI_IO_OFFSET (0x027FFF0L) -#define C6205_BAR1_HSR (C6205_BAR1_PCI_IO_OFFSET) -#define C6205_BAR1_HDCR (C6205_BAR1_PCI_IO_OFFSET+4) -#define C6205_BAR1_DSPP (C6205_BAR1_PCI_IO_OFFSET+8) - -/* used to control LED (revA) and reset C6713 (revB) */ -#define C6205_BAR0_TIMER1_CTL (0x01980000L) - -/* For first 6713 in CE1 space, using DA17,16,2 */ -#define HPICL_ADDR 0x01400000L -#define HPICH_ADDR 0x01400004L -#define HPIAL_ADDR 0x01410000L -#define HPIAH_ADDR 0x01410004L -#define HPIDIL_ADDR 0x01420000L -#define HPIDIH_ADDR 0x01420004L -#define HPIDL_ADDR 0x01430000L -#define HPIDH_ADDR 0x01430004L - -#define C6713_EMIF_GCTL 0x01800000 -#define C6713_EMIF_CE1 0x01800004 -#define C6713_EMIF_CE0 0x01800008 -#define C6713_EMIF_CE2 0x01800010 -#define C6713_EMIF_CE3 0x01800014 -#define C6713_EMIF_SDRAMCTL 0x01800018 -#define C6713_EMIF_SDRAMTIMING 0x0180001C -#define C6713_EMIF_SDRAMEXT 0x01800020 - -struct hpi_hw_obj { - /* PCI registers */ - __iomem u32 *prHSR; - __iomem u32 *prHDCR; - __iomem u32 *prDSPP; - - u32 dsp_page; - - struct consistent_dma_area h_locked_mem; - struct bus_master_interface *p_interface_buffer; - - u16 flag_outstream_just_reset[HPI_MAX_STREAMS]; - /* a non-NULL handle means there is an HPI allocated buffer */ - struct consistent_dma_area instream_host_buffers[HPI_MAX_STREAMS]; - struct consistent_dma_area outstream_host_buffers[HPI_MAX_STREAMS]; - /* non-zero size means a buffer exists, may be external */ - u32 instream_host_buffer_size[HPI_MAX_STREAMS]; - u32 outstream_host_buffer_size[HPI_MAX_STREAMS]; - - struct consistent_dma_area h_control_cache; - struct consistent_dma_area h_async_event_buffer; -/* struct hpi_control_cache_single *pControlCache; */ - struct hpi_async_event *p_async_event_buffer; - struct hpi_control_cache *p_cache; -}; - -/*****************************************************************************/ -/* local prototypes */ - -#define check_before_bbm_copy(status, p_bbm_data, l_first_write, l_second_write) - -static int wait_dsp_ack(struct hpi_hw_obj *phw, int state, int timeout_us); - -static void send_dsp_command(struct hpi_hw_obj *phw, int cmd); - -static u16 adapter_boot_load_dsp(struct hpi_adapter_obj *pao, - u32 *pos_error_code); - -static u16 message_response_sequence(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr); - -static void hw_message(struct hpi_adapter_obj *pao, struct hpi_message *phm, - struct hpi_response *phr); - -#define HPI6205_TIMEOUT 1000000 - -static void subsys_create_adapter(struct hpi_message *phm, - struct hpi_response *phr); -static void subsys_delete_adapter(struct hpi_message *phm, - struct hpi_response *phr); - -static u16 create_adapter_obj(struct hpi_adapter_obj *pao, - u32 *pos_error_code); - -static void delete_adapter_obj(struct hpi_adapter_obj *pao); - -static void outstream_host_buffer_allocate(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr); - -static void outstream_host_buffer_get_info(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr); - -static void outstream_host_buffer_free(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr); -static void outstream_write(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr); - -static void outstream_get_info(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr); - -static void outstream_start(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr); - -static void outstream_open(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr); - -static void outstream_reset(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr); - -static void instream_host_buffer_allocate(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr); - -static void instream_host_buffer_get_info(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr); - -static void instream_host_buffer_free(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr); - -static void instream_read(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr); - -static void instream_get_info(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr); - -static void instream_start(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr); - -static u32 boot_loader_read_mem32(struct hpi_adapter_obj *pao, int dsp_index, - u32 address); - -static u16 boot_loader_write_mem32(struct hpi_adapter_obj *pao, int dsp_index, - u32 address, u32 data); - -static u16 boot_loader_config_emif(struct hpi_adapter_obj *pao, - int dsp_index); - -static u16 boot_loader_test_memory(struct hpi_adapter_obj *pao, int dsp_index, - u32 address, u32 length); - -static u16 boot_loader_test_internal_memory(struct hpi_adapter_obj *pao, - int dsp_index); - -static u16 boot_loader_test_external_memory(struct hpi_adapter_obj *pao, - int dsp_index); - -static u16 boot_loader_test_pld(struct hpi_adapter_obj *pao, int dsp_index); - -/*****************************************************************************/ - -static void subsys_message(struct hpi_message *phm, struct hpi_response *phr) -{ - - switch (phm->function) { - case HPI_SUBSYS_OPEN: - case HPI_SUBSYS_CLOSE: - case HPI_SUBSYS_GET_INFO: - case HPI_SUBSYS_DRIVER_UNLOAD: - case HPI_SUBSYS_DRIVER_LOAD: - case HPI_SUBSYS_FIND_ADAPTERS: - /* messages that should not get here */ - phr->error = HPI_ERROR_UNIMPLEMENTED; - break; - case HPI_SUBSYS_CREATE_ADAPTER: - subsys_create_adapter(phm, phr); - break; - case HPI_SUBSYS_DELETE_ADAPTER: - subsys_delete_adapter(phm, phr); - break; - default: - phr->error = HPI_ERROR_INVALID_FUNC; - break; - } -} - -static void control_message(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - - struct hpi_hw_obj *phw = pao->priv; - - switch (phm->function) { - case HPI_CONTROL_GET_STATE: - if (pao->has_control_cache) { - rmb(); /* make sure we see updates DM_aed from DSP */ - if (hpi_check_control_cache(phw->p_cache, phm, phr)) - break; - } - hw_message(pao, phm, phr); - break; - case HPI_CONTROL_GET_INFO: - hw_message(pao, phm, phr); - break; - case HPI_CONTROL_SET_STATE: - hw_message(pao, phm, phr); - if (pao->has_control_cache) - hpi_sync_control_cache(phw->p_cache, phm, phr); - break; - default: - phr->error = HPI_ERROR_INVALID_FUNC; - break; - } -} - -static void adapter_message(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - switch (phm->function) { - default: - hw_message(pao, phm, phr); - break; - } -} - -static void outstream_message(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - - if (phm->obj_index >= HPI_MAX_STREAMS) { - phr->error = HPI_ERROR_INVALID_STREAM; - HPI_DEBUG_LOG(WARNING, - "message referencing invalid stream %d " - "on adapter index %d\n", phm->obj_index, - phm->adapter_index); - return; - } - - switch (phm->function) { - case HPI_OSTREAM_WRITE: - outstream_write(pao, phm, phr); - break; - case HPI_OSTREAM_GET_INFO: - outstream_get_info(pao, phm, phr); - break; - case HPI_OSTREAM_HOSTBUFFER_ALLOC: - outstream_host_buffer_allocate(pao, phm, phr); - break; - case HPI_OSTREAM_HOSTBUFFER_GET_INFO: - outstream_host_buffer_get_info(pao, phm, phr); - break; - case HPI_OSTREAM_HOSTBUFFER_FREE: - outstream_host_buffer_free(pao, phm, phr); - break; - case HPI_OSTREAM_START: - outstream_start(pao, phm, phr); - break; - case HPI_OSTREAM_OPEN: - outstream_open(pao, phm, phr); - break; - case HPI_OSTREAM_RESET: - outstream_reset(pao, phm, phr); - break; - default: - hw_message(pao, phm, phr); - break; - } -} - -static void instream_message(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - - if (phm->obj_index >= HPI_MAX_STREAMS) { - phr->error = HPI_ERROR_INVALID_STREAM; - HPI_DEBUG_LOG(WARNING, - "message referencing invalid stream %d " - "on adapter index %d\n", phm->obj_index, - phm->adapter_index); - return; - } - - switch (phm->function) { - case HPI_ISTREAM_READ: - instream_read(pao, phm, phr); - break; - case HPI_ISTREAM_GET_INFO: - instream_get_info(pao, phm, phr); - break; - case HPI_ISTREAM_HOSTBUFFER_ALLOC: - instream_host_buffer_allocate(pao, phm, phr); - break; - case HPI_ISTREAM_HOSTBUFFER_GET_INFO: - instream_host_buffer_get_info(pao, phm, phr); - break; - case HPI_ISTREAM_HOSTBUFFER_FREE: - instream_host_buffer_free(pao, phm, phr); - break; - case HPI_ISTREAM_START: - instream_start(pao, phm, phr); - break; - default: - hw_message(pao, phm, phr); - break; - } -} - -/*****************************************************************************/ -/** Entry point to this HPI backend - * All calls to the HPI start here - */ -void HPI_6205(struct hpi_message *phm, struct hpi_response *phr) -{ - struct hpi_adapter_obj *pao = NULL; - - /* subsytem messages are processed by every HPI. - * All other messages are ignored unless the adapter index matches - * an adapter in the HPI - */ - HPI_DEBUG_LOG(DEBUG, "HPI obj=%d, func=%d\n", phm->object, - phm->function); - - /* if Dsp has crashed then do not communicate with it any more */ - if (phm->object != HPI_OBJ_SUBSYSTEM) { - pao = hpi_find_adapter(phm->adapter_index); - if (!pao) { - HPI_DEBUG_LOG(DEBUG, - " %d,%d refused, for another HPI?\n", - phm->object, phm->function); - return; - } - - if ((pao->dsp_crashed >= 10) - && (phm->function != HPI_ADAPTER_DEBUG_READ)) { - /* allow last resort debug read even after crash */ - hpi_init_response(phr, phm->object, phm->function, - HPI_ERROR_DSP_HARDWARE); - HPI_DEBUG_LOG(WARNING, " %d,%d dsp crashed.\n", - phm->object, phm->function); - return; - } - } - - /* Init default response */ - if (phm->function != HPI_SUBSYS_CREATE_ADAPTER) - hpi_init_response(phr, phm->object, phm->function, - HPI_ERROR_PROCESSING_MESSAGE); - - HPI_DEBUG_LOG(VERBOSE, "start of switch\n"); - switch (phm->type) { - case HPI_TYPE_MESSAGE: - switch (phm->object) { - case HPI_OBJ_SUBSYSTEM: - subsys_message(phm, phr); - break; - - case HPI_OBJ_ADAPTER: - phr->size = - sizeof(struct hpi_response_header) + - sizeof(struct hpi_adapter_res); - adapter_message(pao, phm, phr); - break; - - case HPI_OBJ_CONTROLEX: - case HPI_OBJ_CONTROL: - control_message(pao, phm, phr); - break; - - case HPI_OBJ_OSTREAM: - outstream_message(pao, phm, phr); - break; - - case HPI_OBJ_ISTREAM: - instream_message(pao, phm, phr); - break; - - default: - hw_message(pao, phm, phr); - break; - } - break; - - default: - phr->error = HPI_ERROR_INVALID_TYPE; - break; - } -} - -/*****************************************************************************/ -/* SUBSYSTEM */ - -/** Create an adapter object and initialise it based on resource information - * passed in in the message - * *** NOTE - you cannot use this function AND the FindAdapters function at the - * same time, the application must use only one of them to get the adapters *** - */ -static void subsys_create_adapter(struct hpi_message *phm, - struct hpi_response *phr) -{ - /* create temp adapter obj, because we don't know what index yet */ - struct hpi_adapter_obj ao; - u32 os_error_code; - u16 err; - - HPI_DEBUG_LOG(DEBUG, " subsys_create_adapter\n"); - - memset(&ao, 0, sizeof(ao)); - - /* this HPI only creates adapters for TI/PCI devices */ - if (phm->u.s.resource.bus_type != HPI_BUS_PCI) - return; - if (phm->u.s.resource.r.pci->vendor_id != HPI_PCI_VENDOR_ID_TI) - return; - if (phm->u.s.resource.r.pci->device_id != HPI_PCI_DEV_ID_DSP6205) - return; - - ao.priv = kmalloc(sizeof(struct hpi_hw_obj), GFP_KERNEL); - if (!ao.priv) { - HPI_DEBUG_LOG(ERROR, "cant get mem for adapter object\n"); - phr->error = HPI_ERROR_MEMORY_ALLOC; - return; - } - memset(ao.priv, 0, sizeof(struct hpi_hw_obj)); - - ao.pci = *phm->u.s.resource.r.pci; - err = create_adapter_obj(&ao, &os_error_code); - if (!err) - err = hpi_add_adapter(&ao); - if (err) { - phr->u.s.data = os_error_code; - delete_adapter_obj(&ao); - phr->error = err; - return; - } - - phr->u.s.aw_adapter_list[ao.index] = ao.adapter_type; - phr->u.s.adapter_index = ao.index; - phr->u.s.num_adapters++; - phr->error = 0; -} - -/** delete an adapter - required by WDM driver */ -static void subsys_delete_adapter(struct hpi_message *phm, - struct hpi_response *phr) -{ - struct hpi_adapter_obj *pao; - struct hpi_hw_obj *phw; - - pao = hpi_find_adapter(phm->adapter_index); - if (!pao) { - phr->error = HPI_ERROR_INVALID_OBJ_INDEX; - return; - } - phw = (struct hpi_hw_obj *)pao->priv; - /* reset adapter h/w */ - /* Reset C6713 #1 */ - boot_loader_write_mem32(pao, 0, C6205_BAR0_TIMER1_CTL, 0); - /* reset C6205 */ - iowrite32(C6205_HDCR_WARMRESET, phw->prHDCR); - - delete_adapter_obj(pao); - phr->error = 0; -} - -/** Create adapter object - allocate buffers, bootload DSPs, initialise control cache -*/ -static u16 create_adapter_obj(struct hpi_adapter_obj *pao, - u32 *pos_error_code) -{ - struct hpi_hw_obj *phw = pao->priv; - struct bus_master_interface *interface; - u32 phys_addr; -#ifndef HPI6205_NO_HSR_POLL - u32 time_out = HPI6205_TIMEOUT; - u32 temp1; -#endif - int i; - u16 err; - - /* init error reporting */ - pao->dsp_crashed = 0; - - for (i = 0; i < HPI_MAX_STREAMS; i++) - phw->flag_outstream_just_reset[i] = 1; - - /* The C6205 memory area 1 is 8Mbyte window into DSP registers */ - phw->prHSR = - pao->pci.ap_mem_base[1] + - C6205_BAR1_HSR / sizeof(*pao->pci.ap_mem_base[1]); - phw->prHDCR = - pao->pci.ap_mem_base[1] + - C6205_BAR1_HDCR / sizeof(*pao->pci.ap_mem_base[1]); - phw->prDSPP = - pao->pci.ap_mem_base[1] + - C6205_BAR1_DSPP / sizeof(*pao->pci.ap_mem_base[1]); - - pao->has_control_cache = 0; - - if (hpios_locked_mem_alloc(&phw->h_locked_mem, - sizeof(struct bus_master_interface), - pao->pci.p_os_data)) - phw->p_interface_buffer = NULL; - else if (hpios_locked_mem_get_virt_addr(&phw->h_locked_mem, - (void *)&phw->p_interface_buffer)) - phw->p_interface_buffer = NULL; - - HPI_DEBUG_LOG(DEBUG, "interface buffer address %p\n", - phw->p_interface_buffer); - - if (phw->p_interface_buffer) { - memset((void *)phw->p_interface_buffer, 0, - sizeof(struct bus_master_interface)); - phw->p_interface_buffer->dsp_ack = H620_HIF_UNKNOWN; - } - - err = adapter_boot_load_dsp(pao, pos_error_code); - if (err) - /* no need to clean up as SubSysCreateAdapter */ - /* calls DeleteAdapter on error. */ - return err; - - HPI_DEBUG_LOG(INFO, "load DSP code OK\n"); - - /* allow boot load even if mem alloc wont work */ - if (!phw->p_interface_buffer) - return hpi6205_error(0, HPI_ERROR_MEMORY_ALLOC); - - interface = phw->p_interface_buffer; - -#ifndef HPI6205_NO_HSR_POLL - /* wait for first interrupt indicating the DSP init is done */ - time_out = HPI6205_TIMEOUT * 10; - temp1 = 0; - while (((temp1 & C6205_HSR_INTSRC) == 0) && --time_out) - temp1 = ioread32(phw->prHSR); - - if (temp1 & C6205_HSR_INTSRC) - HPI_DEBUG_LOG(INFO, - "interrupt confirming DSP code running OK\n"); - else { - HPI_DEBUG_LOG(ERROR, - "timed out waiting for interrupt " - "confirming DSP code running\n"); - return hpi6205_error(0, HPI6205_ERROR_6205_NO_IRQ); - } - - /* reset the interrupt */ - iowrite32(C6205_HSR_INTSRC, phw->prHSR); -#endif - - /* make sure the DSP has started ok */ - if (!wait_dsp_ack(phw, H620_HIF_RESET, HPI6205_TIMEOUT * 10)) { - HPI_DEBUG_LOG(ERROR, "timed out waiting reset state \n"); - return hpi6205_error(0, HPI6205_ERROR_6205_INIT_FAILED); - } - /* Note that *pao, *phw are zeroed after allocation, - * so pointers and flags are NULL by default. - * Allocate bus mastering control cache buffer and tell the DSP about it - */ - if (interface->control_cache.number_of_controls) { - void *p_control_cache_virtual; - - err = hpios_locked_mem_alloc(&phw->h_control_cache, - interface->control_cache.size_in_bytes, - pao->pci.p_os_data); - if (!err) - err = hpios_locked_mem_get_virt_addr(&phw-> - h_control_cache, &p_control_cache_virtual); - if (!err) { - memset(p_control_cache_virtual, 0, - interface->control_cache.size_in_bytes); - - phw->p_cache = - hpi_alloc_control_cache(interface-> - control_cache.number_of_controls, - interface->control_cache.size_in_bytes, - (struct hpi_control_cache_info *) - p_control_cache_virtual); - } - if (!err) { - err = hpios_locked_mem_get_phys_addr(&phw-> - h_control_cache, &phys_addr); - interface->control_cache.physical_address32 = - phys_addr; - } - - if (!err) - pao->has_control_cache = 1; - else { - if (hpios_locked_mem_valid(&phw->h_control_cache)) - hpios_locked_mem_free(&phw->h_control_cache); - pao->has_control_cache = 0; - } - } - /* allocate bus mastering async buffer and tell the DSP about it */ - if (interface->async_buffer.b.size) { - err = hpios_locked_mem_alloc(&phw->h_async_event_buffer, - interface->async_buffer.b.size * - sizeof(struct hpi_async_event), pao->pci.p_os_data); - if (!err) - err = hpios_locked_mem_get_virt_addr - (&phw->h_async_event_buffer, (void *) - &phw->p_async_event_buffer); - if (!err) - memset((void *)phw->p_async_event_buffer, 0, - interface->async_buffer.b.size * - sizeof(struct hpi_async_event)); - if (!err) { - err = hpios_locked_mem_get_phys_addr - (&phw->h_async_event_buffer, &phys_addr); - interface->async_buffer.physical_address32 = - phys_addr; - } - if (err) { - if (hpios_locked_mem_valid(&phw-> - h_async_event_buffer)) { - hpios_locked_mem_free - (&phw->h_async_event_buffer); - phw->p_async_event_buffer = NULL; - } - } - } - send_dsp_command(phw, H620_HIF_IDLE); - - { - struct hpi_message hM; - struct hpi_response hR; - u32 max_streams; - - HPI_DEBUG_LOG(VERBOSE, "init ADAPTER_GET_INFO\n"); - memset(&hM, 0, sizeof(hM)); - hM.type = HPI_TYPE_MESSAGE; - hM.size = sizeof(hM); - hM.object = HPI_OBJ_ADAPTER; - hM.function = HPI_ADAPTER_GET_INFO; - hM.adapter_index = 0; - memset(&hR, 0, sizeof(hR)); - hR.size = sizeof(hR); - - err = message_response_sequence(pao, &hM, &hR); - if (err) { - HPI_DEBUG_LOG(ERROR, "message transport error %d\n", - err); - return err; - } - if (hR.error) - return hR.error; - - pao->adapter_type = hR.u.a.adapter_type; - pao->index = hR.u.a.adapter_index; - - max_streams = hR.u.a.num_outstreams + hR.u.a.num_instreams; - - hpios_locked_mem_prepare((max_streams * 6) / 10, max_streams, - 65536, pao->pci.p_os_data); - - HPI_DEBUG_LOG(VERBOSE, - "got adapter info type %x index %d serial %d\n", - hR.u.a.adapter_type, hR.u.a.adapter_index, - hR.u.a.serial_number); - } - - pao->open = 0; /* upon creation the adapter is closed */ - - HPI_DEBUG_LOG(INFO, "bootload DSP OK\n"); - return 0; -} - -/** Free memory areas allocated by adapter - * this routine is called from SubSysDeleteAdapter, - * and SubSysCreateAdapter if duplicate index -*/ -static void delete_adapter_obj(struct hpi_adapter_obj *pao) -{ - struct hpi_hw_obj *phw; - int i; - - phw = pao->priv; - - if (hpios_locked_mem_valid(&phw->h_async_event_buffer)) { - hpios_locked_mem_free(&phw->h_async_event_buffer); - phw->p_async_event_buffer = NULL; - } - - if (hpios_locked_mem_valid(&phw->h_control_cache)) { - hpios_locked_mem_free(&phw->h_control_cache); - hpi_free_control_cache(phw->p_cache); - } - - if (hpios_locked_mem_valid(&phw->h_locked_mem)) { - hpios_locked_mem_free(&phw->h_locked_mem); - phw->p_interface_buffer = NULL; - } - - for (i = 0; i < HPI_MAX_STREAMS; i++) - if (hpios_locked_mem_valid(&phw->instream_host_buffers[i])) { - hpios_locked_mem_free(&phw->instream_host_buffers[i]); - /*?phw->InStreamHostBuffers[i] = NULL; */ - phw->instream_host_buffer_size[i] = 0; - } - - for (i = 0; i < HPI_MAX_STREAMS; i++) - if (hpios_locked_mem_valid(&phw->outstream_host_buffers[i])) { - hpios_locked_mem_free(&phw->outstream_host_buffers - [i]); - phw->outstream_host_buffer_size[i] = 0; - } - - hpios_locked_mem_unprepare(pao->pci.p_os_data); - - hpi_delete_adapter(pao); - kfree(phw); -} - -/*****************************************************************************/ -/* OutStream Host buffer functions */ - -/** Allocate or attach buffer for busmastering -*/ -static void outstream_host_buffer_allocate(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - u16 err = 0; - u32 command = phm->u.d.u.buffer.command; - struct hpi_hw_obj *phw = pao->priv; - struct bus_master_interface *interface = phw->p_interface_buffer; - - hpi_init_response(phr, phm->object, phm->function, 0); - - if (command == HPI_BUFFER_CMD_EXTERNAL - || command == HPI_BUFFER_CMD_INTERNAL_ALLOC) { - /* ALLOC phase, allocate a buffer with power of 2 size, - get its bus address for PCI bus mastering - */ - phm->u.d.u.buffer.buffer_size = - roundup_pow_of_two(phm->u.d.u.buffer.buffer_size); - /* return old size and allocated size, - so caller can detect change */ - phr->u.d.u.stream_info.data_available = - phw->outstream_host_buffer_size[phm->obj_index]; - phr->u.d.u.stream_info.buffer_size = - phm->u.d.u.buffer.buffer_size; - - if (phw->outstream_host_buffer_size[phm->obj_index] == - phm->u.d.u.buffer.buffer_size) { - /* Same size, no action required */ - return; - } - - if (hpios_locked_mem_valid(&phw->outstream_host_buffers[phm-> - obj_index])) - hpios_locked_mem_free(&phw->outstream_host_buffers - [phm->obj_index]); - - err = hpios_locked_mem_alloc(&phw->outstream_host_buffers - [phm->obj_index], phm->u.d.u.buffer.buffer_size, - pao->pci.p_os_data); - - if (err) { - phr->error = HPI_ERROR_INVALID_DATASIZE; - phw->outstream_host_buffer_size[phm->obj_index] = 0; - return; - } - - err = hpios_locked_mem_get_phys_addr - (&phw->outstream_host_buffers[phm->obj_index], - &phm->u.d.u.buffer.pci_address); - /* get the phys addr into msg for single call alloc caller - * needs to do this for split alloc (or use the same message) - * return the phy address for split alloc in the respose too - */ - phr->u.d.u.stream_info.auxiliary_data_available = - phm->u.d.u.buffer.pci_address; - - if (err) { - hpios_locked_mem_free(&phw->outstream_host_buffers - [phm->obj_index]); - phw->outstream_host_buffer_size[phm->obj_index] = 0; - phr->error = HPI_ERROR_MEMORY_ALLOC; - return; - } - } - - if (command == HPI_BUFFER_CMD_EXTERNAL - || command == HPI_BUFFER_CMD_INTERNAL_GRANTADAPTER) { - /* GRANT phase. Set up the BBM status, tell the DSP about - the buffer so it can start using BBM. - */ - struct hpi_hostbuffer_status *status; - - if (phm->u.d.u.buffer.buffer_size & (phm->u.d.u.buffer. - buffer_size - 1)) { - HPI_DEBUG_LOG(ERROR, - "buffer size must be 2^N not %d\n", - phm->u.d.u.buffer.buffer_size); - phr->error = HPI_ERROR_INVALID_DATASIZE; - return; - } - phw->outstream_host_buffer_size[phm->obj_index] = - phm->u.d.u.buffer.buffer_size; - status = &interface->outstream_host_buffer_status[phm-> - obj_index]; - status->samples_processed = 0; - status->stream_state = HPI_STATE_STOPPED; - status->dSP_index = 0; - status->host_index = status->dSP_index; - status->size_in_bytes = phm->u.d.u.buffer.buffer_size; - - hw_message(pao, phm, phr); - - if (phr->error - && hpios_locked_mem_valid(&phw-> - outstream_host_buffers[phm->obj_index])) { - hpios_locked_mem_free(&phw->outstream_host_buffers - [phm->obj_index]); - phw->outstream_host_buffer_size[phm->obj_index] = 0; - } - } -} - -static void outstream_host_buffer_get_info(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - struct hpi_hw_obj *phw = pao->priv; - struct bus_master_interface *interface = phw->p_interface_buffer; - struct hpi_hostbuffer_status *status; - u8 *p_bbm_data; - - if (hpios_locked_mem_valid(&phw->outstream_host_buffers[phm-> - obj_index])) { - if (hpios_locked_mem_get_virt_addr(&phw-> - outstream_host_buffers[phm->obj_index], - (void *)&p_bbm_data)) { - phr->error = HPI_ERROR_INVALID_OPERATION; - return; - } - status = &interface->outstream_host_buffer_status[phm-> - obj_index]; - hpi_init_response(phr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_HOSTBUFFER_GET_INFO, 0); - phr->u.d.u.hostbuffer_info.p_buffer = p_bbm_data; - phr->u.d.u.hostbuffer_info.p_status = status; - } else { - hpi_init_response(phr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_HOSTBUFFER_GET_INFO, - HPI_ERROR_INVALID_OPERATION); - } -} - -static void outstream_host_buffer_free(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - struct hpi_hw_obj *phw = pao->priv; - u32 command = phm->u.d.u.buffer.command; - - if (phw->outstream_host_buffer_size[phm->obj_index]) { - if (command == HPI_BUFFER_CMD_EXTERNAL - || command == HPI_BUFFER_CMD_INTERNAL_REVOKEADAPTER) { - phw->outstream_host_buffer_size[phm->obj_index] = 0; - hw_message(pao, phm, phr); - /* Tell adapter to stop using the host buffer. */ - } - if (command == HPI_BUFFER_CMD_EXTERNAL - || command == HPI_BUFFER_CMD_INTERNAL_FREE) - hpios_locked_mem_free(&phw->outstream_host_buffers - [phm->obj_index]); - } - /* Should HPI_ERROR_INVALID_OPERATION be returned - if no host buffer is allocated? */ - else - hpi_init_response(phr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_HOSTBUFFER_FREE, 0); - -} - -static long outstream_get_space_available(struct hpi_hostbuffer_status - *status) -{ - return status->size_in_bytes - ((long)(status->host_index) - - (long)(status->dSP_index)); -} - -static void outstream_write(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - struct hpi_hw_obj *phw = pao->priv; - struct bus_master_interface *interface = phw->p_interface_buffer; - struct hpi_hostbuffer_status *status; - long space_available; - - if (!phw->outstream_host_buffer_size[phm->obj_index]) { - /* there is no BBM buffer, write via message */ - hw_message(pao, phm, phr); - return; - } - - hpi_init_response(phr, phm->object, phm->function, 0); - status = &interface->outstream_host_buffer_status[phm->obj_index]; - - if (phw->flag_outstream_just_reset[phm->obj_index]) { - /* Format can only change after reset. Must tell DSP. */ - u16 function = phm->function; - phw->flag_outstream_just_reset[phm->obj_index] = 0; - phm->function = HPI_OSTREAM_SET_FORMAT; - hw_message(pao, phm, phr); /* send the format to the DSP */ - phm->function = function; - if (phr->error) - return; - } -#if 1 - if (phw->flag_outstream_just_reset[phm->obj_index]) { - /* First OutStremWrite() call following reset will write data to the - adapter's buffers, reducing delay before stream can start - */ - int partial_write = 0; - unsigned int original_size = 0; - - /* Send the first buffer to the DSP the old way. */ - /* Limit size of first transfer - */ - /* expect that this will not usually be triggered. */ - if (phm->u.d.u.data.data_size > HPI6205_SIZEOF_DATA) { - partial_write = 1; - original_size = phm->u.d.u.data.data_size; - phm->u.d.u.data.data_size = HPI6205_SIZEOF_DATA; - } - /* write it */ - phm->function = HPI_OSTREAM_WRITE; - hw_message(pao, phm, phr); - /* update status information that the DSP would typically - * update (and will update next time the DSP - * buffer update task reads data from the host BBM buffer) - */ - status->auxiliary_data_available = phm->u.d.u.data.data_size; - status->host_index += phm->u.d.u.data.data_size; - status->dSP_index += phm->u.d.u.data.data_size; - - /* if we did a full write, we can return from here. */ - if (!partial_write) - return; - - /* tweak buffer parameters and let the rest of the */ - /* buffer land in internal BBM buffer */ - phm->u.d.u.data.data_size = - original_size - HPI6205_SIZEOF_DATA; - phm->u.d.u.data.pb_data += HPI6205_SIZEOF_DATA; - } -#endif - - space_available = outstream_get_space_available(status); - if (space_available < (long)phm->u.d.u.data.data_size) { - phr->error = HPI_ERROR_INVALID_DATASIZE; - return; - } - - /* HostBuffers is used to indicate host buffer is internally allocated. - otherwise, assumed external, data written externally */ - if (phm->u.d.u.data.pb_data - && hpios_locked_mem_valid(&phw->outstream_host_buffers[phm-> - obj_index])) { - u8 *p_bbm_data; - long l_first_write; - u8 *p_app_data = (u8 *)phm->u.d.u.data.pb_data; - - if (hpios_locked_mem_get_virt_addr(&phw-> - outstream_host_buffers[phm->obj_index], - (void *)&p_bbm_data)) { - phr->error = HPI_ERROR_INVALID_OPERATION; - return; - } - - /* either all data, - or enough to fit from current to end of BBM buffer */ - l_first_write = - min(phm->u.d.u.data.data_size, - status->size_in_bytes - - (status->host_index & (status->size_in_bytes - 1))); - - memcpy(p_bbm_data + - (status->host_index & (status->size_in_bytes - 1)), - p_app_data, l_first_write); - /* remaining data if any */ - memcpy(p_bbm_data, p_app_data + l_first_write, - phm->u.d.u.data.data_size - l_first_write); - } - status->host_index += phm->u.d.u.data.data_size; -} - -static void outstream_get_info(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - struct hpi_hw_obj *phw = pao->priv; - struct bus_master_interface *interface = phw->p_interface_buffer; - struct hpi_hostbuffer_status *status; - - if (!phw->outstream_host_buffer_size[phm->obj_index]) { - hw_message(pao, phm, phr); - return; - } - - hpi_init_response(phr, phm->object, phm->function, 0); - - status = &interface->outstream_host_buffer_status[phm->obj_index]; - - phr->u.d.u.stream_info.state = (u16)status->stream_state; - phr->u.d.u.stream_info.samples_transferred = - status->samples_processed; - phr->u.d.u.stream_info.buffer_size = status->size_in_bytes; - phr->u.d.u.stream_info.data_available = - status->size_in_bytes - outstream_get_space_available(status); - phr->u.d.u.stream_info.auxiliary_data_available = - status->auxiliary_data_available; -} - -static void outstream_start(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - hw_message(pao, phm, phr); -} - -static void outstream_reset(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - struct hpi_hw_obj *phw = pao->priv; - phw->flag_outstream_just_reset[phm->obj_index] = 1; - hw_message(pao, phm, phr); -} - -static void outstream_open(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - outstream_reset(pao, phm, phr); -} - -/*****************************************************************************/ -/* InStream Host buffer functions */ - -static void instream_host_buffer_allocate(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - u16 err = 0; - u32 command = phm->u.d.u.buffer.command; - struct hpi_hw_obj *phw = pao->priv; - struct bus_master_interface *interface = phw->p_interface_buffer; - - hpi_init_response(phr, phm->object, phm->function, 0); - - if (command == HPI_BUFFER_CMD_EXTERNAL - || command == HPI_BUFFER_CMD_INTERNAL_ALLOC) { - - phm->u.d.u.buffer.buffer_size = - roundup_pow_of_two(phm->u.d.u.buffer.buffer_size); - phr->u.d.u.stream_info.data_available = - phw->instream_host_buffer_size[phm->obj_index]; - phr->u.d.u.stream_info.buffer_size = - phm->u.d.u.buffer.buffer_size; - - if (phw->instream_host_buffer_size[phm->obj_index] == - phm->u.d.u.buffer.buffer_size) { - /* Same size, no action required */ - return; - } - - if (hpios_locked_mem_valid(&phw->instream_host_buffers[phm-> - obj_index])) - hpios_locked_mem_free(&phw->instream_host_buffers - [phm->obj_index]); - - err = hpios_locked_mem_alloc(&phw->instream_host_buffers[phm-> - obj_index], phm->u.d.u.buffer.buffer_size, - pao->pci.p_os_data); - - if (err) { - phr->error = HPI_ERROR_INVALID_DATASIZE; - phw->instream_host_buffer_size[phm->obj_index] = 0; - return; - } - - err = hpios_locked_mem_get_phys_addr - (&phw->instream_host_buffers[phm->obj_index], - &phm->u.d.u.buffer.pci_address); - /* get the phys addr into msg for single call alloc. Caller - needs to do this for split alloc so return the phy address */ - phr->u.d.u.stream_info.auxiliary_data_available = - phm->u.d.u.buffer.pci_address; - if (err) { - hpios_locked_mem_free(&phw->instream_host_buffers - [phm->obj_index]); - phw->instream_host_buffer_size[phm->obj_index] = 0; - phr->error = HPI_ERROR_MEMORY_ALLOC; - return; - } - } - - if (command == HPI_BUFFER_CMD_EXTERNAL - || command == HPI_BUFFER_CMD_INTERNAL_GRANTADAPTER) { - struct hpi_hostbuffer_status *status; - - if (phm->u.d.u.buffer.buffer_size & (phm->u.d.u.buffer. - buffer_size - 1)) { - HPI_DEBUG_LOG(ERROR, - "buffer size must be 2^N not %d\n", - phm->u.d.u.buffer.buffer_size); - phr->error = HPI_ERROR_INVALID_DATASIZE; - return; - } - - phw->instream_host_buffer_size[phm->obj_index] = - phm->u.d.u.buffer.buffer_size; - status = &interface->instream_host_buffer_status[phm-> - obj_index]; - status->samples_processed = 0; - status->stream_state = HPI_STATE_STOPPED; - status->dSP_index = 0; - status->host_index = status->dSP_index; - status->size_in_bytes = phm->u.d.u.buffer.buffer_size; - - hw_message(pao, phm, phr); - if (phr->error - && hpios_locked_mem_valid(&phw-> - instream_host_buffers[phm->obj_index])) { - hpios_locked_mem_free(&phw->instream_host_buffers - [phm->obj_index]); - phw->instream_host_buffer_size[phm->obj_index] = 0; - } - } -} - -static void instream_host_buffer_get_info(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - struct hpi_hw_obj *phw = pao->priv; - struct bus_master_interface *interface = phw->p_interface_buffer; - struct hpi_hostbuffer_status *status; - u8 *p_bbm_data; - - if (hpios_locked_mem_valid(&phw->instream_host_buffers[phm-> - obj_index])) { - if (hpios_locked_mem_get_virt_addr(&phw-> - instream_host_buffers[phm->obj_index], - (void *)&p_bbm_data)) { - phr->error = HPI_ERROR_INVALID_OPERATION; - return; - } - status = &interface->instream_host_buffer_status[phm-> - obj_index]; - hpi_init_response(phr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_HOSTBUFFER_GET_INFO, 0); - phr->u.d.u.hostbuffer_info.p_buffer = p_bbm_data; - phr->u.d.u.hostbuffer_info.p_status = status; - } else { - hpi_init_response(phr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_HOSTBUFFER_GET_INFO, - HPI_ERROR_INVALID_OPERATION); - } -} - -static void instream_host_buffer_free(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - struct hpi_hw_obj *phw = pao->priv; - u32 command = phm->u.d.u.buffer.command; - - if (phw->instream_host_buffer_size[phm->obj_index]) { - if (command == HPI_BUFFER_CMD_EXTERNAL - || command == HPI_BUFFER_CMD_INTERNAL_REVOKEADAPTER) { - phw->instream_host_buffer_size[phm->obj_index] = 0; - hw_message(pao, phm, phr); - } - - if (command == HPI_BUFFER_CMD_EXTERNAL - || command == HPI_BUFFER_CMD_INTERNAL_FREE) - hpios_locked_mem_free(&phw->instream_host_buffers - [phm->obj_index]); - - } else { - /* Should HPI_ERROR_INVALID_OPERATION be returned - if no host buffer is allocated? */ - hpi_init_response(phr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_HOSTBUFFER_FREE, 0); - - } - -} - -static void instream_start(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - hw_message(pao, phm, phr); -} - -static long instream_get_bytes_available(struct hpi_hostbuffer_status *status) -{ - return (long)(status->dSP_index) - (long)(status->host_index); -} - -static void instream_read(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - struct hpi_hw_obj *phw = pao->priv; - struct bus_master_interface *interface = phw->p_interface_buffer; - struct hpi_hostbuffer_status *status; - long data_available; - u8 *p_bbm_data; - long l_first_read; - u8 *p_app_data = (u8 *)phm->u.d.u.data.pb_data; - - if (!phw->instream_host_buffer_size[phm->obj_index]) { - hw_message(pao, phm, phr); - return; - } - hpi_init_response(phr, phm->object, phm->function, 0); - - status = &interface->instream_host_buffer_status[phm->obj_index]; - data_available = instream_get_bytes_available(status); - if (data_available < (long)phm->u.d.u.data.data_size) { - phr->error = HPI_ERROR_INVALID_DATASIZE; - return; - } - - if (hpios_locked_mem_valid(&phw->instream_host_buffers[phm-> - obj_index])) { - if (hpios_locked_mem_get_virt_addr(&phw-> - instream_host_buffers[phm->obj_index], - (void *)&p_bbm_data)) { - phr->error = HPI_ERROR_INVALID_OPERATION; - return; - } - - /* either all data, - or enough to fit from current to end of BBM buffer */ - l_first_read = - min(phm->u.d.u.data.data_size, - status->size_in_bytes - - (status->host_index & (status->size_in_bytes - 1))); - - memcpy(p_app_data, - p_bbm_data + - (status->host_index & (status->size_in_bytes - 1)), - l_first_read); - /* remaining data if any */ - memcpy(p_app_data + l_first_read, p_bbm_data, - phm->u.d.u.data.data_size - l_first_read); - } - status->host_index += phm->u.d.u.data.data_size; -} - -static void instream_get_info(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ - struct hpi_hw_obj *phw = pao->priv; - struct bus_master_interface *interface = phw->p_interface_buffer; - struct hpi_hostbuffer_status *status; - if (!phw->instream_host_buffer_size[phm->obj_index]) { - hw_message(pao, phm, phr); - return; - } - - status = &interface->instream_host_buffer_status[phm->obj_index]; - - hpi_init_response(phr, phm->object, phm->function, 0); - - phr->u.d.u.stream_info.state = (u16)status->stream_state; - phr->u.d.u.stream_info.samples_transferred = - status->samples_processed; - phr->u.d.u.stream_info.buffer_size = status->size_in_bytes; - phr->u.d.u.stream_info.data_available = - instream_get_bytes_available(status); - phr->u.d.u.stream_info.auxiliary_data_available = - status->auxiliary_data_available; -} - -/*****************************************************************************/ -/* LOW-LEVEL */ -#define HPI6205_MAX_FILES_TO_LOAD 2 - -static u16 adapter_boot_load_dsp(struct hpi_adapter_obj *pao, - u32 *pos_error_code) -{ - struct hpi_hw_obj *phw = pao->priv; - struct dsp_code dsp_code; - u16 boot_code_id[HPI6205_MAX_FILES_TO_LOAD]; - u16 firmware_id = pao->pci.subsys_device_id; - u32 temp; - int dsp = 0, i = 0; - u16 err = 0; - - boot_code_id[0] = HPI_ADAPTER_ASI(0x6205); - - /* special cases where firmware_id != subsys ID */ - switch (firmware_id) { - case HPI_ADAPTER_FAMILY_ASI(0x5000): - boot_code_id[0] = firmware_id; - firmware_id = 0; - break; - case HPI_ADAPTER_FAMILY_ASI(0x5300): - case HPI_ADAPTER_FAMILY_ASI(0x5400): - case HPI_ADAPTER_FAMILY_ASI(0x6300): - firmware_id = HPI_ADAPTER_FAMILY_ASI(0x6400); - break; - case HPI_ADAPTER_FAMILY_ASI(0x5600): - case HPI_ADAPTER_FAMILY_ASI(0x6500): - firmware_id = HPI_ADAPTER_FAMILY_ASI(0x6600); - break; - } - boot_code_id[1] = firmware_id; - - /* reset DSP by writing a 1 to the WARMRESET bit */ - temp = C6205_HDCR_WARMRESET; - iowrite32(temp, phw->prHDCR); - hpios_delay_micro_seconds(1000); - - /* check that PCI i/f was configured by EEPROM */ - temp = ioread32(phw->prHSR); - if ((temp & (C6205_HSR_CFGERR | C6205_HSR_EEREAD)) != - C6205_HSR_EEREAD) - return hpi6205_error(0, HPI6205_ERROR_6205_EEPROM); - temp |= 0x04; - /* disable PINTA interrupt */ - iowrite32(temp, phw->prHSR); - - /* check control register reports PCI boot mode */ - temp = ioread32(phw->prHDCR); - if (!(temp & C6205_HDCR_PCIBOOT)) - return hpi6205_error(0, HPI6205_ERROR_6205_REG); - - /* try writing a couple of numbers to the DSP page register */ - /* and reading them back. */ - temp = 1; - iowrite32(temp, phw->prDSPP); - if ((temp | C6205_DSPP_MAP1) != ioread32(phw->prDSPP)) - return hpi6205_error(0, HPI6205_ERROR_6205_DSPPAGE); - temp = 2; - iowrite32(temp, phw->prDSPP); - if ((temp | C6205_DSPP_MAP1) != ioread32(phw->prDSPP)) - return hpi6205_error(0, HPI6205_ERROR_6205_DSPPAGE); - temp = 3; - iowrite32(temp, phw->prDSPP); - if ((temp | C6205_DSPP_MAP1) != ioread32(phw->prDSPP)) - return hpi6205_error(0, HPI6205_ERROR_6205_DSPPAGE); - /* reset DSP page to the correct number */ - temp = 0; - iowrite32(temp, phw->prDSPP); - if ((temp | C6205_DSPP_MAP1) != ioread32(phw->prDSPP)) - return hpi6205_error(0, HPI6205_ERROR_6205_DSPPAGE); - phw->dsp_page = 0; - - /* release 6713 from reset before 6205 is bootloaded. - This ensures that the EMIF is inactive, - and the 6713 HPI gets the correct bootmode etc - */ - if (boot_code_id[1] != 0) { - /* DSP 1 is a C6713 */ - /* CLKX0 <- '1' release the C6205 bootmode pulldowns */ - boot_loader_write_mem32(pao, 0, (0x018C0024L), 0x00002202); - hpios_delay_micro_seconds(100); - /* Reset the 6713 #1 - revB */ - boot_loader_write_mem32(pao, 0, C6205_BAR0_TIMER1_CTL, 0); - - /* dummy read every 4 words for 6205 advisory 1.4.4 */ - boot_loader_read_mem32(pao, 0, 0); - - hpios_delay_micro_seconds(100); - /* Release C6713 from reset - revB */ - boot_loader_write_mem32(pao, 0, C6205_BAR0_TIMER1_CTL, 4); - hpios_delay_micro_seconds(100); - } - - for (dsp = 0; dsp < HPI6205_MAX_FILES_TO_LOAD; dsp++) { - /* is there a DSP to load? */ - if (boot_code_id[dsp] == 0) - continue; - - err = boot_loader_config_emif(pao, dsp); - if (err) - return err; - - err = boot_loader_test_internal_memory(pao, dsp); - if (err) - return err; - - err = boot_loader_test_external_memory(pao, dsp); - if (err) - return err; - - err = boot_loader_test_pld(pao, dsp); - if (err) - return err; - - /* write the DSP code down into the DSPs memory */ - dsp_code.ps_dev = pao->pci.p_os_data; - err = hpi_dsp_code_open(boot_code_id[dsp], &dsp_code, - pos_error_code); - if (err) - return err; - - while (1) { - u32 length; - u32 address; - u32 type; - u32 *pcode; - - err = hpi_dsp_code_read_word(&dsp_code, &length); - if (err) - break; - if (length == 0xFFFFFFFF) - break; /* end of code */ - - err = hpi_dsp_code_read_word(&dsp_code, &address); - if (err) - break; - err = hpi_dsp_code_read_word(&dsp_code, &type); - if (err) - break; - err = hpi_dsp_code_read_block(length, &dsp_code, - &pcode); - if (err) - break; - for (i = 0; i < (int)length; i++) { - err = boot_loader_write_mem32(pao, dsp, - address, *pcode); - if (err) - break; - /* dummy read every 4 words */ - /* for 6205 advisory 1.4.4 */ - if (i % 4 == 0) - boot_loader_read_mem32(pao, dsp, - address); - pcode++; - address += 4; - } - - } - if (err) { - hpi_dsp_code_close(&dsp_code); - return err; - } - - /* verify code */ - hpi_dsp_code_rewind(&dsp_code); - while (1) { - u32 length = 0; - u32 address = 0; - u32 type = 0; - u32 *pcode = NULL; - u32 data = 0; - - hpi_dsp_code_read_word(&dsp_code, &length); - if (length == 0xFFFFFFFF) - break; /* end of code */ - - hpi_dsp_code_read_word(&dsp_code, &address); - hpi_dsp_code_read_word(&dsp_code, &type); - hpi_dsp_code_read_block(length, &dsp_code, &pcode); - - for (i = 0; i < (int)length; i++) { - data = boot_loader_read_mem32(pao, dsp, - address); - if (data != *pcode) { - err = 0; - break; - } - pcode++; - address += 4; - } - if (err) - break; - } - hpi_dsp_code_close(&dsp_code); - if (err) - return err; - } - - /* After bootloading all DSPs, start DSP0 running - * The DSP0 code will handle starting and synchronizing with its slaves - */ - if (phw->p_interface_buffer) { - /* we need to tell the card the physical PCI address */ - u32 physicalPC_iaddress; - struct bus_master_interface *interface = - phw->p_interface_buffer; - u32 host_mailbox_address_on_dsp; - u32 physicalPC_iaddress_verify = 0; - int time_out = 10; - /* set ack so we know when DSP is ready to go */ - /* (dwDspAck will be changed to HIF_RESET) */ - interface->dsp_ack = H620_HIF_UNKNOWN; - wmb(); /* ensure ack is written before dsp writes back */ - - err = hpios_locked_mem_get_phys_addr(&phw->h_locked_mem, - &physicalPC_iaddress); - - /* locate the host mailbox on the DSP. */ - host_mailbox_address_on_dsp = 0x80000000; - while ((physicalPC_iaddress != physicalPC_iaddress_verify) - && time_out--) { - err = boot_loader_write_mem32(pao, 0, - host_mailbox_address_on_dsp, - physicalPC_iaddress); - physicalPC_iaddress_verify = - boot_loader_read_mem32(pao, 0, - host_mailbox_address_on_dsp); - } - } - HPI_DEBUG_LOG(DEBUG, "starting DS_ps running\n"); - /* enable interrupts */ - temp = ioread32(phw->prHSR); - temp &= ~(u32)C6205_HSR_INTAM; - iowrite32(temp, phw->prHSR); - - /* start code running... */ - temp = ioread32(phw->prHDCR); - temp |= (u32)C6205_HDCR_DSPINT; - iowrite32(temp, phw->prHDCR); - - /* give the DSP 10ms to start up */ - hpios_delay_micro_seconds(10000); - return err; - -} - -/*****************************************************************************/ -/* Bootloader utility functions */ - -static u32 boot_loader_read_mem32(struct hpi_adapter_obj *pao, int dsp_index, - u32 address) -{ - struct hpi_hw_obj *phw = pao->priv; - u32 data = 0; - __iomem u32 *p_data; - - if (dsp_index == 0) { - /* DSP 0 is always C6205 */ - if ((address >= 0x01800000) & (address < 0x02000000)) { - /* BAR1 register access */ - p_data = pao->pci.ap_mem_base[1] + - (address & 0x007fffff) / - sizeof(*pao->pci.ap_mem_base[1]); - /* HPI_DEBUG_LOG(WARNING, - "BAR1 access %08x\n", dwAddress); */ - } else { - u32 dw4M_page = address >> 22L; - if (dw4M_page != phw->dsp_page) { - phw->dsp_page = dw4M_page; - /* *INDENT OFF* */ - iowrite32(phw->dsp_page, phw->prDSPP); - /* *INDENT-ON* */ - } - address &= 0x3fffff; /* address within 4M page */ - /* BAR0 memory access */ - p_data = pao->pci.ap_mem_base[0] + - address / sizeof(u32); - } - data = ioread32(p_data); - } else if (dsp_index == 1) { - /* DSP 1 is a C6713 */ - u32 lsb; - boot_loader_write_mem32(pao, 0, HPIAL_ADDR, address); - boot_loader_write_mem32(pao, 0, HPIAH_ADDR, address >> 16); - lsb = boot_loader_read_mem32(pao, 0, HPIDL_ADDR); - data = boot_loader_read_mem32(pao, 0, HPIDH_ADDR); - data = (data << 16) | (lsb & 0xFFFF); - } - return data; -} - -static u16 boot_loader_write_mem32(struct hpi_adapter_obj *pao, int dsp_index, - u32 address, u32 data) -{ - struct hpi_hw_obj *phw = pao->priv; - u16 err = 0; - __iomem u32 *p_data; - /* u32 dwVerifyData=0; */ - - if (dsp_index == 0) { - /* DSP 0 is always C6205 */ - if ((address >= 0x01800000) & (address < 0x02000000)) { - /* BAR1 - DSP register access using */ - /* Non-prefetchable PCI access */ - p_data = pao->pci.ap_mem_base[1] + - (address & 0x007fffff) / - sizeof(*pao->pci.ap_mem_base[1]); - } else { - /* BAR0 access - all of DSP memory using */ - /* pre-fetchable PCI access */ - u32 dw4M_page = address >> 22L; - if (dw4M_page != phw->dsp_page) { - phw->dsp_page = dw4M_page; - /* *INDENT-OFF* */ - iowrite32(phw->dsp_page, phw->prDSPP); - /* *INDENT-ON* */ - } - address &= 0x3fffff; /* address within 4M page */ - p_data = pao->pci.ap_mem_base[0] + - address / sizeof(u32); - } - iowrite32(data, p_data); - } else if (dsp_index == 1) { - /* DSP 1 is a C6713 */ - boot_loader_write_mem32(pao, 0, HPIAL_ADDR, address); - boot_loader_write_mem32(pao, 0, HPIAH_ADDR, address >> 16); - - /* dummy read every 4 words for 6205 advisory 1.4.4 */ - boot_loader_read_mem32(pao, 0, 0); - - boot_loader_write_mem32(pao, 0, HPIDL_ADDR, data); - boot_loader_write_mem32(pao, 0, HPIDH_ADDR, data >> 16); - - /* dummy read every 4 words for 6205 advisory 1.4.4 */ - boot_loader_read_mem32(pao, 0, 0); - } else - err = hpi6205_error(dsp_index, HPI6205_ERROR_BAD_DSPINDEX); - return err; -} - -static u16 boot_loader_config_emif(struct hpi_adapter_obj *pao, int dsp_index) -{ - u16 err = 0; - - if (dsp_index == 0) { - u32 setting; - - /* DSP 0 is always C6205 */ - - /* Set the EMIF */ - /* memory map of C6205 */ - /* 00000000-0000FFFF 16Kx32 internal program */ - /* 00400000-00BFFFFF CE0 2Mx32 SDRAM running @ 100MHz */ - - /* EMIF config */ - /*------------ */ - /* Global EMIF control */ - boot_loader_write_mem32(pao, dsp_index, 0x01800000, 0x3779); -#define WS_OFS 28 -#define WST_OFS 22 -#define WH_OFS 20 -#define RS_OFS 16 -#define RST_OFS 8 -#define MTYPE_OFS 4 -#define RH_OFS 0 - - /* EMIF CE0 setup - 2Mx32 Sync DRAM on ASI5000 cards only */ - setting = 0x00000030; - boot_loader_write_mem32(pao, dsp_index, 0x01800008, setting); - if (setting != boot_loader_read_mem32(pao, dsp_index, - 0x01800008)) - return hpi6205_error(dsp_index, - HPI6205_ERROR_DSP_EMIF); - - /* EMIF CE1 setup - 32 bit async. This is 6713 #1 HPI, */ - /* which occupies D15..0. 6713 starts at 27MHz, so need */ - /* plenty of wait states. See dsn8701.rtf, and 6713 errata. */ - /* WST should be 71, but 63 is max possible */ - setting = - (1L << WS_OFS) | (63L << WST_OFS) | (1L << WH_OFS) | - (1L << RS_OFS) | (63L << RST_OFS) | (1L << RH_OFS) | - (2L << MTYPE_OFS); - boot_loader_write_mem32(pao, dsp_index, 0x01800004, setting); - if (setting != boot_loader_read_mem32(pao, dsp_index, - 0x01800004)) - return hpi6205_error(dsp_index, - HPI6205_ERROR_DSP_EMIF); - - /* EMIF CE2 setup - 32 bit async. This is 6713 #2 HPI, */ - /* which occupies D15..0. 6713 starts at 27MHz, so need */ - /* plenty of wait states */ - setting = - (1L << WS_OFS) | (28L << WST_OFS) | (1L << WH_OFS) | - (1L << RS_OFS) | (63L << RST_OFS) | (1L << RH_OFS) | - (2L << MTYPE_OFS); - boot_loader_write_mem32(pao, dsp_index, 0x01800010, setting); - if (setting != boot_loader_read_mem32(pao, dsp_index, - 0x01800010)) - return hpi6205_error(dsp_index, - HPI6205_ERROR_DSP_EMIF); - - /* EMIF CE3 setup - 32 bit async. */ - /* This is the PLD on the ASI5000 cards only */ - setting = - (1L << WS_OFS) | (10L << WST_OFS) | (1L << WH_OFS) | - (1L << RS_OFS) | (10L << RST_OFS) | (1L << RH_OFS) | - (2L << MTYPE_OFS); - boot_loader_write_mem32(pao, dsp_index, 0x01800014, setting); - if (setting != boot_loader_read_mem32(pao, dsp_index, - 0x01800014)) - return hpi6205_error(dsp_index, - HPI6205_ERROR_DSP_EMIF); - - /* set EMIF SDRAM control for 2Mx32 SDRAM (512x32x4 bank) */ - /* need to use this else DSP code crashes? */ - boot_loader_write_mem32(pao, dsp_index, 0x01800018, - 0x07117000); - - /* EMIF SDRAM Refresh Timing */ - /* EMIF SDRAM timing (orig = 0x410, emulator = 0x61a) */ - boot_loader_write_mem32(pao, dsp_index, 0x0180001C, - 0x00000410); - - } else if (dsp_index == 1) { - /* test access to the C6713s HPI registers */ - u32 write_data = 0, read_data = 0, i = 0; - - /* Set up HPIC for little endian, by setiing HPIC:HWOB=1 */ - write_data = 1; - boot_loader_write_mem32(pao, 0, HPICL_ADDR, write_data); - boot_loader_write_mem32(pao, 0, HPICH_ADDR, write_data); - /* C67 HPI is on lower 16bits of 32bit EMIF */ - read_data = - 0xFFF7 & boot_loader_read_mem32(pao, 0, HPICL_ADDR); - if (write_data != read_data) { - err = hpi6205_error(dsp_index, - HPI6205_ERROR_C6713_HPIC); - HPI_DEBUG_LOG(ERROR, "HPICL %x %x\n", write_data, - read_data); - - return err; - } - /* HPIA - walking ones test */ - write_data = 1; - for (i = 0; i < 32; i++) { - boot_loader_write_mem32(pao, 0, HPIAL_ADDR, - write_data); - boot_loader_write_mem32(pao, 0, HPIAH_ADDR, - (write_data >> 16)); - read_data = - 0xFFFF & boot_loader_read_mem32(pao, 0, - HPIAL_ADDR); - read_data = - read_data | ((0xFFFF & - boot_loader_read_mem32(pao, 0, - HPIAH_ADDR)) - << 16); - if (read_data != write_data) { - err = hpi6205_error(dsp_index, - HPI6205_ERROR_C6713_HPIA); - HPI_DEBUG_LOG(ERROR, "HPIA %x %x\n", - write_data, read_data); - return err; - } - write_data = write_data << 1; - } - - /* setup C67x PLL - * ** C6713 datasheet says we cannot program PLL from HPI, - * and indeed if we try to set the PLL multiply from the HPI, - * the PLL does not seem to lock, so we enable the PLL and - * use the default multiply of x 7, which for a 27MHz clock - * gives a DSP speed of 189MHz - */ - /* bypass PLL */ - boot_loader_write_mem32(pao, dsp_index, 0x01B7C100, 0x0000); - hpios_delay_micro_seconds(1000); - /* EMIF = 189/3=63MHz */ - boot_loader_write_mem32(pao, dsp_index, 0x01B7C120, 0x8002); - /* peri = 189/2 */ - boot_loader_write_mem32(pao, dsp_index, 0x01B7C11C, 0x8001); - /* cpu = 189/1 */ - boot_loader_write_mem32(pao, dsp_index, 0x01B7C118, 0x8000); - hpios_delay_micro_seconds(1000); - /* ** SGT test to take GPO3 high when we start the PLL */ - /* and low when the delay is completed */ - /* FSX0 <- '1' (GPO3) */ - boot_loader_write_mem32(pao, 0, (0x018C0024L), 0x00002A0A); - /* PLL not bypassed */ - boot_loader_write_mem32(pao, dsp_index, 0x01B7C100, 0x0001); - hpios_delay_micro_seconds(1000); - /* FSX0 <- '0' (GPO3) */ - boot_loader_write_mem32(pao, 0, (0x018C0024L), 0x00002A02); - - /* 6205 EMIF CE1 resetup - 32 bit async. */ - /* Now 6713 #1 is running at 189MHz can reduce waitstates */ - boot_loader_write_mem32(pao, 0, 0x01800004, /* CE1 */ - (1L << WS_OFS) | (8L << WST_OFS) | (1L << WH_OFS) | - (1L << RS_OFS) | (12L << RST_OFS) | (1L << RH_OFS) | - (2L << MTYPE_OFS)); - - hpios_delay_micro_seconds(1000); - - /* check that we can read one of the PLL registers */ - /* PLL should not be bypassed! */ - if ((boot_loader_read_mem32(pao, dsp_index, 0x01B7C100) & 0xF) - != 0x0001) { - err = hpi6205_error(dsp_index, - HPI6205_ERROR_C6713_PLL); - return err; - } - /* setup C67x EMIF (note this is the only use of - BAR1 via BootLoader_WriteMem32) */ - boot_loader_write_mem32(pao, dsp_index, C6713_EMIF_GCTL, - 0x000034A8); - boot_loader_write_mem32(pao, dsp_index, C6713_EMIF_CE0, - 0x00000030); - boot_loader_write_mem32(pao, dsp_index, C6713_EMIF_SDRAMEXT, - 0x001BDF29); - boot_loader_write_mem32(pao, dsp_index, C6713_EMIF_SDRAMCTL, - 0x47117000); - boot_loader_write_mem32(pao, dsp_index, - C6713_EMIF_SDRAMTIMING, 0x00000410); - - hpios_delay_micro_seconds(1000); - } else if (dsp_index == 2) { - /* DSP 2 is a C6713 */ - - } else - err = hpi6205_error(dsp_index, HPI6205_ERROR_BAD_DSPINDEX); - return err; -} - -static u16 boot_loader_test_memory(struct hpi_adapter_obj *pao, int dsp_index, - u32 start_address, u32 length) -{ - u32 i = 0, j = 0; - u32 test_addr = 0; - u32 test_data = 0, data = 0; - - length = 1000; - - /* for 1st word, test each bit in the 32bit word, */ - /* dwLength specifies number of 32bit words to test */ - /*for(i=0; i<dwLength; i++) */ - i = 0; - { - test_addr = start_address + i * 4; - test_data = 0x00000001; - for (j = 0; j < 32; j++) { - boot_loader_write_mem32(pao, dsp_index, test_addr, - test_data); - data = boot_loader_read_mem32(pao, dsp_index, - test_addr); - if (data != test_data) { - HPI_DEBUG_LOG(VERBOSE, - "memtest error details " - "%08x %08x %08x %i\n", test_addr, - test_data, data, dsp_index); - return 1; /* error */ - } - test_data = test_data << 1; - } /* for(j) */ - } /* for(i) */ - - /* for the next 100 locations test each location, leaving it as zero */ - /* write a zero to the next word in memory before we read */ - /* the previous write to make sure every memory location is unique */ - for (i = 0; i < 100; i++) { - test_addr = start_address + i * 4; - test_data = 0xA5A55A5A; - boot_loader_write_mem32(pao, dsp_index, test_addr, test_data); - boot_loader_write_mem32(pao, dsp_index, test_addr + 4, 0); - data = boot_loader_read_mem32(pao, dsp_index, test_addr); - if (data != test_data) { - HPI_DEBUG_LOG(VERBOSE, - "memtest error details " - "%08x %08x %08x %i\n", test_addr, test_data, - data, dsp_index); - return 1; /* error */ - } - /* leave location as zero */ - boot_loader_write_mem32(pao, dsp_index, test_addr, 0x0); - } - - /* zero out entire memory block */ - for (i = 0; i < length; i++) { - test_addr = start_address + i * 4; - boot_loader_write_mem32(pao, dsp_index, test_addr, 0x0); - } - return 0; -} - -static u16 boot_loader_test_internal_memory(struct hpi_adapter_obj *pao, - int dsp_index) -{ - int err = 0; - if (dsp_index == 0) { - /* DSP 0 is a C6205 */ - /* 64K prog mem */ - err = boot_loader_test_memory(pao, dsp_index, 0x00000000, - 0x10000); - if (!err) - /* 64K data mem */ - err = boot_loader_test_memory(pao, dsp_index, - 0x80000000, 0x10000); - } else if ((dsp_index == 1) || (dsp_index == 2)) { - /* DSP 1&2 are a C6713 */ - /* 192K internal mem */ - err = boot_loader_test_memory(pao, dsp_index, 0x00000000, - 0x30000); - if (!err) - /* 64K internal mem / L2 cache */ - err = boot_loader_test_memory(pao, dsp_index, - 0x00030000, 0x10000); - } else - return hpi6205_error(dsp_index, HPI6205_ERROR_BAD_DSPINDEX); - - if (err) - return hpi6205_error(dsp_index, HPI6205_ERROR_DSP_INTMEM); - else - return 0; -} - -static u16 boot_loader_test_external_memory(struct hpi_adapter_obj *pao, - int dsp_index) -{ - u32 dRAM_start_address = 0; - u32 dRAM_size = 0; - - if (dsp_index == 0) { - /* only test for SDRAM if an ASI5000 card */ - if (pao->pci.subsys_device_id == 0x5000) { - /* DSP 0 is always C6205 */ - dRAM_start_address = 0x00400000; - dRAM_size = 0x200000; - /*dwDRAMinc=1024; */ - } else - return 0; - } else if ((dsp_index == 1) || (dsp_index == 2)) { - /* DSP 1 is a C6713 */ - dRAM_start_address = 0x80000000; - dRAM_size = 0x200000; - /*dwDRAMinc=1024; */ - } else - return hpi6205_error(dsp_index, HPI6205_ERROR_BAD_DSPINDEX); - - if (boot_loader_test_memory(pao, dsp_index, dRAM_start_address, - dRAM_size)) - return hpi6205_error(dsp_index, HPI6205_ERROR_DSP_EXTMEM); - return 0; -} - -static u16 boot_loader_test_pld(struct hpi_adapter_obj *pao, int dsp_index) -{ - u32 data = 0; - if (dsp_index == 0) { - /* only test for DSP0 PLD on ASI5000 card */ - if (pao->pci.subsys_device_id == 0x5000) { - /* PLD is located at CE3=0x03000000 */ - data = boot_loader_read_mem32(pao, dsp_index, - 0x03000008); - if ((data & 0xF) != 0x5) - return hpi6205_error(dsp_index, - HPI6205_ERROR_DSP_PLD); - data = boot_loader_read_mem32(pao, dsp_index, - 0x0300000C); - if ((data & 0xF) != 0xA) - return hpi6205_error(dsp_index, - HPI6205_ERROR_DSP_PLD); - } - } else if (dsp_index == 1) { - /* DSP 1 is a C6713 */ - if (pao->pci.subsys_device_id == 0x8700) { - /* PLD is located at CE1=0x90000000 */ - data = boot_loader_read_mem32(pao, dsp_index, - 0x90000010); - if ((data & 0xFF) != 0xAA) - return hpi6205_error(dsp_index, - HPI6205_ERROR_DSP_PLD); - /* 8713 - LED on */ - boot_loader_write_mem32(pao, dsp_index, 0x90000000, - 0x02); - } - } - return 0; -} - -/** Transfer data to or from DSP - nOperation = H620_H620_HIF_SEND_DATA or H620_HIF_GET_DATA -*/ -static short hpi6205_transfer_data(struct hpi_adapter_obj *pao, u8 *p_data, - u32 data_size, int operation) -{ - struct hpi_hw_obj *phw = pao->priv; - u32 data_transferred = 0; - u16 err = 0; -#ifndef HPI6205_NO_HSR_POLL - u32 time_out; -#endif - u32 temp2; - struct bus_master_interface *interface = phw->p_interface_buffer; - - if (!p_data) - return HPI_ERROR_INVALID_DATA_TRANSFER; - - data_size &= ~3L; /* round data_size down to nearest 4 bytes */ - - /* make sure state is IDLE */ - if (!wait_dsp_ack(phw, H620_HIF_IDLE, HPI6205_TIMEOUT)) - return HPI_ERROR_DSP_HARDWARE; - - while (data_transferred < data_size) { - u32 this_copy = data_size - data_transferred; - - if (this_copy > HPI6205_SIZEOF_DATA) - this_copy = HPI6205_SIZEOF_DATA; - - if (operation == H620_HIF_SEND_DATA) - memcpy((void *)&interface->u.b_data[0], - &p_data[data_transferred], this_copy); - - interface->transfer_size_in_bytes = this_copy; - -#ifdef HPI6205_NO_HSR_POLL - /* DSP must change this back to nOperation */ - interface->dsp_ack = H620_HIF_IDLE; -#endif - - send_dsp_command(phw, operation); - -#ifdef HPI6205_NO_HSR_POLL - temp2 = wait_dsp_ack(phw, operation, HPI6205_TIMEOUT); - HPI_DEBUG_LOG(DEBUG, "spun %d times for data xfer of %d\n", - HPI6205_TIMEOUT - temp2, this_copy); - - if (!temp2) { - /* timed out */ - HPI_DEBUG_LOG(ERROR, - "timed out waiting for " "state %d got %d\n", - operation, interface->dsp_ack); - - break; - } -#else - /* spin waiting on the result */ - time_out = HPI6205_TIMEOUT; - temp2 = 0; - while ((temp2 == 0) && time_out--) { - /* give 16k bus mastering transfer time to happen */ - /*(16k / 132Mbytes/s = 122usec) */ - hpios_delay_micro_seconds(20); - temp2 = ioread32(phw->prHSR); - temp2 &= C6205_HSR_INTSRC; - } - HPI_DEBUG_LOG(DEBUG, "spun %d times for data xfer of %d\n", - HPI6205_TIMEOUT - time_out, this_copy); - if (temp2 == C6205_HSR_INTSRC) { - HPI_DEBUG_LOG(VERBOSE, - "interrupt from HIF <data> OK\n"); - /* - if(interface->dwDspAck != nOperation) { - HPI_DEBUG_LOG(DEBUG("interface->dwDspAck=%d, - expected %d \n", - interface->dwDspAck,nOperation); - } - */ - } -/* need to handle this differently... */ - else { - HPI_DEBUG_LOG(ERROR, - "interrupt from HIF <data> BAD\n"); - err = HPI_ERROR_DSP_HARDWARE; - } - - /* reset the interrupt from the DSP */ - iowrite32(C6205_HSR_INTSRC, phw->prHSR); -#endif - if (operation == H620_HIF_GET_DATA) - memcpy(&p_data[data_transferred], - (void *)&interface->u.b_data[0], this_copy); - - data_transferred += this_copy; - } - if (interface->dsp_ack != operation) - HPI_DEBUG_LOG(DEBUG, "interface->dsp_ack=%d, expected %d\n", - interface->dsp_ack, operation); - /* err=HPI_ERROR_DSP_HARDWARE; */ - - send_dsp_command(phw, H620_HIF_IDLE); - - return err; -} - -/* wait for up to timeout_us microseconds for the DSP - to signal state by DMA into dwDspAck -*/ -static int wait_dsp_ack(struct hpi_hw_obj *phw, int state, int timeout_us) -{ - struct bus_master_interface *interface = phw->p_interface_buffer; - int t = timeout_us / 4; - - rmb(); /* ensure interface->dsp_ack is up to date */ - while ((interface->dsp_ack != state) && --t) { - hpios_delay_micro_seconds(4); - rmb(); /* DSP changes dsp_ack by DMA */ - } - - /*HPI_DEBUG_LOG(VERBOSE, "Spun %d for %d\n", timeout_us/4-t, state); */ - return t * 4; -} - -/* set the busmaster interface to cmd, then interrupt the DSP */ -static void send_dsp_command(struct hpi_hw_obj *phw, int cmd) -{ - struct bus_master_interface *interface = phw->p_interface_buffer; - - u32 r; - - interface->host_cmd = cmd; - wmb(); /* DSP gets state by DMA, make sure it is written to memory */ - /* before we interrupt the DSP */ - r = ioread32(phw->prHDCR); - r |= (u32)C6205_HDCR_DSPINT; - iowrite32(r, phw->prHDCR); - r &= ~(u32)C6205_HDCR_DSPINT; - iowrite32(r, phw->prHDCR); -} - -static unsigned int message_count; - -static u16 message_response_sequence(struct hpi_adapter_obj *pao, - struct hpi_message *phm, struct hpi_response *phr) -{ -#ifndef HPI6205_NO_HSR_POLL - u32 temp2; -#endif - u32 time_out, time_out2; - struct hpi_hw_obj *phw = pao->priv; - struct bus_master_interface *interface = phw->p_interface_buffer; - u16 err = 0; - - message_count++; - /* Assume buffer of type struct bus_master_interface - is allocated "noncacheable" */ - - if (!wait_dsp_ack(phw, H620_HIF_IDLE, HPI6205_TIMEOUT)) { - HPI_DEBUG_LOG(DEBUG, "timeout waiting for idle\n"); - return hpi6205_error(0, HPI6205_ERROR_MSG_RESP_IDLE_TIMEOUT); - } - interface->u.message_buffer = *phm; - /* signal we want a response */ - send_dsp_command(phw, H620_HIF_GET_RESP); - - time_out2 = wait_dsp_ack(phw, H620_HIF_GET_RESP, HPI6205_TIMEOUT); - - if (time_out2 == 0) { - HPI_DEBUG_LOG(ERROR, - "(%u) timed out waiting for " "GET_RESP state [%x]\n", - message_count, interface->dsp_ack); - } else { - HPI_DEBUG_LOG(VERBOSE, - "(%u) transition to GET_RESP after %u\n", - message_count, HPI6205_TIMEOUT - time_out2); - } - /* spin waiting on HIF interrupt flag (end of msg process) */ - time_out = HPI6205_TIMEOUT; - -#ifndef HPI6205_NO_HSR_POLL - temp2 = 0; - while ((temp2 == 0) && --time_out) { - temp2 = ioread32(phw->prHSR); - temp2 &= C6205_HSR_INTSRC; - hpios_delay_micro_seconds(1); - } - if (temp2 == C6205_HSR_INTSRC) { - rmb(); /* ensure we see latest value for dsp_ack */ - if ((interface->dsp_ack != H620_HIF_GET_RESP)) { - HPI_DEBUG_LOG(DEBUG, - "(%u)interface->dsp_ack(0x%x) != " - "H620_HIF_GET_RESP, t=%u\n", message_count, - interface->dsp_ack, - HPI6205_TIMEOUT - time_out); - } else { - HPI_DEBUG_LOG(VERBOSE, - "(%u)int with GET_RESP after %u\n", - message_count, HPI6205_TIMEOUT - time_out); - } - - } else { - /* can we do anything else in response to the error ? */ - HPI_DEBUG_LOG(ERROR, - "interrupt from HIF module BAD (function %x)\n", - phm->function); - } - - /* reset the interrupt from the DSP */ - iowrite32(C6205_HSR_INTSRC, phw->prHSR); -#endif - - /* read the result */ - if (time_out != 0) - *phr = interface->u.response_buffer; - - /* set interface back to idle */ - send_dsp_command(phw, H620_HIF_IDLE); - - if ((time_out == 0) || (time_out2 == 0)) { - HPI_DEBUG_LOG(DEBUG, "something timed out!\n"); - return hpi6205_error(0, HPI6205_ERROR_MSG_RESP_TIMEOUT); - } - /* special case for adapter close - */ - /* wait for the DSP to indicate it is idle */ - if (phm->function == HPI_ADAPTER_CLOSE) { - if (!wait_dsp_ack(phw, H620_HIF_IDLE, HPI6205_TIMEOUT)) { - HPI_DEBUG_LOG(DEBUG, - "timeout waiting for idle " - "(on adapter_close)\n"); - return hpi6205_error(0, - HPI6205_ERROR_MSG_RESP_IDLE_TIMEOUT); - } - } - err = hpi_validate_response(phm, phr); - return err; -} - -static void hw_message(struct hpi_adapter_obj *pao, struct hpi_message *phm, - struct hpi_response *phr) -{ - - u16 err = 0; - - hpios_dsplock_lock(pao); - - err = message_response_sequence(pao, phm, phr); - - /* maybe an error response */ - if (err) { - /* something failed in the HPI/DSP interface */ - phr->error = err; - pao->dsp_crashed++; - - /* just the header of the response is valid */ - phr->size = sizeof(struct hpi_response_header); - goto err; - } else - pao->dsp_crashed = 0; - - if (phr->error != 0) /* something failed in the DSP */ - goto err; - - switch (phm->function) { - case HPI_OSTREAM_WRITE: - case HPI_ISTREAM_ANC_WRITE: - err = hpi6205_transfer_data(pao, phm->u.d.u.data.pb_data, - phm->u.d.u.data.data_size, H620_HIF_SEND_DATA); - break; - - case HPI_ISTREAM_READ: - case HPI_OSTREAM_ANC_READ: - err = hpi6205_transfer_data(pao, phm->u.d.u.data.pb_data, - phm->u.d.u.data.data_size, H620_HIF_GET_DATA); - break; - - case HPI_CONTROL_SET_STATE: - if (phm->object == HPI_OBJ_CONTROLEX - && phm->u.cx.attribute == HPI_COBRANET_SET_DATA) - err = hpi6205_transfer_data(pao, - phm->u.cx.u.cobranet_bigdata.pb_data, - phm->u.cx.u.cobranet_bigdata.byte_count, - H620_HIF_SEND_DATA); - break; - - case HPI_CONTROL_GET_STATE: - if (phm->object == HPI_OBJ_CONTROLEX - && phm->u.cx.attribute == HPI_COBRANET_GET_DATA) - err = hpi6205_transfer_data(pao, - phm->u.cx.u.cobranet_bigdata.pb_data, - phr->u.cx.u.cobranet_data.byte_count, - H620_HIF_GET_DATA); - break; - } - phr->error = err; - -err: - hpios_dsplock_unlock(pao); - - return; -} +#include "adriver.h" +#include "../../alsa-kernel/pci/asihpi/hpi6205.c" diff --git a/pci/asihpi/hpi6205.h b/pci/asihpi/hpi6205.h deleted file mode 100644 index 1adae0857..000000000 --- a/pci/asihpi/hpi6205.h +++ /dev/null @@ -1,93 +0,0 @@ -/***************************************************************************** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Host Interface module for an ASI6205 based -bus mastering PCI adapter. - -Copyright AudioScience, Inc., 2003 -******************************************************************************/ - -#ifndef _HPI6205_H_ -#define _HPI6205_H_ - -/* transitional conditional compile shared between host and DSP */ -/* #define HPI6205_NO_HSR_POLL */ - -#include "hpi_internal.h" - -/*********************************************************** - Defines used for basic messaging -************************************************************/ -#define H620_HIF_RESET 0 -#define H620_HIF_IDLE 1 -#define H620_HIF_GET_RESP 2 -#define H620_HIF_DATA_DONE 3 -#define H620_HIF_DATA_MASK 0x10 -#define H620_HIF_SEND_DATA 0x14 -#define H620_HIF_GET_DATA 0x15 -#define H620_HIF_UNKNOWN 0x0000ffff - -/*********************************************************** - Types used for mixer control caching -************************************************************/ - -#define H620_MAX_ISTREAMS 32 -#define H620_MAX_OSTREAMS 32 -#define HPI_NMIXER_CONTROLS 2048 - -/********************************************************************* -This is used for dynamic control cache allocation -**********************************************************************/ -struct controlcache_6205 { - u32 number_of_controls; - u32 physical_address32; - u32 size_in_bytes; -}; - -/********************************************************************* -This is used for dynamic allocation of async event array -**********************************************************************/ -struct async_event_buffer_6205 { - u32 physical_address32; - u32 spare; - struct hpi_fifo_buffer b; -}; - -/*********************************************************** -The Host located memory buffer that the 6205 will bus master -in and out of. -************************************************************/ -#define HPI6205_SIZEOF_DATA (16*1024) -struct bus_master_interface { - u32 host_cmd; - u32 dsp_ack; - u32 transfer_size_in_bytes; - union { - struct hpi_message message_buffer; - struct hpi_response response_buffer; - u8 b_data[HPI6205_SIZEOF_DATA]; - } u; - struct controlcache_6205 control_cache; - struct async_event_buffer_6205 async_buffer; - struct hpi_hostbuffer_status - instream_host_buffer_status[H620_MAX_ISTREAMS]; - struct hpi_hostbuffer_status - outstream_host_buffer_status[H620_MAX_OSTREAMS]; -}; - -#endif diff --git a/pci/asihpi/hpi_internal.h b/pci/asihpi/hpi_internal.h deleted file mode 100644 index f1cd6f1a0..000000000 --- a/pci/asihpi/hpi_internal.h +++ /dev/null @@ -1,1641 +0,0 @@ -/****************************************************************************** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -HPI internal definitions - -(C) Copyright AudioScience Inc. 1996-2009 -******************************************************************************/ - -#ifndef _HPI_INTERNAL_H_ -#define _HPI_INTERNAL_H_ - -#include "hpi.h" -/** maximum number of memory regions mapped to an adapter */ -#define HPI_MAX_ADAPTER_MEM_SPACES (2) - -/* Each OS needs its own hpios.h, or specific define as above */ -#include "hpios.h" - -/* physical memory allocation */ -void hpios_locked_mem_init(void - ); -void hpios_locked_mem_free_all(void - ); -#define hpios_locked_mem_prepare(a, b, c, d); -#define hpios_locked_mem_unprepare(a) - -/** Allocate and map an area of locked memory for bus master DMA operations. - -On success, *pLockedMemeHandle is a valid handle, and 0 is returned -On error *pLockedMemHandle marked invalid, non-zero returned. - -If this function succeeds, then HpiOs_LockedMem_GetVirtAddr() and -HpiOs_LockedMem_GetPyhsAddr() will always succed on the returned handle. -*/ -u16 hpios_locked_mem_alloc(struct consistent_dma_area *p_locked_mem_handle, - /**< memory handle */ - u32 size, /**< size in bytes to allocate */ - struct pci_dev *p_os_reference - /**< OS specific data required for memory allocation */ - ); - -/** Free mapping and memory represented by LockedMemHandle - -Frees any resources, then invalidates the handle. -Returns 0 on success, 1 if handle is invalid. - -*/ -u16 hpios_locked_mem_free(struct consistent_dma_area *locked_mem_handle); - -/** Get the physical PCI address of memory represented by LockedMemHandle. - -If handle is invalid *pPhysicalAddr is set to zero and return 1 -*/ -u16 hpios_locked_mem_get_phys_addr(struct consistent_dma_area - *locked_mem_handle, u32 *p_physical_addr); - -/** Get the CPU address of of memory represented by LockedMemHandle. - -If handle is NULL *ppvVirtualAddr is set to NULL and return 1 -*/ -u16 hpios_locked_mem_get_virt_addr(struct consistent_dma_area - *locked_mem_handle, void **ppv_virtual_addr); - -/** Check that handle is valid -i.e it represents a valid memory area -*/ -u16 hpios_locked_mem_valid(struct consistent_dma_area *locked_mem_handle); - -/* timing/delay */ -void hpios_delay_micro_seconds(u32 num_micro_sec); - -struct hpi_message; -struct hpi_response; - -typedef void hpi_handler_func(struct hpi_message *, struct hpi_response *); - -/* If the assert fails, compiler complains - something like size of array `msg' is negative. - Unlike linux BUILD_BUG_ON, this works outside function scope. -*/ -#define compile_time_assert(cond, msg) \ - typedef char ASSERT_##msg[(cond) ? 1 : -1] - -/*/////////////////////////////////////////////////////////////////////////// */ -/* Private HPI Entity related definitions */ - -#define STR_SIZE_FIELD_MAX 65535U -#define STR_TYPE_FIELD_MAX 255U -#define STR_ROLE_FIELD_MAX 255U - -struct hpi_entity_str { - uint16_t size; - uint8_t type; - uint8_t role; -}; - -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4200) -#endif - -struct hpi_entity { - struct hpi_entity_str header; -#if ! defined(HPI_OS_DSP_C6000) || (defined(HPI_OS_DSP_C6000) && (__TI_COMPILER_VERSION__ > 6000008)) - /* DSP C6000 compiler v6.0.8 and lower - do not support flexible array member */ - uint8_t value[]; -#else - /* NOTE! Using sizeof(struct hpi_entity) will give erroneous results */ -#define HPI_INTERNAL_WARN_ABOUT_ENTITY_VALUE - uint8_t value[1]; -#endif -}; - -#if defined(_MSC_VER) -#pragma warning(pop) -#endif - -/******************************************* bus types */ -enum HPI_BUSES { - HPI_BUS_ISAPNP = 1, - HPI_BUS_PCI = 2, - HPI_BUS_USB = 3, - HPI_BUS_NET = 4 -}; - -/******************************************* CONTROL ATTRIBUTES ****/ -/* (in order of control type ID */ - - /* This allows for 255 control types, 256 unique attributes each */ -#define HPI_CTL_ATTR(ctl, ai) (HPI_CONTROL_##ctl * 0x100 + ai) - -/* Get the sub-index of the attribute for a control type */ -#define HPI_CTL_ATTR_INDEX(i) (i&0xff) - -/* Generic control attributes. */ - -/** Enable a control. -0=disable, 1=enable -\note generic to all mixer plugins? -*/ -#define HPI_GENERIC_ENABLE HPI_CTL_ATTR(GENERIC, 1) - -/** Enable event generation for a control. -0=disable, 1=enable -\note generic to all controls that can generate events -*/ -#define HPI_GENERIC_EVENT_ENABLE HPI_CTL_ATTR(GENERIC, 2) - -/* Volume Control attributes */ -#define HPI_VOLUME_GAIN HPI_CTL_ATTR(VOLUME, 1) -#define HPI_VOLUME_AUTOFADE HPI_CTL_ATTR(VOLUME, 2) - -/** For HPI_ControlQuery() to get the number of channels of a volume control*/ -#define HPI_VOLUME_NUM_CHANNELS HPI_CTL_ATTR(VOLUME, 6) -#define HPI_VOLUME_RANGE HPI_CTL_ATTR(VOLUME, 10) - -/** Level Control attributes */ -#define HPI_LEVEL_GAIN HPI_CTL_ATTR(LEVEL, 1) -#define HPI_LEVEL_RANGE HPI_CTL_ATTR(LEVEL, 10) - -/* Meter Control attributes */ -/** return RMS signal level */ -#define HPI_METER_RMS HPI_CTL_ATTR(METER, 1) -/** return peak signal level */ -#define HPI_METER_PEAK HPI_CTL_ATTR(METER, 2) -/** ballistics for ALL rms meters on adapter */ -#define HPI_METER_RMS_BALLISTICS HPI_CTL_ATTR(METER, 3) -/** ballistics for ALL peak meters on adapter */ -#define HPI_METER_PEAK_BALLISTICS HPI_CTL_ATTR(METER, 4) - -/** For HPI_ControlQuery() to get the number of channels of a meter control*/ -#define HPI_METER_NUM_CHANNELS HPI_CTL_ATTR(METER, 5) - -/* Multiplexer control attributes */ -#define HPI_MULTIPLEXER_SOURCE HPI_CTL_ATTR(MULTIPLEXER, 1) -#define HPI_MULTIPLEXER_QUERYSOURCE HPI_CTL_ATTR(MULTIPLEXER, 2) - -/** AES/EBU transmitter control attributes */ -/** AESEBU or SPDIF */ -#define HPI_AESEBUTX_FORMAT HPI_CTL_ATTR(AESEBUTX, 1) -#define HPI_AESEBUTX_SAMPLERATE HPI_CTL_ATTR(AESEBUTX, 3) -#define HPI_AESEBUTX_CHANNELSTATUS HPI_CTL_ATTR(AESEBUTX, 4) -#define HPI_AESEBUTX_USERDATA HPI_CTL_ATTR(AESEBUTX, 5) - -/** AES/EBU receiver control attributes */ -#define HPI_AESEBURX_FORMAT HPI_CTL_ATTR(AESEBURX, 1) -#define HPI_AESEBURX_ERRORSTATUS HPI_CTL_ATTR(AESEBURX, 2) -#define HPI_AESEBURX_SAMPLERATE HPI_CTL_ATTR(AESEBURX, 3) -#define HPI_AESEBURX_CHANNELSTATUS HPI_CTL_ATTR(AESEBURX, 4) -#define HPI_AESEBURX_USERDATA HPI_CTL_ATTR(AESEBURX, 5) - -/** \defgroup tuner_defs Tuners -\{ -*/ -/** \defgroup tuner_attrs Tuner control attributes -\{ -*/ -#define HPI_TUNER_BAND HPI_CTL_ATTR(TUNER, 1) -#define HPI_TUNER_FREQ HPI_CTL_ATTR(TUNER, 2) -#define HPI_TUNER_LEVEL HPI_CTL_ATTR(TUNER, 3) -#define HPI_TUNER_AUDIOMUTE HPI_CTL_ATTR(TUNER, 4) -/* use TUNER_STATUS instead */ -#define HPI_TUNER_VIDEO_STATUS HPI_CTL_ATTR(TUNER, 5) -#define HPI_TUNER_GAIN HPI_CTL_ATTR(TUNER, 6) -#define HPI_TUNER_STATUS HPI_CTL_ATTR(TUNER, 7) -#define HPI_TUNER_MODE HPI_CTL_ATTR(TUNER, 8) -/** RDS data. */ -#define HPI_TUNER_RDS HPI_CTL_ATTR(TUNER, 9) -/** Audio pre-emphasis. */ -#define HPI_TUNER_DEEMPHASIS HPI_CTL_ATTR(TUNER, 10) -/** HD Radio tuner program control. */ -#define HPI_TUNER_PROGRAM HPI_CTL_ATTR(TUNER, 11) -/** HD Radio tuner digital signal quality. */ -#define HPI_TUNER_HDRADIO_SIGNAL_QUALITY HPI_CTL_ATTR(TUNER, 12) -/** HD Radio SDK firmware version. */ -#define HPI_TUNER_HDRADIO_SDK_VERSION HPI_CTL_ATTR(TUNER, 13) -/** HD Radio DSP firmware version. */ -#define HPI_TUNER_HDRADIO_DSP_VERSION HPI_CTL_ATTR(TUNER, 14) - -/** \} */ - -/** \defgroup pads_attrs Tuner PADs control attributes -\{ -*/ -/** The text string containing the station/channel combination. */ -#define HPI_PAD_CHANNEL_NAME HPI_CTL_ATTR(PAD, 1) -/** The text string containing the artist. */ -#define HPI_PAD_ARTIST HPI_CTL_ATTR(PAD, 2) -/** The text string containing the title. */ -#define HPI_PAD_TITLE HPI_CTL_ATTR(PAD, 3) -/** The text string containing the comment. */ -#define HPI_PAD_COMMENT HPI_CTL_ATTR(PAD, 4) -/** The integer containing the PTY code. */ -#define HPI_PAD_PROGRAM_TYPE HPI_CTL_ATTR(PAD, 5) -/** The integer containing the program identification. */ -#define HPI_PAD_PROGRAM_ID HPI_CTL_ATTR(PAD, 6) -/** The integer containing whether traffic information is supported. -Contains either 1 or 0. */ -#define HPI_PAD_TA_SUPPORT HPI_CTL_ATTR(PAD, 7) -/** The integer containing whether traffic announcement is in progress. -Contains either 1 or 0. */ -#define HPI_PAD_TA_ACTIVE HPI_CTL_ATTR(PAD, 8) -/** \} */ -/** \} */ - -/* VOX control attributes */ -#define HPI_VOX_THRESHOLD HPI_CTL_ATTR(VOX, 1) - -/*?? channel mode used hpi_multiplexer_source attribute == 1 */ -#define HPI_CHANNEL_MODE_MODE HPI_CTL_ATTR(CHANNEL_MODE, 1) - -/** \defgroup channel_modes Channel Modes -Used for HPI_ChannelModeSet/Get() -\{ -*/ -/** Left channel out = left channel in, Right channel out = right channel in. */ -#define HPI_CHANNEL_MODE_NORMAL 1 -/** Left channel out = right channel in, Right channel out = left channel in. */ -#define HPI_CHANNEL_MODE_SWAP 2 -/** Left channel out = left channel in, Right channel out = left channel in. */ -#define HPI_CHANNEL_MODE_LEFT_TO_STEREO 3 -/** Left channel out = right channel in, Right channel out = right channel in.*/ -#define HPI_CHANNEL_MODE_RIGHT_TO_STEREO 4 -/** Left channel out = (left channel in + right channel in)/2, - Right channel out = mute. */ -#define HPI_CHANNEL_MODE_STEREO_TO_LEFT 5 -/** Left channel out = mute, - Right channel out = (right channel in + left channel in)/2. */ -#define HPI_CHANNEL_MODE_STEREO_TO_RIGHT 6 -#define HPI_CHANNEL_MODE_LAST 6 -/** \} */ - -/* Bitstream control set attributes */ -#define HPI_BITSTREAM_DATA_POLARITY HPI_CTL_ATTR(BITSTREAM, 1) -#define HPI_BITSTREAM_CLOCK_EDGE HPI_CTL_ATTR(BITSTREAM, 2) -#define HPI_BITSTREAM_CLOCK_SOURCE HPI_CTL_ATTR(BITSTREAM, 3) - -#define HPI_POLARITY_POSITIVE 0 -#define HPI_POLARITY_NEGATIVE 1 - -/* Bitstream control get attributes */ -#define HPI_BITSTREAM_ACTIVITY 1 - -/* SampleClock control attributes */ -#define HPI_SAMPLECLOCK_SOURCE HPI_CTL_ATTR(SAMPLECLOCK, 1) -#define HPI_SAMPLECLOCK_SAMPLERATE HPI_CTL_ATTR(SAMPLECLOCK, 2) -#define HPI_SAMPLECLOCK_SOURCE_INDEX HPI_CTL_ATTR(SAMPLECLOCK, 3) -#define HPI_SAMPLECLOCK_LOCAL_SAMPLERATE\ - HPI_CTL_ATTR(SAMPLECLOCK, 4) -#define HPI_SAMPLECLOCK_AUTO HPI_CTL_ATTR(SAMPLECLOCK, 5) -#define HPI_SAMPLECLOCK_LOCAL_LOCK HPI_CTL_ATTR(SAMPLECLOCK, 6) - -/* Microphone control attributes */ -#define HPI_MICROPHONE_PHANTOM_POWER HPI_CTL_ATTR(MICROPHONE, 1) - -/** Equalizer control attributes -*/ -/** Used to get number of filters in an EQ. (Can't set) */ -#define HPI_EQUALIZER_NUM_FILTERS HPI_CTL_ATTR(EQUALIZER, 1) -/** Set/get the filter by type, freq, Q, gain */ -#define HPI_EQUALIZER_FILTER HPI_CTL_ATTR(EQUALIZER, 2) -/** Get the biquad coefficients */ -#define HPI_EQUALIZER_COEFFICIENTS HPI_CTL_ATTR(EQUALIZER, 3) - -#define HPI_COMPANDER_PARAMS HPI_CTL_ATTR(COMPANDER, 1) - -/* Cobranet control attributes. - MUST be distinct from all other control attributes. - This is so that host side processing can easily identify a Cobranet control - and apply additional host side operations (like copying data) as required. -*/ -#define HPI_COBRANET_SET HPI_CTL_ATTR(COBRANET, 1) -#define HPI_COBRANET_GET HPI_CTL_ATTR(COBRANET, 2) -#define HPI_COBRANET_SET_DATA HPI_CTL_ATTR(COBRANET, 3) -#define HPI_COBRANET_GET_DATA HPI_CTL_ATTR(COBRANET, 4) -#define HPI_COBRANET_GET_STATUS HPI_CTL_ATTR(COBRANET, 5) -#define HPI_COBRANET_SEND_PACKET HPI_CTL_ATTR(COBRANET, 6) -#define HPI_COBRANET_GET_PACKET HPI_CTL_ATTR(COBRANET, 7) - -/*------------------------------------------------------------ - Cobranet Chip Bridge - copied from HMI.H -------------------------------------------------------------*/ -#define HPI_COBRANET_HMI_cobra_bridge 0x20000 -#define HPI_COBRANET_HMI_cobra_bridge_tx_pkt_buf \ - (HPI_COBRANET_HMI_cobra_bridge + 0x1000) -#define HPI_COBRANET_HMI_cobra_bridge_rx_pkt_buf \ - (HPI_COBRANET_HMI_cobra_bridge + 0x2000) -#define HPI_COBRANET_HMI_cobra_if_table1 0x110000 -#define HPI_COBRANET_HMI_cobra_if_phy_address \ - (HPI_COBRANET_HMI_cobra_if_table1 + 0xd) -#define HPI_COBRANET_HMI_cobra_protocolIP 0x72000 -#define HPI_COBRANET_HMI_cobra_ip_mon_currentIP \ - (HPI_COBRANET_HMI_cobra_protocolIP + 0x0) -#define HPI_COBRANET_HMI_cobra_ip_mon_staticIP \ - (HPI_COBRANET_HMI_cobra_protocolIP + 0x2) -#define HPI_COBRANET_HMI_cobra_sys 0x100000 -#define HPI_COBRANET_HMI_cobra_sys_desc \ - (HPI_COBRANET_HMI_cobra_sys + 0x0) -#define HPI_COBRANET_HMI_cobra_sys_objectID \ - (HPI_COBRANET_HMI_cobra_sys + 0x100) -#define HPI_COBRANET_HMI_cobra_sys_contact \ - (HPI_COBRANET_HMI_cobra_sys + 0x200) -#define HPI_COBRANET_HMI_cobra_sys_name \ - (HPI_COBRANET_HMI_cobra_sys + 0x300) -#define HPI_COBRANET_HMI_cobra_sys_location \ - (HPI_COBRANET_HMI_cobra_sys + 0x400) - -/*------------------------------------------------------------ - Cobranet Chip Status bits -------------------------------------------------------------*/ -#define HPI_COBRANET_HMI_STATUS_RXPACKET 2 -#define HPI_COBRANET_HMI_STATUS_TXPACKET 3 - -/*------------------------------------------------------------ - Ethernet header size -------------------------------------------------------------*/ -#define HPI_ETHERNET_HEADER_SIZE (16) - -/* These defines are used to fill in protocol information for an Ethernet packet - sent using HMI on CS18102 */ -/** ID supplied by Cirrius for ASI packets. */ -#define HPI_ETHERNET_PACKET_ID 0x85 -/** Simple packet - no special routing required */ -#define HPI_ETHERNET_PACKET_V1 0x01 -/** This packet must make its way to the host across the HPI interface */ -#define HPI_ETHERNET_PACKET_HOSTED_VIA_HMI 0x20 -/** This packet must make its way to the host across the HPI interface */ -#define HPI_ETHERNET_PACKET_HOSTED_VIA_HMI_V1 0x21 -/** This packet must make its way to the host across the HPI interface */ -#define HPI_ETHERNET_PACKET_HOSTED_VIA_HPI 0x40 -/** This packet must make its way to the host across the HPI interface */ -#define HPI_ETHERNET_PACKET_HOSTED_VIA_HPI_V1 0x41 - -#define HPI_ETHERNET_UDP_PORT (44600) /*!< UDP messaging port */ - -/** Base network time out is set to 100 milli-seconds. */ -#define HPI_ETHERNET_TIMEOUT_MS (100) - -/** \defgroup tonedet_attr Tonedetector attributes -\{ -Used by HPI_ToneDetector_Set() and HPI_ToneDetector_Get() -*/ - -/** Set the threshold level of a tonedetector, -Threshold is a -ve number in units of dB/100, -*/ -#define HPI_TONEDETECTOR_THRESHOLD HPI_CTL_ATTR(TONEDETECTOR, 1) - -/** Get the current state of tonedetection -The result is a bitmap of detected tones. pairs of bits represent the left -and right channels, with left channel in LSB. -The lowest frequency detector state is in the LSB -*/ -#define HPI_TONEDETECTOR_STATE HPI_CTL_ATTR(TONEDETECTOR, 2) - -/** Get the frequency of a tonedetector band. -*/ -#define HPI_TONEDETECTOR_FREQUENCY HPI_CTL_ATTR(TONEDETECTOR, 3) - -/**\}*/ - -/** \defgroup silencedet_attr SilenceDetector attributes -\{ -*/ - -/** Get the current state of tonedetection -The result is a bitmap with 1s for silent channels. Left channel is in LSB -*/ -#define HPI_SILENCEDETECTOR_STATE \ - HPI_CTL_ATTR(SILENCEDETECTOR, 2) - -/** Set the threshold level of a SilenceDetector, -Threshold is a -ve number in units of dB/100, -*/ -#define HPI_SILENCEDETECTOR_THRESHOLD \ - HPI_CTL_ATTR(SILENCEDETECTOR, 1) - -/** get/set the silence time before the detector triggers -*/ -#define HPI_SILENCEDETECTOR_DELAY \ - HPI_CTL_ATTR(SILENCEDETECTOR, 3) - -/**\}*/ - -/* Locked memory buffer alloc/free phases */ -/** use one message to allocate or free physical memory */ -#define HPI_BUFFER_CMD_EXTERNAL 0 -/** alloc physical memory */ -#define HPI_BUFFER_CMD_INTERNAL_ALLOC 1 -/** send physical memory address to adapter */ -#define HPI_BUFFER_CMD_INTERNAL_GRANTADAPTER 2 -/** notify adapter to stop using physical buffer */ -#define HPI_BUFFER_CMD_INTERNAL_REVOKEADAPTER 3 -/** free physical buffer */ -#define HPI_BUFFER_CMD_INTERNAL_FREE 4 - -/******************************************* CONTROLX ATTRIBUTES ****/ -/* NOTE: All controlx attributes must be unique, unlike control attributes */ - -/*****************************************************************************/ -/*****************************************************************************/ -/******** HPI LOW LEVEL MESSAGES *******/ -/*****************************************************************************/ -/*****************************************************************************/ -/** Pnp ids */ -/** "ASI" - actual is "ASX" - need to change */ -#define HPI_ID_ISAPNP_AUDIOSCIENCE 0x0669 -/** PCI vendor ID that AudioScience uses */ -#define HPI_PCI_VENDOR_ID_AUDIOSCIENCE 0x175C -/** PCI vendor ID that the DSP56301 has */ -#define HPI_PCI_VENDOR_ID_MOTOROLA 0x1057 -/** PCI vendor ID that TI uses */ -#define HPI_PCI_VENDOR_ID_TI 0x104C - -#define HPI_PCI_DEV_ID_PCI2040 0xAC60 -/** TI's C6205 PCI interface has this ID */ -#define HPI_PCI_DEV_ID_DSP6205 0xA106 - -#define HPI_USB_VENDOR_ID_AUDIOSCIENCE 0x1257 -#define HPI_USB_W2K_TAG 0x57495341 /* "ASIW" */ -#define HPI_USB_LINUX_TAG 0x4C495341 /* "ASIL" */ - -/** First 2 hex digits define the adapter family */ -#define HPI_ADAPTER_FAMILY_MASK 0xff00 - -#define HPI_ADAPTER_FAMILY_ASI(f) (f & HPI_ADAPTER_FAMILY_MASK) -#define HPI_ADAPTER_ASI(f) (f) - -/******************************************* message types */ -#define HPI_TYPE_MESSAGE 1 -#define HPI_TYPE_RESPONSE 2 -#define HPI_TYPE_DATA 3 -#define HPI_TYPE_SSX2BYPASS_MESSAGE 4 - -/******************************************* object types */ -#define HPI_OBJ_SUBSYSTEM 1 -#define HPI_OBJ_ADAPTER 2 -#define HPI_OBJ_OSTREAM 3 -#define HPI_OBJ_ISTREAM 4 -#define HPI_OBJ_MIXER 5 -#define HPI_OBJ_NODE 6 -#define HPI_OBJ_CONTROL 7 -#define HPI_OBJ_NVMEMORY 8 -#define HPI_OBJ_GPIO 9 -#define HPI_OBJ_WATCHDOG 10 -#define HPI_OBJ_CLOCK 11 -#define HPI_OBJ_PROFILE 12 -#define HPI_OBJ_CONTROLEX 13 -#define HPI_OBJ_ASYNCEVENT 14 - -#define HPI_OBJ_MAXINDEX 14 - -/******************************************* methods/functions */ - -#define HPI_OBJ_FUNCTION_SPACING 0x100 -#define HPI_MAKE_INDEX(obj, index) (obj * HPI_OBJ_FUNCTION_SPACING + index) -#define HPI_EXTRACT_INDEX(fn) (fn & 0xff) - -/* SUB-SYSTEM */ -#define HPI_SUBSYS_OPEN HPI_MAKE_INDEX(HPI_OBJ_SUBSYSTEM, 1) -#define HPI_SUBSYS_GET_VERSION HPI_MAKE_INDEX(HPI_OBJ_SUBSYSTEM, 2) -#define HPI_SUBSYS_GET_INFO HPI_MAKE_INDEX(HPI_OBJ_SUBSYSTEM, 3) -#define HPI_SUBSYS_FIND_ADAPTERS HPI_MAKE_INDEX(HPI_OBJ_SUBSYSTEM, 4) -#define HPI_SUBSYS_CREATE_ADAPTER HPI_MAKE_INDEX(HPI_OBJ_SUBSYSTEM, 5) -#define HPI_SUBSYS_CLOSE HPI_MAKE_INDEX(HPI_OBJ_SUBSYSTEM, 6) -#define HPI_SUBSYS_DELETE_ADAPTER HPI_MAKE_INDEX(HPI_OBJ_SUBSYSTEM, 7) -#define HPI_SUBSYS_DRIVER_LOAD HPI_MAKE_INDEX(HPI_OBJ_SUBSYSTEM, 8) -#define HPI_SUBSYS_DRIVER_UNLOAD HPI_MAKE_INDEX(HPI_OBJ_SUBSYSTEM, 9) -#define HPI_SUBSYS_READ_PORT_8 HPI_MAKE_INDEX(HPI_OBJ_SUBSYSTEM, 10) -#define HPI_SUBSYS_WRITE_PORT_8 HPI_MAKE_INDEX(HPI_OBJ_SUBSYSTEM, 11) -#define HPI_SUBSYS_GET_NUM_ADAPTERS HPI_MAKE_INDEX(HPI_OBJ_SUBSYSTEM, 12) -#define HPI_SUBSYS_GET_ADAPTER HPI_MAKE_INDEX(HPI_OBJ_SUBSYSTEM, 13) -#define HPI_SUBSYS_SET_NETWORK_INTERFACE HPI_MAKE_INDEX(HPI_OBJ_SUBSYSTEM, 14) -#define HPI_SUBSYS_FUNCTION_COUNT 14 -/* ADAPTER */ -#define HPI_ADAPTER_OPEN HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 1) -#define HPI_ADAPTER_CLOSE HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 2) -#define HPI_ADAPTER_GET_INFO HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 3) -#define HPI_ADAPTER_GET_ASSERT HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 4) -#define HPI_ADAPTER_TEST_ASSERT HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 5) -#define HPI_ADAPTER_SET_MODE HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 6) -#define HPI_ADAPTER_GET_MODE HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 7) -#define HPI_ADAPTER_ENABLE_CAPABILITY HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 8) -#define HPI_ADAPTER_SELFTEST HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 9) -#define HPI_ADAPTER_FIND_OBJECT HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 10) -#define HPI_ADAPTER_QUERY_FLASH HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 11) -#define HPI_ADAPTER_START_FLASH HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 12) -#define HPI_ADAPTER_PROGRAM_FLASH HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 13) -#define HPI_ADAPTER_SET_PROPERTY HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 14) -#define HPI_ADAPTER_GET_PROPERTY HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 15) -#define HPI_ADAPTER_ENUM_PROPERTY HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 16) -#define HPI_ADAPTER_MODULE_INFO HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 17) -#define HPI_ADAPTER_DEBUG_READ HPI_MAKE_INDEX(HPI_OBJ_ADAPTER, 18) -#define HPI_ADAPTER_FUNCTION_COUNT 18 -/* OUTPUT STREAM */ -#define HPI_OSTREAM_OPEN HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 1) -#define HPI_OSTREAM_CLOSE HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 2) -#define HPI_OSTREAM_WRITE HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 3) -#define HPI_OSTREAM_START HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 4) -#define HPI_OSTREAM_STOP HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 5) -#define HPI_OSTREAM_RESET HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 6) -#define HPI_OSTREAM_GET_INFO HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 7) -#define HPI_OSTREAM_QUERY_FORMAT HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 8) -#define HPI_OSTREAM_DATA HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 9) -#define HPI_OSTREAM_SET_VELOCITY HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 10) -#define HPI_OSTREAM_SET_PUNCHINOUT HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 11) -#define HPI_OSTREAM_SINEGEN HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 12) -#define HPI_OSTREAM_ANC_RESET HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 13) -#define HPI_OSTREAM_ANC_GET_INFO HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 14) -#define HPI_OSTREAM_ANC_READ HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 15) -#define HPI_OSTREAM_SET_TIMESCALE HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 16) -#define HPI_OSTREAM_SET_FORMAT HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 17) -#define HPI_OSTREAM_HOSTBUFFER_ALLOC HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 18) -#define HPI_OSTREAM_HOSTBUFFER_FREE HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 19) -#define HPI_OSTREAM_GROUP_ADD HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 20) -#define HPI_OSTREAM_GROUP_GETMAP HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 21) -#define HPI_OSTREAM_GROUP_RESET HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 22) -#define HPI_OSTREAM_HOSTBUFFER_GET_INFO HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 23) -#define HPI_OSTREAM_WAIT_START HPI_MAKE_INDEX(HPI_OBJ_OSTREAM, 24) -#define HPI_OSTREAM_FUNCTION_COUNT 24 -/* INPUT STREAM */ -#define HPI_ISTREAM_OPEN HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 1) -#define HPI_ISTREAM_CLOSE HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 2) -#define HPI_ISTREAM_SET_FORMAT HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 3) -#define HPI_ISTREAM_READ HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 4) -#define HPI_ISTREAM_START HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 5) -#define HPI_ISTREAM_STOP HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 6) -#define HPI_ISTREAM_RESET HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 7) -#define HPI_ISTREAM_GET_INFO HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 8) -#define HPI_ISTREAM_QUERY_FORMAT HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 9) -#define HPI_ISTREAM_ANC_RESET HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 10) -#define HPI_ISTREAM_ANC_GET_INFO HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 11) -#define HPI_ISTREAM_ANC_WRITE HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 12) -#define HPI_ISTREAM_HOSTBUFFER_ALLOC HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 13) -#define HPI_ISTREAM_HOSTBUFFER_FREE HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 14) -#define HPI_ISTREAM_GROUP_ADD HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 15) -#define HPI_ISTREAM_GROUP_GETMAP HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 16) -#define HPI_ISTREAM_GROUP_RESET HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 17) -#define HPI_ISTREAM_HOSTBUFFER_GET_INFO HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 18) -#define HPI_ISTREAM_WAIT_START HPI_MAKE_INDEX(HPI_OBJ_ISTREAM, 19) -#define HPI_ISTREAM_FUNCTION_COUNT 19 -/* MIXER */ -/* NOTE: - GET_NODE_INFO, SET_CONNECTION, GET_CONNECTIONS are not currently used */ -#define HPI_MIXER_OPEN HPI_MAKE_INDEX(HPI_OBJ_MIXER, 1) -#define HPI_MIXER_CLOSE HPI_MAKE_INDEX(HPI_OBJ_MIXER, 2) -#define HPI_MIXER_GET_INFO HPI_MAKE_INDEX(HPI_OBJ_MIXER, 3) -#define HPI_MIXER_GET_NODE_INFO HPI_MAKE_INDEX(HPI_OBJ_MIXER, 4) -#define HPI_MIXER_GET_CONTROL HPI_MAKE_INDEX(HPI_OBJ_MIXER, 5) -#define HPI_MIXER_SET_CONNECTION HPI_MAKE_INDEX(HPI_OBJ_MIXER, 6) -#define HPI_MIXER_GET_CONNECTIONS HPI_MAKE_INDEX(HPI_OBJ_MIXER, 7) -#define HPI_MIXER_GET_CONTROL_BY_INDEX HPI_MAKE_INDEX(HPI_OBJ_MIXER, 8) -#define HPI_MIXER_GET_CONTROL_ARRAY_BY_INDEX HPI_MAKE_INDEX(HPI_OBJ_MIXER, 9) -#define HPI_MIXER_GET_CONTROL_MULTIPLE_VALUES HPI_MAKE_INDEX(HPI_OBJ_MIXER, 10) -#define HPI_MIXER_STORE HPI_MAKE_INDEX(HPI_OBJ_MIXER, 11) -#define HPI_MIXER_FUNCTION_COUNT 11 -/* MIXER CONTROLS */ -#define HPI_CONTROL_GET_INFO HPI_MAKE_INDEX(HPI_OBJ_CONTROL, 1) -#define HPI_CONTROL_GET_STATE HPI_MAKE_INDEX(HPI_OBJ_CONTROL, 2) -#define HPI_CONTROL_SET_STATE HPI_MAKE_INDEX(HPI_OBJ_CONTROL, 3) -#define HPI_CONTROL_FUNCTION_COUNT 3 -/* NONVOL MEMORY */ -#define HPI_NVMEMORY_OPEN HPI_MAKE_INDEX(HPI_OBJ_NVMEMORY, 1) -#define HPI_NVMEMORY_READ_BYTE HPI_MAKE_INDEX(HPI_OBJ_NVMEMORY, 2) -#define HPI_NVMEMORY_WRITE_BYTE HPI_MAKE_INDEX(HPI_OBJ_NVMEMORY, 3) -#define HPI_NVMEMORY_FUNCTION_COUNT 3 -/* GPIO */ -#define HPI_GPIO_OPEN HPI_MAKE_INDEX(HPI_OBJ_GPIO, 1) -#define HPI_GPIO_READ_BIT HPI_MAKE_INDEX(HPI_OBJ_GPIO, 2) -#define HPI_GPIO_WRITE_BIT HPI_MAKE_INDEX(HPI_OBJ_GPIO, 3) -#define HPI_GPIO_READ_ALL HPI_MAKE_INDEX(HPI_OBJ_GPIO, 4) -#define HPI_GPIO_WRITE_STATUS HPI_MAKE_INDEX(HPI_OBJ_GPIO, 5) -#define HPI_GPIO_FUNCTION_COUNT 5 -/* ASYNC EVENT */ -#define HPI_ASYNCEVENT_OPEN HPI_MAKE_INDEX(HPI_OBJ_ASYNCEVENT, 1) -#define HPI_ASYNCEVENT_CLOSE HPI_MAKE_INDEX(HPI_OBJ_ASYNCEVENT, 2) -#define HPI_ASYNCEVENT_WAIT HPI_MAKE_INDEX(HPI_OBJ_ASYNCEVENT, 3) -#define HPI_ASYNCEVENT_GETCOUNT HPI_MAKE_INDEX(HPI_OBJ_ASYNCEVENT, 4) -#define HPI_ASYNCEVENT_GET HPI_MAKE_INDEX(HPI_OBJ_ASYNCEVENT, 5) -#define HPI_ASYNCEVENT_SENDEVENTS HPI_MAKE_INDEX(HPI_OBJ_ASYNCEVENT, 6) -#define HPI_ASYNCEVENT_FUNCTION_COUNT 6 -/* WATCH-DOG */ -#define HPI_WATCHDOG_OPEN HPI_MAKE_INDEX(HPI_OBJ_WATCHDOG, 1) -#define HPI_WATCHDOG_SET_TIME HPI_MAKE_INDEX(HPI_OBJ_WATCHDOG, 2) -#define HPI_WATCHDOG_PING HPI_MAKE_INDEX(HPI_OBJ_WATCHDOG, 3) -/* CLOCK */ -#define HPI_CLOCK_OPEN HPI_MAKE_INDEX(HPI_OBJ_CLOCK, 1) -#define HPI_CLOCK_SET_TIME HPI_MAKE_INDEX(HPI_OBJ_CLOCK, 2) -#define HPI_CLOCK_GET_TIME HPI_MAKE_INDEX(HPI_OBJ_CLOCK, 3) -/* PROFILE */ -#define HPI_PROFILE_OPEN_ALL HPI_MAKE_INDEX(HPI_OBJ_PROFILE, 1) -#define HPI_PROFILE_START_ALL HPI_MAKE_INDEX(HPI_OBJ_PROFILE, 2) -#define HPI_PROFILE_STOP_ALL HPI_MAKE_INDEX(HPI_OBJ_PROFILE, 3) -#define HPI_PROFILE_GET HPI_MAKE_INDEX(HPI_OBJ_PROFILE, 4) -#define HPI_PROFILE_GET_IDLECOUNT HPI_MAKE_INDEX(HPI_OBJ_PROFILE, 5) -#define HPI_PROFILE_GET_NAME HPI_MAKE_INDEX(HPI_OBJ_PROFILE, 6) -#define HPI_PROFILE_GET_UTILIZATION HPI_MAKE_INDEX(HPI_OBJ_PROFILE, 7) -#define HPI_PROFILE_FUNCTION_COUNT 7 -/* ////////////////////////////////////////////////////////////////////// */ -/* PRIVATE ATTRIBUTES */ - -/* ////////////////////////////////////////////////////////////////////// */ -/* STRUCTURES */ -#ifndef DISABLE_PRAGMA_PACK1 -#pragma pack(push, 1) -#endif - -/** PCI bus resource */ -struct hpi_pci { - u32 __iomem *ap_mem_base[HPI_MAX_ADAPTER_MEM_SPACES]; - struct pci_dev *p_os_data; - -#ifndef HPI64BIT /* keep structure size constant */ - u32 padding[HPI_MAX_ADAPTER_MEM_SPACES + 1]; -#endif - u16 vendor_id; - u16 device_id; - u16 subsys_vendor_id; - u16 subsys_device_id; - u16 bus_number; - u16 device_number; - u32 interrupt; -}; - -struct hpi_resource { - union { - const struct hpi_pci *pci; - const char *net_if; - } r; -#ifndef HPI64BIT /* keep structure size constant */ - u32 pad_to64; -#endif - u16 bus_type; /* HPI_BUS_PNPISA, _PCI, _USB etc */ - u16 padding; - -}; - -/** Format info used inside struct hpi_message - Not the same as public API struct hpi_format */ -struct hpi_msg_format { - u32 sample_rate; - /**< 11025, 32000, 44100 ... */ - u32 bit_rate; /**< for MPEG */ - u32 attributes; - /**< Stereo/JointStereo/Mono */ - u16 channels; /**< 1,2..., (or ancillary mode or idle bit */ - u16 format; /**< HPI_FORMAT_PCM16, _MPEG etc. see \ref HPI_FORMATS. */ -}; - -/** Buffer+format structure. - Must be kept 7 * 32 bits to match public struct hpi_datastruct */ -struct hpi_msg_data { - struct hpi_msg_format format; - u8 *pb_data; -#ifndef HPI64BIT - u32 padding; -#endif - u32 data_size; -}; - -/** struct hpi_datastructure used up to 3.04 driver */ -struct hpi_data_legacy32 { - struct hpi_format format; - u32 pb_data; - u32 data_size; -}; - -#ifdef HPI64BIT -/* Compatibility version of struct hpi_data*/ -struct hpi_data_compat32 { - struct hpi_msg_format format; - u32 pb_data; - u32 padding; - u32 data_size; -}; -#endif - -struct hpi_buffer { - /** placehoder for backward compatability (see dwBufferSize) */ - struct hpi_msg_format reserved; - u32 command; /**< HPI_BUFFER_CMD_xxx*/ - u32 pci_address; /**< PCI physical address of buffer for DSP DMA */ - u32 buffer_size; /**< must line up with data_size of HPI_DATA*/ -}; - -/*/////////////////////////////////////////////////////////////////////////// */ -/* This is used for background buffer bus mastering stream buffers. */ -struct hpi_hostbuffer_status { - u32 samples_processed; - u32 auxiliary_data_available; - u32 stream_state; - /* DSP index in to the host bus master buffer. */ - u32 dSP_index; - /* Host index in to the host bus master buffer. */ - u32 host_index; - u32 size_in_bytes; -}; - -struct hpi_streamid { - u16 object_type; - /**< Type of object, HPI_OBJ_OSTREAM or HPI_OBJ_ISTREAM. */ - u16 stream_index; /**< outstream or instream index. */ -}; - -struct hpi_punchinout { - u32 punch_in_sample; - u32 punch_out_sample; -}; - -struct hpi_subsys_msg { - struct hpi_resource resource; -}; - -struct hpi_subsys_res { - u32 version; - u32 data; /* used to return extended version */ - u16 num_adapters; /* number of adapters */ - u16 adapter_index; - u16 aw_adapter_list[HPI_MAX_ADAPTERS]; -}; - -struct hpi_adapter_msg { - u32 adapter_mode; /* adapter mode */ - u16 assert_id; /* assert number for "test assert" call - object_index for find object call - query_or_set for hpi_adapter_set_mode_ex() */ - u16 object_type; /* for adapter find object call */ -}; - -union hpi_adapterx_msg { - struct hpi_adapter_msg adapter; - struct { - u32 offset; - } query_flash; - struct { - u32 offset; - u32 length; - u32 key; - } start_flash; - struct { - u32 checksum; - u16 sequence; - u16 length; - u16 offset; /**< offset from start of msg to data */ - u16 unused; - } program_flash; - struct { - u16 property; - u16 parameter1; - u16 parameter2; - } property_set; - struct { - u16 index; - u16 what; - u16 property_index; - } property_enum; - struct { - u16 index; - } module_info; - struct { - u32 dsp_address; - u32 count_bytes; - } debug_read; -}; - -struct hpi_adapter_res { - u32 serial_number; - u16 adapter_type; - u16 adapter_index; /* is this needed? also used for dsp_index */ - u16 num_instreams; - u16 num_outstreams; - u16 num_mixers; - u16 version; - u8 sz_adapter_assert[HPI_STRING_LEN]; -}; - -union hpi_adapterx_res { - struct hpi_adapter_res adapter; - struct { - u32 checksum; - u32 length; - u32 version; - } query_flash; - struct { - u16 sequence; - } program_flash; - struct { - u16 parameter1; - u16 parameter2; - } property_get; -}; - -struct hpi_stream_msg { - union { - struct hpi_msg_data data; - struct hpi_data_legacy32 data32; - u16 velocity; - struct hpi_punchinout pio; - u32 time_scale; - struct hpi_buffer buffer; - struct hpi_streamid stream; - } u; -}; - -struct hpi_stream_res { - union { - struct { - /* size of hardware buffer */ - u32 buffer_size; - /* OutStream - data to play, - InStream - data recorded */ - u32 data_available; - /* OutStream - samples played, - InStream - samples recorded */ - u32 samples_transferred; - /* Adapter - OutStream - data to play, - InStream - data recorded */ - u32 auxiliary_data_available; - u16 state; /* HPI_STATE_PLAYING, _STATE_STOPPED */ - u16 padding; - } stream_info; - struct { - u32 buffer_size; - u32 data_available; - u32 samples_transfered; - u16 state; - u16 outstream_index; - u16 instream_index; - u16 padding; - u32 auxiliary_data_available; - } legacy_stream_info; - struct { - /* bitmap of grouped OutStreams */ - u32 outstream_group_map; - /* bitmap of grouped InStreams */ - u32 instream_group_map; - } group_info; - struct { - /* pointer to the buffer */ - u8 *p_buffer; - /* pointer to the hostbuffer status */ - struct hpi_hostbuffer_status *p_status; - } hostbuffer_info; - } u; -}; - -struct hpi_mixer_msg { - u16 control_index; - u16 control_type; /* = HPI_CONTROL_METER _VOLUME etc */ - u16 padding1; /* maintain alignment of subsequent fields */ - u16 node_type1; /* = HPI_SOURCENODE_LINEIN etc */ - u16 node_index1; /* = 0..N */ - u16 node_type2; - u16 node_index2; - u16 padding2; /* round to 4 bytes */ -}; - -struct hpi_mixer_res { - u16 src_node_type; /* = HPI_SOURCENODE_LINEIN etc */ - u16 src_node_index; /* = 0..N */ - u16 dst_node_type; - u16 dst_node_index; - /* Also controlType for MixerGetControlByIndex */ - u16 control_index; - /* may indicate which DSP the control is located on */ - u16 dsp_index; -}; - -union hpi_mixerx_msg { - struct { - u16 starting_index; - u16 flags; - u32 length_in_bytes; /* length in bytes of p_data */ - u32 p_data; /* pointer to a data array */ - } gcabi; - struct { - u16 command; - u16 index; - } store; /* for HPI_MIXER_STORE message */ -}; - -union hpi_mixerx_res { - struct { - u32 bytes_returned; /* size of items returned */ - u32 p_data; /* pointer to data array */ - u16 more_to_do; /* indicates if there is more to do */ - } gcabi; -}; - -struct hpi_control_msg { - u16 attribute; /* control attribute or property */ - u16 saved_index; - u32 param1; /* generic parameter 1 */ - u32 param2; /* generic parameter 2 */ - short an_log_value[HPI_MAX_CHANNELS]; -}; - -struct hpi_control_union_msg { - u16 attribute; /* control attribute or property */ - u16 saved_index; /* only used in ctrl save/restore */ - union { - struct { - u32 param1; /* generic parameter 1 */ - u32 param2; /* generic parameter 2 */ - short an_log_value[HPI_MAX_CHANNELS]; - } old; - union { - u32 frequency; - u32 gain; - u32 band; - u32 deemphasis; - u32 program; - struct { - u32 mode; - u32 value; - } mode; - } tuner; - } u; -}; - -struct hpi_control_res { - /* Could make union. dwParam, anLogValue never used in same response */ - u32 param1; - u32 param2; - short an_log_value[HPI_MAX_CHANNELS]; -}; - -union hpi_control_union_res { - struct { - u32 param1; - u32 param2; - short an_log_value[HPI_MAX_CHANNELS]; - } old; - union { - u32 band; - u32 frequency; - u32 gain; - u32 level; - u32 deemphasis; - struct { - u32 data[2]; - u32 bLER; - } rds; - } tuner; - struct { - char sz_data[8]; - u32 remaining_chars; - } chars8; - char c_data12[12]; -}; - -/* HPI_CONTROLX_STRUCTURES */ - -/* Message */ - -/** Used for all HMI variables where max length <= 8 bytes -*/ -struct hpi_controlx_msg_cobranet_data { - u32 hmi_address; - u32 byte_count; - u32 data[2]; -}; - -/** Used for string data, and for packet bridge -*/ -struct hpi_controlx_msg_cobranet_bigdata { - u32 hmi_address; - u32 byte_count; - u8 *pb_data; -#ifndef HPI64BIT - u32 padding; -#endif -}; - -/** Used for PADS control reading of string fields. -*/ -struct hpi_controlx_msg_pad_data { - u32 field; - u32 byte_count; - u8 *pb_data; -#ifndef HPI64BIT - u32 padding; -#endif -}; - -/** Used for generic data -*/ - -struct hpi_controlx_msg_generic { - u32 param1; - u32 param2; -}; - -struct hpi_controlx_msg { - u16 attribute; /* control attribute or property */ - u16 saved_index; - union { - struct hpi_controlx_msg_cobranet_data cobranet_data; - struct hpi_controlx_msg_cobranet_bigdata cobranet_bigdata; - struct hpi_controlx_msg_generic generic; - struct hpi_controlx_msg_pad_data pad_data; - /*struct param_value universal_value; */ - /* nothing extra to send for status read */ - } u; -}; - -/* Response */ -/** -*/ -struct hpi_controlx_res_cobranet_data { - u32 byte_count; - u32 data[2]; -}; - -struct hpi_controlx_res_cobranet_bigdata { - u32 byte_count; -}; - -struct hpi_controlx_res_cobranet_status { - u32 status; - u32 readable_size; - u32 writeable_size; -}; - -struct hpi_controlx_res_generic { - u32 param1; - u32 param2; -}; - -struct hpi_controlx_res { - union { - struct hpi_controlx_res_cobranet_bigdata cobranet_bigdata; - struct hpi_controlx_res_cobranet_data cobranet_data; - struct hpi_controlx_res_cobranet_status cobranet_status; - struct hpi_controlx_res_generic generic; - /*struct param_info universal_info; */ - /*struct param_value universal_value; */ - } u; -}; - -struct hpi_nvmemory_msg { - u16 address; - u16 data; -}; - -struct hpi_nvmemory_res { - u16 size_in_bytes; - u16 data; -}; - -struct hpi_gpio_msg { - u16 bit_index; - u16 bit_data; -}; - -struct hpi_gpio_res { - u16 number_input_bits; - u16 number_output_bits; - u16 bit_data[4]; -}; - -struct hpi_async_msg { - u32 events; - u16 maximum_events; - u16 padding; -}; - -struct hpi_async_res { - union { - struct { - u16 count; - } count; - struct { - u32 events; - u16 number_returned; - u16 padding; - } get; - struct hpi_async_event event; - } u; -}; - -struct hpi_watchdog_msg { - u32 time_ms; -}; - -struct hpi_watchdog_res { - u32 time_ms; -}; - -struct hpi_clock_msg { - u16 hours; - u16 minutes; - u16 seconds; - u16 milli_seconds; -}; - -struct hpi_clock_res { - u16 size_in_bytes; - u16 hours; - u16 minutes; - u16 seconds; - u16 milli_seconds; - u16 padding; -}; - -struct hpi_profile_msg { - u16 bin_index; - u16 padding; -}; - -struct hpi_profile_res_open { - u16 max_profiles; -}; - -struct hpi_profile_res_time { - u32 micro_seconds; - u32 call_count; - u32 max_micro_seconds; - u32 min_micro_seconds; - u16 seconds; -}; - -struct hpi_profile_res_name { - u8 sz_name[32]; -}; - -struct hpi_profile_res { - union { - struct hpi_profile_res_open o; - struct hpi_profile_res_time t; - struct hpi_profile_res_name n; - } u; -}; - -struct hpi_message_header { - u16 size; /* total size in bytes */ - u8 type; /* HPI_TYPE_MESSAGE */ - u8 version; /* message version */ - u16 object; /* HPI_OBJ_* */ - u16 function; /* HPI_SUBSYS_xxx, HPI_ADAPTER_xxx */ - u16 adapter_index; /* the adapter index */ - u16 obj_index; /* */ -}; - -struct hpi_message { - /* following fields must match HPI_MESSAGE_HEADER */ - u16 size; /* total size in bytes */ - u8 type; /* HPI_TYPE_MESSAGE */ - u8 version; /* message version */ - u16 object; /* HPI_OBJ_* */ - u16 function; /* HPI_SUBSYS_xxx, HPI_ADAPTER_xxx */ - u16 adapter_index; /* the adapter index */ - u16 obj_index; /* */ - union { - struct hpi_subsys_msg s; - struct hpi_adapter_msg a; - union hpi_adapterx_msg ax; - struct hpi_stream_msg d; - struct hpi_mixer_msg m; - union hpi_mixerx_msg mx; /* extended mixer; */ - struct hpi_control_msg c; /* mixer control; */ - /* identical to struct hpi_control_msg, - but field naming is improved */ - struct hpi_control_union_msg cu; - struct hpi_controlx_msg cx; /* extended mixer control; */ - struct hpi_nvmemory_msg n; - struct hpi_gpio_msg l; /* digital i/o */ - struct hpi_watchdog_msg w; - struct hpi_clock_msg t; /* dsp time */ - struct hpi_profile_msg p; - struct hpi_async_msg as; - char fixed_size[32]; - } u; -}; - -#define HPI_MESSAGE_SIZE_BY_OBJECT { \ - sizeof(struct hpi_message_header) , /* default, no object type 0 */ \ - sizeof(struct hpi_message_header) + sizeof(struct hpi_subsys_msg),\ - sizeof(struct hpi_message_header) + sizeof(union hpi_adapterx_msg),\ - sizeof(struct hpi_message_header) + sizeof(struct hpi_stream_msg),\ - sizeof(struct hpi_message_header) + sizeof(struct hpi_stream_msg),\ - sizeof(struct hpi_message_header) + sizeof(struct hpi_mixer_msg),\ - sizeof(struct hpi_message_header) , /* no node message */ \ - sizeof(struct hpi_message_header) + sizeof(struct hpi_control_msg),\ - sizeof(struct hpi_message_header) + sizeof(struct hpi_nvmemory_msg),\ - sizeof(struct hpi_message_header) + sizeof(struct hpi_gpio_msg),\ - sizeof(struct hpi_message_header) + sizeof(struct hpi_watchdog_msg),\ - sizeof(struct hpi_message_header) + sizeof(struct hpi_clock_msg),\ - sizeof(struct hpi_message_header) + sizeof(struct hpi_profile_msg),\ - sizeof(struct hpi_message_header) + sizeof(struct hpi_controlx_msg),\ - sizeof(struct hpi_message_header) + sizeof(struct hpi_async_msg) \ -} - -struct hpi_response_header { - u16 size; - u8 type; /* HPI_TYPE_RESPONSE */ - u8 version; /* response version */ - u16 object; /* HPI_OBJ_* */ - u16 function; /* HPI_SUBSYS_xxx, HPI_ADAPTER_xxx */ - u16 error; /* HPI_ERROR_xxx */ - u16 specific_error; /* adapter specific error */ -}; - -struct hpi_response { -/* following fields must match HPI_RESPONSE_HEADER */ - u16 size; - u8 type; /* HPI_TYPE_RESPONSE */ - u8 version; /* response version */ - u16 object; /* HPI_OBJ_* */ - u16 function; /* HPI_SUBSYS_xxx, HPI_ADAPTER_xxx */ - u16 error; /* HPI_ERROR_xxx */ - u16 specific_error; /* adapter specific error */ - union { - struct hpi_subsys_res s; - struct hpi_adapter_res a; - union hpi_adapterx_res ax; - struct hpi_stream_res d; - struct hpi_mixer_res m; - union hpi_mixerx_res mx; /* extended mixer; */ - struct hpi_control_res c; /* mixer control; */ - /* identical to hpi_control_res, but field naming is improved */ - union hpi_control_union_res cu; - struct hpi_controlx_res cx; /* extended mixer control; */ - struct hpi_nvmemory_res n; - struct hpi_gpio_res l; /* digital i/o */ - struct hpi_watchdog_res w; - struct hpi_clock_res t; /* dsp time */ - struct hpi_profile_res p; - struct hpi_async_res as; - u8 bytes[52]; - } u; -}; - -#define HPI_RESPONSE_SIZE_BY_OBJECT { \ - sizeof(struct hpi_response_header) ,/* default, no object type 0 */ \ - sizeof(struct hpi_response_header) + sizeof(struct hpi_subsys_res),\ - sizeof(struct hpi_response_header) + sizeof(union hpi_adapterx_res),\ - sizeof(struct hpi_response_header) + sizeof(struct hpi_stream_res),\ - sizeof(struct hpi_response_header) + sizeof(struct hpi_stream_res),\ - sizeof(struct hpi_response_header) + sizeof(struct hpi_mixer_res),\ - sizeof(struct hpi_response_header) , /* no node response */ \ - sizeof(struct hpi_response_header) + sizeof(struct hpi_control_res),\ - sizeof(struct hpi_response_header) + sizeof(struct hpi_nvmemory_res),\ - sizeof(struct hpi_response_header) + sizeof(struct hpi_gpio_res),\ - sizeof(struct hpi_response_header) + sizeof(struct hpi_watchdog_res),\ - sizeof(struct hpi_response_header) + sizeof(struct hpi_clock_res),\ - sizeof(struct hpi_response_header) + sizeof(struct hpi_profile_res),\ - sizeof(struct hpi_response_header) + sizeof(struct hpi_controlx_res),\ - sizeof(struct hpi_response_header) + sizeof(struct hpi_async_res) \ -} - -/*********************** version 1 message/response *****************************/ -#define HPINET_ETHERNET_DATA_SIZE (1500) -#define HPINET_IP_HDR_SIZE (20) -#define HPINET_IP_DATA_SIZE (HPINET_ETHERNET_DATA_SIZE - HPINET_IP_HDR_SIZE) -#define HPINET_UDP_HDR_SIZE (8) -#define HPINET_UDP_DATA_SIZE (HPINET_IP_DATA_SIZE - HPINET_UDP_HDR_SIZE) -#define HPINET_ASI_HDR_SIZE (2) -#define HPINET_ASI_DATA_SIZE (HPINET_UDP_DATA_SIZE - HPINET_ASI_HDR_SIZE) - -#define HPI_MAX_PAYLOAD_SIZE (HPINET_ASI_DATA_SIZE - 2) - -/* New style message/response, but still V0 compatible */ -struct hpi_msg_adapter_get_info { - struct hpi_message_header h; -}; - -struct hpi_res_adapter_get_info { - struct hpi_response_header h; /*v0 */ - struct hpi_adapter_res p; -}; - -/* padding is so these are same size as v0 hpi_message */ -struct hpi_msg_adapter_query_flash { - struct hpi_message_header h; - u32 offset; - u8 pad_to_version0_size[sizeof(struct hpi_message) - /* V0 res */ - sizeof(struct hpi_message_header) - 1 * sizeof(u32)]; -}; - -/* padding is so these are same size as v0 hpi_response */ -struct hpi_res_adapter_query_flash { - struct hpi_response_header h; - u32 checksum; - u32 length; - u32 version; - u8 pad_to_version0_size[sizeof(struct hpi_response) - /* V0 res */ - sizeof(struct hpi_response_header) - 3 * sizeof(u32)]; -}; - -struct hpi_msg_adapter_start_flash { - struct hpi_message_header h; - u32 offset; - u32 length; - u32 key; - u8 pad_to_version0_size[sizeof(struct hpi_message) - /* V0 res */ - sizeof(struct hpi_message_header) - 3 * sizeof(u32)]; -}; - -struct hpi_res_adapter_start_flash { - struct hpi_response_header h; - u8 pad_to_version0_size[sizeof(struct hpi_response) - /* V0 res */ - sizeof(struct hpi_response_header)]; -}; - -struct hpi_msg_adapter_program_flash_payload { - u32 checksum; - u16 sequence; - u16 length; - u16 offset; /**< offset from start of msg to data */ - u16 unused; - /* ensure sizeof(header + payload) == sizeof(hpi_message_V0) - because old firmware expects data after message of this size */ - u8 pad_to_version0_size[sizeof(struct hpi_message) - /* V0 message */ - sizeof(struct hpi_message_header) - sizeof(u32) - - 4 * sizeof(u16)]; -}; - -struct hpi_msg_adapter_program_flash { - struct hpi_message_header h; - struct hpi_msg_adapter_program_flash_payload p; - u32 data[256]; -}; - -struct hpi_res_adapter_program_flash { - struct hpi_response_header h; - u16 sequence; - u8 pad_to_version0_size[sizeof(struct hpi_response) - /* V0 res */ - sizeof(struct hpi_response_header) - sizeof(u16)]; -}; - -#if 1 -#define hpi_message_header_v1 hpi_message_header -#define hpi_response_header_v1 hpi_response_header -#else -/* V1 headers in Addition to v0 headers */ -struct hpi_message_header_v1 { - struct hpi_message_header h0; -/* struct { -} h1; */ -}; - -struct hpi_response_header_v1 { - struct hpi_response_header h0; - struct { - u16 adapter_index; /* the adapter index */ - u16 obj_index; /* object index */ - } h1; -}; -#endif - -/* STRV HPI Packet */ -struct hpi_msg_strv { - struct hpi_message_header h; - struct hpi_entity strv; -}; - -struct hpi_res_strv { - struct hpi_response_header h; - struct hpi_entity strv; -}; -#define MIN_STRV_PACKET_SIZE sizeof(struct hpi_res_strv) - -struct hpi_msg_payload_v0 { - struct hpi_message_header h; - union { - struct hpi_subsys_msg s; - struct hpi_adapter_msg a; - union hpi_adapterx_msg ax; - struct hpi_stream_msg d; - struct hpi_mixer_msg m; - union hpi_mixerx_msg mx; - struct hpi_control_msg c; - struct hpi_control_union_msg cu; - struct hpi_controlx_msg cx; - struct hpi_nvmemory_msg n; - struct hpi_gpio_msg l; - struct hpi_watchdog_msg w; - struct hpi_clock_msg t; - struct hpi_profile_msg p; - struct hpi_async_msg as; - } u; -}; - -struct hpi_res_payload_v0 { - struct hpi_response_header h; - union { - struct hpi_subsys_res s; - struct hpi_adapter_res a; - union hpi_adapterx_res ax; - struct hpi_stream_res d; - struct hpi_mixer_res m; - union hpi_mixerx_res mx; - struct hpi_control_res c; - union hpi_control_union_res cu; - struct hpi_controlx_res cx; - struct hpi_nvmemory_res n; - struct hpi_gpio_res l; - struct hpi_watchdog_res w; - struct hpi_clock_res t; - struct hpi_profile_res p; - struct hpi_async_res as; - } u; -}; - -union hpi_message_buffer_v1 { - struct hpi_message m0; /* version 0 */ - struct hpi_message_header_v1 h; - unsigned char buf[HPI_MAX_PAYLOAD_SIZE]; -}; - -union hpi_response_buffer_v1 { - struct hpi_response r0; /* version 0 */ - struct hpi_response_header_v1 h; - unsigned char buf[HPI_MAX_PAYLOAD_SIZE]; -}; - -compile_time_assert((sizeof(union hpi_message_buffer_v1) <= - HPI_MAX_PAYLOAD_SIZE), message_buffer_ok); -compile_time_assert((sizeof(union hpi_response_buffer_v1) <= - HPI_MAX_PAYLOAD_SIZE), response_buffer_ok); - -/*////////////////////////////////////////////////////////////////////////// */ -/* declarations for compact control calls */ -struct hpi_control_defn { - u8 type; - u8 channels; - u8 src_node_type; - u8 src_node_index; - u8 dest_node_type; - u8 dest_node_index; -}; - -/*////////////////////////////////////////////////////////////////////////// */ -/* declarations for control caching (internal to HPI<->DSP interaction) */ - -/** A compact representation of (part of) a controls state. -Used for efficient transfer of the control state -between DSP and host or across a network -*/ -struct hpi_control_cache_info { - /** one of HPI_CONTROL_* */ - u8 control_type; - /** The total size of cached information in 32-bit words. */ - u8 size_in32bit_words; - /** The original index of the control on the DSP */ - u16 control_index; -}; - -struct hpi_control_cache_single { - struct hpi_control_cache_info i; - union { - struct { /* volume */ - u16 an_log[2]; - } v; - struct { /* peak meter */ - u16 an_log_peak[2]; - u16 an_logRMS[2]; - } p; - struct { /* channel mode */ - u16 mode; - } m; - struct { /* multiplexer */ - u16 source_node_type; - u16 source_node_index; - } x; - struct { /* level/trim */ - u16 an_log[2]; - } l; - struct { /* tuner - partial caching. - some attributes go to the DSP. */ - u32 freq_ink_hz; - u16 band; - u16 level; - } t; - struct { /* AESEBU rx status */ - u32 error_status; - u32 source; - } aes3rx; - struct { /* AESEBU tx */ - u32 format; - } aes3tx; - struct { /* tone detector */ - u16 state; - } tone; - struct { /* silence detector */ - u32 state; - u32 count; - } silence; - struct { /* sample clock */ - u16 source; - u16 source_index; - u32 sample_rate; - } clk; - struct { /* microphone control */ - u16 state; - } phantom_power; - struct { /* generic control */ - u32 dw1; - u32 dw2; - } g; - } u; -}; - -struct hpi_control_cache_pad { - struct hpi_control_cache_info i; - u32 field_valid_flags; - u8 c_channel[8]; - u8 c_artist[40]; - u8 c_title[40]; - u8 c_comment[200]; - u32 pTY; - u32 pI; - u32 traffic_supported; - u32 traffic_anouncement; -}; - -/*/////////////////////////////////////////////////////////////////////////// */ -/* declarations for 2^N sized FIFO buffer (internal to HPI<->DSP interaction) */ -struct hpi_fifo_buffer { - u32 size; - u32 dSP_index; - u32 host_index; -}; - -#ifndef DISABLE_PRAGMA_PACK1 -#pragma pack(pop) -#endif - -/* skip host side function declarations for DSP - compile and documentation extraction */ - -char hpi_handle_object(const u32 handle); - -void hpi_handle_to_indexes(const u32 handle, u16 *pw_adapter_index, - u16 *pw_object_index); - -u32 hpi_indexes_to_handle(const char c_object, const u16 adapter_index, - const u16 object_index); - -/*////////////////////////////////////////////////////////////////////////// */ - -/* main HPI entry point */ -hpi_handler_func hpi_send_recv; - -/* UDP message */ -void hpi_send_recvUDP(struct hpi_message *phm, struct hpi_response *phr, - const unsigned int timeout); - -/* used in PnP OS/driver */ -u16 hpi_subsys_create_adapter(const struct hpi_hsubsys *ph_subsys, - const struct hpi_resource *p_resource, u16 *pw_adapter_index); - -u16 hpi_subsys_delete_adapter(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index); - -u16 hpi_outstream_host_buffer_get_info(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u8 **pp_buffer, - struct hpi_hostbuffer_status **pp_status); - -u16 hpi_instream_host_buffer_get_info(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, u8 **pp_buffer, - struct hpi_hostbuffer_status **pp_status); - -u16 hpi_adapter_restart(u16 adapter_index); - -/* -The following 3 functions were last declared in header files for -driver 3.10. HPI_ControlQuery() used to be the recommended way -of getting a volume range. Declared here for binary asihpi32.dll -compatibility. -*/ - -void hpi_format_to_msg(struct hpi_msg_format *pMF, - const struct hpi_format *pF); -void hpi_stream_response_to_legacy(struct hpi_stream_res *pSR); - -/*////////////////////////////////////////////////////////////////////////// */ -/* declarations for individual HPI entry points */ -hpi_handler_func HPI_1000; -hpi_handler_func HPI_6000; -hpi_handler_func HPI_6205; -hpi_handler_func HPI_COMMON; - -#endif /* _HPI_INTERNAL_H_ */ diff --git a/pci/asihpi/hpicmn.c b/pci/asihpi/hpicmn.c index 565102cae..7aaa28bd8 100644 --- a/pci/asihpi/hpicmn.c +++ b/pci/asihpi/hpicmn.c @@ -1,643 +1,2 @@ -/****************************************************************************** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -\file hpicmn.c - - Common functions used by hpixxxx.c modules - -(C) Copyright AudioScience Inc. 1998-2003 -*******************************************************************************/ -#define SOURCEFILE_NAME "hpicmn.c" - -#include "hpi_internal.h" -#include "hpidebug.h" -#include "hpicmn.h" - -struct hpi_adapters_list { - struct hpios_spinlock list_lock; - struct hpi_adapter_obj adapter[HPI_MAX_ADAPTERS]; - u16 gw_num_adapters; -}; - -static struct hpi_adapters_list adapters; - -/** -* Given an HPI Message that was sent out and a response that was received, -* validate that the response has the correct fields filled in, -* i.e ObjectType, Function etc -**/ -u16 hpi_validate_response(struct hpi_message *phm, struct hpi_response *phr) -{ - u16 error = 0; - - if ((phr->type != HPI_TYPE_RESPONSE) - || (phr->object != phm->object) - || (phr->function != phm->function)) - error = HPI_ERROR_INVALID_RESPONSE; - - return error; -} - -u16 hpi_add_adapter(struct hpi_adapter_obj *pao) -{ - u16 retval = 0; - /*HPI_ASSERT(pao->wAdapterType); */ - - hpios_alistlock_lock(&adapters); - - if (pao->index >= HPI_MAX_ADAPTERS) { - retval = HPI_ERROR_BAD_ADAPTER_NUMBER; - goto unlock; - } - - if (adapters.adapter[pao->index].adapter_type) { - { - retval = HPI_DUPLICATE_ADAPTER_NUMBER; - goto unlock; - } - } - adapters.adapter[pao->index] = *pao; - hpios_dsplock_init(&adapters.adapter[pao->index]); - adapters.gw_num_adapters++; - -unlock: - hpios_alistlock_un_lock(&adapters); - return retval; -} - -void hpi_delete_adapter(struct hpi_adapter_obj *pao) -{ - memset(pao, 0, sizeof(struct hpi_adapter_obj)); - - hpios_alistlock_lock(&adapters); - adapters.gw_num_adapters--; /* dec the number of adapters */ - hpios_alistlock_un_lock(&adapters); -} - -/** -* FindAdapter returns a pointer to the struct hpi_adapter_obj with -* index wAdapterIndex in an HPI_ADAPTERS_LIST structure. -* -*/ -struct hpi_adapter_obj *hpi_find_adapter(u16 adapter_index) -{ - struct hpi_adapter_obj *pao = NULL; - - if (adapter_index >= HPI_MAX_ADAPTERS) { - HPI_DEBUG_LOG(VERBOSE, "find_adapter invalid index %d ", - adapter_index); - return NULL; - } - - pao = &adapters.adapter[adapter_index]; - if (pao->adapter_type != 0) { - /* - HPI_DEBUG_LOG(VERBOSE, "Found adapter index %d\n", - wAdapterIndex); - */ - return pao; - } else { - /* - HPI_DEBUG_LOG(VERBOSE, "No adapter index %d\n", - wAdapterIndex); - */ - return NULL; - } -} - -/** -* -* wipe an HPI_ADAPTERS_LIST structure. -* -**/ -static void wipe_adapter_list(void - ) -{ - memset(&adapters, 0, sizeof(adapters)); -} - -/** -* SubSysGetAdapters fills awAdapterList in an struct hpi_response structure -* with all adapters in the given HPI_ADAPTERS_LIST. -* -*/ -static void subsys_get_adapters(struct hpi_response *phr) -{ - /* fill in the response adapter array with the position */ - /* identified by the adapter number/index of the adapters in */ - /* this HPI */ - /* i.e. if we have an A120 with it's jumper set to */ - /* Adapter Number 2 then put an Adapter type A120 in the */ - /* array in position 1 */ - /* NOTE: AdapterNumber is 1..N, Index is 0..N-1 */ - - /* input: NONE */ - /* output: wNumAdapters */ - /* awAdapter[] */ - /* */ - - short i; - struct hpi_adapter_obj *pao = NULL; - - HPI_DEBUG_LOG(VERBOSE, "subsys_get_adapters\n"); - - /* for each adapter, place it's type in the position of the array */ - /* corresponding to it's adapter number */ - for (i = 0; i < adapters.gw_num_adapters; i++) { - pao = &adapters.adapter[i]; - if (phr->u.s.aw_adapter_list[pao->index] != 0) { - phr->error = HPI_DUPLICATE_ADAPTER_NUMBER; - phr->specific_error = pao->index; - return; - } - phr->u.s.aw_adapter_list[pao->index] = pao->adapter_type; - } - - phr->u.s.num_adapters = adapters.gw_num_adapters; - phr->error = 0; /* the function completed OK; */ -} - -static unsigned int control_cache_alloc_check(struct hpi_control_cache *pC) -{ - unsigned int i; - int cached = 0; - if (!pC) - return 0; - if ((!pC->init) && (pC->p_cache != NULL) && (pC->control_count) - && (pC->cache_size_in_bytes) - ) { - u32 *p_master_cache; - pC->init = 1; - - p_master_cache = (u32 *)pC->p_cache; - HPI_DEBUG_LOG(VERBOSE, "check %d controls\n", - pC->control_count); - for (i = 0; i < pC->control_count; i++) { - struct hpi_control_cache_info *info = - (struct hpi_control_cache_info *) - p_master_cache; - - if (info->control_type) { - pC->p_info[i] = info; - cached++; - } else - pC->p_info[i] = NULL; - - if (info->size_in32bit_words) - p_master_cache += info->size_in32bit_words; - else - p_master_cache += - sizeof(struct - hpi_control_cache_single) / - sizeof(u32); - - HPI_DEBUG_LOG(VERBOSE, - "cached %d, pinfo %p index %d type %d\n", - cached, pC->p_info[i], info->control_index, - info->control_type); - } - /* - We didn't find anything to cache, so try again later ! - */ - if (!cached) - pC->init = 0; - } - return pC->init; -} - -/** Find a control. -*/ -static short find_control(struct hpi_message *phm, - struct hpi_control_cache *p_cache, struct hpi_control_cache_info **pI, - u16 *pw_control_index) -{ - *pw_control_index = phm->obj_index; - - if (!control_cache_alloc_check(p_cache)) { - HPI_DEBUG_LOG(VERBOSE, - "control_cache_alloc_check() failed. adap%d ci%d\n", - phm->adapter_index, *pw_control_index); - return 0; - } - - *pI = p_cache->p_info[*pw_control_index]; - if (!*pI) { - HPI_DEBUG_LOG(VERBOSE, "uncached adap %d, control %d\n", - phm->adapter_index, *pw_control_index); - return 0; - } else { - HPI_DEBUG_LOG(VERBOSE, "find_control() type %d\n", - (*pI)->control_type); - } - return 1; -} - -/** Used by the kernel driver to figure out if a buffer needs mapping. - */ -short hpi_check_buffer_mapping(struct hpi_control_cache *p_cache, - struct hpi_message *phm, void **p, unsigned int *pN) -{ - *pN = 0; - *p = NULL; - if ((phm->function == HPI_CONTROL_GET_STATE) - && (phm->object == HPI_OBJ_CONTROLEX) - ) { - u16 control_index; - struct hpi_control_cache_info *pI; - - if (!find_control(phm, p_cache, &pI, &control_index)) - return 0; - } - return 0; -} - -/* allow unified treatment of several string fields within struct */ -#define HPICMN_PAD_OFS_AND_SIZE(m) {\ - offsetof(struct hpi_control_cache_pad, m), \ - sizeof(((struct hpi_control_cache_pad *)(NULL))->m) } - -struct pad_ofs_size { - unsigned int offset; - unsigned int field_size; -}; - -static struct pad_ofs_size pad_desc[] = { - HPICMN_PAD_OFS_AND_SIZE(c_channel), /* HPI_PAD_CHANNEL_NAME */ - HPICMN_PAD_OFS_AND_SIZE(c_artist), /* HPI_PAD_ARTIST */ - HPICMN_PAD_OFS_AND_SIZE(c_title), /* HPI_PAD_TITLE */ - HPICMN_PAD_OFS_AND_SIZE(c_comment), /* HPI_PAD_COMMENT */ -}; - -/** CheckControlCache checks the cache and fills the struct hpi_response - * accordingly. It returns one if a cache hit occurred, zero otherwise. - */ -short hpi_check_control_cache(struct hpi_control_cache *p_cache, - struct hpi_message *phm, struct hpi_response *phr) -{ - short found = 1; - u16 control_index; - struct hpi_control_cache_info *pI; - struct hpi_control_cache_single *pC; - struct hpi_control_cache_pad *p_pad; - - if (!find_control(phm, p_cache, &pI, &control_index)) - return 0; - - phr->error = 0; - - /* pC is the default cached control strucure. May be cast to - something else in the following switch statement. - */ - pC = (struct hpi_control_cache_single *)pI; - p_pad = (struct hpi_control_cache_pad *)pI; - - switch (pI->control_type) { - - case HPI_CONTROL_METER: - if (phm->u.c.attribute == HPI_METER_PEAK) { - phr->u.c.an_log_value[0] = pC->u.p.an_log_peak[0]; - phr->u.c.an_log_value[1] = pC->u.p.an_log_peak[1]; - } else if (phm->u.c.attribute == HPI_METER_RMS) { - phr->u.c.an_log_value[0] = pC->u.p.an_logRMS[0]; - phr->u.c.an_log_value[1] = pC->u.p.an_logRMS[1]; - } else - found = 0; - break; - case HPI_CONTROL_VOLUME: - if (phm->u.c.attribute == HPI_VOLUME_GAIN) { - phr->u.c.an_log_value[0] = pC->u.v.an_log[0]; - phr->u.c.an_log_value[1] = pC->u.v.an_log[1]; - } else - found = 0; - break; - case HPI_CONTROL_MULTIPLEXER: - if (phm->u.c.attribute == HPI_MULTIPLEXER_SOURCE) { - phr->u.c.param1 = pC->u.x.source_node_type; - phr->u.c.param2 = pC->u.x.source_node_index; - } else { - found = 0; - } - break; - case HPI_CONTROL_CHANNEL_MODE: - if (phm->u.c.attribute == HPI_CHANNEL_MODE_MODE) - phr->u.c.param1 = pC->u.m.mode; - else - found = 0; - break; - case HPI_CONTROL_LEVEL: - if (phm->u.c.attribute == HPI_LEVEL_GAIN) { - phr->u.c.an_log_value[0] = pC->u.l.an_log[0]; - phr->u.c.an_log_value[1] = pC->u.l.an_log[1]; - } else - found = 0; - break; - case HPI_CONTROL_TUNER: - { - struct hpi_control_cache_single *pCT = - (struct hpi_control_cache_single *)pI; - if (phm->u.c.attribute == HPI_TUNER_FREQ) - phr->u.c.param1 = pCT->u.t.freq_ink_hz; - else if (phm->u.c.attribute == HPI_TUNER_BAND) - phr->u.c.param1 = pCT->u.t.band; - else if ((phm->u.c.attribute == HPI_TUNER_LEVEL) - && (phm->u.c.param1 == - HPI_TUNER_LEVEL_AVERAGE)) - phr->u.c.param1 = pCT->u.t.level; - else - found = 0; - } - break; - case HPI_CONTROL_AESEBU_RECEIVER: - if (phm->u.c.attribute == HPI_AESEBURX_ERRORSTATUS) - phr->u.c.param1 = pC->u.aes3rx.error_status; - else if (phm->u.c.attribute == HPI_AESEBURX_FORMAT) - phr->u.c.param1 = pC->u.aes3rx.source; - else - found = 0; - break; - case HPI_CONTROL_AESEBU_TRANSMITTER: - if (phm->u.c.attribute == HPI_AESEBUTX_FORMAT) - phr->u.c.param1 = pC->u.aes3tx.format; - else - found = 0; - break; - case HPI_CONTROL_TONEDETECTOR: - if (phm->u.c.attribute == HPI_TONEDETECTOR_STATE) - phr->u.c.param1 = pC->u.tone.state; - else - found = 0; - break; - case HPI_CONTROL_SILENCEDETECTOR: - if (phm->u.c.attribute == HPI_SILENCEDETECTOR_STATE) { - phr->u.c.param1 = pC->u.silence.state; - phr->u.c.param2 = pC->u.silence.count; - } else - found = 0; - break; - case HPI_CONTROL_MICROPHONE: - if (phm->u.c.attribute == HPI_MICROPHONE_PHANTOM_POWER) - phr->u.c.param1 = pC->u.phantom_power.state; - else - found = 0; - break; - case HPI_CONTROL_SAMPLECLOCK: - if (phm->u.c.attribute == HPI_SAMPLECLOCK_SOURCE) - phr->u.c.param1 = pC->u.clk.source; - else if (phm->u.c.attribute == HPI_SAMPLECLOCK_SOURCE_INDEX) { - if (pC->u.clk.source_index == - HPI_ERROR_ILLEGAL_CACHE_VALUE) { - phr->u.c.param1 = 0; - phr->error = HPI_ERROR_INVALID_OPERATION; - } else - phr->u.c.param1 = pC->u.clk.source_index; - } else if (phm->u.c.attribute == HPI_SAMPLECLOCK_SAMPLERATE) - phr->u.c.param1 = pC->u.clk.sample_rate; - else - found = 0; - break; - case HPI_CONTROL_PAD: - - if (!(p_pad->field_valid_flags & (1 << - HPI_CTL_ATTR_INDEX(phm->u.c. - attribute)))) { - phr->error = HPI_ERROR_INVALID_CONTROL_ATTRIBUTE; - break; - } - - if (phm->u.c.attribute == HPI_PAD_PROGRAM_ID) - phr->u.c.param1 = p_pad->pI; - else if (phm->u.c.attribute == HPI_PAD_PROGRAM_TYPE) - phr->u.c.param1 = p_pad->pTY; - else { - unsigned int index = - HPI_CTL_ATTR_INDEX(phm->u.c.attribute) - 1; - unsigned int offset = phm->u.c.param1; - unsigned int pad_string_len, field_size; - char *pad_string; - unsigned int tocopy; - - HPI_DEBUG_LOG(VERBOSE, "PADS HPI_PADS_ %d\n", - phm->u.c.attribute); - - if (index > ARRAY_SIZE(pad_desc) - 1) { - phr->error = - HPI_ERROR_INVALID_CONTROL_ATTRIBUTE; - break; - } - - pad_string = ((char *)p_pad) + pad_desc[index].offset; - field_size = pad_desc[index].field_size; - /* Ensure null terminator */ - pad_string[field_size - 1] = 0; - - pad_string_len = strlen(pad_string) + 1; - - if (offset > pad_string_len) { - phr->error = HPI_ERROR_INVALID_CONTROL_VALUE; - break; - } - - tocopy = pad_string_len - offset; - if (tocopy > sizeof(phr->u.cu.chars8.sz_data)) - tocopy = sizeof(phr->u.cu.chars8.sz_data); - - HPI_DEBUG_LOG(VERBOSE, - "PADS memcpy(%d), offset %d \n", tocopy, - offset); - memcpy(phr->u.cu.chars8.sz_data, &pad_string[offset], - tocopy); - - phr->u.cu.chars8.remaining_chars = - pad_string_len - offset - tocopy; - } - break; - default: - found = 0; - break; - } - - if (found) - HPI_DEBUG_LOG(VERBOSE, - "cached adap %d, ctl %d, type %d, attr %d\n", - phm->adapter_index, pI->control_index, - pI->control_type, phm->u.c.attribute); - else - HPI_DEBUG_LOG(VERBOSE, - "uncached adap %d, ctl %d, ctl type %d\n", - phm->adapter_index, pI->control_index, - pI->control_type); - - if (found) - phr->size = - sizeof(struct hpi_response_header) + - sizeof(struct hpi_control_res); - - return found; -} - -/** Updates the cache with Set values. - -Only update if no error. -Volume and Level return the limited values in the response, so use these -Multiplexer does so use sent values -*/ -void hpi_sync_control_cache(struct hpi_control_cache *p_cache, - struct hpi_message *phm, struct hpi_response *phr) -{ - u16 control_index; - struct hpi_control_cache_single *pC; - struct hpi_control_cache_info *pI; - - if (!find_control(phm, p_cache, &pI, &control_index)) - return; - - /* pC is the default cached control strucure. - May be cast to something else in the following switch statement. - */ - pC = (struct hpi_control_cache_single *)pI; - - switch (pI->control_type) { - case HPI_CONTROL_VOLUME: - if (phm->u.c.attribute == HPI_VOLUME_GAIN) { - pC->u.v.an_log[0] = phr->u.c.an_log_value[0]; - pC->u.v.an_log[1] = phr->u.c.an_log_value[1]; - } - break; - case HPI_CONTROL_MULTIPLEXER: - /* mux does not return its setting on Set command. */ - if (phr->error) - return; - if (phm->u.c.attribute == HPI_MULTIPLEXER_SOURCE) { - pC->u.x.source_node_type = (u16)phm->u.c.param1; - pC->u.x.source_node_index = (u16)phm->u.c.param2; - } - break; - case HPI_CONTROL_CHANNEL_MODE: - /* mode does not return its setting on Set command. */ - if (phr->error) - return; - if (phm->u.c.attribute == HPI_CHANNEL_MODE_MODE) - pC->u.m.mode = (u16)phm->u.c.param1; - break; - case HPI_CONTROL_LEVEL: - if (phm->u.c.attribute == HPI_LEVEL_GAIN) { - pC->u.v.an_log[0] = phr->u.c.an_log_value[0]; - pC->u.v.an_log[1] = phr->u.c.an_log_value[1]; - } - break; - case HPI_CONTROL_MICROPHONE: - if (phm->u.c.attribute == HPI_MICROPHONE_PHANTOM_POWER) - pC->u.phantom_power.state = (u16)phm->u.c.param1; - break; - case HPI_CONTROL_AESEBU_TRANSMITTER: - if (phr->error) - return; - if (phm->u.c.attribute == HPI_AESEBUTX_FORMAT) - pC->u.aes3tx.format = phm->u.c.param1; - break; - case HPI_CONTROL_AESEBU_RECEIVER: - if (phr->error) - return; - if (phm->u.c.attribute == HPI_AESEBURX_FORMAT) - pC->u.aes3rx.source = phm->u.c.param1; - break; - case HPI_CONTROL_SAMPLECLOCK: - if (phr->error) - return; - if (phm->u.c.attribute == HPI_SAMPLECLOCK_SOURCE) - pC->u.clk.source = (u16)phm->u.c.param1; - else if (phm->u.c.attribute == HPI_SAMPLECLOCK_SOURCE_INDEX) - pC->u.clk.source_index = (u16)phm->u.c.param1; - else if (phm->u.c.attribute == HPI_SAMPLECLOCK_SAMPLERATE) - pC->u.clk.sample_rate = phm->u.c.param1; - break; - default: - break; - } -} - -struct hpi_control_cache *hpi_alloc_control_cache(const u32 - number_of_controls, const u32 size_in_bytes, - struct hpi_control_cache_info *pDSP_control_buffer) -{ - struct hpi_control_cache *p_cache = - kmalloc(sizeof(*p_cache), GFP_KERNEL); - p_cache->cache_size_in_bytes = size_in_bytes; - p_cache->control_count = number_of_controls; - p_cache->p_cache = - (struct hpi_control_cache_single *)pDSP_control_buffer; - p_cache->init = 0; - p_cache->p_info = - kmalloc(sizeof(*p_cache->p_info) * p_cache->control_count, - GFP_KERNEL); - return p_cache; -} - -void hpi_free_control_cache(struct hpi_control_cache *p_cache) -{ - if ((p_cache->init) && (p_cache->p_info)) { - kfree(p_cache->p_info); - p_cache->p_info = NULL; - p_cache->init = 0; - kfree(p_cache); - } -} - -static void subsys_message(struct hpi_message *phm, struct hpi_response *phr) -{ - - switch (phm->function) { - case HPI_SUBSYS_OPEN: - case HPI_SUBSYS_CLOSE: - case HPI_SUBSYS_DRIVER_UNLOAD: - phr->error = 0; - break; - case HPI_SUBSYS_DRIVER_LOAD: - wipe_adapter_list(); - hpios_alistlock_init(&adapters); - phr->error = 0; - break; - case HPI_SUBSYS_GET_INFO: - subsys_get_adapters(phr); - break; - case HPI_SUBSYS_CREATE_ADAPTER: - case HPI_SUBSYS_DELETE_ADAPTER: - phr->error = 0; - break; - default: - phr->error = HPI_ERROR_INVALID_FUNC; - break; - } -} - -void HPI_COMMON(struct hpi_message *phm, struct hpi_response *phr) -{ - switch (phm->type) { - case HPI_TYPE_MESSAGE: - switch (phm->object) { - case HPI_OBJ_SUBSYSTEM: - subsys_message(phm, phr); - break; - } - break; - - default: - phr->error = HPI_ERROR_INVALID_TYPE; - break; - } -} +#include "adriver.h" +#include "../../alsa-kernel/pci/asihpi/hpicmn.c" diff --git a/pci/asihpi/hpicmn.h b/pci/asihpi/hpicmn.h deleted file mode 100644 index 6229022f5..000000000 --- a/pci/asihpi/hpicmn.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*/ - -struct hpi_adapter_obj { - struct hpi_pci pci; /* PCI info - bus#,dev#,address etc */ - u16 adapter_type; /* ASI6701 etc */ - u16 index; /* */ - u16 open; /* =1 when adapter open */ - u16 mixer_open; - - struct hpios_spinlock dsp_lock; - - u16 dsp_crashed; - u16 has_control_cache; - void *priv; -}; - -struct hpi_control_cache { - u32 init; /**< indicates whether the - structures are initialized */ - u32 control_count; - u32 cache_size_in_bytes; - struct hpi_control_cache_info - **p_info; /**< pointer to allocated memory of - lookup pointers. */ - struct hpi_control_cache_single - *p_cache; /**< pointer to DSP's control cache. */ -}; - -struct hpi_adapter_obj *hpi_find_adapter(u16 adapter_index); -u16 hpi_add_adapter(struct hpi_adapter_obj *pao); - -void hpi_delete_adapter(struct hpi_adapter_obj *pao); - -short hpi_check_control_cache(struct hpi_control_cache *pC, - struct hpi_message *phm, struct hpi_response *phr); -struct hpi_control_cache *hpi_alloc_control_cache(const u32 - number_of_controls, const u32 size_in_bytes, - struct hpi_control_cache_info - *pDSP_control_buffer); -void hpi_free_control_cache(struct hpi_control_cache *p_cache); - -void hpi_sync_control_cache(struct hpi_control_cache *pC, - struct hpi_message *phm, struct hpi_response *phr); -u16 hpi_validate_response(struct hpi_message *phm, struct hpi_response *phr); -short hpi_check_buffer_mapping(struct hpi_control_cache *p_cache, - struct hpi_message *phm, void **p, unsigned int *pN); diff --git a/pci/asihpi/hpidebug.c b/pci/asihpi/hpidebug.c index 4cd85a401..cc2766a34 100644 --- a/pci/asihpi/hpidebug.c +++ b/pci/asihpi/hpidebug.c @@ -1,225 +1,2 @@ -/************************************************************************ - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Debug macro translation. - -************************************************************************/ - -#include "hpi_internal.h" -#include "hpidebug.h" - -/* Debug level; 0 quiet; 1 informative, 2 debug, 3 verbose debug. */ -int hpi_debug_level = HPI_DEBUG_LEVEL_DEFAULT; - -void hpi_debug_init(void) -{ - printk(KERN_INFO "debug start\n"); -} - -int hpi_debug_level_set(int level) -{ - int old_level; - - old_level = hpi_debug_level; - hpi_debug_level = level; - return old_level; -} - -int hpi_debug_level_get(void) -{ - return hpi_debug_level; -} - -#ifdef HPIOS_DEBUG_PRINT -/* implies OS has no printf-like function */ -#include <stdarg.h> - -void hpi_debug_printf(char *fmt, ...) -{ - va_list arglist; - char buffer[128]; - - va_start(arglist, fmt); - - if (buffer[0]) - HPIOS_DEBUG_PRINT(buffer); - va_end(arglist); -} -#endif - -struct treenode { - void *array; - unsigned int num_elements; -}; - -#define make_treenode_from_array(nodename, array) \ -static void *tmp_strarray_##nodename[] = array; \ -static struct treenode nodename = { \ - &tmp_strarray_##nodename, \ - ARRAY_SIZE(tmp_strarray_##nodename) \ -}; - -#define get_treenode_elem(node_ptr, idx, type) \ - (&(*((type *)(node_ptr)->array)[idx])) - -make_treenode_from_array(hpi_control_type_strings, HPI_CONTROL_TYPE_STRINGS) - - make_treenode_from_array(hpi_subsys_strings, HPI_SUBSYS_STRINGS) - make_treenode_from_array(hpi_adapter_strings, HPI_ADAPTER_STRINGS) - make_treenode_from_array(hpi_istream_strings, HPI_ISTREAM_STRINGS) - make_treenode_from_array(hpi_ostream_strings, HPI_OSTREAM_STRINGS) - make_treenode_from_array(hpi_mixer_strings, HPI_MIXER_STRINGS) - make_treenode_from_array(hpi_node_strings, - { - "NODE is invalid object"}) - - make_treenode_from_array(hpi_control_strings, HPI_CONTROL_STRINGS) - make_treenode_from_array(hpi_nvmemory_strings, HPI_OBJ_STRINGS) - make_treenode_from_array(hpi_digitalio_strings, HPI_DIGITALIO_STRINGS) - make_treenode_from_array(hpi_watchdog_strings, HPI_WATCHDOG_STRINGS) - make_treenode_from_array(hpi_clock_strings, HPI_CLOCK_STRINGS) - make_treenode_from_array(hpi_profile_strings, HPI_PROFILE_STRINGS) - make_treenode_from_array(hpi_asyncevent_strings, HPI_ASYNCEVENT_STRINGS) -#define HPI_FUNCTION_STRINGS \ -{ \ - &hpi_subsys_strings,\ - &hpi_adapter_strings,\ - &hpi_ostream_strings,\ - &hpi_istream_strings,\ - &hpi_mixer_strings,\ - &hpi_node_strings,\ - &hpi_control_strings,\ - &hpi_nvmemory_strings,\ - &hpi_digitalio_strings,\ - &hpi_watchdog_strings,\ - &hpi_clock_strings,\ - &hpi_profile_strings,\ - &hpi_control_strings, \ - &hpi_asyncevent_strings \ -}; - make_treenode_from_array(hpi_function_strings, HPI_FUNCTION_STRINGS) - - compile_time_assert(HPI_OBJ_MAXINDEX == 14, obj_list_doesnt_match); - -static char *hpi_function_string(unsigned int function) -{ - unsigned int object; - struct treenode *tmp; - - object = function / HPI_OBJ_FUNCTION_SPACING; - function = function - object * HPI_OBJ_FUNCTION_SPACING; - - if (object == 0 || object == HPI_OBJ_NODE - || object > hpi_function_strings.num_elements) - return "invalid object"; - - tmp = get_treenode_elem(&hpi_function_strings, object - 1, - struct treenode *); - - if (function == 0 || function > tmp->num_elements) - return "invalid function"; - - return get_treenode_elem(tmp, function - 1, char *); -} - -void hpi_debug_message(struct hpi_message *phm, char *sz_fileline) -{ - if (phm) { - if ((phm->object <= HPI_OBJ_MAXINDEX) && phm->object) { - u16 index = 0; - u16 attrib = 0; - int is_control = 0; - - index = phm->obj_index; - switch (phm->object) { - case HPI_OBJ_ADAPTER: - case HPI_OBJ_PROFILE: - break; - case HPI_OBJ_MIXER: - if (phm->function == - HPI_MIXER_GET_CONTROL_BY_INDEX) - index = phm->u.m.control_index; - break; - case HPI_OBJ_OSTREAM: - case HPI_OBJ_ISTREAM: - break; - - case HPI_OBJ_CONTROLEX: - case HPI_OBJ_CONTROL: - if (phm->version == 1) - attrib = HPI_CTL_ATTR(UNIVERSAL, 1); - else - attrib = phm->u.c.attribute; - is_control = 1; - break; - default: - break; - } - - if (is_control && (attrib & 0xFF00)) { - int control_type = (attrib & 0xFF00) >> 8; - int attr_index = HPI_CTL_ATTR_INDEX(attrib); - /* note the KERN facility level - is in szFileline already */ - printk("%s adapter %d %s " - "ctrl_index x%04x %s %d\n", - sz_fileline, phm->adapter_index, - hpi_function_string(phm->function), - index, - get_treenode_elem - (&hpi_control_type_strings, - control_type, char *), - attr_index); - - } else - printk("%s adapter %d %s " - "idx x%04x attr x%04x \n", - sz_fileline, phm->adapter_index, - hpi_function_string(phm->function), - index, attrib); - } else { - printk("adap=%d, invalid obj=%d, func=0x%x\n", - phm->adapter_index, phm->object, - phm->function); - } - } else - printk(KERN_ERR - "NULL message pointer to hpi_debug_message!\n"); -} - -void hpi_debug_data(u16 *pdata, u32 len) -{ - u32 i; - int j; - int k; - int lines; - int cols = 8; - - lines = (len + cols - 1) / cols; - if (lines > 8) - lines = 8; - - for (i = 0, j = 0; j < lines; j++) { - printk(KERN_DEBUG "%p:", (pdata + i)); - - for (k = 0; k < cols && i < len; i++, k++) - printk("%s%04x", k == 0 ? "" : " ", pdata[i]); - - printk("\n"); - } -} +#include "adriver.h" +#include "../../alsa-kernel/pci/asihpi/hpidebug.c" diff --git a/pci/asihpi/hpidebug.h b/pci/asihpi/hpidebug.h deleted file mode 100644 index 44dccadcc..000000000 --- a/pci/asihpi/hpidebug.h +++ /dev/null @@ -1,385 +0,0 @@ -/***************************************************************************** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Debug macros. - -*****************************************************************************/ - -#ifndef _HPIDEBUG_H -#define _HPIDEBUG_H - -#include "hpi_internal.h" - -/* Define debugging levels. */ -enum { HPI_DEBUG_LEVEL_ERROR = 0, /* always log errors */ - HPI_DEBUG_LEVEL_WARNING = 1, - HPI_DEBUG_LEVEL_NOTICE = 2, - HPI_DEBUG_LEVEL_INFO = 3, - HPI_DEBUG_LEVEL_DEBUG = 4, - HPI_DEBUG_LEVEL_VERBOSE = 5 /* same printk level as DEBUG */ -}; - -#define HPI_DEBUG_LEVEL_DEFAULT HPI_DEBUG_LEVEL_NOTICE - -/* an OS can define an extra flag string that is appended to - the start of each message, eg see hpios_linux.h */ - -#ifdef SOURCEFILE_NAME -#define FILE_LINE SOURCEFILE_NAME ":" __stringify(__LINE__) " " -#else -#define FILE_LINE __FILE__ ":" __stringify(__LINE__) " " -#endif - -#if defined(HPI_DEBUG) && defined(_WINDOWS) -#define HPI_DEBUGBREAK() debug_break() -#else -#define HPI_DEBUGBREAK() -#endif - -#define HPI_DEBUG_ASSERT(expression) \ - do { \ - if (!(expression)) {\ - printk(KERN_ERR FILE_LINE\ - "ASSERT " __stringify(expression));\ - HPI_DEBUGBREAK();\ - } \ - } while (0) - -#define HPI_DEBUG_LOG(level, ...) \ - do { \ - if (hpi_debug_level >= HPI_DEBUG_LEVEL_##level) { \ - printk(HPI_DEBUG_FLAG_##level \ - FILE_LINE __VA_ARGS__); \ - } \ - } while (0) - -void hpi_debug_init(void); -int hpi_debug_level_set(int level); -int hpi_debug_level_get(void); -/* needed by Linux driver for dynamic debug level changes */ -extern int hpi_debug_level; - -void hpi_debug_message(struct hpi_message *phm, char *sz_fileline); - -void hpi_debug_data(u16 *pdata, u32 len); - -#define HPI_DEBUG_DATA(pdata, len) \ - do { \ - if (hpi_debug_level >= HPI_DEBUG_LEVEL_VERBOSE) \ - hpi_debug_data(pdata, len); \ - } while (0) - -#define HPI_DEBUG_MESSAGE(level, phm) \ - do { \ - if (hpi_debug_level >= HPI_DEBUG_LEVEL_##level) { \ - hpi_debug_message(phm,HPI_DEBUG_FLAG_##level \ - FILE_LINE __stringify(level));\ - } \ - } while (0) - -#define HPI_DEBUG_RESPONSE(phr) \ - do { \ - if ((hpi_debug_level >= HPI_DEBUG_LEVEL_DEBUG) && (phr->error))\ - HPI_DEBUG_LOG(ERROR, \ - "HPI response - error# %d\n", \ - phr->error); \ - else if (hpi_debug_level >= HPI_DEBUG_LEVEL_VERBOSE) \ - HPI_DEBUG_LOG(VERBOSE, "HPI response OK\n");\ - } while (0) - -#ifndef compile_time_assert -#define compile_time_assert(cond, msg) \ - typedef char msg[(cond) ? 1 : -1] -#endif - - /* check that size is exactly some number */ -#define function_count_check(sym, size) \ - compile_time_assert((sym##_FUNCTION_COUNT) == (size),\ - strings_match_defs_##sym) - -/* These strings should be generated using a macro which defines - the corresponding symbol values. */ -#define HPI_OBJ_STRINGS \ -{ \ - "HPI_OBJ_SUBSYSTEM", \ - "HPI_OBJ_ADAPTER", \ - "HPI_OBJ_OSTREAM", \ - "HPI_OBJ_ISTREAM", \ - "HPI_OBJ_MIXER", \ - "HPI_OBJ_NODE", \ - "HPI_OBJ_CONTROL", \ - "HPI_OBJ_NVMEMORY", \ - "HPI_OBJ_DIGITALIO", \ - "HPI_OBJ_WATCHDOG", \ - "HPI_OBJ_CLOCK", \ - "HPI_OBJ_PROFILE", \ - "HPI_OBJ_CONTROLEX" \ -} - -#define HPI_SUBSYS_STRINGS \ -{ \ - "HPI_SUBSYS_OPEN", \ - "HPI_SUBSYS_GET_VERSION", \ - "HPI_SUBSYS_GET_INFO", \ - "HPI_SUBSYS_FIND_ADAPTERS", \ - "HPI_SUBSYS_CREATE_ADAPTER",\ - "HPI_SUBSYS_CLOSE", \ - "HPI_SUBSYS_DELETE_ADAPTER", \ - "HPI_SUBSYS_DRIVER_LOAD", \ - "HPI_SUBSYS_DRIVER_UNLOAD", \ - "HPI_SUBSYS_READ_PORT_8", \ - "HPI_SUBSYS_WRITE_PORT_8", \ - "HPI_SUBSYS_GET_NUM_ADAPTERS",\ - "HPI_SUBSYS_GET_ADAPTER", \ - "HPI_SUBSYS_SET_NETWORK_INTERFACE"\ -} -function_count_check(HPI_SUBSYS, 14); - -#define HPI_ADAPTER_STRINGS \ -{ \ - "HPI_ADAPTER_OPEN", \ - "HPI_ADAPTER_CLOSE", \ - "HPI_ADAPTER_GET_INFO", \ - "HPI_ADAPTER_GET_ASSERT", \ - "HPI_ADAPTER_TEST_ASSERT", \ - "HPI_ADAPTER_SET_MODE", \ - "HPI_ADAPTER_GET_MODE", \ - "HPI_ADAPTER_ENABLE_CAPABILITY",\ - "HPI_ADAPTER_SELFTEST", \ - "HPI_ADAPTER_FIND_OBJECT", \ - "HPI_ADAPTER_QUERY_FLASH", \ - "HPI_ADAPTER_START_FLASH", \ - "HPI_ADAPTER_PROGRAM_FLASH", \ - "HPI_ADAPTER_SET_PROPERTY", \ - "HPI_ADAPTER_GET_PROPERTY", \ - "HPI_ADAPTER_ENUM_PROPERTY", \ - "HPI_ADAPTER_MODULE_INFO", \ - "HPI_ADAPTER_DEBUG_READ" \ -} - -function_count_check(HPI_ADAPTER, 18); - -#define HPI_OSTREAM_STRINGS \ -{ \ - "HPI_OSTREAM_OPEN", \ - "HPI_OSTREAM_CLOSE", \ - "HPI_OSTREAM_WRITE", \ - "HPI_OSTREAM_START", \ - "HPI_OSTREAM_STOP", \ - "HPI_OSTREAM_RESET", \ - "HPI_OSTREAM_GET_INFO", \ - "HPI_OSTREAM_QUERY_FORMAT", \ - "HPI_OSTREAM_DATA", \ - "HPI_OSTREAM_SET_VELOCITY", \ - "HPI_OSTREAM_SET_PUNCHINOUT", \ - "HPI_OSTREAM_SINEGEN", \ - "HPI_OSTREAM_ANC_RESET", \ - "HPI_OSTREAM_ANC_GET_INFO", \ - "HPI_OSTREAM_ANC_READ", \ - "HPI_OSTREAM_SET_TIMESCALE",\ - "HPI_OSTREAM_SET_FORMAT", \ - "HPI_OSTREAM_HOSTBUFFER_ALLOC", \ - "HPI_OSTREAM_HOSTBUFFER_FREE", \ - "HPI_OSTREAM_GROUP_ADD",\ - "HPI_OSTREAM_GROUP_GETMAP", \ - "HPI_OSTREAM_GROUP_RESET", \ - "HPI_OSTREAM_HOSTBUFFER_GET_INFO", \ - "HPI_OSTREAM_WAIT_START", \ -} -function_count_check(HPI_OSTREAM, 24); - -#define HPI_ISTREAM_STRINGS \ -{ \ - "HPI_ISTREAM_OPEN", \ - "HPI_ISTREAM_CLOSE", \ - "HPI_ISTREAM_SET_FORMAT", \ - "HPI_ISTREAM_READ", \ - "HPI_ISTREAM_START", \ - "HPI_ISTREAM_STOP", \ - "HPI_ISTREAM_RESET", \ - "HPI_ISTREAM_GET_INFO", \ - "HPI_ISTREAM_QUERY_FORMAT", \ - "HPI_ISTREAM_ANC_RESET", \ - "HPI_ISTREAM_ANC_GET_INFO", \ - "HPI_ISTREAM_ANC_WRITE", \ - "HPI_ISTREAM_HOSTBUFFER_ALLOC",\ - "HPI_ISTREAM_HOSTBUFFER_FREE", \ - "HPI_ISTREAM_GROUP_ADD", \ - "HPI_ISTREAM_GROUP_GETMAP", \ - "HPI_ISTREAM_GROUP_RESET", \ - "HPI_ISTREAM_HOSTBUFFER_GET_INFO", \ - "HPI_ISTREAM_WAIT_START", \ -} -function_count_check(HPI_ISTREAM, 19); - -#define HPI_MIXER_STRINGS \ -{ \ - "HPI_MIXER_OPEN", \ - "HPI_MIXER_CLOSE", \ - "HPI_MIXER_GET_INFO", \ - "HPI_MIXER_GET_NODE_INFO", \ - "HPI_MIXER_GET_CONTROL", \ - "HPI_MIXER_SET_CONNECTION", \ - "HPI_MIXER_GET_CONNECTIONS", \ - "HPI_MIXER_GET_CONTROL_BY_INDEX", \ - "HPI_MIXER_GET_CONTROL_ARRAY_BY_INDEX", \ - "HPI_MIXER_GET_CONTROL_MULTIPLE_VALUES", \ - "HPI_MIXER_STORE", \ -} -function_count_check(HPI_MIXER, 11); - -#define HPI_CONTROL_STRINGS \ -{ \ - "HPI_CONTROL_GET_INFO", \ - "HPI_CONTROL_GET_STATE", \ - "HPI_CONTROL_SET_STATE" \ -} -function_count_check(HPI_CONTROL, 3); - -#define HPI_NVMEMORY_STRINGS \ -{ \ - "HPI_NVMEMORY_OPEN", \ - "HPI_NVMEMORY_READ_BYTE", \ - "HPI_NVMEMORY_WRITE_BYTE" \ -} -function_count_check(HPI_NVMEMORY, 3); - -#define HPI_DIGITALIO_STRINGS \ -{ \ - "HPI_GPIO_OPEN", \ - "HPI_GPIO_READ_BIT", \ - "HPI_GPIO_WRITE_BIT", \ - "HPI_GPIO_READ_ALL", \ - "HPI_GPIO_WRITE_STATUS"\ -} -function_count_check(HPI_GPIO, 5); - -#define HPI_WATCHDOG_STRINGS \ -{ \ - "HPI_WATCHDOG_OPEN", \ - "HPI_WATCHDOG_SET_TIME", \ - "HPI_WATCHDOG_PING" \ -} - -#define HPI_CLOCK_STRINGS \ -{ \ - "HPI_CLOCK_OPEN", \ - "HPI_CLOCK_SET_TIME", \ - "HPI_CLOCK_GET_TIME" \ -} - -#define HPI_PROFILE_STRINGS \ -{ \ - "HPI_PROFILE_OPEN_ALL", \ - "HPI_PROFILE_START_ALL", \ - "HPI_PROFILE_STOP_ALL", \ - "HPI_PROFILE_GET", \ - "HPI_PROFILE_GET_IDLECOUNT", \ - "HPI_PROFILE_GET_NAME", \ - "HPI_PROFILE_GET_UTILIZATION" \ -} -function_count_check(HPI_PROFILE, 7); - -#define HPI_ASYNCEVENT_STRINGS \ -{ \ - "HPI_ASYNCEVENT_OPEN",\ - "HPI_ASYNCEVENT_CLOSE ",\ - "HPI_ASYNCEVENT_WAIT",\ - "HPI_ASYNCEVENT_GETCOUNT",\ - "HPI_ASYNCEVENT_GET",\ - "HPI_ASYNCEVENT_SENDEVENTS"\ -} -function_count_check(HPI_ASYNCEVENT, 6); - -#define HPI_CONTROL_TYPE_STRINGS \ -{ \ - "null control", \ - "HPI_CONTROL_CONNECTION", \ - "HPI_CONTROL_VOLUME", \ - "HPI_CONTROL_METER", \ - "HPI_CONTROL_MUTE", \ - "HPI_CONTROL_MULTIPLEXER", \ - "HPI_CONTROL_AESEBU_TRANSMITTER", \ - "HPI_CONTROL_AESEBU_RECEIVER", \ - "HPI_CONTROL_LEVEL", \ - "HPI_CONTROL_TUNER", \ - "HPI_CONTROL_ONOFFSWITCH", \ - "HPI_CONTROL_VOX", \ - "HPI_CONTROL_AES18_TRANSMITTER", \ - "HPI_CONTROL_AES18_RECEIVER", \ - "HPI_CONTROL_AES18_BLOCKGENERATOR", \ - "HPI_CONTROL_CHANNEL_MODE", \ - "HPI_CONTROL_BITSTREAM", \ - "HPI_CONTROL_SAMPLECLOCK", \ - "HPI_CONTROL_MICROPHONE", \ - "HPI_CONTROL_PARAMETRIC_EQ", \ - "HPI_CONTROL_COMPANDER", \ - "HPI_CONTROL_COBRANET", \ - "HPI_CONTROL_TONE_DETECT", \ - "HPI_CONTROL_SILENCE_DETECT", \ - "HPI_CONTROL_PAD", \ - "HPI_CONTROL_SRC" ,\ - "HPI_CONTROL_UNIVERSAL" \ -} - -compile_time_assert((HPI_CONTROL_LAST_INDEX + 1 == 27), - controltype_strings_match_defs); - -#define HPI_SOURCENODE_STRINGS \ -{ \ - "no source", \ - "HPI_SOURCENODE_OSTREAM", \ - "HPI_SOURCENODE_LINEIN", \ - "HPI_SOURCENODE_AESEBU_IN", \ - "HPI_SOURCENODE_TUNER", \ - "HPI_SOURCENODE_RF", \ - "HPI_SOURCENODE_CLOCK_SOURCE", \ - "HPI_SOURCENODE_RAW_BITSTREAM", \ - "HPI_SOURCENODE_MICROPHONE", \ - "HPI_SOURCENODE_COBRANET", \ - "HPI_SOURCENODE_ANALOG", \ - "HPI_SOURCENODE_ADAPTER" \ -} - -compile_time_assert((HPI_SOURCENODE_LAST_INDEX - HPI_SOURCENODE_BASE + 1) == - (12), sourcenode_strings_match_defs); - -#define HPI_DESTNODE_STRINGS \ -{ \ - "no destination", \ - "HPI_DESTNODE_ISTREAM", \ - "HPI_DESTNODE_LINEOUT", \ - "HPI_DESTNODE_AESEBU_OUT", \ - "HPI_DESTNODE_RF", \ - "HPI_DESTNODE_SPEAKER", \ - "HPI_DESTNODE_COBRANET", \ - "HPI_DESTNODE_ANALOG" \ -} -compile_time_assert((HPI_DESTNODE_LAST_INDEX - HPI_DESTNODE_BASE + 1) == (8), - destnode_strings_match_defs); - -#define HPI_CONTROL_CHANNEL_MODE_STRINGS \ -{ \ - "XXX HPI_CHANNEL_MODE_ERROR XXX", \ - "HPI_CHANNEL_MODE_NORMAL", \ - "HPI_CHANNEL_MODE_SWAP", \ - "HPI_CHANNEL_MODE_LEFT_ONLY", \ - "HPI_CHANNEL_MODE_RIGHT_ONLY" \ -} - -#endif /* _HPIDEBUG_H */ diff --git a/pci/asihpi/hpidspcd.c b/pci/asihpi/hpidspcd.c deleted file mode 100644 index a03839e28..000000000 --- a/pci/asihpi/hpidspcd.c +++ /dev/null @@ -1,177 +0,0 @@ -/***********************************************************************/ -/*! - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -\file -Functions for reading DSP code to load into DSP - -(Linux only:) If DSPCODE_FIRMWARE_LOADER is defined, code is read using -hotplug firmware loader from individual dsp code files - -If neither of the above is defined, code is read from linked arrays. -DSPCODE_ARRAY is defined. - -HPI_INCLUDE_**** must be defined -and the appropriate hzz?????.c or hex?????.c linked in - - */ -/***********************************************************************/ -#define SOURCEFILE_NAME "hpidspcd.c" -#include "hpidspcd.h" -#include "hpidebug.h" - -/** - Header structure for binary dsp code file (see asidsp.doc) - This structure must match that used in s2bin.c for generation of asidsp.bin - */ - -#ifndef DISABLE_PRAGMA_PACK1 -#pragma pack(push, 1) -#endif - -struct code_header { - u32 size; - char type[4]; - u32 adapter; - u32 version; - u32 crc; -}; - -#ifndef DISABLE_PRAGMA_PACK1 -#pragma pack(pop) -#endif - -#define HPI_VER_DECIMAL ((int)(HPI_VER_MAJOR(HPI_VER) * 10000 + \ - HPI_VER_MINOR(HPI_VER) * 100 + HPI_VER_RELEASE(HPI_VER))) - -/***********************************************************************/ -#include "linux/pci.h" -/*-------------------------------------------------------------------*/ -short hpi_dsp_code_open(u32 adapter, struct dsp_code *ps_dsp_code, - u32 *pos_error_code) -{ - const struct firmware *ps_firmware = ps_dsp_code->ps_firmware; - struct code_header header; - char fw_name[20]; - int err; - - sprintf(fw_name, "asihpi/dsp%04x.bin", adapter); - HPI_DEBUG_LOG(INFO, "requesting firmware for %s\n", fw_name); - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2 , 5 , 0)) - err = request_firmware(&ps_firmware, fw_name, - ps_dsp_code->ps_dev->slot_name); -#else - err = request_firmware(&ps_firmware, fw_name, - &ps_dsp_code->ps_dev->dev); -#endif - if (err != 0) { - HPI_DEBUG_LOG(ERROR, "%d, request_firmware failed for %s\n", - err, fw_name); - goto error1; - } - if (ps_firmware->size < sizeof(header)) { - HPI_DEBUG_LOG(ERROR, "header size too small %s\n", fw_name); - goto error2; - } - memcpy(&header, ps_firmware->data, sizeof(header)); - if (header.adapter != adapter) { - HPI_DEBUG_LOG(ERROR, "adapter type incorrect %4x != %4x\n", - header.adapter, adapter); - goto error2; - } - if (header.size != ps_firmware->size) { - HPI_DEBUG_LOG(ERROR, "code size wrong %d != %ld\n", - header.size, (unsigned long)ps_firmware->size); - goto error2; - } - - if (header.version / 10000 != HPI_VER_DECIMAL / 10000) { - HPI_DEBUG_LOG(ERROR, - "firmware major version mismatch " - "DSP image %d != driver %d\n", header.version, - HPI_VER_DECIMAL); - goto error2; - } - - if (header.version != HPI_VER_DECIMAL) { - HPI_DEBUG_LOG(WARNING, - "version mismatch DSP image %d != driver %d\n", - header.version, HPI_VER_DECIMAL); - /* goto error2; still allow driver to load */ - } - - HPI_DEBUG_LOG(INFO, "dsp code %s opened\n", fw_name); - ps_dsp_code->ps_firmware = ps_firmware; - ps_dsp_code->block_length = header.size / sizeof(u32); - ps_dsp_code->word_count = sizeof(header) / sizeof(u32); - ps_dsp_code->version = header.version; - ps_dsp_code->crc = header.crc; - return 0; - -error2: - release_firmware(ps_firmware); -error1: - ps_dsp_code->ps_firmware = NULL; - ps_dsp_code->block_length = 0; - return HPI_ERROR_DSP_FILE_NOT_FOUND; -} - -/*-------------------------------------------------------------------*/ -void hpi_dsp_code_close(struct dsp_code *ps_dsp_code) -{ - if (ps_dsp_code->ps_firmware != NULL) { - HPI_DEBUG_LOG(DEBUG, "dsp code closed\n"); - release_firmware(ps_dsp_code->ps_firmware); - ps_dsp_code->ps_firmware = NULL; - } -} - -/*-------------------------------------------------------------------*/ -void hpi_dsp_code_rewind(struct dsp_code *ps_dsp_code) -{ - /* Go back to start of data, after header */ - ps_dsp_code->word_count = sizeof(struct code_header) / sizeof(u32); -} - -/*-------------------------------------------------------------------*/ -short hpi_dsp_code_read_word(struct dsp_code *ps_dsp_code, u32 *pword) -{ - if (ps_dsp_code->word_count + 1 > ps_dsp_code->block_length) - return (HPI_ERROR_DSP_FILE_FORMAT); - - *pword = ((u32 *)(ps_dsp_code->ps_firmware->data))[ps_dsp_code-> - word_count]; - ps_dsp_code->word_count++; - return 0; -} - -/*-------------------------------------------------------------------*/ -short hpi_dsp_code_read_block(size_t words_requested, - struct dsp_code *ps_dsp_code, u32 **ppblock) -{ - if (ps_dsp_code->word_count + words_requested > - ps_dsp_code->block_length) - return HPI_ERROR_DSP_FILE_FORMAT; - - *ppblock = - ((u32 *)(ps_dsp_code->ps_firmware->data)) + - ps_dsp_code->word_count; - ps_dsp_code->word_count += words_requested; - return 0; -} diff --git a/pci/asihpi/hpidspcd.h b/pci/asihpi/hpidspcd.h deleted file mode 100644 index d7c240398..000000000 --- a/pci/asihpi/hpidspcd.h +++ /dev/null @@ -1,104 +0,0 @@ -/***********************************************************************/ -/** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -\file -Functions for reading DSP code to load into DSP - - hpi_dspcode_defines HPI DSP code loading method -Define exactly one of these to select how the DSP code is supplied to -the adapter. - -End users writing applications that use the HPI interface do not have to -use any of the below defines; they are only necessary for building drivers - -HPI_DSPCODE_FILE: -DSP code is supplied as a file that is opened and read from by the driver. - -HPI_DSPCODE_FIRMWARE: -DSP code is read using the hotplug firmware loader module. - Only valid when compiling the HPI kernel driver under Linux. -*/ -/***********************************************************************/ -#ifndef _HPIDSPCD_H_ -#define _HPIDSPCD_H_ - -#include "hpi_internal.h" - -#ifndef DISABLE_PRAGMA_PACK1 -#pragma pack(push, 1) -#endif - -/** Descriptor for dspcode from firmware loader */ -struct dsp_code { - /** Firmware descriptor */ - const struct firmware *ps_firmware; - struct pci_dev *ps_dev; - /** Expected number of words in the whole dsp code,INCL header */ - long int block_length; - /** Number of words read so far */ - long int word_count; - /** Version read from dsp code file */ - u32 version; - /** CRC read from dsp code file */ - u32 crc; -}; - -#ifndef DISABLE_PRAGMA_PACK1 -#pragma pack(pop) -#endif - -/** Prepare *psDspCode to refer to the requuested adapter. - Searches the file, or selects the appropriate linked array - -\return 0 for success, or error code if requested code is not available -*/ -short hpi_dsp_code_open( - /** Code identifier, usually adapter family */ - u32 adapter, - /** Pointer to DSP code control structure */ - struct dsp_code *ps_dsp_code, - /** Pointer to dword to receive OS specific error code */ - u32 *pos_error_code); - -/** Close the DSP code file */ -void hpi_dsp_code_close(struct dsp_code *ps_dsp_code); - -/** Rewind to the beginning of the DSP code file (for verify) */ -void hpi_dsp_code_rewind(struct dsp_code *ps_dsp_code); - -/** Read one word from the dsp code file - \return 0 for success, or error code if eof, or block length exceeded -*/ -short hpi_dsp_code_read_word(struct dsp_code *ps_dsp_code, - /**< DSP code descriptor */ - u32 *pword /**< where to store the read word */ - ); - -/** Get a block of dsp code into an internal buffer, and provide a pointer to -that buffer. (If dsp code is already an array in memory, it is referenced, -not copied.) - -\return Error if requested number of words are not available -*/ -short hpi_dsp_code_read_block(size_t words_requested, - struct dsp_code *ps_dsp_code, - /* Pointer to store (Pointer to code buffer) */ - u32 **ppblock); - -#endif diff --git a/pci/asihpi/hpidspcd.patch b/pci/asihpi/hpidspcd.patch new file mode 100644 index 000000000..78316399d --- /dev/null +++ b/pci/asihpi/hpidspcd.patch @@ -0,0 +1,21 @@ +--- ../../alsa-kernel/pci/asihpi/hpidspcd.c 2010-04-21 18:36:16.613453111 +0200 ++++ hpidspcd.c 2010-04-21 18:41:26.104970371 +0200 +@@ -1,3 +1,4 @@ ++#include "adriver.h" + /***********************************************************************/ + /*! + +@@ -73,8 +74,13 @@ + sprintf(fw_name, "asihpi/dsp%04x.bin", adapter); + HPI_DEBUG_LOG(INFO, "requesting firmware for %s\n", fw_name); + ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2 , 5 , 0)) ++ err = request_firmware(&ps_firmware, fw_name, ++ ps_dsp_code->ps_dev->slot_name); ++#else + err = request_firmware(&ps_firmware, fw_name, + &ps_dsp_code->ps_dev->dev); ++#endif + if (err != 0) { + HPI_DEBUG_LOG(ERROR, "%d, request_firmware failed for %s\n", + err, fw_name); diff --git a/pci/asihpi/hpifunc.c b/pci/asihpi/hpifunc.c index 254c580db..58471a0ad 100644 --- a/pci/asihpi/hpifunc.c +++ b/pci/asihpi/hpifunc.c @@ -1,3864 +1,2 @@ - -#include "hpi_internal.h" -#include "hpimsginit.h" - -#include "hpidebug.h" - -struct hpi_handle { - unsigned int obj_index:12; - unsigned int obj_type:4; - unsigned int adapter_index:14; - unsigned int spare:1; - unsigned int read_only:1; -}; - -union handle_word { - struct hpi_handle h; - u32 w; -}; - -u32 hpi_indexes_to_handle(const char c_object, const u16 adapter_index, - const u16 object_index) -{ - union handle_word handle; - - handle.h.adapter_index = adapter_index; - handle.h.spare = 0; - handle.h.read_only = 0; - handle.h.obj_type = c_object; - handle.h.obj_index = object_index; - return handle.w; -} - -void hpi_handle_to_indexes(const u32 handle, u16 *pw_adapter_index, - u16 *pw_object_index) -{ - union handle_word uhandle; - uhandle.w = handle; - - if (pw_adapter_index) - *pw_adapter_index = (u16)uhandle.h.adapter_index; - if (pw_object_index) - *pw_object_index = (u16)uhandle.h.obj_index; -} - -char hpi_handle_object(const u32 handle) -{ - union handle_word uhandle; - uhandle.w = handle; - return (char)uhandle.h.obj_type; -} - -#define u32TOINDEX(h, i1) \ -do {\ - if (h == 0) \ - return HPI_ERROR_INVALID_OBJ; \ - else \ - hpi_handle_to_indexes(h, i1, NULL); \ -} while (0) - -#define u32TOINDEXES(h, i1, i2) \ -do {\ - if (h == 0) \ - return HPI_ERROR_INVALID_OBJ; \ - else \ - hpi_handle_to_indexes(h, i1, i2);\ -} while (0) - -void hpi_format_to_msg(struct hpi_msg_format *pMF, - const struct hpi_format *pF) -{ - pMF->sample_rate = pF->sample_rate; - pMF->bit_rate = pF->bit_rate; - pMF->attributes = pF->attributes; - pMF->channels = pF->channels; - pMF->format = pF->format; -} - -static void hpi_msg_to_format(struct hpi_format *pF, - struct hpi_msg_format *pMF) -{ - pF->sample_rate = pMF->sample_rate; - pF->bit_rate = pMF->bit_rate; - pF->attributes = pMF->attributes; - pF->channels = pMF->channels; - pF->format = pMF->format; - pF->mode_legacy = 0; - pF->unused = 0; -} - -void hpi_stream_response_to_legacy(struct hpi_stream_res *pSR) -{ - pSR->u.legacy_stream_info.auxiliary_data_available = - pSR->u.stream_info.auxiliary_data_available; - pSR->u.legacy_stream_info.state = pSR->u.stream_info.state; -} - -static struct hpi_hsubsys gh_subsys; - -struct hpi_hsubsys *hpi_subsys_create(void - ) -{ - struct hpi_message hm; - struct hpi_response hr; - - memset(&gh_subsys, 0, sizeof(struct hpi_hsubsys)); - - { - hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_OPEN); - hpi_send_recv(&hm, &hr); - - if (hr.error == 0) - return &gh_subsys; - - } - return NULL; -} - -void hpi_subsys_free(const struct hpi_hsubsys *ph_subsys) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_CLOSE); - hpi_send_recv(&hm, &hr); - -} - -u16 hpi_subsys_get_version(const struct hpi_hsubsys *ph_subsys, u32 *pversion) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_GET_VERSION); - hpi_send_recv(&hm, &hr); - *pversion = hr.u.s.version; - return hr.error; -} - -u16 hpi_subsys_get_version_ex(const struct hpi_hsubsys *ph_subsys, - u32 *pversion_ex) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_GET_VERSION); - hpi_send_recv(&hm, &hr); - *pversion_ex = hr.u.s.data; - return hr.error; -} - -u16 hpi_subsys_get_info(const struct hpi_hsubsys *ph_subsys, u32 *pversion, - u16 *pw_num_adapters, u16 aw_adapter_list[], u16 list_length) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_GET_INFO); - - hpi_send_recv(&hm, &hr); - - *pversion = hr.u.s.version; - if (list_length > HPI_MAX_ADAPTERS) - memcpy(aw_adapter_list, &hr.u.s.aw_adapter_list, - HPI_MAX_ADAPTERS); - else - memcpy(aw_adapter_list, &hr.u.s.aw_adapter_list, list_length); - *pw_num_adapters = hr.u.s.num_adapters; - return hr.error; -} - -u16 hpi_subsys_find_adapters(const struct hpi_hsubsys *ph_subsys, - u16 *pw_num_adapters, u16 aw_adapter_list[], u16 list_length) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_FIND_ADAPTERS); - - hpi_send_recv(&hm, &hr); - - if (list_length > HPI_MAX_ADAPTERS) { - memcpy(aw_adapter_list, &hr.u.s.aw_adapter_list, - HPI_MAX_ADAPTERS * sizeof(u16)); - memset(&aw_adapter_list[HPI_MAX_ADAPTERS], 0, - (list_length - HPI_MAX_ADAPTERS) * sizeof(u16)); - } else - memcpy(aw_adapter_list, &hr.u.s.aw_adapter_list, - list_length * sizeof(u16)); - *pw_num_adapters = hr.u.s.num_adapters; - - return hr.error; -} - -u16 hpi_subsys_create_adapter(const struct hpi_hsubsys *ph_subsys, - const struct hpi_resource *p_resource, u16 *pw_adapter_index) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_CREATE_ADAPTER); - hm.u.s.resource = *p_resource; - - hpi_send_recv(&hm, &hr); - - *pw_adapter_index = hr.u.s.adapter_index; - return hr.error; -} - -u16 hpi_subsys_delete_adapter(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_DELETE_ADAPTER); - hm.adapter_index = adapter_index; - hpi_send_recv(&hm, &hr); - return hr.error; -} - -u16 hpi_subsys_get_num_adapters(const struct hpi_hsubsys *ph_subsys, - int *pn_num_adapters) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_GET_NUM_ADAPTERS); - hpi_send_recv(&hm, &hr); - *pn_num_adapters = (int)hr.u.s.num_adapters; - return hr.error; -} - -u16 hpi_subsys_get_adapter(const struct hpi_hsubsys *ph_subsys, int iterator, - u32 *padapter_index, u16 *pw_adapter_type) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_GET_ADAPTER); - hm.adapter_index = (u16)iterator; - hpi_send_recv(&hm, &hr); - *padapter_index = (int)hr.u.s.adapter_index; - *pw_adapter_type = hr.u.s.aw_adapter_list[0]; - return hr.error; -} - -u16 hpi_subsys_set_host_network_interface(const struct hpi_hsubsys *ph_subsys, - const char *sz_interface) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_SET_NETWORK_INTERFACE); - if (sz_interface == NULL) - return HPI_ERROR_INVALID_RESOURCE; - hm.u.s.resource.r.net_if = sz_interface; - hpi_send_recv(&hm, &hr); - return hr.error; -} - -u16 hpi_adapter_open(const struct hpi_hsubsys *ph_subsys, u16 adapter_index) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_OPEN); - hm.adapter_index = adapter_index; - - hpi_send_recv(&hm, &hr); - - return hr.error; - -} - -u16 hpi_adapter_close(const struct hpi_hsubsys *ph_subsys, u16 adapter_index) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_CLOSE); - hm.adapter_index = adapter_index; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_adapter_set_mode(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u32 adapter_mode) -{ - return hpi_adapter_set_mode_ex(ph_subsys, adapter_index, adapter_mode, - HPI_ADAPTER_MODE_SET); -} - -u16 hpi_adapter_set_mode_ex(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u32 adapter_mode, u16 query_or_set) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_SET_MODE); - hm.adapter_index = adapter_index; - hm.u.a.adapter_mode = adapter_mode; - hm.u.a.assert_id = query_or_set; - hpi_send_recv(&hm, &hr); - return hr.error; -} - -u16 hpi_adapter_get_mode(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u32 *padapter_mode) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_GET_MODE); - hm.adapter_index = adapter_index; - hpi_send_recv(&hm, &hr); - if (padapter_mode) - *padapter_mode = hr.u.a.serial_number; - return hr.error; -} - -u16 hpi_adapter_get_info(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 *pw_num_outstreams, u16 *pw_num_instreams, - u16 *pw_version, u32 *pserial_number, u16 *pw_adapter_type) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_GET_INFO); - hm.adapter_index = adapter_index; - - hpi_send_recv(&hm, &hr); - - *pw_adapter_type = hr.u.a.adapter_type; - *pw_num_outstreams = hr.u.a.num_outstreams; - *pw_num_instreams = hr.u.a.num_instreams; - *pw_version = hr.u.a.version; - *pserial_number = hr.u.a.serial_number; - return hr.error; -} - -u16 hpi_adapter_get_module_by_index(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 module_index, u16 *pw_num_outputs, - u16 *pw_num_inputs, u16 *pw_version, u32 *pserial_number, - u16 *pw_module_type, u32 *ph_module) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_MODULE_INFO); - hm.adapter_index = adapter_index; - hm.u.ax.module_info.index = module_index; - - hpi_send_recv(&hm, &hr); - - *pw_module_type = hr.u.a.adapter_type; - *pw_num_outputs = hr.u.a.num_outstreams; - *pw_num_inputs = hr.u.a.num_instreams; - *pw_version = hr.u.a.version; - *pserial_number = hr.u.a.serial_number; - *ph_module = 0; - - return hr.error; -} - -u16 hpi_adapter_get_assert(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 *assert_present, char *psz_assert, - u16 *pw_line_number) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_GET_ASSERT); - hm.adapter_index = adapter_index; - hpi_send_recv(&hm, &hr); - - *assert_present = 0; - - if (!hr.error) { - - *pw_line_number = (u16)hr.u.a.serial_number; - if (*pw_line_number) { - - int i; - char *src = (char *)hr.u.a.sz_adapter_assert; - char *dst = psz_assert; - - *assert_present = 1; - - for (i = 0; i < HPI_STRING_LEN; i++) { - char c; - c = *src++; - *dst++ = c; - if (c == 0) - break; - } - - } - } - return hr.error; -} - -u16 hpi_adapter_get_assert_ex(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 *assert_present, char *psz_assert, - u32 *pline_number, u16 *pw_assert_on_dsp) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_GET_ASSERT); - hm.adapter_index = adapter_index; - - hpi_send_recv(&hm, &hr); - - *assert_present = 0; - - if (!hr.error) { - - *pline_number = hr.u.a.serial_number; - - *assert_present = hr.u.a.adapter_type; - - *pw_assert_on_dsp = hr.u.a.adapter_index; - - if (!*assert_present && *pline_number) - - *assert_present = 1; - - if (*assert_present) { - - int i; - char *src = (char *)hr.u.a.sz_adapter_assert; - char *dst = psz_assert; - - for (i = 0; i < HPI_STRING_LEN; i++) { - char c; - c = *src++; - *dst++ = c; - if (c == 0) - break; - } - - } else { - *psz_assert = 0; - } - } - return hr.error; -} - -u16 hpi_adapter_test_assert(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 assert_id) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_TEST_ASSERT); - hm.adapter_index = adapter_index; - hm.u.a.assert_id = assert_id; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_adapter_enable_capability(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 capability, u32 key) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_ENABLE_CAPABILITY); - hm.adapter_index = adapter_index; - hm.u.a.assert_id = capability; - hm.u.a.adapter_mode = key; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_adapter_self_test(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_SELFTEST); - hm.adapter_index = adapter_index; - hpi_send_recv(&hm, &hr); - return hr.error; -} - -u16 hpi_adapter_debug_read(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u32 dsp_address, char *p_buffer, int *count_bytes) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_DEBUG_READ); - - hr.size = sizeof(hr); - - hm.adapter_index = adapter_index; - hm.u.ax.debug_read.dsp_address = dsp_address; - - if (*count_bytes > sizeof(hr.u.bytes)) - *count_bytes = sizeof(hr.u.bytes); - - hm.u.ax.debug_read.count_bytes = *count_bytes; - - hpi_send_recv(&hm, &hr); - - if (!hr.error) { - *count_bytes = hr.size - 12; - memcpy(p_buffer, &hr.u.bytes, *count_bytes); - } else - *count_bytes = 0; - return hr.error; -} - -u16 hpi_adapter_set_property(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 property, u16 parameter1, u16 parameter2) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_SET_PROPERTY); - hm.adapter_index = adapter_index; - hm.u.ax.property_set.property = property; - hm.u.ax.property_set.parameter1 = parameter1; - hm.u.ax.property_set.parameter2 = parameter2; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_adapter_get_property(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 property, u16 *pw_parameter1, - u16 *pw_parameter2) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_GET_PROPERTY); - hm.adapter_index = adapter_index; - hm.u.ax.property_set.property = property; - - hpi_send_recv(&hm, &hr); - if (!hr.error) { - if (pw_parameter1) - *pw_parameter1 = hr.u.ax.property_get.parameter1; - if (pw_parameter2) - *pw_parameter2 = hr.u.ax.property_get.parameter2; - } - - return hr.error; -} - -u16 hpi_adapter_enumerate_property(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 index, u16 what_to_enumerate, - u16 property_index, u32 *psetting) -{ - return 0; -} - -u16 hpi_format_create(struct hpi_format *p_format, u16 channels, u16 format, - u32 sample_rate, u32 bit_rate, u32 attributes) -{ - u16 error = 0; - struct hpi_msg_format fmt; - - switch (channels) { - case 1: - case 2: - case 4: - case 6: - case 8: - case 16: - break; - default: - error = HPI_ERROR_INVALID_CHANNELS; - return error; - } - fmt.channels = channels; - - switch (format) { - case HPI_FORMAT_PCM16_SIGNED: - case HPI_FORMAT_PCM24_SIGNED: - case HPI_FORMAT_PCM32_SIGNED: - case HPI_FORMAT_PCM32_FLOAT: - case HPI_FORMAT_PCM16_BIGENDIAN: - case HPI_FORMAT_PCM8_UNSIGNED: - case HPI_FORMAT_MPEG_L1: - case HPI_FORMAT_MPEG_L2: - case HPI_FORMAT_MPEG_L3: - case HPI_FORMAT_DOLBY_AC2: - case HPI_FORMAT_AA_TAGIT1_HITS: - case HPI_FORMAT_AA_TAGIT1_INSERTS: - case HPI_FORMAT_RAW_BITSTREAM: - case HPI_FORMAT_AA_TAGIT1_HITS_EX1: - case HPI_FORMAT_OEM1: - case HPI_FORMAT_OEM2: - break; - default: - error = HPI_ERROR_INVALID_FORMAT; - return error; - } - fmt.format = format; - - if (sample_rate < 8000L) { - error = HPI_ERROR_INCOMPATIBLE_SAMPLERATE; - sample_rate = 8000L; - } - if (sample_rate > 200000L) { - error = HPI_ERROR_INCOMPATIBLE_SAMPLERATE; - sample_rate = 200000L; - } - fmt.sample_rate = sample_rate; - - switch (format) { - case HPI_FORMAT_MPEG_L1: - case HPI_FORMAT_MPEG_L2: - case HPI_FORMAT_MPEG_L3: - fmt.bit_rate = bit_rate; - break; - case HPI_FORMAT_PCM16_SIGNED: - case HPI_FORMAT_PCM16_BIGENDIAN: - fmt.bit_rate = channels * sample_rate * 2; - break; - case HPI_FORMAT_PCM32_SIGNED: - case HPI_FORMAT_PCM32_FLOAT: - fmt.bit_rate = channels * sample_rate * 4; - break; - case HPI_FORMAT_PCM8_UNSIGNED: - fmt.bit_rate = channels * sample_rate; - break; - default: - fmt.bit_rate = 0; - } - - switch (format) { - case HPI_FORMAT_MPEG_L2: - if ((channels == 1) - && (attributes != HPI_MPEG_MODE_DEFAULT)) { - attributes = HPI_MPEG_MODE_DEFAULT; - error = HPI_ERROR_INVALID_FORMAT; - } else if (attributes > HPI_MPEG_MODE_DUALCHANNEL) { - attributes = HPI_MPEG_MODE_DEFAULT; - error = HPI_ERROR_INVALID_FORMAT; - } - fmt.attributes = attributes; - break; - default: - fmt.attributes = attributes; - } - - hpi_msg_to_format(p_format, &fmt); - return error; -} - -u16 hpi_stream_estimate_buffer_size(struct hpi_format *p_format, - u32 host_polling_rate_in_milli_seconds, u32 *recommended_buffer_size) -{ - - u32 bytes_per_second; - u32 size; - u16 channels; - struct hpi_format *pF = p_format; - - channels = pF->channels; - - switch (pF->format) { - case HPI_FORMAT_PCM16_BIGENDIAN: - case HPI_FORMAT_PCM16_SIGNED: - bytes_per_second = pF->sample_rate * 2L * channels; - break; - case HPI_FORMAT_PCM24_SIGNED: - bytes_per_second = pF->sample_rate * 3L * channels; - break; - case HPI_FORMAT_PCM32_SIGNED: - case HPI_FORMAT_PCM32_FLOAT: - bytes_per_second = pF->sample_rate * 4L * channels; - break; - case HPI_FORMAT_PCM8_UNSIGNED: - bytes_per_second = pF->sample_rate * 1L * channels; - break; - case HPI_FORMAT_MPEG_L1: - case HPI_FORMAT_MPEG_L2: - case HPI_FORMAT_MPEG_L3: - bytes_per_second = pF->bit_rate / 8L; - break; - case HPI_FORMAT_DOLBY_AC2: - - bytes_per_second = 256000L / 8L; - break; - default: - return HPI_ERROR_INVALID_FORMAT; - } - size = (bytes_per_second * host_polling_rate_in_milli_seconds * 2) / - 1000L; - - *recommended_buffer_size = - roundup_pow_of_two(((size + 4095L) & ~4095L)); - return 0; -} - -u16 hpi_outstream_open(const struct hpi_hsubsys *ph_subsys, u16 adapter_index, - u16 outstream_index, u32 *ph_outstream) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_OPEN); - hm.adapter_index = adapter_index; - hm.obj_index = outstream_index; - - hpi_send_recv(&hm, &hr); - - if (hr.error == 0) - *ph_outstream = - hpi_indexes_to_handle(HPI_OBJ_OSTREAM, adapter_index, - outstream_index); - else - *ph_outstream = 0; - return hr.error; -} - -u16 hpi_outstream_close(const struct hpi_hsubsys *ph_subsys, u32 h_outstream) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_HOSTBUFFER_FREE); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_GROUP_RESET); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_CLOSE); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_outstream_get_info_ex(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u16 *pw_state, u32 *pbuffer_size, u32 *pdata_to_play, - u32 *psamples_played, u32 *pauxiliary_data_to_play) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_GET_INFO); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - - hpi_send_recv(&hm, &hr); - - if (pw_state) - *pw_state = hr.u.d.u.stream_info.state; - if (pbuffer_size) - *pbuffer_size = hr.u.d.u.stream_info.buffer_size; - if (pdata_to_play) - *pdata_to_play = hr.u.d.u.stream_info.data_available; - if (psamples_played) - *psamples_played = hr.u.d.u.stream_info.samples_transferred; - if (pauxiliary_data_to_play) - *pauxiliary_data_to_play = - hr.u.d.u.stream_info.auxiliary_data_available; - return hr.error; -} - -u16 hpi_outstream_write_buf(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, const u8 *pb_data, u32 bytes_to_write, - const struct hpi_format *p_format) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_WRITE); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - hm.u.d.u.data.pb_data = (u8 *)pb_data; - hm.u.d.u.data.data_size = bytes_to_write; - - hpi_format_to_msg(&hm.u.d.u.data.format, p_format); - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_outstream_start(const struct hpi_hsubsys *ph_subsys, u32 h_outstream) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_START); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_outstream_wait_start(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_WAIT_START); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_outstream_stop(const struct hpi_hsubsys *ph_subsys, u32 h_outstream) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_STOP); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_outstream_sinegen(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_SINEGEN); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_outstream_reset(const struct hpi_hsubsys *ph_subsys, u32 h_outstream) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_RESET); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_outstream_query_format(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, struct hpi_format *p_format) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_QUERY_FORMAT); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - - hpi_format_to_msg(&hm.u.d.u.data.format, p_format); - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_outstream_set_format(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, struct hpi_format *p_format) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_SET_FORMAT); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - - hpi_format_to_msg(&hm.u.d.u.data.format, p_format); - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_outstream_set_velocity(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, short velocity) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_SET_VELOCITY); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - hm.u.d.u.velocity = velocity; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_outstream_set_punch_in_out(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u32 punch_in_sample, u32 punch_out_sample) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_SET_PUNCHINOUT); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - - hm.u.d.u.pio.punch_in_sample = punch_in_sample; - hm.u.d.u.pio.punch_out_sample = punch_out_sample; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_outstream_ancillary_reset(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u16 mode) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_ANC_RESET); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - hm.u.d.u.data.format.channels = mode; - hpi_send_recv(&hm, &hr); - return hr.error; -} - -u16 hpi_outstream_ancillary_get_info(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u32 *pframes_available) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_ANC_GET_INFO); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - if (hr.error == 0) { - if (pframes_available) - *pframes_available = - hr.u.d.u.stream_info.data_available / - sizeof(struct hpi_anc_frame); - } - return hr.error; -} - -u16 hpi_outstream_ancillary_read(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, struct hpi_anc_frame *p_anc_frame_buffer, - u32 anc_frame_buffer_size_in_bytes, - u32 number_of_ancillary_frames_to_read) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_ANC_READ); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - hm.u.d.u.data.pb_data = (u8 *)p_anc_frame_buffer; - hm.u.d.u.data.data_size = - number_of_ancillary_frames_to_read * - sizeof(struct hpi_anc_frame); - if (hm.u.d.u.data.data_size <= anc_frame_buffer_size_in_bytes) - hpi_send_recv(&hm, &hr); - else - hr.error = HPI_ERROR_INVALID_DATA_TRANSFER; - return hr.error; -} - -u16 hpi_outstream_set_time_scale(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u32 time_scale) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_SET_TIMESCALE); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - - hm.u.d.u.time_scale = time_scale; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_outstream_host_buffer_allocate(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u32 size_in_bytes) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_HOSTBUFFER_ALLOC); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - hm.u.d.u.data.data_size = size_in_bytes; - hpi_send_recv(&hm, &hr); - return hr.error; -} - -u16 hpi_outstream_host_buffer_get_info(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u8 **pp_buffer, - struct hpi_hostbuffer_status **pp_status) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_HOSTBUFFER_GET_INFO); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - - if (hr.error == 0) { - if (pp_buffer) - *pp_buffer = hr.u.d.u.hostbuffer_info.p_buffer; - if (pp_status) - *pp_status = hr.u.d.u.hostbuffer_info.p_status; - } - return hr.error; -} - -u16 hpi_outstream_host_buffer_free(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_HOSTBUFFER_FREE); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - return hr.error; -} - -u16 hpi_outstream_group_add(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u32 h_stream) -{ - struct hpi_message hm; - struct hpi_response hr; - u16 adapter; - char c_obj_type; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_GROUP_ADD); - hr.error = 0; - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - c_obj_type = hpi_handle_object(h_stream); - switch (c_obj_type) { - case HPI_OBJ_OSTREAM: - hm.u.d.u.stream.object_type = HPI_OBJ_OSTREAM; - u32TOINDEXES(h_stream, &adapter, - &hm.u.d.u.stream.stream_index); - break; - case HPI_OBJ_ISTREAM: - hm.u.d.u.stream.object_type = HPI_OBJ_ISTREAM; - u32TOINDEXES(h_stream, &adapter, - &hm.u.d.u.stream.stream_index); - break; - default: - return HPI_ERROR_INVALID_STREAM; - } - if (adapter != hm.adapter_index) - return HPI_ERROR_NO_INTERADAPTER_GROUPS; - - hpi_send_recv(&hm, &hr); - return hr.error; -} - -u16 hpi_outstream_group_get_map(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream, u32 *poutstream_map, u32 *pinstream_map) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_GROUP_GETMAP); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - - if (poutstream_map) - *poutstream_map = hr.u.d.u.group_info.outstream_group_map; - if (pinstream_map) - *pinstream_map = hr.u.d.u.group_info.instream_group_map; - - return hr.error; -} - -u16 hpi_outstream_group_reset(const struct hpi_hsubsys *ph_subsys, - u32 h_outstream) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_GROUP_RESET); - u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - return hr.error; -} - -u16 hpi_instream_open(const struct hpi_hsubsys *ph_subsys, u16 adapter_index, - u16 instream_index, u32 *ph_instream) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_OPEN); - hm.adapter_index = adapter_index; - hm.obj_index = instream_index; - - hpi_send_recv(&hm, &hr); - - if (hr.error == 0) - *ph_instream = - hpi_indexes_to_handle(HPI_OBJ_ISTREAM, adapter_index, - instream_index); - else - *ph_instream = 0; - - return hr.error; -} - -u16 hpi_instream_close(const struct hpi_hsubsys *ph_subsys, u32 h_instream) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_HOSTBUFFER_FREE); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_GROUP_RESET); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_CLOSE); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_instream_query_format(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, const struct hpi_format *p_format) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_QUERY_FORMAT); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - hpi_format_to_msg(&hm.u.d.u.data.format, p_format); - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_instream_set_format(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, const struct hpi_format *p_format) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_SET_FORMAT); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - hpi_format_to_msg(&hm.u.d.u.data.format, p_format); - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_instream_read_buf(const struct hpi_hsubsys *ph_subsys, u32 h_instream, - u8 *pb_data, u32 bytes_to_read) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_READ); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - hm.u.d.u.data.data_size = bytes_to_read; - hm.u.d.u.data.pb_data = pb_data; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_instream_start(const struct hpi_hsubsys *ph_subsys, u32 h_instream) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_START); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_instream_wait_start(const struct hpi_hsubsys *ph_subsys, - u32 h_instream) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_WAIT_START); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_instream_stop(const struct hpi_hsubsys *ph_subsys, u32 h_instream) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_STOP); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_instream_reset(const struct hpi_hsubsys *ph_subsys, u32 h_instream) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_RESET); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_instream_get_info_ex(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, u16 *pw_state, u32 *pbuffer_size, u32 *pdata_recorded, - u32 *psamples_recorded, u32 *pauxiliary_data_recorded) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_GET_INFO); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - - hpi_send_recv(&hm, &hr); - - if (pw_state) - *pw_state = hr.u.d.u.stream_info.state; - if (pbuffer_size) - *pbuffer_size = hr.u.d.u.stream_info.buffer_size; - if (pdata_recorded) - *pdata_recorded = hr.u.d.u.stream_info.data_available; - if (psamples_recorded) - *psamples_recorded = hr.u.d.u.stream_info.samples_transferred; - if (pauxiliary_data_recorded) - *pauxiliary_data_recorded = - hr.u.d.u.stream_info.auxiliary_data_available; - return hr.error; -} - -u16 hpi_instream_ancillary_reset(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, u16 bytes_per_frame, u16 mode, u16 alignment, - u16 idle_bit) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_ANC_RESET); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - hm.u.d.u.data.format.attributes = bytes_per_frame; - hm.u.d.u.data.format.format = (mode << 8) | (alignment & 0xff); - hm.u.d.u.data.format.channels = idle_bit; - hpi_send_recv(&hm, &hr); - return hr.error; -} - -u16 hpi_instream_ancillary_get_info(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, u32 *pframe_space) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_ANC_GET_INFO); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - if (pframe_space) - *pframe_space = - (hr.u.d.u.stream_info.buffer_size - - hr.u.d.u.stream_info.data_available) / - sizeof(struct hpi_anc_frame); - return hr.error; -} - -u16 hpi_instream_ancillary_write(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, const struct hpi_anc_frame *p_anc_frame_buffer, - u32 anc_frame_buffer_size_in_bytes, - u32 number_of_ancillary_frames_to_write) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_ANC_WRITE); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - hm.u.d.u.data.pb_data = (u8 *)p_anc_frame_buffer; - hm.u.d.u.data.data_size = - number_of_ancillary_frames_to_write * - sizeof(struct hpi_anc_frame); - if (hm.u.d.u.data.data_size <= anc_frame_buffer_size_in_bytes) - hpi_send_recv(&hm, &hr); - else - hr.error = HPI_ERROR_INVALID_DATA_TRANSFER; - return hr.error; -} - -u16 hpi_instream_host_buffer_allocate(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, u32 size_in_bytes) -{ - - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_HOSTBUFFER_ALLOC); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - hm.u.d.u.data.data_size = size_in_bytes; - hpi_send_recv(&hm, &hr); - return hr.error; -} - -u16 hpi_instream_host_buffer_get_info(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, u8 **pp_buffer, - struct hpi_hostbuffer_status **pp_status) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_HOSTBUFFER_GET_INFO); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - - if (hr.error == 0) { - if (pp_buffer) - *pp_buffer = hr.u.d.u.hostbuffer_info.p_buffer; - if (pp_status) - *pp_status = hr.u.d.u.hostbuffer_info.p_status; - } - return hr.error; -} - -u16 hpi_instream_host_buffer_free(const struct hpi_hsubsys *ph_subsys, - u32 h_instream) -{ - - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_HOSTBUFFER_FREE); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - return hr.error; -} - -u16 hpi_instream_group_add(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, u32 h_stream) -{ - struct hpi_message hm; - struct hpi_response hr; - u16 adapter; - char c_obj_type; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_GROUP_ADD); - hr.error = 0; - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - c_obj_type = hpi_handle_object(h_stream); - - switch (c_obj_type) { - case HPI_OBJ_OSTREAM: - hm.u.d.u.stream.object_type = HPI_OBJ_OSTREAM; - u32TOINDEXES(h_stream, &adapter, - &hm.u.d.u.stream.stream_index); - break; - case HPI_OBJ_ISTREAM: - hm.u.d.u.stream.object_type = HPI_OBJ_ISTREAM; - u32TOINDEXES(h_stream, &adapter, - &hm.u.d.u.stream.stream_index); - break; - default: - return HPI_ERROR_INVALID_STREAM; - } - - if (adapter != hm.adapter_index) - return HPI_ERROR_NO_INTERADAPTER_GROUPS; - - hpi_send_recv(&hm, &hr); - return hr.error; -} - -u16 hpi_instream_group_get_map(const struct hpi_hsubsys *ph_subsys, - u32 h_instream, u32 *poutstream_map, u32 *pinstream_map) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_HOSTBUFFER_FREE); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - - if (poutstream_map) - *poutstream_map = hr.u.d.u.group_info.outstream_group_map; - if (pinstream_map) - *pinstream_map = hr.u.d.u.group_info.instream_group_map; - - return hr.error; -} - -u16 hpi_instream_group_reset(const struct hpi_hsubsys *ph_subsys, - u32 h_instream) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_GROUP_RESET); - u32TOINDEXES(h_instream, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - return hr.error; -} - -u16 hpi_mixer_open(const struct hpi_hsubsys *ph_subsys, u16 adapter_index, - u32 *ph_mixer) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_OPEN); - hm.adapter_index = adapter_index; - - hpi_send_recv(&hm, &hr); - - if (hr.error == 0) - *ph_mixer = - hpi_indexes_to_handle(HPI_OBJ_MIXER, adapter_index, - 0); - else - *ph_mixer = 0; - return hr.error; -} - -u16 hpi_mixer_close(const struct hpi_hsubsys *ph_subsys, u32 h_mixer) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_CLOSE); - u32TOINDEX(h_mixer, &hm.adapter_index); - hpi_send_recv(&hm, &hr); - return hr.error; -} - -u16 hpi_mixer_get_control(const struct hpi_hsubsys *ph_subsys, u32 h_mixer, - u16 src_node_type, u16 src_node_type_index, u16 dst_node_type, - u16 dst_node_type_index, u16 control_type, u32 *ph_control) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, - HPI_MIXER_GET_CONTROL); - u32TOINDEX(h_mixer, &hm.adapter_index); - hm.u.m.node_type1 = src_node_type; - hm.u.m.node_index1 = src_node_type_index; - hm.u.m.node_type2 = dst_node_type; - hm.u.m.node_index2 = dst_node_type_index; - hm.u.m.control_type = control_type; - - hpi_send_recv(&hm, &hr); - - if (hr.error == 0) - *ph_control = - hpi_indexes_to_handle(HPI_OBJ_CONTROL, - hm.adapter_index, hr.u.m.control_index); - else - *ph_control = 0; - return hr.error; -} - -u16 hpi_mixer_get_control_by_index(const struct hpi_hsubsys *ph_subsys, - u32 h_mixer, u16 control_index, u16 *pw_src_node_type, - u16 *pw_src_node_index, u16 *pw_dst_node_type, u16 *pw_dst_node_index, - u16 *pw_control_type, u32 *ph_control) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, - HPI_MIXER_GET_CONTROL_BY_INDEX); - u32TOINDEX(h_mixer, &hm.adapter_index); - hm.u.m.control_index = control_index; - hpi_send_recv(&hm, &hr); - - if (pw_src_node_type) { - *pw_src_node_type = - hr.u.m.src_node_type + HPI_SOURCENODE_NONE; - *pw_src_node_index = hr.u.m.src_node_index; - *pw_dst_node_type = hr.u.m.dst_node_type + HPI_DESTNODE_NONE; - *pw_dst_node_index = hr.u.m.dst_node_index; - } - if (pw_control_type) - *pw_control_type = hr.u.m.control_index; - - if (ph_control) { - if (hr.error == 0) - *ph_control = - hpi_indexes_to_handle(HPI_OBJ_CONTROL, - hm.adapter_index, control_index); - else - *ph_control = 0; - } - return hr.error; -} - -u16 hpi_mixer_store(const struct hpi_hsubsys *ph_subsys, u32 h_mixer, - enum HPI_MIXER_STORE_COMMAND command, u16 index) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_STORE); - u32TOINDEX(h_mixer, &hm.adapter_index); - hm.u.mx.store.command = command; - hm.u.mx.store.index = index; - hpi_send_recv(&hm, &hr); - return hr.error; -} - -static -u16 hpi_control_param_set(const struct hpi_hsubsys *ph_subsys, - const u32 h_control, const u16 attrib, const u32 param1, - const u32 param2) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_SET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = attrib; - hm.u.c.param1 = param1; - hm.u.c.param2 = param2; - hpi_send_recv(&hm, &hr); - return hr.error; -} - -static -u16 hpi_control_param_get(const struct hpi_hsubsys *ph_subsys, - const u32 h_control, const u16 attrib, u32 param1, u32 param2, - u32 *pparam1, u32 *pparam2) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = attrib; - hm.u.c.param1 = param1; - hm.u.c.param2 = param2; - hpi_send_recv(&hm, &hr); - if (pparam1) - *pparam1 = hr.u.c.param1; - if (pparam2) - *pparam2 = hr.u.c.param2; - - return hr.error; -} - -#define hpi_control_param1_get(s, h, a, p1) \ - hpi_control_param_get(s, h, a, 0, 0, p1, NULL) -#define hpi_control_param2_get(s, h, a, p1, p2) \ - hpi_control_param_get(s, h, a, 0, 0, p1, p2) -#define hpi_control_ex_param1_get(s, h, a, p1) \ - hpi_control_ex_param_get(s, h, a, 0, 0, p1, NULL) -#define hpi_control_ex_param2_get(s, h, a, p1, p2) \ - hpi_control_ex_param_get(s, h, a, 0, 0, p1, p2) - -static -u16 hpi_control_query(const struct hpi_hsubsys *ph_subsys, - const u32 h_control, const u16 attrib, const u32 index, - const u32 param, u32 *psetting) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_INFO); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - - hm.u.c.attribute = attrib; - hm.u.c.param1 = index; - hm.u.c.param2 = param; - - hpi_send_recv(&hm, &hr); - *psetting = hr.u.c.param1; - - return hr.error; -} - -static u16 hpi_control_get_string(const struct hpi_hsubsys *ph_subsys, - const u32 h_control, const u16 attribute, char *psz_string, - const u32 string_length) -{ - unsigned int sub_string_index = 0, j = 0; - char c = 0; - unsigned int n = 0; - u16 hE = 0; - - if ((string_length < 1) || (string_length > 256)) - return HPI_ERROR_INVALID_CONTROL_VALUE; - for (sub_string_index = 0; sub_string_index < string_length; - sub_string_index += 8) { - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = attribute; - hm.u.c.param1 = sub_string_index; - hm.u.c.param2 = 0; - hpi_send_recv(&hm, &hr); - - if (sub_string_index == 0 - && (hr.u.cu.chars8.remaining_chars + 8) > - string_length) - return HPI_ERROR_INVALID_CONTROL_VALUE; - - if (hr.error) { - hE = hr.error; - break; - } - for (j = 0; j < 8; j++) { - c = hr.u.cu.chars8.sz_data[j]; - psz_string[sub_string_index + j] = c; - n++; - if (n >= string_length) { - psz_string[string_length - 1] = 0; - hE = HPI_ERROR_INVALID_CONTROL_VALUE; - break; - } - if (c == 0) - break; - } - - if ((hr.u.cu.chars8.remaining_chars == 0) - && ((sub_string_index + j) < string_length) - && (c != 0)) { - c = 0; - psz_string[sub_string_index + j] = c; - } - if (c == 0) - break; - } - return hE; -} - -u16 HPI_AESEBU__receiver_query_format(const struct hpi_hsubsys *ph_subsys, - const u32 h_aes_rx, const u32 index, u16 *pw_format) -{ - u32 qr; - u16 err; - - err = hpi_control_query(ph_subsys, h_aes_rx, HPI_AESEBURX_FORMAT, - index, 0, &qr); - *pw_format = (u16)qr; - return err; -} - -u16 HPI_AESEBU__receiver_set_format(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 format) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_AESEBURX_FORMAT, format, 0); -} - -u16 HPI_AESEBU__receiver_get_format(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pw_format) -{ - u16 err; - u32 param; - - err = hpi_control_param1_get(ph_subsys, h_control, - HPI_AESEBURX_FORMAT, ¶m); - if (!err && pw_format) - *pw_format = (u16)param; - - return err; -} - -u16 HPI_AESEBU__receiver_get_sample_rate(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *psample_rate) -{ - return hpi_control_param1_get(ph_subsys, h_control, - HPI_AESEBURX_SAMPLERATE, psample_rate); -} - -u16 HPI_AESEBU__receiver_get_user_data(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 index, u16 *pw_data) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_AESEBURX_USERDATA; - hm.u.c.param1 = index; - - hpi_send_recv(&hm, &hr); - - if (pw_data) - *pw_data = (u16)hr.u.c.param2; - return hr.error; -} - -u16 HPI_AESEBU__receiver_get_channel_status(const struct hpi_hsubsys - *ph_subsys, u32 h_control, u16 index, u16 *pw_data) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_AESEBURX_CHANNELSTATUS; - hm.u.c.param1 = index; - - hpi_send_recv(&hm, &hr); - - if (pw_data) - *pw_data = (u16)hr.u.c.param2; - return hr.error; -} - -u16 HPI_AESEBU__receiver_get_error_status(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pw_error_data) -{ - u32 error_data = 0; - u16 error = 0; - - error = hpi_control_param1_get(ph_subsys, h_control, - HPI_AESEBURX_ERRORSTATUS, &error_data); - if (pw_error_data) - *pw_error_data = (u16)error_data; - return error; -} - -u16 HPI_AESEBU__transmitter_set_sample_rate(const struct hpi_hsubsys - *ph_subsys, u32 h_control, u32 sample_rate) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_AESEBUTX_SAMPLERATE, sample_rate, 0); -} - -u16 HPI_AESEBU__transmitter_set_user_data(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 index, u16 data) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_AESEBUTX_USERDATA, index, data); -} - -u16 HPI_AESEBU__transmitter_set_channel_status(const struct hpi_hsubsys - *ph_subsys, u32 h_control, u16 index, u16 data) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_AESEBUTX_CHANNELSTATUS, index, data); -} - -u16 HPI_AESEBU__transmitter_get_channel_status(const struct hpi_hsubsys - *ph_subsys, u32 h_control, u16 index, u16 *pw_data) -{ - return HPI_ERROR_INVALID_OPERATION; -} - -u16 HPI_AESEBU__transmitter_query_format(const struct hpi_hsubsys *ph_subsys, - const u32 h_aes_tx, const u32 index, u16 *pw_format) -{ - u32 qr; - u16 err; - - err = hpi_control_query(ph_subsys, h_aes_tx, HPI_AESEBUTX_FORMAT, - index, 0, &qr); - *pw_format = (u16)qr; - return err; -} - -u16 HPI_AESEBU__transmitter_set_format(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 output_format) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_AESEBUTX_FORMAT, output_format, 0); -} - -u16 HPI_AESEBU__transmitter_get_format(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pw_output_format) -{ - u16 err; - u32 param; - - err = hpi_control_param1_get(ph_subsys, h_control, - HPI_AESEBUTX_FORMAT, ¶m); - if (!err && pw_output_format) - *pw_output_format = (u16)param; - - return err; -} - -u16 hpi_bitstream_set_clock_edge(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 edge_type) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_BITSTREAM_CLOCK_EDGE, edge_type, 0); -} - -u16 hpi_bitstream_set_data_polarity(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 polarity) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_BITSTREAM_DATA_POLARITY, polarity, 0); -} - -u16 hpi_bitstream_get_activity(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pw_clk_activity, u16 *pw_data_activity) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_BITSTREAM_ACTIVITY; - hpi_send_recv(&hm, &hr); - if (pw_clk_activity) - *pw_clk_activity = (u16)hr.u.c.param1; - if (pw_data_activity) - *pw_data_activity = (u16)hr.u.c.param2; - return hr.error; -} - -u16 hpi_channel_mode_query_mode(const struct hpi_hsubsys *ph_subsys, - const u32 h_mode, const u32 index, u16 *pw_mode) -{ - u32 qr; - u16 err; - - err = hpi_control_query(ph_subsys, h_mode, HPI_CHANNEL_MODE_MODE, - index, 0, &qr); - *pw_mode = (u16)qr; - return err; -} - -u16 hpi_channel_mode_set(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 mode) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_CHANNEL_MODE_MODE, mode, 0); -} - -u16 hpi_channel_mode_get(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 *mode) -{ - u32 mode32 = 0; - u16 error = hpi_control_param1_get(ph_subsys, h_control, - HPI_CHANNEL_MODE_MODE, &mode32); - if (mode) - *mode = (u16)mode32; - return error; -} - -u16 hpi_cobranet_hmi_write(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u32 hmi_address, u32 byte_count, u8 *pb_data) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROLEX, - HPI_CONTROL_SET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - - hm.u.cx.u.cobranet_data.byte_count = byte_count; - hm.u.cx.u.cobranet_data.hmi_address = hmi_address; - - if (byte_count <= 8) { - memcpy(hm.u.cx.u.cobranet_data.data, pb_data, byte_count); - hm.u.cx.attribute = HPI_COBRANET_SET; - } else { - hm.u.cx.u.cobranet_bigdata.pb_data = pb_data; - hm.u.cx.attribute = HPI_COBRANET_SET_DATA; - } - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_cobranet_hmi_read(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u32 hmi_address, u32 max_byte_count, u32 *pbyte_count, u8 *pb_data) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROLEX, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - - hm.u.cx.u.cobranet_data.byte_count = max_byte_count; - hm.u.cx.u.cobranet_data.hmi_address = hmi_address; - - if (max_byte_count <= 8) { - hm.u.cx.attribute = HPI_COBRANET_GET; - } else { - hm.u.cx.u.cobranet_bigdata.pb_data = pb_data; - hm.u.cx.attribute = HPI_COBRANET_GET_DATA; - } - - hpi_send_recv(&hm, &hr); - if (!hr.error && pb_data) { - - *pbyte_count = hr.u.cx.u.cobranet_data.byte_count; - - if (*pbyte_count < max_byte_count) - max_byte_count = *pbyte_count; - - if (hm.u.cx.attribute == HPI_COBRANET_GET) { - memcpy(pb_data, hr.u.cx.u.cobranet_data.data, - max_byte_count); - } else { - - } - - } - return hr.error; -} - -u16 hpi_cobranet_hmi_get_status(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *pstatus, u32 *preadable_size, - u32 *pwriteable_size) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROLEX, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - - hm.u.cx.attribute = HPI_COBRANET_GET_STATUS; - - hpi_send_recv(&hm, &hr); - if (!hr.error) { - if (pstatus) - *pstatus = hr.u.cx.u.cobranet_status.status; - if (preadable_size) - *preadable_size = - hr.u.cx.u.cobranet_status.readable_size; - if (pwriteable_size) - *pwriteable_size = - hr.u.cx.u.cobranet_status.writeable_size; - } - return hr.error; -} - -u16 hpi_cobranet_getI_paddress(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *pi_paddress) -{ - u32 byte_count; - u32 iP; - u16 error; - error = hpi_cobranet_hmi_read(ph_subsys, h_control, - HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, &byte_count, - (u8 *)&iP); - - *pi_paddress = - ((iP & 0xff000000) >> 8) | ((iP & 0x00ff0000) << 8) | ((iP & - 0x0000ff00) >> 8) | ((iP & 0x000000ff) << 8); - - if (error) - *pi_paddress = 0; - - return error; - -} - -u16 hpi_cobranet_setI_paddress(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 i_paddress) -{ - u32 iP; - u16 error; - - iP = ((i_paddress & 0xff000000) >> 8) | ((i_paddress & 0x00ff0000) << - 8) | ((i_paddress & 0x0000ff00) >> 8) | ((i_paddress & - 0x000000ff) << 8); - - error = hpi_cobranet_hmi_write(ph_subsys, h_control, - HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, (u8 *)&iP); - - return error; - -} - -u16 hpi_cobranet_get_staticI_paddress(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *pi_paddress) -{ - u32 byte_count; - u32 iP; - u16 error; - error = hpi_cobranet_hmi_read(ph_subsys, h_control, - HPI_COBRANET_HMI_cobra_ip_mon_staticIP, 4, &byte_count, - (u8 *)&iP); - - *pi_paddress = - ((iP & 0xff000000) >> 8) | ((iP & 0x00ff0000) << 8) | ((iP & - 0x0000ff00) >> 8) | ((iP & 0x000000ff) << 8); - - if (error) - *pi_paddress = 0; - - return error; - -} - -u16 hpi_cobranet_set_staticI_paddress(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 i_paddress) -{ - u32 iP; - u16 error; - - iP = ((i_paddress & 0xff000000) >> 8) | ((i_paddress & 0x00ff0000) << - 8) | ((i_paddress & 0x0000ff00) >> 8) | ((i_paddress & - 0x000000ff) << 8); - - error = hpi_cobranet_hmi_write(ph_subsys, h_control, - HPI_COBRANET_HMI_cobra_ip_mon_staticIP, 4, (u8 *)&iP); - - return error; - -} - -u16 hpi_cobranet_getMA_caddress(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *pmAC_MS_bs, u32 *pmAC_LS_bs) -{ - u32 byte_count; - u16 error; - u32 mAC; - error = hpi_cobranet_hmi_read(ph_subsys, h_control, - HPI_COBRANET_HMI_cobra_if_phy_address, 4, &byte_count, - (u8 *)&mAC); - *pmAC_MS_bs = - ((mAC & 0xff000000) >> 8) | ((mAC & 0x00ff0000) << 8) | ((mAC - & 0x0000ff00) >> 8) | ((mAC & 0x000000ff) << 8); - error += hpi_cobranet_hmi_read(ph_subsys, h_control, - HPI_COBRANET_HMI_cobra_if_phy_address + 1, 4, &byte_count, - (u8 *)&mAC); - *pmAC_LS_bs = - ((mAC & 0xff000000) >> 8) | ((mAC & 0x00ff0000) << 8) | ((mAC - & 0x0000ff00) >> 8) | ((mAC & 0x000000ff) << 8); - - if (error) { - *pmAC_MS_bs = 0; - *pmAC_LS_bs = 0; - } - - return error; -} - -u16 hpi_compander_set(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 attack, u16 decay, short ratio100, short threshold0_01dB, - short makeup_gain0_01dB) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_SET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - - hm.u.c.param1 = attack + ((u32)ratio100 << 16); - hm.u.c.param2 = (decay & 0xFFFFL); - hm.u.c.an_log_value[0] = threshold0_01dB; - hm.u.c.an_log_value[1] = makeup_gain0_01dB; - hm.u.c.attribute = HPI_COMPANDER_PARAMS; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_compander_get(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 *pw_attack, u16 *pw_decay, short *pw_ratio100, - short *pn_threshold0_01dB, short *pn_makeup_gain0_01dB) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_COMPANDER_PARAMS; - - hpi_send_recv(&hm, &hr); - - if (pw_attack) - *pw_attack = (short)(hr.u.c.param1 & 0xFFFF); - if (pw_decay) - *pw_decay = (short)(hr.u.c.param2 & 0xFFFF); - if (pw_ratio100) - *pw_ratio100 = (short)(hr.u.c.param1 >> 16); - - if (pn_threshold0_01dB) - *pn_threshold0_01dB = hr.u.c.an_log_value[0]; - if (pn_makeup_gain0_01dB) - *pn_makeup_gain0_01dB = hr.u.c.an_log_value[1]; - - return hr.error; -} - -u16 hpi_level_query_range(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short *min_gain_01dB, short *max_gain_01dB, short *step_gain_01dB) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_LEVEL_RANGE; - - hpi_send_recv(&hm, &hr); - if (hr.error) { - hr.u.c.an_log_value[0] = 0; - hr.u.c.an_log_value[1] = 0; - hr.u.c.param1 = 0; - } - if (min_gain_01dB) - *min_gain_01dB = hr.u.c.an_log_value[0]; - if (max_gain_01dB) - *max_gain_01dB = hr.u.c.an_log_value[1]; - if (step_gain_01dB) - *step_gain_01dB = (short)hr.u.c.param1; - return hr.error; -} - -u16 hpi_level_set_gain(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short an_gain0_01dB[HPI_MAX_CHANNELS] - ) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_SET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - memcpy(hm.u.c.an_log_value, an_gain0_01dB, - sizeof(short) * HPI_MAX_CHANNELS); - hm.u.c.attribute = HPI_LEVEL_GAIN; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_level_get_gain(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short an_gain0_01dB[HPI_MAX_CHANNELS] - ) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_LEVEL_GAIN; - - hpi_send_recv(&hm, &hr); - - memcpy(an_gain0_01dB, hr.u.c.an_log_value, - sizeof(short) * HPI_MAX_CHANNELS); - return hr.error; -} - -u16 hpi_meter_query_channels(const struct hpi_hsubsys *ph_subsys, - const u32 h_meter, u32 *p_channels) -{ - return hpi_control_query(ph_subsys, h_meter, HPI_METER_NUM_CHANNELS, - 0, 0, p_channels); -} - -u16 hpi_meter_get_peak(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short an_peakdB[HPI_MAX_CHANNELS] - ) -{ - short i = 0; - - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.obj_index = hm.obj_index; - hm.u.c.attribute = HPI_METER_PEAK; - - hpi_send_recv(&hm, &hr); - - if (!hr.error) - memcpy(an_peakdB, hr.u.c.an_log_value, - sizeof(short) * HPI_MAX_CHANNELS); - else - for (i = 0; i < HPI_MAX_CHANNELS; i++) - an_peakdB[i] = HPI_METER_MINIMUM; - return hr.error; -} - -u16 hpi_meter_get_rms(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short an_rmsdB[HPI_MAX_CHANNELS] - ) -{ - short i = 0; - - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_METER_RMS; - - hpi_send_recv(&hm, &hr); - - if (!hr.error) - memcpy(an_rmsdB, hr.u.c.an_log_value, - sizeof(short) * HPI_MAX_CHANNELS); - else - for (i = 0; i < HPI_MAX_CHANNELS; i++) - an_rmsdB[i] = HPI_METER_MINIMUM; - - return hr.error; -} - -u16 hpi_meter_set_rms_ballistics(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 attack, u16 decay) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_METER_RMS_BALLISTICS, attack, decay); -} - -u16 hpi_meter_get_rms_ballistics(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pn_attack, u16 *pn_decay) -{ - u32 attack; - u32 decay; - u16 error; - - error = hpi_control_param2_get(ph_subsys, h_control, - HPI_METER_RMS_BALLISTICS, &attack, &decay); - - if (pn_attack) - *pn_attack = (unsigned short)attack; - if (pn_decay) - *pn_decay = (unsigned short)decay; - - return error; -} - -u16 hpi_meter_set_peak_ballistics(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 attack, u16 decay) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_METER_PEAK_BALLISTICS, attack, decay); -} - -u16 hpi_meter_get_peak_ballistics(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pn_attack, u16 *pn_decay) -{ - u32 attack; - u32 decay; - u16 error; - - error = hpi_control_param2_get(ph_subsys, h_control, - HPI_METER_PEAK_BALLISTICS, &attack, &decay); - - if (pn_attack) - *pn_attack = (short)attack; - if (pn_decay) - *pn_decay = (short)decay; - - return error; -} - -u16 hpi_microphone_set_phantom_power(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 on_off) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_MICROPHONE_PHANTOM_POWER, (u32)on_off, 0); -} - -u16 hpi_microphone_get_phantom_power(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pw_on_off) -{ - u16 error = 0; - u32 on_off = 0; - error = hpi_control_param1_get(ph_subsys, h_control, - HPI_MICROPHONE_PHANTOM_POWER, &on_off); - if (pw_on_off) - *pw_on_off = (u16)on_off; - return error; -} - -u16 hpi_multiplexer_set_source(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 source_node_type, u16 source_node_index) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_MULTIPLEXER_SOURCE, source_node_type, source_node_index); -} - -u16 hpi_multiplexer_get_source(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *source_node_type, u16 *source_node_index) -{ - u32 node, index; - u16 error = hpi_control_param2_get(ph_subsys, h_control, - HPI_MULTIPLEXER_SOURCE, &node, - &index); - if (source_node_type) - *source_node_type = (u16)node; - if (source_node_index) - *source_node_index = (u16)index; - return error; -} - -u16 hpi_multiplexer_query_source(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 index, u16 *source_node_type, - u16 *source_node_index) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_MULTIPLEXER_QUERYSOURCE; - hm.u.c.param1 = index; - - hpi_send_recv(&hm, &hr); - - if (source_node_type) - *source_node_type = (u16)hr.u.c.param1; - if (source_node_index) - *source_node_index = (u16)hr.u.c.param2; - return hr.error; -} - -u16 hpi_parametricEQ__get_info(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pw_number_of_bands, u16 *pw_on_off) -{ - u32 oB = 0; - u32 oO = 0; - u16 error = 0; - - error = hpi_control_param2_get(ph_subsys, h_control, - HPI_EQUALIZER_NUM_FILTERS, &oO, &oB); - if (pw_number_of_bands) - *pw_number_of_bands = (u16)oB; - if (pw_on_off) - *pw_on_off = (u16)oO; - return error; -} - -u16 hpi_parametricEQ__set_state(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 on_off) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_EQUALIZER_NUM_FILTERS, on_off, 0); -} - -u16 hpi_parametricEQ__get_band(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 index, u16 *pn_type, u32 *pfrequency_hz, - short *pnQ100, short *pn_gain0_01dB) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_EQUALIZER_FILTER; - hm.u.c.param2 = index; - - hpi_send_recv(&hm, &hr); - - if (pfrequency_hz) - *pfrequency_hz = hr.u.c.param1; - if (pn_type) - *pn_type = (u16)(hr.u.c.param2 >> 16); - if (pnQ100) - *pnQ100 = hr.u.c.an_log_value[1]; - if (pn_gain0_01dB) - *pn_gain0_01dB = hr.u.c.an_log_value[0]; - - return hr.error; -} - -u16 hpi_parametricEQ__set_band(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 index, u16 type, u32 frequency_hz, short q100, - short gain0_01dB) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_SET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - - hm.u.c.param1 = frequency_hz; - hm.u.c.param2 = (index & 0xFFFFL) + ((u32)type << 16); - hm.u.c.an_log_value[0] = gain0_01dB; - hm.u.c.an_log_value[1] = q100; - hm.u.c.attribute = HPI_EQUALIZER_FILTER; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_parametricEQ__get_coeffs(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 index, short coeffs[5] - ) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_EQUALIZER_COEFFICIENTS; - hm.u.c.param2 = index; - - hpi_send_recv(&hm, &hr); - - coeffs[0] = (short)hr.u.c.an_log_value[0]; - coeffs[1] = (short)hr.u.c.an_log_value[1]; - coeffs[2] = (short)hr.u.c.param1; - coeffs[3] = (short)(hr.u.c.param1 >> 16); - coeffs[4] = (short)hr.u.c.param2; - - return hr.error; -} - -u16 hpi_sample_clock_query_source(const struct hpi_hsubsys *ph_subsys, - const u32 h_clock, const u32 index, u16 *pw_source) -{ - u32 qr; - u16 err; - - err = hpi_control_query(ph_subsys, h_clock, HPI_SAMPLECLOCK_SOURCE, - index, 0, &qr); - *pw_source = (u16)qr; - return err; -} - -u16 hpi_sample_clock_set_source(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 source) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_SAMPLECLOCK_SOURCE, source, 0); -} - -u16 hpi_sample_clock_get_source(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pw_source) -{ - u16 error = 0; - u32 source = 0; - error = hpi_control_param1_get(ph_subsys, h_control, - HPI_SAMPLECLOCK_SOURCE, &source); - if (!error) - if (pw_source) - *pw_source = (u16)source; - return error; -} - -u16 hpi_sample_clock_query_source_index(const struct hpi_hsubsys *ph_subsys, - const u32 h_clock, const u32 index, const u32 source, - u16 *pw_source_index) -{ - u32 qr; - u16 err; - - err = hpi_control_query(ph_subsys, h_clock, - HPI_SAMPLECLOCK_SOURCE_INDEX, index, source, &qr); - *pw_source_index = (u16)qr; - return err; -} - -u16 hpi_sample_clock_set_source_index(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 source_index) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_SAMPLECLOCK_SOURCE_INDEX, source_index, 0); -} - -u16 hpi_sample_clock_get_source_index(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u16 *pw_source_index) -{ - u16 error = 0; - u32 source_index = 0; - error = hpi_control_param1_get(ph_subsys, h_control, - HPI_SAMPLECLOCK_SOURCE_INDEX, &source_index); - if (!error) - if (pw_source_index) - *pw_source_index = (u16)source_index; - return error; -} - -u16 hpi_sample_clock_query_local_rate(const struct hpi_hsubsys *ph_subsys, - const u32 h_clock, const u32 index, u32 *prate) -{ - u16 err; - err = hpi_control_query(ph_subsys, h_clock, - HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, index, 0, prate); - - return err; -} - -u16 hpi_sample_clock_set_local_rate(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 sample_rate) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, sample_rate, 0); -} - -u16 hpi_sample_clock_get_local_rate(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *psample_rate) -{ - u16 error = 0; - u32 sample_rate = 0; - error = hpi_control_param1_get(ph_subsys, h_control, - HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, &sample_rate); - if (!error) - if (psample_rate) - *psample_rate = sample_rate; - return error; -} - -u16 hpi_sample_clock_get_sample_rate(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *psample_rate) -{ - u16 error = 0; - u32 sample_rate = 0; - error = hpi_control_param1_get(ph_subsys, h_control, - HPI_SAMPLECLOCK_SAMPLERATE, &sample_rate); - if (!error) - if (psample_rate) - *psample_rate = sample_rate; - return error; -} - -u16 hpi_sample_clock_set_auto(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 enable) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_SAMPLECLOCK_AUTO, enable, 0); -} - -u16 hpi_sample_clock_get_auto(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *penable) -{ - return hpi_control_param1_get(ph_subsys, h_control, - HPI_SAMPLECLOCK_AUTO, penable); -} - -u16 hpi_sample_clock_set_local_rate_lock(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 lock) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_SAMPLECLOCK_LOCAL_LOCK, lock, 0); -} - -u16 hpi_sample_clock_get_local_rate_lock(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *plock) -{ - return hpi_control_param1_get(ph_subsys, h_control, - HPI_SAMPLECLOCK_LOCAL_LOCK, plock); -} - -u16 hpi_tone_detector_get_frequency(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 index, u32 *frequency) -{ - return hpi_control_param_get(ph_subsys, h_control, - HPI_TONEDETECTOR_FREQUENCY, index, 0, frequency, NULL); -} - -u16 hpi_tone_detector_get_state(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *state) -{ - return hpi_control_param_get(ph_subsys, h_control, - HPI_TONEDETECTOR_STATE, 0, 0, (u32 *)state, NULL); -} - -u16 hpi_tone_detector_set_enable(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 enable) -{ - return hpi_control_param_set(ph_subsys, h_control, HPI_GENERIC_ENABLE, - (u32)enable, 0); -} - -u16 hpi_tone_detector_get_enable(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *enable) -{ - return hpi_control_param_get(ph_subsys, h_control, HPI_GENERIC_ENABLE, - 0, 0, (u32 *)enable, NULL); -} - -u16 hpi_tone_detector_set_event_enable(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 event_enable) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_GENERIC_EVENT_ENABLE, (u32)event_enable, 0); -} - -u16 hpi_tone_detector_get_event_enable(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *event_enable) -{ - return hpi_control_param_get(ph_subsys, h_control, - HPI_GENERIC_EVENT_ENABLE, 0, 0, (u32 *)event_enable, NULL); -} - -u16 hpi_tone_detector_set_threshold(const struct hpi_hsubsys *ph_subsys, - u32 h_control, int threshold) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_TONEDETECTOR_THRESHOLD, (u32)threshold, 0); -} - -u16 hpi_tone_detector_get_threshold(const struct hpi_hsubsys *ph_subsys, - u32 h_control, int *threshold) -{ - return hpi_control_param_get(ph_subsys, h_control, - HPI_TONEDETECTOR_THRESHOLD, 0, 0, (u32 *)threshold, NULL); -} - -u16 hpi_silence_detector_get_state(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *state) -{ - return hpi_control_param_get(ph_subsys, h_control, - HPI_SILENCEDETECTOR_STATE, 0, 0, (u32 *)state, NULL); -} - -u16 hpi_silence_detector_set_enable(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 enable) -{ - return hpi_control_param_set(ph_subsys, h_control, HPI_GENERIC_ENABLE, - (u32)enable, 0); -} - -u16 hpi_silence_detector_get_enable(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *enable) -{ - return hpi_control_param_get(ph_subsys, h_control, HPI_GENERIC_ENABLE, - 0, 0, (u32 *)enable, NULL); -} - -u16 hpi_silence_detector_set_event_enable(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 event_enable) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_GENERIC_EVENT_ENABLE, (u32)event_enable, 0); -} - -u16 hpi_silence_detector_get_event_enable(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *event_enable) -{ - return hpi_control_param_get(ph_subsys, h_control, - HPI_GENERIC_EVENT_ENABLE, 0, 0, (u32 *)event_enable, NULL); -} - -u16 hpi_silence_detector_set_delay(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 delay) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_SILENCEDETECTOR_DELAY, (u32)delay, 0); -} - -u16 hpi_silence_detector_get_delay(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *delay) -{ - return hpi_control_param_get(ph_subsys, h_control, - HPI_SILENCEDETECTOR_DELAY, 0, 0, (u32 *)delay, NULL); -} - -u16 hpi_silence_detector_set_threshold(const struct hpi_hsubsys *ph_subsys, - u32 h_control, int threshold) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_SILENCEDETECTOR_THRESHOLD, (u32)threshold, 0); -} - -u16 hpi_silence_detector_get_threshold(const struct hpi_hsubsys *ph_subsys, - u32 h_control, int *threshold) -{ - return hpi_control_param_get(ph_subsys, h_control, - HPI_SILENCEDETECTOR_THRESHOLD, 0, 0, (u32 *)threshold, NULL); -} - -u16 hpi_tuner_query_band(const struct hpi_hsubsys *ph_subsys, - const u32 h_tuner, const u32 index, u16 *pw_band) -{ - u32 qr; - u16 err; - - err = hpi_control_query(ph_subsys, h_tuner, HPI_TUNER_BAND, index, 0, - &qr); - *pw_band = (u16)qr; - return err; -} - -u16 hpi_tuner_set_band(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 band) -{ - return hpi_control_param_set(ph_subsys, h_control, HPI_TUNER_BAND, - band, 0); -} - -u16 hpi_tuner_get_band(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 *pw_band) -{ - u32 band = 0; - u16 error = 0; - - error = hpi_control_param1_get(ph_subsys, h_control, HPI_TUNER_BAND, - &band); - if (pw_band) - *pw_band = (u16)band; - return error; -} - -u16 hpi_tuner_query_frequency(const struct hpi_hsubsys *ph_subsys, - const u32 h_tuner, const u32 index, const u16 band, u32 *pfreq) -{ - return hpi_control_query(ph_subsys, h_tuner, HPI_TUNER_FREQ, index, - band, pfreq); -} - -u16 hpi_tuner_set_frequency(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 freq_ink_hz) -{ - return hpi_control_param_set(ph_subsys, h_control, HPI_TUNER_FREQ, - freq_ink_hz, 0); -} - -u16 hpi_tuner_get_frequency(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *pw_freq_ink_hz) -{ - return hpi_control_param1_get(ph_subsys, h_control, HPI_TUNER_FREQ, - pw_freq_ink_hz); -} - -u16 hpi_tuner_query_gain(const struct hpi_hsubsys *ph_subsys, - const u32 h_tuner, const u32 index, u16 *pw_gain) -{ - u32 qr; - u16 err; - - err = hpi_control_query(ph_subsys, h_tuner, HPI_TUNER_BAND, index, 0, - &qr); - *pw_gain = (u16)qr; - return err; -} - -u16 hpi_tuner_set_gain(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short gain) -{ - return hpi_control_param_set(ph_subsys, h_control, HPI_TUNER_GAIN, - gain, 0); -} - -u16 hpi_tuner_get_gain(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short *pn_gain) -{ - u32 gain = 0; - u16 error = 0; - - error = hpi_control_param1_get(ph_subsys, h_control, HPI_TUNER_GAIN, - &gain); - if (pn_gain) - *pn_gain = (u16)gain; - return error; -} - -u16 hpi_tuner_getRF_level(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short *pw_level) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_TUNER_LEVEL; - hm.u.c.param1 = HPI_TUNER_LEVEL_AVERAGE; - hpi_send_recv(&hm, &hr); - if (pw_level) - *pw_level = (short)hr.u.c.param1; - return hr.error; -} - -u16 hpi_tuner_get_rawRF_level(const struct hpi_hsubsys *ph_subsys, - u32 h_control, short *pw_level) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_TUNER_LEVEL; - hm.u.c.param1 = HPI_TUNER_LEVEL_RAW; - hpi_send_recv(&hm, &hr); - if (pw_level) - *pw_level = (short)hr.u.c.param1; - return hr.error; -} - -u16 hpi_tuner_query_deemphasis(const struct hpi_hsubsys *ph_subsys, - const u32 h_tuner, const u32 index, const u16 band, u32 *pdeemphasis) -{ - return hpi_control_query(ph_subsys, h_tuner, HPI_TUNER_DEEMPHASIS, - index, band, pdeemphasis); -} - -u16 hpi_tuner_set_deemphasis(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 deemphasis) -{ - return hpi_control_param_set(ph_subsys, h_control, - HPI_TUNER_DEEMPHASIS, deemphasis, 0); -} - -u16 hpi_tuner_get_deemphasis(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *pdeemphasis) -{ - return hpi_control_param1_get(ph_subsys, h_control, - HPI_TUNER_DEEMPHASIS, pdeemphasis); -} - -u16 hpi_tuner_query_program(const struct hpi_hsubsys *ph_subsys, - const u32 h_tuner, u32 *pbitmap_program) -{ - return hpi_control_query(ph_subsys, h_tuner, HPI_TUNER_PROGRAM, 0, 0, - pbitmap_program); -} - -u16 hpi_tuner_set_program(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u32 program) -{ - return hpi_control_param_set(ph_subsys, h_control, HPI_TUNER_PROGRAM, - program, 0); -} - -u16 hpi_tuner_get_program(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u32 *pprogram) -{ - return hpi_control_param1_get(ph_subsys, h_control, HPI_TUNER_PROGRAM, - pprogram); -} - -u16 hpi_tuner_get_hd_radio_dsp_version(const struct hpi_hsubsys *ph_subsys, - u32 h_control, char *psz_dsp_version, const u32 string_size) -{ - return hpi_control_get_string(ph_subsys, h_control, - HPI_TUNER_HDRADIO_DSP_VERSION, psz_dsp_version, string_size); -} - -u16 hpi_tuner_get_hd_radio_sdk_version(const struct hpi_hsubsys *ph_subsys, - u32 h_control, char *psz_sdk_version, const u32 string_size) -{ - return hpi_control_get_string(ph_subsys, h_control, - HPI_TUNER_HDRADIO_SDK_VERSION, psz_sdk_version, string_size); -} - -u16 hpi_tuner_get_status(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 *pw_status_mask, u16 *pw_status) -{ - u32 status = 0; - u16 error = 0; - - error = hpi_control_param1_get(ph_subsys, h_control, HPI_TUNER_STATUS, - &status); - if (pw_status) { - if (!error) { - *pw_status_mask = (u16)(status >> 16); - *pw_status = (u16)(status & 0xFFFF); - } else { - *pw_status_mask = 0; - *pw_status = 0; - } - } - return error; -} - -u16 hpi_tuner_set_mode(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u32 mode, u32 value) -{ - return hpi_control_param_set(ph_subsys, h_control, HPI_TUNER_MODE, - mode, value); -} - -u16 hpi_tuner_get_mode(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u32 mode, u32 *pn_value) -{ - return hpi_control_param_get(ph_subsys, h_control, HPI_TUNER_MODE, - mode, 0, pn_value, NULL); -} - -u16 hpi_tuner_get_hd_radio_signal_quality(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *pquality) -{ - return hpi_control_param_get(ph_subsys, h_control, - HPI_TUNER_HDRADIO_SIGNAL_QUALITY, 0, 0, pquality, NULL); -} - -u16 hpi_tuner_getRDS(const struct hpi_hsubsys *ph_subsys, u32 h_control, - char *p_data) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_TUNER_RDS; - hpi_send_recv(&hm, &hr); - if (p_data) { - *(u32 *)&p_data[0] = hr.u.cu.tuner.rds.data[0]; - *(u32 *)&p_data[4] = hr.u.cu.tuner.rds.data[1]; - *(u32 *)&p_data[8] = hr.u.cu.tuner.rds.bLER; - } - return hr.error; -} - -u16 HPI_PAD__get_channel_name(const struct hpi_hsubsys *ph_subsys, - u32 h_control, char *psz_string, const u32 data_length) -{ - return hpi_control_get_string(ph_subsys, h_control, - HPI_PAD_CHANNEL_NAME, psz_string, data_length); -} - -u16 HPI_PAD__get_artist(const struct hpi_hsubsys *ph_subsys, u32 h_control, - char *psz_string, const u32 data_length) -{ - return hpi_control_get_string(ph_subsys, h_control, HPI_PAD_ARTIST, - psz_string, data_length); -} - -u16 HPI_PAD__get_title(const struct hpi_hsubsys *ph_subsys, u32 h_control, - char *psz_string, const u32 data_length) -{ - return hpi_control_get_string(ph_subsys, h_control, HPI_PAD_TITLE, - psz_string, data_length); -} - -u16 HPI_PAD__get_comment(const struct hpi_hsubsys *ph_subsys, u32 h_control, - char *psz_string, const u32 data_length) -{ - return hpi_control_get_string(ph_subsys, h_control, HPI_PAD_COMMENT, - psz_string, data_length); -} - -u16 HPI_PAD__get_program_type(const struct hpi_hsubsys *ph_subsys, - u32 h_control, u32 *ppTY) -{ - return hpi_control_param_get(ph_subsys, h_control, - HPI_PAD_PROGRAM_TYPE, 0, 0, ppTY, NULL); -} - -u16 HPI_PAD__get_rdsPI(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u32 *ppI) -{ - return hpi_control_param_get(ph_subsys, h_control, HPI_PAD_PROGRAM_ID, - 0, 0, ppI, NULL); -} - -u16 hpi_volume_query_channels(const struct hpi_hsubsys *ph_subsys, - const u32 h_volume, u32 *p_channels) -{ - return hpi_control_query(ph_subsys, h_volume, HPI_VOLUME_NUM_CHANNELS, - 0, 0, p_channels); -} - -u16 hpi_volume_set_gain(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short an_log_gain[HPI_MAX_CHANNELS] - ) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_SET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - memcpy(hm.u.c.an_log_value, an_log_gain, - sizeof(short) * HPI_MAX_CHANNELS); - hm.u.c.attribute = HPI_VOLUME_GAIN; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_volume_get_gain(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short an_log_gain[HPI_MAX_CHANNELS] - ) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_VOLUME_GAIN; - - hpi_send_recv(&hm, &hr); - - memcpy(an_log_gain, hr.u.c.an_log_value, - sizeof(short) * HPI_MAX_CHANNELS); - return hr.error; -} - -u16 hpi_volume_query_range(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short *min_gain_01dB, short *max_gain_01dB, short *step_gain_01dB) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_VOLUME_RANGE; - - hpi_send_recv(&hm, &hr); - if (hr.error) { - hr.u.c.an_log_value[0] = 0; - hr.u.c.an_log_value[1] = 0; - hr.u.c.param1 = 0; - } - if (min_gain_01dB) - *min_gain_01dB = hr.u.c.an_log_value[0]; - if (max_gain_01dB) - *max_gain_01dB = hr.u.c.an_log_value[1]; - if (step_gain_01dB) - *step_gain_01dB = (short)hr.u.c.param1; - return hr.error; -} - -u16 hpi_volume_auto_fade_profile(const struct hpi_hsubsys *ph_subsys, - u32 h_control, short an_stop_gain0_01dB[HPI_MAX_CHANNELS], - u32 duration_ms, u16 profile) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_SET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - - memcpy(hm.u.c.an_log_value, an_stop_gain0_01dB, - sizeof(short) * HPI_MAX_CHANNELS); - - hm.u.c.attribute = HPI_VOLUME_AUTOFADE; - hm.u.c.param1 = duration_ms; - hm.u.c.param2 = profile; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_volume_auto_fade(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms) -{ - return hpi_volume_auto_fade_profile(ph_subsys, h_control, - an_stop_gain0_01dB, duration_ms, HPI_VOLUME_AUTOFADE_LOG); -} - -u16 hpi_vox_set_threshold(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short an_gain0_01dB) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_SET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_VOX_THRESHOLD; - - hm.u.c.an_log_value[0] = an_gain0_01dB; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_vox_get_threshold(const struct hpi_hsubsys *ph_subsys, u32 h_control, - short *an_gain0_01dB) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_VOX_THRESHOLD; - - hpi_send_recv(&hm, &hr); - - *an_gain0_01dB = hr.u.c.an_log_value[0]; - - return hr.error; -} - -static size_t strv_packet_size = MIN_STRV_PACKET_SIZE; - -static size_t entity_type_to_size[LAST_ENTITY_TYPE] = { - 0, - sizeof(struct hpi_entity), - sizeof(void *), - - sizeof(int), - sizeof(float), - sizeof(double), - - sizeof(char), - sizeof(char), - - 4 * sizeof(char), - 16 * sizeof(char), - 6 * sizeof(char), -}; - -inline size_t hpi_entity_size(struct hpi_entity *entity_ptr) -{ - return entity_ptr->header.size; -} - -inline size_t hpi_entity_header_size(struct hpi_entity *entity_ptr) -{ - return sizeof(entity_ptr->header); -} - -inline size_t hpi_entity_value_size(struct hpi_entity *entity_ptr) -{ - return hpi_entity_size(entity_ptr) - - hpi_entity_header_size(entity_ptr); -} - -inline size_t hpi_entity_item_count(struct hpi_entity *entity_ptr) -{ - return hpi_entity_value_size(entity_ptr) / - entity_type_to_size[entity_ptr->header.type]; -} - -inline struct hpi_entity *hpi_entity_ptr_to_next(struct hpi_entity - *entity_ptr) -{ - return (void *)(((uint8_t *) entity_ptr) + - hpi_entity_size(entity_ptr)); -} - -inline u16 hpi_entity_check_type(const enum e_entity_type t) -{ - if (t >= 0 && t < STR_TYPE_FIELD_MAX) - return 0; - return HPI_ERROR_ENTITY_TYPE_INVALID; -} - -inline u16 hpi_entity_check_role(const enum e_entity_role r) -{ - if (r >= 0 && r < STR_ROLE_FIELD_MAX) - return 0; - return HPI_ERROR_ENTITY_ROLE_INVALID; -} - -static u16 hpi_entity_get_next(struct hpi_entity *entity, int recursive_flag, - void *guard_p, struct hpi_entity **next) -{ - HPI_DEBUG_ASSERT(entity != NULL); - HPI_DEBUG_ASSERT(next != NULL); - HPI_DEBUG_ASSERT(hpi_entity_size(entity) != 0); - - if (guard_p <= (void *)entity) { - *next = NULL; - return 0; - } - - if (recursive_flag && entity->header.type == entity_type_sequence) - *next = (struct hpi_entity *)entity->value; - else - *next = (struct hpi_entity *)hpi_entity_ptr_to_next(entity); - - if (guard_p <= (void *)*next) { - *next = NULL; - return 0; - } - - HPI_DEBUG_ASSERT(guard_p >= (void *)hpi_entity_ptr_to_next(*next)); - return 0; -} - -u16 hpi_entity_find_next(struct hpi_entity *container_entity, - enum e_entity_type type, enum e_entity_role role, int recursive_flag, - struct hpi_entity **current_match) -{ - struct hpi_entity *tmp = NULL; - void *guard_p = NULL; - - HPI_DEBUG_ASSERT(container_entity != NULL); - guard_p = hpi_entity_ptr_to_next(container_entity); - - if (*current_match != NULL) - hpi_entity_get_next(*current_match, recursive_flag, guard_p, - &tmp); - else - hpi_entity_get_next(container_entity, 1, guard_p, &tmp); - - while (tmp) { - u16 err; - - HPI_DEBUG_ASSERT((void *)tmp >= (void *)container_entity); - - if ((!type || tmp->header.type == type) && (!role - || tmp->header.role == role)) { - *current_match = tmp; - return 0; - } - - err = hpi_entity_get_next(tmp, recursive_flag, guard_p, - current_match); - if (err) - return err; - - tmp = *current_match; - } - - *current_match = NULL; - return 0; -} - -void hpi_entity_free(struct hpi_entity *entity) -{ - if (entity != NULL) - kfree(entity); -} - -static u16 hpi_entity_alloc_and_copy(struct hpi_entity *src, - struct hpi_entity **dst) -{ - size_t buf_size; - HPI_DEBUG_ASSERT(dst != NULL); - HPI_DEBUG_ASSERT(src != NULL); - - buf_size = hpi_entity_size(src); - *dst = kmalloc(buf_size, GFP_KERNEL); - if (dst == NULL) - return HPI_ERROR_MEMORY_ALLOC; - memcpy(*dst, src, buf_size); - return 0; -} - -u16 hpi_universal_info(const struct hpi_hsubsys *ph_subsys, u32 hC, - struct hpi_entity **info) -{ - struct hpi_msg_strv hm; - struct hpi_res_strv *phr; - u16 hpi_err; - int remaining_attempts = 2; - size_t resp_packet_size = 1024; - - *info = NULL; - - while (remaining_attempts--) { - phr = kmalloc(resp_packet_size, GFP_KERNEL); - HPI_DEBUG_ASSERT(phr != NULL); - - hpi_init_message_responseV1(&hm.h, (u16)sizeof(hm), &phr->h, - (u16)resp_packet_size, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_INFO); - u32TOINDEXES(hC, &hm.h.adapter_index, &hm.h.obj_index); - - hm.strv.header.size = sizeof(hm.strv); - phr->strv.header.size = resp_packet_size - sizeof(phr->h); - - hpi_send_recv((struct hpi_message *)&hm.h, - (struct hpi_response *)&phr->h); - if (phr->h.error == HPI_ERROR_RESPONSE_BUFFER_TOO_SMALL) { - - HPI_DEBUG_ASSERT(phr->h.specific_error > - MIN_STRV_PACKET_SIZE - && phr->h.specific_error < 1500); - resp_packet_size = phr->h.specific_error; - } else { - remaining_attempts = 0; - if (!phr->h.error) - hpi_entity_alloc_and_copy(&phr->strv, info); - } - - hpi_err = phr->h.error; - kfree(phr); - } - - return hpi_err; -} - -u16 hpi_universal_get(const struct hpi_hsubsys *ph_subsys, u32 hC, - struct hpi_entity **value) -{ - struct hpi_msg_strv hm; - struct hpi_res_strv *phr; - u16 hpi_err; - int remaining_attempts = 2; - - *value = NULL; - - while (remaining_attempts--) { - phr = kmalloc(strv_packet_size, GFP_KERNEL); - if (!phr) - return HPI_ERROR_MEMORY_ALLOC; - - hpi_init_message_responseV1(&hm.h, (u16)sizeof(hm), &phr->h, - (u16)strv_packet_size, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(hC, &hm.h.adapter_index, &hm.h.obj_index); - - hm.strv.header.size = sizeof(hm.strv); - phr->strv.header.size = strv_packet_size - sizeof(phr->h); - - hpi_send_recv((struct hpi_message *)&hm.h, - (struct hpi_response *)&phr->h); - if (phr->h.error == HPI_ERROR_RESPONSE_BUFFER_TOO_SMALL) { - - HPI_DEBUG_ASSERT(phr->h.specific_error > - MIN_STRV_PACKET_SIZE - && phr->h.specific_error < 1000); - strv_packet_size = phr->h.specific_error; - } else { - remaining_attempts = 0; - if (!phr->h.error) - hpi_entity_alloc_and_copy(&phr->strv, value); - } - - hpi_err = phr->h.error; - kfree(phr); - } - - return hpi_err; -} - -u16 hpi_universal_set(const struct hpi_hsubsys *ph_subsys, u32 hC, - struct hpi_entity *value) -{ - struct hpi_msg_strv *phm; - struct hpi_res_strv hr; - - phm = kmalloc(sizeof(phm->h) + value->header.size, GFP_KERNEL); - HPI_DEBUG_ASSERT(phm != NULL); - - hpi_init_message_responseV1(&phm->h, - sizeof(phm->h) + value->header.size, &hr.h, sizeof(hr), - HPI_OBJ_CONTROL, HPI_CONTROL_SET_STATE); - u32TOINDEXES(hC, &phm->h.adapter_index, &phm->h.obj_index); - hr.strv.header.size = sizeof(hr.strv); - - memcpy(&phm->strv, value, value->header.size); - hpi_send_recv((struct hpi_message *)&phm->h, - (struct hpi_response *)&hr.h); - - return hr.h.error; -} - -u16 hpi_entity_alloc_and_pack(const enum e_entity_type type, - const size_t item_count, const enum e_entity_role role, void *value, - struct hpi_entity **entity) -{ - size_t bytes_to_copy, total_size; - u16 hE = 0; - *entity = NULL; - - hE = hpi_entity_check_type(type); - if (hE) - return hE; - - HPI_DEBUG_ASSERT(role > entity_role_null && type < LAST_ENTITY_ROLE); - - bytes_to_copy = entity_type_to_size[type] * item_count; - total_size = hpi_entity_header_size(*entity) + bytes_to_copy; - - HPI_DEBUG_ASSERT(total_size >= hpi_entity_header_size(*entity) - && total_size < STR_SIZE_FIELD_MAX); - - *entity = kmalloc(total_size, GFP_KERNEL); - if (*entity == NULL) - return HPI_ERROR_MEMORY_ALLOC; - memcpy((*entity)->value, value, bytes_to_copy); - (*entity)->header.size = - hpi_entity_header_size(*entity) + bytes_to_copy; - (*entity)->header.type = type; - (*entity)->header.role = role; - return 0; -} - -u16 hpi_entity_copy_value_from(struct hpi_entity *entity, - enum e_entity_type type, size_t item_count, void *value_dst_p) -{ - size_t bytes_to_copy; - - if (entity->header.type != type) - return HPI_ERROR_ENTITY_TYPE_MISMATCH; - - if (hpi_entity_item_count(entity) != item_count) - return HPI_ERROR_ENTITY_ITEM_COUNT; - - bytes_to_copy = entity_type_to_size[type] * item_count; - memcpy(value_dst_p, entity->value, bytes_to_copy); - return 0; -} - -u16 hpi_entity_unpack(struct hpi_entity *entity, enum e_entity_type *type, - size_t *item_count, enum e_entity_role *role, void **value) -{ - u16 err = 0; - HPI_DEBUG_ASSERT(entity != NULL); - - if (type) - *type = entity->header.type; - - if (role) - *role = entity->header.role; - - if (value) - *value = entity->value; - - if (item_count != NULL) { - if (entity->header.type == entity_type_sequence) { - void *guard_p = hpi_entity_ptr_to_next(entity); - struct hpi_entity *next = NULL; - void *contents = entity->value; - - *item_count = 0; - while (contents < guard_p) { - (*item_count)++; - err = hpi_entity_get_next(contents, 0, - guard_p, &next); - if (next == NULL || err) - break; - contents = next; - } - } else { - *item_count = hpi_entity_item_count(entity); - } - } - return err; -} - -u16 hpi_gpio_open(const struct hpi_hsubsys *ph_subsys, u16 adapter_index, - u32 *ph_gpio, u16 *pw_number_input_bits, u16 *pw_number_output_bits) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_GPIO, HPI_GPIO_OPEN); - hm.adapter_index = adapter_index; - - hpi_send_recv(&hm, &hr); - - if (hr.error == 0) { - *ph_gpio = - hpi_indexes_to_handle(HPI_OBJ_GPIO, adapter_index, 0); - if (pw_number_input_bits) - *pw_number_input_bits = hr.u.l.number_input_bits; - if (pw_number_output_bits) - *pw_number_output_bits = hr.u.l.number_output_bits; - } else - *ph_gpio = 0; - return hr.error; -} - -u16 hpi_gpio_read_bit(const struct hpi_hsubsys *ph_subsys, u32 h_gpio, - u16 bit_index, u16 *pw_bit_data) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_GPIO, HPI_GPIO_READ_BIT); - u32TOINDEX(h_gpio, &hm.adapter_index); - hm.u.l.bit_index = bit_index; - - hpi_send_recv(&hm, &hr); - - *pw_bit_data = hr.u.l.bit_data[0]; - return hr.error; -} - -u16 hpi_gpio_read_all_bits(const struct hpi_hsubsys *ph_subsys, u32 h_gpio, - u16 aw_all_bit_data[4] - ) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_GPIO, HPI_GPIO_READ_ALL); - u32TOINDEX(h_gpio, &hm.adapter_index); - - hpi_send_recv(&hm, &hr); - - if (aw_all_bit_data) { - aw_all_bit_data[0] = hr.u.l.bit_data[0]; - aw_all_bit_data[1] = hr.u.l.bit_data[1]; - aw_all_bit_data[2] = hr.u.l.bit_data[2]; - aw_all_bit_data[3] = hr.u.l.bit_data[3]; - } - return hr.error; -} - -u16 hpi_gpio_write_bit(const struct hpi_hsubsys *ph_subsys, u32 h_gpio, - u16 bit_index, u16 bit_data) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_GPIO, HPI_GPIO_WRITE_BIT); - u32TOINDEX(h_gpio, &hm.adapter_index); - hm.u.l.bit_index = bit_index; - hm.u.l.bit_data = bit_data; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_gpio_write_status(const struct hpi_hsubsys *ph_subsys, u32 h_gpio, - u16 aw_all_bit_data[4] - ) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_GPIO, - HPI_GPIO_WRITE_STATUS); - u32TOINDEX(h_gpio, &hm.adapter_index); - - hpi_send_recv(&hm, &hr); - - if (aw_all_bit_data) { - aw_all_bit_data[0] = hr.u.l.bit_data[0]; - aw_all_bit_data[1] = hr.u.l.bit_data[1]; - aw_all_bit_data[2] = hr.u.l.bit_data[2]; - aw_all_bit_data[3] = hr.u.l.bit_data[3]; - } - return hr.error; -} - -u16 hpi_async_event_open(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u32 *ph_async) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ASYNCEVENT, - HPI_ASYNCEVENT_OPEN); - hm.adapter_index = adapter_index; - - hpi_send_recv(&hm, &hr); - - if (hr.error == 0) - - *ph_async = - hpi_indexes_to_handle(HPI_OBJ_ASYNCEVENT, - adapter_index, 0); - else - *ph_async = 0; - return hr.error; - -} - -u16 hpi_async_event_close(const struct hpi_hsubsys *ph_subsys, u32 h_async) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ASYNCEVENT, - HPI_ASYNCEVENT_OPEN); - u32TOINDEX(h_async, &hm.adapter_index); - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_async_event_wait(const struct hpi_hsubsys *ph_subsys, u32 h_async, - u16 maximum_events, struct hpi_async_event *p_events, - u16 *pw_number_returned) -{ - return 0; -} - -u16 hpi_async_event_get_count(const struct hpi_hsubsys *ph_subsys, - u32 h_async, u16 *pw_count) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ASYNCEVENT, - HPI_ASYNCEVENT_GETCOUNT); - u32TOINDEX(h_async, &hm.adapter_index); - - hpi_send_recv(&hm, &hr); - - if (hr.error == 0) - if (pw_count) - *pw_count = hr.u.as.u.count.count; - - return hr.error; -} - -u16 hpi_async_event_get(const struct hpi_hsubsys *ph_subsys, u32 h_async, - u16 maximum_events, struct hpi_async_event *p_events, - u16 *pw_number_returned) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_ASYNCEVENT, - HPI_ASYNCEVENT_GET); - u32TOINDEX(h_async, &hm.adapter_index); - - hpi_send_recv(&hm, &hr); - if (!hr.error) { - memcpy(p_events, &hr.u.as.u.event, - sizeof(struct hpi_async_event)); - *pw_number_returned = 1; - } - - return hr.error; -} - -u16 hpi_nv_memory_open(const struct hpi_hsubsys *ph_subsys, u16 adapter_index, - u32 *ph_nv_memory, u16 *pw_size_in_bytes) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_NVMEMORY, - HPI_NVMEMORY_OPEN); - hm.adapter_index = adapter_index; - - hpi_send_recv(&hm, &hr); - - if (hr.error == 0) { - *ph_nv_memory = - hpi_indexes_to_handle(HPI_OBJ_NVMEMORY, adapter_index, - 0); - if (pw_size_in_bytes) - *pw_size_in_bytes = hr.u.n.size_in_bytes; - } else - *ph_nv_memory = 0; - return hr.error; -} - -u16 hpi_nv_memory_read_byte(const struct hpi_hsubsys *ph_subsys, - u32 h_nv_memory, u16 index, u16 *pw_data) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_NVMEMORY, - HPI_NVMEMORY_READ_BYTE); - u32TOINDEX(h_nv_memory, &hm.adapter_index); - hm.u.n.address = index; - - hpi_send_recv(&hm, &hr); - - *pw_data = hr.u.n.data; - return hr.error; -} - -u16 hpi_nv_memory_write_byte(const struct hpi_hsubsys *ph_subsys, - u32 h_nv_memory, u16 index, u16 data) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_NVMEMORY, - HPI_NVMEMORY_WRITE_BYTE); - u32TOINDEX(h_nv_memory, &hm.adapter_index); - hm.u.n.address = index; - hm.u.n.data = data; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_profile_open_all(const struct hpi_hsubsys *ph_subsys, - u16 adapter_index, u16 profile_index, u32 *ph_profile, - u16 *pw_max_profiles) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_PROFILE, - HPI_PROFILE_OPEN_ALL); - hm.adapter_index = adapter_index; - hm.obj_index = profile_index; - hpi_send_recv(&hm, &hr); - - *pw_max_profiles = hr.u.p.u.o.max_profiles; - if (hr.error == 0) - *ph_profile = - hpi_indexes_to_handle(HPI_OBJ_PROFILE, adapter_index, - profile_index); - else - *ph_profile = 0; - return hr.error; -} - -u16 hpi_profile_get(const struct hpi_hsubsys *ph_subsys, u32 h_profile, - u16 bin_index, u16 *pw_seconds, u32 *pmicro_seconds, u32 *pcall_count, - u32 *pmax_micro_seconds, u32 *pmin_micro_seconds) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_PROFILE, HPI_PROFILE_GET); - u32TOINDEXES(h_profile, &hm.adapter_index, &hm.obj_index); - hm.u.p.bin_index = bin_index; - hpi_send_recv(&hm, &hr); - if (pw_seconds) - *pw_seconds = hr.u.p.u.t.seconds; - if (pmicro_seconds) - *pmicro_seconds = hr.u.p.u.t.micro_seconds; - if (pcall_count) - *pcall_count = hr.u.p.u.t.call_count; - if (pmax_micro_seconds) - *pmax_micro_seconds = hr.u.p.u.t.max_micro_seconds; - if (pmin_micro_seconds) - *pmin_micro_seconds = hr.u.p.u.t.min_micro_seconds; - return hr.error; -} - -u16 hpi_profile_get_utilization(const struct hpi_hsubsys *ph_subsys, - u32 h_profile, u32 *putilization) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_PROFILE, - HPI_PROFILE_GET_UTILIZATION); - u32TOINDEXES(h_profile, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - if (hr.error) { - if (putilization) - *putilization = 0; - } else { - if (putilization) - *putilization = hr.u.p.u.t.call_count; - } - return hr.error; -} - -u16 hpi_profile_get_name(const struct hpi_hsubsys *ph_subsys, u32 h_profile, - u16 bin_index, char *sz_name, u16 name_length) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_PROFILE, - HPI_PROFILE_GET_NAME); - u32TOINDEXES(h_profile, &hm.adapter_index, &hm.obj_index); - hm.u.p.bin_index = bin_index; - hpi_send_recv(&hm, &hr); - if (hr.error) { - if (sz_name) - strcpy(sz_name, "??"); - } else { - if (sz_name) - memcpy(sz_name, (char *)hr.u.p.u.n.sz_name, - name_length); - } - return hr.error; -} - -u16 hpi_profile_start_all(const struct hpi_hsubsys *ph_subsys, u32 h_profile) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_PROFILE, - HPI_PROFILE_START_ALL); - u32TOINDEXES(h_profile, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_profile_stop_all(const struct hpi_hsubsys *ph_subsys, u32 h_profile) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_PROFILE, - HPI_PROFILE_STOP_ALL); - u32TOINDEXES(h_profile, &hm.adapter_index, &hm.obj_index); - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_watchdog_open(const struct hpi_hsubsys *ph_subsys, u16 adapter_index, - u32 *ph_watchdog) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_WATCHDOG, - HPI_WATCHDOG_OPEN); - hm.adapter_index = adapter_index; - - hpi_send_recv(&hm, &hr); - - if (hr.error == 0) - *ph_watchdog = - hpi_indexes_to_handle(HPI_OBJ_WATCHDOG, adapter_index, - 0); - else - *ph_watchdog = 0; - return hr.error; -} - -u16 hpi_watchdog_set_time(const struct hpi_hsubsys *ph_subsys, u32 h_watchdog, - u32 time_millisec) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_WATCHDOG, - HPI_WATCHDOG_SET_TIME); - u32TOINDEX(h_watchdog, &hm.adapter_index); - hm.u.w.time_ms = time_millisec; - - hpi_send_recv(&hm, &hr); - - return hr.error; -} - -u16 hpi_watchdog_ping(const struct hpi_hsubsys *ph_subsys, u32 h_watchdog) -{ - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_WATCHDOG, - HPI_WATCHDOG_PING); - u32TOINDEX(h_watchdog, &hm.adapter_index); - - hpi_send_recv(&hm, &hr); - - return hr.error; -} +#include "adriver.h" +#include "../../alsa-kernel/pci/asihpi/hpifunc.c" diff --git a/pci/asihpi/hpimsginit.c b/pci/asihpi/hpimsginit.c index 8e1d099ed..be72d72a0 100644 --- a/pci/asihpi/hpimsginit.c +++ b/pci/asihpi/hpimsginit.c @@ -1,130 +1,2 @@ -/****************************************************************************** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Hardware Programming Interface (HPI) Utility functions. - - (C) Copyright AudioScience Inc. 2007 -*******************************************************************************/ - -#include "hpi_internal.h" -#include "hpimsginit.h" - -/* The actual message size for each object type */ -static u16 msg_size[HPI_OBJ_MAXINDEX + 1] = HPI_MESSAGE_SIZE_BY_OBJECT; -/* The actual response size for each object type */ -static u16 res_size[HPI_OBJ_MAXINDEX + 1] = HPI_RESPONSE_SIZE_BY_OBJECT; -/* Flag to enable alternate message type for SSX2 bypass. */ -static u16 gwSSX2_bypass; - -/** \internal - * Used by ASIO driver to disable SSX2 for a single process - * \param phSubSys Pointer to HPI subsystem handle. - * \param wBypass New bypass setting 0 = off, nonzero = on - * \return Previous bypass setting. - */ -u16 hpi_subsys_ssx2_bypass(const struct hpi_hsubsys *ph_subsys, u16 bypass) -{ - u16 old_value = gwSSX2_bypass; - - gwSSX2_bypass = bypass; - - return old_value; -} - -/** \internal - * initialize the HPI message structure - */ -static void hpi_init_message(struct hpi_message *phm, u16 object, - u16 function) -{ - memset(phm, 0, sizeof(*phm)); - if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) - phm->size = msg_size[object]; - else - phm->size = sizeof(*phm); - - if (gwSSX2_bypass) - phm->type = HPI_TYPE_SSX2BYPASS_MESSAGE; - else - phm->type = HPI_TYPE_MESSAGE; - phm->object = object; - phm->function = function; - phm->version = 0; - /* Expect adapter index to be set by caller */ -} - -/** \internal - * initialize the HPI response structure - */ -void hpi_init_response(struct hpi_response *phr, u16 object, u16 function, - u16 error) -{ - memset(phr, 0, sizeof(*phr)); - phr->type = HPI_TYPE_RESPONSE; - if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) - phr->size = res_size[object]; - else - phr->size = sizeof(*phr); - phr->object = object; - phr->function = function; - phr->error = error; - phr->specific_error = 0; - phr->version = 0; -} - -void hpi_init_message_response(struct hpi_message *phm, - struct hpi_response *phr, u16 object, u16 function) -{ - hpi_init_message(phm, object, function); - /* default error return if the response is - not filled in by the callee */ - hpi_init_response(phr, object, function, - HPI_ERROR_PROCESSING_MESSAGE); -} - -static void hpi_init_messageV1(struct hpi_message_header *phm, u16 size, - u16 object, u16 function) -{ - memset(phm, 0, sizeof(*phm)); - if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) { - phm->size = size; - phm->type = HPI_TYPE_MESSAGE; - phm->object = object; - phm->function = function; - phm->version = 1; - /* Expect adapter index to be set by caller */ - } -} - -void hpi_init_responseV1(struct hpi_response_header *phr, u16 size, - u16 object, u16 function) -{ - memset(phr, 0, sizeof(*phr)); - phr->size = size; - phr->version = 1; - phr->type = HPI_TYPE_RESPONSE; - phr->error = HPI_ERROR_PROCESSING_MESSAGE; -} - -void hpi_init_message_responseV1(struct hpi_message_header *phm, u16 msg_size, - struct hpi_response_header *phr, u16 res_size, u16 object, - u16 function) -{ - hpi_init_messageV1(phm, msg_size, object, function); - hpi_init_responseV1(phr, res_size, object, function); -} +#include "adriver.h" +#include "../../alsa-kernel/pci/asihpi/hpimsginit.c" diff --git a/pci/asihpi/hpimsginit.h b/pci/asihpi/hpimsginit.h deleted file mode 100644 index 864ad020c..000000000 --- a/pci/asihpi/hpimsginit.h +++ /dev/null @@ -1,40 +0,0 @@ -/****************************************************************************** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Hardware Programming Interface (HPI) Utility functions - - (C) Copyright AudioScience Inc. 2007 -*******************************************************************************/ -/* Initialise response headers, or msg/response pairs. -Note that it is valid to just init a response e.g. when a lower level is preparing -a response to a message. -However, when sending a message, a matching response buffer always must be prepared -*/ - -void hpi_init_response(struct hpi_response *phr, u16 object, u16 function, - u16 error); - -void hpi_init_message_response(struct hpi_message *phm, - struct hpi_response *phr, u16 object, u16 function); - -void hpi_init_responseV1(struct hpi_response_header *phr, u16 size, - u16 object, u16 function); - -void hpi_init_message_responseV1(struct hpi_message_header *phm, u16 msg_size, - struct hpi_response_header *phr, u16 res_size, u16 object, - u16 function); diff --git a/pci/asihpi/hpimsgx.c b/pci/asihpi/hpimsgx.c index 2ee90dc3d..fbdfbff1c 100644 --- a/pci/asihpi/hpimsgx.c +++ b/pci/asihpi/hpimsgx.c @@ -1,907 +1,2 @@ -/****************************************************************************** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Extended Message Function With Response Cacheing - -(C) Copyright AudioScience Inc. 2002 -*****************************************************************************/ -#define SOURCEFILE_NAME "hpimsgx.c" -#include "hpi_internal.h" -#include "hpimsginit.h" -#include "hpimsgx.h" -#include "hpidebug.h" - -static struct pci_device_id asihpi_pci_tbl[] = { -#include "hpipcida.h" -}; - -static struct hpios_spinlock msgx_lock; - -static hpi_handler_func *hpi_entry_points[HPI_MAX_ADAPTERS]; - -static hpi_handler_func *hpi_lookup_entry_point_function(const struct hpi_pci - *pci_info) -{ - - int i; - - for (i = 0; asihpi_pci_tbl[i].vendor != 0; i++) { - if (asihpi_pci_tbl[i].vendor != PCI_ANY_ID - && asihpi_pci_tbl[i].vendor != pci_info->vendor_id) - continue; - if (asihpi_pci_tbl[i].device != PCI_ANY_ID - && asihpi_pci_tbl[i].device != pci_info->device_id) - continue; - if (asihpi_pci_tbl[i].subvendor != PCI_ANY_ID - && asihpi_pci_tbl[i].subvendor != - pci_info->subsys_vendor_id) - continue; - if (asihpi_pci_tbl[i].subdevice != PCI_ANY_ID - && asihpi_pci_tbl[i].subdevice != - pci_info->subsys_device_id) - continue; - - HPI_DEBUG_LOG(DEBUG, " %x,%lu\n", i, - asihpi_pci_tbl[i].driver_data); - return (hpi_handler_func *) asihpi_pci_tbl[i].driver_data; - } - - return NULL; -} - -static inline void hw_entry_point(struct hpi_message *phm, - struct hpi_response *phr) -{ - - hpi_handler_func *ep; - - if (phm->adapter_index < HPI_MAX_ADAPTERS) { - ep = (hpi_handler_func *) hpi_entry_points[phm-> - adapter_index]; - if (ep) { - HPI_DEBUG_MESSAGE(DEBUG, phm); - ep(phm, phr); - HPI_DEBUG_RESPONSE(phr); - return; - } - } - hpi_init_response(phr, phm->object, phm->function, - HPI_ERROR_PROCESSING_MESSAGE); -} - -static void adapter_open(struct hpi_message *phm, struct hpi_response *phr); -static void adapter_close(struct hpi_message *phm, struct hpi_response *phr); - -static void mixer_open(struct hpi_message *phm, struct hpi_response *phr); -static void mixer_close(struct hpi_message *phm, struct hpi_response *phr); - -static void outstream_open(struct hpi_message *phm, struct hpi_response *phr, - void *h_owner); -static void outstream_close(struct hpi_message *phm, struct hpi_response *phr, - void *h_owner); -static void instream_open(struct hpi_message *phm, struct hpi_response *phr, - void *h_owner); -static void instream_close(struct hpi_message *phm, struct hpi_response *phr, - void *h_owner); - -static void HPIMSGX__reset(u16 adapter_index); -static u16 HPIMSGX__init(struct hpi_message *phm, struct hpi_response *phr); -static void HPIMSGX__cleanup(u16 adapter_index, void *h_owner); - -#ifndef DISABLE_PRAGMA_PACK1 -#pragma pack(push, 1) -#endif - -struct hpi_subsys_response { - struct hpi_response_header h; - struct hpi_subsys_res s; -}; - -struct hpi_adapter_response { - struct hpi_response_header h; - struct hpi_adapter_res a; -}; - -struct hpi_mixer_response { - struct hpi_response_header h; - struct hpi_mixer_res m; -}; - -struct hpi_stream_response { - struct hpi_response_header h; - struct hpi_stream_res d; -}; - -struct adapter_info { - u16 type; - u16 num_instreams; - u16 num_outstreams; -}; - -struct asi_open_state { - int open_flag; - void *h_owner; -}; - -#ifndef DISABLE_PRAGMA_PACK1 -#pragma pack(pop) -#endif - -/* Globals */ -static struct hpi_adapter_response rESP_HPI_ADAPTER_OPEN[HPI_MAX_ADAPTERS]; - -static struct hpi_stream_response - rESP_HPI_OSTREAM_OPEN[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; - -static struct hpi_stream_response - rESP_HPI_ISTREAM_OPEN[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; - -static struct hpi_mixer_response rESP_HPI_MIXER_OPEN[HPI_MAX_ADAPTERS]; - -static struct hpi_subsys_response gRESP_HPI_SUBSYS_FIND_ADAPTERS; - -static struct adapter_info aDAPTER_INFO[HPI_MAX_ADAPTERS]; - -/* use these to keep track of opens from user mode apps/DLLs */ -static struct asi_open_state - outstream_user_open[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; - -static struct asi_open_state - instream_user_open[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; - -static void subsys_message(struct hpi_message *phm, struct hpi_response *phr, - void *h_owner) -{ - switch (phm->function) { - case HPI_SUBSYS_GET_VERSION: - hpi_init_response(phr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_GET_VERSION, 0); - phr->u.s.version = HPI_VER >> 8; /* return major.minor */ - phr->u.s.data = HPI_VER; /* return major.minor.release */ - break; - case HPI_SUBSYS_OPEN: - /*do not propagate the message down the chain */ - hpi_init_response(phr, HPI_OBJ_SUBSYSTEM, HPI_SUBSYS_OPEN, 0); - break; - case HPI_SUBSYS_CLOSE: - /*do not propagate the message down the chain */ - hpi_init_response(phr, HPI_OBJ_SUBSYSTEM, HPI_SUBSYS_CLOSE, - 0); - HPIMSGX__cleanup(HPIMSGX_ALLADAPTERS, h_owner); - break; - case HPI_SUBSYS_DRIVER_LOAD: - /* Initialize this module's internal state */ - hpios_msgxlock_init(&msgx_lock); - memset(&hpi_entry_points, 0, sizeof(hpi_entry_points)); - hpios_locked_mem_init(); - /* Init subsys_findadapters response to no-adapters */ - HPIMSGX__reset(HPIMSGX_ALLADAPTERS); - hpi_init_response(phr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_DRIVER_LOAD, 0); - /* individual HPIs dont implement driver load */ - HPI_COMMON(phm, phr); - break; - case HPI_SUBSYS_DRIVER_UNLOAD: - HPI_COMMON(phm, phr); - HPIMSGX__cleanup(HPIMSGX_ALLADAPTERS, h_owner); - hpios_locked_mem_free_all(); - hpi_init_response(phr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_DRIVER_UNLOAD, 0); - return; - - case HPI_SUBSYS_GET_INFO: - HPI_COMMON(phm, phr); - break; - - case HPI_SUBSYS_FIND_ADAPTERS: - memcpy(phr, &gRESP_HPI_SUBSYS_FIND_ADAPTERS, - sizeof(gRESP_HPI_SUBSYS_FIND_ADAPTERS)); - break; - case HPI_SUBSYS_GET_NUM_ADAPTERS: - memcpy(phr, &gRESP_HPI_SUBSYS_FIND_ADAPTERS, - sizeof(gRESP_HPI_SUBSYS_FIND_ADAPTERS)); - phr->function = HPI_SUBSYS_GET_NUM_ADAPTERS; - break; - case HPI_SUBSYS_GET_ADAPTER: - { - int count = phm->adapter_index; - int index = 0; - hpi_init_response(phr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_GET_ADAPTER, 0); - - /* This is complicated by the fact that we want to - * "skip" 0's in the adapter list. - * First, make sure we are pointing to a - * non-zero adapter type. - */ - while (gRESP_HPI_SUBSYS_FIND_ADAPTERS. - s.aw_adapter_list[index] == 0) { - index++; - if (index >= HPI_MAX_ADAPTERS) - break; - } - while (count) { - /* move on to the next adapter */ - index++; - if (index >= HPI_MAX_ADAPTERS) - break; - while (gRESP_HPI_SUBSYS_FIND_ADAPTERS. - s.aw_adapter_list[index] == 0) { - index++; - if (index >= HPI_MAX_ADAPTERS) - break; - } - count--; - } - - if (index < HPI_MAX_ADAPTERS) { - phr->u.s.adapter_index = (u16)index; - phr->u.s.aw_adapter_list[0] = - gRESP_HPI_SUBSYS_FIND_ADAPTERS. - s.aw_adapter_list[index]; - } else { - phr->u.s.adapter_index = 0; - phr->u.s.aw_adapter_list[0] = 0; - phr->error = HPI_ERROR_BAD_ADAPTER_NUMBER; - } - break; - } - case HPI_SUBSYS_CREATE_ADAPTER: - HPIMSGX__init(phm, phr); - break; - case HPI_SUBSYS_DELETE_ADAPTER: - HPIMSGX__cleanup(phm->adapter_index, h_owner); - { - struct hpi_message hm; - struct hpi_response hr; - /* call to HPI_ADAPTER_CLOSE */ - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_CLOSE); - hm.adapter_index = phm->adapter_index; - hw_entry_point(&hm, &hr); - } - hw_entry_point(phm, phr); - gRESP_HPI_SUBSYS_FIND_ADAPTERS.s. - aw_adapter_list[phm->adapter_index] - = 0; - hpi_entry_points[phm->adapter_index] = NULL; - break; - default: - hw_entry_point(phm, phr); - break; - } -} - -static void adapter_message(struct hpi_message *phm, struct hpi_response *phr, - void *h_owner) -{ - switch (phm->function) { - case HPI_ADAPTER_OPEN: - adapter_open(phm, phr); - break; - case HPI_ADAPTER_CLOSE: - adapter_close(phm, phr); - break; - default: - hw_entry_point(phm, phr); - break; - } -} - -static void mixer_message(struct hpi_message *phm, struct hpi_response *phr) -{ - switch (phm->function) { - case HPI_MIXER_OPEN: - mixer_open(phm, phr); - break; - case HPI_MIXER_CLOSE: - mixer_close(phm, phr); - break; - default: - hw_entry_point(phm, phr); - break; - } -} - -static void outstream_message(struct hpi_message *phm, - struct hpi_response *phr, void *h_owner) -{ - if (phm->obj_index >= aDAPTER_INFO[phm->adapter_index].num_outstreams) { - hpi_init_response(phr, HPI_OBJ_OSTREAM, phm->function, - HPI_ERROR_INVALID_OBJ_INDEX); - return; - } - - switch (phm->function) { - case HPI_OSTREAM_OPEN: - outstream_open(phm, phr, h_owner); - break; - case HPI_OSTREAM_CLOSE: - outstream_close(phm, phr, h_owner); - break; - default: - hw_entry_point(phm, phr); - break; - } -} - -static void instream_message(struct hpi_message *phm, - struct hpi_response *phr, void *h_owner) -{ - if (phm->obj_index >= aDAPTER_INFO[phm->adapter_index].num_instreams) { - hpi_init_response(phr, HPI_OBJ_ISTREAM, phm->function, - HPI_ERROR_INVALID_OBJ_INDEX); - return; - } - - switch (phm->function) { - case HPI_ISTREAM_OPEN: - instream_open(phm, phr, h_owner); - break; - case HPI_ISTREAM_CLOSE: - instream_close(phm, phr, h_owner); - break; - default: - hw_entry_point(phm, phr); - break; - } -} - -/* NOTE: HPI_Message() must be defined in the driver as a wrapper for - * HPI_MessageEx so that functions in hpifunc.c compile. - */ -void hpi_send_recv_ex(struct hpi_message *phm, struct hpi_response *phr, - void *h_owner) -{ - HPI_DEBUG_MESSAGE(DEBUG, phm); - - if (phm->type != HPI_TYPE_MESSAGE) { - hpi_init_response(phr, phm->object, phm->function, - HPI_ERROR_INVALID_TYPE); - return; - } - - if (phm->adapter_index >= HPI_MAX_ADAPTERS - && phm->adapter_index != HPIMSGX_ALLADAPTERS) { - hpi_init_response(phr, phm->object, phm->function, - HPI_ERROR_BAD_ADAPTER_NUMBER); - return; - } - - switch (phm->object) { - case HPI_OBJ_SUBSYSTEM: - subsys_message(phm, phr, h_owner); - break; - - case HPI_OBJ_ADAPTER: - adapter_message(phm, phr, h_owner); - break; - - case HPI_OBJ_MIXER: - mixer_message(phm, phr); - break; - - case HPI_OBJ_OSTREAM: - outstream_message(phm, phr, h_owner); - break; - - case HPI_OBJ_ISTREAM: - instream_message(phm, phr, h_owner); - break; - - default: - hw_entry_point(phm, phr); - break; - } - HPI_DEBUG_RESPONSE(phr); -#if 1 - if (phr->error >= HPI_ERROR_BACKEND_BASE) { - void *ep = NULL; - char *ep_name; - - HPI_DEBUG_MESSAGE(ERROR, phm); - - if (phm->adapter_index < HPI_MAX_ADAPTERS) - ep = hpi_entry_points[phm->adapter_index]; - - /* Don't need this? Have adapter index in debug info - Know at driver load time index->backend mapping */ - if (ep == HPI_6000) - ep_name = "HPI_6000"; - else if (ep == HPI_6205) - ep_name = "HPI_6205"; - else - ep_name = "unknown"; - - HPI_DEBUG_LOG(ERROR, "HPI %s response - error# %d\n", ep_name, - phr->error); - - if (hpi_debug_level >= HPI_DEBUG_LEVEL_VERBOSE) - hpi_debug_data((u16 *)phm, - sizeof(*phm) / sizeof(u16)); - } -#endif -} - -static void adapter_open(struct hpi_message *phm, struct hpi_response *phr) -{ - HPI_DEBUG_LOG(VERBOSE, "adapter_open\n"); - memcpy(phr, &rESP_HPI_ADAPTER_OPEN[phm->adapter_index], - sizeof(rESP_HPI_ADAPTER_OPEN[0])); -} - -static void adapter_close(struct hpi_message *phm, struct hpi_response *phr) -{ - HPI_DEBUG_LOG(VERBOSE, "adapter_close\n"); - hpi_init_response(phr, HPI_OBJ_ADAPTER, HPI_ADAPTER_CLOSE, 0); -} - -static void mixer_open(struct hpi_message *phm, struct hpi_response *phr) -{ - memcpy(phr, &rESP_HPI_MIXER_OPEN[phm->adapter_index], - sizeof(rESP_HPI_MIXER_OPEN[0])); -} - -static void mixer_close(struct hpi_message *phm, struct hpi_response *phr) -{ - hpi_init_response(phr, HPI_OBJ_MIXER, HPI_MIXER_CLOSE, 0); -} - -static void instream_open(struct hpi_message *phm, struct hpi_response *phr, - void *h_owner) -{ - - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_response(phr, HPI_OBJ_ISTREAM, HPI_ISTREAM_OPEN, 0); - - hpios_msgxlock_lock(&msgx_lock); - - if (instream_user_open[phm->adapter_index][phm->obj_index].open_flag) - phr->error = HPI_ERROR_OBJ_ALREADY_OPEN; - else if (rESP_HPI_ISTREAM_OPEN[phm->adapter_index] - [phm->obj_index].h.error) - memcpy(phr, - &rESP_HPI_ISTREAM_OPEN[phm->adapter_index][phm-> - obj_index], - sizeof(rESP_HPI_ISTREAM_OPEN[0][0])); - else { - instream_user_open[phm->adapter_index][phm-> - obj_index].open_flag = 1; - hpios_msgxlock_un_lock(&msgx_lock); - - /* issue a reset */ - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_RESET); - hm.adapter_index = phm->adapter_index; - hm.obj_index = phm->obj_index; - hw_entry_point(&hm, &hr); - - hpios_msgxlock_lock(&msgx_lock); - if (hr.error) { - instream_user_open[phm->adapter_index][phm-> - obj_index].open_flag = 0; - phr->error = hr.error; - } else { - instream_user_open[phm->adapter_index][phm-> - obj_index].open_flag = 1; - instream_user_open[phm->adapter_index][phm-> - obj_index].h_owner = h_owner; - memcpy(phr, - &rESP_HPI_ISTREAM_OPEN[phm->adapter_index] - [phm->obj_index], - sizeof(rESP_HPI_ISTREAM_OPEN[0][0])); - } - } - hpios_msgxlock_un_lock(&msgx_lock); -} - -static void instream_close(struct hpi_message *phm, struct hpi_response *phr, - void *h_owner) -{ - - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_response(phr, HPI_OBJ_ISTREAM, HPI_ISTREAM_CLOSE, 0); - - hpios_msgxlock_lock(&msgx_lock); - if (h_owner == - instream_user_open[phm->adapter_index][phm-> - obj_index].h_owner) { - /* HPI_DEBUG_LOG(INFO,"closing adapter %d " - "instream %d owned by %p\n", - phm->wAdapterIndex, phm->wObjIndex, hOwner); */ - instream_user_open[phm->adapter_index][phm-> - obj_index].h_owner = NULL; - hpios_msgxlock_un_lock(&msgx_lock); - /* issue a reset */ - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_RESET); - hm.adapter_index = phm->adapter_index; - hm.obj_index = phm->obj_index; - hw_entry_point(&hm, &hr); - hpios_msgxlock_lock(&msgx_lock); - if (hr.error) { - instream_user_open[phm->adapter_index][phm-> - obj_index].h_owner = h_owner; - phr->error = hr.error; - } else { - instream_user_open[phm->adapter_index][phm-> - obj_index].open_flag = 0; - instream_user_open[phm->adapter_index][phm-> - obj_index].h_owner = NULL; - } - } else { - HPI_DEBUG_LOG(WARNING, - "%p trying to close %d instream %d owned by %p\n", - h_owner, phm->adapter_index, phm->obj_index, - instream_user_open[phm->adapter_index][phm-> - obj_index].h_owner); - phr->error = HPI_ERROR_OBJ_NOT_OPEN; - } - hpios_msgxlock_un_lock(&msgx_lock); -} - -static void outstream_open(struct hpi_message *phm, struct hpi_response *phr, - void *h_owner) -{ - - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_response(phr, HPI_OBJ_OSTREAM, HPI_OSTREAM_OPEN, 0); - - hpios_msgxlock_lock(&msgx_lock); - - if (outstream_user_open[phm->adapter_index][phm->obj_index].open_flag) - phr->error = HPI_ERROR_OBJ_ALREADY_OPEN; - else if (rESP_HPI_OSTREAM_OPEN[phm->adapter_index] - [phm->obj_index].h.error) - memcpy(phr, - &rESP_HPI_OSTREAM_OPEN[phm->adapter_index][phm-> - obj_index], - sizeof(rESP_HPI_OSTREAM_OPEN[0][0])); - else { - outstream_user_open[phm->adapter_index][phm-> - obj_index].open_flag = 1; - hpios_msgxlock_un_lock(&msgx_lock); - - /* issue a reset */ - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_RESET); - hm.adapter_index = phm->adapter_index; - hm.obj_index = phm->obj_index; - hw_entry_point(&hm, &hr); - - hpios_msgxlock_lock(&msgx_lock); - if (hr.error) { - outstream_user_open[phm->adapter_index][phm-> - obj_index].open_flag = 0; - phr->error = hr.error; - } else { - outstream_user_open[phm->adapter_index][phm-> - obj_index].open_flag = 1; - outstream_user_open[phm->adapter_index][phm-> - obj_index].h_owner = h_owner; - memcpy(phr, - &rESP_HPI_OSTREAM_OPEN[phm->adapter_index] - [phm->obj_index], - sizeof(rESP_HPI_OSTREAM_OPEN[0][0])); - } - } - hpios_msgxlock_un_lock(&msgx_lock); -} - -static void outstream_close(struct hpi_message *phm, struct hpi_response *phr, - void *h_owner) -{ - - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_response(phr, HPI_OBJ_OSTREAM, HPI_OSTREAM_CLOSE, 0); - - hpios_msgxlock_lock(&msgx_lock); - - if (h_owner == - outstream_user_open[phm->adapter_index][phm-> - obj_index].h_owner) { - /* HPI_DEBUG_LOG(INFO,"closing adapter %d " - "outstream %d owned by %p\n", - phm->wAdapterIndex, phm->wObjIndex, hOwner); */ - outstream_user_open[phm->adapter_index][phm-> - obj_index].h_owner = NULL; - hpios_msgxlock_un_lock(&msgx_lock); - /* issue a reset */ - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_RESET); - hm.adapter_index = phm->adapter_index; - hm.obj_index = phm->obj_index; - hw_entry_point(&hm, &hr); - hpios_msgxlock_lock(&msgx_lock); - if (hr.error) { - outstream_user_open[phm->adapter_index][phm-> - obj_index].h_owner = h_owner; - phr->error = hr.error; - } else { - outstream_user_open[phm->adapter_index][phm-> - obj_index].open_flag = 0; - outstream_user_open[phm->adapter_index][phm-> - obj_index].h_owner = NULL; - } - } else { - HPI_DEBUG_LOG(WARNING, - "%p trying to close %d outstream %d owned by %p\n", - h_owner, phm->adapter_index, phm->obj_index, - outstream_user_open[phm->adapter_index][phm-> - obj_index].h_owner); - phr->error = HPI_ERROR_OBJ_NOT_OPEN; - } - hpios_msgxlock_un_lock(&msgx_lock); -} - -static u16 adapter_prepare(u16 adapter) -{ - struct hpi_message hm; - struct hpi_response hr; - - /* Open the adapter and streams */ - u16 i; - - /* call to HPI_ADAPTER_OPEN */ - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_OPEN); - hm.adapter_index = adapter; - hw_entry_point(&hm, &hr); - memcpy(&rESP_HPI_ADAPTER_OPEN[adapter], &hr, - sizeof(rESP_HPI_ADAPTER_OPEN[0])); - if (hr.error) - return hr.error; - - /* call to HPI_ADAPTER_GET_INFO */ - hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_GET_INFO); - hm.adapter_index = adapter; - hw_entry_point(&hm, &hr); - if (hr.error) - return hr.error; - - aDAPTER_INFO[adapter].num_outstreams = hr.u.a.num_outstreams; - aDAPTER_INFO[adapter].num_instreams = hr.u.a.num_instreams; - aDAPTER_INFO[adapter].type = hr.u.a.adapter_type; - - gRESP_HPI_SUBSYS_FIND_ADAPTERS.s.aw_adapter_list[adapter] = - hr.u.a.adapter_type; - gRESP_HPI_SUBSYS_FIND_ADAPTERS.s.num_adapters++; - if (gRESP_HPI_SUBSYS_FIND_ADAPTERS.s.num_adapters > HPI_MAX_ADAPTERS) - gRESP_HPI_SUBSYS_FIND_ADAPTERS.s.num_adapters = - HPI_MAX_ADAPTERS; - - /* call to HPI_OSTREAM_OPEN */ - for (i = 0; i < aDAPTER_INFO[adapter].num_outstreams; i++) { - hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_OPEN); - hm.adapter_index = adapter; - hm.obj_index = i; - hw_entry_point(&hm, &hr); - memcpy(&rESP_HPI_OSTREAM_OPEN[adapter][i], &hr, - sizeof(rESP_HPI_OSTREAM_OPEN[0][0])); - outstream_user_open[adapter][i].open_flag = 0; - outstream_user_open[adapter][i].h_owner = NULL; - } - - /* call to HPI_ISTREAM_OPEN */ - for (i = 0; i < aDAPTER_INFO[adapter].num_instreams; i++) { - hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_OPEN); - hm.adapter_index = adapter; - hm.obj_index = i; - hw_entry_point(&hm, &hr); - memcpy(&rESP_HPI_ISTREAM_OPEN[adapter][i], &hr, - sizeof(rESP_HPI_ISTREAM_OPEN[0][0])); - instream_user_open[adapter][i].open_flag = 0; - instream_user_open[adapter][i].h_owner = NULL; - } - - /* call to HPI_MIXER_OPEN */ - hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_OPEN); - hm.adapter_index = adapter; - hw_entry_point(&hm, &hr); - memcpy(&rESP_HPI_MIXER_OPEN[adapter], &hr, - sizeof(rESP_HPI_MIXER_OPEN[0])); - - return gRESP_HPI_SUBSYS_FIND_ADAPTERS.h.error; -} - -static void HPIMSGX__reset(u16 adapter_index) -{ - int i; - u16 adapter; - struct hpi_response hr; - - if (adapter_index == HPIMSGX_ALLADAPTERS) { - /* reset all responses to contain errors */ - hpi_init_response(&hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_FIND_ADAPTERS, 0); - memcpy(&gRESP_HPI_SUBSYS_FIND_ADAPTERS, &hr, - sizeof(&gRESP_HPI_SUBSYS_FIND_ADAPTERS)); - - for (adapter = 0; adapter < HPI_MAX_ADAPTERS; adapter++) { - - hpi_init_response(&hr, HPI_OBJ_ADAPTER, - HPI_ADAPTER_OPEN, HPI_ERROR_BAD_ADAPTER); - memcpy(&rESP_HPI_ADAPTER_OPEN[adapter], &hr, - sizeof(rESP_HPI_ADAPTER_OPEN[adapter])); - - hpi_init_response(&hr, HPI_OBJ_MIXER, HPI_MIXER_OPEN, - HPI_ERROR_INVALID_OBJ); - memcpy(&rESP_HPI_MIXER_OPEN[adapter], &hr, - sizeof(rESP_HPI_MIXER_OPEN[adapter])); - - for (i = 0; i < HPI_MAX_STREAMS; i++) { - hpi_init_response(&hr, HPI_OBJ_OSTREAM, - HPI_OSTREAM_OPEN, - HPI_ERROR_INVALID_OBJ); - memcpy(&rESP_HPI_OSTREAM_OPEN[adapter][i], - &hr, - sizeof(rESP_HPI_OSTREAM_OPEN[adapter] - [i])); - hpi_init_response(&hr, HPI_OBJ_ISTREAM, - HPI_ISTREAM_OPEN, - HPI_ERROR_INVALID_OBJ); - memcpy(&rESP_HPI_ISTREAM_OPEN[adapter][i], - &hr, - sizeof(rESP_HPI_ISTREAM_OPEN[adapter] - [i])); - } - } - } else if (adapter_index < HPI_MAX_ADAPTERS) { - rESP_HPI_ADAPTER_OPEN[adapter_index].h.error = - HPI_ERROR_BAD_ADAPTER; - rESP_HPI_MIXER_OPEN[adapter_index].h.error = - HPI_ERROR_INVALID_OBJ; - for (i = 0; i < HPI_MAX_STREAMS; i++) { - rESP_HPI_OSTREAM_OPEN[adapter_index][i].h.error = - HPI_ERROR_INVALID_OBJ; - rESP_HPI_ISTREAM_OPEN[adapter_index][i].h.error = - HPI_ERROR_INVALID_OBJ; - } - if (gRESP_HPI_SUBSYS_FIND_ADAPTERS. - s.aw_adapter_list[adapter_index]) { - gRESP_HPI_SUBSYS_FIND_ADAPTERS. - s.aw_adapter_list[adapter_index] = 0; - gRESP_HPI_SUBSYS_FIND_ADAPTERS.s.num_adapters--; - } - } -} - -static u16 HPIMSGX__init(struct hpi_message *phm, - /* HPI_SUBSYS_CREATE_ADAPTER structure with */ - /* resource list or NULL=find all */ - struct hpi_response *phr - /* response from HPI_ADAPTER_GET_INFO */ - ) -{ - hpi_handler_func *entry_point_func; - struct hpi_response hr; - - if (gRESP_HPI_SUBSYS_FIND_ADAPTERS.s.num_adapters >= HPI_MAX_ADAPTERS) - return HPI_ERROR_BAD_ADAPTER_NUMBER; - - /* Init response here so we can pass in previous adapter list */ - hpi_init_response(&hr, phm->object, phm->function, - HPI_ERROR_INVALID_OBJ); - memcpy(hr.u.s.aw_adapter_list, - gRESP_HPI_SUBSYS_FIND_ADAPTERS.s.aw_adapter_list, - sizeof(gRESP_HPI_SUBSYS_FIND_ADAPTERS.s.aw_adapter_list)); - - entry_point_func = - hpi_lookup_entry_point_function(phm->u.s.resource.r.pci); - - if (entry_point_func) { - HPI_DEBUG_MESSAGE(DEBUG, phm); - entry_point_func(phm, &hr); - } else { - phr->error = HPI_ERROR_PROCESSING_MESSAGE; - return phr->error; - } - if (hr.error == 0) { - /* the adapter was created succesfully - save the mapping for future use */ - hpi_entry_points[hr.u.s.adapter_index] = entry_point_func; - /* prepare adapter (pre-open streams etc.) */ - HPI_DEBUG_LOG(DEBUG, - "HPI_SUBSYS_CREATE_ADAPTER successful," - " preparing adapter\n"); - adapter_prepare(hr.u.s.adapter_index); - } - memcpy(phr, &hr, hr.size); - return phr->error; -} - -static void HPIMSGX__cleanup(u16 adapter_index, void *h_owner) -{ - int i, adapter, adapter_limit; - - if (!h_owner) - return; - - if (adapter_index == HPIMSGX_ALLADAPTERS) { - adapter = 0; - adapter_limit = HPI_MAX_ADAPTERS; - } else { - adapter = adapter_index; - adapter_limit = adapter + 1; - } - - for (; adapter < adapter_limit; adapter++) { - /* printk(KERN_INFO "Cleanup adapter #%d\n",wAdapter); */ - for (i = 0; i < HPI_MAX_STREAMS; i++) { - if (h_owner == - outstream_user_open[adapter][i].h_owner) { - struct hpi_message hm; - struct hpi_response hr; - - HPI_DEBUG_LOG(DEBUG, - "close adapter %d ostream %d\n", - adapter, i); - - hpi_init_message_response(&hm, &hr, - HPI_OBJ_OSTREAM, HPI_OSTREAM_RESET); - hm.adapter_index = (u16)adapter; - hm.obj_index = (u16)i; - hw_entry_point(&hm, &hr); - - hm.function = HPI_OSTREAM_HOSTBUFFER_FREE; - hw_entry_point(&hm, &hr); - - hm.function = HPI_OSTREAM_GROUP_RESET; - hw_entry_point(&hm, &hr); - - outstream_user_open[adapter][i].open_flag = 0; - outstream_user_open[adapter][i].h_owner = - NULL; - } - if (h_owner == instream_user_open[adapter][i].h_owner) { - struct hpi_message hm; - struct hpi_response hr; - - HPI_DEBUG_LOG(DEBUG, - "close adapter %d istream %d\n", - adapter, i); - - hpi_init_message_response(&hm, &hr, - HPI_OBJ_ISTREAM, HPI_ISTREAM_RESET); - hm.adapter_index = (u16)adapter; - hm.obj_index = (u16)i; - hw_entry_point(&hm, &hr); - - hm.function = HPI_ISTREAM_HOSTBUFFER_FREE; - hw_entry_point(&hm, &hr); - - hm.function = HPI_ISTREAM_GROUP_RESET; - hw_entry_point(&hm, &hr); - - instream_user_open[adapter][i].open_flag = 0; - instream_user_open[adapter][i].h_owner = NULL; - } - } - } -} +#include "adriver.h" +#include "../../alsa-kernel/pci/asihpi/hpimsgx.c" diff --git a/pci/asihpi/hpimsgx.h b/pci/asihpi/hpimsgx.h deleted file mode 100644 index fd49e7542..000000000 --- a/pci/asihpi/hpimsgx.h +++ /dev/null @@ -1,36 +0,0 @@ -/****************************************************************************** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - HPI Extended Message Handler Functions - -(C) Copyright AudioScience Inc. 1997-2003 -******************************************************************************/ - -#ifndef _HPIMSGX_H_ -#define _HPIMSGX_H_ - -#include "hpi_internal.h" - -#define HPIMSGX_ALLADAPTERS (0xFFFF) - -void hpi_send_recv_ex(struct hpi_message *phm, struct hpi_response *phr, - void *h_owner); - -#define HPI_MESSAGE_LOWER_LAYER hpi_send_recv_ex - -#endif /* _HPIMSGX_H_ */ diff --git a/pci/asihpi/hpioctl.c b/pci/asihpi/hpioctl.c index 7396ac54e..911af3192 100644 --- a/pci/asihpi/hpioctl.c +++ b/pci/asihpi/hpioctl.c @@ -1,484 +1,2 @@ -/******************************************************************************* - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Common Linux HPI ioctl and module probe/remove functions -*******************************************************************************/ -#define SOURCEFILE_NAME "hpioctl.c" - -#include "hpi_internal.h" -#include "hpimsginit.h" -#include "hpidebug.h" -#include "hpimsgx.h" -#include "hpioctl.h" - -#include <linux/fs.h> -#include <linux/slab.h> -#include <linux/moduleparam.h> -#include <asm/uaccess.h> -#include <linux/stringify.h> - -#ifdef MODULE_FIRMWARE -MODULE_FIRMWARE("asihpi/dsp5000.bin"); -MODULE_FIRMWARE("asihpi/dsp6200.bin"); -MODULE_FIRMWARE("asihpi/dsp6205.bin"); -MODULE_FIRMWARE("asihpi/dsp6400.bin"); -MODULE_FIRMWARE("asihpi/dsp6600.bin"); -MODULE_FIRMWARE("asihpi/dsp8700.bin"); -MODULE_FIRMWARE("asihpi/dsp8900.bin"); -#endif - -static int prealloc_stream_buf; -module_param(prealloc_stream_buf, int, S_IRUGO); -MODULE_PARM_DESC(prealloc_stream_buf, - "preallocate size for per-adapter stream buffer"); - -/* Allow the debug level to be changed after module load. - E.g. echo 2 > /sys/module/asihpi/parameters/hpiDebugLevel -*/ -module_param(hpi_debug_level, int, S_IRUGO | S_IWUSR); -MODULE_PARM_DESC(hpi_debug_level, "debug verbosity 0..5"); - -/* List of adapters found */ -static struct hpi_adapter adapters[HPI_MAX_ADAPTERS]; - -/* Wrapper function to HPI_Message to enable dumping of the - message and response types. -*/ -static void hpi_send_recv_f(struct hpi_message *phm, struct hpi_response *phr, - struct file *file) -{ - int adapter = phm->adapter_index; - - if ((adapter >= HPI_MAX_ADAPTERS || adapter < 0) - && (phm->object != HPI_OBJ_SUBSYSTEM)) - phr->error = HPI_ERROR_INVALID_OBJ_INDEX; - else - hpi_send_recv_ex(phm, phr, file); -} - -/* This is called from hpifunc.c functions, called by ALSA - * (or other kernel process) In this case there is no file descriptor - * available for the message cache code - */ -void hpi_send_recv(struct hpi_message *phm, struct hpi_response *phr) -{ - hpi_send_recv_f(phm, phr, HOWNER_KERNEL); -} - -EXPORT_SYMBOL(hpi_send_recv); -/* for radio-asihpi */ - -int asihpi_hpi_release(struct file *file) -{ - struct hpi_message hm; - struct hpi_response hr; - -/* HPI_DEBUG_LOG(INFO,"hpi_release file %p, pid %d\n", file, current->pid); */ - /* close the subsystem just in case the application forgot to. */ - hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_CLOSE); - hpi_send_recv_ex(&hm, &hr, file); - return 0; -} - -long asihpi_hpi_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct hpi_ioctl_linux __user *phpi_ioctl_data; - void __user *puhm; - void __user *puhr; - union hpi_message_buffer_v1 *hm; - union hpi_response_buffer_v1 *hr; - u16 res_max_size; - u32 uncopied_bytes; - struct hpi_adapter *pa = NULL; - int err = 0; - - if (cmd != HPI_IOCTL_LINUX) - return -EINVAL; - - hm = kmalloc(sizeof(*hm), GFP_KERNEL); - hr = kmalloc(sizeof(*hr), GFP_KERNEL); - if (!hm || !hr) { - err = -ENOMEM; - goto out; - } - - phpi_ioctl_data = (struct hpi_ioctl_linux __user *)arg; - - /* Read the message and response pointers from user space. */ - get_user(puhm, &phpi_ioctl_data->phm); - get_user(puhr, &phpi_ioctl_data->phr); - - /* Now read the message size and data from user space. */ - get_user(hm->h.size, (u16 __user *)puhm); - if (hm->h.size > sizeof(*hm)) - hm->h.size = sizeof(*hm); - - /*printk(KERN_INFO "message size %d\n", hm->h.wSize); */ - - uncopied_bytes = copy_from_user(hm, puhm, hm->h.size); - if (uncopied_bytes) { - HPI_DEBUG_LOG(ERROR, "uncopied bytes %d\n", uncopied_bytes); - err = -EFAULT; - goto out; - } - - get_user(res_max_size, (u16 __user *)puhr); - /* printk(KERN_INFO "user response size %d\n", res_max_size); */ - if (res_max_size < sizeof(struct hpi_response_header)) { - HPI_DEBUG_LOG(WARNING, "small res size %d\n", res_max_size); - err = -EFAULT; - goto out; - } - - pa = &adapters[hm->h.adapter_index]; - hr->h.size = 0; - if (hm->h.object == HPI_OBJ_SUBSYSTEM) { - switch (hm->h.function) { - case HPI_SUBSYS_CREATE_ADAPTER: - case HPI_SUBSYS_DELETE_ADAPTER: - /* Application must not use these functions! */ - hr->h.size = sizeof(hr->h); - hr->h.error = HPI_ERROR_INVALID_OPERATION; - hr->h.function = hm->h.function; - uncopied_bytes = copy_to_user(puhr, hr, hr->h.size); - if (uncopied_bytes) - err = -EFAULT; - else - err = 0; - goto out; - - default: - hpi_send_recv_f(&hm->m0, &hr->r0, file); - } - } else { - u16 __user *ptr = NULL; - u32 size = 0; - - /* -1=no data 0=read from user mem, 1=write to user mem */ - int wrflag = -1; - u32 adapter = hm->h.adapter_index; - - if ((hm->h.adapter_index > HPI_MAX_ADAPTERS) || (!pa->type)) { - hpi_init_response(&hr->r0, HPI_OBJ_ADAPTER, - HPI_ADAPTER_OPEN, - HPI_ERROR_BAD_ADAPTER_NUMBER); - - uncopied_bytes = - copy_to_user(puhr, hr, sizeof(hr->h)); - if (uncopied_bytes) - err = -EFAULT; - else - err = 0; - goto out; - } - - if (mutex_lock_interruptible(&adapters[adapter].mutex)) { - err = -EINTR; - goto out; - } - - /* Dig out any pointers embedded in the message. */ - switch (hm->h.function) { - case HPI_OSTREAM_WRITE: - case HPI_ISTREAM_READ:{ - /* Yes, sparse, this is correct. */ - ptr = (u16 __user *)hm->m0.u.d.u.data.pb_data; - size = hm->m0.u.d.u.data.data_size; - - /* Allocate buffer according to application request. - ?Is it better to alloc/free for the duration - of the transaction? - */ - if (pa->buffer_size < size) { - HPI_DEBUG_LOG(DEBUG, - "realloc adapter %d stream " - "buffer from %zd to %d\n", - hm->h.adapter_index, - pa->buffer_size, size); - if (pa->p_buffer) { - pa->buffer_size = 0; - vfree(pa->p_buffer); - } - pa->p_buffer = vmalloc(size); - if (pa->p_buffer) - pa->buffer_size = size; - else { - HPI_DEBUG_LOG(ERROR, - "HPI could not allocate " - "stream buffer size %d\n", - size); - - mutex_unlock(&adapters - [adapter].mutex); - err = -EINVAL; - goto out; - } - } - - hm->m0.u.d.u.data.pb_data = pa->p_buffer; - if (hm->h.function == HPI_ISTREAM_READ) - /* from card, WRITE to user mem */ - wrflag = 1; - else - wrflag = 0; - break; - } - - default: - size = 0; - break; - } - - if (size && (wrflag == 0)) { - uncopied_bytes = - copy_from_user(pa->p_buffer, ptr, size); - if (uncopied_bytes) - HPI_DEBUG_LOG(WARNING, - "missed %d of %d " - "bytes from user\n", uncopied_bytes, - size); - } - - hpi_send_recv_f(&hm->m0, &hr->r0, file); - - if (size && (wrflag == 1)) { - uncopied_bytes = - copy_to_user(ptr, pa->p_buffer, size); - if (uncopied_bytes) - HPI_DEBUG_LOG(WARNING, - "missed %d of %d " "bytes to user\n", - uncopied_bytes, size); - } - - mutex_unlock(&adapters[adapter].mutex); - } - - /* on return response size must be set */ - /*printk(KERN_INFO "response size %d\n", hr->h.wSize); */ - - if (!hr->h.size) { - HPI_DEBUG_LOG(ERROR, "response zero size\n"); - err = -EFAULT; - goto out; - } - - if (hr->h.size > res_max_size) { - HPI_DEBUG_LOG(ERROR, "response too big %d %d\n", hr->h.size, - res_max_size); - /*HPI_DEBUG_MESSAGE(ERROR, hm); */ - err = -EFAULT; - goto out; - } - - uncopied_bytes = copy_to_user(puhr, hr, hr->h.size); - if (uncopied_bytes) { - HPI_DEBUG_LOG(ERROR, "uncopied bytes %d\n", uncopied_bytes); - err = -EFAULT; - goto out; - } - -out: - kfree(hm); - kfree(hr); - return err; -} - -int __devinit asihpi_adapter_probe(struct pci_dev *pci_dev, - const struct pci_device_id *pci_id) -{ - int err, idx, nm; - unsigned int memlen; - struct hpi_message hm; - struct hpi_response hr; - struct hpi_adapter adapter; - struct hpi_pci pci; - - memset(&adapter, 0, sizeof(adapter)); - - printk(KERN_DEBUG "probe PCI device (%04x:%04x,%04x:%04x,%04x)\n", - pci_dev->vendor, pci_dev->device, pci_dev->subsystem_vendor, - pci_dev->subsystem_device, pci_dev->devfn); - - hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_CREATE_ADAPTER); - hpi_init_response(&hr, HPI_OBJ_SUBSYSTEM, HPI_SUBSYS_CREATE_ADAPTER, - HPI_ERROR_PROCESSING_MESSAGE); - - hm.adapter_index = -1; /* an invalid index */ - - /* fill in HPI_PCI information from kernel provided information */ - adapter.pci = pci_dev; - - nm = HPI_MAX_ADAPTER_MEM_SPACES; - - for (idx = 0; idx < nm; idx++) { - HPI_DEBUG_LOG(INFO, "resource %d %s %08llx-%08llx %04llx\n", - idx, pci_dev->resource[idx].name, - (unsigned long long)pci_resource_start(pci_dev, idx), - (unsigned long long)pci_resource_end(pci_dev, idx), - (unsigned long long)pci_resource_flags(pci_dev, idx)); - - if (pci_resource_flags(pci_dev, idx) & IORESOURCE_MEM) { - memlen = pci_resource_len(pci_dev, idx); - adapter.ap_remapped_mem_base[idx] = - ioremap(pci_resource_start(pci_dev, idx), - memlen); - if (!adapter.ap_remapped_mem_base[idx]) { - HPI_DEBUG_LOG(ERROR, - "ioremap failed, aborting\n"); - /* unmap previously mapped pci mem space */ - goto err; - } - } - - pci.ap_mem_base[idx] = adapter.ap_remapped_mem_base[idx]; - } - - /* could replace Pci with direct pointer to pci_dev for linux - Instead wrap accessor functions for IDs etc. - Would it work for windows? - */ - pci.bus_number = pci_dev->bus->number; - pci.vendor_id = (u16)pci_dev->vendor; - pci.device_id = (u16)pci_dev->device; - pci.subsys_vendor_id = (u16)(pci_dev->subsystem_vendor & 0xffff); - pci.subsys_device_id = (u16)(pci_dev->subsystem_device & 0xffff); - pci.device_number = pci_dev->devfn; - pci.interrupt = pci_dev->irq; - pci.p_os_data = pci_dev; - - hm.u.s.resource.bus_type = HPI_BUS_PCI; - hm.u.s.resource.r.pci = &pci; - - /* call CreateAdapterObject on the relevant hpi module */ - hpi_send_recv_ex(&hm, &hr, HOWNER_KERNEL); - if (hr.error) - goto err; - - if (prealloc_stream_buf) { - adapter.p_buffer = vmalloc(prealloc_stream_buf); - if (!adapter.p_buffer) { - HPI_DEBUG_LOG(ERROR, - "HPI could not allocate " - "kernel buffer size %d\n", - prealloc_stream_buf); - goto err; - } - } - - adapter.index = hr.u.s.adapter_index; - adapter.type = hr.u.s.aw_adapter_list[adapter.index]; - hm.adapter_index = adapter.index; - - err = hpi_adapter_open(NULL, adapter.index); - if (err) - goto err; - - adapter.snd_card_asihpi = NULL; - /* WARNING can't init mutex in 'adapter' - * and then copy it to adapters[] ?!?! - */ - adapters[hr.u.s.adapter_index] = adapter; - mutex_init(&adapters[adapter.index].mutex); - pci_set_drvdata(pci_dev, &adapters[adapter.index]); - - printk(KERN_INFO "probe found adapter ASI%04X HPI index #%d.\n", - adapter.type, adapter.index); - - return 0; - -err: - for (idx = 0; idx < HPI_MAX_ADAPTER_MEM_SPACES; idx++) { - if (adapter.ap_remapped_mem_base[idx]) { - iounmap(adapter.ap_remapped_mem_base[idx]); - adapter.ap_remapped_mem_base[idx] = NULL; - } - } - - if (adapter.p_buffer) { - adapter.buffer_size = 0; - vfree(adapter.p_buffer); - } - - HPI_DEBUG_LOG(ERROR, "adapter_probe failed\n"); - return -ENODEV; -} - -void __devexit asihpi_adapter_remove(struct pci_dev *pci_dev) -{ - int idx; - struct hpi_message hm; - struct hpi_response hr; - struct hpi_adapter *pa; - pa = (struct hpi_adapter *)pci_get_drvdata(pci_dev); - - hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_DELETE_ADAPTER); - hm.adapter_index = pa->index; - hpi_send_recv_ex(&hm, &hr, HOWNER_KERNEL); - - /* unmap PCI memory space, mapped during device init. */ - for (idx = 0; idx < HPI_MAX_ADAPTER_MEM_SPACES; idx++) { - if (pa->ap_remapped_mem_base[idx]) { - iounmap(pa->ap_remapped_mem_base[idx]); - pa->ap_remapped_mem_base[idx] = NULL; - } - } - - if (pa->p_buffer) { - pa->buffer_size = 0; - vfree(pa->p_buffer); - } - - pci_set_drvdata(pci_dev, NULL); - /* - printk(KERN_INFO "PCI device (%04x:%04x,%04x:%04x,%04x)," - " HPI index # %d, removed.\n", - pci_dev->vendor, pci_dev->device, - pci_dev->subsystem_vendor, - pci_dev->subsystem_device, pci_dev->devfn, - pa->index); - */ -} - -void __init asihpi_init(void) -{ - struct hpi_message hm; - struct hpi_response hr; - - memset(adapters, 0, sizeof(adapters)); - - printk(KERN_INFO "ASIHPI driver %d.%02d.%02d\n", - HPI_VER_MAJOR(HPI_VER), HPI_VER_MINOR(HPI_VER), - HPI_VER_RELEASE(HPI_VER)); - - hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_DRIVER_LOAD); - hpi_send_recv_ex(&hm, &hr, HOWNER_KERNEL); -} - -void asihpi_exit(void) -{ - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, - HPI_SUBSYS_DRIVER_UNLOAD); - hpi_send_recv_ex(&hm, &hr, HOWNER_KERNEL); -} +#include "adriver.h" +#include "../../alsa-kernel/pci/asihpi/hpioctl.c" diff --git a/pci/asihpi/hpioctl.h b/pci/asihpi/hpioctl.h deleted file mode 100644 index 847f72f03..000000000 --- a/pci/asihpi/hpioctl.h +++ /dev/null @@ -1,38 +0,0 @@ -/******************************************************************************* - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Linux HPI ioctl, and shared module init functions -*******************************************************************************/ - -int __devinit asihpi_adapter_probe(struct pci_dev *pci_dev, - const struct pci_device_id *pci_id); -void __devexit asihpi_adapter_remove(struct pci_dev *pci_dev); -void __init asihpi_init(void); -void __exit asihpi_exit(void); - -int asihpi_hpi_release(struct file *file); - -long asihpi_hpi_ioctl(struct file *file, unsigned int cmd, unsigned long arg); - -/* This is called from hpifunc.c functions, called by ALSA - * (or other kernel process) In this case there is no file descriptor - * available for the message cache code - */ -void hpi_send_recv(struct hpi_message *phm, struct hpi_response *phr); - -#define HOWNER_KERNEL ((void *)-1) diff --git a/pci/asihpi/hpios.c b/pci/asihpi/hpios.c deleted file mode 100644 index 1139f6fcc..000000000 --- a/pci/asihpi/hpios.c +++ /dev/null @@ -1,132 +0,0 @@ -/****************************************************************************** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -HPI Operating System function implementation for Linux - -(C) Copyright AudioScience Inc. 1997-2003 -******************************************************************************/ -#define SOURCEFILE_NAME "hpios.c" -#include "hpi_internal.h" -#include "hpidebug.h" -#include <linux/delay.h> -#include <linux/sched.h> - -#ifndef __KERNEL__ -#error using kernel source for userspace build -#endif - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2 , 6 , 14) -void hpios_delay_micro_seconds(u32 num_micro_sec) -{ - if ((usecs_to_jiffies(num_micro_sec) > 1) && !in_interrupt()) { - /* MUST NOT SCHEDULE IN INTERRUPT CONTEXT! */ - schedule_timeout_uninterruptible(usecs_to_jiffies - (num_micro_sec)); - } else if (num_micro_sec <= 2000) - udelay(num_micro_sec); - else - mdelay(num_micro_sec / 1000); - -} -#else -void hpios_delay_micro_seconds(u32 num_micro_sec) -{ - if ((num_micro_sec / 1000 >= 1000000 / HZ) && !in_interrupt()) { - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout((HZ * num_micro_sec + (HZ - 1)) / 1000000); - } else if (num_micro_sec <= 2000) - udelay(num_micro_sec); - else - mdelay(num_micro_sec / 1000); - -} -#endif - -void hpios_locked_mem_init(void) -{ -} - -/** Allocated an area of locked memory for bus master DMA operations. - -On error, return -ENOMEM, and *pMemArea.size = 0 -*/ -u16 hpios_locked_mem_alloc(struct consistent_dma_area *p_mem_area, u32 size, - struct pci_dev *pdev) -{ - /*?? any benefit in using managed dmam_alloc_coherent? */ - p_mem_area->vaddr = - dma_alloc_coherent(&pdev->dev, size, &p_mem_area->dma_handle, - GFP_DMA32 | GFP_KERNEL); - - if (p_mem_area->vaddr) { - HPI_DEBUG_LOG(DEBUG, "allocated %d bytes, dma 0x%x vma %p\n", - size, (unsigned int)p_mem_area->dma_handle, - p_mem_area->vaddr); - p_mem_area->pdev = &pdev->dev; - p_mem_area->size = size; - return 0; - } else { - HPI_DEBUG_LOG(WARNING, - "failed to allocate %d bytes locked memory\n", size); - p_mem_area->size = 0; - return -ENOMEM; - } -} - -u16 hpios_locked_mem_free(struct consistent_dma_area *p_mem_area) -{ - if (p_mem_area->size) { - dma_free_coherent(p_mem_area->pdev, p_mem_area->size, - p_mem_area->vaddr, p_mem_area->dma_handle); - HPI_DEBUG_LOG(DEBUG, "freed %lu bytes, dma 0x%x vma %p\n", - (unsigned long)p_mem_area->size, - (unsigned int)p_mem_area->dma_handle, - p_mem_area->vaddr); - p_mem_area->size = 0; - return 0; - } else { - return 1; - } -} - -void hpios_locked_mem_free_all(void) -{ -} - -void __iomem *hpios_map_io(struct pci_dev *pci_dev, int idx, - unsigned int length) -{ - HPI_DEBUG_LOG(DEBUG, "mapping %d %s %08llx-%08llx %04llx len 0x%x\n", - idx, pci_dev->resource[idx].name, - (unsigned long long)pci_resource_start(pci_dev, idx), - (unsigned long long)pci_resource_end(pci_dev, idx), - (unsigned long long)pci_resource_flags(pci_dev, idx), length); - - if (!(pci_resource_flags(pci_dev, idx) & IORESOURCE_MEM)) { - HPI_DEBUG_LOG(ERROR, "not an io memory resource\n"); - return NULL; - } - - if (length > pci_resource_len(pci_dev, idx)) { - HPI_DEBUG_LOG(ERROR, "resource too small for requested %d \n", - length); - return NULL; - } - - return ioremap(pci_resource_start(pci_dev, idx), length); -} diff --git a/pci/asihpi/hpios.h b/pci/asihpi/hpios.h deleted file mode 100644 index 43584c5d7..000000000 --- a/pci/asihpi/hpios.h +++ /dev/null @@ -1,198 +0,0 @@ -/****************************************************************************** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -HPI Operating System Specific macros for Linux Kernel driver - -(C) Copyright AudioScience Inc. 1997-2003 -******************************************************************************/ -#ifndef _HPIOS_H_ -#define _HPIOS_H_ - -#undef HPI_OS_LINUX_KERNEL -#define HPI_OS_LINUX_KERNEL - -#define HPI_OS_DEFINED -#define HPI_KERNEL_MODE - -#define HPI_REASSIGN_DUPLICATE_ADAPTER_IDX - -#ifdef MODVERSIONS -#include <linux/modversions.h> -#endif - -#include <asm/io.h> -#include <asm/system.h> -#include <linux/ioctl.h> -#include <linux/kernel.h> -#include <linux/string.h> -#include <linux/version.h> -#include <linux/device.h> -#include <linux/firmware.h> -#include <linux/interrupt.h> -#include <linux/pci.h> - -#define INLINE inline - -#if __GNUC__ >= 3 -#define DEPRECATED __attribute__((deprecated)) -#endif - -#define __pack__ __attribute__ ((packed)) - -#ifndef __user -#define __user -#endif -#ifndef __iomem -#define __iomem -#endif - -#define HPI_NO_OS_FILE_OPS - -#ifdef CONFIG_64BIT -#define HPI64BIT -#endif - -/** Details of a memory area allocated with pci_alloc_consistent -Need all info for parameters to pci_free_consistent -*/ -struct consistent_dma_area { - struct device *pdev; - /* looks like dma-mapping dma_devres ?! */ - size_t size; - void *vaddr; - dma_addr_t dma_handle; -}; - -static inline u16 hpios_locked_mem_get_phys_addr(struct consistent_dma_area - *locked_mem_handle, u32 *p_physical_addr) -{ - *p_physical_addr = locked_mem_handle->dma_handle; - return 0; -} - -static inline u16 hpios_locked_mem_get_virt_addr(struct consistent_dma_area - *locked_mem_handle, void **pp_virtual_addr) -{ - *pp_virtual_addr = locked_mem_handle->vaddr; - return 0; -} - -static inline u16 hpios_locked_mem_valid(struct consistent_dma_area - *locked_mem_handle) -{ - return locked_mem_handle->size != 0; -} - -struct hpi_ioctl_linux { - void __user *phm; - void __user *phr; -}; - -/* Conflict?: H is already used by a number of drivers hid, bluetooth hci, - and some sound drivers sb16, hdsp, emu10k. AFAIK 0xFC is ununsed command -*/ -#define HPI_IOCTL_LINUX _IOWR('H', 0xFC, struct hpi_ioctl_linux) - -#define HPI_DEBUG_FLAG_ERROR KERN_ERR -#define HPI_DEBUG_FLAG_WARNING KERN_WARNING -#define HPI_DEBUG_FLAG_NOTICE KERN_NOTICE -#define HPI_DEBUG_FLAG_INFO KERN_INFO -#define HPI_DEBUG_FLAG_DEBUG KERN_DEBUG -#define HPI_DEBUG_FLAG_VERBOSE KERN_DEBUG /* kernel has no verbose */ - -#include <linux/spinlock.h> - -#define HPI_LOCKING - -struct hpios_spinlock { - spinlock_t lock; /* SEE hpios_spinlock */ - int lock_context; -}; - -/* The reason for all this evilness is that ALSA calls some of a drivers - * operators in atomic context, and some not. But all our functions channel - * through the HPI_Message conduit, so we can't handle the different context - * per function - */ -#define IN_LOCK_BH 1 -#define IN_LOCK_IRQ 0 -static inline void cond_lock(struct hpios_spinlock *l) -{ - if (irqs_disabled()) { - /* NO bh or isr can execute on this processor, - so ordinary lock will do - */ - spin_lock(&((l)->lock)); - l->lock_context = IN_LOCK_IRQ; - } else { - spin_lock_bh(&((l)->lock)); - l->lock_context = IN_LOCK_BH; - } -} - -static inline void cond_unlock(struct hpios_spinlock *l) -{ - if (l->lock_context == IN_LOCK_BH) - spin_unlock_bh(&((l)->lock)); - else - spin_unlock(&((l)->lock)); -} - -#define hpios_msgxlock_init(obj) spin_lock_init(&(obj)->lock) -#define hpios_msgxlock_lock(obj) cond_lock(obj) -#define hpios_msgxlock_un_lock(obj) cond_unlock(obj) - -#define hpios_dsplock_init(obj) spin_lock_init(&(obj)->dsp_lock.lock) -#define hpios_dsplock_lock(obj) cond_lock(&(obj)->dsp_lock) -#define hpios_dsplock_unlock(obj) cond_unlock(&(obj)->dsp_lock) - -#ifdef CONFIG_SND_DEBUG -#define HPI_DEBUG -#endif - -#define HPI_ALIST_LOCKING -#define hpios_alistlock_init(obj) spin_lock_init(&((obj)->list_lock.lock)) -#define hpios_alistlock_lock(obj) spin_lock(&((obj)->list_lock.lock)) -#define hpios_alistlock_un_lock(obj) spin_unlock(&((obj)->list_lock.lock)) - -struct hpi_adapter { - /* mutex prevents contention for one card - between multiple user programs (via ioctl) */ - struct mutex mutex; - u16 index; - u16 type; - - /* ALSA card structure */ - void *snd_card_asihpi; - - char *p_buffer; - size_t buffer_size; - struct pci_dev *pci; - void __iomem *ap_remapped_mem_base[HPI_MAX_ADAPTER_MEM_SPACES]; -}; - -static inline void hpios_unmap_io(void __iomem *addr, - unsigned long size) -{ - iounmap(addr); -} - -void __iomem *hpios_map_io(struct pci_dev *pci_dev, int idx, - unsigned int length); - -#endif diff --git a/pci/asihpi/hpios.patch b/pci/asihpi/hpios.patch new file mode 100644 index 000000000..1af0f7f50 --- /dev/null +++ b/pci/asihpi/hpios.patch @@ -0,0 +1,35 @@ +--- ../../alsa-kernel/pci/asihpi/hpios.c 2010-04-21 18:36:16.617452068 +0200 ++++ hpios.c 2010-04-21 18:40:32.700700812 +0200 +@@ -1,3 +1,4 @@ ++#include "adriver.h" + /****************************************************************************** + + AudioScience HPI driver +@@ -26,6 +27,7 @@ + #include <linux/delay.h> + #include <linux/sched.h> + ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2 , 6 , 14) + void hpios_delay_micro_seconds(u32 num_micro_sec) + { + if ((usecs_to_jiffies(num_micro_sec) > 1) && !in_interrupt()) { +@@ -38,6 +40,19 @@ + mdelay(num_micro_sec / 1000); + + } ++#else ++void hpios_delay_micro_seconds(u32 num_micro_sec) ++{ ++ if ((num_micro_sec / 1000 >= 1000000 / HZ) && !in_interrupt()) { ++ set_current_state(TASK_UNINTERRUPTIBLE); ++ schedule_timeout((HZ * num_micro_sec + (HZ - 1)) / 1000000); ++ } else if (num_micro_sec <= 2000) ++ udelay(num_micro_sec); ++ else ++ mdelay(num_micro_sec / 1000); ++ ++} ++#endif + + void hpios_locked_mem_init(void) + { diff --git a/pci/asihpi/hpipcida.h b/pci/asihpi/hpipcida.h deleted file mode 100644 index bb30868ce..000000000 --- a/pci/asihpi/hpipcida.h +++ /dev/null @@ -1,37 +0,0 @@ -/****************************************************************************** - - AudioScience HPI driver - Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Array initializer for PCI card IDs - -(C) Copyright AudioScience Inc. 1998-2003 -*******************************************************************************/ - -/*NOTE: when adding new lines to this header file - they MUST be grouped by HPI entry point. -*/ - -{ -HPI_PCI_VENDOR_ID_TI, HPI_PCI_DEV_ID_DSP6205, - HPI_PCI_VENDOR_ID_AUDIOSCIENCE, PCI_ANY_ID, 0, 0, - (kernel_ulong_t) HPI_6205} -, { -HPI_PCI_VENDOR_ID_TI, HPI_PCI_DEV_ID_PCI2040, - HPI_PCI_VENDOR_ID_AUDIOSCIENCE, PCI_ANY_ID, 0, 0, - (kernel_ulong_t) HPI_6000} -, { -0} |