mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-01 10:45:49 +00:00
Merge branch 'topic/misc' into for-linus
This commit is contained in:
commit
627b79628f
@ -404,7 +404,7 @@
|
||||
/* SNDRV_CARDS: maximum number of cards supported by this module */
|
||||
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
|
||||
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
|
||||
/* definition of the chip-specific record */
|
||||
struct mychip {
|
||||
|
188
Documentation/sound/alsa/compress_offload.txt
Normal file
188
Documentation/sound/alsa/compress_offload.txt
Normal file
@ -0,0 +1,188 @@
|
||||
compress_offload.txt
|
||||
=====================
|
||||
Pierre-Louis.Bossart <pierre-louis.bossart@linux.intel.com>
|
||||
Vinod Koul <vinod.koul@linux.intel.com>
|
||||
|
||||
Overview
|
||||
|
||||
Since its early days, the ALSA API was defined with PCM support or
|
||||
constant bitrates payloads such as IEC61937 in mind. Arguments and
|
||||
returned values in frames are the norm, making it a challenge to
|
||||
extend the existing API to compressed data streams.
|
||||
|
||||
In recent years, audio digital signal processors (DSP) were integrated
|
||||
in system-on-chip designs, and DSPs are also integrated in audio
|
||||
codecs. Processing compressed data on such DSPs results in a dramatic
|
||||
reduction of power consumption compared to host-based
|
||||
processing. Support for such hardware has not been very good in Linux,
|
||||
mostly because of a lack of a generic API available in the mainline
|
||||
kernel.
|
||||
|
||||
Rather than requiring a compability break with an API change of the
|
||||
ALSA PCM interface, a new 'Compressed Data' API is introduced to
|
||||
provide a control and data-streaming interface for audio DSPs.
|
||||
|
||||
The design of this API was inspired by the 2-year experience with the
|
||||
Intel Moorestown SOC, with many corrections required to upstream the
|
||||
API in the mainline kernel instead of the staging tree and make it
|
||||
usable by others.
|
||||
|
||||
Requirements
|
||||
|
||||
The main requirements are:
|
||||
|
||||
- separation between byte counts and time. Compressed formats may have
|
||||
a header per file, per frame, or no header at all. The payload size
|
||||
may vary from frame-to-frame. As a result, it is not possible to
|
||||
estimate reliably the duration of audio buffers when handling
|
||||
compressed data. Dedicated mechanisms are required to allow for
|
||||
reliable audio-video synchronization, which requires precise
|
||||
reporting of the number of samples rendered at any given time.
|
||||
|
||||
- Handling of multiple formats. PCM data only requires a specification
|
||||
of the sampling rate, number of channels and bits per sample. In
|
||||
contrast, compressed data comes in a variety of formats. Audio DSPs
|
||||
may also provide support for a limited number of audio encoders and
|
||||
decoders embedded in firmware, or may support more choices through
|
||||
dynamic download of libraries.
|
||||
|
||||
- Focus on main formats. This API provides support for the most
|
||||
popular formats used for audio and video capture and playback. It is
|
||||
likely that as audio compression technology advances, new formats
|
||||
will be added.
|
||||
|
||||
- Handling of multiple configurations. Even for a given format like
|
||||
AAC, some implementations may support AAC multichannel but HE-AAC
|
||||
stereo. Likewise WMA10 level M3 may require too much memory and cpu
|
||||
cycles. The new API needs to provide a generic way of listing these
|
||||
formats.
|
||||
|
||||
- Rendering/Grabbing only. This API does not provide any means of
|
||||
hardware acceleration, where PCM samples are provided back to
|
||||
user-space for additional processing. This API focuses instead on
|
||||
streaming compressed data to a DSP, with the assumption that the
|
||||
decoded samples are routed to a physical output or logical back-end.
|
||||
|
||||
- Complexity hiding. Existing user-space multimedia frameworks all
|
||||
have existing enums/structures for each compressed format. This new
|
||||
API assumes the existence of a platform-specific compatibility layer
|
||||
to expose, translate and make use of the capabilities of the audio
|
||||
DSP, eg. Android HAL or PulseAudio sinks. By construction, regular
|
||||
applications are not supposed to make use of this API.
|
||||
|
||||
|
||||
Design
|
||||
|
||||
The new API shares a number of concepts with with the PCM API for flow
|
||||
control. Start, pause, resume, drain and stop commands have the same
|
||||
semantics no matter what the content is.
|
||||
|
||||
The concept of memory ring buffer divided in a set of fragments is
|
||||
borrowed from the ALSA PCM API. However, only sizes in bytes can be
|
||||
specified.
|
||||
|
||||
Seeks/trick modes are assumed to be handled by the host.
|
||||
|
||||
The notion of rewinds/forwards is not supported. Data committed to the
|
||||
ring buffer cannot be invalidated, except when dropping all buffers.
|
||||
|
||||
The Compressed Data API does not make any assumptions on how the data
|
||||
is transmitted to the audio DSP. DMA transfers from main memory to an
|
||||
embedded audio cluster or to a SPI interface for external DSPs are
|
||||
possible. As in the ALSA PCM case, a core set of routines is exposed;
|
||||
each driver implementer will have to write support for a set of
|
||||
mandatory routines and possibly make use of optional ones.
|
||||
|
||||
The main additions are
|
||||
|
||||
- get_caps
|
||||
This routine returns the list of audio formats supported. Querying the
|
||||
codecs on a capture stream will return encoders, decoders will be
|
||||
listed for playback streams.
|
||||
|
||||
- get_codec_caps For each codec, this routine returns a list of
|
||||
capabilities. The intent is to make sure all the capabilities
|
||||
correspond to valid settings, and to minimize the risks of
|
||||
configuration failures. For example, for a complex codec such as AAC,
|
||||
the number of channels supported may depend on a specific profile. If
|
||||
the capabilities were exposed with a single descriptor, it may happen
|
||||
that a specific combination of profiles/channels/formats may not be
|
||||
supported. Likewise, embedded DSPs have limited memory and cpu cycles,
|
||||
it is likely that some implementations make the list of capabilities
|
||||
dynamic and dependent on existing workloads. In addition to codec
|
||||
settings, this routine returns the minimum buffer size handled by the
|
||||
implementation. This information can be a function of the DMA buffer
|
||||
sizes, the number of bytes required to synchronize, etc, and can be
|
||||
used by userspace to define how much needs to be written in the ring
|
||||
buffer before playback can start.
|
||||
|
||||
- set_params
|
||||
This routine sets the configuration chosen for a specific codec. The
|
||||
most important field in the parameters is the codec type; in most
|
||||
cases decoders will ignore other fields, while encoders will strictly
|
||||
comply to the settings
|
||||
|
||||
- get_params
|
||||
This routines returns the actual settings used by the DSP. Changes to
|
||||
the settings should remain the exception.
|
||||
|
||||
- get_timestamp
|
||||
The timestamp becomes a multiple field structure. It lists the number
|
||||
of bytes transferred, the number of samples processed and the number
|
||||
of samples rendered/grabbed. All these values can be used to determine
|
||||
the avarage bitrate, figure out if the ring buffer needs to be
|
||||
refilled or the delay due to decoding/encoding/io on the DSP.
|
||||
|
||||
Note that the list of codecs/profiles/modes was derived from the
|
||||
OpenMAX AL specification instead of reinventing the wheel.
|
||||
Modifications include:
|
||||
- Addition of FLAC and IEC formats
|
||||
- Merge of encoder/decoder capabilities
|
||||
- Profiles/modes listed as bitmasks to make descriptors more compact
|
||||
- Addition of set_params for decoders (missing in OpenMAX AL)
|
||||
- Addition of AMR/AMR-WB encoding modes (missing in OpenMAX AL)
|
||||
- Addition of format information for WMA
|
||||
- Addition of encoding options when required (derived from OpenMAX IL)
|
||||
- Addition of rateControlSupported (missing in OpenMAX AL)
|
||||
|
||||
Not supported:
|
||||
|
||||
- Support for VoIP/circuit-switched calls is not the target of this
|
||||
API. Support for dynamic bit-rate changes would require a tight
|
||||
coupling between the DSP and the host stack, limiting power savings.
|
||||
|
||||
- Packet-loss concealment is not supported. This would require an
|
||||
additional interface to let the decoder synthesize data when frames
|
||||
are lost during transmission. This may be added in the future.
|
||||
|
||||
- Volume control/routing is not handled by this API. Devices exposing a
|
||||
compressed data interface will be considered as regular ALSA devices;
|
||||
volume changes and routing information will be provided with regular
|
||||
ALSA kcontrols.
|
||||
|
||||
- Embedded audio effects. Such effects should be enabled in the same
|
||||
manner, no matter if the input was PCM or compressed.
|
||||
|
||||
- multichannel IEC encoding. Unclear if this is required.
|
||||
|
||||
- Encoding/decoding acceleration is not supported as mentioned
|
||||
above. It is possible to route the output of a decoder to a capture
|
||||
stream, or even implement transcoding capabilities. This routing
|
||||
would be enabled with ALSA kcontrols.
|
||||
|
||||
- Audio policy/resource management. This API does not provide any
|
||||
hooks to query the utilization of the audio DSP, nor any premption
|
||||
mechanisms.
|
||||
|
||||
- No notion of underun/overrun. Since the bytes written are compressed
|
||||
in nature and data written/read doesn't translate directly to
|
||||
rendered output in time, this does not deal with underrun/overun and
|
||||
maybe dealt in user-library
|
||||
|
||||
Credits:
|
||||
- Mark Brown and Liam Girdwood for discussions on the need for this API
|
||||
- Harsha Priya for her work on intel_sst compressed API
|
||||
- Rakesh Ughreja for valuable feedback
|
||||
- Sing Nallasellan, Sikkandar Madar and Prasanna Samaga for
|
||||
demonstrating and quantifying the benefits of audio offload on a
|
||||
real platform.
|
@ -6,3 +6,5 @@ header-y += hdsp.h
|
||||
header-y += hdspm.h
|
||||
header-y += sb16_csp.h
|
||||
header-y += sfnt_info.h
|
||||
header-y += compress_params.h
|
||||
header-y += compress_offload.h
|
||||
|
167
include/sound/compress_driver.h
Normal file
167
include/sound/compress_driver.h
Normal file
@ -0,0 +1,167 @@
|
||||
/*
|
||||
* compress_driver.h - compress offload driver definations
|
||||
*
|
||||
* Copyright (C) 2011 Intel Corporation
|
||||
* Authors: Vinod Koul <vinod.koul@linux.intel.com>
|
||||
* Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
*/
|
||||
#ifndef __COMPRESS_DRIVER_H
|
||||
#define __COMPRESS_DRIVER_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/sched.h>
|
||||
#include <sound/compress_offload.h>
|
||||
#include <sound/asound.h>
|
||||
#include <sound/pcm.h>
|
||||
|
||||
struct snd_compr_ops;
|
||||
|
||||
/**
|
||||
* struct snd_compr_runtime: runtime stream description
|
||||
* @state: stream state
|
||||
* @ops: pointer to DSP callbacks
|
||||
* @buffer: pointer to kernel buffer, valid only when not in mmap mode or
|
||||
* DSP doesn't implement copy
|
||||
* @buffer_size: size of the above buffer
|
||||
* @fragment_size: size of buffer fragment in bytes
|
||||
* @fragments: number of such fragments
|
||||
* @hw_pointer: offset of last location in buffer where DSP copied data
|
||||
* @app_pointer: offset of last location in buffer where app wrote data
|
||||
* @total_bytes_available: cumulative number of bytes made available in
|
||||
* the ring buffer
|
||||
* @total_bytes_transferred: cumulative bytes transferred by offload DSP
|
||||
* @sleep: poll sleep
|
||||
*/
|
||||
struct snd_compr_runtime {
|
||||
snd_pcm_state_t state;
|
||||
struct snd_compr_ops *ops;
|
||||
void *buffer;
|
||||
u64 buffer_size;
|
||||
u32 fragment_size;
|
||||
u32 fragments;
|
||||
u64 hw_pointer;
|
||||
u64 app_pointer;
|
||||
u64 total_bytes_available;
|
||||
u64 total_bytes_transferred;
|
||||
wait_queue_head_t sleep;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct snd_compr_stream: compressed stream
|
||||
* @name: device name
|
||||
* @ops: pointer to DSP callbacks
|
||||
* @runtime: pointer to runtime structure
|
||||
* @device: device pointer
|
||||
* @direction: stream direction, playback/recording
|
||||
* @private_data: pointer to DSP private data
|
||||
*/
|
||||
struct snd_compr_stream {
|
||||
const char *name;
|
||||
struct snd_compr_ops *ops;
|
||||
struct snd_compr_runtime *runtime;
|
||||
struct snd_compr *device;
|
||||
enum snd_compr_direction direction;
|
||||
void *private_data;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct snd_compr_ops: compressed path DSP operations
|
||||
* @open: Open the compressed stream
|
||||
* This callback is mandatory and shall keep dsp ready to receive the stream
|
||||
* parameter
|
||||
* @free: Close the compressed stream, mandatory
|
||||
* @set_params: Sets the compressed stream parameters, mandatory
|
||||
* This can be called in during stream creation only to set codec params
|
||||
* and the stream properties
|
||||
* @get_params: retrieve the codec parameters, mandatory
|
||||
* @trigger: Trigger operations like start, pause, resume, drain, stop.
|
||||
* This callback is mandatory
|
||||
* @pointer: Retrieve current h/w pointer information. Mandatory
|
||||
* @copy: Copy the compressed data to/from userspace, Optional
|
||||
* Can't be implemented if DSP supports mmap
|
||||
* @mmap: DSP mmap method to mmap DSP memory
|
||||
* @ack: Ack for DSP when data is written to audio buffer, Optional
|
||||
* Not valid if copy is implemented
|
||||
* @get_caps: Retrieve DSP capabilities, mandatory
|
||||
* @get_codec_caps: Retrieve capabilities for a specific codec, mandatory
|
||||
*/
|
||||
struct snd_compr_ops {
|
||||
int (*open)(struct snd_compr_stream *stream);
|
||||
int (*free)(struct snd_compr_stream *stream);
|
||||
int (*set_params)(struct snd_compr_stream *stream,
|
||||
struct snd_compr_params *params);
|
||||
int (*get_params)(struct snd_compr_stream *stream,
|
||||
struct snd_codec *params);
|
||||
int (*trigger)(struct snd_compr_stream *stream, int cmd);
|
||||
int (*pointer)(struct snd_compr_stream *stream,
|
||||
struct snd_compr_tstamp *tstamp);
|
||||
int (*copy)(struct snd_compr_stream *stream, const char __user *buf,
|
||||
size_t count);
|
||||
int (*mmap)(struct snd_compr_stream *stream,
|
||||
struct vm_area_struct *vma);
|
||||
int (*ack)(struct snd_compr_stream *stream, size_t bytes);
|
||||
int (*get_caps) (struct snd_compr_stream *stream,
|
||||
struct snd_compr_caps *caps);
|
||||
int (*get_codec_caps) (struct snd_compr_stream *stream,
|
||||
struct snd_compr_codec_caps *codec);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct snd_compr: Compressed device
|
||||
* @name: DSP device name
|
||||
* @dev: Device pointer
|
||||
* @ops: pointer to DSP callbacks
|
||||
* @private_data: pointer to DSP pvt data
|
||||
* @card: sound card pointer
|
||||
* @direction: Playback or capture direction
|
||||
* @lock: device lock
|
||||
* @device: device id
|
||||
*/
|
||||
struct snd_compr {
|
||||
const char *name;
|
||||
struct device *dev;
|
||||
struct snd_compr_ops *ops;
|
||||
void *private_data;
|
||||
struct snd_card *card;
|
||||
unsigned int direction;
|
||||
struct mutex lock;
|
||||
int device;
|
||||
};
|
||||
|
||||
/* compress device register APIs */
|
||||
int snd_compress_register(struct snd_compr *device);
|
||||
int snd_compress_deregister(struct snd_compr *device);
|
||||
int snd_compress_new(struct snd_card *card, int device,
|
||||
int type, struct snd_compr *compr);
|
||||
|
||||
/* dsp driver callback apis
|
||||
* For playback: driver should call snd_compress_fragment_elapsed() to let the
|
||||
* framework know that a fragment has been consumed from the ring buffer
|
||||
*
|
||||
* For recording: we want to know when a frame is available or when
|
||||
* at least one frame is available so snd_compress_frame_elapsed()
|
||||
* callback should be called when a encodeded frame is available
|
||||
*/
|
||||
static inline void snd_compr_fragment_elapsed(struct snd_compr_stream *stream)
|
||||
{
|
||||
wake_up(&stream->runtime->sleep);
|
||||
}
|
||||
|
||||
#endif
|
161
include/sound/compress_offload.h
Normal file
161
include/sound/compress_offload.h
Normal file
@ -0,0 +1,161 @@
|
||||
/*
|
||||
* compress_offload.h - compress offload header definations
|
||||
*
|
||||
* Copyright (C) 2011 Intel Corporation
|
||||
* Authors: Vinod Koul <vinod.koul@linux.intel.com>
|
||||
* Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
*/
|
||||
#ifndef __COMPRESS_OFFLOAD_H
|
||||
#define __COMPRESS_OFFLOAD_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <sound/asound.h>
|
||||
#include <sound/compress_params.h>
|
||||
|
||||
|
||||
#define SNDRV_COMPRESS_VERSION SNDRV_PROTOCOL_VERSION(0, 1, 0)
|
||||
/**
|
||||
* struct snd_compressed_buffer: compressed buffer
|
||||
* @fragment_size: size of buffer fragment in bytes
|
||||
* @fragments: number of such fragments
|
||||
*/
|
||||
struct snd_compressed_buffer {
|
||||
__u32 fragment_size;
|
||||
__u32 fragments;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct snd_compr_params: compressed stream params
|
||||
* @buffer: buffer description
|
||||
* @codec: codec parameters
|
||||
* @no_wake_mode: dont wake on fragment elapsed
|
||||
*/
|
||||
struct snd_compr_params {
|
||||
struct snd_compressed_buffer buffer;
|
||||
struct snd_codec codec;
|
||||
__u8 no_wake_mode;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct snd_compr_tstamp: timestamp descriptor
|
||||
* @byte_offset: Byte offset in ring buffer to DSP
|
||||
* @copied_total: Total number of bytes copied from/to ring buffer to/by DSP
|
||||
* @pcm_frames: Frames decoded or encoded by DSP. This field will evolve by
|
||||
* large steps and should only be used to monitor encoding/decoding
|
||||
* progress. It shall not be used for timing estimates.
|
||||
* @pcm_io_frames: Frames rendered or received by DSP into a mixer or an audio
|
||||
* output/input. This field should be used for A/V sync or time estimates.
|
||||
* @sampling_rate: sampling rate of audio
|
||||
*/
|
||||
struct snd_compr_tstamp {
|
||||
__u32 byte_offset;
|
||||
__u32 copied_total;
|
||||
snd_pcm_uframes_t pcm_frames;
|
||||
snd_pcm_uframes_t pcm_io_frames;
|
||||
__u32 sampling_rate;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct snd_compr_avail: avail descriptor
|
||||
* @avail: Number of bytes available in ring buffer for writing/reading
|
||||
* @tstamp: timestamp infomation
|
||||
*/
|
||||
struct snd_compr_avail {
|
||||
__u64 avail;
|
||||
struct snd_compr_tstamp tstamp;
|
||||
};
|
||||
|
||||
enum snd_compr_direction {
|
||||
SND_COMPRESS_PLAYBACK = 0,
|
||||
SND_COMPRESS_CAPTURE
|
||||
};
|
||||
|
||||
/**
|
||||
* struct snd_compr_caps: caps descriptor
|
||||
* @codecs: pointer to array of codecs
|
||||
* @direction: direction supported. Of type snd_compr_direction
|
||||
* @min_fragment_size: minimum fragment supported by DSP
|
||||
* @max_fragment_size: maximum fragment supported by DSP
|
||||
* @min_fragments: min fragments supported by DSP
|
||||
* @max_fragments: max fragments supported by DSP
|
||||
* @num_codecs: number of codecs supported
|
||||
* @reserved: reserved field
|
||||
*/
|
||||
struct snd_compr_caps {
|
||||
__u32 num_codecs;
|
||||
__u32 direction;
|
||||
__u32 min_fragment_size;
|
||||
__u32 max_fragment_size;
|
||||
__u32 min_fragments;
|
||||
__u32 max_fragments;
|
||||
__u32 codecs[MAX_NUM_CODECS];
|
||||
__u32 reserved[11];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct snd_compr_codec_caps: query capability of codec
|
||||
* @codec: codec for which capability is queried
|
||||
* @num_descriptors: number of codec descriptors
|
||||
* @descriptor: array of codec capability descriptor
|
||||
*/
|
||||
struct snd_compr_codec_caps {
|
||||
__u32 codec;
|
||||
__u32 num_descriptors;
|
||||
struct snd_codec_desc descriptor[MAX_NUM_CODEC_DESCRIPTORS];
|
||||
};
|
||||
|
||||
/**
|
||||
* compress path ioctl definitions
|
||||
* SNDRV_COMPRESS_GET_CAPS: Query capability of DSP
|
||||
* SNDRV_COMPRESS_GET_CODEC_CAPS: Query capability of a codec
|
||||
* SNDRV_COMPRESS_SET_PARAMS: Set codec and stream parameters
|
||||
* Note: only codec params can be changed runtime and stream params cant be
|
||||
* SNDRV_COMPRESS_GET_PARAMS: Query codec params
|
||||
* SNDRV_COMPRESS_TSTAMP: get the current timestamp value
|
||||
* SNDRV_COMPRESS_AVAIL: get the current buffer avail value.
|
||||
* This also queries the tstamp properties
|
||||
* SNDRV_COMPRESS_PAUSE: Pause the running stream
|
||||
* SNDRV_COMPRESS_RESUME: resume a paused stream
|
||||
* SNDRV_COMPRESS_START: Start a stream
|
||||
* SNDRV_COMPRESS_STOP: stop a running stream, discarding ring buffer content
|
||||
* and the buffers currently with DSP
|
||||
* SNDRV_COMPRESS_DRAIN: Play till end of buffers and stop after that
|
||||
* SNDRV_COMPRESS_IOCTL_VERSION: Query the API version
|
||||
*/
|
||||
#define SNDRV_COMPRESS_IOCTL_VERSION _IOR('C', 0x00, int)
|
||||
#define SNDRV_COMPRESS_GET_CAPS _IOWR('C', 0x10, struct snd_compr_caps)
|
||||
#define SNDRV_COMPRESS_GET_CODEC_CAPS _IOWR('C', 0x11,\
|
||||
struct snd_compr_codec_caps)
|
||||
#define SNDRV_COMPRESS_SET_PARAMS _IOW('C', 0x12, struct snd_compr_params)
|
||||
#define SNDRV_COMPRESS_GET_PARAMS _IOR('C', 0x13, struct snd_codec)
|
||||
#define SNDRV_COMPRESS_TSTAMP _IOR('C', 0x20, struct snd_compr_tstamp)
|
||||
#define SNDRV_COMPRESS_AVAIL _IOR('C', 0x21, struct snd_compr_avail)
|
||||
#define SNDRV_COMPRESS_PAUSE _IO('C', 0x30)
|
||||
#define SNDRV_COMPRESS_RESUME _IO('C', 0x31)
|
||||
#define SNDRV_COMPRESS_START _IO('C', 0x32)
|
||||
#define SNDRV_COMPRESS_STOP _IO('C', 0x33)
|
||||
#define SNDRV_COMPRESS_DRAIN _IO('C', 0x34)
|
||||
/*
|
||||
* TODO
|
||||
* 1. add mmap support
|
||||
*
|
||||
*/
|
||||
#define SND_COMPR_TRIGGER_DRAIN 7 /*FIXME move this to pcm.h */
|
||||
#endif
|
397
include/sound/compress_params.h
Normal file
397
include/sound/compress_params.h
Normal file
@ -0,0 +1,397 @@
|
||||
/*
|
||||
* compress_params.h - codec types and parameters for compressed data
|
||||
* streaming interface
|
||||
*
|
||||
* Copyright (C) 2011 Intel Corporation
|
||||
* Authors: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
|
||||
* Vinod Koul <vinod.koul@linux.intel.com>
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* 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 definitions in this file are derived from the OpenMAX AL version 1.1
|
||||
* and OpenMAX IL v 1.1.2 header files which contain the copyright notice below.
|
||||
*
|
||||
* Copyright (c) 2007-2010 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and/or associated documentation files (the
|
||||
* "Materials "), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
*
|
||||
*/
|
||||
#ifndef __SND_COMPRESS_PARAMS_H
|
||||
#define __SND_COMPRESS_PARAMS_H
|
||||
|
||||
/* AUDIO CODECS SUPPORTED */
|
||||
#define MAX_NUM_CODECS 32
|
||||
#define MAX_NUM_CODEC_DESCRIPTORS 32
|
||||
#define MAX_NUM_BITRATES 32
|
||||
|
||||
/* Codecs are listed linearly to allow for extensibility */
|
||||
#define SND_AUDIOCODEC_PCM ((__u32) 0x00000001)
|
||||
#define SND_AUDIOCODEC_MP3 ((__u32) 0x00000002)
|
||||
#define SND_AUDIOCODEC_AMR ((__u32) 0x00000003)
|
||||
#define SND_AUDIOCODEC_AMRWB ((__u32) 0x00000004)
|
||||
#define SND_AUDIOCODEC_AMRWBPLUS ((__u32) 0x00000005)
|
||||
#define SND_AUDIOCODEC_AAC ((__u32) 0x00000006)
|
||||
#define SND_AUDIOCODEC_WMA ((__u32) 0x00000007)
|
||||
#define SND_AUDIOCODEC_REAL ((__u32) 0x00000008)
|
||||
#define SND_AUDIOCODEC_VORBIS ((__u32) 0x00000009)
|
||||
#define SND_AUDIOCODEC_FLAC ((__u32) 0x0000000A)
|
||||
#define SND_AUDIOCODEC_IEC61937 ((__u32) 0x0000000B)
|
||||
#define SND_AUDIOCODEC_G723_1 ((__u32) 0x0000000C)
|
||||
#define SND_AUDIOCODEC_G729 ((__u32) 0x0000000D)
|
||||
|
||||
/*
|
||||
* Profile and modes are listed with bit masks. This allows for a
|
||||
* more compact representation of fields that will not evolve
|
||||
* (in contrast to the list of codecs)
|
||||
*/
|
||||
|
||||
#define SND_AUDIOPROFILE_PCM ((__u32) 0x00000001)
|
||||
|
||||
/* MP3 modes are only useful for encoders */
|
||||
#define SND_AUDIOCHANMODE_MP3_MONO ((__u32) 0x00000001)
|
||||
#define SND_AUDIOCHANMODE_MP3_STEREO ((__u32) 0x00000002)
|
||||
#define SND_AUDIOCHANMODE_MP3_JOINTSTEREO ((__u32) 0x00000004)
|
||||
#define SND_AUDIOCHANMODE_MP3_DUAL ((__u32) 0x00000008)
|
||||
|
||||
#define SND_AUDIOPROFILE_AMR ((__u32) 0x00000001)
|
||||
|
||||
/* AMR modes are only useful for encoders */
|
||||
#define SND_AUDIOMODE_AMR_DTX_OFF ((__u32) 0x00000001)
|
||||
#define SND_AUDIOMODE_AMR_VAD1 ((__u32) 0x00000002)
|
||||
#define SND_AUDIOMODE_AMR_VAD2 ((__u32) 0x00000004)
|
||||
|
||||
#define SND_AUDIOSTREAMFORMAT_UNDEFINED ((__u32) 0x00000000)
|
||||
#define SND_AUDIOSTREAMFORMAT_CONFORMANCE ((__u32) 0x00000001)
|
||||
#define SND_AUDIOSTREAMFORMAT_IF1 ((__u32) 0x00000002)
|
||||
#define SND_AUDIOSTREAMFORMAT_IF2 ((__u32) 0x00000004)
|
||||
#define SND_AUDIOSTREAMFORMAT_FSF ((__u32) 0x00000008)
|
||||
#define SND_AUDIOSTREAMFORMAT_RTPPAYLOAD ((__u32) 0x00000010)
|
||||
#define SND_AUDIOSTREAMFORMAT_ITU ((__u32) 0x00000020)
|
||||
|
||||
#define SND_AUDIOPROFILE_AMRWB ((__u32) 0x00000001)
|
||||
|
||||
/* AMRWB modes are only useful for encoders */
|
||||
#define SND_AUDIOMODE_AMRWB_DTX_OFF ((__u32) 0x00000001)
|
||||
#define SND_AUDIOMODE_AMRWB_VAD1 ((__u32) 0x00000002)
|
||||
#define SND_AUDIOMODE_AMRWB_VAD2 ((__u32) 0x00000004)
|
||||
|
||||
#define SND_AUDIOPROFILE_AMRWBPLUS ((__u32) 0x00000001)
|
||||
|
||||
#define SND_AUDIOPROFILE_AAC ((__u32) 0x00000001)
|
||||
|
||||
/* AAC modes are required for encoders and decoders */
|
||||
#define SND_AUDIOMODE_AAC_MAIN ((__u32) 0x00000001)
|
||||
#define SND_AUDIOMODE_AAC_LC ((__u32) 0x00000002)
|
||||
#define SND_AUDIOMODE_AAC_SSR ((__u32) 0x00000004)
|
||||
#define SND_AUDIOMODE_AAC_LTP ((__u32) 0x00000008)
|
||||
#define SND_AUDIOMODE_AAC_HE ((__u32) 0x00000010)
|
||||
#define SND_AUDIOMODE_AAC_SCALABLE ((__u32) 0x00000020)
|
||||
#define SND_AUDIOMODE_AAC_ERLC ((__u32) 0x00000040)
|
||||
#define SND_AUDIOMODE_AAC_LD ((__u32) 0x00000080)
|
||||
#define SND_AUDIOMODE_AAC_HE_PS ((__u32) 0x00000100)
|
||||
#define SND_AUDIOMODE_AAC_HE_MPS ((__u32) 0x00000200)
|
||||
|
||||
/* AAC formats are required for encoders and decoders */
|
||||
#define SND_AUDIOSTREAMFORMAT_MP2ADTS ((__u32) 0x00000001)
|
||||
#define SND_AUDIOSTREAMFORMAT_MP4ADTS ((__u32) 0x00000002)
|
||||
#define SND_AUDIOSTREAMFORMAT_MP4LOAS ((__u32) 0x00000004)
|
||||
#define SND_AUDIOSTREAMFORMAT_MP4LATM ((__u32) 0x00000008)
|
||||
#define SND_AUDIOSTREAMFORMAT_ADIF ((__u32) 0x00000010)
|
||||
#define SND_AUDIOSTREAMFORMAT_MP4FF ((__u32) 0x00000020)
|
||||
#define SND_AUDIOSTREAMFORMAT_RAW ((__u32) 0x00000040)
|
||||
|
||||
#define SND_AUDIOPROFILE_WMA7 ((__u32) 0x00000001)
|
||||
#define SND_AUDIOPROFILE_WMA8 ((__u32) 0x00000002)
|
||||
#define SND_AUDIOPROFILE_WMA9 ((__u32) 0x00000004)
|
||||
#define SND_AUDIOPROFILE_WMA10 ((__u32) 0x00000008)
|
||||
|
||||
#define SND_AUDIOMODE_WMA_LEVEL1 ((__u32) 0x00000001)
|
||||
#define SND_AUDIOMODE_WMA_LEVEL2 ((__u32) 0x00000002)
|
||||
#define SND_AUDIOMODE_WMA_LEVEL3 ((__u32) 0x00000004)
|
||||
#define SND_AUDIOMODE_WMA_LEVEL4 ((__u32) 0x00000008)
|
||||
#define SND_AUDIOMODE_WMAPRO_LEVELM0 ((__u32) 0x00000010)
|
||||
#define SND_AUDIOMODE_WMAPRO_LEVELM1 ((__u32) 0x00000020)
|
||||
#define SND_AUDIOMODE_WMAPRO_LEVELM2 ((__u32) 0x00000040)
|
||||
#define SND_AUDIOMODE_WMAPRO_LEVELM3 ((__u32) 0x00000080)
|
||||
|
||||
#define SND_AUDIOSTREAMFORMAT_WMA_ASF ((__u32) 0x00000001)
|
||||
/*
|
||||
* Some implementations strip the ASF header and only send ASF packets
|
||||
* to the DSP
|
||||
*/
|
||||
#define SND_AUDIOSTREAMFORMAT_WMA_NOASF_HDR ((__u32) 0x00000002)
|
||||
|
||||
#define SND_AUDIOPROFILE_REALAUDIO ((__u32) 0x00000001)
|
||||
|
||||
#define SND_AUDIOMODE_REALAUDIO_G2 ((__u32) 0x00000001)
|
||||
#define SND_AUDIOMODE_REALAUDIO_8 ((__u32) 0x00000002)
|
||||
#define SND_AUDIOMODE_REALAUDIO_10 ((__u32) 0x00000004)
|
||||
#define SND_AUDIOMODE_REALAUDIO_SURROUND ((__u32) 0x00000008)
|
||||
|
||||
#define SND_AUDIOPROFILE_VORBIS ((__u32) 0x00000001)
|
||||
|
||||
#define SND_AUDIOMODE_VORBIS ((__u32) 0x00000001)
|
||||
|
||||
#define SND_AUDIOPROFILE_FLAC ((__u32) 0x00000001)
|
||||
|
||||
/*
|
||||
* Define quality levels for FLAC encoders, from LEVEL0 (fast)
|
||||
* to LEVEL8 (best)
|
||||
*/
|
||||
#define SND_AUDIOMODE_FLAC_LEVEL0 ((__u32) 0x00000001)
|
||||
#define SND_AUDIOMODE_FLAC_LEVEL1 ((__u32) 0x00000002)
|
||||
#define SND_AUDIOMODE_FLAC_LEVEL2 ((__u32) 0x00000004)
|
||||
#define SND_AUDIOMODE_FLAC_LEVEL3 ((__u32) 0x00000008)
|
||||
#define SND_AUDIOMODE_FLAC_LEVEL4 ((__u32) 0x00000010)
|
||||
#define SND_AUDIOMODE_FLAC_LEVEL5 ((__u32) 0x00000020)
|
||||
#define SND_AUDIOMODE_FLAC_LEVEL6 ((__u32) 0x00000040)
|
||||
#define SND_AUDIOMODE_FLAC_LEVEL7 ((__u32) 0x00000080)
|
||||
#define SND_AUDIOMODE_FLAC_LEVEL8 ((__u32) 0x00000100)
|
||||
|
||||
#define SND_AUDIOSTREAMFORMAT_FLAC ((__u32) 0x00000001)
|
||||
#define SND_AUDIOSTREAMFORMAT_FLAC_OGG ((__u32) 0x00000002)
|
||||
|
||||
/* IEC61937 payloads without CUVP and preambles */
|
||||
#define SND_AUDIOPROFILE_IEC61937 ((__u32) 0x00000001)
|
||||
/* IEC61937 with S/PDIF preambles+CUVP bits in 32-bit containers */
|
||||
#define SND_AUDIOPROFILE_IEC61937_SPDIF ((__u32) 0x00000002)
|
||||
|
||||
/*
|
||||
* IEC modes are mandatory for decoders. Format autodetection
|
||||
* will only happen on the DSP side with mode 0. The PCM mode should
|
||||
* not be used, the PCM codec should be used instead.
|
||||
*/
|
||||
#define SND_AUDIOMODE_IEC_REF_STREAM_HEADER ((__u32) 0x00000000)
|
||||
#define SND_AUDIOMODE_IEC_LPCM ((__u32) 0x00000001)
|
||||
#define SND_AUDIOMODE_IEC_AC3 ((__u32) 0x00000002)
|
||||
#define SND_AUDIOMODE_IEC_MPEG1 ((__u32) 0x00000004)
|
||||
#define SND_AUDIOMODE_IEC_MP3 ((__u32) 0x00000008)
|
||||
#define SND_AUDIOMODE_IEC_MPEG2 ((__u32) 0x00000010)
|
||||
#define SND_AUDIOMODE_IEC_AACLC ((__u32) 0x00000020)
|
||||
#define SND_AUDIOMODE_IEC_DTS ((__u32) 0x00000040)
|
||||
#define SND_AUDIOMODE_IEC_ATRAC ((__u32) 0x00000080)
|
||||
#define SND_AUDIOMODE_IEC_SACD ((__u32) 0x00000100)
|
||||
#define SND_AUDIOMODE_IEC_EAC3 ((__u32) 0x00000200)
|
||||
#define SND_AUDIOMODE_IEC_DTS_HD ((__u32) 0x00000400)
|
||||
#define SND_AUDIOMODE_IEC_MLP ((__u32) 0x00000800)
|
||||
#define SND_AUDIOMODE_IEC_DST ((__u32) 0x00001000)
|
||||
#define SND_AUDIOMODE_IEC_WMAPRO ((__u32) 0x00002000)
|
||||
#define SND_AUDIOMODE_IEC_REF_CXT ((__u32) 0x00004000)
|
||||
#define SND_AUDIOMODE_IEC_HE_AAC ((__u32) 0x00008000)
|
||||
#define SND_AUDIOMODE_IEC_HE_AAC2 ((__u32) 0x00010000)
|
||||
#define SND_AUDIOMODE_IEC_MPEG_SURROUND ((__u32) 0x00020000)
|
||||
|
||||
#define SND_AUDIOPROFILE_G723_1 ((__u32) 0x00000001)
|
||||
|
||||
#define SND_AUDIOMODE_G723_1_ANNEX_A ((__u32) 0x00000001)
|
||||
#define SND_AUDIOMODE_G723_1_ANNEX_B ((__u32) 0x00000002)
|
||||
#define SND_AUDIOMODE_G723_1_ANNEX_C ((__u32) 0x00000004)
|
||||
|
||||
#define SND_AUDIOPROFILE_G729 ((__u32) 0x00000001)
|
||||
|
||||
#define SND_AUDIOMODE_G729_ANNEX_A ((__u32) 0x00000001)
|
||||
#define SND_AUDIOMODE_G729_ANNEX_B ((__u32) 0x00000002)
|
||||
|
||||
/* <FIXME: multichannel encoders aren't supported for now. Would need
|
||||
an additional definition of channel arrangement> */
|
||||
|
||||
/* VBR/CBR definitions */
|
||||
#define SND_RATECONTROLMODE_CONSTANTBITRATE ((__u32) 0x00000001)
|
||||
#define SND_RATECONTROLMODE_VARIABLEBITRATE ((__u32) 0x00000002)
|
||||
|
||||
/* Encoder options */
|
||||
|
||||
struct snd_enc_wma {
|
||||
__u32 super_block_align; /* WMA Type-specific data */
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* struct snd_enc_vorbis
|
||||
* @quality: Sets encoding quality to n, between -1 (low) and 10 (high).
|
||||
* In the default mode of operation, the quality level is 3.
|
||||
* Normal quality range is 0 - 10.
|
||||
* @managed: Boolean. Set bitrate management mode. This turns off the
|
||||
* normal VBR encoding, but allows hard or soft bitrate constraints to be
|
||||
* enforced by the encoder. This mode can be slower, and may also be
|
||||
* lower quality. It is primarily useful for streaming.
|
||||
* @max_bit_rate: Enabled only if managed is TRUE
|
||||
* @min_bit_rate: Enabled only if managed is TRUE
|
||||
* @downmix: Boolean. Downmix input from stereo to mono (has no effect on
|
||||
* non-stereo streams). Useful for lower-bitrate encoding.
|
||||
*
|
||||
* These options were extracted from the OpenMAX IL spec and Gstreamer vorbisenc
|
||||
* properties
|
||||
*
|
||||
* For best quality users should specify VBR mode and set quality levels.
|
||||
*/
|
||||
|
||||
struct snd_enc_vorbis {
|
||||
__s32 quality;
|
||||
__u32 managed;
|
||||
__u32 max_bit_rate;
|
||||
__u32 min_bit_rate;
|
||||
__u32 downmix;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* struct snd_enc_real
|
||||
* @quant_bits: number of coupling quantization bits in the stream
|
||||
* @start_region: coupling start region in the stream
|
||||
* @num_regions: number of regions value
|
||||
*
|
||||
* These options were extracted from the OpenMAX IL spec
|
||||
*/
|
||||
|
||||
struct snd_enc_real {
|
||||
__u32 quant_bits;
|
||||
__u32 start_region;
|
||||
__u32 num_regions;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct snd_enc_flac
|
||||
* @num: serial number, valid only for OGG formats
|
||||
* needs to be set by application
|
||||
* @gain: Add replay gain tags
|
||||
*
|
||||
* These options were extracted from the FLAC online documentation
|
||||
* at http://flac.sourceforge.net/documentation_tools_flac.html
|
||||
*
|
||||
* To make the API simpler, it is assumed that the user will select quality
|
||||
* profiles. Additional options that affect encoding quality and speed can
|
||||
* be added at a later stage if needed.
|
||||
*
|
||||
* By default the Subset format is used by encoders.
|
||||
*
|
||||
* TAGS such as pictures, etc, cannot be handled by an offloaded encoder and are
|
||||
* not supported in this API.
|
||||
*/
|
||||
|
||||
struct snd_enc_flac {
|
||||
__u32 num;
|
||||
__u32 gain;
|
||||
};
|
||||
|
||||
struct snd_enc_generic {
|
||||
__u32 bw; /* encoder bandwidth */
|
||||
__s32 reserved[15];
|
||||
};
|
||||
|
||||
union snd_codec_options {
|
||||
struct snd_enc_wma wma;
|
||||
struct snd_enc_vorbis vorbis;
|
||||
struct snd_enc_real real;
|
||||
struct snd_enc_flac flac;
|
||||
struct snd_enc_generic generic;
|
||||
};
|
||||
|
||||
/** struct snd_codec_desc - description of codec capabilities
|
||||
* @max_ch: Maximum number of audio channels
|
||||
* @sample_rates: Sampling rates in Hz, use SNDRV_PCM_RATE_xxx for this
|
||||
* @bit_rate: Indexed array containing supported bit rates
|
||||
* @num_bitrates: Number of valid values in bit_rate array
|
||||
* @rate_control: value is specified by SND_RATECONTROLMODE defines.
|
||||
* @profiles: Supported profiles. See SND_AUDIOPROFILE defines.
|
||||
* @modes: Supported modes. See SND_AUDIOMODE defines
|
||||
* @formats: Supported formats. See SND_AUDIOSTREAMFORMAT defines
|
||||
* @min_buffer: Minimum buffer size handled by codec implementation
|
||||
* @reserved: reserved for future use
|
||||
*
|
||||
* This structure provides a scalar value for profiles, modes and stream
|
||||
* format fields.
|
||||
* If an implementation supports multiple combinations, they will be listed as
|
||||
* codecs with different descriptors, for example there would be 2 descriptors
|
||||
* for AAC-RAW and AAC-ADTS.
|
||||
* This entails some redundancy but makes it easier to avoid invalid
|
||||
* configurations.
|
||||
*
|
||||
*/
|
||||
|
||||
struct snd_codec_desc {
|
||||
__u32 max_ch;
|
||||
__u32 sample_rates;
|
||||
__u32 bit_rate[MAX_NUM_BITRATES];
|
||||
__u32 num_bitrates;
|
||||
__u32 rate_control;
|
||||
__u32 profiles;
|
||||
__u32 modes;
|
||||
__u32 formats;
|
||||
__u32 min_buffer;
|
||||
__u32 reserved[15];
|
||||
};
|
||||
|
||||
/** struct snd_codec
|
||||
* @id: Identifies the supported audio encoder/decoder.
|
||||
* See SND_AUDIOCODEC macros.
|
||||
* @ch_in: Number of input audio channels
|
||||
* @ch_out: Number of output channels. In case of contradiction between
|
||||
* this field and the channelMode field, the channelMode field
|
||||
* overrides.
|
||||
* @sample_rate: Audio sample rate of input data
|
||||
* @bit_rate: Bitrate of encoded data. May be ignored by decoders
|
||||
* @rate_control: Encoding rate control. See SND_RATECONTROLMODE defines.
|
||||
* Encoders may rely on profiles for quality levels.
|
||||
* May be ignored by decoders.
|
||||
* @profile: Mandatory for encoders, can be mandatory for specific
|
||||
* decoders as well. See SND_AUDIOPROFILE defines.
|
||||
* @level: Supported level (Only used by WMA at the moment)
|
||||
* @ch_mode: Channel mode for encoder. See SND_AUDIOCHANMODE defines
|
||||
* @format: Format of encoded bistream. Mandatory when defined.
|
||||
* See SND_AUDIOSTREAMFORMAT defines.
|
||||
* @align: Block alignment in bytes of an audio sample.
|
||||
* Only required for PCM or IEC formats.
|
||||
* @options: encoder-specific settings
|
||||
* @reserved: reserved for future use
|
||||
*/
|
||||
|
||||
struct snd_codec {
|
||||
__u32 id;
|
||||
__u32 ch_in;
|
||||
__u32 ch_out;
|
||||
__u32 sample_rate;
|
||||
__u32 bit_rate;
|
||||
__u32 rate_control;
|
||||
__u32 profile;
|
||||
__u32 level;
|
||||
__u32 ch_mode;
|
||||
__u32 format;
|
||||
__u32 align;
|
||||
union snd_codec_options options;
|
||||
__u32 reserved[3];
|
||||
};
|
||||
|
||||
#endif
|
@ -62,6 +62,7 @@ typedef int __bitwise snd_device_type_t;
|
||||
#define SNDRV_DEV_BUS ((__force snd_device_type_t) 0x1007)
|
||||
#define SNDRV_DEV_CODEC ((__force snd_device_type_t) 0x1008)
|
||||
#define SNDRV_DEV_JACK ((__force snd_device_type_t) 0x1009)
|
||||
#define SNDRV_DEV_COMPRESS ((__force snd_device_type_t) 0x100A)
|
||||
#define SNDRV_DEV_LOWLEVEL ((__force snd_device_type_t) 0x2000)
|
||||
|
||||
typedef int __bitwise snd_device_state_t;
|
||||
|
@ -35,7 +35,7 @@
|
||||
#define SNDRV_MINOR_TIMER 33 /* SNDRV_MINOR_GLOBAL + 1 * 32 */
|
||||
|
||||
#ifndef CONFIG_SND_DYNAMIC_MINORS
|
||||
/* 2 - 3 (reserved) */
|
||||
#define SNDRV_MINOR_COMPRESS 2 /* 2 - 3 */
|
||||
#define SNDRV_MINOR_HWDEP 4 /* 4 - 7 */
|
||||
#define SNDRV_MINOR_RAWMIDI 8 /* 8 - 15 */
|
||||
#define SNDRV_MINOR_PCM_PLAYBACK 16 /* 16 - 23 */
|
||||
@ -49,6 +49,7 @@
|
||||
#define SNDRV_DEVICE_TYPE_PCM_CAPTURE SNDRV_MINOR_PCM_CAPTURE
|
||||
#define SNDRV_DEVICE_TYPE_SEQUENCER SNDRV_MINOR_SEQUENCER
|
||||
#define SNDRV_DEVICE_TYPE_TIMER SNDRV_MINOR_TIMER
|
||||
#define SNDRV_DEVICE_TYPE_COMPRESS SNDRV_MINOR_COMPRESS
|
||||
|
||||
#else /* CONFIG_SND_DYNAMIC_MINORS */
|
||||
|
||||
@ -60,6 +61,7 @@ enum {
|
||||
SNDRV_DEVICE_TYPE_RAWMIDI,
|
||||
SNDRV_DEVICE_TYPE_PCM_PLAYBACK,
|
||||
SNDRV_DEVICE_TYPE_PCM_CAPTURE,
|
||||
SNDRV_DEVICE_TYPE_COMPRESS,
|
||||
};
|
||||
|
||||
#endif /* CONFIG_SND_DYNAMIC_MINORS */
|
||||
|
@ -251,18 +251,7 @@ static struct platform_driver pxa2xx_ac97_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init pxa2xx_ac97_init(void)
|
||||
{
|
||||
return platform_driver_register(&pxa2xx_ac97_driver);
|
||||
}
|
||||
|
||||
static void __exit pxa2xx_ac97_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&pxa2xx_ac97_driver);
|
||||
}
|
||||
|
||||
module_init(pxa2xx_ac97_init);
|
||||
module_exit(pxa2xx_ac97_exit);
|
||||
module_platform_driver(pxa2xx_ac97_driver);
|
||||
|
||||
MODULE_AUTHOR("Nicolas Pitre");
|
||||
MODULE_DESCRIPTION("AC97 driver for the Intel PXA2xx chip");
|
||||
|
@ -155,6 +155,16 @@ config SND_DYNAMIC_MINORS
|
||||
|
||||
If you are unsure about this, say N here.
|
||||
|
||||
config SND_COMPRESS_OFFLOAD
|
||||
tristate "ALSA Compressed audio offload support"
|
||||
default n
|
||||
help
|
||||
If you want support for offloading compressed audio and have such
|
||||
a hardware, then you should say Y here and also to the DSP driver
|
||||
of your platform.
|
||||
|
||||
If you are unsure about this, say N here.
|
||||
|
||||
config SND_SUPPORT_OLD_API
|
||||
bool "Support old ALSA API"
|
||||
default y
|
||||
|
@ -21,6 +21,8 @@ snd-hrtimer-objs := hrtimer.o
|
||||
snd-rtctimer-objs := rtctimer.o
|
||||
snd-hwdep-objs := hwdep.o
|
||||
|
||||
snd-compress-objs := compress_offload.o
|
||||
|
||||
obj-$(CONFIG_SND) += snd.o
|
||||
obj-$(CONFIG_SND_HWDEP) += snd-hwdep.o
|
||||
obj-$(CONFIG_SND_TIMER) += snd-timer.o
|
||||
@ -31,3 +33,5 @@ obj-$(CONFIG_SND_RAWMIDI) += snd-rawmidi.o
|
||||
|
||||
obj-$(CONFIG_SND_OSSEMUL) += oss/
|
||||
obj-$(CONFIG_SND_SEQUENCER) += seq/
|
||||
|
||||
obj-$(CONFIG_SND_COMPRESS_OFFLOAD) += snd-compress.o
|
||||
|
765
sound/core/compress_offload.c
Normal file
765
sound/core/compress_offload.c
Normal file
@ -0,0 +1,765 @@
|
||||
/*
|
||||
* compress_core.c - compress offload core
|
||||
*
|
||||
* Copyright (C) 2011 Intel Corporation
|
||||
* Authors: Vinod Koul <vinod.koul@linux.intel.com>
|
||||
* Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
*/
|
||||
#define FORMAT(fmt) "%s: %d: " fmt, __func__, __LINE__
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " FORMAT(fmt)
|
||||
|
||||
#include <linux/file.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/uio.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/module.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/initval.h>
|
||||
#include <sound/compress_params.h>
|
||||
#include <sound/compress_offload.h>
|
||||
#include <sound/compress_driver.h>
|
||||
|
||||
/* TODO:
|
||||
* - add substream support for multiple devices in case of
|
||||
* SND_DYNAMIC_MINORS is not used
|
||||
* - Multiple node representation
|
||||
* driver should be able to register multiple nodes
|
||||
*/
|
||||
|
||||
static DEFINE_MUTEX(device_mutex);
|
||||
|
||||
struct snd_compr_file {
|
||||
unsigned long caps;
|
||||
struct snd_compr_stream stream;
|
||||
};
|
||||
|
||||
/*
|
||||
* a note on stream states used:
|
||||
* we use follwing states in the compressed core
|
||||
* SNDRV_PCM_STATE_OPEN: When stream has been opened.
|
||||
* SNDRV_PCM_STATE_SETUP: When stream has been initialized. This is done by
|
||||
* calling SNDRV_COMPRESS_SET_PARAMS. running streams will come to this
|
||||
* state at stop by calling SNDRV_COMPRESS_STOP, or at end of drain.
|
||||
* SNDRV_PCM_STATE_RUNNING: When stream has been started and is
|
||||
* decoding/encoding and rendering/capturing data.
|
||||
* SNDRV_PCM_STATE_DRAINING: When stream is draining current data. This is done
|
||||
* by calling SNDRV_COMPRESS_DRAIN.
|
||||
* SNDRV_PCM_STATE_PAUSED: When stream is paused. This is done by calling
|
||||
* SNDRV_COMPRESS_PAUSE. It can be stopped or resumed by calling
|
||||
* SNDRV_COMPRESS_STOP or SNDRV_COMPRESS_RESUME respectively.
|
||||
*/
|
||||
static int snd_compr_open(struct inode *inode, struct file *f)
|
||||
{
|
||||
struct snd_compr *compr;
|
||||
struct snd_compr_file *data;
|
||||
struct snd_compr_runtime *runtime;
|
||||
enum snd_compr_direction dirn;
|
||||
int maj = imajor(inode);
|
||||
int ret;
|
||||
|
||||
if (f->f_flags & O_WRONLY)
|
||||
dirn = SND_COMPRESS_PLAYBACK;
|
||||
else if (f->f_flags & O_RDONLY)
|
||||
dirn = SND_COMPRESS_CAPTURE;
|
||||
else {
|
||||
pr_err("invalid direction\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (maj == snd_major)
|
||||
compr = snd_lookup_minor_data(iminor(inode),
|
||||
SNDRV_DEVICE_TYPE_COMPRESS);
|
||||
else
|
||||
return -EBADFD;
|
||||
|
||||
if (compr == NULL) {
|
||||
pr_err("no device data!!!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (dirn != compr->direction) {
|
||||
pr_err("this device doesn't support this direction\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
data->stream.ops = compr->ops;
|
||||
data->stream.direction = dirn;
|
||||
data->stream.private_data = compr->private_data;
|
||||
data->stream.device = compr;
|
||||
runtime = kzalloc(sizeof(*runtime), GFP_KERNEL);
|
||||
if (!runtime) {
|
||||
kfree(data);
|
||||
return -ENOMEM;
|
||||
}
|
||||
runtime->state = SNDRV_PCM_STATE_OPEN;
|
||||
init_waitqueue_head(&runtime->sleep);
|
||||
data->stream.runtime = runtime;
|
||||
f->private_data = (void *)data;
|
||||
mutex_lock(&compr->lock);
|
||||
ret = compr->ops->open(&data->stream);
|
||||
mutex_unlock(&compr->lock);
|
||||
if (ret) {
|
||||
kfree(runtime);
|
||||
kfree(data);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int snd_compr_free(struct inode *inode, struct file *f)
|
||||
{
|
||||
struct snd_compr_file *data = f->private_data;
|
||||
data->stream.ops->free(&data->stream);
|
||||
kfree(data->stream.runtime->buffer);
|
||||
kfree(data->stream.runtime);
|
||||
kfree(data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void snd_compr_update_tstamp(struct snd_compr_stream *stream,
|
||||
struct snd_compr_tstamp *tstamp)
|
||||
{
|
||||
if (!stream->ops->pointer)
|
||||
return;
|
||||
stream->ops->pointer(stream, tstamp);
|
||||
pr_debug("dsp consumed till %d total %d bytes\n",
|
||||
tstamp->byte_offset, tstamp->copied_total);
|
||||
stream->runtime->hw_pointer = tstamp->byte_offset;
|
||||
stream->runtime->total_bytes_transferred = tstamp->copied_total;
|
||||
}
|
||||
|
||||
static size_t snd_compr_calc_avail(struct snd_compr_stream *stream,
|
||||
struct snd_compr_avail *avail)
|
||||
{
|
||||
long avail_calc; /*this needs to be signed variable */
|
||||
|
||||
snd_compr_update_tstamp(stream, &avail->tstamp);
|
||||
|
||||
/* FIXME: This needs to be different for capture stream,
|
||||
available is # of compressed data, for playback it's
|
||||
remainder of buffer */
|
||||
|
||||
if (stream->runtime->total_bytes_available == 0 &&
|
||||
stream->runtime->state == SNDRV_PCM_STATE_SETUP) {
|
||||
pr_debug("detected init and someone forgot to do a write\n");
|
||||
return stream->runtime->buffer_size;
|
||||
}
|
||||
pr_debug("app wrote %lld, DSP consumed %lld\n",
|
||||
stream->runtime->total_bytes_available,
|
||||
stream->runtime->total_bytes_transferred);
|
||||
if (stream->runtime->total_bytes_available ==
|
||||
stream->runtime->total_bytes_transferred) {
|
||||
pr_debug("both pointers are same, returning full avail\n");
|
||||
return stream->runtime->buffer_size;
|
||||
}
|
||||
|
||||
/* FIXME: this routine isn't consistent, in one test we use
|
||||
* cumulative values and in the other byte offsets. Do we
|
||||
* really need the byte offsets if the cumulative values have
|
||||
* been updated? In the PCM interface app_ptr and hw_ptr are
|
||||
* already cumulative */
|
||||
|
||||
avail_calc = stream->runtime->buffer_size -
|
||||
(stream->runtime->app_pointer - stream->runtime->hw_pointer);
|
||||
pr_debug("calc avail as %ld, app_ptr %lld, hw+ptr %lld\n", avail_calc,
|
||||
stream->runtime->app_pointer,
|
||||
stream->runtime->hw_pointer);
|
||||
if (avail_calc >= stream->runtime->buffer_size)
|
||||
avail_calc -= stream->runtime->buffer_size;
|
||||
pr_debug("ret avail as %ld\n", avail_calc);
|
||||
avail->avail = avail_calc;
|
||||
return avail_calc;
|
||||
}
|
||||
|
||||
static inline size_t snd_compr_get_avail(struct snd_compr_stream *stream)
|
||||
{
|
||||
struct snd_compr_avail avail;
|
||||
|
||||
return snd_compr_calc_avail(stream, &avail);
|
||||
}
|
||||
|
||||
static int
|
||||
snd_compr_ioctl_avail(struct snd_compr_stream *stream, unsigned long arg)
|
||||
{
|
||||
struct snd_compr_avail ioctl_avail;
|
||||
size_t avail;
|
||||
|
||||
avail = snd_compr_calc_avail(stream, &ioctl_avail);
|
||||
ioctl_avail.avail = avail;
|
||||
|
||||
if (copy_to_user((__u64 __user *)arg,
|
||||
&ioctl_avail, sizeof(ioctl_avail)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_compr_write_data(struct snd_compr_stream *stream,
|
||||
const char __user *buf, size_t count)
|
||||
{
|
||||
void *dstn;
|
||||
size_t copy;
|
||||
struct snd_compr_runtime *runtime = stream->runtime;
|
||||
|
||||
dstn = runtime->buffer + runtime->app_pointer;
|
||||
pr_debug("copying %ld at %lld\n",
|
||||
(unsigned long)count, runtime->app_pointer);
|
||||
if (count < runtime->buffer_size - runtime->app_pointer) {
|
||||
if (copy_from_user(dstn, buf, count))
|
||||
return -EFAULT;
|
||||
runtime->app_pointer += count;
|
||||
} else {
|
||||
copy = runtime->buffer_size - runtime->app_pointer;
|
||||
if (copy_from_user(dstn, buf, copy))
|
||||
return -EFAULT;
|
||||
if (copy_from_user(runtime->buffer, buf + copy, count - copy))
|
||||
return -EFAULT;
|
||||
runtime->app_pointer = count - copy;
|
||||
}
|
||||
/* if DSP cares, let it know data has been written */
|
||||
if (stream->ops->ack)
|
||||
stream->ops->ack(stream, count);
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t snd_compr_write(struct file *f, const char __user *buf,
|
||||
size_t count, loff_t *offset)
|
||||
{
|
||||
struct snd_compr_file *data = f->private_data;
|
||||
struct snd_compr_stream *stream;
|
||||
size_t avail;
|
||||
int retval;
|
||||
|
||||
if (snd_BUG_ON(!data))
|
||||
return -EFAULT;
|
||||
|
||||
stream = &data->stream;
|
||||
mutex_lock(&stream->device->lock);
|
||||
/* write is allowed when stream is running or has been steup */
|
||||
if (stream->runtime->state != SNDRV_PCM_STATE_SETUP &&
|
||||
stream->runtime->state != SNDRV_PCM_STATE_RUNNING) {
|
||||
mutex_unlock(&stream->device->lock);
|
||||
return -EBADFD;
|
||||
}
|
||||
|
||||
avail = snd_compr_get_avail(stream);
|
||||
pr_debug("avail returned %ld\n", (unsigned long)avail);
|
||||
/* calculate how much we can write to buffer */
|
||||
if (avail > count)
|
||||
avail = count;
|
||||
|
||||
if (stream->ops->copy)
|
||||
retval = stream->ops->copy(stream, buf, avail);
|
||||
else
|
||||
retval = snd_compr_write_data(stream, buf, avail);
|
||||
if (retval > 0)
|
||||
stream->runtime->total_bytes_available += retval;
|
||||
|
||||
/* while initiating the stream, write should be called before START
|
||||
* call, so in setup move state */
|
||||
if (stream->runtime->state == SNDRV_PCM_STATE_SETUP) {
|
||||
stream->runtime->state = SNDRV_PCM_STATE_PREPARED;
|
||||
pr_debug("stream prepared, Houston we are good to go\n");
|
||||
}
|
||||
|
||||
mutex_unlock(&stream->device->lock);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
static ssize_t snd_compr_read(struct file *f, char __user *buf,
|
||||
size_t count, loff_t *offset)
|
||||
{
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
static int snd_compr_mmap(struct file *f, struct vm_area_struct *vma)
|
||||
{
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
static inline int snd_compr_get_poll(struct snd_compr_stream *stream)
|
||||
{
|
||||
if (stream->direction == SND_COMPRESS_PLAYBACK)
|
||||
return POLLOUT | POLLWRNORM;
|
||||
else
|
||||
return POLLIN | POLLRDNORM;
|
||||
}
|
||||
|
||||
static unsigned int snd_compr_poll(struct file *f, poll_table *wait)
|
||||
{
|
||||
struct snd_compr_file *data = f->private_data;
|
||||
struct snd_compr_stream *stream;
|
||||
size_t avail;
|
||||
int retval = 0;
|
||||
|
||||
if (snd_BUG_ON(!data))
|
||||
return -EFAULT;
|
||||
stream = &data->stream;
|
||||
if (snd_BUG_ON(!stream))
|
||||
return -EFAULT;
|
||||
|
||||
mutex_lock(&stream->device->lock);
|
||||
if (stream->runtime->state == SNDRV_PCM_STATE_PAUSED ||
|
||||
stream->runtime->state == SNDRV_PCM_STATE_OPEN) {
|
||||
retval = -EBADFD;
|
||||
goto out;
|
||||
}
|
||||
poll_wait(f, &stream->runtime->sleep, wait);
|
||||
|
||||
avail = snd_compr_get_avail(stream);
|
||||
pr_debug("avail is %ld\n", (unsigned long)avail);
|
||||
/* check if we have at least one fragment to fill */
|
||||
switch (stream->runtime->state) {
|
||||
case SNDRV_PCM_STATE_DRAINING:
|
||||
/* stream has been woken up after drain is complete
|
||||
* draining done so set stream state to stopped
|
||||
*/
|
||||
retval = snd_compr_get_poll(stream);
|
||||
stream->runtime->state = SNDRV_PCM_STATE_SETUP;
|
||||
break;
|
||||
case SNDRV_PCM_STATE_RUNNING:
|
||||
case SNDRV_PCM_STATE_PREPARED:
|
||||
case SNDRV_PCM_STATE_PAUSED:
|
||||
if (avail >= stream->runtime->fragment_size)
|
||||
retval = snd_compr_get_poll(stream);
|
||||
break;
|
||||
default:
|
||||
if (stream->direction == SND_COMPRESS_PLAYBACK)
|
||||
retval = POLLOUT | POLLWRNORM | POLLERR;
|
||||
else
|
||||
retval = POLLIN | POLLRDNORM | POLLERR;
|
||||
break;
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&stream->device->lock);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int
|
||||
snd_compr_get_caps(struct snd_compr_stream *stream, unsigned long arg)
|
||||
{
|
||||
int retval;
|
||||
struct snd_compr_caps caps;
|
||||
|
||||
if (!stream->ops->get_caps)
|
||||
return -ENXIO;
|
||||
|
||||
retval = stream->ops->get_caps(stream, &caps);
|
||||
if (retval)
|
||||
goto out;
|
||||
if (copy_to_user((void __user *)arg, &caps, sizeof(caps)))
|
||||
retval = -EFAULT;
|
||||
out:
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int
|
||||
snd_compr_get_codec_caps(struct snd_compr_stream *stream, unsigned long arg)
|
||||
{
|
||||
int retval;
|
||||
struct snd_compr_codec_caps *caps;
|
||||
|
||||
if (!stream->ops->get_codec_caps)
|
||||
return -ENXIO;
|
||||
|
||||
caps = kmalloc(sizeof(*caps), GFP_KERNEL);
|
||||
if (!caps)
|
||||
return -ENOMEM;
|
||||
|
||||
retval = stream->ops->get_codec_caps(stream, caps);
|
||||
if (retval)
|
||||
goto out;
|
||||
if (copy_to_user((void __user *)arg, caps, sizeof(*caps)))
|
||||
retval = -EFAULT;
|
||||
|
||||
out:
|
||||
kfree(caps);
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* revisit this with snd_pcm_preallocate_xxx */
|
||||
static int snd_compr_allocate_buffer(struct snd_compr_stream *stream,
|
||||
struct snd_compr_params *params)
|
||||
{
|
||||
unsigned int buffer_size;
|
||||
void *buffer;
|
||||
|
||||
buffer_size = params->buffer.fragment_size * params->buffer.fragments;
|
||||
if (stream->ops->copy) {
|
||||
buffer = NULL;
|
||||
/* if copy is defined the driver will be required to copy
|
||||
* the data from core
|
||||
*/
|
||||
} else {
|
||||
buffer = kmalloc(buffer_size, GFP_KERNEL);
|
||||
if (!buffer)
|
||||
return -ENOMEM;
|
||||
}
|
||||
stream->runtime->fragment_size = params->buffer.fragment_size;
|
||||
stream->runtime->fragments = params->buffer.fragments;
|
||||
stream->runtime->buffer = buffer;
|
||||
stream->runtime->buffer_size = buffer_size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg)
|
||||
{
|
||||
struct snd_compr_params *params;
|
||||
int retval;
|
||||
|
||||
if (stream->runtime->state == SNDRV_PCM_STATE_OPEN) {
|
||||
/*
|
||||
* we should allow parameter change only when stream has been
|
||||
* opened not in other cases
|
||||
*/
|
||||
params = kmalloc(sizeof(*params), GFP_KERNEL);
|
||||
if (!params)
|
||||
return -ENOMEM;
|
||||
if (copy_from_user(params, (void __user *)arg, sizeof(*params)))
|
||||
return -EFAULT;
|
||||
retval = snd_compr_allocate_buffer(stream, params);
|
||||
if (retval) {
|
||||
kfree(params);
|
||||
return -ENOMEM;
|
||||
}
|
||||
retval = stream->ops->set_params(stream, params);
|
||||
if (retval)
|
||||
goto out;
|
||||
stream->runtime->state = SNDRV_PCM_STATE_SETUP;
|
||||
} else
|
||||
return -EPERM;
|
||||
out:
|
||||
kfree(params);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int
|
||||
snd_compr_get_params(struct snd_compr_stream *stream, unsigned long arg)
|
||||
{
|
||||
struct snd_codec *params;
|
||||
int retval;
|
||||
|
||||
if (!stream->ops->get_params)
|
||||
return -EBADFD;
|
||||
|
||||
params = kmalloc(sizeof(*params), GFP_KERNEL);
|
||||
if (!params)
|
||||
return -ENOMEM;
|
||||
retval = stream->ops->get_params(stream, params);
|
||||
if (retval)
|
||||
goto out;
|
||||
if (copy_to_user((char __user *)arg, params, sizeof(*params)))
|
||||
retval = -EFAULT;
|
||||
|
||||
out:
|
||||
kfree(params);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static inline int
|
||||
snd_compr_tstamp(struct snd_compr_stream *stream, unsigned long arg)
|
||||
{
|
||||
struct snd_compr_tstamp tstamp;
|
||||
|
||||
snd_compr_update_tstamp(stream, &tstamp);
|
||||
return copy_to_user((struct snd_compr_tstamp __user *)arg,
|
||||
&tstamp, sizeof(tstamp)) ? -EFAULT : 0;
|
||||
}
|
||||
|
||||
static int snd_compr_pause(struct snd_compr_stream *stream)
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (stream->runtime->state != SNDRV_PCM_STATE_RUNNING)
|
||||
return -EPERM;
|
||||
retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_PAUSE_PUSH);
|
||||
if (!retval) {
|
||||
stream->runtime->state = SNDRV_PCM_STATE_PAUSED;
|
||||
wake_up(&stream->runtime->sleep);
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int snd_compr_resume(struct snd_compr_stream *stream)
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (stream->runtime->state != SNDRV_PCM_STATE_PAUSED)
|
||||
return -EPERM;
|
||||
retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_PAUSE_RELEASE);
|
||||
if (!retval)
|
||||
stream->runtime->state = SNDRV_PCM_STATE_RUNNING;
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int snd_compr_start(struct snd_compr_stream *stream)
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (stream->runtime->state != SNDRV_PCM_STATE_PREPARED)
|
||||
return -EPERM;
|
||||
retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_START);
|
||||
if (!retval)
|
||||
stream->runtime->state = SNDRV_PCM_STATE_RUNNING;
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int snd_compr_stop(struct snd_compr_stream *stream)
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED ||
|
||||
stream->runtime->state == SNDRV_PCM_STATE_SETUP)
|
||||
return -EPERM;
|
||||
retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP);
|
||||
if (!retval) {
|
||||
stream->runtime->state = SNDRV_PCM_STATE_SETUP;
|
||||
wake_up(&stream->runtime->sleep);
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int snd_compr_drain(struct snd_compr_stream *stream)
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED ||
|
||||
stream->runtime->state == SNDRV_PCM_STATE_SETUP)
|
||||
return -EPERM;
|
||||
retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_DRAIN);
|
||||
if (!retval) {
|
||||
stream->runtime->state = SNDRV_PCM_STATE_DRAINING;
|
||||
wake_up(&stream->runtime->sleep);
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct snd_compr_file *data = f->private_data;
|
||||
struct snd_compr_stream *stream;
|
||||
int retval = -ENOTTY;
|
||||
|
||||
if (snd_BUG_ON(!data))
|
||||
return -EFAULT;
|
||||
stream = &data->stream;
|
||||
if (snd_BUG_ON(!stream))
|
||||
return -EFAULT;
|
||||
mutex_lock(&stream->device->lock);
|
||||
switch (_IOC_NR(cmd)) {
|
||||
case _IOC_NR(SNDRV_COMPRESS_IOCTL_VERSION):
|
||||
put_user(SNDRV_COMPRESS_VERSION,
|
||||
(int __user *)arg) ? -EFAULT : 0;
|
||||
break;
|
||||
case _IOC_NR(SNDRV_COMPRESS_GET_CAPS):
|
||||
retval = snd_compr_get_caps(stream, arg);
|
||||
break;
|
||||
case _IOC_NR(SNDRV_COMPRESS_GET_CODEC_CAPS):
|
||||
retval = snd_compr_get_codec_caps(stream, arg);
|
||||
break;
|
||||
case _IOC_NR(SNDRV_COMPRESS_SET_PARAMS):
|
||||
retval = snd_compr_set_params(stream, arg);
|
||||
break;
|
||||
case _IOC_NR(SNDRV_COMPRESS_GET_PARAMS):
|
||||
retval = snd_compr_get_params(stream, arg);
|
||||
break;
|
||||
case _IOC_NR(SNDRV_COMPRESS_TSTAMP):
|
||||
retval = snd_compr_tstamp(stream, arg);
|
||||
break;
|
||||
case _IOC_NR(SNDRV_COMPRESS_AVAIL):
|
||||
retval = snd_compr_ioctl_avail(stream, arg);
|
||||
break;
|
||||
case _IOC_NR(SNDRV_COMPRESS_PAUSE):
|
||||
retval = snd_compr_pause(stream);
|
||||
break;
|
||||
case _IOC_NR(SNDRV_COMPRESS_RESUME):
|
||||
retval = snd_compr_resume(stream);
|
||||
break;
|
||||
case _IOC_NR(SNDRV_COMPRESS_START):
|
||||
retval = snd_compr_start(stream);
|
||||
break;
|
||||
case _IOC_NR(SNDRV_COMPRESS_STOP):
|
||||
retval = snd_compr_stop(stream);
|
||||
break;
|
||||
case _IOC_NR(SNDRV_COMPRESS_DRAIN):
|
||||
retval = snd_compr_drain(stream);
|
||||
break;
|
||||
}
|
||||
mutex_unlock(&stream->device->lock);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static const struct file_operations snd_compr_file_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = snd_compr_open,
|
||||
.release = snd_compr_free,
|
||||
.write = snd_compr_write,
|
||||
.read = snd_compr_read,
|
||||
.unlocked_ioctl = snd_compr_ioctl,
|
||||
.mmap = snd_compr_mmap,
|
||||
.poll = snd_compr_poll,
|
||||
};
|
||||
|
||||
static int snd_compress_dev_register(struct snd_device *device)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
char str[16];
|
||||
struct snd_compr *compr;
|
||||
|
||||
if (snd_BUG_ON(!device || !device->device_data))
|
||||
return -EBADFD;
|
||||
compr = device->device_data;
|
||||
|
||||
sprintf(str, "comprC%iD%i", compr->card->number, compr->device);
|
||||
pr_debug("reg %s for device %s, direction %d\n", str, compr->name,
|
||||
compr->direction);
|
||||
/* register compressed device */
|
||||
ret = snd_register_device(SNDRV_DEVICE_TYPE_COMPRESS, compr->card,
|
||||
compr->device, &snd_compr_file_ops, compr, str);
|
||||
if (ret < 0) {
|
||||
pr_err("snd_register_device failed\n %d", ret);
|
||||
return ret;
|
||||
}
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
static int snd_compress_dev_disconnect(struct snd_device *device)
|
||||
{
|
||||
struct snd_compr *compr;
|
||||
|
||||
compr = device->device_data;
|
||||
snd_unregister_device(compr->direction, compr->card, compr->device);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* snd_compress_new: create new compress device
|
||||
* @card: sound card pointer
|
||||
* @device: device number
|
||||
* @dirn: device direction, should be of type enum snd_compr_direction
|
||||
* @compr: compress device pointer
|
||||
*/
|
||||
int snd_compress_new(struct snd_card *card, int device,
|
||||
int dirn, struct snd_compr *compr)
|
||||
{
|
||||
static struct snd_device_ops ops = {
|
||||
.dev_free = NULL,
|
||||
.dev_register = snd_compress_dev_register,
|
||||
.dev_disconnect = snd_compress_dev_disconnect,
|
||||
};
|
||||
|
||||
compr->card = card;
|
||||
compr->device = device;
|
||||
compr->direction = dirn;
|
||||
return snd_device_new(card, SNDRV_DEV_COMPRESS, compr, &ops);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_compress_new);
|
||||
|
||||
static int snd_compress_add_device(struct snd_compr *device)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!device->card)
|
||||
return -EINVAL;
|
||||
|
||||
/* register the card */
|
||||
ret = snd_card_register(device->card);
|
||||
if (ret)
|
||||
goto out;
|
||||
return 0;
|
||||
|
||||
out:
|
||||
pr_err("failed with %d\n", ret);
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
static int snd_compress_remove_device(struct snd_compr *device)
|
||||
{
|
||||
return snd_card_free(device->card);
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_compress_register - register compressed device
|
||||
*
|
||||
* @device: compressed device to register
|
||||
*/
|
||||
int snd_compress_register(struct snd_compr *device)
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (device->name == NULL || device->dev == NULL || device->ops == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
pr_debug("Registering compressed device %s\n", device->name);
|
||||
if (snd_BUG_ON(!device->ops->open))
|
||||
return -EINVAL;
|
||||
if (snd_BUG_ON(!device->ops->free))
|
||||
return -EINVAL;
|
||||
if (snd_BUG_ON(!device->ops->set_params))
|
||||
return -EINVAL;
|
||||
if (snd_BUG_ON(!device->ops->trigger))
|
||||
return -EINVAL;
|
||||
|
||||
mutex_init(&device->lock);
|
||||
|
||||
/* register a compressed card */
|
||||
mutex_lock(&device_mutex);
|
||||
retval = snd_compress_add_device(device);
|
||||
mutex_unlock(&device_mutex);
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_compress_register);
|
||||
|
||||
int snd_compress_deregister(struct snd_compr *device)
|
||||
{
|
||||
pr_debug("Removing compressed device %s\n", device->name);
|
||||
mutex_lock(&device_mutex);
|
||||
snd_compress_remove_device(device);
|
||||
mutex_unlock(&device_mutex);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_compress_deregister);
|
||||
|
||||
static int __init snd_compress_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit snd_compress_exit(void)
|
||||
{
|
||||
}
|
||||
|
||||
module_init(snd_compress_init);
|
||||
module_exit(snd_compress_exit);
|
||||
|
||||
MODULE_DESCRIPTION("ALSA Compressed offload framework");
|
||||
MODULE_AUTHOR("Vinod Koul <vinod.koul@linux.intel.com>");
|
||||
MODULE_LICENSE("GPL v2");
|
@ -47,7 +47,7 @@
|
||||
|
||||
static int dsp_map[SNDRV_CARDS];
|
||||
static int adsp_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 1};
|
||||
static int nonblock_open = 1;
|
||||
static bool nonblock_open = 1;
|
||||
|
||||
MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, Abramo Bagnara <abramo@alsa-project.org>");
|
||||
MODULE_DESCRIPTION("PCM OSS emulation for ALSA.");
|
||||
|
@ -65,7 +65,7 @@ MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("snd-seq-client-" __stringify(SNDRV_SEQ_CLIENT_DUMMY));
|
||||
|
||||
static int ports = 1;
|
||||
static int duplex;
|
||||
static bool duplex;
|
||||
|
||||
module_param(ports, int, 0444);
|
||||
MODULE_PARM_DESC(ports, "number of ports to be created");
|
||||
|
@ -229,6 +229,7 @@ static int snd_kernel_minor(int type, struct snd_card *card, int dev)
|
||||
case SNDRV_DEVICE_TYPE_RAWMIDI:
|
||||
case SNDRV_DEVICE_TYPE_PCM_PLAYBACK:
|
||||
case SNDRV_DEVICE_TYPE_PCM_CAPTURE:
|
||||
case SNDRV_DEVICE_TYPE_COMPRESS:
|
||||
if (snd_BUG_ON(!card))
|
||||
return -EINVAL;
|
||||
minor = SNDRV_MINOR(card->number, type + dev);
|
||||
|
@ -51,7 +51,7 @@ MODULE_SUPPORTED_DEVICE("{{ALSA,Loopback soundcard}}");
|
||||
|
||||
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] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
|
||||
static bool enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
|
||||
static int pcm_substreams[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 8};
|
||||
static int pcm_notify[SNDRV_CARDS];
|
||||
|
||||
|
@ -60,15 +60,15 @@ MODULE_SUPPORTED_DEVICE("{{ALSA,Dummy soundcard}}");
|
||||
|
||||
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] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
|
||||
static bool enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
|
||||
static char *model[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = NULL};
|
||||
static int pcm_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
static int pcm_substreams[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 8};
|
||||
//static int midi_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2};
|
||||
#ifdef CONFIG_HIGH_RES_TIMERS
|
||||
static int hrtimer = 1;
|
||||
static bool hrtimer = 1;
|
||||
#endif
|
||||
static int fake_buffer = 1;
|
||||
static bool fake_buffer = 1;
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
MODULE_PARM_DESC(index, "Index value for dummy soundcard.");
|
||||
|
@ -73,7 +73,7 @@ MODULE_SUPPORTED_DEVICE("{{Xilinx,ML403 AC97 Controller Reference}}");
|
||||
|
||||
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
|
||||
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE;
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE;
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
MODULE_PARM_DESC(index, "Index value for ML403 AC97 Controller Reference.");
|
||||
@ -1341,15 +1341,4 @@ static struct platform_driver snd_ml403_ac97cr_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init alsa_card_ml403_ac97cr_init(void)
|
||||
{
|
||||
return platform_driver_register(&snd_ml403_ac97cr_driver);
|
||||
}
|
||||
|
||||
static void __exit alsa_card_ml403_ac97cr_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&snd_ml403_ac97cr_driver);
|
||||
}
|
||||
|
||||
module_init(alsa_card_ml403_ac97cr_init)
|
||||
module_exit(alsa_card_ml403_ac97cr_exit)
|
||||
module_platform_driver(snd_ml403_ac97cr_driver);
|
||||
|
@ -35,13 +35,13 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
static int index[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -2}; /* exclude the first card */
|
||||
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */
|
||||
#ifdef CONFIG_PNP
|
||||
static int pnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
static bool pnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
#endif
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* MPU-401 port number */
|
||||
static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* MPU-401 IRQ */
|
||||
static int uart_enter[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
static bool uart_enter[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
MODULE_PARM_DESC(index, "Index value for MPU-401 device.");
|
||||
|
@ -36,7 +36,7 @@
|
||||
|
||||
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
|
||||
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
|
||||
static struct platform_device *platform_devices[SNDRV_CARDS];
|
||||
static int device_count;
|
||||
|
@ -27,7 +27,7 @@
|
||||
|
||||
extern char snd_opl3_regmap[MAX_OPL2_VOICES][4];
|
||||
|
||||
extern int use_internal_drums;
|
||||
extern bool use_internal_drums;
|
||||
|
||||
static void snd_opl3_note_off_unsafe(void *p, int note, int vel,
|
||||
struct snd_midi_channel *chan);
|
||||
|
@ -32,7 +32,7 @@ MODULE_AUTHOR("Uros Bizjak <uros@kss-loka.si>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("ALSA driver for OPL3 FM synth");
|
||||
|
||||
int use_internal_drums = 0;
|
||||
bool use_internal_drums = 0;
|
||||
module_param(use_internal_drums, bool, 0444);
|
||||
MODULE_PARM_DESC(use_internal_drums, "Enable internal OPL2/3 drums.");
|
||||
|
||||
|
@ -25,8 +25,8 @@ MODULE_ALIAS("platform:pcspkr");
|
||||
|
||||
static int index = SNDRV_DEFAULT_IDX1; /* Index 0-MAX */
|
||||
static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */
|
||||
static int enable = SNDRV_DEFAULT_ENABLE1; /* Enable this card */
|
||||
static int nopcm; /* Disable PCM capability of the driver */
|
||||
static bool enable = SNDRV_DEFAULT_ENABLE1; /* Enable this card */
|
||||
static bool nopcm; /* Disable PCM capability of the driver */
|
||||
|
||||
module_param(index, int, 0444);
|
||||
MODULE_PARM_DESC(index, "Index value for pcsp soundcard.");
|
||||
|
@ -14,7 +14,7 @@
|
||||
#include <asm/io.h>
|
||||
#include "pcsp.h"
|
||||
|
||||
static int nforce_wa;
|
||||
static bool nforce_wa;
|
||||
module_param(nforce_wa, bool, 0444);
|
||||
MODULE_PARM_DESC(nforce_wa, "Apply NForce chipset workaround "
|
||||
"(expect bad sound)");
|
||||
|
@ -55,7 +55,7 @@
|
||||
|
||||
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
|
||||
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
|
||||
static struct platform_device *platform_devices[SNDRV_CARDS];
|
||||
static int device_count;
|
||||
|
@ -69,7 +69,7 @@ static char *adaptor_names[] = {
|
||||
|
||||
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; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0x3f8,0x2f8,0x3e8,0x2e8 */
|
||||
static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* 3,4,5,7,9,10,11,14,15 */
|
||||
static int speed[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 38400}; /* 9600,19200,38400,57600,115200 */
|
||||
@ -77,7 +77,7 @@ static int base[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 115200}; /* baud bas
|
||||
static int outs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1}; /* 1 to 16 */
|
||||
static int ins[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1}; /* 1 to 16 */
|
||||
static int adaptor[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = SNDRV_SERIAL_SOUNDCANVAS};
|
||||
static int droponfull[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS -1)] = SNDRV_SERIAL_NORMALBUFF };
|
||||
static bool droponfull[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS -1)] = SNDRV_SERIAL_NORMALBUFF };
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
MODULE_PARM_DESC(index, "Index value for Serial MIDI.");
|
||||
|
@ -63,7 +63,7 @@ MODULE_SUPPORTED_DEVICE("{{ALSA,Virtual rawmidi device}}");
|
||||
|
||||
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] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
|
||||
static bool enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
|
||||
static int midi_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 4};
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
|
@ -44,7 +44,7 @@ MODULE_SUPPORTED_DEVICE("{{Highscreen,Sound-Boostar 16 3D},"
|
||||
|
||||
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 1-MAX */
|
||||
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP; /* Enable this card */
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */
|
||||
static long mpu_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */
|
||||
static long fm_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */
|
||||
|
@ -43,11 +43,11 @@ MODULE_SUPPORTED_DEVICE("{{Analog Devices,AD1848},"
|
||||
|
||||
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; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */
|
||||
static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* 5,7,9,11,12,15 */
|
||||
static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 0,1,3,5,6,7 */
|
||||
static int thinkpad[SNDRV_CARDS]; /* Thinkpad special case */
|
||||
static bool thinkpad[SNDRV_CARDS]; /* Thinkpad special case */
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
MODULE_PARM_DESC(index, "Index value for " CRD_NAME " soundcard.");
|
||||
|
@ -18,7 +18,7 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
|
||||
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE;
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE;
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
|
@ -54,7 +54,7 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
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; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */
|
||||
static long mpu_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */
|
||||
static long fm_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */
|
||||
|
@ -55,7 +55,7 @@ MODULE_SUPPORTED_DEVICE("{{Aztech Systems,PRO16V},"
|
||||
|
||||
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_ISAPNP; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP; /* Enable this card */
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */
|
||||
static long wss_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */
|
||||
static long mpu_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */
|
||||
|
@ -69,9 +69,9 @@ MODULE_SUPPORTED_DEVICE("{{C-Media,CMI8330,isapnp:{CMI0001,@@@0001,@X@0001}}}");
|
||||
|
||||
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
|
||||
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP;
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP;
|
||||
#ifdef CONFIG_PNP
|
||||
static int isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
static bool isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
#endif
|
||||
static long sbport[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
|
||||
static int sbirq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
|
||||
|
@ -41,7 +41,7 @@ MODULE_SUPPORTED_DEVICE("{{Crystal Semiconductors,CS4231}}");
|
||||
|
||||
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; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */
|
||||
static long mpu_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */
|
||||
static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* 5,7,9,11,12,15 */
|
||||
|
@ -74,9 +74,9 @@ MODULE_ALIAS("snd_cs4232");
|
||||
|
||||
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_ISAPNP; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP; /* Enable this card */
|
||||
#ifdef CONFIG_PNP
|
||||
static int isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
static bool isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
#endif
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */
|
||||
static long cport[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */
|
||||
|
@ -51,9 +51,9 @@ MODULE_ALIAS("snd_es968");
|
||||
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
|
||||
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
|
||||
#ifdef CONFIG_PNP
|
||||
static int isapnp[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP;
|
||||
static bool isapnp[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP;
|
||||
#endif
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0x220,0x240,0x260 */
|
||||
static long fm_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* Usually 0x388 */
|
||||
static long mpu_port[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -1};
|
||||
|
@ -1964,9 +1964,9 @@ MODULE_SUPPORTED_DEVICE("{{ESS,ES1868 PnP AudioDrive},"
|
||||
|
||||
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_ISAPNP; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP; /* Enable this card */
|
||||
#ifdef CONFIG_PNP
|
||||
static int isapnp[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP;
|
||||
static bool isapnp[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP;
|
||||
#endif
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0x220,0x240,0x260,0x280 */
|
||||
#ifndef CONFIG_PNP
|
||||
|
@ -35,7 +35,7 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
|
||||
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE;
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE;
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
MODULE_PARM_DESC(index, "Index value for " CRD_NAME " soundcard.");
|
||||
|
@ -42,7 +42,7 @@ MODULE_SUPPORTED_DEVICE("{{Gravis,UltraSound Classic}}");
|
||||
|
||||
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; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0x220,0x230,0x240,0x250,0x260 */
|
||||
static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* 3,5,9,11,12,15 */
|
||||
static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 1,3,5,6,7 */
|
||||
|
@ -46,7 +46,7 @@ MODULE_SUPPORTED_DEVICE("{{Gravis,UltraSound Extreme}}");
|
||||
|
||||
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; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0x220,0x240,0x260 */
|
||||
static long gf1_port[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS) - 1] = -1}; /* 0x210,0x220,0x230,0x240,0x250,0x260,0x270 */
|
||||
static long mpu_port[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS) - 1] = -1}; /* 0x300,0x310,0x320 */
|
||||
|
@ -40,7 +40,7 @@ MODULE_SUPPORTED_DEVICE("{{Gravis,UltraSound MAX}}");
|
||||
|
||||
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; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0x220,0x230,0x240,0x250,0x260 */
|
||||
static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* 2,3,5,9,11,12,15 */
|
||||
static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 1,3,5,6,7 */
|
||||
|
@ -55,9 +55,9 @@ MODULE_SUPPORTED_DEVICE("{{AMD,InterWave STB with TEA6330T}}");
|
||||
|
||||
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_ISAPNP; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP; /* Enable this card */
|
||||
#ifdef CONFIG_PNP
|
||||
static int isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
static bool isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
#endif
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0x210,0x220,0x230,0x240,0x250,0x260 */
|
||||
#ifdef SNDRV_STB
|
||||
|
@ -785,7 +785,7 @@ static int write_ndelay[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 1 };
|
||||
static int calibrate_signal;
|
||||
|
||||
#ifdef CONFIG_PNP
|
||||
static int isapnp[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
static bool isapnp[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
module_param_array(isapnp, bool, NULL, 0444);
|
||||
MODULE_PARM_DESC(isapnp, "ISA PnP detection for specified soundcard.");
|
||||
#define has_isapnp(x) isapnp[x]
|
||||
|
@ -46,9 +46,9 @@ MODULE_SUPPORTED_DEVICE("{{Yamaha,YMF719E-S},"
|
||||
|
||||
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_ISAPNP; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP; /* Enable this card */
|
||||
#ifdef CONFIG_PNP
|
||||
static int isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
static bool isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
#endif
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0xf86,0x370,0x100 */
|
||||
static long sb_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0x220,0x240,0x260 */
|
||||
|
@ -61,7 +61,7 @@ static int dma2 = SNDRV_DEFAULT_DMA1; /* 0,1,3 */
|
||||
static int wss;
|
||||
static int ide;
|
||||
#ifdef CONFIG_PNP
|
||||
static int isapnp = 1; /* Enable ISA PnP detection */
|
||||
static bool isapnp = 1; /* Enable ISA PnP detection */
|
||||
#endif
|
||||
|
||||
module_param(index, int, 0444);
|
||||
|
@ -63,7 +63,7 @@ MODULE_SUPPORTED_DEVICE("{{OPTi,82C924 (AD1848)},"
|
||||
|
||||
static int index = SNDRV_DEFAULT_IDX1; /* Index 0-MAX */
|
||||
static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */
|
||||
//static int enable = SNDRV_DEFAULT_ENABLE1; /* Enable this card */
|
||||
//static bool enable = SNDRV_DEFAULT_ENABLE1; /* Enable this card */
|
||||
#ifdef CONFIG_PNP
|
||||
static int isapnp = 1; /* Enable ISA PnP detection */
|
||||
#endif
|
||||
|
@ -36,7 +36,7 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
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; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */
|
||||
static unsigned long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
|
||||
static unsigned long mpu_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
|
||||
static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
|
||||
|
@ -68,9 +68,9 @@ MODULE_SUPPORTED_DEVICE("{{Creative Labs,SB AWE 32},"
|
||||
|
||||
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_ISAPNP; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP; /* Enable this card */
|
||||
#ifdef CONFIG_PNP
|
||||
static int isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
static bool isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
#endif
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0x220,0x240,0x260,0x280 */
|
||||
static long mpu_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0x330,0x300 */
|
||||
|
@ -36,7 +36,7 @@ MODULE_SUPPORTED_DEVICE("{{Creative Labs,SB 1.0/SB 2.0/SB Pro}}");
|
||||
|
||||
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; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0x220,0x240,0x260 */
|
||||
static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* 5,7,9,10 */
|
||||
static int dma8[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 1,3 */
|
||||
|
@ -48,7 +48,7 @@ MODULE_SUPPORTED_DEVICE("{{Gallant, SC-6000},"
|
||||
|
||||
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; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */
|
||||
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0x220, 0x240 */
|
||||
static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* 5, 7, 9, 10, 11 */
|
||||
static long mss_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0x530, 0xe80 */
|
||||
|
@ -38,9 +38,9 @@ MODULE_SUPPORTED_DEVICE("{{Turtle Beach,Maui/Tropez/Tropez+}}");
|
||||
|
||||
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; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */
|
||||
#ifdef CONFIG_PNP
|
||||
static int isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
static bool isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
#endif
|
||||
static long cs4232_pcm_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */
|
||||
static int cs4232_pcm_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* 5,7,9,11,12,15 */
|
||||
@ -51,7 +51,7 @@ static int ics2115_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* 2,9,11,12,15 */
|
||||
static long fm_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */
|
||||
static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 0,1,3,5,6,7 */
|
||||
static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 0,1,3,5,6,7 */
|
||||
static int use_cs4232_midi[SNDRV_CARDS];
|
||||
static bool use_cs4232_midi[SNDRV_CARDS];
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
MODULE_PARM_DESC(index, "Index value for WaveFront soundcard.");
|
||||
|
@ -935,15 +935,4 @@ static struct platform_driver hal2_driver = {
|
||||
}
|
||||
};
|
||||
|
||||
static int __init alsa_card_hal2_init(void)
|
||||
{
|
||||
return platform_driver_register(&hal2_driver);
|
||||
}
|
||||
|
||||
static void __exit alsa_card_hal2_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&hal2_driver);
|
||||
}
|
||||
|
||||
module_init(alsa_card_hal2_init);
|
||||
module_exit(alsa_card_hal2_exit);
|
||||
module_platform_driver(hal2_driver);
|
||||
|
@ -976,15 +976,4 @@ static struct platform_driver sgio2audio_driver = {
|
||||
}
|
||||
};
|
||||
|
||||
static int __init alsa_card_sgio2audio_init(void)
|
||||
{
|
||||
return platform_driver_register(&sgio2audio_driver);
|
||||
}
|
||||
|
||||
static void __exit alsa_card_sgio2audio_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&sgio2audio_driver);
|
||||
}
|
||||
|
||||
module_init(alsa_card_sgio2audio_init)
|
||||
module_exit(alsa_card_sgio2audio_exit)
|
||||
module_platform_driver(sgio2audio_driver);
|
||||
|
@ -119,9 +119,9 @@ ad1848_port_info;
|
||||
static struct address_info cfg;
|
||||
static int nr_ad1848_devs;
|
||||
|
||||
static int deskpro_xl;
|
||||
static int deskpro_m;
|
||||
static int soundpro;
|
||||
static bool deskpro_xl;
|
||||
static bool deskpro_m;
|
||||
static bool soundpro;
|
||||
|
||||
static volatile signed char irq2dev[17] = {
|
||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||
@ -177,7 +177,7 @@ static struct {
|
||||
#ifdef CONFIG_PNP
|
||||
static int isapnp = 1;
|
||||
static int isapnpjump;
|
||||
static int reverse;
|
||||
static bool reverse;
|
||||
|
||||
static int audio_activated;
|
||||
#else
|
||||
|
@ -1701,7 +1701,7 @@ static int joystick_io __initdata = CONFIG_MSNDPIN_JOYSTICK_IO;
|
||||
#ifndef CONFIG_MSNDPIN_DIGITAL
|
||||
# define CONFIG_MSNDPIN_DIGITAL 0
|
||||
#endif
|
||||
static int digital __initdata = CONFIG_MSNDPIN_DIGITAL;
|
||||
static bool digital __initdata = CONFIG_MSNDPIN_DIGITAL;
|
||||
|
||||
#endif /* MSND_CLASSIC */
|
||||
|
||||
|
@ -41,19 +41,19 @@ static int pas_irq;
|
||||
static int pas_sb_base;
|
||||
DEFINE_SPINLOCK(pas_lock);
|
||||
#ifndef CONFIG_PAS_JOYSTICK
|
||||
static int joystick;
|
||||
static bool joystick;
|
||||
#else
|
||||
static int joystick = 1;
|
||||
static bool joystick = 1;
|
||||
#endif
|
||||
#ifdef SYMPHONY_PAS
|
||||
static int symphony = 1;
|
||||
static bool symphony = 1;
|
||||
#else
|
||||
static int symphony;
|
||||
static bool symphony;
|
||||
#endif
|
||||
#ifdef BROKEN_BUS_CLOCK
|
||||
static int broken_bus_clock = 1;
|
||||
static bool broken_bus_clock = 1;
|
||||
#else
|
||||
static int broken_bus_clock;
|
||||
static bool broken_bus_clock;
|
||||
#endif
|
||||
|
||||
static struct address_info cfg;
|
||||
|
@ -117,9 +117,9 @@
|
||||
|
||||
/* If compiled into kernel, it enable or disable pss mixer */
|
||||
#ifdef CONFIG_PSS_MIXER
|
||||
static int pss_mixer = 1;
|
||||
static bool pss_mixer = 1;
|
||||
#else
|
||||
static int pss_mixer;
|
||||
static bool pss_mixer;
|
||||
#endif
|
||||
|
||||
|
||||
@ -147,7 +147,7 @@ static DEFINE_SPINLOCK(lock);
|
||||
static int pss_initialized;
|
||||
static int nonstandard_microcode;
|
||||
static int pss_cdrom_port = -1; /* Parameter for the PSS cdrom port */
|
||||
static int pss_enable_joystick; /* Parameter for enabling the joystick */
|
||||
static bool pss_enable_joystick; /* Parameter for enabling the joystick */
|
||||
static coproc_operations pss_coproc_operations;
|
||||
|
||||
static void pss_write(pss_confdata *devc, int data)
|
||||
@ -1133,8 +1133,8 @@ static int mss_irq __initdata = -1;
|
||||
static int mss_dma __initdata = -1;
|
||||
static int mpu_io __initdata = -1;
|
||||
static int mpu_irq __initdata = -1;
|
||||
static int pss_no_sound = 0; /* Just configure non-sound components */
|
||||
static int pss_keep_settings = 1; /* Keep hardware settings at module exit */
|
||||
static bool pss_no_sound = 0; /* Just configure non-sound components */
|
||||
static bool pss_keep_settings = 1; /* Keep hardware settings at module exit */
|
||||
static char *pss_firmware = "/etc/sound/pss_synth";
|
||||
|
||||
module_param(pss_io, int, 0);
|
||||
|
@ -31,7 +31,7 @@
|
||||
|
||||
static int mpu;
|
||||
|
||||
static int joystick;
|
||||
static bool joystick;
|
||||
|
||||
static unsigned char trix_read(int addr)
|
||||
{
|
||||
|
@ -42,7 +42,7 @@ MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
|
||||
MODULE_DESCRIPTION("Universal interface for Audio Codec '97");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int enable_loopback;
|
||||
static bool enable_loopback;
|
||||
|
||||
module_param(enable_loopback, bool, 0444);
|
||||
MODULE_PARM_DESC(enable_loopback, "Enable AC97 ADC/DAC Loopback Control");
|
||||
|
@ -66,7 +66,7 @@ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
|
||||
module_param_array(id, charp, NULL, 0444);
|
||||
MODULE_PARM_DESC(id, "ID string for the AD1889 soundcard.");
|
||||
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
module_param_array(enable, bool, NULL, 0444);
|
||||
MODULE_PARM_DESC(enable, "Enable AD1889 soundcard.");
|
||||
|
||||
|
@ -48,7 +48,7 @@ MODULE_SUPPORTED_DEVICE("{{ALI,M5451,pci},{ALI,M5451}}");
|
||||
static int index = SNDRV_DEFAULT_IDX1; /* Index */
|
||||
static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */
|
||||
static int pcm_channels = 32;
|
||||
static int spdif;
|
||||
static bool spdif;
|
||||
|
||||
module_param(index, int, 0444);
|
||||
MODULE_PARM_DESC(index, "Index value for ALI M5451 PCI Audio.");
|
||||
@ -60,7 +60,7 @@ module_param(spdif, bool, 0444);
|
||||
MODULE_PARM_DESC(spdif, "Support SPDIF I/O");
|
||||
|
||||
/* just for backward compatibility */
|
||||
static int enable;
|
||||
static bool enable;
|
||||
module_param(enable, bool, 0444);
|
||||
|
||||
|
||||
|
@ -115,7 +115,14 @@ MODULE_SUPPORTED_DEVICE("{{Avance Logic,ALS300},{Avance Logic,ALS300+}}");
|
||||
|
||||
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
|
||||
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
MODULE_PARM_DESC(index, "Index value for ALS300 sound card.");
|
||||
module_param_array(id, charp, NULL, 0444);
|
||||
MODULE_PARM_DESC(id, "ID string for ALS300 sound card.");
|
||||
module_param_array(enable, bool, NULL, 0444);
|
||||
MODULE_PARM_DESC(enable, "Enable ALS300 sound card.");
|
||||
|
||||
struct snd_als300 {
|
||||
unsigned long port;
|
||||
|
@ -90,7 +90,7 @@ MODULE_SUPPORTED_DEVICE("{{Avance Logic,ALS4000}}");
|
||||
|
||||
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; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */
|
||||
#ifdef SUPPORT_JOYSTICK
|
||||
static int joystick_port[SNDRV_CARDS];
|
||||
#endif
|
||||
|
@ -23,8 +23,11 @@
|
||||
*/
|
||||
|
||||
#include "hpi_internal.h"
|
||||
#include "hpi_version.h"
|
||||
#include "hpimsginit.h"
|
||||
#include "hpioctl.h"
|
||||
#include "hpicmn.h"
|
||||
|
||||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
@ -44,7 +47,8 @@
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("AudioScience inc. <support@audioscience.com>");
|
||||
MODULE_DESCRIPTION("AudioScience ALSA ASI5000 ASI6000 ASI87xx ASI89xx");
|
||||
MODULE_DESCRIPTION("AudioScience ALSA ASI5000 ASI6000 ASI87xx ASI89xx "
|
||||
HPI_VER_STRING);
|
||||
|
||||
#if defined CONFIG_SND_DEBUG_VERBOSE
|
||||
/**
|
||||
@ -63,8 +67,8 @@ 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;
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
static bool enable_hpi_hwdep = 1;
|
||||
|
||||
module_param_array(index, int, NULL, S_IRUGO);
|
||||
MODULE_PARM_DESC(index, "ALSA index value for AudioScience soundcard.");
|
||||
@ -119,12 +123,7 @@ struct clk_cache {
|
||||
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;
|
||||
struct hpi_adapter *hpi;
|
||||
|
||||
u32 h_mixer;
|
||||
struct clk_cache cc;
|
||||
@ -135,6 +134,8 @@ struct snd_card_asihpi {
|
||||
u16 update_interval_frames;
|
||||
u16 in_max_chans;
|
||||
u16 out_max_chans;
|
||||
u16 in_min_chans;
|
||||
u16 out_min_chans;
|
||||
};
|
||||
|
||||
/* Per stream data */
|
||||
@ -495,6 +496,7 @@ static int snd_card_asihpi_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
|
||||
snd_printdd("stream_host_buffer_attach status 0x%x\n",
|
||||
dpcm->hpi_buffer_attached);
|
||||
|
||||
}
|
||||
bytes_per_sec = params_rate(params) * params_channels(params);
|
||||
width = snd_pcm_format_width(params_format(params));
|
||||
@ -757,8 +759,7 @@ static void snd_card_asihpi_timer_function(unsigned long data)
|
||||
if (s->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
pcm_buf_dma_ofs = ds->pcm_buf_host_rw_ofs - bytes_avail;
|
||||
if (state == HPI_STATE_STOPPED) {
|
||||
if ((bytes_avail == 0) &&
|
||||
(on_card_bytes < ds->pcm_buf_host_rw_ofs)) {
|
||||
if (bytes_avail == 0) {
|
||||
hpi_handle_error(hpi_stream_start(ds->h_stream));
|
||||
snd_printdd("P%d start\n", s->number);
|
||||
ds->drained_count = 0;
|
||||
@ -767,7 +768,7 @@ static void snd_card_asihpi_timer_function(unsigned long data)
|
||||
snd_printd(KERN_WARNING "P%d drained\n",
|
||||
s->number);
|
||||
ds->drained_count++;
|
||||
if (ds->drained_count > 2) {
|
||||
if (ds->drained_count > 20) {
|
||||
snd_pcm_stop(s, SNDRV_PCM_STATE_XRUN);
|
||||
continue;
|
||||
}
|
||||
@ -888,8 +889,8 @@ static void snd_card_asihpi_timer_function(unsigned long data)
|
||||
pd, xfer2));
|
||||
}
|
||||
}
|
||||
ds->pcm_buf_host_rw_ofs = ds->pcm_buf_host_rw_ofs + xfercount;
|
||||
ds->pcm_buf_elapsed_dma_ofs = pcm_buf_dma_ofs;
|
||||
ds->pcm_buf_host_rw_ofs += xfercount;
|
||||
ds->pcm_buf_elapsed_dma_ofs += xfercount;
|
||||
snd_pcm_period_elapsed(s);
|
||||
}
|
||||
}
|
||||
@ -902,7 +903,9 @@ static void snd_card_asihpi_timer_function(unsigned long data)
|
||||
static int snd_card_asihpi_playback_ioctl(struct snd_pcm_substream *substream,
|
||||
unsigned int cmd, void *arg)
|
||||
{
|
||||
snd_printddd(KERN_INFO "P%d ioctl %d\n", substream->number, cmd);
|
||||
char name[16];
|
||||
snd_pcm_debug_name(substream, name, sizeof(name));
|
||||
snd_printddd(KERN_INFO "%s ioctl %d\n", name, cmd);
|
||||
return snd_pcm_lib_ioctl(substream, cmd, arg);
|
||||
}
|
||||
|
||||
@ -927,21 +930,23 @@ 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;
|
||||
char name[16];
|
||||
snd_pcm_debug_name(substream, name, sizeof(name));
|
||||
|
||||
ptr = bytes_to_frames(runtime, dpcm->pcm_buf_dma_ofs % dpcm->buffer_bytes);
|
||||
snd_printddd("P%d pointer = 0x%04lx\n", substream->number, (unsigned long)ptr);
|
||||
snd_printddd("%s pointer = 0x%04lx\n", name, (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)
|
||||
static u64 snd_card_asihpi_playback_formats(struct snd_card_asihpi *asihpi,
|
||||
u32 h_stream)
|
||||
{
|
||||
struct hpi_format hpi_format;
|
||||
u16 format;
|
||||
u16 err;
|
||||
u32 h_control;
|
||||
u32 sample_rate = 48000;
|
||||
u64 formats = 0;
|
||||
|
||||
/* on cards without SRC, must query at valid rate,
|
||||
* maybe set by external sync
|
||||
@ -956,41 +961,29 @@ static void snd_card_asihpi_playback_format(struct snd_card_asihpi *asihpi,
|
||||
|
||||
for (format = HPI_FORMAT_PCM8_UNSIGNED;
|
||||
format <= HPI_FORMAT_PCM24_SIGNED; format++) {
|
||||
err = hpi_format_create(&hpi_format,
|
||||
2, format, sample_rate, 128000, 0);
|
||||
err = hpi_format_create(&hpi_format, asihpi->out_max_chans,
|
||||
format, sample_rate, 128000, 0);
|
||||
if (!err)
|
||||
err = hpi_outstream_query_format(h_stream,
|
||||
&hpi_format);
|
||||
err = hpi_outstream_query_format(h_stream, &hpi_format);
|
||||
if (!err && (hpi_to_alsa_formats[format] != -1))
|
||||
pcmhw->formats |=
|
||||
(1ULL << hpi_to_alsa_formats[format]);
|
||||
formats |= (1ULL << hpi_to_alsa_formats[format]);
|
||||
}
|
||||
return formats;
|
||||
}
|
||||
|
||||
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);
|
||||
struct snd_pcm_hardware snd_card_asihpi_playback;
|
||||
int err;
|
||||
|
||||
dpcm = kzalloc(sizeof(*dpcm), GFP_KERNEL);
|
||||
if (dpcm == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
err =
|
||||
hpi_outstream_open(card->adapter_index,
|
||||
err = hpi_outstream_open(card->hpi->adapter->index,
|
||||
substream->number, &dpcm->h_stream);
|
||||
hpi_handle_error(err);
|
||||
if (err)
|
||||
@ -1012,12 +1005,19 @@ static int snd_card_asihpi_playback_open(struct snd_pcm_substream *substream)
|
||||
runtime->private_data = dpcm;
|
||||
runtime->private_free = snd_card_asihpi_runtime_free;
|
||||
|
||||
snd_card_asihpi_playback.channels_max = card->out_max_chans;
|
||||
memset(&snd_card_asihpi_playback, 0, sizeof(snd_card_asihpi_playback));
|
||||
snd_card_asihpi_playback.buffer_bytes_max = BUFFER_BYTES_MAX;
|
||||
snd_card_asihpi_playback.period_bytes_min = PERIOD_BYTES_MIN;
|
||||
/*?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_playback.period_bytes_max = BUFFER_BYTES_MAX / PERIODS_MIN;
|
||||
snd_card_asihpi_playback.periods_min = PERIODS_MIN;
|
||||
snd_card_asihpi_playback.periods_max = BUFFER_BYTES_MAX / PERIOD_BYTES_MIN;
|
||||
/* snd_card_asihpi_playback.fifo_size = 0; */
|
||||
snd_card_asihpi_playback.channels_max = card->out_max_chans;
|
||||
snd_card_asihpi_playback.channels_min = card->out_min_chans;
|
||||
snd_card_asihpi_playback.formats =
|
||||
snd_card_asihpi_playback_formats(card, dpcm->h_stream);
|
||||
|
||||
snd_card_asihpi_pcm_samplerates(card, &snd_card_asihpi_playback);
|
||||
|
||||
@ -1029,8 +1029,10 @@ static int snd_card_asihpi_playback_open(struct snd_pcm_substream *substream)
|
||||
SNDRV_PCM_INFO_MMAP |
|
||||
SNDRV_PCM_INFO_MMAP_VALID;
|
||||
|
||||
if (card->support_grouping)
|
||||
if (card->support_grouping) {
|
||||
snd_card_asihpi_playback.info |= SNDRV_PCM_INFO_SYNC_START;
|
||||
snd_pcm_set_sync(substream);
|
||||
}
|
||||
|
||||
/* struct is copied, so can create initializer dynamically */
|
||||
runtime->hw = snd_card_asihpi_playback;
|
||||
@ -1047,8 +1049,6 @@ static int snd_card_asihpi_playback_open(struct snd_pcm_substream *substream)
|
||||
snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
|
||||
card->update_interval_frames * 2, UINT_MAX);
|
||||
|
||||
snd_pcm_set_sync(substream);
|
||||
|
||||
snd_printdd("playback open\n");
|
||||
|
||||
return 0;
|
||||
@ -1114,15 +1114,15 @@ static int snd_card_asihpi_capture_prepare(struct snd_pcm_substream *substream)
|
||||
|
||||
|
||||
|
||||
static void snd_card_asihpi_capture_format(struct snd_card_asihpi *asihpi,
|
||||
u32 h_stream,
|
||||
struct snd_pcm_hardware *pcmhw)
|
||||
static u64 snd_card_asihpi_capture_formats(struct snd_card_asihpi *asihpi,
|
||||
u32 h_stream)
|
||||
{
|
||||
struct hpi_format hpi_format;
|
||||
u16 format;
|
||||
u16 err;
|
||||
u32 h_control;
|
||||
u32 sample_rate = 48000;
|
||||
u64 formats = 0;
|
||||
|
||||
/* on cards without SRC, must query at valid rate,
|
||||
maybe set by external sync */
|
||||
@ -1137,34 +1137,22 @@ static void snd_card_asihpi_capture_format(struct snd_card_asihpi *asihpi,
|
||||
for (format = HPI_FORMAT_PCM8_UNSIGNED;
|
||||
format <= HPI_FORMAT_PCM24_SIGNED; format++) {
|
||||
|
||||
err = hpi_format_create(&hpi_format, 2, format,
|
||||
sample_rate, 128000, 0);
|
||||
err = hpi_format_create(&hpi_format, asihpi->in_max_chans,
|
||||
format, sample_rate, 128000, 0);
|
||||
if (!err)
|
||||
err = hpi_instream_query_format(h_stream,
|
||||
&hpi_format);
|
||||
err = hpi_instream_query_format(h_stream, &hpi_format);
|
||||
if (!err)
|
||||
pcmhw->formats |=
|
||||
(1ULL << hpi_to_alsa_formats[format]);
|
||||
formats |= (1ULL << hpi_to_alsa_formats[format]);
|
||||
}
|
||||
return formats;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
struct snd_pcm_hardware snd_card_asihpi_capture;
|
||||
int err;
|
||||
|
||||
dpcm = kzalloc(sizeof(*dpcm), GFP_KERNEL);
|
||||
@ -1172,10 +1160,10 @@ static int snd_card_asihpi_capture_open(struct snd_pcm_substream *substream)
|
||||
return -ENOMEM;
|
||||
|
||||
snd_printdd("capture open adapter %d stream %d\n",
|
||||
card->adapter_index, substream->number);
|
||||
card->hpi->adapter->index, substream->number);
|
||||
|
||||
err = hpi_handle_error(
|
||||
hpi_instream_open(card->adapter_index,
|
||||
hpi_instream_open(card->hpi->adapter->index,
|
||||
substream->number, &dpcm->h_stream));
|
||||
if (err)
|
||||
kfree(dpcm);
|
||||
@ -1184,7 +1172,6 @@ static int snd_card_asihpi_capture_open(struct snd_pcm_substream *substream)
|
||||
if (err)
|
||||
return -EIO;
|
||||
|
||||
|
||||
init_timer(&dpcm->timer);
|
||||
dpcm->timer.data = (unsigned long) dpcm;
|
||||
dpcm->timer.function = snd_card_asihpi_timer_function;
|
||||
@ -1192,9 +1179,17 @@ static int snd_card_asihpi_capture_open(struct snd_pcm_substream *substream)
|
||||
runtime->private_data = dpcm;
|
||||
runtime->private_free = snd_card_asihpi_runtime_free;
|
||||
|
||||
memset(&snd_card_asihpi_capture, 0, sizeof(snd_card_asihpi_capture));
|
||||
snd_card_asihpi_capture.buffer_bytes_max = BUFFER_BYTES_MAX;
|
||||
snd_card_asihpi_capture.period_bytes_min = PERIOD_BYTES_MIN;
|
||||
snd_card_asihpi_capture.period_bytes_max = BUFFER_BYTES_MAX / PERIODS_MIN;
|
||||
snd_card_asihpi_capture.periods_min = PERIODS_MIN;
|
||||
snd_card_asihpi_capture.periods_max = BUFFER_BYTES_MAX / PERIOD_BYTES_MIN;
|
||||
/* snd_card_asihpi_capture.fifo_size = 0; */
|
||||
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_capture.channels_min = card->in_min_chans;
|
||||
snd_card_asihpi_capture.formats =
|
||||
snd_card_asihpi_capture_formats(card, dpcm->h_stream);
|
||||
snd_card_asihpi_pcm_samplerates(card, &snd_card_asihpi_capture);
|
||||
snd_card_asihpi_capture.info = SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_MMAP |
|
||||
@ -1240,15 +1235,20 @@ static struct snd_pcm_ops snd_card_asihpi_capture_mmap_ops = {
|
||||
.pointer = snd_card_asihpi_capture_pointer,
|
||||
};
|
||||
|
||||
static int __devinit snd_card_asihpi_pcm_new(struct snd_card_asihpi *asihpi,
|
||||
int device, int substreams)
|
||||
static int __devinit snd_card_asihpi_pcm_new(
|
||||
struct snd_card_asihpi *asihpi, int device)
|
||||
{
|
||||
struct snd_pcm *pcm;
|
||||
int err;
|
||||
u16 num_instreams, num_outstreams, x16;
|
||||
u32 x32;
|
||||
|
||||
err = hpi_adapter_get_info(asihpi->hpi->adapter->index,
|
||||
&num_outstreams, &num_instreams,
|
||||
&x16, &x32, &x16);
|
||||
|
||||
err = snd_pcm_new(asihpi->card, "Asihpi PCM", device,
|
||||
asihpi->num_outstreams, asihpi->num_instreams,
|
||||
&pcm);
|
||||
num_outstreams, num_instreams, &pcm);
|
||||
if (err < 0)
|
||||
return err;
|
||||
/* pointer to ops struct is stored, dont change ops afterwards! */
|
||||
@ -1314,7 +1314,7 @@ static const char * const asihpi_src_names[] = {
|
||||
"Analog",
|
||||
"Adapter",
|
||||
"RTP",
|
||||
"GPI",
|
||||
"Internal"
|
||||
};
|
||||
|
||||
compile_time_assert(
|
||||
@ -1332,7 +1332,6 @@ static const char * const asihpi_dst_names[] = {
|
||||
"Net",
|
||||
"Analog",
|
||||
"RTP",
|
||||
"GPO",
|
||||
};
|
||||
|
||||
compile_time_assert(
|
||||
@ -1410,6 +1409,7 @@ static int snd_asihpi_volume_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo)
|
||||
{
|
||||
u32 h_control = kcontrol->private_value;
|
||||
u32 count;
|
||||
u16 err;
|
||||
/* native gains are in millibels */
|
||||
short min_gain_mB;
|
||||
@ -1424,8 +1424,12 @@ static int snd_asihpi_volume_info(struct snd_kcontrol *kcontrol,
|
||||
step_gain_mB = VOL_STEP_mB;
|
||||
}
|
||||
|
||||
err = hpi_meter_query_channels(h_control, &count);
|
||||
if (err)
|
||||
count = HPI_MAX_CHANNELS;
|
||||
|
||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
|
||||
uinfo->count = 2;
|
||||
uinfo->count = count;
|
||||
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;
|
||||
@ -2033,8 +2037,15 @@ static int __devinit snd_asihpi_tuner_add(struct snd_card_asihpi *asihpi,
|
||||
static int snd_asihpi_meter_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo)
|
||||
{
|
||||
u32 h_control = kcontrol->private_value;
|
||||
u32 count;
|
||||
u16 err;
|
||||
err = hpi_meter_query_channels(h_control, &count);
|
||||
if (err)
|
||||
count = HPI_MAX_CHANNELS;
|
||||
|
||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
|
||||
uinfo->count = HPI_MAX_CHANNELS;
|
||||
uinfo->count = count;
|
||||
uinfo->value.integer.min = 0;
|
||||
uinfo->value.integer.max = 0x7FFFFFFF;
|
||||
return 0;
|
||||
@ -2248,6 +2259,9 @@ static int snd_asihpi_cmode_info(struct snd_kcontrol *kcontrol,
|
||||
valid_modes++;
|
||||
}
|
||||
|
||||
if (!valid_modes)
|
||||
return -EINVAL;
|
||||
|
||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
|
||||
uinfo->count = 1;
|
||||
uinfo->value.enumerated.items = valid_modes;
|
||||
@ -2547,7 +2561,7 @@ static int __devinit snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi)
|
||||
strcpy(card->mixername, "Asihpi Mixer");
|
||||
|
||||
err =
|
||||
hpi_mixer_open(asihpi->adapter_index,
|
||||
hpi_mixer_open(asihpi->hpi->adapter->index,
|
||||
&asihpi->h_mixer);
|
||||
hpi_handle_error(err);
|
||||
if (err)
|
||||
@ -2665,24 +2679,33 @@ 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;
|
||||
|
||||
u16 num_outstreams;
|
||||
u16 num_instreams;
|
||||
u16 version;
|
||||
u32 serial_number;
|
||||
u16 type;
|
||||
|
||||
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;
|
||||
hpi_handle_error(hpi_adapter_get_info(asihpi->hpi->adapter->index,
|
||||
&num_outstreams, &num_instreams,
|
||||
&version, &serial_number, &type));
|
||||
|
||||
snd_iprintf(buffer,
|
||||
"serial#=%d\n_hw version %c%d\nDSP code version %03d\n",
|
||||
asihpi->serial_number, ((version >> 3) & 0xf) + 'A',
|
||||
version & 0x7,
|
||||
"Adapter type ASI%4X\nHardware Index %d\n"
|
||||
"%d outstreams\n%d instreams\n",
|
||||
type, asihpi->hpi->adapter->index,
|
||||
num_outstreams, num_instreams);
|
||||
|
||||
snd_iprintf(buffer,
|
||||
"Serial#%d\nHardware version %c%d\nDSP code version %03d\n",
|
||||
serial_number, ((version >> 3) & 0xf) + 'A', version & 0x7,
|
||||
((version >> 13) * 100) + ((version >> 7) & 0x3f));
|
||||
|
||||
err = hpi_mixer_get_control(asihpi->h_mixer,
|
||||
@ -2690,18 +2713,15 @@ snd_asihpi_proc_read(struct snd_info_entry *entry,
|
||||
HPI_CONTROL_SAMPLECLOCK, &h_control);
|
||||
|
||||
if (!err) {
|
||||
err = hpi_sample_clock_get_sample_rate(
|
||||
h_control, &rate);
|
||||
err = hpi_sample_clock_get_sample_rate(h_control, &rate);
|
||||
err += hpi_sample_clock_get_source(h_control, &source);
|
||||
|
||||
if (!err)
|
||||
snd_iprintf(buffer, "sample_clock=%d_hz, source %s\n",
|
||||
snd_iprintf(buffer, "Sample Clock %dHz, source %s\n",
|
||||
rate, sampleclock_sources[source]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void __devinit snd_asihpi_proc_init(struct snd_card_asihpi *asihpi)
|
||||
{
|
||||
struct snd_info_entry *entry;
|
||||
@ -2773,35 +2793,34 @@ 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 hpi_adapter *hpi;
|
||||
struct snd_card *card;
|
||||
struct snd_card_asihpi *asihpi;
|
||||
|
||||
u32 h_control;
|
||||
u32 h_stream;
|
||||
u32 adapter_index;
|
||||
|
||||
static int dev;
|
||||
if (dev >= SNDRV_CARDS)
|
||||
return -ENODEV;
|
||||
|
||||
/* Should this be enable[hpi_card->index] ? */
|
||||
/* Should this be enable[hpi->index] ? */
|
||||
if (!enable[dev]) {
|
||||
dev++;
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
/* Initialise low-level HPI driver */
|
||||
err = asihpi_adapter_probe(pci_dev, pci_id);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
hpi_card = pci_get_drvdata(pci_dev);
|
||||
hpi = pci_get_drvdata(pci_dev);
|
||||
adapter_index = hpi->adapter->index;
|
||||
/* 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,
|
||||
err = snd_card_create(adapter_index,
|
||||
id[adapter_index], THIS_MODULE,
|
||||
sizeof(struct snd_card_asihpi),
|
||||
&card);
|
||||
if (err < 0) {
|
||||
@ -2815,50 +2834,32 @@ static int __devinit snd_asihpi_probe(struct pci_dev *pci_dev,
|
||||
return err;
|
||||
snd_printk(KERN_WARNING
|
||||
"**** WARNING **** Adapter index %d->ALSA index %d\n",
|
||||
hpi_card->index, card->number);
|
||||
adapter_index, card->number);
|
||||
}
|
||||
|
||||
snd_card_set_dev(card, &pci_dev->dev);
|
||||
|
||||
asihpi = (struct snd_card_asihpi *) card->private_data;
|
||||
asihpi = card->private_data;
|
||||
asihpi->card = card;
|
||||
asihpi->pci = pci_dev;
|
||||
asihpi->adapter_index = hpi_card->index;
|
||||
hpi_handle_error(hpi_adapter_get_info(
|
||||
asihpi->adapter_index,
|
||||
&asihpi->num_outstreams,
|
||||
&asihpi->num_instreams,
|
||||
&asihpi->version,
|
||||
&asihpi->serial_number, &asihpi->type));
|
||||
asihpi->hpi = hpi;
|
||||
|
||||
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));
|
||||
snd_printk(KERN_INFO "adapter ID=%4X index=%d\n",
|
||||
asihpi->hpi->adapter->type, adapter_index);
|
||||
|
||||
pcm_substreams = asihpi->num_outstreams;
|
||||
if (pcm_substreams < asihpi->num_instreams)
|
||||
pcm_substreams = asihpi->num_instreams;
|
||||
|
||||
err = hpi_adapter_get_property(asihpi->adapter_index,
|
||||
err = hpi_adapter_get_property(adapter_index,
|
||||
HPI_ADAPTER_PROPERTY_CAPS1,
|
||||
NULL, &asihpi->support_grouping);
|
||||
if (err)
|
||||
asihpi->support_grouping = 0;
|
||||
|
||||
err = hpi_adapter_get_property(asihpi->adapter_index,
|
||||
err = hpi_adapter_get_property(adapter_index,
|
||||
HPI_ADAPTER_PROPERTY_CAPS2,
|
||||
&asihpi->support_mrx, NULL);
|
||||
if (err)
|
||||
asihpi->support_mrx = 0;
|
||||
|
||||
err = hpi_adapter_get_property(asihpi->adapter_index,
|
||||
err = hpi_adapter_get_property(adapter_index,
|
||||
HPI_ADAPTER_PROPERTY_INTERVAL,
|
||||
NULL, &asihpi->update_interval_frames);
|
||||
if (err)
|
||||
@ -2867,7 +2868,7 @@ static int __devinit snd_asihpi_probe(struct pci_dev *pci_dev,
|
||||
if (!asihpi->can_dma)
|
||||
asihpi->update_interval_frames *= 2;
|
||||
|
||||
hpi_handle_error(hpi_instream_open(asihpi->adapter_index,
|
||||
hpi_handle_error(hpi_instream_open(adapter_index,
|
||||
0, &h_stream));
|
||||
|
||||
err = hpi_instream_host_buffer_free(h_stream);
|
||||
@ -2875,7 +2876,7 @@ static int __devinit snd_asihpi_probe(struct pci_dev *pci_dev,
|
||||
|
||||
hpi_handle_error(hpi_instream_close(h_stream));
|
||||
|
||||
err = hpi_adapter_get_property(asihpi->adapter_index,
|
||||
err = hpi_adapter_get_property(adapter_index,
|
||||
HPI_ADAPTER_PROPERTY_CURCHANNELS,
|
||||
&asihpi->in_max_chans, &asihpi->out_max_chans);
|
||||
if (err) {
|
||||
@ -2883,13 +2884,22 @@ static int __devinit snd_asihpi_probe(struct pci_dev *pci_dev,
|
||||
asihpi->out_max_chans = 2;
|
||||
}
|
||||
|
||||
snd_printk(KERN_INFO "has dma:%d, grouping:%d, mrx:%d\n",
|
||||
if (asihpi->out_max_chans > 2) { /* assume LL mode */
|
||||
asihpi->out_min_chans = asihpi->out_max_chans;
|
||||
asihpi->in_min_chans = asihpi->in_max_chans;
|
||||
asihpi->support_grouping = 0;
|
||||
} else {
|
||||
asihpi->out_min_chans = 1;
|
||||
asihpi->in_min_chans = 1;
|
||||
}
|
||||
|
||||
snd_printk(KERN_INFO "Has dma:%d, grouping:%d, mrx:%d\n",
|
||||
asihpi->can_dma,
|
||||
asihpi->support_grouping,
|
||||
asihpi->support_mrx
|
||||
);
|
||||
|
||||
err = snd_card_asihpi_pcm_new(asihpi, 0, pcm_substreams);
|
||||
err = snd_card_asihpi_pcm_new(asihpi, 0);
|
||||
if (err < 0) {
|
||||
snd_printk(KERN_ERR "pcm_new failed\n");
|
||||
goto __nodev;
|
||||
@ -2916,13 +2926,14 @@ static int __devinit snd_asihpi_probe(struct pci_dev *pci_dev,
|
||||
|
||||
strcpy(card->driver, "ASIHPI");
|
||||
|
||||
sprintf(card->shortname, "AudioScience ASI%4X", asihpi->type);
|
||||
sprintf(card->shortname, "AudioScience ASI%4X",
|
||||
asihpi->hpi->adapter->type);
|
||||
sprintf(card->longname, "%s %i",
|
||||
card->shortname, asihpi->adapter_index);
|
||||
card->shortname, adapter_index);
|
||||
err = snd_card_register(card);
|
||||
|
||||
if (!err) {
|
||||
hpi_card->snd_card_asihpi = card;
|
||||
hpi->snd_card = card;
|
||||
dev++;
|
||||
return 0;
|
||||
}
|
||||
@ -2935,10 +2946,9 @@ static int __devinit snd_asihpi_probe(struct pci_dev *pci_dev,
|
||||
|
||||
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;
|
||||
struct hpi_adapter *hpi = pci_get_drvdata(pci_dev);
|
||||
snd_card_free(hpi->snd_card);
|
||||
hpi->snd_card = NULL;
|
||||
asihpi_adapter_remove(pci_dev);
|
||||
}
|
||||
|
||||
|
@ -30,26 +30,8 @@
|
||||
|
||||
#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))
|
||||
|
||||
#define HPI_VER HPI_VERSION_CONSTRUCTOR(4L, 8, 0)
|
||||
#define HPI_VER_STRING "4.08.00"
|
||||
|
||||
/* Library version as documented in hpi-api-versions.txt */
|
||||
#define HPI_LIB_VER HPI_VERSION_CONSTRUCTOR(10, 0, 0)
|
||||
|
||||
#include <linux/types.h>
|
||||
#define HPI_BUILD_EXCLUDE_DEPRECATED
|
||||
#define HPI_BUILD_KERNEL_MODE
|
||||
|
||||
/******************************************************************************/
|
||||
@ -213,7 +195,7 @@ enum HPI_SOURCENODES {
|
||||
/** RTP stream input node - This node is a destination for
|
||||
packets of RTP audio samples from other devices. */
|
||||
HPI_SOURCENODE_RTP_DESTINATION = 112,
|
||||
HPI_SOURCENODE_GP_IN = 113, /**< general purpose input. */
|
||||
HPI_SOURCENODE_INTERNAL = 113, /**< node internal to the device. */
|
||||
/* !!!Update this AND hpidebug.h if you add a new sourcenode type!!! */
|
||||
HPI_SOURCENODE_LAST_INDEX = 113 /**< largest ID */
|
||||
/* AX6 max sourcenode types = 15 */
|
||||
@ -242,9 +224,8 @@ enum HPI_DESTNODES {
|
||||
/** RTP stream output node - This node is a source for
|
||||
packets of RTP audio samples that are sent to other devices. */
|
||||
HPI_DESTNODE_RTP_SOURCE = 208,
|
||||
HPI_DESTNODE_GP_OUT = 209, /**< general purpose output node. */
|
||||
/* !!!Update this AND hpidebug.h if you add a new destnode type!!! */
|
||||
HPI_DESTNODE_LAST_INDEX = 209 /**< largest ID */
|
||||
HPI_DESTNODE_LAST_INDEX = 208 /**< largest ID */
|
||||
/* AX6 max destnode types = 15 */
|
||||
};
|
||||
|
||||
@ -450,7 +431,19 @@ Indicates that the adapter in it's current mode supports interrupts
|
||||
across the host bus. Note, this does not imply that interrupts are
|
||||
enabled. Instead it indicates that they can be enabled.
|
||||
*/
|
||||
HPI_ADAPTER_PROPERTY_SUPPORTS_IRQ = 272
|
||||
HPI_ADAPTER_PROPERTY_SUPPORTS_IRQ = 272,
|
||||
/** Readonly supports firmware updating.
|
||||
Indicates that the adapter implements an interface to update firmware
|
||||
on the adapter.
|
||||
*/
|
||||
HPI_ADAPTER_PROPERTY_SUPPORTS_FW_UPDATE = 273,
|
||||
/** Readonly Firmware IDs
|
||||
Identifiy firmware independent of individual adapter type.
|
||||
May be used as a filter for firmware update images.
|
||||
Property 1 = Bootloader ID
|
||||
Property 2 = Main program ID
|
||||
*/
|
||||
HPI_ADAPTER_PROPERTY_FIRMWARE_ID = 274
|
||||
};
|
||||
|
||||
/** Adapter mode commands
|
||||
@ -638,7 +631,7 @@ enum HPI_MIXER_STORE_COMMAND {
|
||||
HPI_MIXER_STORE_ENABLE = 4,
|
||||
/** Disable auto storage of some control settings. */
|
||||
HPI_MIXER_STORE_DISABLE = 5,
|
||||
/** Save the attributes of a single control. */
|
||||
/** Unimplemented - save the attributes of a single control. */
|
||||
HPI_MIXER_STORE_SAVE_SINGLE = 6
|
||||
};
|
||||
|
||||
@ -941,7 +934,7 @@ enum HPI_ERROR_CODES {
|
||||
HPI_ERROR_BAD_ADAPTER_NUMBER = 202,
|
||||
/** 2 adapters with the same adapter number. */
|
||||
HPI_ERROR_DUPLICATE_ADAPTER_NUMBER = 203,
|
||||
/** DSP code failed to bootload. (unused?) */
|
||||
/** DSP code failed to bootload. Usually a DSP memory test failure. */
|
||||
HPI_ERROR_DSP_BOOTLOAD = 204,
|
||||
/** Couldn't find or open the DSP code file. */
|
||||
HPI_ERROR_DSP_FILE_NOT_FOUND = 206,
|
||||
@ -978,6 +971,9 @@ enum HPI_ERROR_CODES {
|
||||
HPI_ERROR_FLASH_VERIFY = 225,
|
||||
HPI_ERROR_FLASH_TYPE = 226,
|
||||
HPI_ERROR_FLASH_START = 227,
|
||||
HPI_ERROR_FLASH_READ = 228,
|
||||
HPI_ERROR_FLASH_READ_NO_FILE = 229,
|
||||
HPI_ERROR_FLASH_SIZE = 230,
|
||||
|
||||
/** Reserved for OEMs. */
|
||||
HPI_ERROR_RESERVED_1 = 290,
|
||||
@ -1020,6 +1016,8 @@ enum HPI_ERROR_CODES {
|
||||
HPI_ERROR_NO_INTERDSP_GROUPS = 315,
|
||||
/** Stream wait cancelled before threshold reached. */
|
||||
HPI_ERROR_WAIT_CANCELLED = 316,
|
||||
/** A character string is invalid. */
|
||||
HPI_ERROR_INVALID_STRING = 317,
|
||||
|
||||
/** Invalid mixer node for this adapter. */
|
||||
HPI_ERROR_INVALID_NODE = 400,
|
||||
@ -1046,11 +1044,15 @@ enum HPI_ERROR_CODES {
|
||||
/** I2C */
|
||||
HPI_ERROR_I2C_BAD_ADR = 460,
|
||||
|
||||
/** Entity errors */
|
||||
/** Entity type did not match requested type */
|
||||
HPI_ERROR_ENTITY_TYPE_MISMATCH = 470,
|
||||
/** Entity item count did not match requested count */
|
||||
HPI_ERROR_ENTITY_ITEM_COUNT = 471,
|
||||
/** Entity type is not one of the valid types */
|
||||
HPI_ERROR_ENTITY_TYPE_INVALID = 472,
|
||||
/** Entity role is not one of the valid roles */
|
||||
HPI_ERROR_ENTITY_ROLE_INVALID = 473,
|
||||
/** Entity size doesn't match target size */
|
||||
HPI_ERROR_ENTITY_SIZE_MISMATCH = 474,
|
||||
|
||||
/* AES18 specific errors were 500..507 */
|
||||
@ -1078,8 +1080,7 @@ enum HPI_ERROR_CODES {
|
||||
/** \defgroup maximums HPI maximum values
|
||||
\{
|
||||
*/
|
||||
/** Maximum number of adapters per HPI sub-system
|
||||
WARNING: modifying this value changes the response structure size.*/
|
||||
/** Maximum number of PCI HPI adapters */
|
||||
#define HPI_MAX_ADAPTERS 20
|
||||
/** Maximum number of in or out streams per adapter */
|
||||
#define HPI_MAX_STREAMS 16
|
||||
@ -1090,6 +1091,9 @@ enum HPI_ERROR_CODES {
|
||||
#define HPI_MAX_ANC_BYTES_PER_FRAME (64)
|
||||
#define HPI_STRING_LEN 16
|
||||
|
||||
/** Networked adapters have index >= 100 */
|
||||
#define HPI_MIN_NETWORK_ADAPTER_IDX 100
|
||||
|
||||
/** Velocity units */
|
||||
#define HPI_OSTREAM_VELOCITY_UNITS 4096
|
||||
/** OutStream timescale units */
|
||||
@ -1111,14 +1115,14 @@ enum HPI_ERROR_CODES {
|
||||
struct hpi_format {
|
||||
u32 sample_rate;
|
||||
/**< 11025, 32000, 44100 ... */
|
||||
u32 bit_rate; /**< for MPEG */
|
||||
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. */
|
||||
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 {
|
||||
@ -1144,9 +1148,6 @@ struct hpi_async_event {
|
||||
} u;
|
||||
};
|
||||
|
||||
/* skip host side function declarations for
|
||||
DSP compile and documentation extraction */
|
||||
|
||||
#ifndef DISABLE_PRAGMA_PACK1
|
||||
#pragma pack(pop)
|
||||
#endif
|
||||
@ -1357,7 +1358,7 @@ u16 hpi_volume_get_mute(u32 h_control, u32 *mute);
|
||||
u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB,
|
||||
short *max_gain_01dB, short *step_gain_01dB);
|
||||
|
||||
u16 hpi_volume_query_channels(const u32 h_volume, u32 *p_channels);
|
||||
u16 hpi_volume_query_channels(const u32 h_control, u32 *p_channels);
|
||||
|
||||
u16 hpi_volume_auto_fade(u32 h_control,
|
||||
short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms);
|
||||
@ -1366,6 +1367,9 @@ u16 hpi_volume_auto_fade_profile(u32 h_control,
|
||||
short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms,
|
||||
u16 profile);
|
||||
|
||||
u16 hpi_volume_query_auto_fade_profile(const u32 h_control, const u32 i,
|
||||
u16 *profile);
|
||||
|
||||
/*****************/
|
||||
/* Level control */
|
||||
/*****************/
|
||||
|
@ -1,7 +1,7 @@
|
||||
/******************************************************************************
|
||||
|
||||
AudioScience HPI driver
|
||||
Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
|
||||
Copyright (C) 1997-2011 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
|
||||
@ -231,6 +231,8 @@ static void subsys_message(struct hpi_message *phm, struct hpi_response *phr)
|
||||
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) {
|
||||
@ -248,17 +250,14 @@ static void control_message(struct hpi_adapter_obj *pao,
|
||||
break;
|
||||
}
|
||||
|
||||
if (hpi_check_control_cache(((struct hpi_hw_obj *)
|
||||
pao->priv)->p_cache, phm,
|
||||
phr))
|
||||
if (hpi_check_control_cache(phw->p_cache, phm, phr))
|
||||
break;
|
||||
}
|
||||
hw_message(pao, phm, phr);
|
||||
break;
|
||||
case HPI_CONTROL_SET_STATE:
|
||||
hw_message(pao, phm, phr);
|
||||
hpi_cmn_control_cache_sync_to_msg(((struct hpi_hw_obj *)pao->
|
||||
priv)->p_cache, phm, phr);
|
||||
hpi_cmn_control_cache_sync_to_msg(phw->p_cache, phm, phr);
|
||||
break;
|
||||
|
||||
case HPI_CONTROL_GET_INFO:
|
||||
@ -451,11 +450,11 @@ static void subsys_create_adapter(struct hpi_message *phm,
|
||||
}
|
||||
|
||||
for (dsp_index = 0; dsp_index < MAX_DSPS; dsp_index++) {
|
||||
struct hpi_hw_obj *phw = (struct hpi_hw_obj *)pao->priv;
|
||||
struct hpi_hw_obj *phw = pao->priv;
|
||||
phw->ado[dsp_index].pa_parent_adapter = pao;
|
||||
}
|
||||
|
||||
phr->u.s.adapter_type = ao.adapter_type;
|
||||
phr->u.s.adapter_type = ao.type;
|
||||
phr->u.s.adapter_index = ao.index;
|
||||
phr->error = 0;
|
||||
}
|
||||
@ -476,7 +475,7 @@ static short create_adapter_obj(struct hpi_adapter_obj *pao,
|
||||
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;
|
||||
struct hpi_hw_obj *phw = pao->priv;
|
||||
|
||||
/* The PCI2040 has the following address map */
|
||||
/* BAR0 - 4K = HPI control and status registers on PCI2040 (HPI CSR) */
|
||||
@ -559,7 +558,7 @@ static short create_adapter_obj(struct hpi_adapter_obj *pao,
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
pao->adapter_type = hr0.u.ax.info.adapter_type;
|
||||
pao->type = hr0.u.ax.info.adapter_type;
|
||||
pao->index = hr0.u.ax.info.adapter_index;
|
||||
}
|
||||
|
||||
@ -584,9 +583,8 @@ static short create_adapter_obj(struct hpi_adapter_obj *pao,
|
||||
pao->has_control_cache = 1;
|
||||
}
|
||||
|
||||
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 */
|
||||
HPI_DEBUG_LOG(DEBUG, "get adapter info ASI%04X index %d\n", pao->type,
|
||||
pao->index);
|
||||
|
||||
if (phw->p_cache)
|
||||
phw->p_cache->adap_idx = pao->index;
|
||||
@ -596,7 +594,7 @@ static short create_adapter_obj(struct hpi_adapter_obj *pao,
|
||||
|
||||
static void delete_adapter_obj(struct hpi_adapter_obj *pao)
|
||||
{
|
||||
struct hpi_hw_obj *phw = (struct hpi_hw_obj *)pao->priv;
|
||||
struct hpi_hw_obj *phw = pao->priv;
|
||||
|
||||
if (pao->has_control_cache)
|
||||
hpi_free_control_cache(phw->p_cache);
|
||||
@ -639,7 +637,7 @@ static void adapter_get_asserts(struct hpi_adapter_obj *pao,
|
||||
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;
|
||||
struct hpi_hw_obj *phw = pao->priv;
|
||||
short error;
|
||||
u32 timeout;
|
||||
u32 read = 0;
|
||||
@ -1220,8 +1218,8 @@ static void hpi_read_block(struct dsp_obj *pdo, u32 address, u32 *pdata,
|
||||
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];
|
||||
struct hpi_hw_obj *phw = pao->priv;
|
||||
struct dsp_obj *pdo = &phw->ado[dsp_index];
|
||||
u32 time_out = PCI_TIMEOUT;
|
||||
int c6711_burst_size = 128;
|
||||
u32 local_hpi_address = hpi_address;
|
||||
@ -1258,8 +1256,8 @@ static u16 hpi6000_dsp_block_write32(struct hpi_adapter_obj *pao,
|
||||
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];
|
||||
struct hpi_hw_obj *phw = pao->priv;
|
||||
struct dsp_obj *pdo = &phw->ado[dsp_index];
|
||||
u32 time_out = PCI_TIMEOUT;
|
||||
int c6711_burst_size = 16;
|
||||
u32 local_hpi_address = hpi_address;
|
||||
@ -1298,7 +1296,7 @@ static u16 hpi6000_dsp_block_read32(struct hpi_adapter_obj *pao,
|
||||
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 hpi_hw_obj *phw = pao->priv;
|
||||
struct dsp_obj *pdo = &phw->ado[dsp_index];
|
||||
u32 timeout;
|
||||
u16 ack;
|
||||
@ -1414,8 +1412,8 @@ static short hpi6000_send_data_check_adr(u32 address, u32 length_in_dwords)
|
||||
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];
|
||||
struct hpi_hw_obj *phw = pao->priv;
|
||||
struct dsp_obj *pdo = &phw->ado[dsp_index];
|
||||
u32 data_sent = 0;
|
||||
u16 ack;
|
||||
u32 length, address;
|
||||
@ -1487,8 +1485,8 @@ static short hpi6000_send_data(struct hpi_adapter_obj *pao, u16 dsp_index,
|
||||
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];
|
||||
struct hpi_hw_obj *phw = pao->priv;
|
||||
struct dsp_obj *pdo = &phw->ado[dsp_index];
|
||||
u32 data_got = 0;
|
||||
u16 ack;
|
||||
u32 length, address;
|
||||
@ -1551,8 +1549,8 @@ static void hpi6000_send_dsp_interrupt(struct dsp_obj *pdo)
|
||||
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];
|
||||
struct hpi_hw_obj *phw = pao->priv;
|
||||
struct dsp_obj *pdo = &phw->ado[dsp_index];
|
||||
u32 timeout = TIMEOUT;
|
||||
|
||||
/* set command */
|
||||
@ -1577,7 +1575,7 @@ static short hpi6000_check_PCI2040_error_flag(struct hpi_adapter_obj *pao,
|
||||
{
|
||||
u32 hPI_error;
|
||||
|
||||
struct hpi_hw_obj *phw = (struct hpi_hw_obj *)pao->priv;
|
||||
struct hpi_hw_obj *phw = pao->priv;
|
||||
|
||||
/* read the error bits from the PCI2040 */
|
||||
hPI_error = ioread32(phw->dw2040_HPICSR + HPI_ERROR_REPORT);
|
||||
@ -1597,8 +1595,8 @@ static short hpi6000_check_PCI2040_error_flag(struct hpi_adapter_obj *pao,
|
||||
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];
|
||||
struct hpi_hw_obj *phw = pao->priv;
|
||||
struct dsp_obj *pdo = &phw->ado[dsp_index];
|
||||
u32 ack = 0L;
|
||||
u32 timeout;
|
||||
u32 hPIC = 0L;
|
||||
@ -1640,7 +1638,7 @@ 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 hpi_hw_obj *phw = pao->priv;
|
||||
struct dsp_obj *pdo = &phw->ado[dsp_index];
|
||||
u32 timeout;
|
||||
u32 cache_dirty_flag;
|
||||
@ -1740,7 +1738,8 @@ static void hw_message(struct hpi_adapter_obj *pao, struct hpi_message *phm,
|
||||
{
|
||||
u16 error = 0;
|
||||
u16 dsp_index = 0;
|
||||
u16 num_dsp = ((struct hpi_hw_obj *)pao->priv)->num_dsp;
|
||||
struct hpi_hw_obj *phw = pao->priv;
|
||||
u16 num_dsp = phw->num_dsp;
|
||||
|
||||
if (num_dsp < 2)
|
||||
dsp_index = 0;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
AudioScience HPI driver
|
||||
Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
|
||||
Copyright (C) 1997-2011 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
|
||||
|
@ -1,7 +1,7 @@
|
||||
/******************************************************************************
|
||||
|
||||
AudioScience HPI driver
|
||||
Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
|
||||
Copyright (C) 1997-2011 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
|
||||
@ -45,18 +45,21 @@
|
||||
#define HPI6205_ERROR_MSG_RESP_TIMEOUT 1016
|
||||
|
||||
/* initialization/bootload errors */
|
||||
#define HPI6205_ERROR_6205_NO_IRQ 1002
|
||||
#define HPI6205_ERROR_6205_INIT_FAILED 1003
|
||||
#define HPI6205_ERROR_6205_REG 1006
|
||||
#define HPI6205_ERROR_6205_DSPPAGE 1007
|
||||
#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_6205_EEPROM 1017
|
||||
#define HPI6205_ERROR_DSP_EMIF 1018
|
||||
#define HPI6205_ERROR_6205_NO_IRQ 1002
|
||||
#define HPI6205_ERROR_6205_INIT_FAILED 1003
|
||||
#define HPI6205_ERROR_6205_REG 1006
|
||||
#define HPI6205_ERROR_6205_DSPPAGE 1007
|
||||
#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_6205_EEPROM 1017
|
||||
#define HPI6205_ERROR_DSP_EMIF1 1018
|
||||
#define HPI6205_ERROR_DSP_EMIF2 1019
|
||||
#define HPI6205_ERROR_DSP_EMIF3 1020
|
||||
#define HPI6205_ERROR_DSP_EMIF4 1021
|
||||
|
||||
/*****************************************************************************/
|
||||
/* for C6205 PCI i/f */
|
||||
@ -488,7 +491,7 @@ static void subsys_create_adapter(struct hpi_message *phm,
|
||||
return;
|
||||
}
|
||||
|
||||
phr->u.s.adapter_type = ao.adapter_type;
|
||||
phr->u.s.adapter_type = ao.type;
|
||||
phr->u.s.adapter_index = ao.index;
|
||||
phr->error = 0;
|
||||
}
|
||||
@ -503,7 +506,7 @@ static void adapter_delete(struct hpi_adapter_obj *pao,
|
||||
phr->error = HPI_ERROR_INVALID_OBJ_INDEX;
|
||||
return;
|
||||
}
|
||||
phw = (struct hpi_hw_obj *)pao->priv;
|
||||
phw = pao->priv;
|
||||
/* reset adapter h/w */
|
||||
/* Reset C6713 #1 */
|
||||
boot_loader_write_mem32(pao, 0, C6205_BAR0_TIMER1_CTL, 0);
|
||||
@ -652,7 +655,7 @@ static u16 create_adapter_obj(struct hpi_adapter_obj *pao,
|
||||
if (hr.error)
|
||||
return hr.error;
|
||||
|
||||
pao->adapter_type = hr.u.ax.info.adapter_type;
|
||||
pao->type = hr.u.ax.info.adapter_type;
|
||||
pao->index = hr.u.ax.info.adapter_index;
|
||||
|
||||
max_streams =
|
||||
@ -665,8 +668,6 @@ static u16 create_adapter_obj(struct hpi_adapter_obj *pao,
|
||||
hr.u.ax.info.serial_number);
|
||||
}
|
||||
|
||||
pao->open = 0; /* upon creation the adapter is closed */
|
||||
|
||||
if (phw->p_cache)
|
||||
phw->p_cache->adap_idx = pao->index;
|
||||
|
||||
@ -803,8 +804,8 @@ static void outstream_host_buffer_allocate(struct hpi_adapter_obj *pao,
|
||||
obj_index];
|
||||
status->samples_processed = 0;
|
||||
status->stream_state = HPI_STATE_STOPPED;
|
||||
status->dSP_index = 0;
|
||||
status->host_index = status->dSP_index;
|
||||
status->dsp_index = 0;
|
||||
status->host_index = status->dsp_index;
|
||||
status->size_in_bytes = phm->u.d.u.buffer.buffer_size;
|
||||
status->auxiliary_data_available = 0;
|
||||
|
||||
@ -878,7 +879,7 @@ static void outstream_host_buffer_free(struct hpi_adapter_obj *pao,
|
||||
static u32 outstream_get_space_available(struct hpi_hostbuffer_status *status)
|
||||
{
|
||||
return status->size_in_bytes - (status->host_index -
|
||||
status->dSP_index);
|
||||
status->dsp_index);
|
||||
}
|
||||
|
||||
static void outstream_write(struct hpi_adapter_obj *pao,
|
||||
@ -1080,8 +1081,8 @@ static void instream_host_buffer_allocate(struct hpi_adapter_obj *pao,
|
||||
obj_index];
|
||||
status->samples_processed = 0;
|
||||
status->stream_state = HPI_STATE_STOPPED;
|
||||
status->dSP_index = 0;
|
||||
status->host_index = status->dSP_index;
|
||||
status->dsp_index = 0;
|
||||
status->host_index = status->dsp_index;
|
||||
status->size_in_bytes = phm->u.d.u.buffer.buffer_size;
|
||||
status->auxiliary_data_available = 0;
|
||||
|
||||
@ -1162,7 +1163,7 @@ static void instream_start(struct hpi_adapter_obj *pao,
|
||||
|
||||
static u32 instream_get_bytes_available(struct hpi_hostbuffer_status *status)
|
||||
{
|
||||
return status->dSP_index - status->host_index;
|
||||
return status->dsp_index - status->host_index;
|
||||
}
|
||||
|
||||
static void instream_read(struct hpi_adapter_obj *pao,
|
||||
@ -1614,7 +1615,7 @@ static u16 boot_loader_config_emif(struct hpi_adapter_obj *pao, int dsp_index)
|
||||
boot_loader_write_mem32(pao, dsp_index, 0x01800008, setting);
|
||||
if (setting != boot_loader_read_mem32(pao, dsp_index,
|
||||
0x01800008))
|
||||
return HPI6205_ERROR_DSP_EMIF;
|
||||
return HPI6205_ERROR_DSP_EMIF1;
|
||||
|
||||
/* EMIF CE1 setup - 32 bit async. This is 6713 #1 HPI, */
|
||||
/* which occupies D15..0. 6713 starts at 27MHz, so need */
|
||||
@ -1627,7 +1628,7 @@ static u16 boot_loader_config_emif(struct hpi_adapter_obj *pao, int dsp_index)
|
||||
boot_loader_write_mem32(pao, dsp_index, 0x01800004, setting);
|
||||
if (setting != boot_loader_read_mem32(pao, dsp_index,
|
||||
0x01800004))
|
||||
return HPI6205_ERROR_DSP_EMIF;
|
||||
return HPI6205_ERROR_DSP_EMIF2;
|
||||
|
||||
/* EMIF CE2 setup - 32 bit async. This is 6713 #2 HPI, */
|
||||
/* which occupies D15..0. 6713 starts at 27MHz, so need */
|
||||
@ -1639,7 +1640,7 @@ static u16 boot_loader_config_emif(struct hpi_adapter_obj *pao, int dsp_index)
|
||||
boot_loader_write_mem32(pao, dsp_index, 0x01800010, setting);
|
||||
if (setting != boot_loader_read_mem32(pao, dsp_index,
|
||||
0x01800010))
|
||||
return HPI6205_ERROR_DSP_EMIF;
|
||||
return HPI6205_ERROR_DSP_EMIF3;
|
||||
|
||||
/* EMIF CE3 setup - 32 bit async. */
|
||||
/* This is the PLD on the ASI5000 cards only */
|
||||
@ -1650,7 +1651,7 @@ static u16 boot_loader_config_emif(struct hpi_adapter_obj *pao, int dsp_index)
|
||||
boot_loader_write_mem32(pao, dsp_index, 0x01800014, setting);
|
||||
if (setting != boot_loader_read_mem32(pao, dsp_index,
|
||||
0x01800014))
|
||||
return HPI6205_ERROR_DSP_EMIF;
|
||||
return HPI6205_ERROR_DSP_EMIF4;
|
||||
|
||||
/* set EMIF SDRAM control for 2Mx32 SDRAM (512x32x4 bank) */
|
||||
/* need to use this else DSP code crashes? */
|
||||
|
@ -25,6 +25,7 @@ HPI internal definitions
|
||||
#define _HPI_INTERNAL_H_
|
||||
|
||||
#include "hpi.h"
|
||||
|
||||
/** maximum number of memory regions mapped to an adapter */
|
||||
#define HPI_MAX_ADAPTER_MEM_SPACES (2)
|
||||
|
||||
@ -220,8 +221,6 @@ enum HPI_CONTROL_ATTRIBUTES {
|
||||
|
||||
HPI_COBRANET_SET = HPI_CTL_ATTR(COBRANET, 1),
|
||||
HPI_COBRANET_GET = HPI_CTL_ATTR(COBRANET, 2),
|
||||
/*HPI_COBRANET_SET_DATA = HPI_CTL_ATTR(COBRANET, 3), */
|
||||
/*HPI_COBRANET_GET_DATA = HPI_CTL_ATTR(COBRANET, 4), */
|
||||
HPI_COBRANET_GET_STATUS = HPI_CTL_ATTR(COBRANET, 5),
|
||||
HPI_COBRANET_SEND_PACKET = HPI_CTL_ATTR(COBRANET, 6),
|
||||
HPI_COBRANET_GET_PACKET = HPI_CTL_ATTR(COBRANET, 7),
|
||||
@ -241,7 +240,9 @@ enum HPI_CONTROL_ATTRIBUTES {
|
||||
HPI_PAD_PROGRAM_TYPE = HPI_CTL_ATTR(PAD, 5),
|
||||
HPI_PAD_PROGRAM_ID = HPI_CTL_ATTR(PAD, 6),
|
||||
HPI_PAD_TA_SUPPORT = HPI_CTL_ATTR(PAD, 7),
|
||||
HPI_PAD_TA_ACTIVE = HPI_CTL_ATTR(PAD, 8)
|
||||
HPI_PAD_TA_ACTIVE = HPI_CTL_ATTR(PAD, 8),
|
||||
|
||||
HPI_UNIVERSAL_ENTITY = HPI_CTL_ATTR(UNIVERSAL, 1)
|
||||
};
|
||||
|
||||
#define HPI_POLARITY_POSITIVE 0
|
||||
@ -393,14 +394,10 @@ enum HPI_FUNCTION_IDS {
|
||||
HPI_SUBSYS_OPEN = HPI_FUNC_ID(SUBSYSTEM, 1),
|
||||
HPI_SUBSYS_GET_VERSION = HPI_FUNC_ID(SUBSYSTEM, 2),
|
||||
HPI_SUBSYS_GET_INFO = HPI_FUNC_ID(SUBSYSTEM, 3),
|
||||
/* HPI_SUBSYS_FIND_ADAPTERS = HPI_FUNC_ID(SUBSYSTEM, 4), */
|
||||
HPI_SUBSYS_CREATE_ADAPTER = HPI_FUNC_ID(SUBSYSTEM, 5),
|
||||
HPI_SUBSYS_CLOSE = HPI_FUNC_ID(SUBSYSTEM, 6),
|
||||
/* HPI_SUBSYS_DELETE_ADAPTER = HPI_FUNC_ID(SUBSYSTEM, 7), */
|
||||
HPI_SUBSYS_DRIVER_LOAD = HPI_FUNC_ID(SUBSYSTEM, 8),
|
||||
HPI_SUBSYS_DRIVER_UNLOAD = HPI_FUNC_ID(SUBSYSTEM, 9),
|
||||
/* HPI_SUBSYS_READ_PORT_8 = HPI_FUNC_ID(SUBSYSTEM, 10), */
|
||||
/* HPI_SUBSYS_WRITE_PORT_8 = HPI_FUNC_ID(SUBSYSTEM, 11), */
|
||||
HPI_SUBSYS_GET_NUM_ADAPTERS = HPI_FUNC_ID(SUBSYSTEM, 12),
|
||||
HPI_SUBSYS_GET_ADAPTER = HPI_FUNC_ID(SUBSYSTEM, 13),
|
||||
HPI_SUBSYS_SET_NETWORK_INTERFACE = HPI_FUNC_ID(SUBSYSTEM, 14),
|
||||
@ -430,7 +427,10 @@ enum HPI_FUNCTION_IDS {
|
||||
HPI_ADAPTER_IRQ_QUERY_AND_CLEAR = HPI_FUNC_ID(ADAPTER, 19),
|
||||
HPI_ADAPTER_IRQ_CALLBACK = HPI_FUNC_ID(ADAPTER, 20),
|
||||
HPI_ADAPTER_DELETE = HPI_FUNC_ID(ADAPTER, 21),
|
||||
#define HPI_ADAPTER_FUNCTION_COUNT 21
|
||||
HPI_ADAPTER_READ_FLASH = HPI_FUNC_ID(ADAPTER, 22),
|
||||
HPI_ADAPTER_END_FLASH = HPI_FUNC_ID(ADAPTER, 23),
|
||||
HPI_ADAPTER_FILESTORE_DELETE_ALL = HPI_FUNC_ID(ADAPTER, 24),
|
||||
#define HPI_ADAPTER_FUNCTION_COUNT 24
|
||||
|
||||
HPI_OSTREAM_OPEN = HPI_FUNC_ID(OSTREAM, 1),
|
||||
HPI_OSTREAM_CLOSE = HPI_FUNC_ID(OSTREAM, 2),
|
||||
@ -495,7 +495,9 @@ enum HPI_FUNCTION_IDS {
|
||||
HPI_MIXER_GET_CONTROL_MULTIPLE_VALUES = HPI_FUNC_ID(MIXER, 10),
|
||||
HPI_MIXER_STORE = HPI_FUNC_ID(MIXER, 11),
|
||||
HPI_MIXER_GET_CACHE_INFO = HPI_FUNC_ID(MIXER, 12),
|
||||
#define HPI_MIXER_FUNCTION_COUNT 12
|
||||
HPI_MIXER_GET_BLOCK_HANDLE = HPI_FUNC_ID(MIXER, 13),
|
||||
HPI_MIXER_GET_PARAMETER_HANDLE = HPI_FUNC_ID(MIXER, 14),
|
||||
#define HPI_MIXER_FUNCTION_COUNT 14
|
||||
|
||||
HPI_CONTROL_GET_INFO = HPI_FUNC_ID(CONTROL, 1),
|
||||
HPI_CONTROL_GET_STATE = HPI_FUNC_ID(CONTROL, 2),
|
||||
@ -618,7 +620,7 @@ struct hpi_hostbuffer_status {
|
||||
u32 auxiliary_data_available;
|
||||
u32 stream_state;
|
||||
/* DSP index in to the host bus master buffer. */
|
||||
u32 dSP_index;
|
||||
u32 dsp_index;
|
||||
/* Host index in to the host bus master buffer. */
|
||||
u32 host_index;
|
||||
u32 size_in_bytes;
|
||||
@ -660,13 +662,6 @@ union hpi_adapterx_msg {
|
||||
struct {
|
||||
u16 index;
|
||||
} module_info;
|
||||
struct {
|
||||
u32 checksum;
|
||||
u16 sequence;
|
||||
u16 length;
|
||||
u16 offset; /**< offset from start of msg to data */
|
||||
u16 unused;
|
||||
} program_flash;
|
||||
struct {
|
||||
u16 index;
|
||||
u16 what;
|
||||
@ -677,19 +672,11 @@ union hpi_adapterx_msg {
|
||||
u16 parameter1;
|
||||
u16 parameter2;
|
||||
} property_set;
|
||||
struct {
|
||||
u32 offset;
|
||||
} query_flash;
|
||||
struct {
|
||||
u32 pad32;
|
||||
u16 key1;
|
||||
u16 key2;
|
||||
} restart;
|
||||
struct {
|
||||
u32 offset;
|
||||
u32 length;
|
||||
u32 key;
|
||||
} start_flash;
|
||||
struct {
|
||||
u32 pad32;
|
||||
u16 value;
|
||||
@ -697,6 +684,7 @@ union hpi_adapterx_msg {
|
||||
struct {
|
||||
u32 yes;
|
||||
} irq_query;
|
||||
u32 pad[3];
|
||||
};
|
||||
|
||||
struct hpi_adapter_res {
|
||||
@ -723,18 +711,10 @@ union hpi_adapterx_res {
|
||||
struct {
|
||||
u32 adapter_mode;
|
||||
} mode;
|
||||
struct {
|
||||
u16 sequence;
|
||||
} program_flash;
|
||||
struct {
|
||||
u16 parameter1;
|
||||
u16 parameter2;
|
||||
} property_get;
|
||||
struct {
|
||||
u32 checksum;
|
||||
u32 length;
|
||||
u32 version;
|
||||
} query_flash;
|
||||
struct {
|
||||
u32 yes;
|
||||
} irq_query;
|
||||
@ -1150,74 +1130,9 @@ struct hpi_res_adapter_get_info {
|
||||
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)];
|
||||
};
|
||||
|
||||
struct hpi_msg_adapter_debug_read {
|
||||
struct hpi_message_header h;
|
||||
u32 dsp_address;
|
||||
u32 count_bytes;
|
||||
};
|
||||
|
||||
struct hpi_res_adapter_debug_read {
|
||||
struct hpi_response_header h;
|
||||
u8 bytes[256];
|
||||
u8 bytes[1024];
|
||||
};
|
||||
|
||||
struct hpi_msg_cobranet_hmi {
|
||||
@ -1461,7 +1376,7 @@ struct hpi_control_cache_pad {
|
||||
/* 2^N sized FIFO buffer (internal to HPI<->DSP interaction) */
|
||||
struct hpi_fifo_buffer {
|
||||
u32 size;
|
||||
u32 dSP_index;
|
||||
u32 dsp_index;
|
||||
u32 host_index;
|
||||
};
|
||||
|
||||
|
32
sound/pci/asihpi/hpi_version.h
Normal file
32
sound/pci/asihpi/hpi_version.h
Normal file
@ -0,0 +1,32 @@
|
||||
/** HPI Version Definitions
|
||||
Development releases have odd minor version.
|
||||
Production releases have even minor version.
|
||||
|
||||
\file hpi_version.h
|
||||
*/
|
||||
|
||||
#ifndef _HPI_VERSION_H
|
||||
#define _HPI_VERSION_H
|
||||
|
||||
/* Use single digits for versions less that 10 to avoid octal. */
|
||||
/* *** HPI_VER is the only edit required to update version *** */
|
||||
/** HPI version */
|
||||
#define HPI_VER HPI_VERSION_CONSTRUCTOR(4, 10, 1)
|
||||
|
||||
/** HPI version string in dotted decimal format */
|
||||
#define HPI_VER_STRING "4.10.01"
|
||||
|
||||
/** Library version as documented in hpi-api-versions.txt */
|
||||
#define HPI_LIB_VER HPI_VERSION_CONSTRUCTOR(10, 2, 0)
|
||||
|
||||
/** Construct hpi version number from major, minor, release numbers */
|
||||
#define HPI_VERSION_CONSTRUCTOR(maj, min, r) ((maj << 16) + (min << 8) + r)
|
||||
|
||||
/** Extract major version from hpi version number */
|
||||
#define HPI_VER_MAJOR(v) ((int)(v >> 16))
|
||||
/** Extract minor version from hpi version number */
|
||||
#define HPI_VER_MINOR(v) ((int)((v >> 8) & 0xFF))
|
||||
/** Extract release from hpi version number */
|
||||
#define HPI_VER_RELEASE(v) ((int)(v & 0xFF))
|
||||
|
||||
#endif
|
@ -1,7 +1,7 @@
|
||||
/******************************************************************************
|
||||
|
||||
AudioScience HPI driver
|
||||
Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
|
||||
Copyright (C) 1997-2011 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
|
||||
@ -68,7 +68,7 @@ u16 hpi_validate_response(struct hpi_message *phm, struct hpi_response *phr)
|
||||
u16 hpi_add_adapter(struct hpi_adapter_obj *pao)
|
||||
{
|
||||
u16 retval = 0;
|
||||
/*HPI_ASSERT(pao->wAdapterType); */
|
||||
/*HPI_ASSERT(pao->type); */
|
||||
|
||||
hpios_alistlock_lock(&adapters);
|
||||
|
||||
@ -77,13 +77,13 @@ u16 hpi_add_adapter(struct hpi_adapter_obj *pao)
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (adapters.adapter[pao->index].adapter_type) {
|
||||
if (adapters.adapter[pao->index].type) {
|
||||
int a;
|
||||
for (a = HPI_MAX_ADAPTERS - 1; a >= 0; a--) {
|
||||
if (!adapters.adapter[a].adapter_type) {
|
||||
if (!adapters.adapter[a].type) {
|
||||
HPI_DEBUG_LOG(WARNING,
|
||||
"ASI%X duplicate index %d moved to %d\n",
|
||||
pao->adapter_type, pao->index, a);
|
||||
pao->type, pao->index, a);
|
||||
pao->index = a;
|
||||
break;
|
||||
}
|
||||
@ -104,13 +104,13 @@ u16 hpi_add_adapter(struct hpi_adapter_obj *pao)
|
||||
|
||||
void hpi_delete_adapter(struct hpi_adapter_obj *pao)
|
||||
{
|
||||
if (!pao->adapter_type) {
|
||||
if (!pao->type) {
|
||||
HPI_DEBUG_LOG(ERROR, "removing null adapter?\n");
|
||||
return;
|
||||
}
|
||||
|
||||
hpios_alistlock_lock(&adapters);
|
||||
if (adapters.adapter[pao->index].adapter_type)
|
||||
if (adapters.adapter[pao->index].type)
|
||||
adapters.gw_num_adapters--;
|
||||
memset(&adapters.adapter[pao->index], 0, sizeof(adapters.adapter[0]));
|
||||
hpios_alistlock_unlock(&adapters);
|
||||
@ -132,7 +132,7 @@ struct hpi_adapter_obj *hpi_find_adapter(u16 adapter_index)
|
||||
}
|
||||
|
||||
pao = &adapters.adapter[adapter_index];
|
||||
if (pao->adapter_type != 0) {
|
||||
if (pao->type != 0) {
|
||||
/*
|
||||
HPI_DEBUG_LOG(VERBOSE, "Found adapter index %d\n",
|
||||
wAdapterIndex);
|
||||
@ -165,7 +165,7 @@ static void subsys_get_adapter(struct hpi_message *phm,
|
||||
|
||||
/* find the nCount'th nonzero adapter in array */
|
||||
for (index = 0; index < HPI_MAX_ADAPTERS; index++) {
|
||||
if (adapters.adapter[index].adapter_type) {
|
||||
if (adapters.adapter[index].type) {
|
||||
if (!count)
|
||||
break;
|
||||
count--;
|
||||
@ -174,11 +174,11 @@ static void subsys_get_adapter(struct hpi_message *phm,
|
||||
|
||||
if (index < HPI_MAX_ADAPTERS) {
|
||||
phr->u.s.adapter_index = adapters.adapter[index].index;
|
||||
phr->u.s.adapter_type = adapters.adapter[index].adapter_type;
|
||||
phr->u.s.adapter_type = adapters.adapter[index].type;
|
||||
} else {
|
||||
phr->u.s.adapter_index = 0;
|
||||
phr->u.s.adapter_type = 0;
|
||||
phr->error = HPI_ERROR_BAD_ADAPTER_NUMBER;
|
||||
phr->error = HPI_ERROR_INVALID_OBJ_INDEX;
|
||||
}
|
||||
}
|
||||
|
||||
@ -324,6 +324,8 @@ short hpi_check_control_cache(struct hpi_control_cache *p_cache,
|
||||
}
|
||||
|
||||
phr->error = 0;
|
||||
phr->specific_error = 0;
|
||||
phr->version = 0;
|
||||
|
||||
/* set the default response size */
|
||||
response_size =
|
||||
@ -531,8 +533,12 @@ short hpi_check_control_cache(struct hpi_control_cache *p_cache,
|
||||
found ? "Cached" : "Uncached", phm->adapter_index,
|
||||
pI->control_index, pI->control_type, phm->u.c.attribute);
|
||||
|
||||
if (found)
|
||||
if (found) {
|
||||
phr->size = (u16)response_size;
|
||||
phr->type = HPI_TYPE_RESPONSE;
|
||||
phr->object = phm->object;
|
||||
phr->function = phm->function;
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
@ -631,7 +637,7 @@ struct hpi_control_cache *hpi_alloc_control_cache(const u32 control_count,
|
||||
if (!p_cache)
|
||||
return NULL;
|
||||
|
||||
p_cache->p_info = kzalloc(sizeof(*p_cache->p_info) * control_count,
|
||||
p_cache->p_info = kcalloc(control_count, sizeof(*p_cache->p_info),
|
||||
GFP_KERNEL);
|
||||
if (!p_cache->p_info) {
|
||||
kfree(p_cache);
|
||||
|
@ -1,7 +1,7 @@
|
||||
/**
|
||||
|
||||
AudioScience HPI driver
|
||||
Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
|
||||
Copyright (C) 1997-2011 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
|
||||
@ -18,12 +18,15 @@
|
||||
|
||||
*/
|
||||
|
||||
struct hpi_adapter_obj;
|
||||
|
||||
/* a function that takes an adapter obj and returns an int */
|
||||
typedef int adapter_int_func(struct hpi_adapter_obj *pao);
|
||||
|
||||
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;
|
||||
u16 type; /* 0x6644 == ASI6644 etc */
|
||||
u16 index;
|
||||
|
||||
struct hpios_spinlock dsp_lock;
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/************************************************************************
|
||||
|
||||
AudioScience HPI driver
|
||||
Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
|
||||
Copyright (C) 1997-2011 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
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
AudioScience HPI driver
|
||||
Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
|
||||
Copyright (C) 1997-2011 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
|
||||
|
@ -25,6 +25,7 @@ hotplug firmware loader from individual dsp code files
|
||||
#define SOURCEFILE_NAME "hpidspcd.c"
|
||||
#include "hpidspcd.h"
|
||||
#include "hpidebug.h"
|
||||
#include "hpi_version.h"
|
||||
|
||||
struct dsp_code_private {
|
||||
/** Firmware descriptor */
|
||||
@ -32,9 +33,6 @@ struct dsp_code_private {
|
||||
struct pci_dev *dev;
|
||||
};
|
||||
|
||||
#define HPI_VER_DECIMAL ((int)(HPI_VER_MAJOR(HPI_VER) * 10000 + \
|
||||
HPI_VER_MINOR(HPI_VER) * 100 + HPI_VER_RELEASE(HPI_VER)))
|
||||
|
||||
/*-------------------------------------------------------------------*/
|
||||
short hpi_dsp_code_open(u32 adapter, void *os_data, struct dsp_code *dsp_code,
|
||||
u32 *os_error_code)
|
||||
@ -66,22 +64,25 @@ short hpi_dsp_code_open(u32 adapter, void *os_data, struct dsp_code *dsp_code,
|
||||
if ((header.type != 0x45444F43) || /* "CODE" */
|
||||
(header.adapter != adapter)
|
||||
|| (header.size != firmware->size)) {
|
||||
dev_printk(KERN_ERR, &dev->dev, "Invalid firmware file\n");
|
||||
dev_printk(KERN_ERR, &dev->dev,
|
||||
"Invalid firmware header size %d != file %zd\n",
|
||||
header.size, firmware->size);
|
||||
goto error2;
|
||||
}
|
||||
|
||||
if ((header.version / 100 & ~1) != (HPI_VER_DECIMAL / 100 & ~1)) {
|
||||
if ((header.version >> 9) != (HPI_VER >> 9)) {
|
||||
/* Consider even and subsequent odd minor versions to be compatible */
|
||||
dev_printk(KERN_ERR, &dev->dev,
|
||||
"Incompatible firmware version "
|
||||
"DSP image %d != Driver %d\n", header.version,
|
||||
HPI_VER_DECIMAL);
|
||||
"DSP image %X != Driver %X\n", header.version,
|
||||
HPI_VER);
|
||||
goto error2;
|
||||
}
|
||||
|
||||
if (header.version != HPI_VER_DECIMAL) {
|
||||
dev_printk(KERN_WARNING, &dev->dev,
|
||||
"Firmware: release version mismatch DSP image %d != Driver %d\n",
|
||||
header.version, HPI_VER_DECIMAL);
|
||||
if (header.version != HPI_VER) {
|
||||
dev_printk(KERN_INFO, &dev->dev,
|
||||
"Firmware: release version mismatch DSP image %X != Driver %X\n",
|
||||
header.version, HPI_VER);
|
||||
}
|
||||
|
||||
HPI_DEBUG_LOG(DEBUG, "dsp code %s opened\n", fw_name);
|
||||
@ -108,11 +109,8 @@ short hpi_dsp_code_open(u32 adapter, void *os_data, struct dsp_code *dsp_code,
|
||||
/*-------------------------------------------------------------------*/
|
||||
void hpi_dsp_code_close(struct dsp_code *dsp_code)
|
||||
{
|
||||
if (dsp_code->pvt->firmware) {
|
||||
HPI_DEBUG_LOG(DEBUG, "dsp code closed\n");
|
||||
release_firmware(dsp_code->pvt->firmware);
|
||||
dsp_code->pvt->firmware = NULL;
|
||||
}
|
||||
HPI_DEBUG_LOG(DEBUG, "dsp code closed\n");
|
||||
release_firmware(dsp_code->pvt->firmware);
|
||||
kfree(dsp_code->pvt);
|
||||
}
|
||||
|
||||
|
@ -27,10 +27,6 @@ Functions for reading DSP code to load into DSP
|
||||
|
||||
#include "hpi_internal.h"
|
||||
|
||||
/** Code header version is decimal encoded e.g. 4.06.10 is 40601 */
|
||||
#define HPI_VER_DECIMAL ((int)(HPI_VER_MAJOR(HPI_VER) * 10000 + \
|
||||
HPI_VER_MINOR(HPI_VER) * 100 + HPI_VER_RELEASE(HPI_VER)))
|
||||
|
||||
/** Header structure for dsp firmware file
|
||||
This structure must match that used in s2bin.c for generation of asidsp.bin
|
||||
*/
|
||||
|
@ -2826,6 +2826,16 @@ u16 hpi_volume_auto_fade(u32 h_control,
|
||||
duration_ms, HPI_VOLUME_AUTOFADE_LOG);
|
||||
}
|
||||
|
||||
u16 hpi_volume_query_auto_fade_profile(const u32 h_volume, const u32 i,
|
||||
u16 *profile)
|
||||
{
|
||||
u16 e;
|
||||
u32 u;
|
||||
e = hpi_control_query(h_volume, HPI_VOLUME_AUTOFADE, i, 0, &u);
|
||||
*profile = (u16)u;
|
||||
return e;
|
||||
}
|
||||
|
||||
u16 hpi_vox_set_threshold(u32 h_control, short an_gain0_01dB)
|
||||
{
|
||||
struct hpi_message hm;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/******************************************************************************
|
||||
|
||||
AudioScience HPI driver
|
||||
Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
|
||||
Copyright (C) 1997-2011 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
|
||||
|
@ -1,7 +1,7 @@
|
||||
/******************************************************************************
|
||||
|
||||
AudioScience HPI driver
|
||||
Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
|
||||
Copyright (C) 1997-2011 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
|
||||
|
@ -1,7 +1,7 @@
|
||||
/******************************************************************************
|
||||
|
||||
AudioScience HPI driver
|
||||
Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
|
||||
Copyright (C) 1997-2011 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
|
||||
@ -22,6 +22,7 @@ Extended Message Function With Response Caching
|
||||
*****************************************************************************/
|
||||
#define SOURCEFILE_NAME "hpimsgx.c"
|
||||
#include "hpi_internal.h"
|
||||
#include "hpi_version.h"
|
||||
#include "hpimsginit.h"
|
||||
#include "hpicmn.h"
|
||||
#include "hpimsgx.h"
|
||||
|
@ -1,7 +1,7 @@
|
||||
/******************************************************************************
|
||||
|
||||
AudioScience HPI driver
|
||||
Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
|
||||
Copyright (C) 1997-2011 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
|
||||
|
@ -21,6 +21,7 @@ Common Linux HPI ioctl and module probe/remove functions
|
||||
#define SOURCEFILE_NAME "hpioctl.c"
|
||||
|
||||
#include "hpi_internal.h"
|
||||
#include "hpi_version.h"
|
||||
#include "hpimsginit.h"
|
||||
#include "hpidebug.h"
|
||||
#include "hpimsgx.h"
|
||||
@ -65,9 +66,7 @@ static struct hpi_adapter adapters[HPI_MAX_ADAPTERS];
|
||||
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)
|
||||
if ((phm->adapter_index >= HPI_MAX_ADAPTERS)
|
||||
&& (phm->object != HPI_OBJ_SUBSYSTEM))
|
||||
phr->error = HPI_ERROR_INVALID_OBJ_INDEX;
|
||||
else
|
||||
@ -178,19 +177,14 @@ long asihpi_hpi_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
} else {
|
||||
u16 __user *ptr = NULL;
|
||||
u32 size = 0;
|
||||
u32 adapter_present;
|
||||
/* -1=no data 0=read from user mem, 1=write to user mem */
|
||||
int wrflag = -1;
|
||||
struct hpi_adapter *pa;
|
||||
struct hpi_adapter *pa = NULL;
|
||||
|
||||
if (hm->h.adapter_index < HPI_MAX_ADAPTERS) {
|
||||
if (hm->h.adapter_index < ARRAY_SIZE(adapters))
|
||||
pa = &adapters[hm->h.adapter_index];
|
||||
adapter_present = pa->type;
|
||||
} else {
|
||||
adapter_present = 0;
|
||||
}
|
||||
|
||||
if (!adapter_present) {
|
||||
if (!pa || !pa->adapter || !pa->adapter->type) {
|
||||
hpi_init_response(&hr->r0, hm->h.object,
|
||||
hm->h.function, HPI_ERROR_BAD_ADAPTER_NUMBER);
|
||||
|
||||
@ -317,6 +311,7 @@ int __devinit asihpi_adapter_probe(struct pci_dev *pci_dev,
|
||||
const struct pci_device_id *pci_id)
|
||||
{
|
||||
int idx, nm;
|
||||
int adapter_index;
|
||||
unsigned int memlen;
|
||||
struct hpi_message hm;
|
||||
struct hpi_response hr;
|
||||
@ -345,8 +340,6 @@ int __devinit asihpi_adapter_probe(struct pci_dev *pci_dev,
|
||||
|
||||
hm.adapter_index = HPI_ADAPTER_INDEX_INVALID;
|
||||
|
||||
adapter.pci = pci_dev;
|
||||
|
||||
nm = HPI_MAX_ADAPTER_MEM_SPACES;
|
||||
|
||||
for (idx = 0; idx < nm; idx++) {
|
||||
@ -355,18 +348,16 @@ int __devinit asihpi_adapter_probe(struct pci_dev *pci_dev,
|
||||
|
||||
if (pci_resource_flags(pci_dev, idx) & IORESOURCE_MEM) {
|
||||
memlen = pci_resource_len(pci_dev, idx);
|
||||
adapter.ap_remapped_mem_base[idx] =
|
||||
pci.ap_mem_base[idx] =
|
||||
ioremap(pci_resource_start(pci_dev, idx),
|
||||
memlen);
|
||||
if (!adapter.ap_remapped_mem_base[idx]) {
|
||||
if (!pci.ap_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];
|
||||
}
|
||||
|
||||
pci.pci_dev = pci_dev;
|
||||
@ -378,6 +369,9 @@ int __devinit asihpi_adapter_probe(struct pci_dev *pci_dev,
|
||||
if (hr.error)
|
||||
goto err;
|
||||
|
||||
adapter_index = hr.u.s.adapter_index;
|
||||
adapter.adapter = hpi_find_adapter(adapter_index);
|
||||
|
||||
if (prealloc_stream_buf) {
|
||||
adapter.p_buffer = vmalloc(prealloc_stream_buf);
|
||||
if (!adapter.p_buffer) {
|
||||
@ -389,36 +383,32 @@ int __devinit asihpi_adapter_probe(struct pci_dev *pci_dev,
|
||||
}
|
||||
}
|
||||
|
||||
adapter.index = hr.u.s.adapter_index;
|
||||
adapter.type = hr.u.s.adapter_type;
|
||||
|
||||
hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
|
||||
HPI_ADAPTER_OPEN);
|
||||
hm.adapter_index = adapter.index;
|
||||
hm.adapter_index = adapter.adapter->index;
|
||||
hpi_send_recv_ex(&hm, &hr, HOWNER_KERNEL);
|
||||
|
||||
if (hr.error)
|
||||
goto err;
|
||||
|
||||
adapter.snd_card_asihpi = NULL;
|
||||
/* WARNING can't init mutex in 'adapter'
|
||||
* and then copy it to adapters[] ?!?!
|
||||
*/
|
||||
adapters[adapter.index] = adapter;
|
||||
mutex_init(&adapters[adapter.index].mutex);
|
||||
pci_set_drvdata(pci_dev, &adapters[adapter.index]);
|
||||
adapters[adapter_index] = adapter;
|
||||
mutex_init(&adapters[adapter_index].mutex);
|
||||
pci_set_drvdata(pci_dev, &adapters[adapter_index]);
|
||||
|
||||
dev_printk(KERN_INFO, &pci_dev->dev,
|
||||
"probe succeeded for ASI%04X HPI index %d\n", adapter.type,
|
||||
adapter.index);
|
||||
"probe succeeded for ASI%04X HPI index %d\n",
|
||||
adapter.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 (pci.ap_mem_base[idx]) {
|
||||
iounmap(pci.ap_mem_base[idx]);
|
||||
pci.ap_mem_base[idx] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@ -437,19 +427,20 @@ void __devexit asihpi_adapter_remove(struct pci_dev *pci_dev)
|
||||
struct hpi_message hm;
|
||||
struct hpi_response hr;
|
||||
struct hpi_adapter *pa;
|
||||
struct hpi_pci pci;
|
||||
|
||||
pa = pci_get_drvdata(pci_dev);
|
||||
pci = pa->adapter->pci;
|
||||
|
||||
hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
|
||||
HPI_ADAPTER_DELETE);
|
||||
hm.adapter_index = pa->index;
|
||||
hm.adapter_index = pa->adapter->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 (pci.ap_mem_base[idx])
|
||||
iounmap(pci.ap_mem_base[idx]);
|
||||
}
|
||||
|
||||
if (pa->p_buffer)
|
||||
@ -461,7 +452,7 @@ void __devexit asihpi_adapter_remove(struct pci_dev *pci_dev)
|
||||
"remove %04x:%04x,%04x:%04x,%04x," " HPI index %d.\n",
|
||||
pci_dev->vendor, pci_dev->device,
|
||||
pci_dev->subsystem_vendor, pci_dev->subsystem_device,
|
||||
pci_dev->devfn, pa->index);
|
||||
pci_dev->devfn, pa->adapter->index);
|
||||
|
||||
memset(pa, 0, sizeof(*pa));
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
|
||||
AudioScience HPI driver
|
||||
Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
|
||||
Copyright (C) 1997-2011 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
|
||||
|
@ -1,7 +1,7 @@
|
||||
/******************************************************************************
|
||||
|
||||
AudioScience HPI driver
|
||||
Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
|
||||
Copyright (C) 1997-2011 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
|
||||
|
@ -1,7 +1,7 @@
|
||||
/******************************************************************************
|
||||
|
||||
AudioScience HPI driver
|
||||
Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
|
||||
Copyright (C) 1997-2011 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
|
||||
@ -149,20 +149,18 @@ static inline void cond_unlock(struct hpios_spinlock *l)
|
||||
#define hpios_alistlock_lock(obj) spin_lock(&((obj)->list_lock.lock))
|
||||
#define hpios_alistlock_unlock(obj) spin_unlock(&((obj)->list_lock.lock))
|
||||
|
||||
struct snd_card;
|
||||
|
||||
/** pci drvdata points to an instance of this struct */
|
||||
struct hpi_adapter {
|
||||
struct hpi_adapter_obj *adapter;
|
||||
struct snd_card *snd_card;
|
||||
|
||||
/* 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];
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -1,7 +1,7 @@
|
||||
/******************************************************************************
|
||||
|
||||
AudioScience HPI driver
|
||||
Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
|
||||
Copyright (C) 1997-2011 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
|
||||
|
@ -43,7 +43,7 @@ static int index = SNDRV_DEFAULT_IDX1; /* Index 0-MAX */
|
||||
static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */
|
||||
static int ac97_clock = 48000;
|
||||
static char *ac97_quirk;
|
||||
static int spdif_aclink = 1;
|
||||
static bool spdif_aclink = 1;
|
||||
static int ac97_codec = -1;
|
||||
|
||||
module_param(index, int, 0444);
|
||||
@ -60,7 +60,7 @@ module_param(spdif_aclink, bool, 0444);
|
||||
MODULE_PARM_DESC(spdif_aclink, "S/PDIF over AC-link.");
|
||||
|
||||
/* just for backward compatibility */
|
||||
static int enable;
|
||||
static bool enable;
|
||||
module_param(enable, bool, 0444);
|
||||
|
||||
|
||||
|
@ -51,7 +51,7 @@ module_param(ac97_clock, int, 0444);
|
||||
MODULE_PARM_DESC(ac97_clock, "AC'97 codec clock (default 48000Hz).");
|
||||
|
||||
/* just for backward compatibility */
|
||||
static int enable;
|
||||
static bool enable;
|
||||
module_param(enable, bool, 0444);
|
||||
|
||||
|
||||
|
@ -26,7 +26,7 @@
|
||||
// module parameters (see "Module Parameters")
|
||||
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
|
||||
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
static int pcifix[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 255 };
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
|
@ -805,7 +805,7 @@ static void vortex_fifo_setadbvalid(vortex_t * vortex, int fifo, int en)
|
||||
}
|
||||
|
||||
static void
|
||||
vortex_fifo_setadbctrl(vortex_t * vortex, int fifo, int b, int priority,
|
||||
vortex_fifo_setadbctrl(vortex_t * vortex, int fifo, int stereo, int priority,
|
||||
int empty, int valid, int f)
|
||||
{
|
||||
int temp, lifeboat = 0;
|
||||
@ -837,7 +837,7 @@ vortex_fifo_setadbctrl(vortex_t * vortex, int fifo, int b, int priority,
|
||||
#else
|
||||
temp = (this_4 & 0x3f) << 0xc;
|
||||
#endif
|
||||
temp = (temp & 0xfffffffd) | ((b & 1) << 1);
|
||||
temp = (temp & 0xfffffffd) | ((stereo & 1) << 1);
|
||||
temp = (temp & 0xfffffff3) | ((priority & 3) << 2);
|
||||
temp = (temp & 0xffffffef) | ((valid & 1) << 4);
|
||||
temp |= FIFO_U1;
|
||||
@ -1148,11 +1148,11 @@ vortex_adbdma_setbuffers(vortex_t * vortex, int adbdma,
|
||||
|
||||
static void
|
||||
vortex_adbdma_setmode(vortex_t * vortex, int adbdma, int ie, int dir,
|
||||
int fmt, int d, u32 offset)
|
||||
int fmt, int stereo, u32 offset)
|
||||
{
|
||||
stream_t *dma = &vortex->dma_adb[adbdma];
|
||||
|
||||
dma->dma_unknown = d;
|
||||
dma->dma_unknown = stereo;
|
||||
dma->dma_ctrl =
|
||||
((offset & OFFSET_MASK) | (dma->dma_ctrl & ~OFFSET_MASK));
|
||||
/* Enable PCMOUT interrupts. */
|
||||
@ -1336,7 +1336,6 @@ static void vortex_adbdma_pausefifo(vortex_t * vortex, int adbdma)
|
||||
dma->fifo_status = FIFO_PAUSE;
|
||||
}
|
||||
|
||||
#if 0 // Using pause instead
|
||||
static void vortex_adbdma_stopfifo(vortex_t * vortex, int adbdma)
|
||||
{
|
||||
stream_t *dma = &vortex->dma_adb[adbdma];
|
||||
@ -1351,7 +1350,6 @@ static void vortex_adbdma_stopfifo(vortex_t * vortex, int adbdma)
|
||||
dma->fifo_enabled = 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
/* WTDMA */
|
||||
|
||||
#ifndef CHIP_AU8810
|
||||
|
@ -307,8 +307,8 @@ static int snd_vortex_pcm_prepare(struct snd_pcm_substream *substream)
|
||||
fmt = vortex_alsafmt_aspfmt(runtime->format);
|
||||
spin_lock_irq(&chip->lock);
|
||||
if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) {
|
||||
vortex_adbdma_setmode(chip, dma, 1, dir, fmt, 0 /*? */ ,
|
||||
0);
|
||||
vortex_adbdma_setmode(chip, dma, 1, dir, fmt,
|
||||
runtime->channels == 1 ? 0 : 1, 0);
|
||||
vortex_adbdma_setstartbuffer(chip, dma, 0);
|
||||
if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_SPDIF)
|
||||
vortex_adb_setsrc(chip, dma, runtime->rate, dir);
|
||||
@ -353,8 +353,7 @@ static int snd_vortex_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
||||
//printk(KERN_INFO "vortex: stop %d\n", dma);
|
||||
stream->fifo_enabled = 0;
|
||||
if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT)
|
||||
vortex_adbdma_pausefifo(chip, dma);
|
||||
//vortex_adbdma_stopfifo(chip, dma);
|
||||
vortex_adbdma_stopfifo(chip, dma);
|
||||
#ifndef CHIP_AU8810
|
||||
else {
|
||||
printk(KERN_INFO "vortex: wt stop %d\n", dma);
|
||||
|
@ -48,43 +48,61 @@ static unsigned short const wXtalkNarrowLeftDelay = 0x7;
|
||||
static unsigned short const wXtalkNarrowRightDelay = 0x7;
|
||||
|
||||
static xtalk_gains_t const asXtalkGainsDefault = {
|
||||
0x4000, 0x4000, 4000, 0x4000, 4000, 0x4000, 4000, 0x4000, 4000,
|
||||
0x4000
|
||||
0x4000, 0x4000, 0x4000, 0x4000, 0x4000,
|
||||
0x4000, 0x4000, 0x4000, 0x4000, 0x4000
|
||||
};
|
||||
|
||||
static xtalk_gains_t const asXtalkGainsTest = {
|
||||
0x8000, 0x7FFF, 0, 0xFFFF, 0x0001, 0xC000, 0x4000, 0xFFFE, 0x0002,
|
||||
0
|
||||
0x7fff, 0x8000, 0x0000, 0x0000, 0x0001,
|
||||
0xffff, 0x4000, 0xc000, 0x0002, 0xfffe
|
||||
};
|
||||
|
||||
static xtalk_gains_t const asXtalkGains1Chan = {
|
||||
0x7FFF, 0, 0, 0, 0x7FFF, 0, 0, 0, 0, 0
|
||||
0x7FFF, 0, 0, 0, 0,
|
||||
0x7FFF, 0, 0, 0, 0,
|
||||
};
|
||||
|
||||
// Input gain for 4 A3D slices. One possible input pair is left zero.
|
||||
static xtalk_gains_t const asXtalkGainsAllChan = {
|
||||
0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF,
|
||||
0
|
||||
//0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7fff,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7fff
|
||||
0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0,
|
||||
0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0
|
||||
};
|
||||
static xtalk_gains_t const asXtalkGainsZeros;
|
||||
|
||||
static xtalk_dline_t const alXtalkDlineZeros;
|
||||
static xtalk_gains_t const asXtalkGainsZeros = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
static xtalk_dline_t const alXtalkDlineZeros = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
static xtalk_dline_t const alXtalkDlineTest = {
|
||||
0xFC18, 0x03E8FFFF, 0x186A0, 0x7960FFFE, 1, 0xFFFFFFFF,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0x0000fc18, 0xfff03e8, 0x000186a0, 0xfffe7960, 1, 0xffffffff, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
static xtalk_instate_t const asXtalkInStateZeros = {
|
||||
0, 0, 0, 0
|
||||
};
|
||||
|
||||
static xtalk_instate_t const asXtalkInStateZeros;
|
||||
static xtalk_instate_t const asXtalkInStateTest =
|
||||
{ 0xFF80, 0x0080, 0xFFFF, 0x0001 };
|
||||
static xtalk_state_t const asXtalkOutStateZeros;
|
||||
static xtalk_instate_t const asXtalkInStateTest = {
|
||||
0x0080, 0xff80, 0x0001, 0xffff
|
||||
};
|
||||
|
||||
static xtalk_state_t const asXtalkOutStateZeros = {
|
||||
{0, 0, 0, 0},
|
||||
{0, 0, 0, 0},
|
||||
{0, 0, 0, 0},
|
||||
{0, 0, 0, 0},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
static short const sDiamondKLeftEq = 0x401d;
|
||||
static short const sDiamondKRightEq = 0x401d;
|
||||
static short const sDiamondKLeftXt = 0xF90E;
|
||||
static short const sDiamondKRightXt = 0xF90E;
|
||||
static short const sDiamondShiftLeftEq = 1; /* 0xF90E Is this a bug ??? */
|
||||
static short const sDiamondShiftLeftEq = 1;
|
||||
static short const sDiamondShiftRightEq = 1;
|
||||
static short const sDiamondShiftLeftXt = 0;
|
||||
static short const sDiamondShiftRightXt = 0;
|
||||
@ -94,29 +112,29 @@ static unsigned short const wDiamondRightDelay = 0xb;
|
||||
static xtalk_coefs_t const asXtalkWideCoefsLeftEq = {
|
||||
{0xEC4C, 0xDCE9, 0xFDC2, 0xFEEC, 0},
|
||||
{0x5F60, 0xCBCB, 0xFC26, 0x0305, 0},
|
||||
{0x340B, 0xf504, 0x6CE8, 0x0D23, 0x00E4},
|
||||
{0xD500, 0x8D76, 0xACC7, 0x5B05, 0x00FA},
|
||||
{0x340B, 0xe8f5, 0x236c, 0xe40d, 0},
|
||||
{0x76d5, 0xc78d, 0x05ac, 0xfa5b, 0},
|
||||
{0x7F04, 0xC0FA, 0x0263, 0xFDA2, 0}
|
||||
};
|
||||
static xtalk_coefs_t const asXtalkWideCoefsRightEq = {
|
||||
{0xEC4C, 0xDCE9, 0xFDC2, 0xFEEC, 0},
|
||||
{0x5F60, 0xCBCB, 0xFC26, 0x0305, 0},
|
||||
{0x340B, 0xF504, 0x6CE8, 0x0D23, 0x00E4},
|
||||
{0xD500, 0x8D76, 0xACC7, 0x5B05, 0x00FA},
|
||||
{0x340B, 0xe8f5, 0x236c, 0xe40d, 0},
|
||||
{0x76d5, 0xc78d, 0x05ac, 0xfa5b, 0},
|
||||
{0x7F04, 0xC0FA, 0x0263, 0xFDA2, 0}
|
||||
};
|
||||
static xtalk_coefs_t const asXtalkWideCoefsLeftXt = {
|
||||
{0x86C3, 0x7B55, 0x89C3, 0x005B, 0x0047},
|
||||
{0x6000, 0x206A, 0xC6CA, 0x40FF, 0},
|
||||
{0x1100, 0x1164, 0xA1D7, 0x90FC, 0x0001},
|
||||
{0xDC00, 0x9E77, 0xB8C7, 0x0AFF, 0},
|
||||
{0x55c6, 0xc97b, 0x005b, 0x0047, 0},
|
||||
{0x6a60, 0xca20, 0xffc6, 0x0040, 0},
|
||||
{0x6411, 0xd711, 0xfca1, 0x0190, 0},
|
||||
{0x77dc, 0xc79e, 0xffb8, 0x000a, 0},
|
||||
{0, 0, 0, 0, 0}
|
||||
};
|
||||
static xtalk_coefs_t const asXtalkWideCoefsRightXt = {
|
||||
{0x86C3, 0x7B55, 0x89C3, 0x005B, 0x0047},
|
||||
{0x6000, 0x206A, 0xC6CA, 0x40FF, 0},
|
||||
{0x1100, 0x1164, 0xA1D7, 0x90FC, 0x0001},
|
||||
{0xDC00, 0x9E77, 0xB8C7, 0x0AFF, 0},
|
||||
{0x55c6, 0xc97b, 0x005b, 0x0047, 0},
|
||||
{0x6a60, 0xca20, 0xffc6, 0x0040, 0},
|
||||
{0x6411, 0xd711, 0xfca1, 0x0190, 0},
|
||||
{0x77dc, 0xc79e, 0xffb8, 0x000a, 0},
|
||||
{0, 0, 0, 0, 0}
|
||||
};
|
||||
static xtalk_coefs_t const asXtalkNarrowCoefsLeftEq = {
|
||||
@ -151,7 +169,14 @@ static xtalk_coefs_t const asXtalkNarrowCoefsRightXt = {
|
||||
{0, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
static xtalk_coefs_t const asXtalkCoefsZeros;
|
||||
static xtalk_coefs_t const asXtalkCoefsZeros = {
|
||||
{0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
static xtalk_coefs_t const asXtalkCoefsPipe = {
|
||||
{0, 0, 0x0FA0, 0, 0},
|
||||
{0, 0, 0x0FA0, 0, 0},
|
||||
@ -186,7 +211,7 @@ static xtalk_coefs_t const asXtalkCoefsDenTest = {
|
||||
static xtalk_state_t const asXtalkOutStateTest = {
|
||||
{0x7FFF, 0x0004, 0xFFFC, 0},
|
||||
{0xFE00, 0x0008, 0xFFF8, 0x4000},
|
||||
{0x200, 0x0010, 0xFFF0, 0xC000},
|
||||
{0x0200, 0x0010, 0xFFF0, 0xC000},
|
||||
{0x8000, 0x0020, 0xFFE0, 0},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
@ -306,10 +331,10 @@ vortex_XtalkHw_SetLeftEQStates(vortex_t * vortex,
|
||||
hwwrite(vortex->mmio, 0x2421C + i * 0x24, coefs[i][2]);
|
||||
hwwrite(vortex->mmio, 0x24220 + i * 0x24, coefs[i][3]);
|
||||
}
|
||||
hwwrite(vortex->mmio, 0x244F8 + i * 0x24, arg_0[0]);
|
||||
hwwrite(vortex->mmio, 0x244FC + i * 0x24, arg_0[1]);
|
||||
hwwrite(vortex->mmio, 0x24500 + i * 0x24, arg_0[2]);
|
||||
hwwrite(vortex->mmio, 0x24504 + i * 0x24, arg_0[3]);
|
||||
hwwrite(vortex->mmio, 0x244F8, arg_0[0]);
|
||||
hwwrite(vortex->mmio, 0x244FC, arg_0[1]);
|
||||
hwwrite(vortex->mmio, 0x24500, arg_0[2]);
|
||||
hwwrite(vortex->mmio, 0x24504, arg_0[3]);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -325,10 +350,10 @@ vortex_XtalkHw_SetRightEQStates(vortex_t * vortex,
|
||||
hwwrite(vortex->mmio, 0x242D0 + i * 0x24, coefs[i][2]);
|
||||
hwwrite(vortex->mmio, 0x244D4 + i * 0x24, coefs[i][3]);
|
||||
}
|
||||
hwwrite(vortex->mmio, 0x24508 + i * 0x24, arg_0[0]);
|
||||
hwwrite(vortex->mmio, 0x2450C + i * 0x24, arg_0[1]);
|
||||
hwwrite(vortex->mmio, 0x24510 + i * 0x24, arg_0[2]);
|
||||
hwwrite(vortex->mmio, 0x24514 + i * 0x24, arg_0[3]);
|
||||
hwwrite(vortex->mmio, 0x24508, arg_0[0]);
|
||||
hwwrite(vortex->mmio, 0x2450C, arg_0[1]);
|
||||
hwwrite(vortex->mmio, 0x24510, arg_0[2]);
|
||||
hwwrite(vortex->mmio, 0x24514, arg_0[3]);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -344,10 +369,10 @@ vortex_XtalkHw_SetLeftXTStates(vortex_t * vortex,
|
||||
hwwrite(vortex->mmio, 0x24384 + i * 0x24, coefs[i][2]);
|
||||
hwwrite(vortex->mmio, 0x24388 + i * 0x24, coefs[i][3]);
|
||||
}
|
||||
hwwrite(vortex->mmio, 0x24518 + i * 0x24, arg_0[0]);
|
||||
hwwrite(vortex->mmio, 0x2451C + i * 0x24, arg_0[1]);
|
||||
hwwrite(vortex->mmio, 0x24520 + i * 0x24, arg_0[2]);
|
||||
hwwrite(vortex->mmio, 0x24524 + i * 0x24, arg_0[3]);
|
||||
hwwrite(vortex->mmio, 0x24518, arg_0[0]);
|
||||
hwwrite(vortex->mmio, 0x2451C, arg_0[1]);
|
||||
hwwrite(vortex->mmio, 0x24520, arg_0[2]);
|
||||
hwwrite(vortex->mmio, 0x24524, arg_0[3]);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -363,10 +388,10 @@ vortex_XtalkHw_SetRightXTStates(vortex_t * vortex,
|
||||
hwwrite(vortex->mmio, 0x24438 + i * 0x24, coefs[i][2]);
|
||||
hwwrite(vortex->mmio, 0x2443C + i * 0x24, coefs[i][3]);
|
||||
}
|
||||
hwwrite(vortex->mmio, 0x24528 + i * 0x24, arg_0[0]);
|
||||
hwwrite(vortex->mmio, 0x2452C + i * 0x24, arg_0[1]);
|
||||
hwwrite(vortex->mmio, 0x24530 + i * 0x24, arg_0[2]);
|
||||
hwwrite(vortex->mmio, 0x24534 + i * 0x24, arg_0[3]);
|
||||
hwwrite(vortex->mmio, 0x24528, arg_0[0]);
|
||||
hwwrite(vortex->mmio, 0x2452C, arg_0[1]);
|
||||
hwwrite(vortex->mmio, 0x24530, arg_0[2]);
|
||||
hwwrite(vortex->mmio, 0x24534, arg_0[3]);
|
||||
}
|
||||
|
||||
#if 0
|
||||
@ -450,10 +475,10 @@ vortex_XtalkHw_GetLeftEQStates(vortex_t * vortex, xtalk_instate_t arg_0,
|
||||
coefs[i][2] = hwread(vortex->mmio, 0x2421C + i * 0x24);
|
||||
coefs[i][3] = hwread(vortex->mmio, 0x24220 + i * 0x24);
|
||||
}
|
||||
arg_0[0] = hwread(vortex->mmio, 0x244F8 + i * 0x24);
|
||||
arg_0[1] = hwread(vortex->mmio, 0x244FC + i * 0x24);
|
||||
arg_0[2] = hwread(vortex->mmio, 0x24500 + i * 0x24);
|
||||
arg_0[3] = hwread(vortex->mmio, 0x24504 + i * 0x24);
|
||||
arg_0[0] = hwread(vortex->mmio, 0x244F8);
|
||||
arg_0[1] = hwread(vortex->mmio, 0x244FC);
|
||||
arg_0[2] = hwread(vortex->mmio, 0x24500);
|
||||
arg_0[3] = hwread(vortex->mmio, 0x24504);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -468,10 +493,10 @@ vortex_XtalkHw_GetRightEQStates(vortex_t * vortex, xtalk_instate_t arg_0,
|
||||
coefs[i][2] = hwread(vortex->mmio, 0x242D0 + i * 0x24);
|
||||
coefs[i][3] = hwread(vortex->mmio, 0x242D4 + i * 0x24);
|
||||
}
|
||||
arg_0[0] = hwread(vortex->mmio, 0x24508 + i * 0x24);
|
||||
arg_0[1] = hwread(vortex->mmio, 0x2450C + i * 0x24);
|
||||
arg_0[2] = hwread(vortex->mmio, 0x24510 + i * 0x24);
|
||||
arg_0[3] = hwread(vortex->mmio, 0x24514 + i * 0x24);
|
||||
arg_0[0] = hwread(vortex->mmio, 0x24508);
|
||||
arg_0[1] = hwread(vortex->mmio, 0x2450C);
|
||||
arg_0[2] = hwread(vortex->mmio, 0x24510);
|
||||
arg_0[3] = hwread(vortex->mmio, 0x24514);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -486,10 +511,10 @@ vortex_XtalkHw_GetLeftXTStates(vortex_t * vortex, xtalk_instate_t arg_0,
|
||||
coefs[i][2] = hwread(vortex->mmio, 0x24384 + i * 0x24);
|
||||
coefs[i][3] = hwread(vortex->mmio, 0x24388 + i * 0x24);
|
||||
}
|
||||
arg_0[0] = hwread(vortex->mmio, 0x24518 + i * 0x24);
|
||||
arg_0[1] = hwread(vortex->mmio, 0x2451C + i * 0x24);
|
||||
arg_0[2] = hwread(vortex->mmio, 0x24520 + i * 0x24);
|
||||
arg_0[3] = hwread(vortex->mmio, 0x24524 + i * 0x24);
|
||||
arg_0[0] = hwread(vortex->mmio, 0x24518);
|
||||
arg_0[1] = hwread(vortex->mmio, 0x2451C);
|
||||
arg_0[2] = hwread(vortex->mmio, 0x24520);
|
||||
arg_0[3] = hwread(vortex->mmio, 0x24524);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -504,10 +529,10 @@ vortex_XtalkHw_GetRightXTStates(vortex_t * vortex, xtalk_instate_t arg_0,
|
||||
coefs[i][2] = hwread(vortex->mmio, 0x24438 + i * 0x24);
|
||||
coefs[i][3] = hwread(vortex->mmio, 0x2443C + i * 0x24);
|
||||
}
|
||||
arg_0[0] = hwread(vortex->mmio, 0x24528 + i * 0x24);
|
||||
arg_0[1] = hwread(vortex->mmio, 0x2452C + i * 0x24);
|
||||
arg_0[2] = hwread(vortex->mmio, 0x24530 + i * 0x24);
|
||||
arg_0[3] = hwread(vortex->mmio, 0x24534 + i * 0x24);
|
||||
arg_0[0] = hwread(vortex->mmio, 0x24528);
|
||||
arg_0[1] = hwread(vortex->mmio, 0x2452C);
|
||||
arg_0[2] = hwread(vortex->mmio, 0x24530);
|
||||
arg_0[3] = hwread(vortex->mmio, 0x24534);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -153,7 +153,7 @@ static int snd_aw2_control_switch_capture_put(struct snd_kcontrol *kcontrol,
|
||||
********************************/
|
||||
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
|
||||
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
MODULE_PARM_DESC(index, "Index value for Audiowerk2 soundcard.");
|
||||
|
@ -301,7 +301,7 @@ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
|
||||
module_param_array(id, charp, NULL, 0444);
|
||||
MODULE_PARM_DESC(id, "ID string for AZF3328 soundcard.");
|
||||
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */
|
||||
module_param_array(enable, bool, NULL, 0444);
|
||||
MODULE_PARM_DESC(enable, "Enable AZF3328 soundcard.");
|
||||
|
||||
|
@ -42,9 +42,9 @@ MODULE_SUPPORTED_DEVICE("{{Brooktree,Bt878},"
|
||||
|
||||
static int index[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -2}; /* Exclude the first card */
|
||||
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */
|
||||
static int digital_rate[SNDRV_CARDS]; /* digital input rate */
|
||||
static int load_all; /* allow to load the non-whitelisted cards */
|
||||
static bool load_all; /* allow to load the non-whitelisted cards */
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
MODULE_PARM_DESC(index, "Index value for Bt87x soundcard");
|
||||
|
@ -156,7 +156,7 @@ MODULE_SUPPORTED_DEVICE("{{Creative,SB CA0106 chip}}");
|
||||
// module parameters (see "Module Parameters")
|
||||
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
|
||||
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
static uint subsystem[SNDRV_CARDS]; /* Force card subsystem model */
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
|
@ -54,10 +54,10 @@ MODULE_SUPPORTED_DEVICE("{{C-Media,CMI8738},"
|
||||
|
||||
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; /* Enable switches */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable switches */
|
||||
static long mpu_port[SNDRV_CARDS];
|
||||
static long fm_port[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)]=1};
|
||||
static int soft_ac3[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)]=1};
|
||||
static bool soft_ac3[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)]=1};
|
||||
#ifdef SUPPORT_JOYSTICK
|
||||
static int joystick_port[SNDRV_CARDS];
|
||||
#endif
|
||||
|
@ -44,8 +44,8 @@ MODULE_SUPPORTED_DEVICE("{{Cirrus Logic,CS4281}}");
|
||||
|
||||
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; /* Enable switches */
|
||||
static int dual_codec[SNDRV_CARDS]; /* dual codec */
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable switches */
|
||||
static bool dual_codec[SNDRV_CARDS]; /* dual codec */
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
MODULE_PARM_DESC(index, "Index value for CS4281 soundcard.");
|
||||
|
@ -46,10 +46,10 @@ MODULE_SUPPORTED_DEVICE("{{Cirrus Logic,Sound Fusion (CS4280)},"
|
||||
|
||||
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; /* Enable this card */
|
||||
static int external_amp[SNDRV_CARDS];
|
||||
static int thinkpad[SNDRV_CARDS];
|
||||
static int mmap_valid[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */
|
||||
static bool external_amp[SNDRV_CARDS];
|
||||
static bool thinkpad[SNDRV_CARDS];
|
||||
static bool mmap_valid[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
MODULE_PARM_DESC(index, "Index value for the CS46xx soundcard.");
|
||||
|
@ -50,7 +50,14 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
|
||||
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
|
||||
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
MODULE_PARM_DESC(index, "Index value for CS5530 Audio driver.");
|
||||
module_param_array(id, charp, NULL, 0444);
|
||||
MODULE_PARM_DESC(id, "ID string for CS5530 Audio driver.");
|
||||
module_param_array(enable, bool, NULL, 0444);
|
||||
MODULE_PARM_DESC(enable, "Enable CS5530 Audio driver.");
|
||||
|
||||
struct snd_cs5530 {
|
||||
struct snd_card *card;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user