diff options
Diffstat (limited to 'include/sound')
105 files changed, 4215 insertions, 7607 deletions
diff --git a/include/sound/Kbuild b/include/sound/Kbuild deleted file mode 100644 index 802947f6091..00000000000 --- a/include/sound/Kbuild +++ /dev/null @@ -1,8 +0,0 @@ -header-y += asequencer.h -header-y += asound.h -header-y += asound_fm.h -header-y += emu10k1.h -header-y += hdsp.h -header-y += hdspm.h -header-y += sb16_csp.h -header-y += sfnt_info.h diff --git a/include/sound/ac97_codec.h b/include/sound/ac97_codec.h index 49400459b47..d315a08d6c6 100644 --- a/include/sound/ac97_codec.h +++ b/include/sound/ac97_codec.h @@ -28,9 +28,9 @@  #include <linux/bitops.h>  #include <linux/device.h>  #include <linux/workqueue.h> -#include "pcm.h" -#include "control.h" -#include "info.h" +#include <sound/pcm.h> +#include <sound/control.h> +#include <sound/info.h>  /* maximum number of devices on the AC97 bus */  #define	AC97_BUS_MAX_DEVICES	4 @@ -96,6 +96,10 @@  #define AC97_FUNC_INFO		0x68	/* Function Information */  #define AC97_SENSE_INFO		0x6a	/* Sense Details */ +/* volume controls */ +#define AC97_MUTE_MASK_MONO	0x8000 +#define AC97_MUTE_MASK_STEREO	0x8080 +  /* slot allocation */  #define AC97_SLOT_TAG		0  #define AC97_SLOT_CMD_ADDR	1 @@ -138,6 +142,7 @@  #define AC97_BC_18BIT_ADC	0x0100	/* 18-bit ADC resolution */  #define AC97_BC_20BIT_ADC	0x0200	/* 20-bit ADC resolution */  #define AC97_BC_ADC_MASK	0x0300 +#define AC97_BC_3D_TECH_ID_MASK	0x7c00	/* Per-vendor ID of 3D enhancement */  /* general purpose */  #define AC97_GP_DRSS_MASK	0x0c00	/* double rate slot select */ @@ -380,7 +385,7 @@  #define AC97_SCAP_DETECT_BY_VENDOR (1<<8) /* use vendor registers for read tests */  #define AC97_SCAP_NO_SPDIF	(1<<9)	/* don't build SPDIF controls */  #define AC97_SCAP_EAPD_LED	(1<<10)	/* EAPD as mute LED */ -#define AC97_SCAP_POWER_SAVE	(1<<11)	/* capable for aggresive power-saving */ +#define AC97_SCAP_POWER_SAVE	(1<<11)	/* capable for aggressive power-saving */  /* ac97->flags */  #define AC97_HAS_PC_BEEP	(1<<0)	/* force PC Speaker usage */ @@ -417,6 +422,7 @@   */  struct snd_ac97; +struct snd_pcm_chmap;  struct snd_ac97_build_ops {  	int (*build_3d) (struct snd_ac97 *ac97); @@ -477,7 +483,7 @@ struct snd_ac97_template {  struct snd_ac97 {  	/* -- lowlevel (hardware) driver specific -- */ -	struct snd_ac97_build_ops * build_ops; +	const struct snd_ac97_build_ops *build_ops;  	void *private_data;  	void (*private_free) (struct snd_ac97 *ac97);  	/* --- */ @@ -523,6 +529,8 @@ struct snd_ac97 {  	struct delayed_work power_work;  #endif  	struct device dev; + +	struct snd_pcm_chmap *chmaps[2]; /* channel-maps (optional) */  };  #define to_ac97_t(d) container_of(d, struct snd_ac97, dev) diff --git a/include/sound/ad1816a.h b/include/sound/ad1816a.h index d010858c33c..abdf609c591 100644 --- a/include/sound/ad1816a.h +++ b/include/sound/ad1816a.h @@ -20,9 +20,9 @@      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  */ -#include "control.h" -#include "pcm.h" -#include "timer.h" +#include <sound/control.h> +#include <sound/pcm.h> +#include <sound/timer.h>  #define AD1816A_REG(r)			(chip->port + r) @@ -147,6 +147,9 @@ struct snd_ad1816a {  	unsigned int c_dma_size;  	struct snd_timer *timer; +#ifdef CONFIG_PM +	unsigned short image[48]; +#endif  }; @@ -165,11 +168,15 @@ struct snd_ad1816a {  extern int snd_ad1816a_create(struct snd_card *card, unsigned long port,  			      int irq, int dma1, int dma2, -			      struct snd_ad1816a **chip); +			      struct snd_ad1816a *chip);  extern int snd_ad1816a_pcm(struct snd_ad1816a *chip, int device, struct snd_pcm **rpcm);  extern int snd_ad1816a_mixer(struct snd_ad1816a *chip);  extern int snd_ad1816a_timer(struct snd_ad1816a *chip, int device,  			     struct snd_timer **rtimer); +#ifdef CONFIG_PM +extern void snd_ad1816a_suspend(struct snd_ad1816a *chip); +extern void snd_ad1816a_resume(struct snd_ad1816a *chip); +#endif  #endif	/* __SOUND_AD1816A_H */ diff --git a/include/sound/adau1373.h b/include/sound/adau1373.h new file mode 100644 index 00000000000..1b19c766657 --- /dev/null +++ b/include/sound/adau1373.h @@ -0,0 +1,34 @@ +/* + * Analog Devices ADAU1373 Audio Codec drive + * + * Copyright 2011 Analog Devices Inc. + * Author: Lars-Peter Clausen <lars@metafoo.de> + * + * Licensed under the GPL-2 or later. + */ + +#ifndef __SOUND_ADAU1373_H__ +#define __SOUND_ADAU1373_H__ + +enum adau1373_micbias_voltage { +	ADAU1373_MICBIAS_2_9V = 0, +	ADAU1373_MICBIAS_2_2V = 1, +	ADAU1373_MICBIAS_2_6V = 2, +	ADAU1373_MICBIAS_1_8V = 3, +}; + +#define ADAU1373_DRC_SIZE 13 + +struct adau1373_platform_data { +	bool input_differential[4]; +	bool lineout_differential; +	bool lineout_ground_sense; + +	unsigned int num_drc; +	uint8_t drc_setting[3][ADAU1373_DRC_SIZE]; + +	enum adau1373_micbias_voltage micbias1; +	enum adau1373_micbias_voltage micbias2; +}; + +#endif diff --git a/include/sound/aess.h b/include/sound/aess.h new file mode 100644 index 00000000000..cee0d09fadb --- /dev/null +++ b/include/sound/aess.h @@ -0,0 +1,53 @@ +/* + * AESS IP block reset + * + * Copyright (C) 2012 Texas Instruments, Inc. + * Paul Walmsley + * + * 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. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; 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., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + */ +#ifndef __SOUND_AESS_H__ +#define __SOUND_AESS_H__ + +#include <linux/kernel.h> +#include <linux/io.h> + +/* + * AESS_AUTO_GATING_ENABLE_OFFSET: offset in bytes of the AESS IP + *     block's AESS_AUTO_GATING_ENABLE__1 register from the IP block's + *     base address + */ +#define AESS_AUTO_GATING_ENABLE_OFFSET			0x07c + +/* Register bitfields in the AESS_AUTO_GATING_ENABLE__1 register */ +#define AESS_AUTO_GATING_ENABLE_SHIFT			0 + +/** + * aess_enable_autogating - enable AESS internal autogating + * @oh: struct omap_hwmod * + * + * Enable internal autogating on the AESS.  This allows the AESS to + * indicate that it is idle to the OMAP PRCM.  Returns 0. + */ +static inline void aess_enable_autogating(void __iomem *base) +{ +	u32 v; + +	/* Set AESS_AUTO_GATING_ENABLE__1.ENABLE to allow idle entry */ +	v = 1 << AESS_AUTO_GATING_ENABLE_SHIFT; +	writel(v, base + AESS_AUTO_GATING_ENABLE_OFFSET); +} + +#endif /* __SOUND_AESS_H__ */ diff --git a/include/sound/ak4114.h b/include/sound/ak4114.h index 3ce69fd9252..52f02a60dba 100644 --- a/include/sound/ak4114.h +++ b/include/sound/ak4114.h @@ -170,7 +170,7 @@ struct ak4114 {  	void * private_data;  	unsigned int init: 1;  	spinlock_t lock; -	unsigned char regmap[7]; +	unsigned char regmap[6];  	unsigned char txcsb[5];  	struct snd_kcontrol *kctls[AK4114_CONTROLS];  	struct snd_pcm_substream *playback_substream; @@ -189,7 +189,7 @@ struct ak4114 {  int snd_ak4114_create(struct snd_card *card,  		      ak4114_read_t *read, ak4114_write_t *write, -		      const unsigned char pgm[7], const unsigned char txcsb[5], +		      const unsigned char pgm[6], const unsigned char txcsb[5],  		      void *private_data, struct ak4114 **r_ak4114);  void snd_ak4114_reg_write(struct ak4114 *ak4114, unsigned char reg, unsigned char mask, unsigned char val);  void snd_ak4114_reinit(struct ak4114 *ak4114); diff --git a/include/sound/ak4531_codec.h b/include/sound/ak4531_codec.h index 575296cf798..85ea86ea35b 100644 --- a/include/sound/ak4531_codec.h +++ b/include/sound/ak4531_codec.h @@ -25,8 +25,8 @@   *   */ -#include "info.h" -#include "control.h" +#include <sound/info.h> +#include <sound/control.h>  /*   *  ASAHI KASEI - AK4531 codec diff --git a/include/sound/ak4641.h b/include/sound/ak4641.h new file mode 100644 index 00000000000..96d1991c811 --- /dev/null +++ b/include/sound/ak4641.h @@ -0,0 +1,26 @@ +/* + * AK4641 ALSA SoC Codec driver + * + * Copyright 2009 Philipp Zabel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __AK4641_H +#define __AK4641_H + +/** + * struct ak4641_platform_data - platform specific AK4641 configuration + * @gpio_power:	GPIO to control external power to AK4641 + * @gpio_npdn:	GPIO connected to AK4641 nPDN pin + * + * Both GPIO parameters are optional. + */ +struct ak4641_platform_data { +	int gpio_power; +	int gpio_npdn; +}; + +#endif /* __AK4641_H */ diff --git a/include/sound/alc5623.h b/include/sound/alc5623.h new file mode 100644 index 00000000000..422c97d43df --- /dev/null +++ b/include/sound/alc5623.h @@ -0,0 +1,15 @@ +#ifndef _INCLUDE_SOUND_ALC5623_H +#define _INCLUDE_SOUND_ALC5623_H +struct alc5623_platform_data { +	/* configure :                              */ +	/* Lineout/Speaker Amps Vmid ratio control  */ +	/* enable/disable adc/dac high pass filters */ +	unsigned int add_ctrl; +	/* configure :                              */ +	/* output to enable when jack is low        */ +	/* output to enable when jack is high       */ +	/* jack detect (gpio/nc/jack detect [12]    */ +	unsigned int jack_det_ctrl; +}; +#endif + diff --git a/include/sound/asequencer.h b/include/sound/asequencer.h index 1505e6d5ef8..75935ce739c 100644 --- a/include/sound/asequencer.h +++ b/include/sound/asequencer.h @@ -22,294 +22,9 @@  #ifndef __SOUND_ASEQUENCER_H  #define __SOUND_ASEQUENCER_H -#ifdef __KERNEL__  #include <linux/ioctl.h>  #include <sound/asound.h> -#endif - -/** version of the sequencer */ -#define SNDRV_SEQ_VERSION SNDRV_PROTOCOL_VERSION (1, 0, 1) - -/** - * definition of sequencer event types - */ - -/** system messages - * event data type = #snd_seq_result - */ -#define SNDRV_SEQ_EVENT_SYSTEM		0 -#define SNDRV_SEQ_EVENT_RESULT		1 - -/** note messages (channel specific) - * event data type = #snd_seq_ev_note - */ -#define SNDRV_SEQ_EVENT_NOTE		5 -#define SNDRV_SEQ_EVENT_NOTEON		6 -#define SNDRV_SEQ_EVENT_NOTEOFF		7 -#define SNDRV_SEQ_EVENT_KEYPRESS	8 -	 -/** control messages (channel specific) - * event data type = #snd_seq_ev_ctrl - */ -#define SNDRV_SEQ_EVENT_CONTROLLER	10 -#define SNDRV_SEQ_EVENT_PGMCHANGE	11 -#define SNDRV_SEQ_EVENT_CHANPRESS	12 -#define SNDRV_SEQ_EVENT_PITCHBEND	13	/**< from -8192 to 8191 */ -#define SNDRV_SEQ_EVENT_CONTROL14	14	/**< 14 bit controller value */ -#define SNDRV_SEQ_EVENT_NONREGPARAM	15	/**< 14 bit NRPN address + 14 bit unsigned value */ -#define SNDRV_SEQ_EVENT_REGPARAM	16	/**< 14 bit RPN address + 14 bit unsigned value */ - -/** synchronisation messages - * event data type = #snd_seq_ev_ctrl - */ -#define SNDRV_SEQ_EVENT_SONGPOS		20	/* Song Position Pointer with LSB and MSB values */ -#define SNDRV_SEQ_EVENT_SONGSEL		21	/* Song Select with song ID number */ -#define SNDRV_SEQ_EVENT_QFRAME		22	/* midi time code quarter frame */ -#define SNDRV_SEQ_EVENT_TIMESIGN	23	/* SMF Time Signature event */ -#define SNDRV_SEQ_EVENT_KEYSIGN		24	/* SMF Key Signature event */ -	         -/** timer messages - * event data type = snd_seq_ev_queue_control - */ -#define SNDRV_SEQ_EVENT_START		30	/* midi Real Time Start message */ -#define SNDRV_SEQ_EVENT_CONTINUE	31	/* midi Real Time Continue message */ -#define SNDRV_SEQ_EVENT_STOP		32	/* midi Real Time Stop message */	 -#define	SNDRV_SEQ_EVENT_SETPOS_TICK	33	/* set tick queue position */ -#define SNDRV_SEQ_EVENT_SETPOS_TIME	34	/* set realtime queue position */ -#define SNDRV_SEQ_EVENT_TEMPO		35	/* (SMF) Tempo event */ -#define SNDRV_SEQ_EVENT_CLOCK		36	/* midi Real Time Clock message */ -#define SNDRV_SEQ_EVENT_TICK		37	/* midi Real Time Tick message */ -#define SNDRV_SEQ_EVENT_QUEUE_SKEW	38	/* skew queue tempo */ - -/** others - * event data type = none - */ -#define SNDRV_SEQ_EVENT_TUNE_REQUEST	40	/* tune request */ -#define SNDRV_SEQ_EVENT_RESET		41	/* reset to power-on state */ -#define SNDRV_SEQ_EVENT_SENSING		42	/* "active sensing" event */ - -/** echo back, kernel private messages - * event data type = any type - */ -#define SNDRV_SEQ_EVENT_ECHO		50	/* echo event */ -#define SNDRV_SEQ_EVENT_OSS		51	/* OSS raw event */ - -/** system status messages (broadcast for subscribers) - * event data type = snd_seq_addr - */ -#define SNDRV_SEQ_EVENT_CLIENT_START	60	/* new client has connected */ -#define SNDRV_SEQ_EVENT_CLIENT_EXIT	61	/* client has left the system */ -#define SNDRV_SEQ_EVENT_CLIENT_CHANGE	62	/* client status/info has changed */ -#define SNDRV_SEQ_EVENT_PORT_START	63	/* new port was created */ -#define SNDRV_SEQ_EVENT_PORT_EXIT	64	/* port was deleted from system */ -#define SNDRV_SEQ_EVENT_PORT_CHANGE	65	/* port status/info has changed */ - -/** port connection changes - * event data type = snd_seq_connect - */ -#define SNDRV_SEQ_EVENT_PORT_SUBSCRIBED	66	/* ports connected */ -#define SNDRV_SEQ_EVENT_PORT_UNSUBSCRIBED 67	/* ports disconnected */ - -/* 70-89:  synthesizer events - obsoleted */ - -/** user-defined events with fixed length - * event data type = any - */ -#define SNDRV_SEQ_EVENT_USR0		90 -#define SNDRV_SEQ_EVENT_USR1		91 -#define SNDRV_SEQ_EVENT_USR2		92 -#define SNDRV_SEQ_EVENT_USR3		93 -#define SNDRV_SEQ_EVENT_USR4		94 -#define SNDRV_SEQ_EVENT_USR5		95 -#define SNDRV_SEQ_EVENT_USR6		96 -#define SNDRV_SEQ_EVENT_USR7		97 -#define SNDRV_SEQ_EVENT_USR8		98 -#define SNDRV_SEQ_EVENT_USR9		99 - -/* 100-118: instrument layer - obsoleted */ -/* 119-129: reserved */ - -/* 130-139: variable length events - * event data type = snd_seq_ev_ext - * (SNDRV_SEQ_EVENT_LENGTH_VARIABLE must be set) - */ -#define SNDRV_SEQ_EVENT_SYSEX		130	/* system exclusive data (variable length) */ -#define SNDRV_SEQ_EVENT_BOUNCE		131	/* error event */ -/* 132-134: reserved */ -#define SNDRV_SEQ_EVENT_USR_VAR0	135 -#define SNDRV_SEQ_EVENT_USR_VAR1	136 -#define SNDRV_SEQ_EVENT_USR_VAR2	137 -#define SNDRV_SEQ_EVENT_USR_VAR3	138 -#define SNDRV_SEQ_EVENT_USR_VAR4	139 - -/* 150-151: kernel events with quote - DO NOT use in user clients */ -#define SNDRV_SEQ_EVENT_KERNEL_ERROR	150 -#define SNDRV_SEQ_EVENT_KERNEL_QUOTE	151	/* obsolete */ - -/* 152-191: reserved */ - -/* 192-254: hardware specific events */ - -/* 255: special event */ -#define SNDRV_SEQ_EVENT_NONE		255 - - -typedef unsigned char snd_seq_event_type_t; - -/** event address */ -struct snd_seq_addr { -	unsigned char client;	/**< Client number:         0..255, 255 = broadcast to all clients */ -	unsigned char port;	/**< Port within client:    0..255, 255 = broadcast to all ports */ -}; - -/** port connection */ -struct snd_seq_connect { -	struct snd_seq_addr sender; -	struct snd_seq_addr dest; -}; - - -#define SNDRV_SEQ_ADDRESS_UNKNOWN	253	/* unknown source */ -#define SNDRV_SEQ_ADDRESS_SUBSCRIBERS	254	/* send event to all subscribed ports */ -#define SNDRV_SEQ_ADDRESS_BROADCAST	255	/* send event to all queues/clients/ports/channels */ -#define SNDRV_SEQ_QUEUE_DIRECT		253	/* direct dispatch */ - -	/* event mode flag - NOTE: only 8 bits available! */ -#define SNDRV_SEQ_TIME_STAMP_TICK	(0<<0) /* timestamp in clock ticks */ -#define SNDRV_SEQ_TIME_STAMP_REAL	(1<<0) /* timestamp in real time */ -#define SNDRV_SEQ_TIME_STAMP_MASK	(1<<0) - -#define SNDRV_SEQ_TIME_MODE_ABS		(0<<1)	/* absolute timestamp */ -#define SNDRV_SEQ_TIME_MODE_REL		(1<<1)	/* relative to current time */ -#define SNDRV_SEQ_TIME_MODE_MASK	(1<<1) - -#define SNDRV_SEQ_EVENT_LENGTH_FIXED	(0<<2)	/* fixed event size */ -#define SNDRV_SEQ_EVENT_LENGTH_VARIABLE	(1<<2)	/* variable event size */ -#define SNDRV_SEQ_EVENT_LENGTH_VARUSR	(2<<2)	/* variable event size - user memory space */ -#define SNDRV_SEQ_EVENT_LENGTH_MASK	(3<<2) - -#define SNDRV_SEQ_PRIORITY_NORMAL	(0<<4)	/* normal priority */ -#define SNDRV_SEQ_PRIORITY_HIGH		(1<<4)	/* event should be processed before others */ -#define SNDRV_SEQ_PRIORITY_MASK		(1<<4) - - -	/* note event */ -struct snd_seq_ev_note { -	unsigned char channel; -	unsigned char note; -	unsigned char velocity; -	unsigned char off_velocity;	/* only for SNDRV_SEQ_EVENT_NOTE */ -	unsigned int duration;		/* only for SNDRV_SEQ_EVENT_NOTE */ -}; - -	/* controller event */ -struct snd_seq_ev_ctrl { -	unsigned char channel; -	unsigned char unused1, unused2, unused3;	/* pad */ -	unsigned int param; -	signed int value; -}; - -	/* generic set of bytes (12x8 bit) */ -struct snd_seq_ev_raw8 { -	unsigned char d[12];	/* 8 bit value */ -}; - -	/* generic set of integers (3x32 bit) */ -struct snd_seq_ev_raw32 { -	unsigned int d[3];	/* 32 bit value */ -}; - -	/* external stored data */ -struct snd_seq_ev_ext { -	unsigned int len;	/* length of data */ -	void *ptr;		/* pointer to data (note: maybe 64-bit) */ -} __attribute__((packed)); - -struct snd_seq_result { -	int event;		/* processed event type */ -	int result; -}; - - -struct snd_seq_real_time { -	unsigned int tv_sec;	/* seconds */ -	unsigned int tv_nsec;	/* nanoseconds */ -}; - -typedef unsigned int snd_seq_tick_time_t;	/* midi ticks */ - -union snd_seq_timestamp { -	snd_seq_tick_time_t tick; -	struct snd_seq_real_time time; -}; - -struct snd_seq_queue_skew { -	unsigned int value; -	unsigned int base; -}; - -	/* queue timer control */ -struct snd_seq_ev_queue_control { -	unsigned char queue;			/* affected queue */ -	unsigned char pad[3];			/* reserved */ -	union { -		signed int value;		/* affected value (e.g. tempo) */ -		union snd_seq_timestamp time;	/* time */ -		unsigned int position;		/* sync position */ -		struct snd_seq_queue_skew skew; -		unsigned int d32[2]; -		unsigned char d8[8]; -	} param; -}; - -	/* quoted event - inside the kernel only */ -struct snd_seq_ev_quote { -	struct snd_seq_addr origin;		/* original sender */ -	unsigned short value;		/* optional data */ -	struct snd_seq_event *event;		/* quoted event */ -} __attribute__((packed)); - - -	/* sequencer event */ -struct snd_seq_event { -	snd_seq_event_type_t type;	/* event type */ -	unsigned char flags;		/* event flags */ -	char tag; -	 -	unsigned char queue;		/* schedule queue */ -	union snd_seq_timestamp time;	/* schedule time */ - - -	struct snd_seq_addr source;	/* source address */ -	struct snd_seq_addr dest;	/* destination address */ - -	union {				/* event data... */ -		struct snd_seq_ev_note note; -		struct snd_seq_ev_ctrl control; -		struct snd_seq_ev_raw8 raw8; -		struct snd_seq_ev_raw32 raw32; -		struct snd_seq_ev_ext ext; -		struct snd_seq_ev_queue_control queue; -		union snd_seq_timestamp time; -		struct snd_seq_addr addr; -		struct snd_seq_connect connect; -		struct snd_seq_result result; -		struct snd_seq_ev_quote quote; -	} data; -}; - - -/* - * bounce event - stored as variable size data - */ -struct snd_seq_event_bounce { -	int err; -	struct snd_seq_event event; -	/* external data follows here. */ -}; - -#ifdef __KERNEL__ +#include <uapi/sound/asequencer.h>  /* helper macro */  #define snd_seq_event_bounce_ext_data(ev) ((void*)((char *)(ev)->data.ext.ptr + sizeof(struct snd_seq_event_bounce))) @@ -368,311 +83,4 @@ struct snd_seq_event_bounce {  /* queue sync port */  #define snd_seq_queue_sync_port(q)	((q) + 16) -#endif /* __KERNEL__ */ - -	/* system information */ -struct snd_seq_system_info { -	int queues;			/* maximum queues count */ -	int clients;			/* maximum clients count */ -	int ports;			/* maximum ports per client */ -	int channels;			/* maximum channels per port */ -	int cur_clients;		/* current clients */ -	int cur_queues;			/* current queues */ -	char reserved[24]; -}; - - -	/* system running information */ -struct snd_seq_running_info { -	unsigned char client;		/* client id */ -	unsigned char big_endian;	/* 1 = big-endian */ -	unsigned char cpu_mode;		/* 4 = 32bit, 8 = 64bit */ -	unsigned char pad;		/* reserved */ -	unsigned char reserved[12]; -}; - - -	/* known client numbers */ -#define SNDRV_SEQ_CLIENT_SYSTEM		0 -	/* internal client numbers */ -#define SNDRV_SEQ_CLIENT_DUMMY		14	/* midi through */ -#define SNDRV_SEQ_CLIENT_OSS		15	/* oss sequencer emulator */ - - -	/* client types */ -typedef int __bitwise snd_seq_client_type_t; -#define	NO_CLIENT	((__force snd_seq_client_type_t) 0) -#define	USER_CLIENT	((__force snd_seq_client_type_t) 1) -#define	KERNEL_CLIENT	((__force snd_seq_client_type_t) 2) -                         -	/* event filter flags */ -#define SNDRV_SEQ_FILTER_BROADCAST	(1<<0)	/* accept broadcast messages */ -#define SNDRV_SEQ_FILTER_MULTICAST	(1<<1)	/* accept multicast messages */ -#define SNDRV_SEQ_FILTER_BOUNCE		(1<<2)	/* accept bounce event in error */ -#define SNDRV_SEQ_FILTER_USE_EVENT	(1<<31)	/* use event filter */ - -struct snd_seq_client_info { -	int client;			/* client number to inquire */ -	snd_seq_client_type_t type;	/* client type */ -	char name[64];			/* client name */ -	unsigned int filter;		/* filter flags */ -	unsigned char multicast_filter[8]; /* multicast filter bitmap */ -	unsigned char event_filter[32];	/* event filter bitmap */ -	int num_ports;			/* RO: number of ports */ -	int event_lost;			/* number of lost events */ -	char reserved[64];		/* for future use */ -}; - - -/* client pool size */ -struct snd_seq_client_pool { -	int client;			/* client number to inquire */ -	int output_pool;		/* outgoing (write) pool size */ -	int input_pool;			/* incoming (read) pool size */ -	int output_room;		/* minimum free pool size for select/blocking mode */ -	int output_free;		/* unused size */ -	int input_free;			/* unused size */ -	char reserved[64]; -}; - - -/* Remove events by specified criteria */ - -#define SNDRV_SEQ_REMOVE_INPUT		(1<<0)	/* Flush input queues */ -#define SNDRV_SEQ_REMOVE_OUTPUT		(1<<1)	/* Flush output queues */ -#define SNDRV_SEQ_REMOVE_DEST		(1<<2)	/* Restrict by destination q:client:port */ -#define SNDRV_SEQ_REMOVE_DEST_CHANNEL	(1<<3)	/* Restrict by channel */ -#define SNDRV_SEQ_REMOVE_TIME_BEFORE	(1<<4)	/* Restrict to before time */ -#define SNDRV_SEQ_REMOVE_TIME_AFTER	(1<<5)	/* Restrict to time or after */ -#define SNDRV_SEQ_REMOVE_TIME_TICK	(1<<6)	/* Time is in ticks */ -#define SNDRV_SEQ_REMOVE_EVENT_TYPE	(1<<7)	/* Restrict to event type */ -#define SNDRV_SEQ_REMOVE_IGNORE_OFF 	(1<<8)	/* Do not flush off events */ -#define SNDRV_SEQ_REMOVE_TAG_MATCH 	(1<<9)	/* Restrict to events with given tag */ - -struct snd_seq_remove_events { -	unsigned int  remove_mode;	/* Flags that determine what gets removed */ - -	union snd_seq_timestamp time; - -	unsigned char queue;	/* Queue for REMOVE_DEST */ -	struct snd_seq_addr dest;	/* Address for REMOVE_DEST */ -	unsigned char channel;	/* Channel for REMOVE_DEST */ - -	int  type;	/* For REMOVE_EVENT_TYPE */ -	char  tag;	/* Tag for REMOVE_TAG */ - -	int  reserved[10];	/* To allow for future binary compatibility */ - -}; - - -	/* known port numbers */ -#define SNDRV_SEQ_PORT_SYSTEM_TIMER	0 -#define SNDRV_SEQ_PORT_SYSTEM_ANNOUNCE	1 - -	/* port capabilities (32 bits) */ -#define SNDRV_SEQ_PORT_CAP_READ		(1<<0)	/* readable from this port */ -#define SNDRV_SEQ_PORT_CAP_WRITE	(1<<1)	/* writable to this port */ - -#define SNDRV_SEQ_PORT_CAP_SYNC_READ	(1<<2) -#define SNDRV_SEQ_PORT_CAP_SYNC_WRITE	(1<<3) - -#define SNDRV_SEQ_PORT_CAP_DUPLEX	(1<<4) - -#define SNDRV_SEQ_PORT_CAP_SUBS_READ	(1<<5)	/* allow read subscription */ -#define SNDRV_SEQ_PORT_CAP_SUBS_WRITE	(1<<6)	/* allow write subscription */ -#define SNDRV_SEQ_PORT_CAP_NO_EXPORT	(1<<7)	/* routing not allowed */ - -	/* port type */ -#define SNDRV_SEQ_PORT_TYPE_SPECIFIC	(1<<0)	/* hardware specific */ -#define SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC (1<<1)	/* generic MIDI device */ -#define SNDRV_SEQ_PORT_TYPE_MIDI_GM	(1<<2)	/* General MIDI compatible device */ -#define SNDRV_SEQ_PORT_TYPE_MIDI_GS	(1<<3)	/* GS compatible device */ -#define SNDRV_SEQ_PORT_TYPE_MIDI_XG	(1<<4)	/* XG compatible device */ -#define SNDRV_SEQ_PORT_TYPE_MIDI_MT32	(1<<5)	/* MT-32 compatible device */ -#define SNDRV_SEQ_PORT_TYPE_MIDI_GM2	(1<<6)	/* General MIDI 2 compatible device */ - -/* other standards...*/ -#define SNDRV_SEQ_PORT_TYPE_SYNTH	(1<<10)	/* Synth device (no MIDI compatible - direct wavetable) */ -#define SNDRV_SEQ_PORT_TYPE_DIRECT_SAMPLE (1<<11)	/* Sampling device (support sample download) */ -#define SNDRV_SEQ_PORT_TYPE_SAMPLE	(1<<12)	/* Sampling device (sample can be downloaded at any time) */ -/*...*/ -#define SNDRV_SEQ_PORT_TYPE_HARDWARE	(1<<16)	/* driver for a hardware device */ -#define SNDRV_SEQ_PORT_TYPE_SOFTWARE	(1<<17)	/* implemented in software */ -#define SNDRV_SEQ_PORT_TYPE_SYNTHESIZER	(1<<18)	/* generates sound */ -#define SNDRV_SEQ_PORT_TYPE_PORT	(1<<19)	/* connects to other device(s) */ -#define SNDRV_SEQ_PORT_TYPE_APPLICATION	(1<<20)	/* application (sequencer/editor) */ - -/* misc. conditioning flags */ -#define SNDRV_SEQ_PORT_FLG_GIVEN_PORT	(1<<0) -#define SNDRV_SEQ_PORT_FLG_TIMESTAMP	(1<<1) -#define SNDRV_SEQ_PORT_FLG_TIME_REAL	(1<<2) - -struct snd_seq_port_info { -	struct snd_seq_addr addr;	/* client/port numbers */ -	char name[64];			/* port name */ - -	unsigned int capability;	/* port capability bits */ -	unsigned int type;		/* port type bits */ -	int midi_channels;		/* channels per MIDI port */ -	int midi_voices;		/* voices per MIDI port */ -	int synth_voices;		/* voices per SYNTH port */ - -	int read_use;			/* R/O: subscribers for output (from this port) */ -	int write_use;			/* R/O: subscribers for input (to this port) */ - -	void *kernel;			/* reserved for kernel use (must be NULL) */ -	unsigned int flags;		/* misc. conditioning */ -	unsigned char time_queue;	/* queue # for timestamping */ -	char reserved[59];		/* for future use */ -}; - - -/* queue flags */ -#define SNDRV_SEQ_QUEUE_FLG_SYNC	(1<<0)	/* sync enabled */ - -/* queue information */ -struct snd_seq_queue_info { -	int queue;		/* queue id */ - -	/* -	 *  security settings, only owner of this queue can start/stop timer -	 *  etc. if the queue is locked for other clients -	 */ -	int owner;		/* client id for owner of the queue */ -	unsigned locked:1;	/* timing queue locked for other queues */ -	char name[64];		/* name of this queue */ -	unsigned int flags;	/* flags */ -	char reserved[60];	/* for future use */ - -}; - -/* queue info/status */ -struct snd_seq_queue_status { -	int queue;			/* queue id */ -	int events;			/* read-only - queue size */ -	snd_seq_tick_time_t tick;	/* current tick */ -	struct snd_seq_real_time time;	/* current time */ -	int running;			/* running state of queue */ -	int flags;			/* various flags */ -	char reserved[64];		/* for the future */ -}; - - -/* queue tempo */ -struct snd_seq_queue_tempo { -	int queue;			/* sequencer queue */ -	unsigned int tempo;		/* current tempo, us/tick */ -	int ppq;			/* time resolution, ticks/quarter */ -	unsigned int skew_value;	/* queue skew */ -	unsigned int skew_base;		/* queue skew base */ -	char reserved[24];		/* for the future */ -}; - - -/* sequencer timer sources */ -#define SNDRV_SEQ_TIMER_ALSA		0	/* ALSA timer */ -#define SNDRV_SEQ_TIMER_MIDI_CLOCK	1	/* Midi Clock (CLOCK event) */ -#define SNDRV_SEQ_TIMER_MIDI_TICK	2	/* Midi Timer Tick (TICK event) */ - -/* queue timer info */ -struct snd_seq_queue_timer { -	int queue;			/* sequencer queue */ -	int type;			/* source timer type */ -	union { -		struct { -			struct snd_timer_id id;	/* ALSA's timer ID */ -			unsigned int resolution;	/* resolution in Hz */ -		} alsa; -	} u; -	char reserved[64];		/* for the future use */ -}; - - -struct snd_seq_queue_client { -	int queue;		/* sequencer queue */ -	int client;		/* sequencer client */ -	int used;		/* queue is used with this client -				   (must be set for accepting events) */ -	/* per client watermarks */ -	char reserved[64];	/* for future use */ -}; - - -#define SNDRV_SEQ_PORT_SUBS_EXCLUSIVE	(1<<0)	/* exclusive connection */ -#define SNDRV_SEQ_PORT_SUBS_TIMESTAMP	(1<<1) -#define SNDRV_SEQ_PORT_SUBS_TIME_REAL	(1<<2) - -struct snd_seq_port_subscribe { -	struct snd_seq_addr sender;	/* sender address */ -	struct snd_seq_addr dest;	/* destination address */ -	unsigned int voices;		/* number of voices to be allocated (0 = don't care) */ -	unsigned int flags;		/* modes */ -	unsigned char queue;		/* input time-stamp queue (optional) */ -	unsigned char pad[3];		/* reserved */ -	char reserved[64]; -}; - -/* type of query subscription */ -#define SNDRV_SEQ_QUERY_SUBS_READ	0 -#define SNDRV_SEQ_QUERY_SUBS_WRITE	1 - -struct snd_seq_query_subs { -	struct snd_seq_addr root;	/* client/port id to be searched */ -	int type;		/* READ or WRITE */ -	int index;		/* 0..N-1 */ -	int num_subs;		/* R/O: number of subscriptions on this port */ -	struct snd_seq_addr addr;	/* R/O: result */ -	unsigned char queue;	/* R/O: result */ -	unsigned int flags;	/* R/O: result */ -	char reserved[64];	/* for future use */ -}; - - -/* - *  IOCTL commands - */ - -#define SNDRV_SEQ_IOCTL_PVERSION	_IOR ('S', 0x00, int) -#define SNDRV_SEQ_IOCTL_CLIENT_ID	_IOR ('S', 0x01, int) -#define SNDRV_SEQ_IOCTL_SYSTEM_INFO	_IOWR('S', 0x02, struct snd_seq_system_info) -#define SNDRV_SEQ_IOCTL_RUNNING_MODE	_IOWR('S', 0x03, struct snd_seq_running_info) - -#define SNDRV_SEQ_IOCTL_GET_CLIENT_INFO	_IOWR('S', 0x10, struct snd_seq_client_info) -#define SNDRV_SEQ_IOCTL_SET_CLIENT_INFO	_IOW ('S', 0x11, struct snd_seq_client_info) - -#define SNDRV_SEQ_IOCTL_CREATE_PORT	_IOWR('S', 0x20, struct snd_seq_port_info) -#define SNDRV_SEQ_IOCTL_DELETE_PORT	_IOW ('S', 0x21, struct snd_seq_port_info) -#define SNDRV_SEQ_IOCTL_GET_PORT_INFO	_IOWR('S', 0x22, struct snd_seq_port_info) -#define SNDRV_SEQ_IOCTL_SET_PORT_INFO	_IOW ('S', 0x23, struct snd_seq_port_info) - -#define SNDRV_SEQ_IOCTL_SUBSCRIBE_PORT	_IOW ('S', 0x30, struct snd_seq_port_subscribe) -#define SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT _IOW ('S', 0x31, struct snd_seq_port_subscribe) - -#define SNDRV_SEQ_IOCTL_CREATE_QUEUE	_IOWR('S', 0x32, struct snd_seq_queue_info) -#define SNDRV_SEQ_IOCTL_DELETE_QUEUE	_IOW ('S', 0x33, struct snd_seq_queue_info) -#define SNDRV_SEQ_IOCTL_GET_QUEUE_INFO	_IOWR('S', 0x34, struct snd_seq_queue_info) -#define SNDRV_SEQ_IOCTL_SET_QUEUE_INFO	_IOWR('S', 0x35, struct snd_seq_queue_info) -#define SNDRV_SEQ_IOCTL_GET_NAMED_QUEUE	_IOWR('S', 0x36, struct snd_seq_queue_info) -#define SNDRV_SEQ_IOCTL_GET_QUEUE_STATUS _IOWR('S', 0x40, struct snd_seq_queue_status) -#define SNDRV_SEQ_IOCTL_GET_QUEUE_TEMPO	_IOWR('S', 0x41, struct snd_seq_queue_tempo) -#define SNDRV_SEQ_IOCTL_SET_QUEUE_TEMPO	_IOW ('S', 0x42, struct snd_seq_queue_tempo) -#define SNDRV_SEQ_IOCTL_GET_QUEUE_OWNER	_IOWR('S', 0x43, struct snd_seq_queue_owner) -#define SNDRV_SEQ_IOCTL_SET_QUEUE_OWNER	_IOW ('S', 0x44, struct snd_seq_queue_owner) -#define SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER	_IOWR('S', 0x45, struct snd_seq_queue_timer) -#define SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER	_IOW ('S', 0x46, struct snd_seq_queue_timer) -/* XXX -#define SNDRV_SEQ_IOCTL_GET_QUEUE_SYNC	_IOWR('S', 0x53, struct snd_seq_queue_sync) -#define SNDRV_SEQ_IOCTL_SET_QUEUE_SYNC	_IOW ('S', 0x54, struct snd_seq_queue_sync) -*/ -#define SNDRV_SEQ_IOCTL_GET_QUEUE_CLIENT	_IOWR('S', 0x49, struct snd_seq_queue_client) -#define SNDRV_SEQ_IOCTL_SET_QUEUE_CLIENT	_IOW ('S', 0x4a, struct snd_seq_queue_client) -#define SNDRV_SEQ_IOCTL_GET_CLIENT_POOL	_IOWR('S', 0x4b, struct snd_seq_client_pool) -#define SNDRV_SEQ_IOCTL_SET_CLIENT_POOL	_IOW ('S', 0x4c, struct snd_seq_client_pool) -#define SNDRV_SEQ_IOCTL_REMOVE_EVENTS	_IOW ('S', 0x4e, struct snd_seq_remove_events) -#define SNDRV_SEQ_IOCTL_QUERY_SUBS	_IOWR('S', 0x4f, struct snd_seq_query_subs) -#define SNDRV_SEQ_IOCTL_GET_SUBSCRIPTION	_IOWR('S', 0x50, struct snd_seq_port_subscribe) -#define SNDRV_SEQ_IOCTL_QUERY_NEXT_CLIENT	_IOWR('S', 0x51, struct snd_seq_client_info) -#define SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT	_IOWR('S', 0x52, struct snd_seq_port_info) -  #endif /* __SOUND_ASEQUENCER_H */ diff --git a/include/sound/asound.h b/include/sound/asound.h index a1803ecea34..c2dff5369d3 100644 --- a/include/sound/asound.h +++ b/include/sound/asound.h @@ -19,13 +19,9 @@   *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   *   */ -  #ifndef __SOUND_ASOUND_H  #define __SOUND_ASOUND_H -#include <linux/types.h> - -#ifdef __KERNEL__  #include <linux/ioctl.h>  #include <linux/time.h>  #include <asm/byteorder.h> @@ -40,876 +36,5 @@  #endif  #endif -#endif /* __KERNEL__ **/ - -/* - *  protocol version - */ - -#define SNDRV_PROTOCOL_VERSION(major, minor, subminor) (((major)<<16)|((minor)<<8)|(subminor)) -#define SNDRV_PROTOCOL_MAJOR(version) (((version)>>16)&0xffff) -#define SNDRV_PROTOCOL_MINOR(version) (((version)>>8)&0xff) -#define SNDRV_PROTOCOL_MICRO(version) ((version)&0xff) -#define SNDRV_PROTOCOL_INCOMPATIBLE(kversion, uversion) \ -	(SNDRV_PROTOCOL_MAJOR(kversion) != SNDRV_PROTOCOL_MAJOR(uversion) || \ -	 (SNDRV_PROTOCOL_MAJOR(kversion) == SNDRV_PROTOCOL_MAJOR(uversion) && \ -	   SNDRV_PROTOCOL_MINOR(kversion) != SNDRV_PROTOCOL_MINOR(uversion))) - -/**************************************************************************** - *                                                                          * - *        Digital audio interface					    * - *                                                                          * - ****************************************************************************/ - -struct snd_aes_iec958 { -	unsigned char status[24];	/* AES/IEC958 channel status bits */ -	unsigned char subcode[147];	/* AES/IEC958 subcode bits */ -	unsigned char pad;		/* nothing */ -	unsigned char dig_subframe[4];	/* AES/IEC958 subframe bits */ -}; - -/**************************************************************************** - *                                                                          * - *      Section for driver hardware dependent interface - /dev/snd/hw?      * - *                                                                          * - ****************************************************************************/ - -#define SNDRV_HWDEP_VERSION		SNDRV_PROTOCOL_VERSION(1, 0, 1) - -enum { -	SNDRV_HWDEP_IFACE_OPL2 = 0, -	SNDRV_HWDEP_IFACE_OPL3, -	SNDRV_HWDEP_IFACE_OPL4, -	SNDRV_HWDEP_IFACE_SB16CSP,	/* Creative Signal Processor */ -	SNDRV_HWDEP_IFACE_EMU10K1,	/* FX8010 processor in EMU10K1 chip */ -	SNDRV_HWDEP_IFACE_YSS225,	/* Yamaha FX processor */ -	SNDRV_HWDEP_IFACE_ICS2115,	/* Wavetable synth */ -	SNDRV_HWDEP_IFACE_SSCAPE,	/* Ensoniq SoundScape ISA card (MC68EC000) */ -	SNDRV_HWDEP_IFACE_VX,		/* Digigram VX cards */ -	SNDRV_HWDEP_IFACE_MIXART,	/* Digigram miXart cards */ -	SNDRV_HWDEP_IFACE_USX2Y,	/* Tascam US122, US224 & US428 usb */ -	SNDRV_HWDEP_IFACE_EMUX_WAVETABLE, /* EmuX wavetable */	 -	SNDRV_HWDEP_IFACE_BLUETOOTH,	/* Bluetooth audio */ -	SNDRV_HWDEP_IFACE_USX2Y_PCM,	/* Tascam US122, US224 & US428 rawusb pcm */ -	SNDRV_HWDEP_IFACE_PCXHR,	/* Digigram PCXHR */ -	SNDRV_HWDEP_IFACE_SB_RC,	/* SB Extigy/Audigy2NX remote control */ -	SNDRV_HWDEP_IFACE_HDA,		/* HD-audio */ -	SNDRV_HWDEP_IFACE_USB_STREAM,	/* direct access to usb stream */ - -	/* Don't forget to change the following: */ -	SNDRV_HWDEP_IFACE_LAST = SNDRV_HWDEP_IFACE_USB_STREAM -}; - -struct snd_hwdep_info { -	unsigned int device;		/* WR: device number */ -	int card;			/* R: card number */ -	unsigned char id[64];		/* ID (user selectable) */ -	unsigned char name[80];		/* hwdep name */ -	int iface;			/* hwdep interface */ -	unsigned char reserved[64];	/* reserved for future */ -}; - -/* generic DSP loader */ -struct snd_hwdep_dsp_status { -	unsigned int version;		/* R: driver-specific version */ -	unsigned char id[32];		/* R: driver-specific ID string */ -	unsigned int num_dsps;		/* R: number of DSP images to transfer */ -	unsigned int dsp_loaded;	/* R: bit flags indicating the loaded DSPs */ -	unsigned int chip_ready;	/* R: 1 = initialization finished */ -	unsigned char reserved[16];	/* reserved for future use */ -}; - -struct snd_hwdep_dsp_image { -	unsigned int index;		/* W: DSP index */ -	unsigned char name[64];		/* W: ID (e.g. file name) */ -	unsigned char __user *image;	/* W: binary image */ -	size_t length;			/* W: size of image in bytes */ -	unsigned long driver_data;	/* W: driver-specific data */ -}; - -#define SNDRV_HWDEP_IOCTL_PVERSION	_IOR ('H', 0x00, int) -#define SNDRV_HWDEP_IOCTL_INFO		_IOR ('H', 0x01, struct snd_hwdep_info) -#define SNDRV_HWDEP_IOCTL_DSP_STATUS	_IOR('H', 0x02, struct snd_hwdep_dsp_status) -#define SNDRV_HWDEP_IOCTL_DSP_LOAD	_IOW('H', 0x03, struct snd_hwdep_dsp_image) - -/***************************************************************************** - *                                                                           * - *             Digital Audio (PCM) interface - /dev/snd/pcm??                * - *                                                                           * - *****************************************************************************/ - -#define SNDRV_PCM_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 10) - -typedef unsigned long snd_pcm_uframes_t; -typedef signed long snd_pcm_sframes_t; - -enum { -	SNDRV_PCM_CLASS_GENERIC = 0,	/* standard mono or stereo device */ -	SNDRV_PCM_CLASS_MULTI,		/* multichannel device */ -	SNDRV_PCM_CLASS_MODEM,		/* software modem class */ -	SNDRV_PCM_CLASS_DIGITIZER,	/* digitizer class */ -	/* Don't forget to change the following: */ -	SNDRV_PCM_CLASS_LAST = SNDRV_PCM_CLASS_DIGITIZER, -}; - -enum { -	SNDRV_PCM_SUBCLASS_GENERIC_MIX = 0, /* mono or stereo subdevices are mixed together */ -	SNDRV_PCM_SUBCLASS_MULTI_MIX,	/* multichannel subdevices are mixed together */ -	/* Don't forget to change the following: */ -	SNDRV_PCM_SUBCLASS_LAST = SNDRV_PCM_SUBCLASS_MULTI_MIX, -}; - -enum { -	SNDRV_PCM_STREAM_PLAYBACK = 0, -	SNDRV_PCM_STREAM_CAPTURE, -	SNDRV_PCM_STREAM_LAST = SNDRV_PCM_STREAM_CAPTURE, -}; - -typedef int __bitwise snd_pcm_access_t; -#define	SNDRV_PCM_ACCESS_MMAP_INTERLEAVED	((__force snd_pcm_access_t) 0) /* interleaved mmap */ -#define	SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED	((__force snd_pcm_access_t) 1) /* noninterleaved mmap */ -#define	SNDRV_PCM_ACCESS_MMAP_COMPLEX		((__force snd_pcm_access_t) 2) /* complex mmap */ -#define	SNDRV_PCM_ACCESS_RW_INTERLEAVED		((__force snd_pcm_access_t) 3) /* readi/writei */ -#define	SNDRV_PCM_ACCESS_RW_NONINTERLEAVED	((__force snd_pcm_access_t) 4) /* readn/writen */ -#define	SNDRV_PCM_ACCESS_LAST		SNDRV_PCM_ACCESS_RW_NONINTERLEAVED - -typedef int __bitwise snd_pcm_format_t; -#define	SNDRV_PCM_FORMAT_S8	((__force snd_pcm_format_t) 0) -#define	SNDRV_PCM_FORMAT_U8	((__force snd_pcm_format_t) 1) -#define	SNDRV_PCM_FORMAT_S16_LE	((__force snd_pcm_format_t) 2) -#define	SNDRV_PCM_FORMAT_S16_BE	((__force snd_pcm_format_t) 3) -#define	SNDRV_PCM_FORMAT_U16_LE	((__force snd_pcm_format_t) 4) -#define	SNDRV_PCM_FORMAT_U16_BE	((__force snd_pcm_format_t) 5) -#define	SNDRV_PCM_FORMAT_S24_LE	((__force snd_pcm_format_t) 6) /* low three bytes */ -#define	SNDRV_PCM_FORMAT_S24_BE	((__force snd_pcm_format_t) 7) /* low three bytes */ -#define	SNDRV_PCM_FORMAT_U24_LE	((__force snd_pcm_format_t) 8) /* low three bytes */ -#define	SNDRV_PCM_FORMAT_U24_BE	((__force snd_pcm_format_t) 9) /* low three bytes */ -#define	SNDRV_PCM_FORMAT_S32_LE	((__force snd_pcm_format_t) 10) -#define	SNDRV_PCM_FORMAT_S32_BE	((__force snd_pcm_format_t) 11) -#define	SNDRV_PCM_FORMAT_U32_LE	((__force snd_pcm_format_t) 12) -#define	SNDRV_PCM_FORMAT_U32_BE	((__force snd_pcm_format_t) 13) -#define	SNDRV_PCM_FORMAT_FLOAT_LE	((__force snd_pcm_format_t) 14) /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */ -#define	SNDRV_PCM_FORMAT_FLOAT_BE	((__force snd_pcm_format_t) 15) /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */ -#define	SNDRV_PCM_FORMAT_FLOAT64_LE	((__force snd_pcm_format_t) 16) /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */ -#define	SNDRV_PCM_FORMAT_FLOAT64_BE	((__force snd_pcm_format_t) 17) /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */ -#define	SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE ((__force snd_pcm_format_t) 18) /* IEC-958 subframe, Little Endian */ -#define	SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE ((__force snd_pcm_format_t) 19) /* IEC-958 subframe, Big Endian */ -#define	SNDRV_PCM_FORMAT_MU_LAW		((__force snd_pcm_format_t) 20) -#define	SNDRV_PCM_FORMAT_A_LAW		((__force snd_pcm_format_t) 21) -#define	SNDRV_PCM_FORMAT_IMA_ADPCM	((__force snd_pcm_format_t) 22) -#define	SNDRV_PCM_FORMAT_MPEG		((__force snd_pcm_format_t) 23) -#define	SNDRV_PCM_FORMAT_GSM		((__force snd_pcm_format_t) 24) -#define	SNDRV_PCM_FORMAT_SPECIAL	((__force snd_pcm_format_t) 31) -#define	SNDRV_PCM_FORMAT_S24_3LE	((__force snd_pcm_format_t) 32)	/* in three bytes */ -#define	SNDRV_PCM_FORMAT_S24_3BE	((__force snd_pcm_format_t) 33)	/* in three bytes */ -#define	SNDRV_PCM_FORMAT_U24_3LE	((__force snd_pcm_format_t) 34)	/* in three bytes */ -#define	SNDRV_PCM_FORMAT_U24_3BE	((__force snd_pcm_format_t) 35)	/* in three bytes */ -#define	SNDRV_PCM_FORMAT_S20_3LE	((__force snd_pcm_format_t) 36)	/* in three bytes */ -#define	SNDRV_PCM_FORMAT_S20_3BE	((__force snd_pcm_format_t) 37)	/* in three bytes */ -#define	SNDRV_PCM_FORMAT_U20_3LE	((__force snd_pcm_format_t) 38)	/* in three bytes */ -#define	SNDRV_PCM_FORMAT_U20_3BE	((__force snd_pcm_format_t) 39)	/* in three bytes */ -#define	SNDRV_PCM_FORMAT_S18_3LE	((__force snd_pcm_format_t) 40)	/* in three bytes */ -#define	SNDRV_PCM_FORMAT_S18_3BE	((__force snd_pcm_format_t) 41)	/* in three bytes */ -#define	SNDRV_PCM_FORMAT_U18_3LE	((__force snd_pcm_format_t) 42)	/* in three bytes */ -#define	SNDRV_PCM_FORMAT_U18_3BE	((__force snd_pcm_format_t) 43)	/* in three bytes */ -#define	SNDRV_PCM_FORMAT_G723_24	((__force snd_pcm_format_t) 44) /* 8 samples in 3 bytes */ -#define	SNDRV_PCM_FORMAT_G723_24_1B	((__force snd_pcm_format_t) 45) /* 1 sample in 1 byte */ -#define	SNDRV_PCM_FORMAT_G723_40	((__force snd_pcm_format_t) 46) /* 8 Samples in 5 bytes */ -#define	SNDRV_PCM_FORMAT_G723_40_1B	((__force snd_pcm_format_t) 47) /* 1 sample in 1 byte */ -#define	SNDRV_PCM_FORMAT_LAST		SNDRV_PCM_FORMAT_G723_40_1B - -#ifdef SNDRV_LITTLE_ENDIAN -#define	SNDRV_PCM_FORMAT_S16		SNDRV_PCM_FORMAT_S16_LE -#define	SNDRV_PCM_FORMAT_U16		SNDRV_PCM_FORMAT_U16_LE -#define	SNDRV_PCM_FORMAT_S24		SNDRV_PCM_FORMAT_S24_LE -#define	SNDRV_PCM_FORMAT_U24		SNDRV_PCM_FORMAT_U24_LE -#define	SNDRV_PCM_FORMAT_S32		SNDRV_PCM_FORMAT_S32_LE -#define	SNDRV_PCM_FORMAT_U32		SNDRV_PCM_FORMAT_U32_LE -#define	SNDRV_PCM_FORMAT_FLOAT		SNDRV_PCM_FORMAT_FLOAT_LE -#define	SNDRV_PCM_FORMAT_FLOAT64	SNDRV_PCM_FORMAT_FLOAT64_LE -#define	SNDRV_PCM_FORMAT_IEC958_SUBFRAME SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE -#endif -#ifdef SNDRV_BIG_ENDIAN -#define	SNDRV_PCM_FORMAT_S16		SNDRV_PCM_FORMAT_S16_BE -#define	SNDRV_PCM_FORMAT_U16		SNDRV_PCM_FORMAT_U16_BE -#define	SNDRV_PCM_FORMAT_S24		SNDRV_PCM_FORMAT_S24_BE -#define	SNDRV_PCM_FORMAT_U24		SNDRV_PCM_FORMAT_U24_BE -#define	SNDRV_PCM_FORMAT_S32		SNDRV_PCM_FORMAT_S32_BE -#define	SNDRV_PCM_FORMAT_U32		SNDRV_PCM_FORMAT_U32_BE -#define	SNDRV_PCM_FORMAT_FLOAT		SNDRV_PCM_FORMAT_FLOAT_BE -#define	SNDRV_PCM_FORMAT_FLOAT64	SNDRV_PCM_FORMAT_FLOAT64_BE -#define	SNDRV_PCM_FORMAT_IEC958_SUBFRAME SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE -#endif - -typedef int __bitwise snd_pcm_subformat_t; -#define	SNDRV_PCM_SUBFORMAT_STD		((__force snd_pcm_subformat_t) 0) -#define	SNDRV_PCM_SUBFORMAT_LAST	SNDRV_PCM_SUBFORMAT_STD - -#define SNDRV_PCM_INFO_MMAP		0x00000001	/* hardware supports mmap */ -#define SNDRV_PCM_INFO_MMAP_VALID	0x00000002	/* period data are valid during transfer */ -#define SNDRV_PCM_INFO_DOUBLE		0x00000004	/* Double buffering needed for PCM start/stop */ -#define SNDRV_PCM_INFO_BATCH		0x00000010	/* double buffering */ -#define SNDRV_PCM_INFO_INTERLEAVED	0x00000100	/* channels are interleaved */ -#define SNDRV_PCM_INFO_NONINTERLEAVED	0x00000200	/* channels are not interleaved */ -#define SNDRV_PCM_INFO_COMPLEX		0x00000400	/* complex frame organization (mmap only) */ -#define SNDRV_PCM_INFO_BLOCK_TRANSFER	0x00010000	/* hardware transfer block of samples */ -#define SNDRV_PCM_INFO_OVERRANGE	0x00020000	/* hardware supports ADC (capture) overrange detection */ -#define SNDRV_PCM_INFO_RESUME		0x00040000	/* hardware supports stream resume after suspend */ -#define SNDRV_PCM_INFO_PAUSE		0x00080000	/* pause ioctl is supported */ -#define SNDRV_PCM_INFO_HALF_DUPLEX	0x00100000	/* only half duplex */ -#define SNDRV_PCM_INFO_JOINT_DUPLEX	0x00200000	/* playback and capture stream are somewhat correlated */ -#define SNDRV_PCM_INFO_SYNC_START	0x00400000	/* pcm support some kind of sync go */ -#define SNDRV_PCM_INFO_FIFO_IN_FRAMES	0x80000000	/* internal kernel flag - FIFO size is in frames */ - -typedef int __bitwise snd_pcm_state_t; -#define	SNDRV_PCM_STATE_OPEN		((__force snd_pcm_state_t) 0) /* stream is open */ -#define	SNDRV_PCM_STATE_SETUP		((__force snd_pcm_state_t) 1) /* stream has a setup */ -#define	SNDRV_PCM_STATE_PREPARED	((__force snd_pcm_state_t) 2) /* stream is ready to start */ -#define	SNDRV_PCM_STATE_RUNNING		((__force snd_pcm_state_t) 3) /* stream is running */ -#define	SNDRV_PCM_STATE_XRUN		((__force snd_pcm_state_t) 4) /* stream reached an xrun */ -#define	SNDRV_PCM_STATE_DRAINING	((__force snd_pcm_state_t) 5) /* stream is draining */ -#define	SNDRV_PCM_STATE_PAUSED		((__force snd_pcm_state_t) 6) /* stream is paused */ -#define	SNDRV_PCM_STATE_SUSPENDED	((__force snd_pcm_state_t) 7) /* hardware is suspended */ -#define	SNDRV_PCM_STATE_DISCONNECTED	((__force snd_pcm_state_t) 8) /* hardware is disconnected */ -#define	SNDRV_PCM_STATE_LAST		SNDRV_PCM_STATE_DISCONNECTED - -enum { -	SNDRV_PCM_MMAP_OFFSET_DATA = 0x00000000, -	SNDRV_PCM_MMAP_OFFSET_STATUS = 0x80000000, -	SNDRV_PCM_MMAP_OFFSET_CONTROL = 0x81000000, -}; - -union snd_pcm_sync_id { -	unsigned char id[16]; -	unsigned short id16[8]; -	unsigned int id32[4]; -}; - -struct snd_pcm_info { -	unsigned int device;		/* RO/WR (control): device number */ -	unsigned int subdevice;		/* RO/WR (control): subdevice number */ -	int stream;			/* RO/WR (control): stream direction */ -	int card;			/* R: card number */ -	unsigned char id[64];		/* ID (user selectable) */ -	unsigned char name[80];		/* name of this device */ -	unsigned char subname[32];	/* subdevice name */ -	int dev_class;			/* SNDRV_PCM_CLASS_* */ -	int dev_subclass;		/* SNDRV_PCM_SUBCLASS_* */ -	unsigned int subdevices_count; -	unsigned int subdevices_avail; -	union snd_pcm_sync_id sync;	/* hardware synchronization ID */ -	unsigned char reserved[64];	/* reserved for future... */ -}; - -typedef int snd_pcm_hw_param_t; -#define	SNDRV_PCM_HW_PARAM_ACCESS	0	/* Access type */ -#define	SNDRV_PCM_HW_PARAM_FORMAT	1	/* Format */ -#define	SNDRV_PCM_HW_PARAM_SUBFORMAT	2	/* Subformat */ -#define	SNDRV_PCM_HW_PARAM_FIRST_MASK	SNDRV_PCM_HW_PARAM_ACCESS -#define	SNDRV_PCM_HW_PARAM_LAST_MASK	SNDRV_PCM_HW_PARAM_SUBFORMAT - -#define	SNDRV_PCM_HW_PARAM_SAMPLE_BITS	8	/* Bits per sample */ -#define	SNDRV_PCM_HW_PARAM_FRAME_BITS	9	/* Bits per frame */ -#define	SNDRV_PCM_HW_PARAM_CHANNELS	10	/* Channels */ -#define	SNDRV_PCM_HW_PARAM_RATE		11	/* Approx rate */ -#define	SNDRV_PCM_HW_PARAM_PERIOD_TIME	12	/* Approx distance between -						 * interrupts in us -						 */ -#define	SNDRV_PCM_HW_PARAM_PERIOD_SIZE	13	/* Approx frames between -						 * interrupts -						 */ -#define	SNDRV_PCM_HW_PARAM_PERIOD_BYTES	14	/* Approx bytes between -						 * interrupts -						 */ -#define	SNDRV_PCM_HW_PARAM_PERIODS	15	/* Approx interrupts per -						 * buffer -						 */ -#define	SNDRV_PCM_HW_PARAM_BUFFER_TIME	16	/* Approx duration of buffer -						 * in us -						 */ -#define	SNDRV_PCM_HW_PARAM_BUFFER_SIZE	17	/* Size of buffer in frames */ -#define	SNDRV_PCM_HW_PARAM_BUFFER_BYTES	18	/* Size of buffer in bytes */ -#define	SNDRV_PCM_HW_PARAM_TICK_TIME	19	/* Approx tick duration in us */ -#define	SNDRV_PCM_HW_PARAM_FIRST_INTERVAL	SNDRV_PCM_HW_PARAM_SAMPLE_BITS -#define	SNDRV_PCM_HW_PARAM_LAST_INTERVAL	SNDRV_PCM_HW_PARAM_TICK_TIME - -#define SNDRV_PCM_HW_PARAMS_NORESAMPLE	(1<<0)	/* avoid rate resampling */ - -struct snd_interval { -	unsigned int min, max; -	unsigned int openmin:1, -		     openmax:1, -		     integer:1, -		     empty:1; -}; - -#define SNDRV_MASK_MAX	256 - -struct snd_mask { -	__u32 bits[(SNDRV_MASK_MAX+31)/32]; -}; - -struct snd_pcm_hw_params { -	unsigned int flags; -	struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK -  -			       SNDRV_PCM_HW_PARAM_FIRST_MASK + 1]; -	struct snd_mask mres[5];	/* reserved masks */ -	struct snd_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL - -				        SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1]; -	struct snd_interval ires[9];	/* reserved intervals */ -	unsigned int rmask;		/* W: requested masks */ -	unsigned int cmask;		/* R: changed masks */ -	unsigned int info;		/* R: Info flags for returned setup */ -	unsigned int msbits;		/* R: used most significant bits */ -	unsigned int rate_num;		/* R: rate numerator */ -	unsigned int rate_den;		/* R: rate denominator */ -	snd_pcm_uframes_t fifo_size;	/* R: chip FIFO size in frames */ -	unsigned char reserved[64];	/* reserved for future */ -}; - -enum { -	SNDRV_PCM_TSTAMP_NONE = 0, -	SNDRV_PCM_TSTAMP_ENABLE, -	SNDRV_PCM_TSTAMP_LAST = SNDRV_PCM_TSTAMP_ENABLE, -}; - -struct snd_pcm_sw_params { -	int tstamp_mode;			/* timestamp mode */ -	unsigned int period_step; -	unsigned int sleep_min;			/* min ticks to sleep */ -	snd_pcm_uframes_t avail_min;		/* min avail frames for wakeup */ -	snd_pcm_uframes_t xfer_align;		/* obsolete: xfer size need to be a multiple */ -	snd_pcm_uframes_t start_threshold;	/* min hw_avail frames for automatic start */ -	snd_pcm_uframes_t stop_threshold;	/* min avail frames for automatic stop */ -	snd_pcm_uframes_t silence_threshold;	/* min distance from noise for silence filling */ -	snd_pcm_uframes_t silence_size;		/* silence block size */ -	snd_pcm_uframes_t boundary;		/* pointers wrap point */ -	unsigned char reserved[64];		/* reserved for future */ -}; - -struct snd_pcm_channel_info { -	unsigned int channel; -	__kernel_off_t offset;		/* mmap offset */ -	unsigned int first;		/* offset to first sample in bits */ -	unsigned int step;		/* samples distance in bits */ -}; - -struct snd_pcm_status { -	snd_pcm_state_t state;		/* stream state */ -	struct timespec trigger_tstamp;	/* time when stream was started/stopped/paused */ -	struct timespec tstamp;		/* reference timestamp */ -	snd_pcm_uframes_t appl_ptr;	/* appl ptr */ -	snd_pcm_uframes_t hw_ptr;	/* hw ptr */ -	snd_pcm_sframes_t delay;	/* current delay in frames */ -	snd_pcm_uframes_t avail;	/* number of frames available */ -	snd_pcm_uframes_t avail_max;	/* max frames available on hw since last status */ -	snd_pcm_uframes_t overrange;	/* count of ADC (capture) overrange detections from last status */ -	snd_pcm_state_t suspended_state; /* suspended stream state */ -	unsigned char reserved[60];	/* must be filled with zero */ -}; - -struct snd_pcm_mmap_status { -	snd_pcm_state_t state;		/* RO: state - SNDRV_PCM_STATE_XXXX */ -	int pad1;			/* Needed for 64 bit alignment */ -	snd_pcm_uframes_t hw_ptr;	/* RO: hw ptr (0...boundary-1) */ -	struct timespec tstamp;		/* Timestamp */ -	snd_pcm_state_t suspended_state; /* RO: suspended stream state */ -}; - -struct snd_pcm_mmap_control { -	snd_pcm_uframes_t appl_ptr;	/* RW: appl ptr (0...boundary-1) */ -	snd_pcm_uframes_t avail_min;	/* RW: min available frames for wakeup */ -}; - -#define SNDRV_PCM_SYNC_PTR_HWSYNC	(1<<0)	/* execute hwsync */ -#define SNDRV_PCM_SYNC_PTR_APPL		(1<<1)	/* get appl_ptr from driver (r/w op) */ -#define SNDRV_PCM_SYNC_PTR_AVAIL_MIN	(1<<2)	/* get avail_min from driver */ - -struct snd_pcm_sync_ptr { -	unsigned int flags; -	union { -		struct snd_pcm_mmap_status status; -		unsigned char reserved[64]; -	} s; -	union { -		struct snd_pcm_mmap_control control; -		unsigned char reserved[64]; -	} c; -}; - -struct snd_xferi { -	snd_pcm_sframes_t result; -	void __user *buf; -	snd_pcm_uframes_t frames; -}; - -struct snd_xfern { -	snd_pcm_sframes_t result; -	void __user * __user *bufs; -	snd_pcm_uframes_t frames; -}; - -enum { -	SNDRV_PCM_TSTAMP_TYPE_GETTIMEOFDAY = 0,	/* gettimeofday equivalent */ -	SNDRV_PCM_TSTAMP_TYPE_MONOTONIC,	/* posix_clock_monotonic equivalent */ -	SNDRV_PCM_TSTAMP_TYPE_LAST = SNDRV_PCM_TSTAMP_TYPE_MONOTONIC, -}; - -#define SNDRV_PCM_IOCTL_PVERSION	_IOR('A', 0x00, int) -#define SNDRV_PCM_IOCTL_INFO		_IOR('A', 0x01, struct snd_pcm_info) -#define SNDRV_PCM_IOCTL_TSTAMP		_IOW('A', 0x02, int) -#define SNDRV_PCM_IOCTL_TTSTAMP		_IOW('A', 0x03, int) -#define SNDRV_PCM_IOCTL_HW_REFINE	_IOWR('A', 0x10, struct snd_pcm_hw_params) -#define SNDRV_PCM_IOCTL_HW_PARAMS	_IOWR('A', 0x11, struct snd_pcm_hw_params) -#define SNDRV_PCM_IOCTL_HW_FREE		_IO('A', 0x12) -#define SNDRV_PCM_IOCTL_SW_PARAMS	_IOWR('A', 0x13, struct snd_pcm_sw_params) -#define SNDRV_PCM_IOCTL_STATUS		_IOR('A', 0x20, struct snd_pcm_status) -#define SNDRV_PCM_IOCTL_DELAY		_IOR('A', 0x21, snd_pcm_sframes_t) -#define SNDRV_PCM_IOCTL_HWSYNC		_IO('A', 0x22) -#define SNDRV_PCM_IOCTL_SYNC_PTR	_IOWR('A', 0x23, struct snd_pcm_sync_ptr) -#define SNDRV_PCM_IOCTL_CHANNEL_INFO	_IOR('A', 0x32, struct snd_pcm_channel_info) -#define SNDRV_PCM_IOCTL_PREPARE		_IO('A', 0x40) -#define SNDRV_PCM_IOCTL_RESET		_IO('A', 0x41) -#define SNDRV_PCM_IOCTL_START		_IO('A', 0x42) -#define SNDRV_PCM_IOCTL_DROP		_IO('A', 0x43) -#define SNDRV_PCM_IOCTL_DRAIN		_IO('A', 0x44) -#define SNDRV_PCM_IOCTL_PAUSE		_IOW('A', 0x45, int) -#define SNDRV_PCM_IOCTL_REWIND		_IOW('A', 0x46, snd_pcm_uframes_t) -#define SNDRV_PCM_IOCTL_RESUME		_IO('A', 0x47) -#define SNDRV_PCM_IOCTL_XRUN		_IO('A', 0x48) -#define SNDRV_PCM_IOCTL_FORWARD		_IOW('A', 0x49, snd_pcm_uframes_t) -#define SNDRV_PCM_IOCTL_WRITEI_FRAMES	_IOW('A', 0x50, struct snd_xferi) -#define SNDRV_PCM_IOCTL_READI_FRAMES	_IOR('A', 0x51, struct snd_xferi) -#define SNDRV_PCM_IOCTL_WRITEN_FRAMES	_IOW('A', 0x52, struct snd_xfern) -#define SNDRV_PCM_IOCTL_READN_FRAMES	_IOR('A', 0x53, struct snd_xfern) -#define SNDRV_PCM_IOCTL_LINK		_IOW('A', 0x60, int) -#define SNDRV_PCM_IOCTL_UNLINK		_IO('A', 0x61) - -/***************************************************************************** - *                                                                           * - *                            MIDI v1.0 interface                            * - *                                                                           * - *****************************************************************************/ - -/* - *  Raw MIDI section - /dev/snd/midi?? - */ - -#define SNDRV_RAWMIDI_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 0) - -enum { -	SNDRV_RAWMIDI_STREAM_OUTPUT = 0, -	SNDRV_RAWMIDI_STREAM_INPUT, -	SNDRV_RAWMIDI_STREAM_LAST = SNDRV_RAWMIDI_STREAM_INPUT, -}; - -#define SNDRV_RAWMIDI_INFO_OUTPUT		0x00000001 -#define SNDRV_RAWMIDI_INFO_INPUT		0x00000002 -#define SNDRV_RAWMIDI_INFO_DUPLEX		0x00000004 - -struct snd_rawmidi_info { -	unsigned int device;		/* RO/WR (control): device number */ -	unsigned int subdevice;		/* RO/WR (control): subdevice number */ -	int stream;			/* WR: stream */ -	int card;			/* R: card number */ -	unsigned int flags;		/* SNDRV_RAWMIDI_INFO_XXXX */ -	unsigned char id[64];		/* ID (user selectable) */ -	unsigned char name[80];		/* name of device */ -	unsigned char subname[32];	/* name of active or selected subdevice */ -	unsigned int subdevices_count; -	unsigned int subdevices_avail; -	unsigned char reserved[64];	/* reserved for future use */ -}; - -struct snd_rawmidi_params { -	int stream; -	size_t buffer_size;		/* queue size in bytes */ -	size_t avail_min;		/* minimum avail bytes for wakeup */ -	unsigned int no_active_sensing: 1; /* do not send active sensing byte in close() */ -	unsigned char reserved[16];	/* reserved for future use */ -}; - -struct snd_rawmidi_status { -	int stream; -	struct timespec tstamp;		/* Timestamp */ -	size_t avail;			/* available bytes */ -	size_t xruns;			/* count of overruns since last status (in bytes) */ -	unsigned char reserved[16];	/* reserved for future use */ -}; - -#define SNDRV_RAWMIDI_IOCTL_PVERSION	_IOR('W', 0x00, int) -#define SNDRV_RAWMIDI_IOCTL_INFO	_IOR('W', 0x01, struct snd_rawmidi_info) -#define SNDRV_RAWMIDI_IOCTL_PARAMS	_IOWR('W', 0x10, struct snd_rawmidi_params) -#define SNDRV_RAWMIDI_IOCTL_STATUS	_IOWR('W', 0x20, struct snd_rawmidi_status) -#define SNDRV_RAWMIDI_IOCTL_DROP	_IOW('W', 0x30, int) -#define SNDRV_RAWMIDI_IOCTL_DRAIN	_IOW('W', 0x31, int) - -/* - *  Timer section - /dev/snd/timer - */ - -#define SNDRV_TIMER_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 6) - -enum { -	SNDRV_TIMER_CLASS_NONE = -1, -	SNDRV_TIMER_CLASS_SLAVE = 0, -	SNDRV_TIMER_CLASS_GLOBAL, -	SNDRV_TIMER_CLASS_CARD, -	SNDRV_TIMER_CLASS_PCM, -	SNDRV_TIMER_CLASS_LAST = SNDRV_TIMER_CLASS_PCM, -}; - -/* slave timer classes */ -enum { -	SNDRV_TIMER_SCLASS_NONE = 0, -	SNDRV_TIMER_SCLASS_APPLICATION, -	SNDRV_TIMER_SCLASS_SEQUENCER,		/* alias */ -	SNDRV_TIMER_SCLASS_OSS_SEQUENCER,	/* alias */ -	SNDRV_TIMER_SCLASS_LAST = SNDRV_TIMER_SCLASS_OSS_SEQUENCER, -}; - -/* global timers (device member) */ -#define SNDRV_TIMER_GLOBAL_SYSTEM	0 -#define SNDRV_TIMER_GLOBAL_RTC		1 -#define SNDRV_TIMER_GLOBAL_HPET		2 -#define SNDRV_TIMER_GLOBAL_HRTIMER	3 - -/* info flags */ -#define SNDRV_TIMER_FLG_SLAVE		(1<<0)	/* cannot be controlled */ - -struct snd_timer_id { -	int dev_class; -	int dev_sclass; -	int card; -	int device; -	int subdevice; -}; - -struct snd_timer_ginfo { -	struct snd_timer_id tid;	/* requested timer ID */ -	unsigned int flags;		/* timer flags - SNDRV_TIMER_FLG_* */ -	int card;			/* card number */ -	unsigned char id[64];		/* timer identification */ -	unsigned char name[80];		/* timer name */ -	unsigned long reserved0;	/* reserved for future use */ -	unsigned long resolution;	/* average period resolution in ns */ -	unsigned long resolution_min;	/* minimal period resolution in ns */ -	unsigned long resolution_max;	/* maximal period resolution in ns */ -	unsigned int clients;		/* active timer clients */ -	unsigned char reserved[32]; -}; - -struct snd_timer_gparams { -	struct snd_timer_id tid;	/* requested timer ID */ -	unsigned long period_num;	/* requested precise period duration (in seconds) - numerator */ -	unsigned long period_den;	/* requested precise period duration (in seconds) - denominator */ -	unsigned char reserved[32]; -}; - -struct snd_timer_gstatus { -	struct snd_timer_id tid;	/* requested timer ID */ -	unsigned long resolution;	/* current period resolution in ns */ -	unsigned long resolution_num;	/* precise current period resolution (in seconds) - numerator */ -	unsigned long resolution_den;	/* precise current period resolution (in seconds) - denominator */ -	unsigned char reserved[32]; -}; - -struct snd_timer_select { -	struct snd_timer_id id;	/* bind to timer ID */ -	unsigned char reserved[32];	/* reserved */ -}; - -struct snd_timer_info { -	unsigned int flags;		/* timer flags - SNDRV_TIMER_FLG_* */ -	int card;			/* card number */ -	unsigned char id[64];		/* timer identificator */ -	unsigned char name[80];		/* timer name */ -	unsigned long reserved0;	/* reserved for future use */ -	unsigned long resolution;	/* average period resolution in ns */ -	unsigned char reserved[64];	/* reserved */ -}; - -#define SNDRV_TIMER_PSFLG_AUTO		(1<<0)	/* auto start, otherwise one-shot */ -#define SNDRV_TIMER_PSFLG_EXCLUSIVE	(1<<1)	/* exclusive use, precise start/stop/pause/continue */ -#define SNDRV_TIMER_PSFLG_EARLY_EVENT	(1<<2)	/* write early event to the poll queue */ - -struct snd_timer_params { -	unsigned int flags;		/* flags - SNDRV_MIXER_PSFLG_* */ -	unsigned int ticks;		/* requested resolution in ticks */ -	unsigned int queue_size;	/* total size of queue (32-1024) */ -	unsigned int reserved0;		/* reserved, was: failure locations */ -	unsigned int filter;		/* event filter (bitmask of SNDRV_TIMER_EVENT_*) */ -	unsigned char reserved[60];	/* reserved */ -}; - -struct snd_timer_status { -	struct timespec tstamp;		/* Timestamp - last update */ -	unsigned int resolution;	/* current period resolution in ns */ -	unsigned int lost;		/* counter of master tick lost */ -	unsigned int overrun;		/* count of read queue overruns */ -	unsigned int queue;		/* used queue size */ -	unsigned char reserved[64];	/* reserved */ -}; - -#define SNDRV_TIMER_IOCTL_PVERSION	_IOR('T', 0x00, int) -#define SNDRV_TIMER_IOCTL_NEXT_DEVICE	_IOWR('T', 0x01, struct snd_timer_id) -#define SNDRV_TIMER_IOCTL_TREAD		_IOW('T', 0x02, int) -#define SNDRV_TIMER_IOCTL_GINFO		_IOWR('T', 0x03, struct snd_timer_ginfo) -#define SNDRV_TIMER_IOCTL_GPARAMS	_IOW('T', 0x04, struct snd_timer_gparams) -#define SNDRV_TIMER_IOCTL_GSTATUS	_IOWR('T', 0x05, struct snd_timer_gstatus) -#define SNDRV_TIMER_IOCTL_SELECT	_IOW('T', 0x10, struct snd_timer_select) -#define SNDRV_TIMER_IOCTL_INFO		_IOR('T', 0x11, struct snd_timer_info) -#define SNDRV_TIMER_IOCTL_PARAMS	_IOW('T', 0x12, struct snd_timer_params) -#define SNDRV_TIMER_IOCTL_STATUS	_IOR('T', 0x14, struct snd_timer_status) -/* The following four ioctls are changed since 1.0.9 due to confliction */ -#define SNDRV_TIMER_IOCTL_START		_IO('T', 0xa0) -#define SNDRV_TIMER_IOCTL_STOP		_IO('T', 0xa1) -#define SNDRV_TIMER_IOCTL_CONTINUE	_IO('T', 0xa2) -#define SNDRV_TIMER_IOCTL_PAUSE		_IO('T', 0xa3) - -struct snd_timer_read { -	unsigned int resolution; -	unsigned int ticks; -}; - -enum { -	SNDRV_TIMER_EVENT_RESOLUTION = 0,	/* val = resolution in ns */ -	SNDRV_TIMER_EVENT_TICK,			/* val = ticks */ -	SNDRV_TIMER_EVENT_START,		/* val = resolution in ns */ -	SNDRV_TIMER_EVENT_STOP,			/* val = 0 */ -	SNDRV_TIMER_EVENT_CONTINUE,		/* val = resolution in ns */ -	SNDRV_TIMER_EVENT_PAUSE,		/* val = 0 */ -	SNDRV_TIMER_EVENT_EARLY,		/* val = 0, early event */ -	SNDRV_TIMER_EVENT_SUSPEND,		/* val = 0 */ -	SNDRV_TIMER_EVENT_RESUME,		/* val = resolution in ns */ -	/* master timer events for slave timer instances */ -	SNDRV_TIMER_EVENT_MSTART = SNDRV_TIMER_EVENT_START + 10, -	SNDRV_TIMER_EVENT_MSTOP = SNDRV_TIMER_EVENT_STOP + 10, -	SNDRV_TIMER_EVENT_MCONTINUE = SNDRV_TIMER_EVENT_CONTINUE + 10, -	SNDRV_TIMER_EVENT_MPAUSE = SNDRV_TIMER_EVENT_PAUSE + 10, -	SNDRV_TIMER_EVENT_MSUSPEND = SNDRV_TIMER_EVENT_SUSPEND + 10, -	SNDRV_TIMER_EVENT_MRESUME = SNDRV_TIMER_EVENT_RESUME + 10, -}; - -struct snd_timer_tread { -	int event; -	struct timespec tstamp; -	unsigned int val; -}; - -/**************************************************************************** - *                                                                          * - *        Section for driver control interface - /dev/snd/control?          * - *                                                                          * - ****************************************************************************/ - -#define SNDRV_CTL_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 6) - -struct snd_ctl_card_info { -	int card;			/* card number */ -	int pad;			/* reserved for future (was type) */ -	unsigned char id[16];		/* ID of card (user selectable) */ -	unsigned char driver[16];	/* Driver name */ -	unsigned char name[32];		/* Short name of soundcard */ -	unsigned char longname[80];	/* name + info text about soundcard */ -	unsigned char reserved_[16];	/* reserved for future (was ID of mixer) */ -	unsigned char mixername[80];	/* visual mixer identification */ -	unsigned char components[128];	/* card components / fine identification, delimited with one space (AC97 etc..) */ -}; - -typedef int __bitwise snd_ctl_elem_type_t; -#define	SNDRV_CTL_ELEM_TYPE_NONE	((__force snd_ctl_elem_type_t) 0) /* invalid */ -#define	SNDRV_CTL_ELEM_TYPE_BOOLEAN	((__force snd_ctl_elem_type_t) 1) /* boolean type */ -#define	SNDRV_CTL_ELEM_TYPE_INTEGER	((__force snd_ctl_elem_type_t) 2) /* integer type */ -#define	SNDRV_CTL_ELEM_TYPE_ENUMERATED	((__force snd_ctl_elem_type_t) 3) /* enumerated type */ -#define	SNDRV_CTL_ELEM_TYPE_BYTES	((__force snd_ctl_elem_type_t) 4) /* byte array */ -#define	SNDRV_CTL_ELEM_TYPE_IEC958	((__force snd_ctl_elem_type_t) 5) /* IEC958 (S/PDIF) setup */ -#define	SNDRV_CTL_ELEM_TYPE_INTEGER64	((__force snd_ctl_elem_type_t) 6) /* 64-bit integer type */ -#define	SNDRV_CTL_ELEM_TYPE_LAST	SNDRV_CTL_ELEM_TYPE_INTEGER64 - -typedef int __bitwise snd_ctl_elem_iface_t; -#define	SNDRV_CTL_ELEM_IFACE_CARD	((__force snd_ctl_elem_iface_t) 0) /* global control */ -#define	SNDRV_CTL_ELEM_IFACE_HWDEP	((__force snd_ctl_elem_iface_t) 1) /* hardware dependent device */ -#define	SNDRV_CTL_ELEM_IFACE_MIXER	((__force snd_ctl_elem_iface_t) 2) /* virtual mixer device */ -#define	SNDRV_CTL_ELEM_IFACE_PCM	((__force snd_ctl_elem_iface_t) 3) /* PCM device */ -#define	SNDRV_CTL_ELEM_IFACE_RAWMIDI	((__force snd_ctl_elem_iface_t) 4) /* RawMidi device */ -#define	SNDRV_CTL_ELEM_IFACE_TIMER	((__force snd_ctl_elem_iface_t) 5) /* timer device */ -#define	SNDRV_CTL_ELEM_IFACE_SEQUENCER	((__force snd_ctl_elem_iface_t) 6) /* sequencer client */ -#define	SNDRV_CTL_ELEM_IFACE_LAST	SNDRV_CTL_ELEM_IFACE_SEQUENCER - -#define SNDRV_CTL_ELEM_ACCESS_READ		(1<<0) -#define SNDRV_CTL_ELEM_ACCESS_WRITE		(1<<1) -#define SNDRV_CTL_ELEM_ACCESS_READWRITE		(SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE) -#define SNDRV_CTL_ELEM_ACCESS_VOLATILE		(1<<2)	/* control value may be changed without a notification */ -#define SNDRV_CTL_ELEM_ACCESS_TIMESTAMP		(1<<3)	/* when was control changed */ -#define SNDRV_CTL_ELEM_ACCESS_TLV_READ		(1<<4)	/* TLV read is possible */ -#define SNDRV_CTL_ELEM_ACCESS_TLV_WRITE		(1<<5)	/* TLV write is possible */ -#define SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE	(SNDRV_CTL_ELEM_ACCESS_TLV_READ|SNDRV_CTL_ELEM_ACCESS_TLV_WRITE) -#define SNDRV_CTL_ELEM_ACCESS_TLV_COMMAND	(1<<6)	/* TLV command is possible */ -#define SNDRV_CTL_ELEM_ACCESS_INACTIVE		(1<<8)	/* control does actually nothing, but may be updated */ -#define SNDRV_CTL_ELEM_ACCESS_LOCK		(1<<9)	/* write lock */ -#define SNDRV_CTL_ELEM_ACCESS_OWNER		(1<<10)	/* write lock owner */ -#define SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK	(1<<28)	/* kernel use a TLV callback */  -#define SNDRV_CTL_ELEM_ACCESS_USER		(1<<29) /* user space element */ -/* bits 30 and 31 are obsoleted (for indirect access) */ - -/* for further details see the ACPI and PCI power management specification */ -#define SNDRV_CTL_POWER_D0		0x0000	/* full On */ -#define SNDRV_CTL_POWER_D1		0x0100	/* partial On */ -#define SNDRV_CTL_POWER_D2		0x0200	/* partial On */ -#define SNDRV_CTL_POWER_D3		0x0300	/* Off */ -#define SNDRV_CTL_POWER_D3hot		(SNDRV_CTL_POWER_D3|0x0000)	/* Off, with power */ -#define SNDRV_CTL_POWER_D3cold		(SNDRV_CTL_POWER_D3|0x0001)	/* Off, without power */ - -struct snd_ctl_elem_id { -	unsigned int numid;		/* numeric identifier, zero = invalid */ -	snd_ctl_elem_iface_t iface;	/* interface identifier */ -	unsigned int device;		/* device/client number */ -	unsigned int subdevice;		/* subdevice (substream) number */ -	unsigned char name[44];		/* ASCII name of item */ -	unsigned int index;		/* index of item */ -}; - -struct snd_ctl_elem_list { -	unsigned int offset;		/* W: first element ID to get */ -	unsigned int space;		/* W: count of element IDs to get */ -	unsigned int used;		/* R: count of element IDs set */ -	unsigned int count;		/* R: count of all elements */ -	struct snd_ctl_elem_id __user *pids; /* R: IDs */ -	unsigned char reserved[50]; -}; - -struct snd_ctl_elem_info { -	struct snd_ctl_elem_id id;	/* W: element ID */ -	snd_ctl_elem_type_t type;	/* R: value type - SNDRV_CTL_ELEM_TYPE_* */ -	unsigned int access;		/* R: value access (bitmask) - SNDRV_CTL_ELEM_ACCESS_* */ -	unsigned int count;		/* count of values */ -	__kernel_pid_t owner;		/* owner's PID of this control */ -	union { -		struct { -			long min;		/* R: minimum value */ -			long max;		/* R: maximum value */ -			long step;		/* R: step (0 variable) */ -		} integer; -		struct { -			long long min;		/* R: minimum value */ -			long long max;		/* R: maximum value */ -			long long step;		/* R: step (0 variable) */ -		} integer64; -		struct { -			unsigned int items;	/* R: number of items */ -			unsigned int item;	/* W: item number */ -			char name[64];		/* R: value name */ -		} enumerated; -		unsigned char reserved[128]; -	} value; -	union { -		unsigned short d[4];		/* dimensions */ -		unsigned short *d_ptr;		/* indirect - obsoleted */ -	} dimen; -	unsigned char reserved[64-4*sizeof(unsigned short)]; -}; - -struct snd_ctl_elem_value { -	struct snd_ctl_elem_id id;	/* W: element ID */ -	unsigned int indirect: 1;	/* W: indirect access - obsoleted */ -	union { -		union { -			long value[128]; -			long *value_ptr;	/* obsoleted */ -		} integer; -		union { -			long long value[64]; -			long long *value_ptr;	/* obsoleted */ -		} integer64; -		union { -			unsigned int item[128]; -			unsigned int *item_ptr;	/* obsoleted */ -		} enumerated; -		union { -			unsigned char data[512]; -			unsigned char *data_ptr;	/* obsoleted */ -		} bytes; -		struct snd_aes_iec958 iec958; -	} value;		/* RO */ -	struct timespec tstamp; -	unsigned char reserved[128-sizeof(struct timespec)]; -}; - -struct snd_ctl_tlv { -	unsigned int numid;	/* control element numeric identification */ -	unsigned int length;	/* in bytes aligned to 4 */ -	unsigned int tlv[0];	/* first TLV */ -}; - -#define SNDRV_CTL_IOCTL_PVERSION	_IOR('U', 0x00, int) -#define SNDRV_CTL_IOCTL_CARD_INFO	_IOR('U', 0x01, struct snd_ctl_card_info) -#define SNDRV_CTL_IOCTL_ELEM_LIST	_IOWR('U', 0x10, struct snd_ctl_elem_list) -#define SNDRV_CTL_IOCTL_ELEM_INFO	_IOWR('U', 0x11, struct snd_ctl_elem_info) -#define SNDRV_CTL_IOCTL_ELEM_READ	_IOWR('U', 0x12, struct snd_ctl_elem_value) -#define SNDRV_CTL_IOCTL_ELEM_WRITE	_IOWR('U', 0x13, struct snd_ctl_elem_value) -#define SNDRV_CTL_IOCTL_ELEM_LOCK	_IOW('U', 0x14, struct snd_ctl_elem_id) -#define SNDRV_CTL_IOCTL_ELEM_UNLOCK	_IOW('U', 0x15, struct snd_ctl_elem_id) -#define SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS _IOWR('U', 0x16, int) -#define SNDRV_CTL_IOCTL_ELEM_ADD	_IOWR('U', 0x17, struct snd_ctl_elem_info) -#define SNDRV_CTL_IOCTL_ELEM_REPLACE	_IOWR('U', 0x18, struct snd_ctl_elem_info) -#define SNDRV_CTL_IOCTL_ELEM_REMOVE	_IOWR('U', 0x19, struct snd_ctl_elem_id) -#define SNDRV_CTL_IOCTL_TLV_READ	_IOWR('U', 0x1a, struct snd_ctl_tlv) -#define SNDRV_CTL_IOCTL_TLV_WRITE	_IOWR('U', 0x1b, struct snd_ctl_tlv) -#define SNDRV_CTL_IOCTL_TLV_COMMAND	_IOWR('U', 0x1c, struct snd_ctl_tlv) -#define SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE _IOWR('U', 0x20, int) -#define SNDRV_CTL_IOCTL_HWDEP_INFO	_IOR('U', 0x21, struct snd_hwdep_info) -#define SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE	_IOR('U', 0x30, int) -#define SNDRV_CTL_IOCTL_PCM_INFO	_IOWR('U', 0x31, struct snd_pcm_info) -#define SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE _IOW('U', 0x32, int) -#define SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE _IOWR('U', 0x40, int) -#define SNDRV_CTL_IOCTL_RAWMIDI_INFO	_IOWR('U', 0x41, struct snd_rawmidi_info) -#define SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE _IOW('U', 0x42, int) -#define SNDRV_CTL_IOCTL_POWER		_IOWR('U', 0xd0, int) -#define SNDRV_CTL_IOCTL_POWER_STATE	_IOR('U', 0xd1, int) - -/* - *  Read interface. - */ - -enum sndrv_ctl_event_type { -	SNDRV_CTL_EVENT_ELEM = 0, -	SNDRV_CTL_EVENT_LAST = SNDRV_CTL_EVENT_ELEM, -}; - -#define SNDRV_CTL_EVENT_MASK_VALUE	(1<<0)	/* element value was changed */ -#define SNDRV_CTL_EVENT_MASK_INFO	(1<<1)	/* element info was changed */ -#define SNDRV_CTL_EVENT_MASK_ADD	(1<<2)	/* element was added */ -#define SNDRV_CTL_EVENT_MASK_TLV	(1<<3)	/* element TLV tree was changed */ -#define SNDRV_CTL_EVENT_MASK_REMOVE	(~0U)	/* element was removed */ - -struct snd_ctl_event { -	int type;	/* event type - SNDRV_CTL_EVENT_* */ -	union { -		struct { -			unsigned int mask; -			struct snd_ctl_elem_id id; -		} elem; -		unsigned char data8[60]; -	} data; -}; - -/* - *  Control names - */ - -#define SNDRV_CTL_NAME_NONE				"" -#define SNDRV_CTL_NAME_PLAYBACK				"Playback " -#define SNDRV_CTL_NAME_CAPTURE				"Capture " - -#define SNDRV_CTL_NAME_IEC958_NONE			"" -#define SNDRV_CTL_NAME_IEC958_SWITCH			"Switch" -#define SNDRV_CTL_NAME_IEC958_VOLUME			"Volume" -#define SNDRV_CTL_NAME_IEC958_DEFAULT			"Default" -#define SNDRV_CTL_NAME_IEC958_MASK			"Mask" -#define SNDRV_CTL_NAME_IEC958_CON_MASK			"Con Mask" -#define SNDRV_CTL_NAME_IEC958_PRO_MASK			"Pro Mask" -#define SNDRV_CTL_NAME_IEC958_PCM_STREAM		"PCM Stream" -#define SNDRV_CTL_NAME_IEC958(expl,direction,what)	"IEC958 " expl SNDRV_CTL_NAME_##direction SNDRV_CTL_NAME_IEC958_##what - +#include <uapi/sound/asound.h>  #endif /* __SOUND_ASOUND_H */ diff --git a/include/sound/asound_fm.h b/include/sound/asound_fm.h deleted file mode 100644 index c2a4b967d5b..00000000000 --- a/include/sound/asound_fm.h +++ /dev/null @@ -1,134 +0,0 @@ -#ifndef __SOUND_ASOUND_FM_H -#define __SOUND_ASOUND_FM_H - -/* - *  Advanced Linux Sound Architecture - ALSA - * - *  Interface file between ALSA driver & user space - *  Copyright (c) 1994-98 by Jaroslav Kysela <perex@perex.cz>, - *                           4Front Technologies - * - *  Direct FM control - * - *   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; either version 2 of the License, or - *   (at your option) any later version. - * - *   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 SNDRV_DM_FM_MODE_OPL2	0x00 -#define SNDRV_DM_FM_MODE_OPL3	0x01 - -struct snd_dm_fm_info { -	unsigned char fm_mode;		/* OPL mode, see SNDRV_DM_FM_MODE_XXX */ -	unsigned char rhythm;		/* percussion mode flag */ -}; - -/* - *  Data structure composing an FM "note" or sound event. - */ - -struct snd_dm_fm_voice { -	unsigned char op;		/* operator cell (0 or 1) */ -	unsigned char voice;		/* FM voice (0 to 17) */ - -	unsigned char am;		/* amplitude modulation */ -	unsigned char vibrato;		/* vibrato effect */ -	unsigned char do_sustain;	/* sustain phase */ -	unsigned char kbd_scale;	/* keyboard scaling */ -	unsigned char harmonic;		/* 4 bits: harmonic and multiplier */ -	unsigned char scale_level;	/* 2 bits: decrease output freq rises */ -	unsigned char volume;		/* 6 bits: volume */ - -	unsigned char attack;		/* 4 bits: attack rate */ -	unsigned char decay;		/* 4 bits: decay rate */ -	unsigned char sustain;		/* 4 bits: sustain level */ -	unsigned char release;		/* 4 bits: release rate */ - -	unsigned char feedback;		/* 3 bits: feedback for op0 */ -	unsigned char connection;	/* 0 for serial, 1 for parallel */ -	unsigned char left;		/* stereo left */ -	unsigned char right;		/* stereo right */ -	unsigned char waveform;		/* 3 bits: waveform shape */ -}; - -/* - *  This describes an FM note by its voice, octave, frequency number (10bit) - *  and key on/off. - */ - -struct snd_dm_fm_note { -	unsigned char voice;	/* 0-17 voice channel */ -	unsigned char octave;	/* 3 bits: what octave to play */ -	unsigned int fnum;	/* 10 bits: frequency number */ -	unsigned char key_on;	/* set for active, clear for silent */ -}; - -/* - *  FM parameters that apply globally to all voices, and thus are not "notes" - */ - -struct snd_dm_fm_params { -	unsigned char am_depth;		/* amplitude modulation depth (1=hi) */ -	unsigned char vib_depth;	/* vibrato depth (1=hi) */ -	unsigned char kbd_split;	/* keyboard split */ -	unsigned char rhythm;		/* percussion mode select */ - -	/* This block is the percussion instrument data */ -	unsigned char bass; -	unsigned char snare; -	unsigned char tomtom; -	unsigned char cymbal; -	unsigned char hihat; -}; - -/* - *  FM mode ioctl settings - */ - -#define SNDRV_DM_FM_IOCTL_INFO		_IOR('H', 0x20, struct snd_dm_fm_info) -#define SNDRV_DM_FM_IOCTL_RESET		_IO ('H', 0x21) -#define SNDRV_DM_FM_IOCTL_PLAY_NOTE	_IOW('H', 0x22, struct snd_dm_fm_note) -#define SNDRV_DM_FM_IOCTL_SET_VOICE	_IOW('H', 0x23, struct snd_dm_fm_voice) -#define SNDRV_DM_FM_IOCTL_SET_PARAMS	_IOW('H', 0x24, struct snd_dm_fm_params) -#define SNDRV_DM_FM_IOCTL_SET_MODE	_IOW('H', 0x25, int) -/* for OPL3 only */ -#define SNDRV_DM_FM_IOCTL_SET_CONNECTION	_IOW('H', 0x26, int) -/* SBI patch management */ -#define SNDRV_DM_FM_IOCTL_CLEAR_PATCHES	_IO ('H', 0x40) - -#define SNDRV_DM_FM_OSS_IOCTL_RESET		0x20 -#define SNDRV_DM_FM_OSS_IOCTL_PLAY_NOTE		0x21 -#define SNDRV_DM_FM_OSS_IOCTL_SET_VOICE		0x22 -#define SNDRV_DM_FM_OSS_IOCTL_SET_PARAMS	0x23 -#define SNDRV_DM_FM_OSS_IOCTL_SET_MODE		0x24 -#define SNDRV_DM_FM_OSS_IOCTL_SET_OPL		0x25 - -/* - * Patch Record - fixed size for write - */ - -#define FM_KEY_SBI	"SBI\032" -#define FM_KEY_2OP	"2OP\032" -#define FM_KEY_4OP	"4OP\032" - -struct sbi_patch { -	unsigned char prog; -	unsigned char bank; -	char key[4]; -	char name[25]; -	char extension[7]; -	unsigned char data[32]; -}; - -#endif /* __SOUND_ASOUND_FM_H */ diff --git a/include/sound/asoundef.h b/include/sound/asoundef.h index 20ebf3298eb..bb05c02f89b 100644 --- a/include/sound/asoundef.h +++ b/include/sound/asoundef.h @@ -170,6 +170,47 @@  #define IEC958_AES5_CON_CGMSA_COPYNOMORE (2<<0)	/* condition not be used */  #define IEC958_AES5_CON_CGMSA_COPYNEVER	(3<<0)	/* no copying is permitted */ +/**************************************************************************** + *                                                                          * + *        CEA-861 Audio InfoFrame. Used in HDMI and DisplayPort		    * + *                                                                          * + ****************************************************************************/ +#define CEA861_AUDIO_INFOFRAME_DB1CC		(7<<0) /* mask - channel count */ +#define CEA861_AUDIO_INFOFRAME_DB1CT		(0xf<<4) /* mask - coding type */ +#define CEA861_AUDIO_INFOFRAME_DB1CT_FROM_STREAM (0<<4) /* refer to stream */ +#define CEA861_AUDIO_INFOFRAME_DB1CT_IEC60958	(1<<4) /* IEC-60958 L-PCM */ +#define CEA861_AUDIO_INFOFRAME_DB1CT_AC3	(2<<4) /* AC-3 */ +#define CEA861_AUDIO_INFOFRAME_DB1CT_MPEG1	(3<<4) /* MPEG1 Layers 1 & 2 */ +#define CEA861_AUDIO_INFOFRAME_DB1CT_MP3	(4<<4) /* MPEG1 Layer 3 */ +#define CEA861_AUDIO_INFOFRAME_DB1CT_MPEG2_MULTICH (5<<4) /* MPEG2 Multichannel */ +#define CEA861_AUDIO_INFOFRAME_DB1CT_AAC	(6<<4) /* AAC */ +#define CEA861_AUDIO_INFOFRAME_DB1CT_DTS	(7<<4) /* DTS */ +#define CEA861_AUDIO_INFOFRAME_DB1CT_ATRAC	(8<<4) /* ATRAC */ +#define CEA861_AUDIO_INFOFRAME_DB1CT_ONEBIT	(9<<4) /* One Bit Audio */ +#define CEA861_AUDIO_INFOFRAME_DB1CT_DOLBY_DIG_PLUS (10<<4) /* Dolby Digital + */ +#define CEA861_AUDIO_INFOFRAME_DB1CT_DTS_HD	(11<<4) /* DTS-HD */ +#define CEA861_AUDIO_INFOFRAME_DB1CT_MAT	(12<<4) /* MAT (MLP) */ +#define CEA861_AUDIO_INFOFRAME_DB1CT_DST	(13<<4) /* DST */ +#define CEA861_AUDIO_INFOFRAME_DB1CT_WMA_PRO	(14<<4) /* WMA Pro */ +#define CEA861_AUDIO_INFOFRAME_DB2SF		(7<<2) /* mask - sample frequency */ +#define CEA861_AUDIO_INFOFRAME_DB2SF_FROM_STREAM (0<<2) /* refer to stream */ +#define CEA861_AUDIO_INFOFRAME_DB2SF_32000	(1<<2) /* 32kHz */ +#define CEA861_AUDIO_INFOFRAME_DB2SF_44100	(2<<2) /* 44.1kHz */ +#define CEA861_AUDIO_INFOFRAME_DB2SF_48000	(3<<2) /* 48kHz */ +#define CEA861_AUDIO_INFOFRAME_DB2SF_88200	(4<<2) /* 88.2kHz */ +#define CEA861_AUDIO_INFOFRAME_DB2SF_96000	(5<<2) /* 96kHz */ +#define CEA861_AUDIO_INFOFRAME_DB2SF_176400	(6<<2) /* 176.4kHz */ +#define CEA861_AUDIO_INFOFRAME_DB2SF_192000	(7<<2) /* 192kHz */ +#define CEA861_AUDIO_INFOFRAME_DB2SS		(3<<0) /* mask - sample size */ +#define CEA861_AUDIO_INFOFRAME_DB2SS_FROM_STREAM (0<<0) /* refer to stream */ +#define CEA861_AUDIO_INFOFRAME_DB2SS_16BIT	(1<<0) /* 16 bits */ +#define CEA861_AUDIO_INFOFRAME_DB2SS_20BIT	(2<<0) /* 20 bits */ +#define CEA861_AUDIO_INFOFRAME_DB2SS_24BIT	(3<<0) /* 24 bits */ +#define CEA861_AUDIO_INFOFRAME_DB5_DM_INH	(1<<7) /* mask - inhibit downmixing */ +#define CEA861_AUDIO_INFOFRAME_DB5_DM_INH_PERMITTED (0<<7) /* stereo downmix permitted */ +#define CEA861_AUDIO_INFOFRAME_DB5_DM_INH_PROHIBITED (1<<7) /* stereo downmis prohibited */ +#define CEA861_AUDIO_INFOFRAME_DB5_LSV		(0xf<<3) /* mask - level-shift values */ +  /*****************************************************************************   *                                                                           *   *                            MIDI v1.0 interface                            * diff --git a/include/sound/atmel-ac97c.h b/include/sound/atmel-ac97c.h index e6aabdb4586..00e6c289a93 100644 --- a/include/sound/atmel-ac97c.h +++ b/include/sound/atmel-ac97c.h @@ -23,7 +23,6 @@   * @reset_pin: GPIO pin wired to the reset input on the external AC97 codec,   *             optional to use, set to -ENODEV if not in use. AC97 layer will   *             try to do a software reset of the external codec anyway. - * @flags: Flags for which directions should be enabled.   *   * If the user do not want to use a DMA channel for playback or capture, i.e.   * only one feature is required on the board. The slave for playback or capture @@ -33,7 +32,6 @@  struct ac97c_platform_data {  	struct dw_dma_slave	rx_dws;  	struct dw_dma_slave	tx_dws; -	unsigned int 		flags;  	int			reset_pin;  }; diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h new file mode 100644 index 00000000000..ae6c3b8ed2f --- /dev/null +++ b/include/sound/compress_driver.h @@ -0,0 +1,183 @@ +/* + *  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 total_bytes_available; +	u64 total_bytes_transferred; +	wait_queue_head_t sleep; +	void *private_data; +}; + +/** + * 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 + * @metadata_set: metadata set flag, true when set + * @next_track: has userspace signall next track transistion, true when set + * @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; +	bool metadata_set; +	bool next_track; +	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 (*set_metadata)(struct snd_compr_stream *stream, +			struct snd_compr_metadata *metadata); +	int (*get_metadata)(struct snd_compr_stream *stream, +			struct snd_compr_metadata *metadata); +	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, 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); +} + +static inline void snd_compr_drain_notify(struct snd_compr_stream *stream) +{ +	if (snd_BUG_ON(!stream)) +		return; + +	stream->runtime->state = SNDRV_PCM_STATE_SETUP; +	wake_up(&stream->runtime->sleep); +} + +#endif diff --git a/include/sound/control.h b/include/sound/control.h index 112374dc0c5..5358892b1b3 100644 --- a/include/sound/control.h +++ b/include/sound/control.h @@ -40,7 +40,7 @@ struct snd_kcontrol_new {  	snd_ctl_elem_iface_t iface;	/* interface identifier */  	unsigned int device;		/* device/client number */  	unsigned int subdevice;		/* subdevice (substream) number */ -	unsigned char *name;		/* ASCII name of item */ +	const unsigned char *name;	/* ASCII name of item */  	unsigned int index;		/* index of item */  	unsigned int access;		/* access rights */  	unsigned int count;		/* count of same elements */ @@ -113,8 +113,11 @@ struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new * kcontrolnew, v  void snd_ctl_free_one(struct snd_kcontrol * kcontrol);  int snd_ctl_add(struct snd_card * card, struct snd_kcontrol * kcontrol);  int snd_ctl_remove(struct snd_card * card, struct snd_kcontrol * kcontrol); +int snd_ctl_replace(struct snd_card *card, struct snd_kcontrol *kcontrol, bool add_on_replace);  int snd_ctl_remove_id(struct snd_card * card, struct snd_ctl_elem_id *id);  int snd_ctl_rename_id(struct snd_card * card, struct snd_ctl_elem_id *src_id, struct snd_ctl_elem_id *dst_id); +int snd_ctl_activate_id(struct snd_card *card, struct snd_ctl_elem_id *id, +			int active);  struct snd_kcontrol *snd_ctl_find_numid(struct snd_card * card, unsigned int numid);  struct snd_kcontrol *snd_ctl_find_id(struct snd_card * card, struct snd_ctl_elem_id *id); @@ -160,12 +163,14 @@ static inline struct snd_ctl_elem_id *snd_ctl_build_ioff(struct snd_ctl_elem_id  }  /* - * Frequently used control callbacks + * Frequently used control callbacks/helpers   */  int snd_ctl_boolean_mono_info(struct snd_kcontrol *kcontrol,  			      struct snd_ctl_elem_info *uinfo);  int snd_ctl_boolean_stereo_info(struct snd_kcontrol *kcontrol,  				struct snd_ctl_elem_info *uinfo); +int snd_ctl_enum_info(struct snd_ctl_elem_info *info, unsigned int channels, +		      unsigned int items, const char *const names[]);  /*   * virtual master control @@ -184,16 +189,17 @@ int _snd_ctl_add_slave(struct snd_kcontrol *master, struct snd_kcontrol *slave,   *   * Add a virtual slave control to the given master element created via   * snd_ctl_create_virtual_master() beforehand. - * Returns zero if successful or a negative error code.   *   * All slaves must be the same type (returning the same information - * via info callback).  The fucntion doesn't check it, so it's your + * via info callback).  The function doesn't check it, so it's your   * responsibility.   *   * Also, some additional limitations:   * at most two channels,   * logarithmic volume control (dB level) thus no linear volume,   * master can only attenuate the volume without gain + * + * Return: Zero if successful or a negative error code.   */  static inline int  snd_ctl_add_slave(struct snd_kcontrol *master, struct snd_kcontrol *slave) @@ -214,6 +220,8 @@ snd_ctl_add_slave(struct snd_kcontrol *master, struct snd_kcontrol *slave)   * When the control peeks the hardware values directly and the value   * can be changed by other means than the put callback of the element,   * this function should be used to keep the value always up-to-date. + * + * Return: Zero if successful or a negative error code.   */  static inline int  snd_ctl_add_slave_uncached(struct snd_kcontrol *master, @@ -222,4 +230,18 @@ snd_ctl_add_slave_uncached(struct snd_kcontrol *master,  	return _snd_ctl_add_slave(master, slave, SND_CTL_SLAVE_NEED_UPDATE);  } +int snd_ctl_add_vmaster_hook(struct snd_kcontrol *kctl, +			     void (*hook)(void *private_data, int), +			     void *private_data); +void snd_ctl_sync_vmaster(struct snd_kcontrol *kctl, bool hook_only); +#define snd_ctl_sync_vmaster_hook(kctl)	snd_ctl_sync_vmaster(kctl, true) + +/* + * Helper functions for jack-detection controls + */ +struct snd_kcontrol * +snd_kctl_jack_new(const char *name, int idx, void *private_data); +void snd_kctl_jack_report(struct snd_card *card, +			  struct snd_kcontrol *kctl, bool status); +  #endif	/* __SOUND_CONTROL_H */ diff --git a/include/sound/core.h b/include/sound/core.h index 1fa2407c966..1df3f2fe535 100644 --- a/include/sound/core.h +++ b/include/sound/core.h @@ -22,17 +22,17 @@   *   */ -#include <linux/module.h> +#include <linux/device.h>  #include <linux/sched.h>		/* wake_up() */  #include <linux/mutex.h>		/* struct mutex */  #include <linux/rwsem.h>		/* struct rw_semaphore */  #include <linux/pm.h>			/* pm_message_t */ -#include <linux/device.h>  #include <linux/stringify.h> +#include <linux/printk.h>  /* number of supported soundcards */  #ifdef CONFIG_SND_DYNAMIC_MINORS -#define SNDRV_CARDS 32 +#define SNDRV_CARDS CONFIG_SND_MAX_CARDS  #else  #define SNDRV_CARDS 8		/* don't change - minor numbers */  #endif @@ -40,39 +40,35 @@  #define CONFIG_SND_MAJOR	116	/* standard configuration */  /* forward declarations */ -#ifdef CONFIG_PCI  struct pci_dev; -#endif +struct module; +struct completion;  /* device allocation stuff */ -#define SNDRV_DEV_TYPE_RANGE_SIZE		0x1000 - -typedef int __bitwise snd_device_type_t; -#define	SNDRV_DEV_TOPLEVEL	((__force snd_device_type_t) 0) -#define	SNDRV_DEV_CONTROL	((__force snd_device_type_t) 1) -#define	SNDRV_DEV_LOWLEVEL_PRE	((__force snd_device_type_t) 2) -#define	SNDRV_DEV_LOWLEVEL_NORMAL ((__force snd_device_type_t) 0x1000) -#define	SNDRV_DEV_PCM		((__force snd_device_type_t) 0x1001) -#define	SNDRV_DEV_RAWMIDI	((__force snd_device_type_t) 0x1002) -#define	SNDRV_DEV_TIMER		((__force snd_device_type_t) 0x1003) -#define	SNDRV_DEV_SEQUENCER	((__force snd_device_type_t) 0x1004) -#define	SNDRV_DEV_HWDEP		((__force snd_device_type_t) 0x1005) -#define	SNDRV_DEV_INFO		((__force snd_device_type_t) 0x1006) -#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_LOWLEVEL	((__force snd_device_type_t) 0x2000) - -typedef int __bitwise snd_device_state_t; -#define	SNDRV_DEV_BUILD		((__force snd_device_state_t) 0) -#define	SNDRV_DEV_REGISTERED	((__force snd_device_state_t) 1) -#define	SNDRV_DEV_DISCONNECTED	((__force snd_device_state_t) 2) - -typedef int __bitwise snd_device_cmd_t; -#define	SNDRV_DEV_CMD_PRE	((__force snd_device_cmd_t) 0) -#define	SNDRV_DEV_CMD_NORMAL	((__force snd_device_cmd_t) 1)	 -#define	SNDRV_DEV_CMD_POST	((__force snd_device_cmd_t) 2) +/* type of the object used in snd_device_*() + * this also defines the calling order + */ +enum snd_device_type { +	SNDRV_DEV_LOWLEVEL, +	SNDRV_DEV_CONTROL, +	SNDRV_DEV_INFO, +	SNDRV_DEV_BUS, +	SNDRV_DEV_CODEC, +	SNDRV_DEV_PCM, +	SNDRV_DEV_COMPRESS, +	SNDRV_DEV_RAWMIDI, +	SNDRV_DEV_TIMER, +	SNDRV_DEV_SEQUENCER, +	SNDRV_DEV_HWDEP, +	SNDRV_DEV_JACK, +}; + +enum snd_device_state { +	SNDRV_DEV_BUILD, +	SNDRV_DEV_REGISTERED, +	SNDRV_DEV_DISCONNECTED, +};  struct snd_device; @@ -85,8 +81,8 @@ struct snd_device_ops {  struct snd_device {  	struct list_head list;		/* list of registered devices */  	struct snd_card *card;		/* card which holds this device */ -	snd_device_state_t state;	/* state of the device */ -	snd_device_type_t type;		/* device type */ +	enum snd_device_state state;	/* state of the device */ +	enum snd_device_type type;	/* device type */  	void *device_data;		/* device structure */  	struct snd_device_ops *ops;	/* operations */  }; @@ -120,6 +116,8 @@ struct snd_card {  	int user_ctl_count;		/* count of all user controls */  	struct list_head controls;	/* all controls for this card */  	struct list_head ctl_files;	/* active control files */ +	struct mutex user_ctl_lock;	/* protects user controls against +					   concurrent access */  	struct snd_info_entry *proc_root;	/* root for soundcard specific files */  	struct snd_info_entry *proc_id;	/* the card id */ @@ -130,10 +128,10 @@ struct snd_card {  								state */  	spinlock_t files_lock;		/* lock the files for this card */  	int shutdown;			/* this card is going down */ -	int free_on_last_close;		/* free in context of file_release */ -	wait_queue_head_t shutdown_sleep; +	struct completion *release_completion;  	struct device *dev;		/* device assigned to this card */ -	struct device *card_dev;	/* cardX object for sysfs */ +	struct device card_dev;		/* cardX object for sysfs */ +	bool registered;		/* card_dev is registered? */  #ifdef CONFIG_PM  	unsigned int power_state;	/* power state */ @@ -147,6 +145,8 @@ struct snd_card {  #endif  }; +#define dev_to_snd_card(p)	container_of(p, struct snd_card, card_dev) +  #ifdef CONFIG_PM  static inline void snd_power_lock(struct snd_card *card)  { @@ -189,12 +189,13 @@ struct snd_minor {  	const struct file_operations *f_ops;	/* file operations */  	void *private_data;		/* private data for f_ops->open */  	struct device *dev;		/* device for sysfs */ +	struct snd_card *card_ptr;	/* assigned card instance */  };  /* return a device pointer linked to each sound device as a parent */  static inline struct device *snd_card_get_device_link(struct snd_card *card)  { -	return card ? card->card_dev : NULL; +	return card ? &card->card_dev : NULL;  }  /* sound.c */ @@ -227,7 +228,7 @@ int snd_register_device_for_dev(int type, struct snd_card *card,   * This function uses the card's device pointer to link to the   * correct &struct device.   * - * Returns zero if successful, or a negative error code on failure. + * Return: Zero if successful, or a negative error code on failure.   */  static inline int snd_register_device(int type, struct snd_card *card, int dev,  				      const struct file_operations *f_ops, @@ -241,13 +242,11 @@ static inline int snd_register_device(int type, struct snd_card *card, int dev,  int snd_unregister_device(int type, struct snd_card *card, int dev);  void *snd_lookup_minor_data(unsigned int minor, int type); -int snd_add_device_sysfs_file(int type, struct snd_card *card, int dev, -			      struct device_attribute *attr); +struct device *snd_get_device(int type, struct snd_card *card, int dev);  #ifdef CONFIG_SND_OSSEMUL  int snd_register_oss_device(int type, struct snd_card *card, int dev, -			    const struct file_operations *f_ops, void *private_data, -			    const char *name); +			    const struct file_operations *f_ops, void *private_data);  int snd_unregister_oss_device(int type, struct snd_card *card, int dev);  void *snd_lookup_oss_minor_data(unsigned int minor, int type);  #endif @@ -281,9 +280,9 @@ int snd_card_locked(int card);  extern int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int cmd);  #endif -int snd_card_create(int idx, const char *id, -		    struct module *module, int extra_size, -		    struct snd_card **card_ret); +int snd_card_new(struct device *parent, int idx, const char *xid, +		 struct module *module, int extra_size, +		 struct snd_card **card_ret);  int snd_card_disconnect(struct snd_card *card);  int snd_card_free(struct snd_card *card); @@ -295,19 +294,19 @@ int snd_card_info_done(void);  int snd_component_add(struct snd_card *card, const char *component);  int snd_card_file_add(struct snd_card *card, struct file *file);  int snd_card_file_remove(struct snd_card *card, struct file *file); +#define snd_card_unref(card)	put_device(&(card)->card_dev)  #define snd_card_set_dev(card, devptr) ((card)->dev = (devptr))  /* device.c */ -int snd_device_new(struct snd_card *card, snd_device_type_t type, +int snd_device_new(struct snd_card *card, enum snd_device_type type,  		   void *device_data, struct snd_device_ops *ops);  int snd_device_register(struct snd_card *card, void *device_data);  int snd_device_register_all(struct snd_card *card); -int snd_device_disconnect(struct snd_card *card, void *device_data);  int snd_device_disconnect_all(struct snd_card *card); -int snd_device_free(struct snd_card *card, void *device_data); -int snd_device_free_all(struct snd_card *card, snd_device_cmd_t cmd); +void snd_device_free(struct snd_card *card, void *device_data); +void snd_device_free_all(struct snd_card *card);  /* isadma.c */ @@ -325,10 +324,17 @@ void release_and_free_resource(struct resource *res);  /* --- */ +/* sound printk debug levels */ +enum { +	SND_PR_ALWAYS, +	SND_PR_DEBUG, +	SND_PR_VERBOSE, +}; +  #if defined(CONFIG_SND_DEBUG) || defined(CONFIG_SND_VERBOSE_PRINTK) +__printf(4, 5)  void __snd_printk(unsigned int level, const char *file, int line, -		  const char *format, ...) -     __attribute__ ((format (printf, 4, 5))); +		  const char *format, ...);  #else  #define __snd_printk(level, file, line, format, args...) \  	printk(format, ##args) @@ -354,6 +360,8 @@ void __snd_printk(unsigned int level, const char *file, int line,   */  #define snd_printd(fmt, args...) \  	__snd_printk(1, __FILE__, __LINE__, fmt, ##args) +#define _snd_printd(level, fmt, args...) \ +	__snd_printk(level, __FILE__, __LINE__, fmt, ##args)  /**   * snd_BUG - give a BUG warning message and stack trace @@ -364,31 +372,34 @@ void __snd_printk(unsigned int level, const char *file, int line,  #define snd_BUG()		WARN(1, "BUG?\n")  /** + * Suppress high rates of output when CONFIG_SND_DEBUG is enabled. + */ +#define snd_printd_ratelimit() printk_ratelimit() + +/**   * snd_BUG_ON - debugging check macro   * @cond: condition to evaluate   * - * When CONFIG_SND_DEBUG is set, this macro evaluates the given condition, - * and call WARN() and returns the value if it's non-zero. - *  - * When CONFIG_SND_DEBUG is not set, this just returns zero, and the given - * condition is ignored. - * - * NOTE: the argument won't be evaluated at all when CONFIG_SND_DEBUG=n. - * Thus, don't put any statement that influences on the code behavior, - * such as pre/post increment, to the argument of this macro. - * If you want to evaluate and give a warning, use standard WARN_ON(). + * Has the same behavior as WARN_ON when CONFIG_SND_DEBUG is set, + * otherwise just evaluates the conditional and returns the value.   */ -#define snd_BUG_ON(cond)	WARN((cond), "BUG? (%s)\n", __stringify(cond)) +#define snd_BUG_ON(cond)	WARN_ON((cond))  #else /* !CONFIG_SND_DEBUG */ -#define snd_printd(fmt, args...)	do { } while (0) +__printf(1, 2) +static inline void snd_printd(const char *format, ...) {} +__printf(2, 3) +static inline void _snd_printd(int level, const char *format, ...) {} +  #define snd_BUG()			do { } while (0) -static inline int __snd_bug_on(int cond) -{ -	return 0; -} -#define snd_BUG_ON(cond)	__snd_bug_on(0 && (cond))  /* always false */ + +#define snd_BUG_ON(condition) ({ \ +	int __ret_warn_on = !!(condition); \ +	unlikely(__ret_warn_on); \ +}) + +static inline bool snd_printd_ratelimit(void) { return false; }  #endif /* CONFIG_SND_DEBUG */ @@ -403,7 +414,8 @@ static inline int __snd_bug_on(int cond)  #define snd_printdd(format, args...) \  	__snd_printk(2, __FILE__, __LINE__, format, ##args)  #else -#define snd_printdd(format, args...)	do { } while (0) +__printf(1, 2) +static inline void snd_printdd(const char *format, ...) {}  #endif @@ -440,6 +452,7 @@ struct snd_pci_quirk {  #define SND_PCI_QUIRK_MASK(vend, mask, dev, xname, val)			\  	{_SND_PCI_QUIRK_ID_MASK(vend, mask, dev),			\  			.value = (val), .name = (xname)} +#define snd_pci_quirk_name(q)	((q)->name)  #else  #define SND_PCI_QUIRK(vend,dev,xname,val) \  	{_SND_PCI_QUIRK_ID(vend, dev), .value = (val)} @@ -447,13 +460,29 @@ struct snd_pci_quirk {  	{_SND_PCI_QUIRK_ID_MASK(vend, mask, dev), .value = (val)}  #define SND_PCI_QUIRK_VENDOR(vend, xname, val)			\  	{_SND_PCI_QUIRK_ID_MASK(vend, 0, 0), .value = (val)} +#define snd_pci_quirk_name(q)	""  #endif +#ifdef CONFIG_PCI  const struct snd_pci_quirk *  snd_pci_quirk_lookup(struct pci_dev *pci, const struct snd_pci_quirk *list);  const struct snd_pci_quirk *  snd_pci_quirk_lookup_id(u16 vendor, u16 device,  			const struct snd_pci_quirk *list); +#else +static inline const struct snd_pci_quirk * +snd_pci_quirk_lookup(struct pci_dev *pci, const struct snd_pci_quirk *list) +{ +	return NULL; +} + +static inline const struct snd_pci_quirk * +snd_pci_quirk_lookup_id(u16 vendor, u16 device, +			const struct snd_pci_quirk *list) +{ +	return NULL; +} +#endif  #endif /* __SOUND_CORE_H */ diff --git a/include/sound/cs4271.h b/include/sound/cs4271.h new file mode 100644 index 00000000000..70f45355aca --- /dev/null +++ b/include/sound/cs4271.h @@ -0,0 +1,40 @@ +/* + * Definitions for CS4271 ASoC codec driver + * + * Copyright (c) 2010 Alexander Sverdlin <subaparts@yandex.ru> + * + * 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; either version 2 + * of the License, or (at your option) any later version. + * + * 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. + */ + +#ifndef __CS4271_H +#define __CS4271_H + +struct cs4271_platform_data { +	int gpio_nreset;	/* GPIO driving Reset pin, if any */ +	bool amutec_eq_bmutec;	/* flag to enable AMUTEC=BMUTEC */ + +	/* +	 * The CS4271 requires its LRCLK and MCLK to be stable before its RESET +	 * line is de-asserted. That also means that clocks cannot be changed +	 * without putting the chip back into hardware reset, which also requires +	 * a complete re-initialization of all registers. +	 * +	 * One (undocumented) workaround is to assert and de-assert the PDN bit +	 * in the MODE2 register. This workaround can be enabled with the +	 * following flag. +	 * +	 * Note that this is not needed in case the clocks are stable +	 * throughout the entire runtime of the codec. +	 */ +	bool enable_soft_reset; +}; + +#endif /* __CS4271_H */ diff --git a/include/sound/cs42l52.h b/include/sound/cs42l52.h new file mode 100644 index 00000000000..bbabf84bdb4 --- /dev/null +++ b/include/sound/cs42l52.h @@ -0,0 +1,32 @@ +/* + * linux/sound/cs42l52.h -- Platform data for CS42L52 + * + * Copyright (c) 2012 Cirrus Logic Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __CS42L52_H +#define __CS42L52_H + +struct cs42l52_platform_data { + +	/* MICBIAS Level. Check datasheet Pg48 */ +	unsigned int micbias_lvl; + +	/* MICA mode selection Differential or Single-ended */ +	bool mica_diff_cfg; + +	/* MICB mode selection Differential or Single-ended */ +	bool micb_diff_cfg; + +	/* Charge Pump Freq. Check datasheet Pg73 */ +	unsigned int chgfreq; + +	/* Reset GPIO */ +	unsigned int reset_gpio; +}; + +#endif /* __CS42L52_H */ diff --git a/include/sound/cs42l56.h b/include/sound/cs42l56.h new file mode 100644 index 00000000000..2467c8ff132 --- /dev/null +++ b/include/sound/cs42l56.h @@ -0,0 +1,48 @@ +/* + * linux/sound/cs42l56.h -- Platform data for CS42L56 + * + * Copyright (c) 2014 Cirrus Logic Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __CS42L56_H +#define __CS42L56_H + +struct cs42l56_platform_data { + +	/* GPIO for Reset */ +	unsigned int gpio_nreset; + +	/* MICBIAS Level. Check datasheet Pg48 */ +	unsigned int micbias_lvl; + +	/* Analog Input 1A Reference 0=Single 1=Pseudo-Differential */ +	unsigned int ain1a_ref_cfg; + +	/* Analog Input 2A Reference 0=Single 1=Pseudo-Differential */ +	unsigned int ain2a_ref_cfg; + +	/* Analog Input 1B Reference 0=Single 1=Pseudo-Differential */ +	unsigned int ain1b_ref_cfg; + +	/* Analog Input 2B Reference 0=Single 1=Pseudo-Differential */ +	unsigned int ain2b_ref_cfg; + +	/* Charge Pump Freq. Check datasheet Pg62 */ +	unsigned int chgfreq; + +	/* HighPass Filter Right Channel Corner Frequency */ +	unsigned int hpfb_freq; + +	/* HighPass Filter Left Channel Corner Frequency */ +	unsigned int hpfa_freq; + +	/* Adaptive Power Control for LO/HP */ +	unsigned int adaptive_pwr; + +}; + +#endif /* __CS42L56_H */ diff --git a/include/sound/cs42l73.h b/include/sound/cs42l73.h new file mode 100644 index 00000000000..f354be4cdc9 --- /dev/null +++ b/include/sound/cs42l73.h @@ -0,0 +1,22 @@ +/* + * linux/sound/cs42l73.h -- Platform data for CS42L73 + * + * Copyright (c) 2012 Cirrus Logic Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __CS42L73_H +#define __CS42L73_H + +struct cs42l73_platform_data { +	/* RST GPIO */ +	unsigned int reset_gpio; +	unsigned int chgfreq; +	int jack_detection; +	unsigned int mclk_freq; +}; + +#endif /* __CS42L73_H */ diff --git a/include/sound/cs46xx.h b/include/sound/cs46xx.h deleted file mode 100644 index e3005a674a2..00000000000 --- a/include/sound/cs46xx.h +++ /dev/null @@ -1,1745 +0,0 @@ -#ifndef __SOUND_CS46XX_H -#define __SOUND_CS46XX_H - -/* - *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>, - *		     Cirrus Logic, Inc. - *  Definitions for Cirrus Logic CS46xx chips - * - * - *   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; either version 2 of the License, or - *   (at your option) any later version. - * - *   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 - * - */ - -#include "pcm.h" -#include "pcm-indirect.h" -#include "rawmidi.h" -#include "ac97_codec.h" -#include "cs46xx_dsp_spos.h" - -/* - *  Direct registers - */ - -/* - *  The following define the offsets of the registers accessed via base address - *  register zero on the CS46xx part. - */ -#define BA0_HISR				0x00000000 -#define BA0_HSR0                                0x00000004 -#define BA0_HICR                                0x00000008 -#define BA0_DMSR                                0x00000100 -#define BA0_HSAR                                0x00000110 -#define BA0_HDAR                                0x00000114 -#define BA0_HDMR                                0x00000118 -#define BA0_HDCR                                0x0000011C -#define BA0_PFMC                                0x00000200 -#define BA0_PFCV1                               0x00000204 -#define BA0_PFCV2                               0x00000208 -#define BA0_PCICFG00                            0x00000300 -#define BA0_PCICFG04                            0x00000304 -#define BA0_PCICFG08                            0x00000308 -#define BA0_PCICFG0C                            0x0000030C -#define BA0_PCICFG10                            0x00000310 -#define BA0_PCICFG14                            0x00000314 -#define BA0_PCICFG18                            0x00000318 -#define BA0_PCICFG1C                            0x0000031C -#define BA0_PCICFG20                            0x00000320 -#define BA0_PCICFG24                            0x00000324 -#define BA0_PCICFG28                            0x00000328 -#define BA0_PCICFG2C                            0x0000032C -#define BA0_PCICFG30                            0x00000330 -#define BA0_PCICFG34                            0x00000334 -#define BA0_PCICFG38                            0x00000338 -#define BA0_PCICFG3C                            0x0000033C -#define BA0_CLKCR1                              0x00000400 -#define BA0_CLKCR2                              0x00000404 -#define BA0_PLLM                                0x00000408 -#define BA0_PLLCC                               0x0000040C -#define BA0_FRR                                 0x00000410  -#define BA0_CFL1                                0x00000414 -#define BA0_CFL2                                0x00000418 -#define BA0_SERMC1                              0x00000420 -#define BA0_SERMC2                              0x00000424 -#define BA0_SERC1                               0x00000428 -#define BA0_SERC2                               0x0000042C -#define BA0_SERC3                               0x00000430 -#define BA0_SERC4                               0x00000434 -#define BA0_SERC5                               0x00000438 -#define BA0_SERBSP                              0x0000043C -#define BA0_SERBST                              0x00000440 -#define BA0_SERBCM                              0x00000444 -#define BA0_SERBAD                              0x00000448 -#define BA0_SERBCF                              0x0000044C -#define BA0_SERBWP                              0x00000450 -#define BA0_SERBRP                              0x00000454 -#ifndef NO_CS4612 -#define BA0_ASER_FADDR                          0x00000458 -#endif -#define BA0_ACCTL                               0x00000460 -#define BA0_ACSTS                               0x00000464 -#define BA0_ACOSV                               0x00000468 -#define BA0_ACCAD                               0x0000046C -#define BA0_ACCDA                               0x00000470 -#define BA0_ACISV                               0x00000474 -#define BA0_ACSAD                               0x00000478 -#define BA0_ACSDA                               0x0000047C -#define BA0_JSPT                                0x00000480 -#define BA0_JSCTL                               0x00000484 -#define BA0_JSC1                                0x00000488 -#define BA0_JSC2                                0x0000048C -#define BA0_MIDCR                               0x00000490 -#define BA0_MIDSR                               0x00000494 -#define BA0_MIDWP                               0x00000498 -#define BA0_MIDRP                               0x0000049C -#define BA0_JSIO                                0x000004A0 -#ifndef NO_CS4612 -#define BA0_ASER_MASTER                         0x000004A4 -#endif -#define BA0_CFGI                                0x000004B0 -#define BA0_SSVID                               0x000004B4 -#define BA0_GPIOR                               0x000004B8 -#ifndef NO_CS4612 -#define BA0_EGPIODR                             0x000004BC -#define BA0_EGPIOPTR                            0x000004C0 -#define BA0_EGPIOTR                             0x000004C4 -#define BA0_EGPIOWR                             0x000004C8 -#define BA0_EGPIOSR                             0x000004CC -#define BA0_SERC6                               0x000004D0 -#define BA0_SERC7                               0x000004D4 -#define BA0_SERACC                              0x000004D8 -#define BA0_ACCTL2                              0x000004E0 -#define BA0_ACSTS2                              0x000004E4 -#define BA0_ACOSV2                              0x000004E8 -#define BA0_ACCAD2                              0x000004EC -#define BA0_ACCDA2                              0x000004F0 -#define BA0_ACISV2                              0x000004F4 -#define BA0_ACSAD2                              0x000004F8 -#define BA0_ACSDA2                              0x000004FC -#define BA0_IOTAC0                              0x00000500 -#define BA0_IOTAC1                              0x00000504 -#define BA0_IOTAC2                              0x00000508 -#define BA0_IOTAC3                              0x0000050C -#define BA0_IOTAC4                              0x00000510 -#define BA0_IOTAC5                              0x00000514 -#define BA0_IOTAC6                              0x00000518 -#define BA0_IOTAC7                              0x0000051C -#define BA0_IOTAC8                              0x00000520 -#define BA0_IOTAC9                              0x00000524 -#define BA0_IOTAC10                             0x00000528 -#define BA0_IOTAC11                             0x0000052C -#define BA0_IOTFR0                              0x00000540 -#define BA0_IOTFR1                              0x00000544 -#define BA0_IOTFR2                              0x00000548 -#define BA0_IOTFR3                              0x0000054C -#define BA0_IOTFR4                              0x00000550 -#define BA0_IOTFR5                              0x00000554 -#define BA0_IOTFR6                              0x00000558 -#define BA0_IOTFR7                              0x0000055C -#define BA0_IOTFIFO                             0x00000580 -#define BA0_IOTRRD                              0x00000584 -#define BA0_IOTFP                               0x00000588 -#define BA0_IOTCR                               0x0000058C -#define BA0_DPCID                               0x00000590 -#define BA0_DPCIA                               0x00000594 -#define BA0_DPCIC                               0x00000598 -#define BA0_PCPCIR                              0x00000600 -#define BA0_PCPCIG                              0x00000604 -#define BA0_PCPCIEN                             0x00000608 -#define BA0_EPCIPMC                             0x00000610 -#endif - -/* - *  The following define the offsets of the registers and memories accessed via - *  base address register one on the CS46xx part. - */ -#define BA1_SP_DMEM0                            0x00000000 -#define BA1_SP_DMEM1                            0x00010000 -#define BA1_SP_PMEM                             0x00020000 -#define BA1_SP_REG				0x00030000 -#define BA1_SPCR                                0x00030000 -#define BA1_DREG                                0x00030004 -#define BA1_DSRWP                               0x00030008 -#define BA1_TWPR                                0x0003000C -#define BA1_SPWR                                0x00030010 -#define BA1_SPIR                                0x00030014 -#define BA1_FGR1                                0x00030020 -#define BA1_SPCS                                0x00030028 -#define BA1_SDSR                                0x0003002C -#define BA1_FRMT                                0x00030030 -#define BA1_FRCC                                0x00030034 -#define BA1_FRSC                                0x00030038 -#define BA1_OMNI_MEM                            0x000E0000 - - -/* - *  The following defines are for the flags in the host interrupt status - *  register. - */ -#define HISR_VC_MASK                            0x0000FFFF -#define HISR_VC0                                0x00000001 -#define HISR_VC1                                0x00000002 -#define HISR_VC2                                0x00000004 -#define HISR_VC3                                0x00000008 -#define HISR_VC4                                0x00000010 -#define HISR_VC5                                0x00000020 -#define HISR_VC6                                0x00000040 -#define HISR_VC7                                0x00000080 -#define HISR_VC8                                0x00000100 -#define HISR_VC9                                0x00000200 -#define HISR_VC10                               0x00000400 -#define HISR_VC11                               0x00000800 -#define HISR_VC12                               0x00001000 -#define HISR_VC13                               0x00002000 -#define HISR_VC14                               0x00004000 -#define HISR_VC15                               0x00008000 -#define HISR_INT0                               0x00010000 -#define HISR_INT1                               0x00020000 -#define HISR_DMAI                               0x00040000 -#define HISR_FROVR                              0x00080000 -#define HISR_MIDI                               0x00100000 -#ifdef NO_CS4612 -#define HISR_RESERVED                           0x0FE00000 -#else -#define HISR_SBINT                              0x00200000 -#define HISR_RESERVED                           0x0FC00000 -#endif -#define HISR_H0P                                0x40000000 -#define HISR_INTENA                             0x80000000 - -/* - *  The following defines are for the flags in the host signal register 0. - */ -#define HSR0_VC_MASK                            0xFFFFFFFF -#define HSR0_VC16                               0x00000001 -#define HSR0_VC17                               0x00000002 -#define HSR0_VC18                               0x00000004 -#define HSR0_VC19                               0x00000008 -#define HSR0_VC20                               0x00000010 -#define HSR0_VC21                               0x00000020 -#define HSR0_VC22                               0x00000040 -#define HSR0_VC23                               0x00000080 -#define HSR0_VC24                               0x00000100 -#define HSR0_VC25                               0x00000200 -#define HSR0_VC26                               0x00000400 -#define HSR0_VC27                               0x00000800 -#define HSR0_VC28                               0x00001000 -#define HSR0_VC29                               0x00002000 -#define HSR0_VC30                               0x00004000 -#define HSR0_VC31                               0x00008000 -#define HSR0_VC32                               0x00010000 -#define HSR0_VC33                               0x00020000 -#define HSR0_VC34                               0x00040000 -#define HSR0_VC35                               0x00080000 -#define HSR0_VC36                               0x00100000 -#define HSR0_VC37                               0x00200000 -#define HSR0_VC38                               0x00400000 -#define HSR0_VC39                               0x00800000 -#define HSR0_VC40                               0x01000000 -#define HSR0_VC41                               0x02000000 -#define HSR0_VC42                               0x04000000 -#define HSR0_VC43                               0x08000000 -#define HSR0_VC44                               0x10000000 -#define HSR0_VC45                               0x20000000 -#define HSR0_VC46                               0x40000000 -#define HSR0_VC47                               0x80000000 - -/* - *  The following defines are for the flags in the host interrupt control - *  register. - */ -#define HICR_IEV                                0x00000001 -#define HICR_CHGM                               0x00000002 - -/* - *  The following defines are for the flags in the DMA status register. - */ -#define DMSR_HP                                 0x00000001 -#define DMSR_HR                                 0x00000002 -#define DMSR_SP                                 0x00000004 -#define DMSR_SR                                 0x00000008 - -/* - *  The following defines are for the flags in the host DMA source address - *  register. - */ -#define HSAR_HOST_ADDR_MASK                     0xFFFFFFFF -#define HSAR_DSP_ADDR_MASK                      0x0000FFFF -#define HSAR_MEMID_MASK                         0x000F0000 -#define HSAR_MEMID_SP_DMEM0                     0x00000000 -#define HSAR_MEMID_SP_DMEM1                     0x00010000 -#define HSAR_MEMID_SP_PMEM                      0x00020000 -#define HSAR_MEMID_SP_DEBUG                     0x00030000 -#define HSAR_MEMID_OMNI_MEM                     0x000E0000 -#define HSAR_END                                0x40000000 -#define HSAR_ERR                                0x80000000 - -/* - *  The following defines are for the flags in the host DMA destination address - *  register. - */ -#define HDAR_HOST_ADDR_MASK                     0xFFFFFFFF -#define HDAR_DSP_ADDR_MASK                      0x0000FFFF -#define HDAR_MEMID_MASK                         0x000F0000 -#define HDAR_MEMID_SP_DMEM0                     0x00000000 -#define HDAR_MEMID_SP_DMEM1                     0x00010000 -#define HDAR_MEMID_SP_PMEM                      0x00020000 -#define HDAR_MEMID_SP_DEBUG                     0x00030000 -#define HDAR_MEMID_OMNI_MEM                     0x000E0000 -#define HDAR_END                                0x40000000 -#define HDAR_ERR                                0x80000000 - -/* - *  The following defines are for the flags in the host DMA control register. - */ -#define HDMR_AC_MASK                            0x0000F000 -#define HDMR_AC_8_16                            0x00001000 -#define HDMR_AC_M_S                             0x00002000 -#define HDMR_AC_B_L                             0x00004000 -#define HDMR_AC_S_U                             0x00008000 - -/* - *  The following defines are for the flags in the host DMA control register. - */ -#define HDCR_COUNT_MASK                         0x000003FF -#define HDCR_DONE                               0x00004000 -#define HDCR_OPT                                0x00008000 -#define HDCR_WBD                                0x00400000 -#define HDCR_WBS                                0x00800000 -#define HDCR_DMS_MASK                           0x07000000 -#define HDCR_DMS_LINEAR                         0x00000000 -#define HDCR_DMS_16_DWORDS                      0x01000000 -#define HDCR_DMS_32_DWORDS                      0x02000000 -#define HDCR_DMS_64_DWORDS                      0x03000000 -#define HDCR_DMS_128_DWORDS                     0x04000000 -#define HDCR_DMS_256_DWORDS                     0x05000000 -#define HDCR_DMS_512_DWORDS                     0x06000000 -#define HDCR_DMS_1024_DWORDS                    0x07000000 -#define HDCR_DH                                 0x08000000 -#define HDCR_SMS_MASK                           0x70000000 -#define HDCR_SMS_LINEAR                         0x00000000 -#define HDCR_SMS_16_DWORDS                      0x10000000 -#define HDCR_SMS_32_DWORDS                      0x20000000 -#define HDCR_SMS_64_DWORDS                      0x30000000 -#define HDCR_SMS_128_DWORDS                     0x40000000 -#define HDCR_SMS_256_DWORDS                     0x50000000 -#define HDCR_SMS_512_DWORDS                     0x60000000 -#define HDCR_SMS_1024_DWORDS                    0x70000000 -#define HDCR_SH                                 0x80000000 -#define HDCR_COUNT_SHIFT                        0 - -/* - *  The following defines are for the flags in the performance monitor control - *  register. - */ -#define PFMC_C1SS_MASK                          0x0000001F -#define PFMC_C1EV                               0x00000020 -#define PFMC_C1RS                               0x00008000 -#define PFMC_C2SS_MASK                          0x001F0000 -#define PFMC_C2EV                               0x00200000 -#define PFMC_C2RS                               0x80000000 -#define PFMC_C1SS_SHIFT                         0 -#define PFMC_C2SS_SHIFT                         16 -#define PFMC_BUS_GRANT                          0 -#define PFMC_GRANT_AFTER_REQ                    1 -#define PFMC_TRANSACTION                        2 -#define PFMC_DWORD_TRANSFER                     3 -#define PFMC_SLAVE_READ                         4 -#define PFMC_SLAVE_WRITE                        5 -#define PFMC_PREEMPTION                         6 -#define PFMC_DISCONNECT_RETRY                   7 -#define PFMC_INTERRUPT                          8 -#define PFMC_BUS_OWNERSHIP                      9 -#define PFMC_TRANSACTION_LAG                    10 -#define PFMC_PCI_CLOCK                          11 -#define PFMC_SERIAL_CLOCK                       12 -#define PFMC_SP_CLOCK                           13 - -/* - *  The following defines are for the flags in the performance counter value 1 - *  register. - */ -#define PFCV1_PC1V_MASK                         0xFFFFFFFF -#define PFCV1_PC1V_SHIFT                        0 - -/* - *  The following defines are for the flags in the performance counter value 2 - *  register. - */ -#define PFCV2_PC2V_MASK                         0xFFFFFFFF -#define PFCV2_PC2V_SHIFT                        0 - -/* - *  The following defines are for the flags in the clock control register 1. - */ -#define CLKCR1_OSCS                             0x00000001 -#define CLKCR1_OSCP                             0x00000002 -#define CLKCR1_PLLSS_MASK                       0x0000000C -#define CLKCR1_PLLSS_SERIAL                     0x00000000 -#define CLKCR1_PLLSS_CRYSTAL                    0x00000004 -#define CLKCR1_PLLSS_PCI                        0x00000008 -#define CLKCR1_PLLSS_RESERVED                   0x0000000C -#define CLKCR1_PLLP                             0x00000010 -#define CLKCR1_SWCE                             0x00000020 -#define CLKCR1_PLLOS                            0x00000040 - -/* - *  The following defines are for the flags in the clock control register 2. - */ -#define CLKCR2_PDIVS_MASK                       0x0000000F -#define CLKCR2_PDIVS_1                          0x00000001 -#define CLKCR2_PDIVS_2                          0x00000002 -#define CLKCR2_PDIVS_4                          0x00000004 -#define CLKCR2_PDIVS_7                          0x00000007 -#define CLKCR2_PDIVS_8                          0x00000008 -#define CLKCR2_PDIVS_16                         0x00000000 - -/* - *  The following defines are for the flags in the PLL multiplier register. - */ -#define PLLM_MASK                               0x000000FF -#define PLLM_SHIFT                              0 - -/* - *  The following defines are for the flags in the PLL capacitor coefficient - *  register. - */ -#define PLLCC_CDR_MASK                          0x00000007 -#ifndef NO_CS4610 -#define PLLCC_CDR_240_350_MHZ                   0x00000000 -#define PLLCC_CDR_184_265_MHZ                   0x00000001 -#define PLLCC_CDR_144_205_MHZ                   0x00000002 -#define PLLCC_CDR_111_160_MHZ                   0x00000003 -#define PLLCC_CDR_87_123_MHZ                    0x00000004 -#define PLLCC_CDR_67_96_MHZ                     0x00000005 -#define PLLCC_CDR_52_74_MHZ                     0x00000006 -#define PLLCC_CDR_45_58_MHZ                     0x00000007 -#endif -#ifndef NO_CS4612 -#define PLLCC_CDR_271_398_MHZ                   0x00000000 -#define PLLCC_CDR_227_330_MHZ                   0x00000001 -#define PLLCC_CDR_167_239_MHZ                   0x00000002 -#define PLLCC_CDR_150_215_MHZ                   0x00000003 -#define PLLCC_CDR_107_154_MHZ                   0x00000004 -#define PLLCC_CDR_98_140_MHZ                    0x00000005 -#define PLLCC_CDR_73_104_MHZ                    0x00000006 -#define PLLCC_CDR_63_90_MHZ                     0x00000007 -#endif -#define PLLCC_LPF_MASK                          0x000000F8 -#ifndef NO_CS4610 -#define PLLCC_LPF_23850_60000_KHZ               0x00000000 -#define PLLCC_LPF_7960_26290_KHZ                0x00000008 -#define PLLCC_LPF_4160_10980_KHZ                0x00000018 -#define PLLCC_LPF_1740_4580_KHZ                 0x00000038 -#define PLLCC_LPF_724_1910_KHZ                  0x00000078 -#define PLLCC_LPF_317_798_KHZ                   0x000000F8 -#endif -#ifndef NO_CS4612 -#define PLLCC_LPF_25580_64530_KHZ               0x00000000 -#define PLLCC_LPF_14360_37270_KHZ               0x00000008 -#define PLLCC_LPF_6100_16020_KHZ                0x00000018 -#define PLLCC_LPF_2540_6690_KHZ                 0x00000038 -#define PLLCC_LPF_1050_2780_KHZ                 0x00000078 -#define PLLCC_LPF_450_1160_KHZ                  0x000000F8 -#endif - -/* - *  The following defines are for the flags in the feature reporting register. - */ -#define FRR_FAB_MASK                            0x00000003 -#define FRR_MASK_MASK                           0x0000001C -#ifdef NO_CS4612 -#define FRR_CFOP_MASK                           0x000000E0 -#else -#define FRR_CFOP_MASK                           0x00000FE0 -#endif -#define FRR_CFOP_NOT_DVD                        0x00000020 -#define FRR_CFOP_A3D                            0x00000040 -#define FRR_CFOP_128_PIN                        0x00000080 -#ifndef NO_CS4612 -#define FRR_CFOP_CS4280                         0x00000800 -#endif -#define FRR_FAB_SHIFT                           0 -#define FRR_MASK_SHIFT                          2 -#define FRR_CFOP_SHIFT                          5 - -/* - *  The following defines are for the flags in the configuration load 1 - *  register. - */ -#define CFL1_CLOCK_SOURCE_MASK                  0x00000003 -#define CFL1_CLOCK_SOURCE_CS423X                0x00000000 -#define CFL1_CLOCK_SOURCE_AC97                  0x00000001 -#define CFL1_CLOCK_SOURCE_CRYSTAL               0x00000002 -#define CFL1_CLOCK_SOURCE_DUAL_AC97             0x00000003 -#define CFL1_VALID_DATA_MASK                    0x000000FF - -/* - *  The following defines are for the flags in the configuration load 2 - *  register. - */ -#define CFL2_VALID_DATA_MASK                    0x000000FF - -/* - *  The following defines are for the flags in the serial port master control - *  register 1. - */ -#define SERMC1_MSPE                             0x00000001 -#define SERMC1_PTC_MASK                         0x0000000E -#define SERMC1_PTC_CS423X                       0x00000000 -#define SERMC1_PTC_AC97                         0x00000002 -#define SERMC1_PTC_DAC                          0x00000004 -#define SERMC1_PLB                              0x00000010 -#define SERMC1_XLB                              0x00000020 - -/* - *  The following defines are for the flags in the serial port master control - *  register 2. - */ -#define SERMC2_LROE                             0x00000001 -#define SERMC2_MCOE                             0x00000002 -#define SERMC2_MCDIV                            0x00000004 - -/* - *  The following defines are for the flags in the serial port 1 configuration - *  register. - */ -#define SERC1_SO1EN                             0x00000001 -#define SERC1_SO1F_MASK                         0x0000000E -#define SERC1_SO1F_CS423X                       0x00000000 -#define SERC1_SO1F_AC97                         0x00000002 -#define SERC1_SO1F_DAC                          0x00000004 -#define SERC1_SO1F_SPDIF                        0x00000006 - -/* - *  The following defines are for the flags in the serial port 2 configuration - *  register. - */ -#define SERC2_SI1EN                             0x00000001 -#define SERC2_SI1F_MASK                         0x0000000E -#define SERC2_SI1F_CS423X                       0x00000000 -#define SERC2_SI1F_AC97                         0x00000002 -#define SERC2_SI1F_ADC                          0x00000004 -#define SERC2_SI1F_SPDIF                        0x00000006 - -/* - *  The following defines are for the flags in the serial port 3 configuration - *  register. - */ -#define SERC3_SO2EN                             0x00000001 -#define SERC3_SO2F_MASK                         0x00000006 -#define SERC3_SO2F_DAC                          0x00000000 -#define SERC3_SO2F_SPDIF                        0x00000002 - -/* - *  The following defines are for the flags in the serial port 4 configuration - *  register. - */ -#define SERC4_SO3EN                             0x00000001 -#define SERC4_SO3F_MASK                         0x00000006 -#define SERC4_SO3F_DAC                          0x00000000 -#define SERC4_SO3F_SPDIF                        0x00000002 - -/* - *  The following defines are for the flags in the serial port 5 configuration - *  register. - */ -#define SERC5_SI2EN                             0x00000001 -#define SERC5_SI2F_MASK                         0x00000006 -#define SERC5_SI2F_ADC                          0x00000000 -#define SERC5_SI2F_SPDIF                        0x00000002 - -/* - *  The following defines are for the flags in the serial port backdoor sample - *  pointer register. - */ -#define SERBSP_FSP_MASK                         0x0000000F -#define SERBSP_FSP_SHIFT                        0 - -/* - *  The following defines are for the flags in the serial port backdoor status - *  register. - */ -#define SERBST_RRDY                             0x00000001 -#define SERBST_WBSY                             0x00000002 - -/* - *  The following defines are for the flags in the serial port backdoor command - *  register. - */ -#define SERBCM_RDC                              0x00000001 -#define SERBCM_WRC                              0x00000002 - -/* - *  The following defines are for the flags in the serial port backdoor address - *  register. - */ -#ifdef NO_CS4612 -#define SERBAD_FAD_MASK                         0x000000FF -#else -#define SERBAD_FAD_MASK                         0x000001FF -#endif -#define SERBAD_FAD_SHIFT                        0 - -/* - *  The following defines are for the flags in the serial port backdoor - *  configuration register. - */ -#define SERBCF_HBP                              0x00000001 - -/* - *  The following defines are for the flags in the serial port backdoor write - *  port register. - */ -#define SERBWP_FWD_MASK                         0x000FFFFF -#define SERBWP_FWD_SHIFT                        0 - -/* - *  The following defines are for the flags in the serial port backdoor read - *  port register. - */ -#define SERBRP_FRD_MASK                         0x000FFFFF -#define SERBRP_FRD_SHIFT                        0 - -/* - *  The following defines are for the flags in the async FIFO address register. - */ -#ifndef NO_CS4612 -#define ASER_FADDR_A1_MASK                      0x000001FF -#define ASER_FADDR_EN1                          0x00008000 -#define ASER_FADDR_A2_MASK                      0x01FF0000 -#define ASER_FADDR_EN2                          0x80000000 -#define ASER_FADDR_A1_SHIFT                     0 -#define ASER_FADDR_A2_SHIFT                     16 -#endif - -/* - *  The following defines are for the flags in the AC97 control register. - */ -#define ACCTL_RSTN                              0x00000001 -#define ACCTL_ESYN                              0x00000002 -#define ACCTL_VFRM                              0x00000004 -#define ACCTL_DCV                               0x00000008 -#define ACCTL_CRW                               0x00000010 -#define ACCTL_ASYN                              0x00000020 -#ifndef NO_CS4612 -#define ACCTL_TC                                0x00000040 -#endif - -/* - *  The following defines are for the flags in the AC97 status register. - */ -#define ACSTS_CRDY                              0x00000001 -#define ACSTS_VSTS                              0x00000002 -#ifndef NO_CS4612 -#define ACSTS_WKUP                              0x00000004 -#endif - -/* - *  The following defines are for the flags in the AC97 output slot valid - *  register. - */ -#define ACOSV_SLV3                              0x00000001 -#define ACOSV_SLV4                              0x00000002 -#define ACOSV_SLV5                              0x00000004 -#define ACOSV_SLV6                              0x00000008 -#define ACOSV_SLV7                              0x00000010 -#define ACOSV_SLV8                              0x00000020 -#define ACOSV_SLV9                              0x00000040 -#define ACOSV_SLV10                             0x00000080 -#define ACOSV_SLV11                             0x00000100 -#define ACOSV_SLV12                             0x00000200 - -/* - *  The following defines are for the flags in the AC97 command address - *  register. - */ -#define ACCAD_CI_MASK                           0x0000007F -#define ACCAD_CI_SHIFT                          0 - -/* - *  The following defines are for the flags in the AC97 command data register. - */ -#define ACCDA_CD_MASK                           0x0000FFFF -#define ACCDA_CD_SHIFT                          0 - -/* - *  The following defines are for the flags in the AC97 input slot valid - *  register. - */ -#define ACISV_ISV3                              0x00000001 -#define ACISV_ISV4                              0x00000002 -#define ACISV_ISV5                              0x00000004 -#define ACISV_ISV6                              0x00000008 -#define ACISV_ISV7                              0x00000010 -#define ACISV_ISV8                              0x00000020 -#define ACISV_ISV9                              0x00000040 -#define ACISV_ISV10                             0x00000080 -#define ACISV_ISV11                             0x00000100 -#define ACISV_ISV12                             0x00000200 - -/* - *  The following defines are for the flags in the AC97 status address - *  register. - */ -#define ACSAD_SI_MASK                           0x0000007F -#define ACSAD_SI_SHIFT                          0 - -/* - *  The following defines are for the flags in the AC97 status data register. - */ -#define ACSDA_SD_MASK                           0x0000FFFF -#define ACSDA_SD_SHIFT                          0 - -/* - *  The following defines are for the flags in the joystick poll/trigger - *  register. - */ -#define JSPT_CAX                                0x00000001 -#define JSPT_CAY                                0x00000002 -#define JSPT_CBX                                0x00000004 -#define JSPT_CBY                                0x00000008 -#define JSPT_BA1                                0x00000010 -#define JSPT_BA2                                0x00000020 -#define JSPT_BB1                                0x00000040 -#define JSPT_BB2                                0x00000080 - -/* - *  The following defines are for the flags in the joystick control register. - */ -#define JSCTL_SP_MASK                           0x00000003 -#define JSCTL_SP_SLOW                           0x00000000 -#define JSCTL_SP_MEDIUM_SLOW                    0x00000001 -#define JSCTL_SP_MEDIUM_FAST                    0x00000002 -#define JSCTL_SP_FAST                           0x00000003 -#define JSCTL_ARE                               0x00000004 - -/* - *  The following defines are for the flags in the joystick coordinate pair 1 - *  readback register. - */ -#define JSC1_Y1V_MASK                           0x0000FFFF -#define JSC1_X1V_MASK                           0xFFFF0000 -#define JSC1_Y1V_SHIFT                          0 -#define JSC1_X1V_SHIFT                          16 - -/* - *  The following defines are for the flags in the joystick coordinate pair 2 - *  readback register. - */ -#define JSC2_Y2V_MASK                           0x0000FFFF -#define JSC2_X2V_MASK                           0xFFFF0000 -#define JSC2_Y2V_SHIFT                          0 -#define JSC2_X2V_SHIFT                          16 - -/* - *  The following defines are for the flags in the MIDI control register. - */ -#define MIDCR_TXE                               0x00000001	/* Enable transmitting. */ -#define MIDCR_RXE                               0x00000002	/* Enable receiving. */ -#define MIDCR_RIE                               0x00000004	/* Interrupt upon tx ready. */ -#define MIDCR_TIE                               0x00000008	/* Interrupt upon rx ready. */ -#define MIDCR_MLB                               0x00000010	/* Enable midi loopback. */ -#define MIDCR_MRST                              0x00000020	/* Reset interface. */ - -/* - *  The following defines are for the flags in the MIDI status register. - */ -#define MIDSR_TBF                               0x00000001	/* Tx FIFO is full. */ -#define MIDSR_RBE                               0x00000002	/* Rx FIFO is empty. */ - -/* - *  The following defines are for the flags in the MIDI write port register. - */ -#define MIDWP_MWD_MASK                          0x000000FF -#define MIDWP_MWD_SHIFT                         0 - -/* - *  The following defines are for the flags in the MIDI read port register. - */ -#define MIDRP_MRD_MASK                          0x000000FF -#define MIDRP_MRD_SHIFT                         0 - -/* - *  The following defines are for the flags in the joystick GPIO register. - */ -#define JSIO_DAX                                0x00000001 -#define JSIO_DAY                                0x00000002 -#define JSIO_DBX                                0x00000004 -#define JSIO_DBY                                0x00000008 -#define JSIO_AXOE                               0x00000010 -#define JSIO_AYOE                               0x00000020 -#define JSIO_BXOE                               0x00000040 -#define JSIO_BYOE                               0x00000080 - -/* - *  The following defines are for the flags in the master async/sync serial - *  port enable register. - */ -#ifndef NO_CS4612 -#define ASER_MASTER_ME                          0x00000001 -#endif - -/* - *  The following defines are for the flags in the configuration interface - *  register. - */ -#define CFGI_CLK                                0x00000001 -#define CFGI_DOUT                               0x00000002 -#define CFGI_DIN_EEN                            0x00000004 -#define CFGI_EELD                               0x00000008 - -/* - *  The following defines are for the flags in the subsystem ID and vendor ID - *  register. - */ -#define SSVID_VID_MASK                          0x0000FFFF -#define SSVID_SID_MASK                          0xFFFF0000 -#define SSVID_VID_SHIFT                         0 -#define SSVID_SID_SHIFT                         16 - -/* - *  The following defines are for the flags in the GPIO pin interface register. - */ -#define GPIOR_VOLDN                             0x00000001 -#define GPIOR_VOLUP                             0x00000002 -#define GPIOR_SI2D                              0x00000004 -#define GPIOR_SI2OE                             0x00000008 - -/* - *  The following defines are for the flags in the extended GPIO pin direction - *  register. - */ -#ifndef NO_CS4612 -#define EGPIODR_GPOE0                           0x00000001 -#define EGPIODR_GPOE1                           0x00000002 -#define EGPIODR_GPOE2                           0x00000004 -#define EGPIODR_GPOE3                           0x00000008 -#define EGPIODR_GPOE4                           0x00000010 -#define EGPIODR_GPOE5                           0x00000020 -#define EGPIODR_GPOE6                           0x00000040 -#define EGPIODR_GPOE7                           0x00000080 -#define EGPIODR_GPOE8                           0x00000100 -#endif - -/* - *  The following defines are for the flags in the extended GPIO pin polarity/ - *  type register. - */ -#ifndef NO_CS4612 -#define EGPIOPTR_GPPT0                          0x00000001 -#define EGPIOPTR_GPPT1                          0x00000002 -#define EGPIOPTR_GPPT2                          0x00000004 -#define EGPIOPTR_GPPT3                          0x00000008 -#define EGPIOPTR_GPPT4                          0x00000010 -#define EGPIOPTR_GPPT5                          0x00000020 -#define EGPIOPTR_GPPT6                          0x00000040 -#define EGPIOPTR_GPPT7                          0x00000080 -#define EGPIOPTR_GPPT8                          0x00000100 -#endif - -/* - *  The following defines are for the flags in the extended GPIO pin sticky - *  register. - */ -#ifndef NO_CS4612 -#define EGPIOTR_GPS0                            0x00000001 -#define EGPIOTR_GPS1                            0x00000002 -#define EGPIOTR_GPS2                            0x00000004 -#define EGPIOTR_GPS3                            0x00000008 -#define EGPIOTR_GPS4                            0x00000010 -#define EGPIOTR_GPS5                            0x00000020 -#define EGPIOTR_GPS6                            0x00000040 -#define EGPIOTR_GPS7                            0x00000080 -#define EGPIOTR_GPS8                            0x00000100 -#endif - -/* - *  The following defines are for the flags in the extended GPIO ping wakeup - *  register. - */ -#ifndef NO_CS4612 -#define EGPIOWR_GPW0                            0x00000001 -#define EGPIOWR_GPW1                            0x00000002 -#define EGPIOWR_GPW2                            0x00000004 -#define EGPIOWR_GPW3                            0x00000008 -#define EGPIOWR_GPW4                            0x00000010 -#define EGPIOWR_GPW5                            0x00000020 -#define EGPIOWR_GPW6                            0x00000040 -#define EGPIOWR_GPW7                            0x00000080 -#define EGPIOWR_GPW8                            0x00000100 -#endif - -/* - *  The following defines are for the flags in the extended GPIO pin status - *  register. - */ -#ifndef NO_CS4612 -#define EGPIOSR_GPS0                            0x00000001 -#define EGPIOSR_GPS1                            0x00000002 -#define EGPIOSR_GPS2                            0x00000004 -#define EGPIOSR_GPS3                            0x00000008 -#define EGPIOSR_GPS4                            0x00000010 -#define EGPIOSR_GPS5                            0x00000020 -#define EGPIOSR_GPS6                            0x00000040 -#define EGPIOSR_GPS7                            0x00000080 -#define EGPIOSR_GPS8                            0x00000100 -#endif - -/* - *  The following defines are for the flags in the serial port 6 configuration - *  register. - */ -#ifndef NO_CS4612 -#define SERC6_ASDO2EN                           0x00000001 -#endif - -/* - *  The following defines are for the flags in the serial port 7 configuration - *  register. - */ -#ifndef NO_CS4612 -#define SERC7_ASDI2EN                           0x00000001 -#define SERC7_POSILB                            0x00000002 -#define SERC7_SIPOLB                            0x00000004 -#define SERC7_SOSILB                            0x00000008 -#define SERC7_SISOLB                            0x00000010 -#endif - -/* - *  The following defines are for the flags in the serial port AC link - *  configuration register. - */ -#ifndef NO_CS4612 -#define SERACC_CHIP_TYPE_MASK                  0x00000001 -#define SERACC_CHIP_TYPE_1_03                  0x00000000 -#define SERACC_CHIP_TYPE_2_0                   0x00000001 -#define SERACC_TWO_CODECS                      0x00000002 -#define SERACC_MDM                             0x00000004 -#define SERACC_HSP                             0x00000008 -#define SERACC_ODT                             0x00000010 /* only CS4630 */ -#endif - -/* - *  The following defines are for the flags in the AC97 control register 2. - */ -#ifndef NO_CS4612 -#define ACCTL2_RSTN                             0x00000001 -#define ACCTL2_ESYN                             0x00000002 -#define ACCTL2_VFRM                             0x00000004 -#define ACCTL2_DCV                              0x00000008 -#define ACCTL2_CRW                              0x00000010 -#define ACCTL2_ASYN                             0x00000020 -#endif - -/* - *  The following defines are for the flags in the AC97 status register 2. - */ -#ifndef NO_CS4612 -#define ACSTS2_CRDY                             0x00000001 -#define ACSTS2_VSTS                             0x00000002 -#endif - -/* - *  The following defines are for the flags in the AC97 output slot valid - *  register 2. - */ -#ifndef NO_CS4612 -#define ACOSV2_SLV3                             0x00000001 -#define ACOSV2_SLV4                             0x00000002 -#define ACOSV2_SLV5                             0x00000004 -#define ACOSV2_SLV6                             0x00000008 -#define ACOSV2_SLV7                             0x00000010 -#define ACOSV2_SLV8                             0x00000020 -#define ACOSV2_SLV9                             0x00000040 -#define ACOSV2_SLV10                            0x00000080 -#define ACOSV2_SLV11                            0x00000100 -#define ACOSV2_SLV12                            0x00000200 -#endif - -/* - *  The following defines are for the flags in the AC97 command address - *  register 2. - */ -#ifndef NO_CS4612 -#define ACCAD2_CI_MASK                          0x0000007F -#define ACCAD2_CI_SHIFT                         0 -#endif - -/* - *  The following defines are for the flags in the AC97 command data register - *  2. - */ -#ifndef NO_CS4612 -#define ACCDA2_CD_MASK                          0x0000FFFF -#define ACCDA2_CD_SHIFT                         0   -#endif - -/* - *  The following defines are for the flags in the AC97 input slot valid - *  register 2. - */ -#ifndef NO_CS4612 -#define ACISV2_ISV3                             0x00000001 -#define ACISV2_ISV4                             0x00000002 -#define ACISV2_ISV5                             0x00000004 -#define ACISV2_ISV6                             0x00000008 -#define ACISV2_ISV7                             0x00000010 -#define ACISV2_ISV8                             0x00000020 -#define ACISV2_ISV9                             0x00000040 -#define ACISV2_ISV10                            0x00000080 -#define ACISV2_ISV11                            0x00000100 -#define ACISV2_ISV12                            0x00000200 -#endif - -/* - *  The following defines are for the flags in the AC97 status address - *  register 2. - */ -#ifndef NO_CS4612 -#define ACSAD2_SI_MASK                          0x0000007F -#define ACSAD2_SI_SHIFT                         0 -#endif - -/* - *  The following defines are for the flags in the AC97 status data register 2. - */ -#ifndef NO_CS4612 -#define ACSDA2_SD_MASK                          0x0000FFFF -#define ACSDA2_SD_SHIFT                         0 -#endif - -/* - *  The following defines are for the flags in the I/O trap address and control - *  registers (all 12). - */ -#ifndef NO_CS4612 -#define IOTAC_SA_MASK                           0x0000FFFF -#define IOTAC_MSK_MASK                          0x000F0000 -#define IOTAC_IODC_MASK                         0x06000000 -#define IOTAC_IODC_16_BIT                       0x00000000 -#define IOTAC_IODC_10_BIT                       0x02000000 -#define IOTAC_IODC_12_BIT                       0x04000000 -#define IOTAC_WSPI                              0x08000000 -#define IOTAC_RSPI                              0x10000000 -#define IOTAC_WSE                               0x20000000 -#define IOTAC_WE                                0x40000000 -#define IOTAC_RE                                0x80000000 -#define IOTAC_SA_SHIFT                          0 -#define IOTAC_MSK_SHIFT                         16 -#endif - -/* - *  The following defines are for the flags in the I/O trap fast read registers - *  (all 8). - */ -#ifndef NO_CS4612 -#define IOTFR_D_MASK                            0x0000FFFF -#define IOTFR_A_MASK                            0x000F0000 -#define IOTFR_R_MASK                            0x0F000000 -#define IOTFR_ALL                               0x40000000 -#define IOTFR_VL                                0x80000000 -#define IOTFR_D_SHIFT                           0 -#define IOTFR_A_SHIFT                           16 -#define IOTFR_R_SHIFT                           24 -#endif - -/* - *  The following defines are for the flags in the I/O trap FIFO register. - */ -#ifndef NO_CS4612 -#define IOTFIFO_BA_MASK                         0x00003FFF -#define IOTFIFO_S_MASK                          0x00FF0000 -#define IOTFIFO_OF                              0x40000000 -#define IOTFIFO_SPIOF                           0x80000000 -#define IOTFIFO_BA_SHIFT                        0 -#define IOTFIFO_S_SHIFT                         16 -#endif - -/* - *  The following defines are for the flags in the I/O trap retry read data - *  register. - */ -#ifndef NO_CS4612 -#define IOTRRD_D_MASK                           0x0000FFFF -#define IOTRRD_RDV                              0x80000000 -#define IOTRRD_D_SHIFT                          0 -#endif - -/* - *  The following defines are for the flags in the I/O trap FIFO pointer - *  register. - */ -#ifndef NO_CS4612 -#define IOTFP_CA_MASK                           0x00003FFF -#define IOTFP_PA_MASK                           0x3FFF0000 -#define IOTFP_CA_SHIFT                          0 -#define IOTFP_PA_SHIFT                          16 -#endif - -/* - *  The following defines are for the flags in the I/O trap control register. - */ -#ifndef NO_CS4612 -#define IOTCR_ITD                               0x00000001 -#define IOTCR_HRV                               0x00000002 -#define IOTCR_SRV                               0x00000004 -#define IOTCR_DTI                               0x00000008 -#define IOTCR_DFI                               0x00000010 -#define IOTCR_DDP                               0x00000020 -#define IOTCR_JTE                               0x00000040 -#define IOTCR_PPE                               0x00000080 -#endif - -/* - *  The following defines are for the flags in the direct PCI data register. - */ -#ifndef NO_CS4612 -#define DPCID_D_MASK                            0xFFFFFFFF -#define DPCID_D_SHIFT                           0 -#endif - -/* - *  The following defines are for the flags in the direct PCI address register. - */ -#ifndef NO_CS4612 -#define DPCIA_A_MASK                            0xFFFFFFFF -#define DPCIA_A_SHIFT                           0 -#endif - -/* - *  The following defines are for the flags in the direct PCI command register. - */ -#ifndef NO_CS4612 -#define DPCIC_C_MASK                            0x0000000F -#define DPCIC_C_IOREAD                          0x00000002 -#define DPCIC_C_IOWRITE                         0x00000003 -#define DPCIC_BE_MASK                           0x000000F0 -#endif - -/* - *  The following defines are for the flags in the PC/PCI request register. - */ -#ifndef NO_CS4612 -#define PCPCIR_RDC_MASK                         0x00000007 -#define PCPCIR_C_MASK                           0x00007000 -#define PCPCIR_REQ                              0x00008000 -#define PCPCIR_RDC_SHIFT                        0 -#define PCPCIR_C_SHIFT                          12 -#endif - -/* - *  The following defines are for the flags in the PC/PCI grant register. - */  -#ifndef NO_CS4612 -#define PCPCIG_GDC_MASK                         0x00000007 -#define PCPCIG_VL                               0x00008000 -#define PCPCIG_GDC_SHIFT                        0 -#endif - -/* - *  The following defines are for the flags in the PC/PCI master enable - *  register. - */ -#ifndef NO_CS4612 -#define PCPCIEN_EN                              0x00000001 -#endif - -/* - *  The following defines are for the flags in the extended PCI power - *  management control register. - */ -#ifndef NO_CS4612 -#define EPCIPMC_GWU                             0x00000001 -#define EPCIPMC_FSPC                            0x00000002 -#endif  - -/* - *  The following defines are for the flags in the SP control register. - */ -#define SPCR_RUN                                0x00000001 -#define SPCR_STPFR                              0x00000002 -#define SPCR_RUNFR                              0x00000004 -#define SPCR_TICK                               0x00000008 -#define SPCR_DRQEN                              0x00000020 -#define SPCR_RSTSP                              0x00000040 -#define SPCR_OREN                               0x00000080 -#ifndef NO_CS4612 -#define SPCR_PCIINT                             0x00000100 -#define SPCR_OINTD                              0x00000200 -#define SPCR_CRE                                0x00008000 -#endif - -/* - *  The following defines are for the flags in the debug index register. - */ -#define DREG_REGID_MASK                         0x0000007F -#define DREG_DEBUG                              0x00000080 -#define DREG_RGBK_MASK                          0x00000700 -#define DREG_TRAP                               0x00000800 -#if !defined(NO_CS4612) -#if !defined(NO_CS4615) -#define DREG_TRAPX                              0x00001000 -#endif -#endif -#define DREG_REGID_SHIFT                        0 -#define DREG_RGBK_SHIFT                         8 -#define DREG_RGBK_REGID_MASK                    0x0000077F -#define DREG_REGID_R0                           0x00000010 -#define DREG_REGID_R1                           0x00000011 -#define DREG_REGID_R2                           0x00000012 -#define DREG_REGID_R3                           0x00000013 -#define DREG_REGID_R4                           0x00000014 -#define DREG_REGID_R5                           0x00000015 -#define DREG_REGID_R6                           0x00000016 -#define DREG_REGID_R7                           0x00000017 -#define DREG_REGID_R8                           0x00000018 -#define DREG_REGID_R9                           0x00000019 -#define DREG_REGID_RA                           0x0000001A -#define DREG_REGID_RB                           0x0000001B -#define DREG_REGID_RC                           0x0000001C -#define DREG_REGID_RD                           0x0000001D -#define DREG_REGID_RE                           0x0000001E -#define DREG_REGID_RF                           0x0000001F -#define DREG_REGID_RA_BUS_LOW                   0x00000020 -#define DREG_REGID_RA_BUS_HIGH                  0x00000038 -#define DREG_REGID_YBUS_LOW                     0x00000050 -#define DREG_REGID_YBUS_HIGH                    0x00000058 -#define DREG_REGID_TRAP_0                       0x00000100 -#define DREG_REGID_TRAP_1                       0x00000101 -#define DREG_REGID_TRAP_2                       0x00000102 -#define DREG_REGID_TRAP_3                       0x00000103 -#define DREG_REGID_TRAP_4                       0x00000104 -#define DREG_REGID_TRAP_5                       0x00000105 -#define DREG_REGID_TRAP_6                       0x00000106 -#define DREG_REGID_TRAP_7                       0x00000107 -#define DREG_REGID_INDIRECT_ADDRESS             0x0000010E -#define DREG_REGID_TOP_OF_STACK                 0x0000010F -#if !defined(NO_CS4612) -#if !defined(NO_CS4615) -#define DREG_REGID_TRAP_8                       0x00000110 -#define DREG_REGID_TRAP_9                       0x00000111 -#define DREG_REGID_TRAP_10                      0x00000112 -#define DREG_REGID_TRAP_11                      0x00000113 -#define DREG_REGID_TRAP_12                      0x00000114 -#define DREG_REGID_TRAP_13                      0x00000115 -#define DREG_REGID_TRAP_14                      0x00000116 -#define DREG_REGID_TRAP_15                      0x00000117 -#define DREG_REGID_TRAP_16                      0x00000118 -#define DREG_REGID_TRAP_17                      0x00000119 -#define DREG_REGID_TRAP_18                      0x0000011A -#define DREG_REGID_TRAP_19                      0x0000011B -#define DREG_REGID_TRAP_20                      0x0000011C -#define DREG_REGID_TRAP_21                      0x0000011D -#define DREG_REGID_TRAP_22                      0x0000011E -#define DREG_REGID_TRAP_23                      0x0000011F -#endif -#endif -#define DREG_REGID_RSA0_LOW                     0x00000200 -#define DREG_REGID_RSA0_HIGH                    0x00000201 -#define DREG_REGID_RSA1_LOW                     0x00000202 -#define DREG_REGID_RSA1_HIGH                    0x00000203 -#define DREG_REGID_RSA2                         0x00000204 -#define DREG_REGID_RSA3                         0x00000205 -#define DREG_REGID_RSI0_LOW                     0x00000206 -#define DREG_REGID_RSI0_HIGH                    0x00000207 -#define DREG_REGID_RSI1                         0x00000208 -#define DREG_REGID_RSI2                         0x00000209 -#define DREG_REGID_SAGUSTATUS                   0x0000020A -#define DREG_REGID_RSCONFIG01_LOW               0x0000020B -#define DREG_REGID_RSCONFIG01_HIGH              0x0000020C -#define DREG_REGID_RSCONFIG23_LOW               0x0000020D -#define DREG_REGID_RSCONFIG23_HIGH              0x0000020E -#define DREG_REGID_RSDMA01E                     0x0000020F -#define DREG_REGID_RSDMA23E                     0x00000210 -#define DREG_REGID_RSD0_LOW                     0x00000211 -#define DREG_REGID_RSD0_HIGH                    0x00000212 -#define DREG_REGID_RSD1_LOW                     0x00000213 -#define DREG_REGID_RSD1_HIGH                    0x00000214 -#define DREG_REGID_RSD2_LOW                     0x00000215 -#define DREG_REGID_RSD2_HIGH                    0x00000216 -#define DREG_REGID_RSD3_LOW                     0x00000217 -#define DREG_REGID_RSD3_HIGH                    0x00000218 -#define DREG_REGID_SRAR_HIGH                    0x0000021A -#define DREG_REGID_SRAR_LOW                     0x0000021B -#define DREG_REGID_DMA_STATE                    0x0000021C -#define DREG_REGID_CURRENT_DMA_STREAM           0x0000021D -#define DREG_REGID_NEXT_DMA_STREAM              0x0000021E -#define DREG_REGID_CPU_STATUS                   0x00000300 -#define DREG_REGID_MAC_MODE                     0x00000301 -#define DREG_REGID_STACK_AND_REPEAT             0x00000302 -#define DREG_REGID_INDEX0                       0x00000304 -#define DREG_REGID_INDEX1                       0x00000305 -#define DREG_REGID_DMA_STATE_0_3                0x00000400 -#define DREG_REGID_DMA_STATE_4_7                0x00000404 -#define DREG_REGID_DMA_STATE_8_11               0x00000408 -#define DREG_REGID_DMA_STATE_12_15              0x0000040C -#define DREG_REGID_DMA_STATE_16_19              0x00000410 -#define DREG_REGID_DMA_STATE_20_23              0x00000414 -#define DREG_REGID_DMA_STATE_24_27              0x00000418 -#define DREG_REGID_DMA_STATE_28_31              0x0000041C -#define DREG_REGID_DMA_STATE_32_35              0x00000420 -#define DREG_REGID_DMA_STATE_36_39              0x00000424 -#define DREG_REGID_DMA_STATE_40_43              0x00000428 -#define DREG_REGID_DMA_STATE_44_47              0x0000042C -#define DREG_REGID_DMA_STATE_48_51              0x00000430 -#define DREG_REGID_DMA_STATE_52_55              0x00000434 -#define DREG_REGID_DMA_STATE_56_59              0x00000438 -#define DREG_REGID_DMA_STATE_60_63              0x0000043C -#define DREG_REGID_DMA_STATE_64_67              0x00000440 -#define DREG_REGID_DMA_STATE_68_71              0x00000444 -#define DREG_REGID_DMA_STATE_72_75              0x00000448 -#define DREG_REGID_DMA_STATE_76_79              0x0000044C -#define DREG_REGID_DMA_STATE_80_83              0x00000450 -#define DREG_REGID_DMA_STATE_84_87              0x00000454 -#define DREG_REGID_DMA_STATE_88_91              0x00000458 -#define DREG_REGID_DMA_STATE_92_95              0x0000045C -#define DREG_REGID_TRAP_SELECT                  0x00000500 -#define DREG_REGID_TRAP_WRITE_0                 0x00000500 -#define DREG_REGID_TRAP_WRITE_1                 0x00000501 -#define DREG_REGID_TRAP_WRITE_2                 0x00000502 -#define DREG_REGID_TRAP_WRITE_3                 0x00000503 -#define DREG_REGID_TRAP_WRITE_4                 0x00000504 -#define DREG_REGID_TRAP_WRITE_5                 0x00000505 -#define DREG_REGID_TRAP_WRITE_6                 0x00000506 -#define DREG_REGID_TRAP_WRITE_7                 0x00000507 -#if !defined(NO_CS4612) -#if !defined(NO_CS4615) -#define DREG_REGID_TRAP_WRITE_8                 0x00000510 -#define DREG_REGID_TRAP_WRITE_9                 0x00000511 -#define DREG_REGID_TRAP_WRITE_10                0x00000512 -#define DREG_REGID_TRAP_WRITE_11                0x00000513 -#define DREG_REGID_TRAP_WRITE_12                0x00000514 -#define DREG_REGID_TRAP_WRITE_13                0x00000515 -#define DREG_REGID_TRAP_WRITE_14                0x00000516 -#define DREG_REGID_TRAP_WRITE_15                0x00000517 -#define DREG_REGID_TRAP_WRITE_16                0x00000518 -#define DREG_REGID_TRAP_WRITE_17                0x00000519 -#define DREG_REGID_TRAP_WRITE_18                0x0000051A -#define DREG_REGID_TRAP_WRITE_19                0x0000051B -#define DREG_REGID_TRAP_WRITE_20                0x0000051C -#define DREG_REGID_TRAP_WRITE_21                0x0000051D -#define DREG_REGID_TRAP_WRITE_22                0x0000051E -#define DREG_REGID_TRAP_WRITE_23                0x0000051F -#endif -#endif -#define DREG_REGID_MAC0_ACC0_LOW                0x00000600 -#define DREG_REGID_MAC0_ACC1_LOW                0x00000601 -#define DREG_REGID_MAC0_ACC2_LOW                0x00000602 -#define DREG_REGID_MAC0_ACC3_LOW                0x00000603 -#define DREG_REGID_MAC1_ACC0_LOW                0x00000604 -#define DREG_REGID_MAC1_ACC1_LOW                0x00000605 -#define DREG_REGID_MAC1_ACC2_LOW                0x00000606 -#define DREG_REGID_MAC1_ACC3_LOW                0x00000607 -#define DREG_REGID_MAC0_ACC0_MID                0x00000608 -#define DREG_REGID_MAC0_ACC1_MID                0x00000609 -#define DREG_REGID_MAC0_ACC2_MID                0x0000060A -#define DREG_REGID_MAC0_ACC3_MID                0x0000060B -#define DREG_REGID_MAC1_ACC0_MID                0x0000060C -#define DREG_REGID_MAC1_ACC1_MID                0x0000060D -#define DREG_REGID_MAC1_ACC2_MID                0x0000060E -#define DREG_REGID_MAC1_ACC3_MID                0x0000060F -#define DREG_REGID_MAC0_ACC0_HIGH               0x00000610 -#define DREG_REGID_MAC0_ACC1_HIGH               0x00000611 -#define DREG_REGID_MAC0_ACC2_HIGH               0x00000612 -#define DREG_REGID_MAC0_ACC3_HIGH               0x00000613 -#define DREG_REGID_MAC1_ACC0_HIGH               0x00000614 -#define DREG_REGID_MAC1_ACC1_HIGH               0x00000615 -#define DREG_REGID_MAC1_ACC2_HIGH               0x00000616 -#define DREG_REGID_MAC1_ACC3_HIGH               0x00000617 -#define DREG_REGID_RSHOUT_LOW                   0x00000620 -#define DREG_REGID_RSHOUT_MID                   0x00000628 -#define DREG_REGID_RSHOUT_HIGH                  0x00000630 - -/* - *  The following defines are for the flags in the DMA stream requestor write - */ -#define DSRWP_DSR_MASK                          0x0000000F -#define DSRWP_DSR_BG_RQ                         0x00000001 -#define DSRWP_DSR_PRIORITY_MASK                 0x00000006 -#define DSRWP_DSR_PRIORITY_0                    0x00000000 -#define DSRWP_DSR_PRIORITY_1                    0x00000002 -#define DSRWP_DSR_PRIORITY_2                    0x00000004 -#define DSRWP_DSR_PRIORITY_3                    0x00000006 -#define DSRWP_DSR_RQ_PENDING                    0x00000008 - -/* - *  The following defines are for the flags in the trap write port register. - */ -#define TWPR_TW_MASK                            0x0000FFFF -#define TWPR_TW_SHIFT                           0 - -/* - *  The following defines are for the flags in the stack pointer write - *  register. - */ -#define SPWR_STKP_MASK                          0x0000000F -#define SPWR_STKP_SHIFT                         0 - -/* - *  The following defines are for the flags in the SP interrupt register. - */ -#define SPIR_FRI                                0x00000001 -#define SPIR_DOI                                0x00000002 -#define SPIR_GPI2                               0x00000004 -#define SPIR_GPI3                               0x00000008 -#define SPIR_IP0                                0x00000010 -#define SPIR_IP1                                0x00000020 -#define SPIR_IP2                                0x00000040 -#define SPIR_IP3                                0x00000080 - -/* - *  The following defines are for the flags in the functional group 1 register. - */ -#define FGR1_F1S_MASK                           0x0000FFFF -#define FGR1_F1S_SHIFT                          0 - -/* - *  The following defines are for the flags in the SP clock status register. - */ -#define SPCS_FRI                                0x00000001 -#define SPCS_DOI                                0x00000002 -#define SPCS_GPI2                               0x00000004 -#define SPCS_GPI3                               0x00000008 -#define SPCS_IP0                                0x00000010 -#define SPCS_IP1                                0x00000020 -#define SPCS_IP2                                0x00000040 -#define SPCS_IP3                                0x00000080 -#define SPCS_SPRUN                              0x00000100 -#define SPCS_SLEEP                              0x00000200 -#define SPCS_FG                                 0x00000400 -#define SPCS_ORUN                               0x00000800 -#define SPCS_IRQ                                0x00001000 -#define SPCS_FGN_MASK                           0x0000E000 -#define SPCS_FGN_SHIFT                          13 - -/* - *  The following defines are for the flags in the SP DMA requestor status - *  register. - */ -#define SDSR_DCS_MASK                           0x000000FF -#define SDSR_DCS_SHIFT                          0 -#define SDSR_DCS_NONE                           0x00000007 - -/* - *  The following defines are for the flags in the frame timer register. - */ -#define FRMT_FTV_MASK                           0x0000FFFF -#define FRMT_FTV_SHIFT                          0 - -/* - *  The following defines are for the flags in the frame timer current count - *  register. - */ -#define FRCC_FCC_MASK                           0x0000FFFF -#define FRCC_FCC_SHIFT                          0 - -/* - *  The following defines are for the flags in the frame timer save count - *  register. - */ -#define FRSC_FCS_MASK                           0x0000FFFF -#define FRSC_FCS_SHIFT                          0 - -/* - *  The following define the various flags stored in the scatter/gather - *  descriptors. - */ -#define DMA_SG_NEXT_ENTRY_MASK                  0x00000FF8 -#define DMA_SG_SAMPLE_END_MASK                  0x0FFF0000 -#define DMA_SG_SAMPLE_END_FLAG                  0x10000000 -#define DMA_SG_LOOP_END_FLAG                    0x20000000 -#define DMA_SG_SIGNAL_END_FLAG                  0x40000000 -#define DMA_SG_SIGNAL_PAGE_FLAG                 0x80000000 -#define DMA_SG_NEXT_ENTRY_SHIFT                 3 -#define DMA_SG_SAMPLE_END_SHIFT                 16 - -/* - *  The following define the offsets of the fields within the on-chip generic - *  DMA requestor. - */ -#define DMA_RQ_CONTROL1                         0x00000000 -#define DMA_RQ_CONTROL2                         0x00000004 -#define DMA_RQ_SOURCE_ADDR                      0x00000008 -#define DMA_RQ_DESTINATION_ADDR                 0x0000000C -#define DMA_RQ_NEXT_PAGE_ADDR                   0x00000010 -#define DMA_RQ_NEXT_PAGE_SGDESC                 0x00000014 -#define DMA_RQ_LOOP_START_ADDR                  0x00000018 -#define DMA_RQ_POST_LOOP_ADDR                   0x0000001C -#define DMA_RQ_PAGE_MAP_ADDR                    0x00000020 - -/* - *  The following defines are for the flags in the first control word of the - *  on-chip generic DMA requestor. - */ -#define DMA_RQ_C1_COUNT_MASK                    0x000003FF -#define DMA_RQ_C1_DESTINATION_SCATTER           0x00001000 -#define DMA_RQ_C1_SOURCE_GATHER                 0x00002000 -#define DMA_RQ_C1_DONE_FLAG                     0x00004000 -#define DMA_RQ_C1_OPTIMIZE_STATE                0x00008000 -#define DMA_RQ_C1_SAMPLE_END_STATE_MASK         0x00030000 -#define DMA_RQ_C1_FULL_PAGE                     0x00000000 -#define DMA_RQ_C1_BEFORE_SAMPLE_END             0x00010000 -#define DMA_RQ_C1_PAGE_MAP_ERROR                0x00020000 -#define DMA_RQ_C1_AT_SAMPLE_END                 0x00030000 -#define DMA_RQ_C1_LOOP_END_STATE_MASK           0x000C0000 -#define DMA_RQ_C1_NOT_LOOP_END                  0x00000000 -#define DMA_RQ_C1_BEFORE_LOOP_END               0x00040000 -#define DMA_RQ_C1_2PAGE_LOOP_BEGIN              0x00080000 -#define DMA_RQ_C1_LOOP_BEGIN                    0x000C0000 -#define DMA_RQ_C1_PAGE_MAP_MASK                 0x00300000 -#define DMA_RQ_C1_PM_NONE_PENDING               0x00000000 -#define DMA_RQ_C1_PM_NEXT_PENDING               0x00100000 -#define DMA_RQ_C1_PM_RESERVED                   0x00200000 -#define DMA_RQ_C1_PM_LOOP_NEXT_PENDING          0x00300000 -#define DMA_RQ_C1_WRITEBACK_DEST_FLAG           0x00400000 -#define DMA_RQ_C1_WRITEBACK_SRC_FLAG            0x00800000 -#define DMA_RQ_C1_DEST_SIZE_MASK                0x07000000 -#define DMA_RQ_C1_DEST_LINEAR                   0x00000000 -#define DMA_RQ_C1_DEST_MOD16                    0x01000000 -#define DMA_RQ_C1_DEST_MOD32                    0x02000000 -#define DMA_RQ_C1_DEST_MOD64                    0x03000000 -#define DMA_RQ_C1_DEST_MOD128                   0x04000000 -#define DMA_RQ_C1_DEST_MOD256                   0x05000000 -#define DMA_RQ_C1_DEST_MOD512                   0x06000000 -#define DMA_RQ_C1_DEST_MOD1024                  0x07000000 -#define DMA_RQ_C1_DEST_ON_HOST                  0x08000000 -#define DMA_RQ_C1_SOURCE_SIZE_MASK              0x70000000 -#define DMA_RQ_C1_SOURCE_LINEAR                 0x00000000 -#define DMA_RQ_C1_SOURCE_MOD16                  0x10000000 -#define DMA_RQ_C1_SOURCE_MOD32                  0x20000000 -#define DMA_RQ_C1_SOURCE_MOD64                  0x30000000 -#define DMA_RQ_C1_SOURCE_MOD128                 0x40000000 -#define DMA_RQ_C1_SOURCE_MOD256                 0x50000000 -#define DMA_RQ_C1_SOURCE_MOD512                 0x60000000 -#define DMA_RQ_C1_SOURCE_MOD1024                0x70000000 -#define DMA_RQ_C1_SOURCE_ON_HOST                0x80000000 -#define DMA_RQ_C1_COUNT_SHIFT                   0 - -/* - *  The following defines are for the flags in the second control word of the - *  on-chip generic DMA requestor. - */ -#define DMA_RQ_C2_VIRTUAL_CHANNEL_MASK          0x0000003F -#define DMA_RQ_C2_VIRTUAL_SIGNAL_MASK           0x00000300 -#define DMA_RQ_C2_NO_VIRTUAL_SIGNAL             0x00000000 -#define DMA_RQ_C2_SIGNAL_EVERY_DMA              0x00000100 -#define DMA_RQ_C2_SIGNAL_SOURCE_PINGPONG        0x00000200 -#define DMA_RQ_C2_SIGNAL_DEST_PINGPONG          0x00000300 -#define DMA_RQ_C2_AUDIO_CONVERT_MASK            0x0000F000 -#define DMA_RQ_C2_AC_NONE                       0x00000000 -#define DMA_RQ_C2_AC_8_TO_16_BIT                0x00001000 -#define DMA_RQ_C2_AC_MONO_TO_STEREO             0x00002000 -#define DMA_RQ_C2_AC_ENDIAN_CONVERT             0x00004000 -#define DMA_RQ_C2_AC_SIGNED_CONVERT             0x00008000 -#define DMA_RQ_C2_LOOP_END_MASK                 0x0FFF0000 -#define DMA_RQ_C2_LOOP_MASK                     0x30000000 -#define DMA_RQ_C2_NO_LOOP                       0x00000000 -#define DMA_RQ_C2_ONE_PAGE_LOOP                 0x10000000 -#define DMA_RQ_C2_TWO_PAGE_LOOP                 0x20000000 -#define DMA_RQ_C2_MULTI_PAGE_LOOP               0x30000000 -#define DMA_RQ_C2_SIGNAL_LOOP_BACK              0x40000000 -#define DMA_RQ_C2_SIGNAL_POST_BEGIN_PAGE        0x80000000 -#define DMA_RQ_C2_VIRTUAL_CHANNEL_SHIFT         0 -#define DMA_RQ_C2_LOOP_END_SHIFT                16 - -/* - *  The following defines are for the flags in the source and destination words - *  of the on-chip generic DMA requestor. - */ -#define DMA_RQ_SD_ADDRESS_MASK                  0x0000FFFF -#define DMA_RQ_SD_MEMORY_ID_MASK                0x000F0000 -#define DMA_RQ_SD_SP_PARAM_ADDR                 0x00000000 -#define DMA_RQ_SD_SP_SAMPLE_ADDR                0x00010000 -#define DMA_RQ_SD_SP_PROGRAM_ADDR               0x00020000 -#define DMA_RQ_SD_SP_DEBUG_ADDR                 0x00030000 -#define DMA_RQ_SD_OMNIMEM_ADDR                  0x000E0000 -#define DMA_RQ_SD_END_FLAG                      0x40000000 -#define DMA_RQ_SD_ERROR_FLAG                    0x80000000 -#define DMA_RQ_SD_ADDRESS_SHIFT                 0 - -/* - *  The following defines are for the flags in the page map address word of the - *  on-chip generic DMA requestor. - */ -#define DMA_RQ_PMA_LOOP_THIRD_PAGE_ENTRY_MASK   0x00000FF8 -#define DMA_RQ_PMA_PAGE_TABLE_MASK              0xFFFFF000 -#define DMA_RQ_PMA_LOOP_THIRD_PAGE_ENTRY_SHIFT  3 -#define DMA_RQ_PMA_PAGE_TABLE_SHIFT             12 - -#define BA1_VARIDEC_BUF_1       0x000 - -#define BA1_PDTC                0x0c0    /* BA1_PLAY_DMA_TRANSACTION_COUNT_REG */ -#define BA1_PFIE                0x0c4    /* BA1_PLAY_FORMAT_&_INTERRUPT_ENABLE_REG */ -#define BA1_PBA                 0x0c8    /* BA1_PLAY_BUFFER_ADDRESS */ -#define BA1_PVOL                0x0f8    /* BA1_PLAY_VOLUME_REG */ -#define BA1_PSRC                0x288    /* BA1_PLAY_SAMPLE_RATE_CORRECTION_REG */ -#define BA1_PCTL                0x2a4    /* BA1_PLAY_CONTROL_REG */ -#define BA1_PPI                 0x2b4    /* BA1_PLAY_PHASE_INCREMENT_REG */ - -#define BA1_CCTL                0x064    /* BA1_CAPTURE_CONTROL_REG */ -#define BA1_CIE                 0x104    /* BA1_CAPTURE_INTERRUPT_ENABLE_REG */ -#define BA1_CBA                 0x10c    /* BA1_CAPTURE_BUFFER_ADDRESS */ -#define BA1_CSRC                0x2c8    /* BA1_CAPTURE_SAMPLE_RATE_CORRECTION_REG */ -#define BA1_CCI                 0x2d8    /* BA1_CAPTURE_COEFFICIENT_INCREMENT_REG */ -#define BA1_CD                  0x2e0    /* BA1_CAPTURE_DELAY_REG */ -#define BA1_CPI                 0x2f4    /* BA1_CAPTURE_PHASE_INCREMENT_REG */ -#define BA1_CVOL                0x2f8    /* BA1_CAPTURE_VOLUME_REG */ - -#define BA1_CFG1                0x134    /* BA1_CAPTURE_FRAME_GROUP_1_REG */ -#define BA1_CFG2                0x138    /* BA1_CAPTURE_FRAME_GROUP_2_REG */ -#define BA1_CCST                0x13c    /* BA1_CAPTURE_CONSTANT_REG */ -#define BA1_CSPB                0x340    /* BA1_CAPTURE_SPB_ADDRESS */ - -/* - * - */ - -#define CS46XX_MODE_OUTPUT	(1<<0)	 /* MIDI UART - output */  -#define CS46XX_MODE_INPUT	(1<<1)	 /* MIDI UART - input */ - -/* - * - */ - -#define SAVE_REG_MAX             0x10 -#define POWER_DOWN_ALL         0x7f0f - -/* maxinum number of AC97 codecs connected, AC97 2.0 defined 4 */ -#define MAX_NR_AC97				            4 -#define CS46XX_PRIMARY_CODEC_INDEX          0 -#define CS46XX_SECONDARY_CODEC_INDEX		1 -#define CS46XX_SECONDARY_CODEC_OFFSET		0x80 -#define CS46XX_DSP_CAPTURE_CHANNEL          1 - -/* capture */ -#define CS46XX_DSP_CAPTURE_CHANNEL          1 - -/* mixer */ -#define CS46XX_MIXER_SPDIF_INPUT_ELEMENT    1 -#define CS46XX_MIXER_SPDIF_OUTPUT_ELEMENT   2 - - -struct snd_cs46xx_pcm { -	struct snd_dma_buffer hw_buf; -   -	unsigned int ctl; -	unsigned int shift;	/* Shift count to trasform frames in bytes */ -	struct snd_pcm_indirect pcm_rec; -	struct snd_pcm_substream *substream; - -	struct dsp_pcm_channel_descriptor * pcm_channel; - -	int pcm_channel_id;    /* Fron Rear, Center Lfe  ... */ -}; - -struct snd_cs46xx_region { -	char name[24]; -	unsigned long base; -	void __iomem *remap_addr; -	unsigned long size; -	struct resource *resource; -}; - -struct snd_cs46xx { -	int irq; -	unsigned long ba0_addr; -	unsigned long ba1_addr; -	union { -		struct { -			struct snd_cs46xx_region ba0; -			struct snd_cs46xx_region data0; -			struct snd_cs46xx_region data1; -			struct snd_cs46xx_region pmem; -			struct snd_cs46xx_region reg; -		} name; -		struct snd_cs46xx_region idx[5]; -	} region; - -	unsigned int mode; -	 -	struct { -		struct snd_dma_buffer hw_buf; - -		unsigned int ctl; -		unsigned int shift;	/* Shift count to trasform frames in bytes */ -		struct snd_pcm_indirect pcm_rec; -		struct snd_pcm_substream *substream; -	} capt; - - -	int nr_ac97_codecs; -	struct snd_ac97_bus *ac97_bus; -	struct snd_ac97 *ac97[MAX_NR_AC97]; - -	struct pci_dev *pci; -	struct snd_card *card; -	struct snd_pcm *pcm; - -	struct snd_rawmidi *rmidi; -	struct snd_rawmidi_substream *midi_input; -	struct snd_rawmidi_substream *midi_output; - -	spinlock_t reg_lock; -	unsigned int midcr; -	unsigned int uartm; - -	int amplifier; -	void (*amplifier_ctrl)(struct snd_cs46xx *, int); -	void (*active_ctrl)(struct snd_cs46xx *, int); -  	void (*mixer_init)(struct snd_cs46xx *); - -	int acpi_port; -	struct snd_kcontrol *eapd_switch; /* for amplifier hack */ -	int accept_valid;	/* accept mmap valid (for OSS) */ -	int in_suspend; - -	struct gameport *gameport; - -#ifdef CONFIG_SND_CS46XX_NEW_DSP -	struct mutex spos_mutex; - -	struct dsp_spos_instance * dsp_spos_instance; - -	struct snd_pcm *pcm_rear; -	struct snd_pcm *pcm_center_lfe; -	struct snd_pcm *pcm_iec958; -#else /* for compatibility */ -	struct snd_cs46xx_pcm *playback_pcm; -	unsigned int play_ctl; -#endif - -#ifdef CONFIG_PM -	u32 *saved_regs; -#endif -}; - -int snd_cs46xx_create(struct snd_card *card, -		      struct pci_dev *pci, -		      int external_amp, int thinkpad, -		      struct snd_cs46xx **rcodec); -int snd_cs46xx_suspend(struct pci_dev *pci, pm_message_t state); -int snd_cs46xx_resume(struct pci_dev *pci); - -int snd_cs46xx_pcm(struct snd_cs46xx *chip, int device, struct snd_pcm **rpcm); -int snd_cs46xx_pcm_rear(struct snd_cs46xx *chip, int device, struct snd_pcm **rpcm); -int snd_cs46xx_pcm_iec958(struct snd_cs46xx *chip, int device, struct snd_pcm **rpcm); -int snd_cs46xx_pcm_center_lfe(struct snd_cs46xx *chip, int device, struct snd_pcm **rpcm); -int snd_cs46xx_mixer(struct snd_cs46xx *chip, int spdif_device); -int snd_cs46xx_midi(struct snd_cs46xx *chip, int device, struct snd_rawmidi **rmidi); -int snd_cs46xx_start_dsp(struct snd_cs46xx *chip); -int snd_cs46xx_gameport(struct snd_cs46xx *chip); - -#endif /* __SOUND_CS46XX_H */ diff --git a/include/sound/cs46xx_dsp_scb_types.h b/include/sound/cs46xx_dsp_scb_types.h deleted file mode 100644 index 080857ad0ca..00000000000 --- a/include/sound/cs46xx_dsp_scb_types.h +++ /dev/null @@ -1,1213 +0,0 @@ -/* - *  The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards - *  Copyright (c) by Jaroslav Kysela <perex@perex.cz> - * - * - *   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; either version 2 of the License, or - *   (at your option) any later version. - * - *   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 - * - * - * NOTE: comments are copy/paste from cwcemb80.lst  - * provided by Tom Woller at Cirrus (my only - * documentation about the SP OS running inside - * the DSP)  - */ - -#ifndef __CS46XX_DSP_SCB_TYPES_H__ -#define __CS46XX_DSP_SCB_TYPES_H__ - -#include <asm/byteorder.h> - -#ifndef ___DSP_DUAL_16BIT_ALLOC -#if   defined(__LITTLE_ENDIAN) -#define ___DSP_DUAL_16BIT_ALLOC(a,b) u16 a; u16 b; -#elif defined(__BIG_ENDIAN) -#define ___DSP_DUAL_16BIT_ALLOC(a,b) u16 b; u16 a; -#else -#error Not __LITTLE_ENDIAN and not __BIG_ENDIAN, then what ??? -#endif -#endif - -/* This structs are used internally by the SP */ - -struct dsp_basic_dma_req { -	/* DMA Requestor Word 0 (DCW)  fields: - -	   31 [30-28]27  [26:24] 23 22 21 20 [19:18] [17:16] 15 14 13  12  11 10 9 8 7 6  [5:0] -	   _______________________________________________________________________________________	 -	   |S| SBT  |D|  DBT    |wb|wb|  |  |  LS  |  SS   |Opt|Do|SSG|DSG|  |  | | | | | Dword   | -	   |H|_____ |H|_________|S_|D |__|__|______|_______|___|ne|__ |__ |__|__|_|_|_|_|_Count -1| -	*/ -	u32 dcw;                 /* DMA Control Word */ -	u32 dmw;                 /* DMA Mode Word */ -	u32 saw;                 /* Source Address Word */ -	u32 daw;                 /* Destination Address Word  */ -}; - -struct dsp_scatter_gather_ext { -	u32 npaw;                /* Next-Page Address Word */ - -	/* DMA Requestor Word 5 (NPCW)  fields: -      -	   31-30 29 28          [27:16]              [15:12]             [11:3]                [2:0] 				 -	   _________________________________________________________________________________________	 -	   |SV  |LE|SE|   Sample-end byte offset   |         | Page-map entry offset for next  |    |  -	   |page|__|__| ___________________________|_________|__page, if !sample-end___________|____| -	*/ -	u32 npcw;                /* Next-Page Control Word */ -	u32 lbaw;                /* Loop-Begin Address Word */ -	u32 nplbaw;              /* Next-Page after Loop-Begin Address Word */ -	u32 sgaw;                /* Scatter/Gather Address Word */ -}; - -struct dsp_volume_control { -	___DSP_DUAL_16BIT_ALLOC( -	   rightTarg,  /* Target volume for left & right channels */ -	   leftTarg -	) -	___DSP_DUAL_16BIT_ALLOC( -	   rightVol,   /* Current left & right channel volumes */ -	   leftVol -	) -}; - -/* Generic stream control block (SCB) structure definition */ -struct dsp_generic_scb { -	/* For streaming I/O, the DSP should never alter any words in the DMA -	   requestor or the scatter/gather extension.  Only ad hoc DMA request -	   streams are free to alter the requestor (currently only occur in the -	   DOS-based MIDI controller and in debugger-inserted code). -     -	   If an SCB does not have any associated DMA requestor, these 9 ints -	   may be freed for use by other tasks, but the pointer to the SCB must -	   still be such that the insOrd:nextSCB appear at offset 9 from the -	   SCB pointer. -      -	   Basic (non scatter/gather) DMA requestor (4 ints) -	*/ -   -	/* Initialized by the host, only modified by DMA  -	   R/O for the DSP task */ -	struct dsp_basic_dma_req  basic_req;  /* Optional */ - -	/* Scatter/gather DMA requestor extension   (5 ints)  -	   Initialized by the host, only modified by DMA -	   DSP task never needs to even read these. -	*/ -	struct dsp_scatter_gather_ext sg_ext;  /* Optional */ - -	/* Sublist pointer & next stream control block (SCB) link. -	   Initialized & modified by the host R/O for the DSP task -	*/ -	___DSP_DUAL_16BIT_ALLOC( -	    next_scb,     /* REQUIRED */ -	    sub_list_ptr  /* REQUIRED */ -	) -   -	/* Pointer to this tasks parameter block & stream function pointer  -	   Initialized by the host  R/O for the DSP task */ -	___DSP_DUAL_16BIT_ALLOC( -	    entry_point,  /* REQUIRED */ -	    this_spb      /* REQUIRED */ -	) - -	/* rsConfig register for stream buffer (rsDMA reg.  -	   is loaded from basicReq.daw for incoming streams, or  -	   basicReq.saw, for outgoing streams)  - -	   31 30 29  [28:24]     [23:16] 15 14 13 12 11 10 9 8 7 6  5      4      [3:0] -	   ______________________________________________________________________________ -	   |DMA  |D|maxDMAsize| streamNum|dir|p|  |  |  |  | | |ds |shr 1|rev Cy | mod   | -	   |prio |_|__________|__________|___|_|__|__|__|__|_|_|___|_____|_______|_______| -	   31 30 29  [28:24]     [23:16] 15 14 13 12 11 10 9 8 7 6  5      4      [3:0] - - -	   Initialized by the host R/O for the DSP task -	*/ -	u32  strm_rs_config; /* REQUIRED */ -               //  -	/* On mixer input streams: indicates mixer input stream configuration -	   On Tees, this is copied from the stream being snooped - -	   Stream sample pointer & MAC-unit mode for this stream  -      -	   Initialized by the host Updated by the DSP task -	*/ -	u32  strm_buf_ptr; /* REQUIRED  */ - -	/* On mixer input streams: points to next mixer input and is updated by the -                                   mixer subroutine in the "parent" DSP task -				   (least-significant 16 bits are preserved, unused) -     -           On Tees, the pointer is copied from the stream being snooped on -	   initialization, and, subsequently, it is copied into the -	   stream being snooped. - -	   On wavetable/3D voices: the strmBufPtr will use all 32 bits to allow for -                                   fractional phase accumulation - -	   Fractional increment per output sample in the input sample buffer - -	   (Not used on mixer input streams & redefined on Tees) -	   On wavetable/3D voices: this 32-bit word specifies the integer.fractional  -	   increment per output sample. -	*/ -	u32  strmPhiIncr; - - -	/* Standard stereo volume control -	   Initialized by the host (host updates target volumes)  - -	   Current volumes update by the DSP task -	   On mixer input streams: required & updated by the mixer subroutine in the -                                   "parent" DSP task - -	   On Tees, both current & target volumes are copied up on initialization, -	   and, subsequently, the target volume is copied up while the current -	   volume is copied down. -      -	   These two 32-bit words are redefined for wavetable & 3-D voices.     -	*/ -	struct dsp_volume_control vol_ctrl_t;   /* Optional */ -}; - - -struct dsp_spos_control_block { -	/* WARNING: Certain items in this structure are modified by the host -	            Any dword that can be modified by the host, must not be -		    modified by the SP as the host can only do atomic dword -		    writes, and to do otherwise, even a read modify write,  -		    may lead to corrupted data on the SP. -   -		    This rule does not apply to one off boot time initialisation prior to starting the SP -	*/ - - -	___DSP_DUAL_16BIT_ALLOC(  -	/* First element on the Hyper forground task tree */ -	    hfg_tree_root_ptr,  /* HOST */			     -	/* First 3 dwords are written by the host and read-only on the DSP */ -	    hfg_stack_base      /* HOST */ -	) - -	___DSP_DUAL_16BIT_ALLOC( -	/* Point to this data structure to enable easy access */ -	    spos_cb_ptr,	 /* SP */ -	    prev_task_tree_ptr   /* SP && HOST */ -	) - -	___DSP_DUAL_16BIT_ALLOC( -	/* Currently Unused */ -	    xxinterval_timer_period, -	/* Enable extension of SPOS data structure */ -	    HFGSPB_ptr -	) - - -	___DSP_DUAL_16BIT_ALLOC( -	    xxnum_HFG_ticks_thisInterval, -	/* Modified by the DSP */ -	    xxnum_tntervals -	) - - -	/* Set by DSP upon encountering a trap (breakpoint) or a spurious -	   interrupt.  The host must clear this dword after reading it -	   upon receiving spInt1. */ -	___DSP_DUAL_16BIT_ALLOC( -	    spurious_int_flag,	 /* (Host & SP) Nature of the spurious interrupt */ -	    trap_flag            /* (Host & SP) Nature of detected Trap */ -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    unused2,					 -	    invalid_IP_flag        /* (Host & SP ) Indicate detection of invalid instruction pointer */ -	) - -	___DSP_DUAL_16BIT_ALLOC( -	/* pointer to forground task tree header for use in next task search */ -	    fg_task_tree_hdr_ptr,	  /* HOST */		 -	/* Data structure for controlling synchronous link update */ -	    hfg_sync_update_ptr           /* HOST */ -	) -   -	___DSP_DUAL_16BIT_ALLOC( -	     begin_foreground_FCNT,  /* SP */ -	/* Place holder for holding sleep timing */ -	     last_FCNT_before_sleep  /* SP */ -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    unused7,           /* SP */ -	    next_task_treePtr  /* SP */ -	) - -	u32 unused5;         - -	___DSP_DUAL_16BIT_ALLOC( -	    active_flags,   /* SP */ -	/* State flags, used to assist control of execution of Hyper Forground */ -	    HFG_flags       /* SP */ -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    unused9, -	    unused8 -	) -                               -	/* Space for saving enough context so that we can set up enough  -	   to save some more context. -	*/ -	u32 rFE_save_for_invalid_IP; -	u32 r32_save_for_spurious_int; -	u32 r32_save_for_trap; -	u32 r32_save_for_HFG; -}; - -/* SPB for MIX_TO_OSTREAM algorithm family */ -struct dsp_mix2_ostream_spb -{ -	/* 16b.16b integer.frac approximation to the -	   number of 3 sample triplets to output each -	   frame. (approximation must be floor, to -	   insure that the fractional error is always -	   positive) -	*/ -	u32 outTripletsPerFrame; - -	/* 16b.16b integer.frac accumulated number of -	   output triplets since the start of group  -	*/ -	u32 accumOutTriplets;   -}; - -/* SCB for Timing master algorithm */ -struct dsp_timing_master_scb { -	/* First 12 dwords from generic_scb_t */ -	struct dsp_basic_dma_req  basic_req;  /* Optional */ -	struct dsp_scatter_gather_ext sg_ext;  /* Optional */ -	___DSP_DUAL_16BIT_ALLOC( -	    next_scb,     /* REQUIRED */ -	    sub_list_ptr  /* REQUIRED */ -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    entry_point,  /* REQUIRED */ -	    this_spb      /* REQUIRED */ -	) - -	___DSP_DUAL_16BIT_ALLOC( -	/* Initial values are 0000:xxxx */ - 	    reserved, -	    extra_sample_accum -	) - -   -	/* Initial values are xxxx:0000 -	   hi: Current CODEC output FIFO pointer -	       (0 to 0x0f) -           lo: Flag indicating that the CODEC -	       FIFO is sync'd (host clears to -	       resynchronize the FIFO pointer -	       upon start/restart)  -	*/ -	___DSP_DUAL_16BIT_ALLOC( -	    codec_FIFO_syncd,  -	    codec_FIFO_ptr -	) -   -	/* Init. 8000:0005 for 44.1k -                 8000:0001 for 48k -	   hi: Fractional sample accumulator 0.16b -	   lo: Number of frames remaining to be -	       processed in the current group of -	       frames -	*/ -	___DSP_DUAL_16BIT_ALLOC( -	    frac_samp_accum_qm1, -	    TM_frms_left_in_group -	)  - -	/* Init. 0001:0005 for 44.1k -                 0000:0001 for 48k -	   hi: Fractional sample correction factor 0.16b -	       to be added every frameGroupLength frames -	       to correct for truncation error in -	       nsamp_per_frm_q15 -	   lo: Number of frames in the group -	*/ -	___DSP_DUAL_16BIT_ALLOC( -	    frac_samp_correction_qm1, -	    TM_frm_group_length   -	) - -	/* Init. 44.1k*65536/8k = 0x00058333 for 44.1k -                 48k*65536/8k = 0x00060000 for 48k -	   16b.16b integer.frac approximation to the -	   number of samples to output each frame. -	   (approximation must be floor, to insure */ -	u32 nsamp_per_frm_q15; -}; - -/* SCB for CODEC output algorithm */ -struct dsp_codec_output_scb { -	/* First 13 dwords from generic_scb_t */ -	struct dsp_basic_dma_req  basic_req;  /* Optional */ -	struct dsp_scatter_gather_ext sg_ext;  /* Optional */ -	___DSP_DUAL_16BIT_ALLOC( -	    next_scb,       /* REQUIRED */ -	    sub_list_ptr    /* REQUIRED */ -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    entry_point,    /* REQUIRED */ -	    this_spb        /* REQUIRED */ -	) - -	u32 strm_rs_config; /* REQUIRED */ - -	u32 strm_buf_ptr;   /* REQUIRED */ - -	/* NOTE: The CODEC output task reads samples from the first task on its -                 sublist at the stream buffer pointer (init. to lag DMA destination -		 address word).  After the required number of samples is transferred, -		 the CODEC output task advances sub_list_ptr->strm_buf_ptr past the samples -		 consumed. -	*/ - -	/* Init. 0000:0010 for SDout -                 0060:0010 for SDout2 -		 0080:0010 for SDout3 -	   hi: Base IO address of FIFO to which -	       the left-channel samples are to -	       be written. -	   lo: Displacement for the base IO -	       address for left-channel to obtain -	       the base IO address for the FIFO -	       to which the right-channel samples -	       are to be written. -	*/ -	___DSP_DUAL_16BIT_ALLOC( -	    left_chan_base_IO_addr, -	    right_chan_IO_disp -	) - - -	/* Init: 0x0080:0004 for non-AC-97 -	   Init: 0x0080:0000 for AC-97 -	   hi: Exponential volume change rate -	       for input stream -	   lo: Positive shift count to shift the -	       16-bit input sample to obtain the -	       32-bit output word -	*/ -	___DSP_DUAL_16BIT_ALLOC( -	    CO_scale_shift_count,  -	    CO_exp_vol_change_rate -	) - -	/* Pointer to SCB at end of input chain */ -	___DSP_DUAL_16BIT_ALLOC( -	    reserved, -	    last_sub_ptr -	) -}; - -/* SCB for CODEC input algorithm */ -struct dsp_codec_input_scb { -	/* First 13 dwords from generic_scb_t */ -	struct dsp_basic_dma_req  basic_req;  /* Optional */ -	struct dsp_scatter_gather_ext sg_ext;  /* Optional */ -	___DSP_DUAL_16BIT_ALLOC( -	    next_scb,       /* REQUIRED */ -	    sub_list_ptr    /* REQUIRED */ -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    entry_point,    /* REQUIRED */ -	    this_spb        /* REQUIRED */ -	) - -	u32 strm_rs_config; /* REQUIRED */ -	u32 strm_buf_ptr;   /* REQUIRED */ - -	/* NOTE: The CODEC input task reads samples from the hardware FIFO  -                 sublist at the DMA source address word (sub_list_ptr->basic_req.saw). -                 After the required number of samples is transferred, the CODEC -                 output task advances sub_list_ptr->basic_req.saw past the samples -                 consumed.  SPuD must initialize the sub_list_ptr->basic_req.saw -                 to point half-way around from the initial sub_list_ptr->strm_nuf_ptr -                 to allow for lag/lead. -	*/ - -	/* Init. 0000:0010 for SDout -                 0060:0010 for SDout2 -		 0080:0010 for SDout3 -	   hi: Base IO address of FIFO to which -	       the left-channel samples are to -	       be written. -	   lo: Displacement for the base IO -	       address for left-channel to obtain -	       the base IO address for the FIFO -	       to which the right-channel samples -	       are to be written. -	*/ -	___DSP_DUAL_16BIT_ALLOC( -	    rightChanINdisp,  -	    left_chan_base_IN_addr -	) -	/* Init. ?:fffc -	   lo: Negative shift count to shift the -	       32-bit input dword to obtain the -	       16-bit sample msb-aligned (count -	       is negative to shift left) -	*/ -	___DSP_DUAL_16BIT_ALLOC( -	    scaleShiftCount,  -	    reserver1 -	) - -	u32  reserved2; -}; - - -struct dsp_pcm_serial_input_scb { -	/* First 13 dwords from generic_scb_t */ -	struct dsp_basic_dma_req  basic_req;  /* Optional */ -	struct dsp_scatter_gather_ext sg_ext;  /* Optional */ -	___DSP_DUAL_16BIT_ALLOC( -	    next_scb,       /* REQUIRED */ -	    sub_list_ptr    /* REQUIRED */ -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    entry_point,    /* REQUIRED */ -	    this_spb        /* REQUIRED */ -	) - -	u32 strm_buf_ptr;   /* REQUIRED */ -	u32 strm_rs_config; /* REQUIRED */ -   -	/* Init. Ptr to CODEC input SCB -	   hi: Pointer to the SCB containing the -	       input buffer to which CODEC input -	       samples are written -	   lo: Flag indicating the link to the CODEC -	       input task is to be initialized -	*/ -	___DSP_DUAL_16BIT_ALLOC( -	    init_codec_input_link, -	    codec_input_buf_scb -	) - -	/* Initialized by the host (host updates target volumes) */ -	struct dsp_volume_control psi_vol_ctrl;    -   -}; - -struct dsp_src_task_scb { -	___DSP_DUAL_16BIT_ALLOC( -	    frames_left_in_gof, -	    gofs_left_in_sec -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    const2_thirds, -	    num_extra_tnput_samples -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    cor_per_gof, -	    correction_per_sec  -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    output_buf_producer_ptr,   -	    junk_DMA_MID -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    gof_length,   -	    gofs_per_sec -	) - -	u32 input_buf_strm_config; - -	___DSP_DUAL_16BIT_ALLOC( -	    reserved_for_SRC_use, -	    input_buf_consumer_ptr -	) - -	u32 accum_phi; - -	___DSP_DUAL_16BIT_ALLOC( -	    exp_src_vol_change_rate, -	    input_buf_producer_ptr -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    src_next_scb, -	    src_sub_list_ptr -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    src_entry_point, -	    src_this_sbp -	) - -	u32  src_strm_rs_config; -	u32  src_strm_buf_ptr; -   -	u32   phiIncr6int_26frac; -   -	struct dsp_volume_control src_vol_ctrl; -}; - -struct dsp_decimate_by_pow2_scb { -	/* decimationFactor = 2, 4, or 8 (larger factors waste too much memory -	                                  when compared to cascading decimators) -	*/ -	___DSP_DUAL_16BIT_ALLOC( -	    dec2_coef_base_ptr, -	    dec2_coef_increment -	) - -	/* coefIncrement = 128 / decimationFactor (for our ROM filter) -	   coefBasePtr = 0x8000 (for our ROM filter) -	*/ -	___DSP_DUAL_16BIT_ALLOC( -	    dec2_in_samples_per_out_triplet, -	    dec2_extra_in_samples -	) -	/* extraInSamples: # of accumulated, unused input samples (init. to 0) -	   inSamplesPerOutTriplet = 3 * decimationFactor -	*/ - -	___DSP_DUAL_16BIT_ALLOC( -	    dec2_const2_thirds, -	    dec2_half_num_taps_mp5 -	) -	/* halfNumTapsM5: (1/2 number of taps in decimation filter) minus 5 -	   const2thirds: constant 2/3 in 16Q0 format (sign.15) -	*/ - -	___DSP_DUAL_16BIT_ALLOC( -	    dec2_output_buf_producer_ptr, -	    dec2_junkdma_mid -	) - -	u32  dec2_reserved2; - -	u32  dec2_input_nuf_strm_config; -	/* inputBufStrmConfig: rsConfig for the input buffer to the decimator -	   (buffer size = decimationFactor * 32 dwords) -	*/ - -	___DSP_DUAL_16BIT_ALLOC( -	    dec2_phi_incr, -	    dec2_input_buf_consumer_ptr -	) -	/* inputBufConsumerPtr: Input buffer read pointer (into SRC filter) -	   phiIncr = decimationFactor * 4 -	*/ - -	u32 dec2_reserved3; - -	___DSP_DUAL_16BIT_ALLOC( -	    dec2_exp_vol_change_rate, -	    dec2_input_buf_producer_ptr -	) -	/* inputBufProducerPtr: Input buffer write pointer -	   expVolChangeRate: Exponential volume change rate for possible -	                     future mixer on input streams -	*/ - -	___DSP_DUAL_16BIT_ALLOC( -	    dec2_next_scb, -	    dec2_sub_list_ptr -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    dec2_entry_point, -	    dec2_this_spb -	) - -	u32  dec2_strm_rs_config; -	u32  dec2_strm_buf_ptr; - -	u32  dec2_reserved4; - -	struct dsp_volume_control dec2_vol_ctrl; /* Not used! */ -}; - -struct dsp_vari_decimate_scb { -	___DSP_DUAL_16BIT_ALLOC( -	    vdec_frames_left_in_gof, -	    vdec_gofs_left_in_sec -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    vdec_const2_thirds, -	    vdec_extra_in_samples -	) -	/* extraInSamples: # of accumulated, unused input samples (init. to 0) -	   const2thirds: constant 2/3 in 16Q0 format (sign.15) */ - -	___DSP_DUAL_16BIT_ALLOC( -	    vdec_cor_per_gof, -	    vdec_correction_per_sec -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    vdec_output_buf_producer_ptr, -	    vdec_input_buf_consumer_ptr -	) -	/* inputBufConsumerPtr: Input buffer read pointer (into SRC filter) */ -	___DSP_DUAL_16BIT_ALLOC( -	    vdec_gof_length, -	    vdec_gofs_per_sec -	) - -	u32  vdec_input_buf_strm_config; -	/* inputBufStrmConfig: rsConfig for the input buffer to the decimator -	   (buffer size = 64 dwords) */ -	u32  vdec_coef_increment; -	/* coefIncrement = - 128.0 / decimationFactor (as a 32Q15 number) */ - -	u32  vdec_accumphi; -	/* accumPhi: accumulated fractional phase increment (6.26) */ - -	___DSP_DUAL_16BIT_ALLOC( - 	    vdec_exp_vol_change_rate, -	    vdec_input_buf_producer_ptr -	) -	/* inputBufProducerPtr: Input buffer write pointer -	   expVolChangeRate: Exponential volume change rate for possible -	   future mixer on input streams */ - -	___DSP_DUAL_16BIT_ALLOC( -	    vdec_next_scb, -	    vdec_sub_list_ptr -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    vdec_entry_point, -	    vdec_this_spb -	) - -	u32 vdec_strm_rs_config; -	u32 vdec_strm_buf_ptr; - -	u32 vdec_phi_incr_6int_26frac; - -	struct dsp_volume_control vdec_vol_ctrl; -}; - - -/* SCB for MIX_TO_OSTREAM algorithm family */ -struct dsp_mix2_ostream_scb { -	/* First 13 dwords from generic_scb_t */ -	struct dsp_basic_dma_req  basic_req;  /* Optional */ -	struct dsp_scatter_gather_ext sg_ext;  /* Optional */ -	___DSP_DUAL_16BIT_ALLOC( -	    next_scb,       /* REQUIRED */ -	    sub_list_ptr    /* REQUIRED */ -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    entry_point,    /* REQUIRED */ -	    this_spb        /* REQUIRED */ -	) - -	u32 strm_rs_config; /* REQUIRED */ -	u32 strm_buf_ptr;   /* REQUIRED */ - - -	/* hi: Number of mixed-down input triplets -	       computed since start of group -	   lo: Number of frames remaining to be -	       processed in the current group of -	       frames -	*/ -	___DSP_DUAL_16BIT_ALLOC( -	    frames_left_in_group, -	    accum_input_triplets -	) - -	/* hi: Exponential volume change rate -	       for mixer on input streams -	   lo: Number of frames in the group -	*/ -	___DSP_DUAL_16BIT_ALLOC( -	    frame_group_length, -	    exp_vol_change_rate -	) -   -	___DSP_DUAL_16BIT_ALLOC( -	    const_FFFF, -	    const_zero -	) -}; - - -/* SCB for S16_MIX algorithm */ -struct dsp_mix_only_scb { -	/* First 13 dwords from generic_scb_t */ -	struct dsp_basic_dma_req  basic_req;  /* Optional */ -	struct dsp_scatter_gather_ext sg_ext;  /* Optional */ -	___DSP_DUAL_16BIT_ALLOC( -	    next_scb,       /* REQUIRED */ -	    sub_list_ptr    /* REQUIRED */ -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    entry_point,    /* REQUIRED */ -	    this_spb        /* REQUIRED */ -	) - -	u32 strm_rs_config; /* REQUIRED */ -	u32 strm_buf_ptr;   /* REQUIRED */ - -	u32 reserved; -	struct dsp_volume_control vol_ctrl; -}; - -/* SCB for the async. CODEC input algorithm */ -struct dsp_async_codec_input_scb { -	u32 io_free2;      -   -	u32 io_current_total; -	u32 io_previous_total; -   -	u16 io_count; -	u16 io_count_limit; -   -	u16 o_fifo_base_addr;             -	u16 ost_mo_format; -	/* 1 = stereo; 0 = mono  -	   xxx for ASER 1 (not allowed); 118 for ASER2 */ - -	u32  ostrm_rs_config; -	u32  ostrm_buf_ptr; -   -	___DSP_DUAL_16BIT_ALLOC( -	    io_sclks_per_lr_clk, -	    io_io_enable -	) - -	u32  io_free4; - -	___DSP_DUAL_16BIT_ALLOC(   -	    io_next_scb, -	    io_sub_list_ptr -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    io_entry_point, -	    io_this_spb -	) - -	u32 istrm_rs_config; -	u32 istrm_buf_ptr; - -	/* Init. 0000:8042: for ASER1 -                 0000:8044: for ASER2  */ -	___DSP_DUAL_16BIT_ALLOC( -	    io_stat_reg_addr, -	    iofifo_pointer -	) - -	/* Init 1 stero:100 ASER1 -	   Init 0 mono:110 ASER2  -	*/ -	___DSP_DUAL_16BIT_ALLOC( -	    ififo_base_addr,             -	    ist_mo_format -	) - -	u32 i_free; -}; - - -/* SCB for the SP/DIF CODEC input and output */ -struct dsp_spdifiscb { -	___DSP_DUAL_16BIT_ALLOC( -	    status_ptr,      -	    status_start_ptr -	) - -	u32 current_total; -	u32 previous_total; - -	___DSP_DUAL_16BIT_ALLOC( -	    count, -	    count_limit -	) - -	u32 status_data; - -	___DSP_DUAL_16BIT_ALLOC(   -	    status, -	    free4 -	) - -	u32 free3; - -	___DSP_DUAL_16BIT_ALLOC(   -	    free2, -	    bit_count -	) - -	u32  temp_status; -   -	___DSP_DUAL_16BIT_ALLOC( -	    next_SCB, -	    sub_list_ptr -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    entry_point, -	    this_spb -	) - -	u32  strm_rs_config; -	u32  strm_buf_ptr; -   -	___DSP_DUAL_16BIT_ALLOC( -	    stat_reg_addr,  -	    fifo_pointer -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    fifo_base_addr,  -	    st_mo_format -	) - -	u32  free1; -}; - - -/* SCB for the SP/DIF CODEC input and output  */ -struct dsp_spdifoscb {		  - -	u32 free2;      - -	u32 free3[4];              - -	/* Need to be here for compatibility with AsynchFGTxCode */ -	u32 strm_rs_config; -                                -	u32 strm_buf_ptr; - -	___DSP_DUAL_16BIT_ALLOC(   -	    status, -	    free5 -	) - -	u32 free4; - -	___DSP_DUAL_16BIT_ALLOC(   -	    next_scb, -	    sub_list_ptr -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    entry_point, -	    this_spb -	) - -	u32 free6[2]; -   -	___DSP_DUAL_16BIT_ALLOC( -	    stat_reg_addr,  -	    fifo_pointer -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    fifo_base_addr, -	    st_mo_format -	) - -	u32  free1;                                          -}; - - -struct dsp_asynch_fg_rx_scb { -	___DSP_DUAL_16BIT_ALLOC( -	    bot_buf_mask, -	    buf_Mask -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    max, -	    min -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    old_producer_pointer, -	    hfg_scb_ptr -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    delta, -	    adjust_count -	) - -	u32 unused2[5];   - -	___DSP_DUAL_16BIT_ALLOC(   -	    sibling_ptr,   -	    child_ptr -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    code_ptr, -	    this_ptr -	) - -	u32 strm_rs_config;  - -	u32 strm_buf_ptr; -   -	u32 unused_phi_incr; -   -	___DSP_DUAL_16BIT_ALLOC( -	    right_targ,    -	    left_targ -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    right_vol, -	    left_vol -	) -}; - - -struct dsp_asynch_fg_tx_scb { -	___DSP_DUAL_16BIT_ALLOC( -	    not_buf_mask, -	    buf_mask -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    max, -	    min -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    unused1, -	    hfg_scb_ptr -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    delta, -	    adjust_count -	) - -	u32 accum_phi; - -	___DSP_DUAL_16BIT_ALLOC( -	    unused2, -	    const_one_third -	) - -	u32 unused3[3]; - -	___DSP_DUAL_16BIT_ALLOC( -	    sibling_ptr, -	    child_ptr -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    codePtr, -	    this_ptr -	) - -	u32 strm_rs_config; - -	u32 strm_buf_ptr; - -	u32 phi_incr; - -	___DSP_DUAL_16BIT_ALLOC( -	    unused_right_targ, -	    unused_left_targ -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    unused_right_vol, -	    unused_left_vol -	) -}; - - -struct dsp_output_snoop_scb { -	/* First 13 dwords from generic_scb_t */ -	struct dsp_basic_dma_req  basic_req;  /* Optional */ -	struct dsp_scatter_gather_ext sg_ext;  /* Optional */ -	___DSP_DUAL_16BIT_ALLOC( -	    next_scb,       /* REQUIRED */ -	    sub_list_ptr    /* REQUIRED */ -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    entry_point,    /* REQUIRED */ -	    this_spb        /* REQUIRED */ -	) - -	u32 strm_rs_config; /* REQUIRED */ -	u32 strm_buf_ptr;   /* REQUIRED */ - -	___DSP_DUAL_16BIT_ALLOC( -	    init_snoop_input_link, -	    snoop_child_input_scb -	) - -	u32 snoop_input_buf_ptr; - -	___DSP_DUAL_16BIT_ALLOC( -	    reserved, -	    input_scb -	) -}; - -struct dsp_spio_write_scb { -	___DSP_DUAL_16BIT_ALLOC( -	    address1, -	    address2 -	) - -	u32 data1; - -	u32 data2; - -	___DSP_DUAL_16BIT_ALLOC( -	    address3, -	    address4 -	) - -	u32 data3; - -	u32 data4; - -	___DSP_DUAL_16BIT_ALLOC( -	    unused1, -	    data_ptr -	) - -	u32 unused2[2]; - -	___DSP_DUAL_16BIT_ALLOC( -	    sibling_ptr, -	    child_ptr -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    entry_point, -	    this_ptr -	) - -	u32 unused3[5]; -}; - -struct dsp_magic_snoop_task { -	u32 i0; -	u32 i1; - -	u32 strm_buf_ptr1; -   -	u16 i2; -	u16 snoop_scb; - -	u32 i3; -	u32 i4; -	u32 i5; -	u32 i6; - -	u32 i7; - -	___DSP_DUAL_16BIT_ALLOC( -	    next_scb, -	    sub_list_ptr -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    entry_point, -	    this_ptr -	) - -	u32 strm_buf_config; -	u32 strm_buf_ptr2; - -	u32 i8; - -	struct dsp_volume_control vdec_vol_ctrl; -}; - - -struct dsp_filter_scb { -	___DSP_DUAL_16BIT_ALLOC( -	      a0_right,          /* 0x00 */ -	      a0_left -	) -	___DSP_DUAL_16BIT_ALLOC( -	      a1_right,          /* 0x01 */ -	      a1_left -	) -	___DSP_DUAL_16BIT_ALLOC( -	      a2_right,          /* 0x02 */ -	      a2_left -	) -	___DSP_DUAL_16BIT_ALLOC( -	      output_buf_ptr,    /* 0x03 */ -	      init -	) - -	___DSP_DUAL_16BIT_ALLOC( -	      filter_unused3,    /* 0x04 */ -	      filter_unused2 -	) - -	u32 prev_sample_output1; /* 0x05 */ -	u32 prev_sample_output2; /* 0x06 */ -	u32 prev_sample_input1;  /* 0x07 */ -	u32 prev_sample_input2;  /* 0x08 */ - -	___DSP_DUAL_16BIT_ALLOC( -	      next_scb_ptr,      /* 0x09 */ -	      sub_list_ptr -	) - -	___DSP_DUAL_16BIT_ALLOC( -	      entry_point,       /* 0x0A */ -	      spb_ptr -	) - -	u32  strm_rs_config;     /* 0x0B */ -	u32  strm_buf_ptr;       /* 0x0C */ - -	___DSP_DUAL_16BIT_ALLOC( -              b0_right,          /* 0x0D */ -	      b0_left -	) -	___DSP_DUAL_16BIT_ALLOC( -              b1_right,          /* 0x0E */ -	      b1_left -	) -	___DSP_DUAL_16BIT_ALLOC( -              b2_right,          /* 0x0F */ -	      b2_left -	) -}; -#endif /* __DSP_SCB_TYPES_H__ */ diff --git a/include/sound/cs46xx_dsp_spos.h b/include/sound/cs46xx_dsp_spos.h deleted file mode 100644 index 49b03c9e5e5..00000000000 --- a/include/sound/cs46xx_dsp_spos.h +++ /dev/null @@ -1,234 +0,0 @@ -/* - *  The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards - *  Copyright (c) by Jaroslav Kysela <perex@perex.cz> - * - * - *   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; either version 2 of the License, or - *   (at your option) any later version. - * - *   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 __CS46XX_DSP_SPOS_H__ -#define __CS46XX_DSP_SPOS_H__ - -#include "cs46xx_dsp_scb_types.h" -#include "cs46xx_dsp_task_types.h" - -#define SYMBOL_CONSTANT  0x0 -#define SYMBOL_SAMPLE    0x1 -#define SYMBOL_PARAMETER 0x2 -#define SYMBOL_CODE      0x3 - -#define SEGTYPE_SP_PROGRAM              0x00000001 -#define SEGTYPE_SP_PARAMETER            0x00000002 -#define SEGTYPE_SP_SAMPLE               0x00000003 -#define SEGTYPE_SP_COEFFICIENT          0x00000004 - -#define DSP_SPOS_UU      0x0deadul     /* unused */ -#define DSP_SPOS_DC      0x0badul      /* don't care */ -#define DSP_SPOS_DC_DC   0x0bad0badul  /* don't care */ -#define DSP_SPOS_UUUU    0xdeadc0edul  /* unused */ -#define DSP_SPOS_UUHI    0xdeadul -#define DSP_SPOS_UULO    0xc0edul -#define DSP_SPOS_DCDC    0x0badf1d0ul  /* don't care */ -#define DSP_SPOS_DCDCHI  0x0badul -#define DSP_SPOS_DCDCLO  0xf1d0ul - -#define DSP_MAX_TASK_NAME   60 -#define DSP_MAX_SYMBOL_NAME 100 -#define DSP_MAX_SCB_NAME    60 -#define DSP_MAX_SCB_DESC    200 -#define DSP_MAX_TASK_DESC   50 - -#define DSP_MAX_PCM_CHANNELS 32 -#define DSP_MAX_SRC_NR       14 - -#define DSP_PCM_MAIN_CHANNEL        1 -#define DSP_PCM_REAR_CHANNEL        2 -#define DSP_PCM_CENTER_LFE_CHANNEL  3 -#define DSP_PCM_S71_CHANNEL         4 /* surround 7.1 */ -#define DSP_IEC958_CHANNEL          5 - -#define DSP_SPDIF_STATUS_OUTPUT_ENABLED       1 -#define DSP_SPDIF_STATUS_PLAYBACK_OPEN        2 -#define DSP_SPDIF_STATUS_HW_ENABLED           4 -#define DSP_SPDIF_STATUS_INPUT_CTRL_ENABLED   8 - -struct dsp_symbol_entry { -	u32 address; -	char symbol_name[DSP_MAX_SYMBOL_NAME]; -	int symbol_type; - -	/* initialized by driver */ -	struct dsp_module_desc * module; -	int deleted; -}; - -struct dsp_symbol_desc { -	int nsymbols; - -	struct dsp_symbol_entry *symbols; - -	/* initialized by driver */ -	int highest_frag_index; -}; - -struct dsp_segment_desc { -	int segment_type; -	u32 offset; -	u32 size; -	u32 * data; -}; - -struct dsp_module_desc { -	char * module_name; -	struct dsp_symbol_desc symbol_table; -	int nsegments; -	struct dsp_segment_desc * segments; - -	/* initialized by driver */ -	u32 overlay_begin_address; -	u32 load_address; -	int nfixups; -}; - -struct dsp_scb_descriptor { -	char scb_name[DSP_MAX_SCB_NAME]; -	u32 address; -	int index; -	u32 *data; - -	struct dsp_scb_descriptor * sub_list_ptr; -	struct dsp_scb_descriptor * next_scb_ptr; -	struct dsp_scb_descriptor * parent_scb_ptr; - -	struct dsp_symbol_entry * task_entry; -	struct dsp_symbol_entry * scb_symbol; - -	struct snd_info_entry *proc_info; -	int ref_count; - -	u16 volume[2]; -	unsigned int deleted :1; -	unsigned int updated :1; -	unsigned int volume_set :1; -}; - -struct dsp_task_descriptor { -	char task_name[DSP_MAX_TASK_NAME]; -	int size; -	u32 address; -	int index; -	u32 *data; -}; - -struct dsp_pcm_channel_descriptor { -	int active; -	int src_slot; -	int pcm_slot; -	u32 sample_rate; -	u32 unlinked; -	struct dsp_scb_descriptor * pcm_reader_scb; -	struct dsp_scb_descriptor * src_scb; -	struct dsp_scb_descriptor * mixer_scb; - -	void * private_data; -}; - -struct dsp_spos_instance { -	struct dsp_symbol_desc symbol_table; /* currently availble loaded symbols in SP */ - -	int nmodules; -	struct dsp_module_desc * modules; /* modules loaded into SP */ - -	struct dsp_segment_desc code; - -	/* Main PCM playback mixer */ -	struct dsp_scb_descriptor * master_mix_scb; -	u16 dac_volume_right; -	u16 dac_volume_left; - -	/* Rear/surround PCM playback mixer */ -	struct dsp_scb_descriptor * rear_mix_scb; - -	/* Center/LFE mixer */ -	struct dsp_scb_descriptor * center_lfe_mix_scb; - -	int npcm_channels; -	int nsrc_scb; -	struct dsp_pcm_channel_descriptor pcm_channels[DSP_MAX_PCM_CHANNELS]; -	int src_scb_slots[DSP_MAX_SRC_NR]; - -	/* cache this symbols */ -	struct dsp_symbol_entry * null_algorithm; /* used by PCMreaderSCB's */ -	struct dsp_symbol_entry * s16_up;         /* used by SRCtaskSCB's */ - -	/* proc fs */   -	struct snd_card *snd_card; -	struct snd_info_entry * proc_dsp_dir; -	struct snd_info_entry * proc_sym_info_entry; -	struct snd_info_entry * proc_modules_info_entry; -	struct snd_info_entry * proc_parameter_dump_info_entry; -	struct snd_info_entry * proc_sample_dump_info_entry; - -	/* SCB's descriptors */ -	int nscb; -	int scb_highest_frag_index; -	struct dsp_scb_descriptor scbs[DSP_MAX_SCB_DESC]; -	struct snd_info_entry * proc_scb_info_entry; -	struct dsp_scb_descriptor * the_null_scb; - -	/* Task's descriptors */ -	int ntask; -	struct dsp_task_descriptor tasks[DSP_MAX_TASK_DESC]; -	struct snd_info_entry * proc_task_info_entry; - -	/* SPDIF status */ -	int spdif_status_out; -	int spdif_status_in; -	u16 spdif_input_volume_right; -	u16 spdif_input_volume_left; -	/* spdif channel status, -	   left right and user validity bits */ -	unsigned int spdif_csuv_default; -	unsigned int spdif_csuv_stream; - -	/* SPDIF input sample rate converter */ -	struct dsp_scb_descriptor * spdif_in_src; -	/* SPDIF input asynch. receiver */ -	struct dsp_scb_descriptor * asynch_rx_scb; - -	/* Capture record mixer SCB */ -	struct dsp_scb_descriptor * record_mixer_scb; -     -	/* CODEC input SCB */ -	struct dsp_scb_descriptor * codec_in_scb; - -	/* reference snooper */ -	struct dsp_scb_descriptor * ref_snoop_scb; - -	/* SPDIF output  PCM reference  */ -	struct dsp_scb_descriptor * spdif_pcm_input_scb; - -	/* asynch TX task */ -	struct dsp_scb_descriptor * asynch_tx_scb; - -	/* record sources */ -	struct dsp_scb_descriptor * pcm_input; -	struct dsp_scb_descriptor * adc_input; - -	int spdif_in_sample_rate; -}; - -#endif /* __DSP_SPOS_H__ */ diff --git a/include/sound/cs46xx_dsp_task_types.h b/include/sound/cs46xx_dsp_task_types.h deleted file mode 100644 index 5cf920bfda2..00000000000 --- a/include/sound/cs46xx_dsp_task_types.h +++ /dev/null @@ -1,252 +0,0 @@ -/* - *  The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards - *  Copyright (c) by Jaroslav Kysela <perex@perex.cz> - * - * - *   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; either version 2 of the License, or - *   (at your option) any later version. - * - *   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 - * - * - * NOTE: comments are copy/paste from cwcemb80.lst  - * provided by Tom Woller at Cirrus (my only - * documentation about the SP OS running inside - * the DSP)  - */ - -#ifndef __CS46XX_DSP_TASK_TYPES_H__ -#define __CS46XX_DSP_TASK_TYPES_H__ - -#include "cs46xx_dsp_scb_types.h" - -/********************************************************************************************* -Example hierarchy of stream control blocks in the SP - -hfgTree -Ptr____Call (c) -       \ - -------+------         -------------      -------------      -------------      ----- -| SBlaster IF  |______\| Foreground  |___\| Middlegr'nd |___\| Background  |___\| Nul | -|              |Goto  /| tree header |g  /| tree header |g  /| tree header |g  /| SCB |r - -------------- (g)     -------------      -------------      -------------      ----- -       |c                     |c                 |c                 |c -       |                      |                  |                  | -      \/                  -------------      -------------      -------------    -                       | Foreground  |_\  | Middlegr'nd |_\  | Background  |_\ -                       |     tree    |g/  |    tree     |g/  |     tree    |g/ -                        -------------      -------------      -------------    -                              |c                 |c                 |c -                              |                  |                  |  -                             \/                 \/                 \/  - -*********************************************************************************************/ - -#define		HFG_FIRST_EXECUTE_MODE			0x0001 -#define		HFG_FIRST_EXECUTE_MODE_BIT		0 -#define		HFG_CONTEXT_SWITCH_MODE			0x0002 -#define		HFG_CONTEXT_SWITCH_MODE_BIT		1 - -#define MAX_FG_STACK_SIZE 	32			/* THESE NEED TO BE COMPUTED PROPERLY */ -#define MAX_MG_STACK_SIZE 	16 -#define MAX_BG_STACK_SIZE 	9 -#define MAX_HFG_STACK_SIZE	4 - -#define SLEEP_ACTIVE_INCREMENT		0		/* Enable task tree thread to go to sleep -											   This should only ever be used on the Background thread */ -#define STANDARD_ACTIVE_INCREMENT	1		/* Task tree thread normal operation */ -#define SUSPEND_ACTIVE_INCREMENT	2		/* Cause execution to suspend in the task tree thread -                                               This should only ever be used on the Background thread */ - -#define HOSTFLAGS_DISABLE_BG_SLEEP  0       /* Host-controlled flag that determines whether we go to sleep -                                               at the end of BG */ - -/* Minimal context save area for Hyper Forground */ -struct dsp_hf_save_area { -	u32	r10_save; -	u32	r54_save; -	u32	r98_save; - -	___DSP_DUAL_16BIT_ALLOC( -	    status_save, -	    ind_save -	) - -	___DSP_DUAL_16BIT_ALLOC( -	    rci1_save, -	    rci0_save -	) - -	u32	r32_save; -	u32	r76_save; -	u32	rsd2_save; - -       	___DSP_DUAL_16BIT_ALLOC( -	      rsi2_save,	  /* See TaskTreeParameterBlock for  -				     remainder of registers  */ -	      rsa2Save -	) -	/* saved as part of HFG context  */ -}; - - -/* Task link data structure */ -struct dsp_tree_link { -	___DSP_DUAL_16BIT_ALLOC( -	/* Pointer to sibling task control block */ -	    next_scb, -	/* Pointer to child task control block */ -	    sub_ptr -	) -   -	___DSP_DUAL_16BIT_ALLOC( -	/* Pointer to code entry point */ -	    entry_point,  -	/* Pointer to local data */ -	    this_spb -	) -}; - - -struct dsp_task_tree_data { -	___DSP_DUAL_16BIT_ALLOC( -	/* Initial tock count; controls task tree execution rate */ -	    tock_count_limit, -	/* Tock down counter */ -	    tock_count -	) - -	/* Add to ActiveCount when TockCountLimit reached:  -	   Subtract on task tree termination */ -	___DSP_DUAL_16BIT_ALLOC( -	    active_tncrement,		 -	/* Number of pending activations for task tree */ -	    active_count -	) - -        ___DSP_DUAL_16BIT_ALLOC( -	/* BitNumber to enable modification of correct bit in ActiveTaskFlags */ -	    active_bit,	     -	/* Pointer to OS location for indicating current activity on task level */ -	    active_task_flags_ptr -	) - -	/* Data structure for controlling movement of memory blocks:-  -	   currently unused */ -	___DSP_DUAL_16BIT_ALLOC( -	    mem_upd_ptr, -	/* Data structure for controlling synchronous link update */ -	    link_upd_ptr -	) -   -	___DSP_DUAL_16BIT_ALLOC( -	/* Save area for remainder of full context. */ -	    save_area, -	/* Address of start of local stack for data storage */ -	    data_stack_base_ptr -	) - -}; - - -struct dsp_interval_timer_data -{ -	/* These data items have the same relative locations to those */ -	___DSP_DUAL_16BIT_ALLOC( -	     interval_timer_period, -	     itd_unused -	) - -	/* used for this data in the SPOS control block for SPOS 1.0 */ -	___DSP_DUAL_16BIT_ALLOC( -	     num_FG_ticks_this_interval,         -	     num_intervals -	) -}; - - -/* This structure contains extra storage for the task tree -   Currently, this additional data is related only to a full context save */ -struct dsp_task_tree_context_block { -	/* Up to 10 values are saved onto the stack.  8 for the task tree, 1 for -	   The access to the context switch (call or interrupt), and 1 spare that -	   users should never use.  This last may be required by the system */ -	___DSP_DUAL_16BIT_ALLOC( -	     stack1, -	     stack0 -	) -	___DSP_DUAL_16BIT_ALLOC( -	     stack3, -	     stack2 -	) -	___DSP_DUAL_16BIT_ALLOC( -	     stack5, -	     stack4 -	) -	___DSP_DUAL_16BIT_ALLOC( -	     stack7, -	     stack6 -	) -	___DSP_DUAL_16BIT_ALLOC( -	     stack9, -	     stack8 -	) - -	u32	  saverfe;					 - -	/* Value may be overwriten by stack save algorithm. -	   Retain the size of the stack data saved here if used */ -	___DSP_DUAL_16BIT_ALLOC( -             reserved1,	 -  	     stack_size -	) -	u32		saverba;	  /* (HFG) */ -	u32		saverdc; -	u32		savers_config_23; /* (HFG) */ -	u32		savers_DMA23;	  /* (HFG) */ -	u32		saversa0; -	u32		saversi0; -	u32		saversa1; -	u32		saversi1; -	u32		saversa3; -	u32		saversd0; -	u32		saversd1; -	u32		saversd3; -	u32		savers_config01; -	u32		savers_DMA01; -	u32		saveacc0hl; -	u32		saveacc1hl; -	u32		saveacc0xacc1x; -	u32		saveacc2hl; -	u32		saveacc3hl; -	u32		saveacc2xacc3x; -	u32		saveaux0hl; -	u32		saveaux1hl; -	u32		saveaux0xaux1x; -	u32		saveaux2hl; -	u32		saveaux3hl; -	u32		saveaux2xaux3x; -	u32		savershouthl; -	u32		savershoutxmacmode; -}; -                 - -struct dsp_task_tree_control_block { -	struct dsp_hf_save_area			context; -	struct dsp_tree_link			links; -	struct dsp_task_tree_data		data; -	struct dsp_task_tree_context_block	context_blk; -	struct dsp_interval_timer_data		int_timer; -}; - - -#endif /* __DSP_TASK_TYPES_H__ */ diff --git a/include/sound/cs8427.h b/include/sound/cs8427.h index f862cfff5f6..0b6a1876639 100644 --- a/include/sound/cs8427.h +++ b/include/sound/cs8427.h @@ -188,6 +188,7 @@  struct snd_pcm_substream; +int snd_cs8427_init(struct snd_i2c_bus *bus, struct snd_i2c_device *device);  int snd_cs8427_create(struct snd_i2c_bus *bus, unsigned char addr,  		      unsigned int reset_timeout, struct snd_i2c_device **r_cs8427);  int snd_cs8427_reg_write(struct snd_i2c_device *device, unsigned char reg, diff --git a/include/sound/da7213.h b/include/sound/da7213.h new file mode 100644 index 00000000000..673f5c39cbf --- /dev/null +++ b/include/sound/da7213.h @@ -0,0 +1,52 @@ +/* + * da7213.h - DA7213 ASoC Codec Driver Platform Data + * + * Copyright (c) 2013 Dialog Semiconductor + * + * Author: Adam Thomson <Adam.Thomson.Opensource@diasemi.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _DA7213_PDATA_H +#define _DA7213_PDATA_H + +enum da7213_micbias_voltage { +	DA7213_MICBIAS_1_6V = 0, +	DA7213_MICBIAS_2_2V = 1, +	DA7213_MICBIAS_2_5V = 2, +	DA7213_MICBIAS_3_0V = 3, +}; + +enum da7213_dmic_data_sel { +	DA7213_DMIC_DATA_LRISE_RFALL = 0, +	DA7213_DMIC_DATA_LFALL_RRISE = 1, +}; + +enum da7213_dmic_samplephase { +	DA7213_DMIC_SAMPLE_ON_CLKEDGE = 0, +	DA7213_DMIC_SAMPLE_BETWEEN_CLKEDGE = 1, +}; + +enum da7213_dmic_clk_rate { +	DA7213_DMIC_CLK_3_0MHZ = 0, +	DA7213_DMIC_CLK_1_5MHZ = 1, +}; + +struct da7213_platform_data { +	/* Mic Bias voltage */ +	enum da7213_micbias_voltage micbias1_lvl; +	enum da7213_micbias_voltage micbias2_lvl; + +	/* DMIC config */ +	enum da7213_dmic_data_sel dmic_data_sel; +	enum da7213_dmic_samplephase dmic_samplephase; +	enum da7213_dmic_clk_rate dmic_clk_rate; + +	/* MCLK squaring config */ +	bool mclk_squaring; +}; + +#endif /* _DA7213_PDATA_H */ diff --git a/include/sound/da9055.h b/include/sound/da9055.h new file mode 100644 index 00000000000..cf1241b64d8 --- /dev/null +++ b/include/sound/da9055.h @@ -0,0 +1,33 @@ +/* + * DA9055 ALSA Soc codec driver + * + * Copyright (c) 2012 Dialog Semiconductor + * + * Tested on (Samsung SMDK6410 board + DA9055 EVB) using I2S and I2C + * Written by David Chen <david.chen@diasemi.com> and + * Ashish Chavan <ashish.chavan@kpitcummins.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; either version 2 of the License, or (at your + * option) any later version. + */ + +#ifndef __SOUND_DA9055_H__ +#define __SOUND_DA9055_H__ + +enum da9055_micbias_voltage { +	DA9055_MICBIAS_1_6V = 0, +	DA9055_MICBIAS_1_8V = 1, +	DA9055_MICBIAS_2_1V = 2, +	DA9055_MICBIAS_2_2V = 3, +}; + +struct da9055_platform_data { +	/* Selects which of the two MicBias pins acts as the bias source */ +	bool micbias_source; +	/* Selects the micbias voltage */ +	enum da9055_micbias_voltage micbias; +}; + +#endif diff --git a/include/sound/designware_i2s.h b/include/sound/designware_i2s.h new file mode 100644 index 00000000000..26f406e0f67 --- /dev/null +++ b/include/sound/designware_i2s.h @@ -0,0 +1,69 @@ +/* + * Copyright (ST) 2012 Rajeev Kumar (rajeev-dlh.kumar@st.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; either version 2 of the License, or + * (at your option) any later version. + * + * 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 __SOUND_DESIGNWARE_I2S_H +#define __SOUND_DESIGNWARE_I2S_H + +#include <linux/dmaengine.h> +#include <linux/types.h> + +/* + * struct i2s_clk_config_data - represent i2s clk configuration data + * @chan_nr: number of channel + * @data_width: number of bits per sample (8/16/24/32 bit) + * @sample_rate: sampling frequency (8Khz, 16Khz, 32Khz, 44Khz, 48Khz) + */ +struct i2s_clk_config_data { +	int chan_nr; +	u32 data_width; +	u32 sample_rate; +}; + +struct i2s_platform_data { +	#define DWC_I2S_PLAY	(1 << 0) +	#define DWC_I2S_RECORD	(1 << 1) +	unsigned int cap; +	int channel; +	u32 snd_fmts; +	u32 snd_rates; + +	void *play_dma_data; +	void *capture_dma_data; +	bool (*filter)(struct dma_chan *chan, void *slave); +	int (*i2s_clk_cfg)(struct i2s_clk_config_data *config); +}; + +struct i2s_dma_data { +	void *data; +	dma_addr_t addr; +	u32 max_burst; +	enum dma_slave_buswidth addr_width; +	bool (*filter)(struct dma_chan *chan, void *slave); +}; + +/* I2S DMA registers */ +#define I2S_RXDMA		0x01C0 +#define I2S_TXDMA		0x01C8 + +#define TWO_CHANNEL_SUPPORT	2	/* up to 2.0 */ +#define FOUR_CHANNEL_SUPPORT	4	/* up to 3.1 */ +#define SIX_CHANNEL_SUPPORT	6	/* up to 5.1 */ +#define EIGHT_CHANNEL_SUPPORT	8	/* up to 7.1 */ + +#endif /*  __SOUND_DESIGNWARE_I2S_H */ diff --git a/include/sound/dmaengine_pcm.h b/include/sound/dmaengine_pcm.h new file mode 100644 index 00000000000..eb73a3a39ec --- /dev/null +++ b/include/sound/dmaengine_pcm.h @@ -0,0 +1,157 @@ +/* + *  Copyright (C) 2012, Analog Devices Inc. + *	Author: Lars-Peter Clausen <lars@metafoo.de> + * + *  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;  either version 2 of the License, or (at your + *  option) any later version. + * + *  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., + *  675 Mass Ave, Cambridge, MA 02139, USA. + * + */ +#ifndef __SOUND_DMAENGINE_PCM_H__ +#define __SOUND_DMAENGINE_PCM_H__ + +#include <sound/pcm.h> +#include <sound/soc.h> +#include <linux/dmaengine.h> + +/** + * snd_pcm_substream_to_dma_direction - Get dma_transfer_direction for a PCM + *   substream + * @substream: PCM substream + */ +static inline enum dma_transfer_direction +snd_pcm_substream_to_dma_direction(const struct snd_pcm_substream *substream) +{ +	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) +		return DMA_MEM_TO_DEV; +	else +		return DMA_DEV_TO_MEM; +} + +int snd_hwparams_to_dma_slave_config(const struct snd_pcm_substream *substream, +	const struct snd_pcm_hw_params *params, struct dma_slave_config *slave_config); +int snd_dmaengine_pcm_trigger(struct snd_pcm_substream *substream, int cmd); +snd_pcm_uframes_t snd_dmaengine_pcm_pointer(struct snd_pcm_substream *substream); +snd_pcm_uframes_t snd_dmaengine_pcm_pointer_no_residue(struct snd_pcm_substream *substream); + +int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream, +	struct dma_chan *chan); +int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream); + +int snd_dmaengine_pcm_open_request_chan(struct snd_pcm_substream *substream, +	dma_filter_fn filter_fn, void *filter_data); +int snd_dmaengine_pcm_close_release_chan(struct snd_pcm_substream *substream); + +struct dma_chan *snd_dmaengine_pcm_request_channel(dma_filter_fn filter_fn, +	void *filter_data); +struct dma_chan *snd_dmaengine_pcm_get_chan(struct snd_pcm_substream *substream); + +/** + * struct snd_dmaengine_dai_dma_data - DAI DMA configuration data + * @addr: Address of the DAI data source or destination register. + * @addr_width: Width of the DAI data source or destination register. + * @maxburst: Maximum number of words(note: words, as in units of the + * src_addr_width member, not bytes) that can be send to or received from the + * DAI in one burst. + * @slave_id: Slave requester id for the DMA channel. + * @filter_data: Custom DMA channel filter data, this will usually be used when + * requesting the DMA channel. + * @chan_name: Custom channel name to use when requesting DMA channel. + * @fifo_size: FIFO size of the DAI controller in bytes + */ +struct snd_dmaengine_dai_dma_data { +	dma_addr_t addr; +	enum dma_slave_buswidth addr_width; +	u32 maxburst; +	unsigned int slave_id; +	void *filter_data; +	const char *chan_name; +	unsigned int fifo_size; +}; + +void snd_dmaengine_pcm_set_config_from_dai_data( +	const struct snd_pcm_substream *substream, +	const struct snd_dmaengine_dai_dma_data *dma_data, +	struct dma_slave_config *config); + + +/* + * Try to request the DMA channel using compat_request_channel or + * compat_filter_fn if it couldn't be requested through devicetree. + */ +#define SND_DMAENGINE_PCM_FLAG_COMPAT BIT(0) +/* + * Don't try to request the DMA channels through devicetree. This flag only + * makes sense if SND_DMAENGINE_PCM_FLAG_COMPAT is set as well. + */ +#define SND_DMAENGINE_PCM_FLAG_NO_DT BIT(1) +/* + * The platforms dmaengine driver does not support reporting the amount of + * bytes that are still left to transfer. + */ +#define SND_DMAENGINE_PCM_FLAG_NO_RESIDUE BIT(2) +/* + * The PCM is half duplex and the DMA channel is shared between capture and + * playback. + */ +#define SND_DMAENGINE_PCM_FLAG_HALF_DUPLEX BIT(3) +/* + * The PCM streams have custom channel names specified. + */ +#define SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME BIT(4) + +/** + * struct snd_dmaengine_pcm_config - Configuration data for dmaengine based PCM + * @prepare_slave_config: Callback used to fill in the DMA slave_config for a + *   PCM substream. Will be called from the PCM drivers hwparams callback. + * @compat_request_channel: Callback to request a DMA channel for platforms + *   which do not use devicetree. + * @compat_filter_fn: Will be used as the filter function when requesting a + *  channel for platforms which do not use devicetree. The filter parameter + *  will be the DAI's DMA data. + * @dma_dev: If set, request DMA channel on this device rather than the DAI + *  device. + * @chan_names: If set, these custom DMA channel names will be requested at + *  registration time. + * @pcm_hardware: snd_pcm_hardware struct to be used for the PCM. + * @prealloc_buffer_size: Size of the preallocated audio buffer. + * + * Note: If both compat_request_channel and compat_filter_fn are set + * compat_request_channel will be used to request the channel and + * compat_filter_fn will be ignored. Otherwise the channel will be requested + * using dma_request_channel with compat_filter_fn as the filter function. + */ +struct snd_dmaengine_pcm_config { +	int (*prepare_slave_config)(struct snd_pcm_substream *substream, +			struct snd_pcm_hw_params *params, +			struct dma_slave_config *slave_config); +	struct dma_chan *(*compat_request_channel)( +			struct snd_soc_pcm_runtime *rtd, +			struct snd_pcm_substream *substream); +	dma_filter_fn compat_filter_fn; +	struct device *dma_dev; +	const char *chan_names[SNDRV_PCM_STREAM_LAST + 1]; + +	const struct snd_pcm_hardware *pcm_hardware; +	unsigned int prealloc_buffer_size; +}; + +int snd_dmaengine_pcm_register(struct device *dev, +	const struct snd_dmaengine_pcm_config *config, +	unsigned int flags); +void snd_dmaengine_pcm_unregister(struct device *dev); + +int devm_snd_dmaengine_pcm_register(struct device *dev, +	const struct snd_dmaengine_pcm_config *config, +	unsigned int flags); + +int snd_dmaengine_pcm_prepare_slave_config(struct snd_pcm_substream *substream, +	struct snd_pcm_hw_params *params, +	struct dma_slave_config *slave_config); + +#endif diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h index 4f865df42f0..c46908c1bb3 100644 --- a/include/sound/emu10k1.h +++ b/include/sound/emu10k1.h @@ -1,8 +1,3 @@ -#ifndef __SOUND_EMU10K1_H -#define __SOUND_EMU10K1_H - -#include <linux/types.h> -  /*   *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>,   *		     Creative Labs, Inc. @@ -24,8 +19,9 @@   *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   *   */ +#ifndef __SOUND_EMU10K1_H +#define __SOUND_EMU10K1_H -#ifdef __KERNEL__  #include <sound/pcm.h>  #include <sound/rawmidi.h> @@ -36,8 +32,10 @@  #include <sound/timer.h>  #include <linux/interrupt.h>  #include <linux/mutex.h> +#include <linux/firmware.h>  #include <asm/io.h> +#include <uapi/sound/emu10k1.h>  /* ------------------- DEFINES -------------------- */ @@ -438,8 +436,6 @@  #define CCCA_CURRADDR_MASK	0x00ffffff	/* Current address of the selected channel		*/  #define CCCA_CURRADDR		0x18000008 -/* undefine CCR to avoid conflict with the definition for SH */ -#undef CCR  #define CCR			0x09		/* Cache control register				*/  #define CCR_CACHEINVALIDSIZE	0x07190009  #define CCR_CACHEINVALIDSIZE_MASK	0xfe000000	/* Number of invalid samples cache for this channel    	*/ @@ -1788,7 +1784,10 @@ struct snd_emu10k1 {  	unsigned int efx_voices_mask[2];  	unsigned int next_free_voice; -#ifdef CONFIG_PM +	const struct firmware *firmware; +	const struct firmware *dock_fw; + +#ifdef CONFIG_PM_SLEEP  	unsigned int *saved_ptr;  	unsigned int *saved_gpr;  	unsigned int *tram_val_saved; @@ -1796,6 +1795,7 @@ struct snd_emu10k1 {  	unsigned int *saved_icode;  	unsigned int *p16v_saved;  	unsigned int saved_a_iocfg, saved_hcfg; +	bool suspend;  #endif  }; @@ -1856,7 +1856,7 @@ unsigned short snd_emu10k1_ac97_read(struct snd_ac97 *ac97, unsigned short reg);  void snd_emu10k1_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short data);  unsigned int snd_emu10k1_rate_to_pitch(unsigned int rate); -#ifdef CONFIG_PM +#ifdef CONFIG_PM_SLEEP  void snd_emu10k1_suspend_regs(struct snd_emu10k1 *emu);  void snd_emu10k1_resume_init(struct snd_emu10k1 *emu);  void snd_emu10k1_resume_regs(struct snd_emu10k1 *emu); @@ -1899,350 +1899,4 @@ int snd_emu10k1_fx8010_register_irq_handler(struct snd_emu10k1 *emu,  int snd_emu10k1_fx8010_unregister_irq_handler(struct snd_emu10k1 *emu,  					      struct snd_emu10k1_fx8010_irq *irq); -#endif /* __KERNEL__ */ - -/* - * ---- FX8010 ---- - */ - -#define EMU10K1_CARD_CREATIVE			0x00000000 -#define EMU10K1_CARD_EMUAPS			0x00000001 - -#define EMU10K1_FX8010_PCM_COUNT		8 - -/* instruction set */ -#define iMAC0	 0x00	/* R = A + (X * Y >> 31)   ; saturation */ -#define iMAC1	 0x01	/* R = A + (-X * Y >> 31)  ; saturation */ -#define iMAC2	 0x02	/* R = A + (X * Y >> 31)   ; wraparound */ -#define iMAC3	 0x03	/* R = A + (-X * Y >> 31)  ; wraparound */ -#define iMACINT0 0x04	/* R = A + X * Y	   ; saturation */ -#define iMACINT1 0x05	/* R = A + X * Y	   ; wraparound (31-bit) */ -#define iACC3	 0x06	/* R = A + X + Y	   ; saturation */ -#define iMACMV   0x07	/* R = A, acc += X * Y >> 31 */ -#define iANDXOR  0x08	/* R = (A & X) ^ Y */ -#define iTSTNEG  0x09	/* R = (A >= Y) ? X : ~X */ -#define iLIMITGE 0x0a	/* R = (A >= Y) ? X : Y */ -#define iLIMITLT 0x0b	/* R = (A < Y) ? X : Y */ -#define iLOG	 0x0c	/* R = linear_data, A (log_data), X (max_exp), Y (format_word) */ -#define iEXP	 0x0d	/* R = log_data, A (linear_data), X (max_exp), Y (format_word) */ -#define iINTERP  0x0e	/* R = A + (X * (Y - A) >> 31)  ; saturation */ -#define iSKIP    0x0f	/* R = A (cc_reg), X (count), Y (cc_test) */ - -/* GPRs */ -#define FXBUS(x)	(0x00 + (x))	/* x = 0x00 - 0x0f */ -#define EXTIN(x)	(0x10 + (x))	/* x = 0x00 - 0x0f */ -#define EXTOUT(x)	(0x20 + (x))	/* x = 0x00 - 0x0f physical outs -> FXWC low 16 bits */ -#define FXBUS2(x)	(0x30 + (x))	/* x = 0x00 - 0x0f copies of fx buses for capture -> FXWC high 16 bits */ -					/* NB: 0x31 and 0x32 are shared with Center/LFE on SB live 5.1 */ - -#define C_00000000	0x40 -#define C_00000001	0x41 -#define C_00000002	0x42 -#define C_00000003	0x43 -#define C_00000004	0x44 -#define C_00000008	0x45 -#define C_00000010	0x46 -#define C_00000020	0x47 -#define C_00000100	0x48 -#define C_00010000	0x49 -#define C_00080000	0x4a -#define C_10000000	0x4b -#define C_20000000	0x4c -#define C_40000000	0x4d -#define C_80000000	0x4e -#define C_7fffffff	0x4f -#define C_ffffffff	0x50 -#define C_fffffffe	0x51 -#define C_c0000000	0x52 -#define C_4f1bbcdc	0x53 -#define C_5a7ef9db	0x54 -#define C_00100000	0x55		/* ?? */ -#define GPR_ACCU	0x56		/* ACCUM, accumulator */ -#define GPR_COND	0x57		/* CCR, condition register */ -#define GPR_NOISE0	0x58		/* noise source */ -#define GPR_NOISE1	0x59		/* noise source */ -#define GPR_IRQ		0x5a		/* IRQ register */ -#define GPR_DBAC	0x5b		/* TRAM Delay Base Address Counter */ -#define GPR(x)		(FXGPREGBASE + (x)) /* free GPRs: x = 0x00 - 0xff */ -#define ITRAM_DATA(x)	(TANKMEMDATAREGBASE + 0x00 + (x)) /* x = 0x00 - 0x7f */ -#define ETRAM_DATA(x)	(TANKMEMDATAREGBASE + 0x80 + (x)) /* x = 0x00 - 0x1f */ -#define ITRAM_ADDR(x)	(TANKMEMADDRREGBASE + 0x00 + (x)) /* x = 0x00 - 0x7f */ -#define ETRAM_ADDR(x)	(TANKMEMADDRREGBASE + 0x80 + (x)) /* x = 0x00 - 0x1f */ - -#define A_ITRAM_DATA(x)	(TANKMEMDATAREGBASE + 0x00 + (x)) /* x = 0x00 - 0xbf */ -#define A_ETRAM_DATA(x)	(TANKMEMDATAREGBASE + 0xc0 + (x)) /* x = 0x00 - 0x3f */ -#define A_ITRAM_ADDR(x)	(TANKMEMADDRREGBASE + 0x00 + (x)) /* x = 0x00 - 0xbf */ -#define A_ETRAM_ADDR(x)	(TANKMEMADDRREGBASE + 0xc0 + (x)) /* x = 0x00 - 0x3f */ -#define A_ITRAM_CTL(x)	(A_TANKMEMCTLREGBASE + 0x00 + (x)) /* x = 0x00 - 0xbf */ -#define A_ETRAM_CTL(x)	(A_TANKMEMCTLREGBASE + 0xc0 + (x)) /* x = 0x00 - 0x3f */ - -#define A_FXBUS(x)	(0x00 + (x))	/* x = 0x00 - 0x3f FX buses */ -#define A_EXTIN(x)	(0x40 + (x))	/* x = 0x00 - 0x0f physical ins */ -#define A_P16VIN(x)	(0x50 + (x))	/* x = 0x00 - 0x0f p16v ins (A2 only) "EMU32 inputs" */ -#define A_EXTOUT(x)	(0x60 + (x))	/* x = 0x00 - 0x1f physical outs -> A_FXWC1 0x79-7f unknown   */ -#define A_FXBUS2(x)	(0x80 + (x))	/* x = 0x00 - 0x1f extra outs used for EFX capture -> A_FXWC2 */ -#define A_EMU32OUTH(x)	(0xa0 + (x))	/* x = 0x00 - 0x0f "EMU32_OUT_10 - _1F" - ??? */ -#define A_EMU32OUTL(x)	(0xb0 + (x))	/* x = 0x00 - 0x0f "EMU32_OUT_1 - _F" - ??? */ -#define A3_EMU32IN(x)	(0x160 + (x))	/* x = 0x00 - 0x3f "EMU32_IN_00 - _3F" - Only when .device = 0x0008 */ -#define A3_EMU32OUT(x)	(0x1E0 + (x))	/* x = 0x00 - 0x0f "EMU32_OUT_00 - _3F" - Only when .device = 0x0008 */ -#define A_GPR(x)	(A_FXGPREGBASE + (x)) - -/* cc_reg constants */ -#define CC_REG_NORMALIZED C_00000001 -#define CC_REG_BORROW	C_00000002 -#define CC_REG_MINUS	C_00000004 -#define CC_REG_ZERO	C_00000008 -#define CC_REG_SATURATE	C_00000010 -#define CC_REG_NONZERO	C_00000100 - -/* FX buses */ -#define FXBUS_PCM_LEFT		0x00 -#define FXBUS_PCM_RIGHT		0x01 -#define FXBUS_PCM_LEFT_REAR	0x02 -#define FXBUS_PCM_RIGHT_REAR	0x03 -#define FXBUS_MIDI_LEFT		0x04 -#define FXBUS_MIDI_RIGHT	0x05 -#define FXBUS_PCM_CENTER	0x06 -#define FXBUS_PCM_LFE		0x07 -#define FXBUS_PCM_LEFT_FRONT	0x08 -#define FXBUS_PCM_RIGHT_FRONT	0x09 -#define FXBUS_MIDI_REVERB	0x0c -#define FXBUS_MIDI_CHORUS	0x0d -#define FXBUS_PCM_LEFT_SIDE	0x0e -#define FXBUS_PCM_RIGHT_SIDE	0x0f -#define FXBUS_PT_LEFT		0x14 -#define FXBUS_PT_RIGHT		0x15 - -/* Inputs */ -#define EXTIN_AC97_L	   0x00	/* AC'97 capture channel - left */ -#define EXTIN_AC97_R	   0x01	/* AC'97 capture channel - right */ -#define EXTIN_SPDIF_CD_L   0x02	/* internal S/PDIF CD - onboard - left */ -#define EXTIN_SPDIF_CD_R   0x03	/* internal S/PDIF CD - onboard - right */ -#define EXTIN_ZOOM_L	   0x04	/* Zoom Video I2S - left */ -#define EXTIN_ZOOM_R	   0x05	/* Zoom Video I2S - right */ -#define EXTIN_TOSLINK_L	   0x06	/* LiveDrive - TOSLink Optical - left */ -#define EXTIN_TOSLINK_R    0x07	/* LiveDrive - TOSLink Optical - right */ -#define EXTIN_LINE1_L	   0x08	/* LiveDrive - Line/Mic 1 - left */ -#define EXTIN_LINE1_R	   0x09	/* LiveDrive - Line/Mic 1 - right */ -#define EXTIN_COAX_SPDIF_L 0x0a	/* LiveDrive - Coaxial S/PDIF - left */ -#define EXTIN_COAX_SPDIF_R 0x0b /* LiveDrive - Coaxial S/PDIF - right */ -#define EXTIN_LINE2_L	   0x0c	/* LiveDrive - Line/Mic 2 - left */ -#define EXTIN_LINE2_R	   0x0d	/* LiveDrive - Line/Mic 2 - right */ - -/* Outputs */ -#define EXTOUT_AC97_L	   0x00	/* AC'97 playback channel - left */ -#define EXTOUT_AC97_R	   0x01	/* AC'97 playback channel - right */ -#define EXTOUT_TOSLINK_L   0x02	/* LiveDrive - TOSLink Optical - left */ -#define EXTOUT_TOSLINK_R   0x03	/* LiveDrive - TOSLink Optical - right */ -#define EXTOUT_AC97_CENTER 0x04	/* SB Live 5.1 - center */ -#define EXTOUT_AC97_LFE	   0x05 /* SB Live 5.1 - LFE */ -#define EXTOUT_HEADPHONE_L 0x06	/* LiveDrive - Headphone - left */ -#define EXTOUT_HEADPHONE_R 0x07	/* LiveDrive - Headphone - right */ -#define EXTOUT_REAR_L	   0x08	/* Rear channel - left */ -#define EXTOUT_REAR_R	   0x09	/* Rear channel - right */ -#define EXTOUT_ADC_CAP_L   0x0a	/* ADC Capture buffer - left */ -#define EXTOUT_ADC_CAP_R   0x0b	/* ADC Capture buffer - right */ -#define EXTOUT_MIC_CAP	   0x0c	/* MIC Capture buffer */ -#define EXTOUT_AC97_REAR_L 0x0d	/* SB Live 5.1 (c) 2003 - Rear Left */ -#define EXTOUT_AC97_REAR_R 0x0e	/* SB Live 5.1 (c) 2003 - Rear Right */ -#define EXTOUT_ACENTER	   0x11 /* Analog Center */ -#define EXTOUT_ALFE	   0x12 /* Analog LFE */ - -/* Audigy Inputs */ -#define A_EXTIN_AC97_L		0x00	/* AC'97 capture channel - left */ -#define A_EXTIN_AC97_R		0x01	/* AC'97 capture channel - right */ -#define A_EXTIN_SPDIF_CD_L	0x02	/* digital CD left */ -#define A_EXTIN_SPDIF_CD_R	0x03	/* digital CD left */ -#define A_EXTIN_OPT_SPDIF_L     0x04    /* audigy drive Optical SPDIF - left */ -#define A_EXTIN_OPT_SPDIF_R     0x05    /*                              right */  -#define A_EXTIN_LINE2_L		0x08	/* audigy drive line2/mic2 - left */ -#define A_EXTIN_LINE2_R		0x09	/*                           right */ -#define A_EXTIN_ADC_L		0x0a    /* Philips ADC - left */ -#define A_EXTIN_ADC_R		0x0b    /*               right */ -#define A_EXTIN_AUX2_L		0x0c	/* audigy drive aux2 - left */ -#define A_EXTIN_AUX2_R		0x0d	/*                   - right */ - -/* Audigiy Outputs */ -#define A_EXTOUT_FRONT_L	0x00	/* digital front left */ -#define A_EXTOUT_FRONT_R	0x01	/*               right */ -#define A_EXTOUT_CENTER		0x02	/* digital front center */ -#define A_EXTOUT_LFE		0x03	/* digital front lfe */ -#define A_EXTOUT_HEADPHONE_L	0x04	/* headphone audigy drive left */ -#define A_EXTOUT_HEADPHONE_R	0x05	/*                        right */ -#define A_EXTOUT_REAR_L		0x06	/* digital rear left */ -#define A_EXTOUT_REAR_R		0x07	/*              right */ -#define A_EXTOUT_AFRONT_L	0x08	/* analog front left */ -#define A_EXTOUT_AFRONT_R	0x09	/*              right */ -#define A_EXTOUT_ACENTER	0x0a	/* analog center */ -#define A_EXTOUT_ALFE		0x0b	/* analog LFE */ -#define A_EXTOUT_ASIDE_L	0x0c	/* analog side left  - Audigy 2 ZS */ -#define A_EXTOUT_ASIDE_R	0x0d	/*             right - Audigy 2 ZS */ -#define A_EXTOUT_AREAR_L	0x0e	/* analog rear left */ -#define A_EXTOUT_AREAR_R	0x0f	/*             right */ -#define A_EXTOUT_AC97_L		0x10	/* AC97 left (front) */ -#define A_EXTOUT_AC97_R		0x11	/*      right */ -#define A_EXTOUT_ADC_CAP_L	0x16	/* ADC capture buffer left */ -#define A_EXTOUT_ADC_CAP_R	0x17	/*                    right */ -#define A_EXTOUT_MIC_CAP	0x18	/* Mic capture buffer */ - -/* Audigy constants */ -#define A_C_00000000	0xc0 -#define A_C_00000001	0xc1 -#define A_C_00000002	0xc2 -#define A_C_00000003	0xc3 -#define A_C_00000004	0xc4 -#define A_C_00000008	0xc5 -#define A_C_00000010	0xc6 -#define A_C_00000020	0xc7 -#define A_C_00000100	0xc8 -#define A_C_00010000	0xc9 -#define A_C_00000800	0xca -#define A_C_10000000	0xcb -#define A_C_20000000	0xcc -#define A_C_40000000	0xcd -#define A_C_80000000	0xce -#define A_C_7fffffff	0xcf -#define A_C_ffffffff	0xd0 -#define A_C_fffffffe	0xd1 -#define A_C_c0000000	0xd2 -#define A_C_4f1bbcdc	0xd3 -#define A_C_5a7ef9db	0xd4 -#define A_C_00100000	0xd5 -#define A_GPR_ACCU	0xd6		/* ACCUM, accumulator */ -#define A_GPR_COND	0xd7		/* CCR, condition register */ -#define A_GPR_NOISE0	0xd8		/* noise source */ -#define A_GPR_NOISE1	0xd9		/* noise source */ -#define A_GPR_IRQ	0xda		/* IRQ register */ -#define A_GPR_DBAC	0xdb		/* TRAM Delay Base Address Counter - internal */ -#define A_GPR_DBACE	0xde		/* TRAM Delay Base Address Counter - external */ - -/* definitions for debug register */ -#define EMU10K1_DBG_ZC			0x80000000	/* zero tram counter */ -#define EMU10K1_DBG_SATURATION_OCCURED	0x02000000	/* saturation control */ -#define EMU10K1_DBG_SATURATION_ADDR	0x01ff0000	/* saturation address */ -#define EMU10K1_DBG_SINGLE_STEP		0x00008000	/* single step mode */ -#define EMU10K1_DBG_STEP		0x00004000	/* start single step */ -#define EMU10K1_DBG_CONDITION_CODE	0x00003e00	/* condition code */ -#define EMU10K1_DBG_SINGLE_STEP_ADDR	0x000001ff	/* single step address */ - -/* tank memory address line */ -#ifndef __KERNEL__ -#define TANKMEMADDRREG_ADDR_MASK 0x000fffff	/* 20 bit tank address field			*/ -#define TANKMEMADDRREG_CLEAR	 0x00800000	/* Clear tank memory				*/ -#define TANKMEMADDRREG_ALIGN	 0x00400000	/* Align read or write relative to tank access	*/ -#define TANKMEMADDRREG_WRITE	 0x00200000	/* Write to tank memory				*/ -#define TANKMEMADDRREG_READ	 0x00100000	/* Read from tank memory			*/ -#endif - -struct snd_emu10k1_fx8010_info { -	unsigned int internal_tram_size;	/* in samples */ -	unsigned int external_tram_size;	/* in samples */ -	char fxbus_names[16][32];		/* names of FXBUSes */ -	char extin_names[16][32];		/* names of external inputs */ -	char extout_names[32][32];		/* names of external outputs */ -	unsigned int gpr_controls;		/* count of GPR controls */ -}; - -#define EMU10K1_GPR_TRANSLATION_NONE		0 -#define EMU10K1_GPR_TRANSLATION_TABLE100	1 -#define EMU10K1_GPR_TRANSLATION_BASS		2 -#define EMU10K1_GPR_TRANSLATION_TREBLE		3 -#define EMU10K1_GPR_TRANSLATION_ONOFF		4 - -struct snd_emu10k1_fx8010_control_gpr { -	struct snd_ctl_elem_id id;		/* full control ID definition */ -	unsigned int vcount;		/* visible count */ -	unsigned int count;		/* count of GPR (1..16) */ -	unsigned short gpr[32];		/* GPR number(s) */ -	unsigned int value[32];		/* initial values */ -	unsigned int min;		/* minimum range */ -	unsigned int max;		/* maximum range */ -	unsigned int translation;	/* translation type (EMU10K1_GPR_TRANSLATION*) */ -	const unsigned int *tlv; -}; - -/* old ABI without TLV support */ -struct snd_emu10k1_fx8010_control_old_gpr { -	struct snd_ctl_elem_id id; -	unsigned int vcount; -	unsigned int count; -	unsigned short gpr[32]; -	unsigned int value[32]; -	unsigned int min; -	unsigned int max; -	unsigned int translation; -}; - -struct snd_emu10k1_fx8010_code { -	char name[128]; - -	DECLARE_BITMAP(gpr_valid, 0x200); /* bitmask of valid initializers */ -	__u32 __user *gpr_map;		/* initializers */ - -	unsigned int gpr_add_control_count; /* count of GPR controls to add/replace */ -	struct snd_emu10k1_fx8010_control_gpr __user *gpr_add_controls; /* GPR controls to add/replace */ - -	unsigned int gpr_del_control_count; /* count of GPR controls to remove */ -	struct snd_ctl_elem_id __user *gpr_del_controls; /* IDs of GPR controls to remove */ - -	unsigned int gpr_list_control_count; /* count of GPR controls to list */ -	unsigned int gpr_list_control_total; /* total count of GPR controls */ -	struct snd_emu10k1_fx8010_control_gpr __user *gpr_list_controls; /* listed GPR controls */ - -	DECLARE_BITMAP(tram_valid, 0x100); /* bitmask of valid initializers */ -	__u32 __user *tram_data_map;	  /* data initializers */ -	__u32 __user *tram_addr_map;	  /* map initializers */ - -	DECLARE_BITMAP(code_valid, 1024); /* bitmask of valid instructions */ -	__u32 __user *code;		  /* one instruction - 64 bits */ -}; - -struct snd_emu10k1_fx8010_tram { -	unsigned int address;		/* 31.bit == 1 -> external TRAM */ -	unsigned int size;		/* size in samples (4 bytes) */ -	unsigned int *samples;		/* pointer to samples (20-bit) */ -					/* NULL->clear memory */ -}; - -struct snd_emu10k1_fx8010_pcm_rec { -	unsigned int substream;		/* substream number */ -	unsigned int res1;		/* reserved */ -	unsigned int channels;		/* 16-bit channels count, zero = remove this substream */ -	unsigned int tram_start;	/* ring buffer position in TRAM (in samples) */ -	unsigned int buffer_size;	/* count of buffered samples */ -	unsigned short gpr_size;		/* GPR containing size of ringbuffer in samples (host) */ -	unsigned short gpr_ptr;		/* GPR containing current pointer in the ring buffer (host = reset, FX8010) */ -	unsigned short gpr_count;	/* GPR containing count of samples between two interrupts (host) */ -	unsigned short gpr_tmpcount;	/* GPR containing current count of samples to interrupt (host = set, FX8010) */ -	unsigned short gpr_trigger;	/* GPR containing trigger (activate) information (host) */ -	unsigned short gpr_running;	/* GPR containing info if PCM is running (FX8010) */ -	unsigned char pad;		/* reserved */ -	unsigned char etram[32];	/* external TRAM address & data (one per channel) */ -	unsigned int res2;		/* reserved */ -}; - -#define SNDRV_EMU10K1_VERSION		SNDRV_PROTOCOL_VERSION(1, 0, 1) - -#define SNDRV_EMU10K1_IOCTL_INFO	_IOR ('H', 0x10, struct snd_emu10k1_fx8010_info) -#define SNDRV_EMU10K1_IOCTL_CODE_POKE	_IOW ('H', 0x11, struct snd_emu10k1_fx8010_code) -#define SNDRV_EMU10K1_IOCTL_CODE_PEEK	_IOWR('H', 0x12, struct snd_emu10k1_fx8010_code) -#define SNDRV_EMU10K1_IOCTL_TRAM_SETUP	_IOW ('H', 0x20, int) -#define SNDRV_EMU10K1_IOCTL_TRAM_POKE	_IOW ('H', 0x21, struct snd_emu10k1_fx8010_tram) -#define SNDRV_EMU10K1_IOCTL_TRAM_PEEK	_IOWR('H', 0x22, struct snd_emu10k1_fx8010_tram) -#define SNDRV_EMU10K1_IOCTL_PCM_POKE	_IOW ('H', 0x30, struct snd_emu10k1_fx8010_pcm_rec) -#define SNDRV_EMU10K1_IOCTL_PCM_PEEK	_IOWR('H', 0x31, struct snd_emu10k1_fx8010_pcm_rec) -#define SNDRV_EMU10K1_IOCTL_PVERSION	_IOR ('H', 0x40, int) -#define SNDRV_EMU10K1_IOCTL_STOP	_IO  ('H', 0x80) -#define SNDRV_EMU10K1_IOCTL_CONTINUE	_IO  ('H', 0x81) -#define SNDRV_EMU10K1_IOCTL_ZERO_TRAM_COUNTER _IO ('H', 0x82) -#define SNDRV_EMU10K1_IOCTL_SINGLE_STEP	_IOW ('H', 0x83, int) -#define SNDRV_EMU10K1_IOCTL_DBG_READ	_IOR ('H', 0x84, int) - -/* typedefs for compatibility to user-space */ -typedef struct snd_emu10k1_fx8010_info emu10k1_fx8010_info_t; -typedef struct snd_emu10k1_fx8010_control_gpr emu10k1_fx8010_control_gpr_t; -typedef struct snd_emu10k1_fx8010_code emu10k1_fx8010_code_t; -typedef struct snd_emu10k1_fx8010_tram emu10k1_fx8010_tram_t; -typedef struct snd_emu10k1_fx8010_pcm_rec emu10k1_fx8010_pcm_t; -  #endif	/* __SOUND_EMU10K1_H */ diff --git a/include/sound/emu10k1_synth.h b/include/sound/emu10k1_synth.h index 6ef61c42093..9f211e957bf 100644 --- a/include/sound/emu10k1_synth.h +++ b/include/sound/emu10k1_synth.h @@ -20,8 +20,8 @@   *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   */ -#include "emu10k1.h" -#include "emux_synth.h" +#include <sound/emu10k1.h> +#include <sound/emux_synth.h>  /* sequencer device id */  #define SNDRV_SEQ_DEV_ID_EMU10K1_SYNTH	"emu10k1-synth" diff --git a/include/sound/emu8000.h b/include/sound/emu8000.h index c8f66bde6d9..c321302a914 100644 --- a/include/sound/emu8000.h +++ b/include/sound/emu8000.h @@ -21,8 +21,8 @@   *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   */ -#include "emux_synth.h" -#include "seq_kernel.h" +#include <sound/emux_synth.h> +#include <sound/seq_kernel.h>  /*   * Hardware parameters. diff --git a/include/sound/emux_legacy.h b/include/sound/emux_legacy.h index 6fe3da2a5e1..baf43fc24d3 100644 --- a/include/sound/emux_legacy.h +++ b/include/sound/emux_legacy.h @@ -22,7 +22,7 @@   *   */ -#include "seq_oss_legacy.h" +#include <sound/seq_oss_legacy.h>  /*   * awe hardware controls diff --git a/include/sound/emux_synth.h b/include/sound/emux_synth.h index d8cb51b86c2..fb81f3722b6 100644 --- a/include/sound/emux_synth.h +++ b/include/sound/emux_synth.h @@ -21,15 +21,15 @@   *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   */ -#include "seq_kernel.h" -#include "seq_device.h" -#include "soundfont.h" -#include "seq_midi_emul.h" +#include <sound/seq_kernel.h> +#include <sound/seq_device.h> +#include <sound/soundfont.h> +#include <sound/seq_midi_emul.h>  #ifdef CONFIG_SND_SEQUENCER_OSS -#include "seq_oss.h" +#include <sound/seq_oss.h>  #endif -#include "emux_legacy.h" -#include "seq_virmidi.h" +#include <sound/emux_legacy.h> +#include <sound/seq_virmidi.h>  /*   * compile flags diff --git a/include/sound/es1688.h b/include/sound/es1688.h index 3ec7ecbe250..1d636a2d889 100644 --- a/include/sound/es1688.h +++ b/include/sound/es1688.h @@ -22,13 +22,14 @@   *   */ -#include "control.h" -#include "pcm.h" +#include <sound/control.h> +#include <sound/pcm.h>  #include <linux/interrupt.h>  #define ES1688_HW_AUTO		0x0000  #define ES1688_HW_688		0x0001  #define ES1688_HW_1688		0x0002 +#define ES1688_HW_UNDEF	0x0003  struct snd_es1688 {  	unsigned long port;		/* port of ESS chip */ diff --git a/include/sound/gus.h b/include/sound/gus.h index 841bb8df38c..42905d811da 100644 --- a/include/sound/gus.h +++ b/include/sound/gus.h @@ -22,11 +22,11 @@   *   */ -#include "pcm.h" -#include "rawmidi.h" -#include "timer.h" -#include "seq_midi_emul.h" -#include "seq_device.h" +#include <sound/pcm.h> +#include <sound/rawmidi.h> +#include <sound/timer.h> +#include <sound/seq_midi_emul.h> +#include <sound/seq_device.h>  #include <asm/io.h>  /* IO ports */ diff --git a/include/sound/hda_verbs.h b/include/sound/hda_verbs.h new file mode 100644 index 00000000000..d0509db6d0e --- /dev/null +++ b/include/sound/hda_verbs.h @@ -0,0 +1,554 @@ +/* + * HD-audio codec verbs + */ + +#ifndef __SOUND_HDA_VERBS_H +#define __SOUND_HDA_VERBS_H + +/* + * nodes + */ +#define	AC_NODE_ROOT		0x00 + +/* + * function group types + */ +enum { +	AC_GRP_AUDIO_FUNCTION = 0x01, +	AC_GRP_MODEM_FUNCTION = 0x02, +}; + +/* + * widget types + */ +enum { +	AC_WID_AUD_OUT,		/* Audio Out */ +	AC_WID_AUD_IN,		/* Audio In */ +	AC_WID_AUD_MIX,		/* Audio Mixer */ +	AC_WID_AUD_SEL,		/* Audio Selector */ +	AC_WID_PIN,		/* Pin Complex */ +	AC_WID_POWER,		/* Power */ +	AC_WID_VOL_KNB,		/* Volume Knob */ +	AC_WID_BEEP,		/* Beep Generator */ +	AC_WID_VENDOR = 0x0f	/* Vendor specific */ +}; + +/* + * GET verbs + */ +#define AC_VERB_GET_STREAM_FORMAT		0x0a00 +#define AC_VERB_GET_AMP_GAIN_MUTE		0x0b00 +#define AC_VERB_GET_PROC_COEF			0x0c00 +#define AC_VERB_GET_COEF_INDEX			0x0d00 +#define AC_VERB_PARAMETERS			0x0f00 +#define AC_VERB_GET_CONNECT_SEL			0x0f01 +#define AC_VERB_GET_CONNECT_LIST		0x0f02 +#define AC_VERB_GET_PROC_STATE			0x0f03 +#define AC_VERB_GET_SDI_SELECT			0x0f04 +#define AC_VERB_GET_POWER_STATE			0x0f05 +#define AC_VERB_GET_CONV			0x0f06 +#define AC_VERB_GET_PIN_WIDGET_CONTROL		0x0f07 +#define AC_VERB_GET_UNSOLICITED_RESPONSE	0x0f08 +#define AC_VERB_GET_PIN_SENSE			0x0f09 +#define AC_VERB_GET_BEEP_CONTROL		0x0f0a +#define AC_VERB_GET_EAPD_BTLENABLE		0x0f0c +#define AC_VERB_GET_DIGI_CONVERT_1		0x0f0d +#define AC_VERB_GET_DIGI_CONVERT_2		0x0f0e /* unused */ +#define AC_VERB_GET_VOLUME_KNOB_CONTROL		0x0f0f +/* f10-f1a: GPIO */ +#define AC_VERB_GET_GPIO_DATA			0x0f15 +#define AC_VERB_GET_GPIO_MASK			0x0f16 +#define AC_VERB_GET_GPIO_DIRECTION		0x0f17 +#define AC_VERB_GET_GPIO_WAKE_MASK		0x0f18 +#define AC_VERB_GET_GPIO_UNSOLICITED_RSP_MASK	0x0f19 +#define AC_VERB_GET_GPIO_STICKY_MASK		0x0f1a +#define AC_VERB_GET_CONFIG_DEFAULT		0x0f1c +/* f20: AFG/MFG */ +#define AC_VERB_GET_SUBSYSTEM_ID		0x0f20 +#define AC_VERB_GET_CVT_CHAN_COUNT		0x0f2d +#define AC_VERB_GET_HDMI_DIP_SIZE		0x0f2e +#define AC_VERB_GET_HDMI_ELDD			0x0f2f +#define AC_VERB_GET_HDMI_DIP_INDEX		0x0f30 +#define AC_VERB_GET_HDMI_DIP_DATA		0x0f31 +#define AC_VERB_GET_HDMI_DIP_XMIT		0x0f32 +#define AC_VERB_GET_HDMI_CP_CTRL		0x0f33 +#define AC_VERB_GET_HDMI_CHAN_SLOT		0x0f34 +#define AC_VERB_GET_DEVICE_SEL			0xf35 +#define AC_VERB_GET_DEVICE_LIST			0xf36 + +/* + * SET verbs + */ +#define AC_VERB_SET_STREAM_FORMAT		0x200 +#define AC_VERB_SET_AMP_GAIN_MUTE		0x300 +#define AC_VERB_SET_PROC_COEF			0x400 +#define AC_VERB_SET_COEF_INDEX			0x500 +#define AC_VERB_SET_CONNECT_SEL			0x701 +#define AC_VERB_SET_PROC_STATE			0x703 +#define AC_VERB_SET_SDI_SELECT			0x704 +#define AC_VERB_SET_POWER_STATE			0x705 +#define AC_VERB_SET_CHANNEL_STREAMID		0x706 +#define AC_VERB_SET_PIN_WIDGET_CONTROL		0x707 +#define AC_VERB_SET_UNSOLICITED_ENABLE		0x708 +#define AC_VERB_SET_PIN_SENSE			0x709 +#define AC_VERB_SET_BEEP_CONTROL		0x70a +#define AC_VERB_SET_EAPD_BTLENABLE		0x70c +#define AC_VERB_SET_DIGI_CONVERT_1		0x70d +#define AC_VERB_SET_DIGI_CONVERT_2		0x70e +#define AC_VERB_SET_VOLUME_KNOB_CONTROL		0x70f +#define AC_VERB_SET_GPIO_DATA			0x715 +#define AC_VERB_SET_GPIO_MASK			0x716 +#define AC_VERB_SET_GPIO_DIRECTION		0x717 +#define AC_VERB_SET_GPIO_WAKE_MASK		0x718 +#define AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK	0x719 +#define AC_VERB_SET_GPIO_STICKY_MASK		0x71a +#define AC_VERB_SET_CONFIG_DEFAULT_BYTES_0	0x71c +#define AC_VERB_SET_CONFIG_DEFAULT_BYTES_1	0x71d +#define AC_VERB_SET_CONFIG_DEFAULT_BYTES_2	0x71e +#define AC_VERB_SET_CONFIG_DEFAULT_BYTES_3	0x71f +#define AC_VERB_SET_EAPD				0x788 +#define AC_VERB_SET_CODEC_RESET			0x7ff +#define AC_VERB_SET_CVT_CHAN_COUNT		0x72d +#define AC_VERB_SET_HDMI_DIP_INDEX		0x730 +#define AC_VERB_SET_HDMI_DIP_DATA		0x731 +#define AC_VERB_SET_HDMI_DIP_XMIT		0x732 +#define AC_VERB_SET_HDMI_CP_CTRL		0x733 +#define AC_VERB_SET_HDMI_CHAN_SLOT		0x734 +#define AC_VERB_SET_DEVICE_SEL			0x735 + +/* + * Parameter IDs + */ +#define AC_PAR_VENDOR_ID		0x00 +#define AC_PAR_SUBSYSTEM_ID		0x01 +#define AC_PAR_REV_ID			0x02 +#define AC_PAR_NODE_COUNT		0x04 +#define AC_PAR_FUNCTION_TYPE		0x05 +#define AC_PAR_AUDIO_FG_CAP		0x08 +#define AC_PAR_AUDIO_WIDGET_CAP		0x09 +#define AC_PAR_PCM			0x0a +#define AC_PAR_STREAM			0x0b +#define AC_PAR_PIN_CAP			0x0c +#define AC_PAR_AMP_IN_CAP		0x0d +#define AC_PAR_CONNLIST_LEN		0x0e +#define AC_PAR_POWER_STATE		0x0f +#define AC_PAR_PROC_CAP			0x10 +#define AC_PAR_GPIO_CAP			0x11 +#define AC_PAR_AMP_OUT_CAP		0x12 +#define AC_PAR_VOL_KNB_CAP		0x13 +#define AC_PAR_DEVLIST_LEN		0x15 +#define AC_PAR_HDMI_LPCM_CAP		0x20 + +/* + * AC_VERB_PARAMETERS results (32bit) + */ + +/* Function Group Type */ +#define AC_FGT_TYPE			(0xff<<0) +#define AC_FGT_TYPE_SHIFT		0 +#define AC_FGT_UNSOL_CAP		(1<<8) + +/* Audio Function Group Capabilities */ +#define AC_AFG_OUT_DELAY		(0xf<<0) +#define AC_AFG_IN_DELAY			(0xf<<8) +#define AC_AFG_BEEP_GEN			(1<<16) + +/* Audio Widget Capabilities */ +#define AC_WCAP_STEREO			(1<<0)	/* stereo I/O */ +#define AC_WCAP_IN_AMP			(1<<1)	/* AMP-in present */ +#define AC_WCAP_OUT_AMP			(1<<2)	/* AMP-out present */ +#define AC_WCAP_AMP_OVRD		(1<<3)	/* AMP-parameter override */ +#define AC_WCAP_FORMAT_OVRD		(1<<4)	/* format override */ +#define AC_WCAP_STRIPE			(1<<5)	/* stripe */ +#define AC_WCAP_PROC_WID		(1<<6)	/* Proc Widget */ +#define AC_WCAP_UNSOL_CAP		(1<<7)	/* Unsol capable */ +#define AC_WCAP_CONN_LIST		(1<<8)	/* connection list */ +#define AC_WCAP_DIGITAL			(1<<9)	/* digital I/O */ +#define AC_WCAP_POWER			(1<<10)	/* power control */ +#define AC_WCAP_LR_SWAP			(1<<11)	/* L/R swap */ +#define AC_WCAP_CP_CAPS			(1<<12) /* content protection */ +#define AC_WCAP_CHAN_CNT_EXT		(7<<13)	/* channel count ext */ +#define AC_WCAP_DELAY			(0xf<<16) +#define AC_WCAP_DELAY_SHIFT		16 +#define AC_WCAP_TYPE			(0xf<<20) +#define AC_WCAP_TYPE_SHIFT		20 + +/* supported PCM rates and bits */ +#define AC_SUPPCM_RATES			(0xfff << 0) +#define AC_SUPPCM_BITS_8		(1<<16) +#define AC_SUPPCM_BITS_16		(1<<17) +#define AC_SUPPCM_BITS_20		(1<<18) +#define AC_SUPPCM_BITS_24		(1<<19) +#define AC_SUPPCM_BITS_32		(1<<20) + +/* supported PCM stream format */ +#define AC_SUPFMT_PCM			(1<<0) +#define AC_SUPFMT_FLOAT32		(1<<1) +#define AC_SUPFMT_AC3			(1<<2) + +/* GP I/O count */ +#define AC_GPIO_IO_COUNT		(0xff<<0) +#define AC_GPIO_O_COUNT			(0xff<<8) +#define AC_GPIO_O_COUNT_SHIFT		8 +#define AC_GPIO_I_COUNT			(0xff<<16) +#define AC_GPIO_I_COUNT_SHIFT		16 +#define AC_GPIO_UNSOLICITED		(1<<30) +#define AC_GPIO_WAKE			(1<<31) + +/* Converter stream, channel */ +#define AC_CONV_CHANNEL			(0xf<<0) +#define AC_CONV_STREAM			(0xf<<4) +#define AC_CONV_STREAM_SHIFT		4 + +/* Input converter SDI select */ +#define AC_SDI_SELECT			(0xf<<0) + +/* stream format id */ +#define AC_FMT_CHAN_SHIFT		0 +#define AC_FMT_CHAN_MASK		(0x0f << 0) +#define AC_FMT_BITS_SHIFT		4 +#define AC_FMT_BITS_MASK		(7 << 4) +#define AC_FMT_BITS_8			(0 << 4) +#define AC_FMT_BITS_16			(1 << 4) +#define AC_FMT_BITS_20			(2 << 4) +#define AC_FMT_BITS_24			(3 << 4) +#define AC_FMT_BITS_32			(4 << 4) +#define AC_FMT_DIV_SHIFT		8 +#define AC_FMT_DIV_MASK			(7 << 8) +#define AC_FMT_MULT_SHIFT		11 +#define AC_FMT_MULT_MASK		(7 << 11) +#define AC_FMT_BASE_SHIFT		14 +#define AC_FMT_BASE_48K			(0 << 14) +#define AC_FMT_BASE_44K			(1 << 14) +#define AC_FMT_TYPE_SHIFT		15 +#define AC_FMT_TYPE_PCM			(0 << 15) +#define AC_FMT_TYPE_NON_PCM		(1 << 15) + +/* Unsolicited response control */ +#define AC_UNSOL_TAG			(0x3f<<0) +#define AC_UNSOL_ENABLED		(1<<7) +#define AC_USRSP_EN			AC_UNSOL_ENABLED + +/* Unsolicited responses */ +#define AC_UNSOL_RES_TAG		(0x3f<<26) +#define AC_UNSOL_RES_TAG_SHIFT		26 +#define AC_UNSOL_RES_SUBTAG		(0x1f<<21) +#define AC_UNSOL_RES_SUBTAG_SHIFT	21 +#define AC_UNSOL_RES_DE			(0x3f<<15)  /* Device Entry +						     * (for DP1.2 MST) +						     */ +#define AC_UNSOL_RES_DE_SHIFT		15 +#define AC_UNSOL_RES_IA			(1<<2)	/* Inactive (for DP1.2 MST) */ +#define AC_UNSOL_RES_ELDV		(1<<1)	/* ELD Data valid (for HDMI) */ +#define AC_UNSOL_RES_PD			(1<<0)	/* pinsense detect */ +#define AC_UNSOL_RES_CP_STATE		(1<<1)	/* content protection */ +#define AC_UNSOL_RES_CP_READY		(1<<0)	/* content protection */ + +/* Pin widget capabilies */ +#define AC_PINCAP_IMP_SENSE		(1<<0)	/* impedance sense capable */ +#define AC_PINCAP_TRIG_REQ		(1<<1)	/* trigger required */ +#define AC_PINCAP_PRES_DETECT		(1<<2)	/* presence detect capable */ +#define AC_PINCAP_HP_DRV		(1<<3)	/* headphone drive capable */ +#define AC_PINCAP_OUT			(1<<4)	/* output capable */ +#define AC_PINCAP_IN			(1<<5)	/* input capable */ +#define AC_PINCAP_BALANCE		(1<<6)	/* balanced I/O capable */ +/* Note: This LR_SWAP pincap is defined in the Realtek ALC883 specification, + *       but is marked reserved in the Intel HDA specification. + */ +#define AC_PINCAP_LR_SWAP		(1<<7)	/* L/R swap */ +/* Note: The same bit as LR_SWAP is newly defined as HDMI capability + *       in HD-audio specification + */ +#define AC_PINCAP_HDMI			(1<<7)	/* HDMI pin */ +#define AC_PINCAP_DP			(1<<24)	/* DisplayPort pin, can +						 * coexist with AC_PINCAP_HDMI +						 */ +#define AC_PINCAP_VREF			(0x37<<8) +#define AC_PINCAP_VREF_SHIFT		8 +#define AC_PINCAP_EAPD			(1<<16)	/* EAPD capable */ +#define AC_PINCAP_HBR			(1<<27)	/* High Bit Rate */ +/* Vref status (used in pin cap) */ +#define AC_PINCAP_VREF_HIZ		(1<<0)	/* Hi-Z */ +#define AC_PINCAP_VREF_50		(1<<1)	/* 50% */ +#define AC_PINCAP_VREF_GRD		(1<<2)	/* ground */ +#define AC_PINCAP_VREF_80		(1<<4)	/* 80% */ +#define AC_PINCAP_VREF_100		(1<<5)	/* 100% */ + +/* Amplifier capabilities */ +#define AC_AMPCAP_OFFSET		(0x7f<<0)  /* 0dB offset */ +#define AC_AMPCAP_OFFSET_SHIFT		0 +#define AC_AMPCAP_NUM_STEPS		(0x7f<<8)  /* number of steps */ +#define AC_AMPCAP_NUM_STEPS_SHIFT	8 +#define AC_AMPCAP_STEP_SIZE		(0x7f<<16) /* step size 0-32dB +						    * in 0.25dB +						    */ +#define AC_AMPCAP_STEP_SIZE_SHIFT	16 +#define AC_AMPCAP_MUTE			(1<<31)    /* mute capable */ +#define AC_AMPCAP_MUTE_SHIFT		31 + +/* driver-specific amp-caps: using bits 24-30 */ +#define AC_AMPCAP_MIN_MUTE		(1 << 30) /* min-volume = mute */ + +/* Connection list */ +#define AC_CLIST_LENGTH			(0x7f<<0) +#define AC_CLIST_LONG			(1<<7) + +/* Supported power status */ +#define AC_PWRST_D0SUP			(1<<0) +#define AC_PWRST_D1SUP			(1<<1) +#define AC_PWRST_D2SUP			(1<<2) +#define AC_PWRST_D3SUP			(1<<3) +#define AC_PWRST_D3COLDSUP		(1<<4) +#define AC_PWRST_S3D3COLDSUP		(1<<29) +#define AC_PWRST_CLKSTOP		(1<<30) +#define AC_PWRST_EPSS			(1U<<31) + +/* Power state values */ +#define AC_PWRST_SETTING		(0xf<<0) +#define AC_PWRST_ACTUAL			(0xf<<4) +#define AC_PWRST_ACTUAL_SHIFT		4 +#define AC_PWRST_D0			0x00 +#define AC_PWRST_D1			0x01 +#define AC_PWRST_D2			0x02 +#define AC_PWRST_D3			0x03 +#define AC_PWRST_ERROR                  (1<<8) +#define AC_PWRST_CLK_STOP_OK            (1<<9) +#define AC_PWRST_SETTING_RESET          (1<<10) + +/* Processing capabilies */ +#define AC_PCAP_BENIGN			(1<<0) +#define AC_PCAP_NUM_COEF		(0xff<<8) +#define AC_PCAP_NUM_COEF_SHIFT		8 + +/* Volume knobs capabilities */ +#define AC_KNBCAP_NUM_STEPS		(0x7f<<0) +#define AC_KNBCAP_DELTA			(1<<7) + +/* HDMI LPCM capabilities */ +#define AC_LPCMCAP_48K_CP_CHNS		(0x0f<<0) /* max channels w/ CP-on */ +#define AC_LPCMCAP_48K_NO_CHNS		(0x0f<<4) /* max channels w/o CP-on */ +#define AC_LPCMCAP_48K_20BIT		(1<<8)	/* 20b bitrate supported */ +#define AC_LPCMCAP_48K_24BIT		(1<<9)	/* 24b bitrate supported */ +#define AC_LPCMCAP_96K_CP_CHNS		(0x0f<<10) /* max channels w/ CP-on */ +#define AC_LPCMCAP_96K_NO_CHNS		(0x0f<<14) /* max channels w/o CP-on */ +#define AC_LPCMCAP_96K_20BIT		(1<<18)	/* 20b bitrate supported */ +#define AC_LPCMCAP_96K_24BIT		(1<<19)	/* 24b bitrate supported */ +#define AC_LPCMCAP_192K_CP_CHNS		(0x0f<<20) /* max channels w/ CP-on */ +#define AC_LPCMCAP_192K_NO_CHNS		(0x0f<<24) /* max channels w/o CP-on */ +#define AC_LPCMCAP_192K_20BIT		(1<<28)	/* 20b bitrate supported */ +#define AC_LPCMCAP_192K_24BIT		(1<<29)	/* 24b bitrate supported */ +#define AC_LPCMCAP_44K			(1<<30)	/* 44.1kHz support */ +#define AC_LPCMCAP_44K_MS		(1<<31)	/* 44.1kHz-multiplies support */ + +/* Display pin's device list length */ +#define AC_DEV_LIST_LEN_MASK		0x3f +#define AC_MAX_DEV_LIST_LEN		64 + +/* + * Control Parameters + */ + +/* Amp gain/mute */ +#define AC_AMP_MUTE			(1<<7) +#define AC_AMP_GAIN			(0x7f) +#define AC_AMP_GET_INDEX		(0xf<<0) + +#define AC_AMP_GET_LEFT			(1<<13) +#define AC_AMP_GET_RIGHT		(0<<13) +#define AC_AMP_GET_OUTPUT		(1<<15) +#define AC_AMP_GET_INPUT		(0<<15) + +#define AC_AMP_SET_INDEX		(0xf<<8) +#define AC_AMP_SET_INDEX_SHIFT		8 +#define AC_AMP_SET_RIGHT		(1<<12) +#define AC_AMP_SET_LEFT			(1<<13) +#define AC_AMP_SET_INPUT		(1<<14) +#define AC_AMP_SET_OUTPUT		(1<<15) + +/* DIGITAL1 bits */ +#define AC_DIG1_ENABLE			(1<<0) +#define AC_DIG1_V			(1<<1) +#define AC_DIG1_VCFG			(1<<2) +#define AC_DIG1_EMPHASIS		(1<<3) +#define AC_DIG1_COPYRIGHT		(1<<4) +#define AC_DIG1_NONAUDIO		(1<<5) +#define AC_DIG1_PROFESSIONAL		(1<<6) +#define AC_DIG1_LEVEL			(1<<7) + +/* DIGITAL2 bits */ +#define AC_DIG2_CC			(0x7f<<0) + +/* DIGITAL3 bits */ +#define AC_DIG3_ICT			(0xf<<0) +#define AC_DIG3_KAE			(1<<7) + +/* Pin widget control - 8bit */ +#define AC_PINCTL_EPT			(0x3<<0) +#define AC_PINCTL_EPT_NATIVE		0 +#define AC_PINCTL_EPT_HBR		3 +#define AC_PINCTL_VREFEN		(0x7<<0) +#define AC_PINCTL_VREF_HIZ		0	/* Hi-Z */ +#define AC_PINCTL_VREF_50		1	/* 50% */ +#define AC_PINCTL_VREF_GRD		2	/* ground */ +#define AC_PINCTL_VREF_80		4	/* 80% */ +#define AC_PINCTL_VREF_100		5	/* 100% */ +#define AC_PINCTL_IN_EN			(1<<5) +#define AC_PINCTL_OUT_EN		(1<<6) +#define AC_PINCTL_HP_EN			(1<<7) + +/* Pin sense - 32bit */ +#define AC_PINSENSE_IMPEDANCE_MASK	(0x7fffffff) +#define AC_PINSENSE_PRESENCE		(1<<31) +#define AC_PINSENSE_ELDV		(1<<30)	/* ELD valid (HDMI) */ + +/* EAPD/BTL enable - 32bit */ +#define AC_EAPDBTL_BALANCED		(1<<0) +#define AC_EAPDBTL_EAPD			(1<<1) +#define AC_EAPDBTL_LR_SWAP		(1<<2) + +/* HDMI ELD data */ +#define AC_ELDD_ELD_VALID		(1<<31) +#define AC_ELDD_ELD_DATA		0xff + +/* HDMI DIP size */ +#define AC_DIPSIZE_ELD_BUF		(1<<3) /* ELD buf size of packet size */ +#define AC_DIPSIZE_PACK_IDX		(0x07<<0) /* packet index */ + +/* HDMI DIP index */ +#define AC_DIPIDX_PACK_IDX		(0x07<<5) /* packet idnex */ +#define AC_DIPIDX_BYTE_IDX		(0x1f<<0) /* byte index */ + +/* HDMI DIP xmit (transmit) control */ +#define AC_DIPXMIT_MASK			(0x3<<6) +#define AC_DIPXMIT_DISABLE		(0x0<<6) /* disable xmit */ +#define AC_DIPXMIT_ONCE			(0x2<<6) /* xmit once then disable */ +#define AC_DIPXMIT_BEST			(0x3<<6) /* best effort */ + +/* HDMI content protection (CP) control */ +#define AC_CPCTRL_CES			(1<<9) /* current encryption state */ +#define AC_CPCTRL_READY			(1<<8) /* ready bit */ +#define AC_CPCTRL_SUBTAG		(0x1f<<3) /* subtag for unsol-resp */ +#define AC_CPCTRL_STATE			(3<<0) /* current CP request state */ + +/* Converter channel <-> HDMI slot mapping */ +#define AC_CVTMAP_HDMI_SLOT		(0xf<<0) /* HDMI slot number */ +#define AC_CVTMAP_CHAN			(0xf<<4) /* converter channel number */ + +/* configuration default - 32bit */ +#define AC_DEFCFG_SEQUENCE		(0xf<<0) +#define AC_DEFCFG_DEF_ASSOC		(0xf<<4) +#define AC_DEFCFG_ASSOC_SHIFT		4 +#define AC_DEFCFG_MISC			(0xf<<8) +#define AC_DEFCFG_MISC_SHIFT		8 +#define AC_DEFCFG_MISC_NO_PRESENCE	(1<<0) +#define AC_DEFCFG_COLOR			(0xf<<12) +#define AC_DEFCFG_COLOR_SHIFT		12 +#define AC_DEFCFG_CONN_TYPE		(0xf<<16) +#define AC_DEFCFG_CONN_TYPE_SHIFT	16 +#define AC_DEFCFG_DEVICE		(0xf<<20) +#define AC_DEFCFG_DEVICE_SHIFT		20 +#define AC_DEFCFG_LOCATION		(0x3f<<24) +#define AC_DEFCFG_LOCATION_SHIFT	24 +#define AC_DEFCFG_PORT_CONN		(0x3<<30) +#define AC_DEFCFG_PORT_CONN_SHIFT	30 + +/* Display pin's device list entry */ +#define AC_DE_PD			(1<<0) +#define AC_DE_ELDV			(1<<1) +#define AC_DE_IA			(1<<2) + +/* device device types (0x0-0xf) */ +enum { +	AC_JACK_LINE_OUT, +	AC_JACK_SPEAKER, +	AC_JACK_HP_OUT, +	AC_JACK_CD, +	AC_JACK_SPDIF_OUT, +	AC_JACK_DIG_OTHER_OUT, +	AC_JACK_MODEM_LINE_SIDE, +	AC_JACK_MODEM_HAND_SIDE, +	AC_JACK_LINE_IN, +	AC_JACK_AUX, +	AC_JACK_MIC_IN, +	AC_JACK_TELEPHONY, +	AC_JACK_SPDIF_IN, +	AC_JACK_DIG_OTHER_IN, +	AC_JACK_OTHER = 0xf, +}; + +/* jack connection types (0x0-0xf) */ +enum { +	AC_JACK_CONN_UNKNOWN, +	AC_JACK_CONN_1_8, +	AC_JACK_CONN_1_4, +	AC_JACK_CONN_ATAPI, +	AC_JACK_CONN_RCA, +	AC_JACK_CONN_OPTICAL, +	AC_JACK_CONN_OTHER_DIGITAL, +	AC_JACK_CONN_OTHER_ANALOG, +	AC_JACK_CONN_DIN, +	AC_JACK_CONN_XLR, +	AC_JACK_CONN_RJ11, +	AC_JACK_CONN_COMB, +	AC_JACK_CONN_OTHER = 0xf, +}; + +/* jack colors (0x0-0xf) */ +enum { +	AC_JACK_COLOR_UNKNOWN, +	AC_JACK_COLOR_BLACK, +	AC_JACK_COLOR_GREY, +	AC_JACK_COLOR_BLUE, +	AC_JACK_COLOR_GREEN, +	AC_JACK_COLOR_RED, +	AC_JACK_COLOR_ORANGE, +	AC_JACK_COLOR_YELLOW, +	AC_JACK_COLOR_PURPLE, +	AC_JACK_COLOR_PINK, +	AC_JACK_COLOR_WHITE = 0xe, +	AC_JACK_COLOR_OTHER, +}; + +/* Jack location (0x0-0x3f) */ +/* common case */ +enum { +	AC_JACK_LOC_NONE, +	AC_JACK_LOC_REAR, +	AC_JACK_LOC_FRONT, +	AC_JACK_LOC_LEFT, +	AC_JACK_LOC_RIGHT, +	AC_JACK_LOC_TOP, +	AC_JACK_LOC_BOTTOM, +}; +/* bits 4-5 */ +enum { +	AC_JACK_LOC_EXTERNAL = 0x00, +	AC_JACK_LOC_INTERNAL = 0x10, +	AC_JACK_LOC_SEPARATE = 0x20, +	AC_JACK_LOC_OTHER    = 0x30, +}; +enum { +	/* external on primary chasis */ +	AC_JACK_LOC_REAR_PANEL = 0x07, +	AC_JACK_LOC_DRIVE_BAY, +	/* internal */ +	AC_JACK_LOC_RISER = 0x17, +	AC_JACK_LOC_HDMI, +	AC_JACK_LOC_ATAPI, +	/* others */ +	AC_JACK_LOC_MOBILE_IN = 0x37, +	AC_JACK_LOC_MOBILE_OUT, +}; + +/* Port connectivity (0-3) */ +enum { +	AC_JACK_PORT_COMPLEX, +	AC_JACK_PORT_NONE, +	AC_JACK_PORT_FIXED, +	AC_JACK_PORT_BOTH, +}; + +/* max. codec address */ +#define HDA_MAX_CODEC_ADDRESS	0x0f + +#endif /* __SOUND_HDA_VERBS_H */ diff --git a/include/sound/hdsp.h b/include/sound/hdsp.h deleted file mode 100644 index d98a78dff2d..00000000000 --- a/include/sound/hdsp.h +++ /dev/null @@ -1,109 +0,0 @@ -#ifndef __SOUND_HDSP_H -#define __SOUND_HDSP_H - -/* - *   Copyright (C) 2003 Thomas Charbonnel (thomas@undata.org) - *     - *   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; either version 2 of the License, or - *   (at your option) any later version. - * - *   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., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include <linux/types.h> - -#define HDSP_MATRIX_MIXER_SIZE 2048 - -enum HDSP_IO_Type { -	Digiface, -	Multiface, -	H9652, -	H9632, -	Undefined, -}; - -struct hdsp_peak_rms { -	__u32 input_peaks[26]; -	__u32 playback_peaks[26]; -	__u32 output_peaks[28]; -	__u64 input_rms[26]; -	__u64 playback_rms[26]; -	/* These are only used for H96xx cards */ -	__u64 output_rms[26]; -}; - -#define SNDRV_HDSP_IOCTL_GET_PEAK_RMS _IOR('H', 0x40, struct hdsp_peak_rms) - -struct hdsp_config_info { -	unsigned char pref_sync_ref; -	unsigned char wordclock_sync_check; -	unsigned char spdif_sync_check; -	unsigned char adatsync_sync_check; -	unsigned char adat_sync_check[3]; -	unsigned char spdif_in; -	unsigned char spdif_out; -	unsigned char spdif_professional; -	unsigned char spdif_emphasis; -	unsigned char spdif_nonaudio; -	unsigned int spdif_sample_rate; -	unsigned int system_sample_rate; -	unsigned int autosync_sample_rate; -	unsigned char system_clock_mode; -	unsigned char clock_source; -	unsigned char autosync_ref; -	unsigned char line_out; -	unsigned char passthru;  -	unsigned char da_gain; -	unsigned char ad_gain; -	unsigned char phone_gain; -	unsigned char xlr_breakout_cable; -	unsigned char analog_extension_board; -}; - -#define SNDRV_HDSP_IOCTL_GET_CONFIG_INFO _IOR('H', 0x41, struct hdsp_config_info) - -struct hdsp_firmware { -	void __user *firmware_data;	/* 24413 x 4 bytes */ -}; - -#define SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE _IOW('H', 0x42, struct hdsp_firmware) - -struct hdsp_version { -	enum HDSP_IO_Type io_type; -	unsigned short firmware_rev; -}; - -#define SNDRV_HDSP_IOCTL_GET_VERSION _IOR('H', 0x43, struct hdsp_version) - -struct hdsp_mixer { -	unsigned short matrix[HDSP_MATRIX_MIXER_SIZE]; -}; - -#define SNDRV_HDSP_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdsp_mixer) - -struct hdsp_9632_aeb { -	int aebi; -	int aebo; -}; - -#define SNDRV_HDSP_IOCTL_GET_9632_AEB _IOR('H', 0x45, struct hdsp_9632_aeb) - -/* typedefs for compatibility to user-space */ -typedef enum HDSP_IO_Type HDSP_IO_Type; -typedef struct hdsp_peak_rms hdsp_peak_rms_t; -typedef struct hdsp_config_info hdsp_config_info_t; -typedef struct hdsp_firmware hdsp_firmware_t; -typedef struct hdsp_version hdsp_version_t; -typedef struct hdsp_mixer hdsp_mixer_t; -typedef struct hdsp_9632_aeb hdsp_9632_aeb_t; - -#endif /* __SOUND_HDSP_H */ diff --git a/include/sound/hdspm.h b/include/sound/hdspm.h deleted file mode 100644 index 81990b2bcc9..00000000000 --- a/include/sound/hdspm.h +++ /dev/null @@ -1,134 +0,0 @@ -#ifndef __SOUND_HDSPM_H -#define __SOUND_HDSPM_H -/* - *   Copyright (C) 2003 Winfried Ritsch (IEM) - *   based on hdsp.h from Thomas Charbonnel (thomas@undata.org) - *                       - *     - *   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; either version 2 of the License, or - *   (at your option) any later version. - * - *   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., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -/* Maximum channels is 64 even on 56Mode you have 64playbacks to matrix */ -#define HDSPM_MAX_CHANNELS      64 - -/* -------------------- IOCTL Peak/RMS Meters -------------------- */ - -/* peam rms level structure like we get from hardware  -   -   maybe in future we can memory map it so I just copy it -   to user on ioctl call now an dont change anything -   rms are made out of low and high values -   where (long) ????_rms = (????_rms_l >> 8) + ((????_rms_h & 0xFFFFFF00)<<24) -   (i asume so from the code) -*/ - -struct hdspm_peak_rms { - -	unsigned int level_offset[1024]; - -	unsigned int input_peak[64]; -	unsigned int playback_peak[64]; -	unsigned int output_peak[64]; -	unsigned int xxx_peak[64];	/* not used */ - -	unsigned int reserved[256];	/* not used */ - -	unsigned int input_rms_l[64]; -	unsigned int playback_rms_l[64]; -	unsigned int output_rms_l[64]; -	unsigned int xxx_rms_l[64];	/* not used */ - -	unsigned int input_rms_h[64]; -	unsigned int playback_rms_h[64]; -	unsigned int output_rms_h[64]; -	unsigned int xxx_rms_h[64];	/* not used */ -}; - -struct hdspm_peak_rms_ioctl { -	struct hdspm_peak_rms *peak; -}; - -/* use indirect access due to the limit of ioctl bit size */ -#define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS \ -	_IOR('H', 0x40, struct hdspm_peak_rms_ioctl) - -/* ------------ CONFIG block IOCTL ---------------------- */ - -struct hdspm_config_info { -	unsigned char pref_sync_ref; -	unsigned char wordclock_sync_check; -	unsigned char madi_sync_check; -	unsigned int system_sample_rate; -	unsigned int autosync_sample_rate; -	unsigned char system_clock_mode; -	unsigned char clock_source; -	unsigned char autosync_ref; -	unsigned char line_out; -	unsigned int passthru; -	unsigned int analog_out; -}; - -#define SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO \ -	_IOR('H', 0x41, struct hdspm_config_info) - - -/* get Soundcard Version */ - -struct hdspm_version { -	unsigned short firmware_rev; -}; - -#define SNDRV_HDSPM_IOCTL_GET_VERSION _IOR('H', 0x43, struct hdspm_version) - - -/* ------------- get Matrix Mixer IOCTL --------------- */ - -/* MADI mixer: 64inputs+64playback in 64outputs = 8192 => *4Byte = - * 32768 Bytes - */ - -/* organisation is 64 channelfader in a continous memory block */ -/* equivalent to hardware definition, maybe for future feature of mmap of - * them - */ -/* each of 64 outputs has 64 infader and 64 outfader:  -   Ins to Outs mixer[out].in[in], Outstreams to Outs mixer[out].pb[pb] */ - -#define HDSPM_MIXER_CHANNELS HDSPM_MAX_CHANNELS - -struct hdspm_channelfader { -	unsigned int in[HDSPM_MIXER_CHANNELS]; -	unsigned int pb[HDSPM_MIXER_CHANNELS]; -}; - -struct hdspm_mixer { -	struct hdspm_channelfader ch[HDSPM_MIXER_CHANNELS]; -}; - -struct hdspm_mixer_ioctl { -	struct hdspm_mixer *mixer; -}; - -/* use indirect access due to the limit of ioctl bit size */ -#define SNDRV_HDSPM_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdspm_mixer_ioctl) - -/* typedefs for compatibility to user-space */ -typedef struct hdspm_peak_rms hdspm_peak_rms_t; -typedef struct hdspm_config_info hdspm_config_info_t; -typedef struct hdspm_version hdspm_version_t; -typedef struct hdspm_channelfader snd_hdspm_channelfader_t; -typedef struct hdspm_mixer hdspm_mixer_t; - -#endif				/* __SOUND_HDSPM_H */ diff --git a/include/sound/hwdep.h b/include/sound/hwdep.h index 8c05e47a409..ae04a3ec9c7 100644 --- a/include/sound/hwdep.h +++ b/include/sound/hwdep.h @@ -60,7 +60,6 @@ struct snd_hwdep {  	int iface;  #ifdef CONFIG_SND_OSSEMUL -	char oss_dev[32];  	int oss_type;  	int ossreg;  #endif @@ -69,6 +68,8 @@ struct snd_hwdep {  	wait_queue_head_t open_wait;  	void *private_data;  	void (*private_free) (struct snd_hwdep *hwdep); +	struct device *dev; +	const struct attribute_group **groups;  	struct mutex open_mutex;  	int used;			/* reference counter */ diff --git a/include/sound/info.h b/include/sound/info.h index 4e94cf1ff76..9ca1a493d37 100644 --- a/include/sound/info.h +++ b/include/sound/info.h @@ -72,7 +72,7 @@ struct snd_info_entry_ops {  struct snd_info_entry {  	const char *name; -	mode_t mode; +	umode_t mode;  	long size;  	unsigned short content;  	union { @@ -110,8 +110,8 @@ void snd_card_info_read_oss(struct snd_info_buffer *buffer);  static inline void snd_card_info_read_oss(struct snd_info_buffer *buffer) {}  #endif -int snd_iprintf(struct snd_info_buffer *buffer, const char *fmt, ...) \ -				__attribute__ ((format (printf, 2, 3))); +__printf(2, 3) +int snd_iprintf(struct snd_info_buffer *buffer, const char *fmt, ...);  int snd_info_init(void);  int snd_info_done(void); diff --git a/include/sound/initval.h b/include/sound/initval.h index 1daa6dff829..ac62c67e6f4 100644 --- a/include/sound/initval.h +++ b/include/sound/initval.h @@ -50,6 +50,20 @@  #define SNDRV_DEFAULT_DMA_SIZE	{ [0 ... (SNDRV_CARDS-1)] = SNDRV_AUTO_DMA_SIZE }  #define SNDRV_DEFAULT_PTR	SNDRV_DEFAULT_STR +#ifdef SNDRV_LEGACY_FIND_FREE_IOPORT +static long snd_legacy_find_free_ioport(long *port_table, long size) +{ +	while (*port_table != -1) { +		if (request_region(*port_table, size, "ALSA test")) { +			release_region(*port_table, size); +			return *port_table; +		} +		port_table++; +	} +	return -1; +} +#endif +  #ifdef SNDRV_LEGACY_FIND_FREE_IRQ  #include <linux/interrupt.h> @@ -62,7 +76,7 @@ static int snd_legacy_find_free_irq(int *irq_table)  {  	while (*irq_table != -1) {  		if (!request_irq(*irq_table, snd_legacy_empty_irq_handler, -				 IRQF_DISABLED | IRQF_PROBE_SHARED, "ALSA Test IRQ", +				 IRQF_PROBE_SHARED, "ALSA Test IRQ",  				 (void *) irq_table)) {  			free_irq(*irq_table, (void *) irq_table);  			return *irq_table; diff --git a/include/sound/jack.h b/include/sound/jack.h index c140fc7cbd3..58916573db5 100644 --- a/include/sound/jack.h +++ b/include/sound/jack.h @@ -42,6 +42,7 @@ enum snd_jack_types {  	SND_JACK_MECHANICAL	= 0x0008, /* If detected separately */  	SND_JACK_VIDEOOUT	= 0x0010,  	SND_JACK_AVOUT		= SND_JACK_LINEOUT | SND_JACK_VIDEOOUT, +	SND_JACK_LINEIN		= 0x0020,  	/* Kept separate from switches to facilitate implementation */  	SND_JACK_BTN_0		= 0x4000, @@ -52,6 +53,9 @@ enum snd_jack_types {  	SND_JACK_BTN_5		= 0x0200,  }; +/* Keep in sync with definitions above */ +#define SND_JACK_SWITCH_TYPES 6 +  struct snd_jack {  	struct input_dev *input_dev;  	int registered; diff --git a/include/sound/max9768.h b/include/sound/max9768.h new file mode 100644 index 00000000000..0f78b41d030 --- /dev/null +++ b/include/sound/max9768.h @@ -0,0 +1,24 @@ +/* + * Platform data for MAX9768 + * Copyright (C) 2011, 2012 by Wolfram Sang, Pengutronix e.K. + * same licence as the driver + */ + +#ifndef __SOUND_MAX9768_PDATA_H__ +#define __SOUND_MAX9768_PDATA_H__ + +/** + * struct max9768_pdata - optional platform specific MAX9768 configuration + * @shdn_gpio:	GPIO to SHDN pin. If not valid, pin must be hardwired HIGH + * @mute_gpio:	GPIO to MUTE pin. If not valid, control for mute won't be added + * @flags: configuration flags, e.g. set classic PWM mode (check datasheet + *         regarding "filterless modulation" which is default). + */ +struct max9768_pdata { +	int shdn_gpio; +	int mute_gpio; +	unsigned flags; +#define MAX9768_FLAG_CLASSIC_PWM	(1 << 0) +}; + +#endif /* __SOUND_MAX9768_PDATA_H__*/ diff --git a/include/sound/max98090.h b/include/sound/max98090.h new file mode 100644 index 00000000000..95efb13f847 --- /dev/null +++ b/include/sound/max98090.h @@ -0,0 +1,29 @@ +/* + * Platform data for MAX98090 + * + * Copyright 2011-2012 Maxim Integrated Products + * + *  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;  either version 2 of the  License, or (at your + *  option) any later version. + * + */ + +#ifndef __SOUND_MAX98090_PDATA_H__ +#define __SOUND_MAX98090_PDATA_H__ + +/* codec platform data */ +struct max98090_pdata { + +	/* Analog/digital microphone configuration: +	 * 0 = analog microphone input (normal setting) +	 * 1 = digital microphone input +	 */ +	unsigned int digmic_left_mode:1; +	unsigned int digmic_right_mode:1; +	unsigned int digmic_3_mode:1; +	unsigned int digmic_4_mode:1; +}; + +#endif diff --git a/include/sound/max98095.h b/include/sound/max98095.h new file mode 100644 index 00000000000..e87ae67b0a5 --- /dev/null +++ b/include/sound/max98095.h @@ -0,0 +1,66 @@ +/* + * Platform data for MAX98095 + * + * Copyright 2011 Maxim Integrated Products + * + *  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;  either version 2 of the  License, or (at your + *  option) any later version. + * + */ + +#ifndef __SOUND_MAX98095_PDATA_H__ +#define __SOUND_MAX98095_PDATA_H__ + +/* Equalizer filter response configuration */ +struct max98095_eq_cfg { +	const char *name; +	unsigned int rate; +	u16 band1[5]; +	u16 band2[5]; +	u16 band3[5]; +	u16 band4[5]; +	u16 band5[5]; +}; + +/* Biquad filter response configuration */ +struct max98095_biquad_cfg { +	const char *name; +	unsigned int rate; +	u16 band1[5]; +	u16 band2[5]; +}; + +/* codec platform data */ +struct max98095_pdata { + +	/* Equalizers for DAI1 and DAI2 */ +	struct max98095_eq_cfg *eq_cfg; +	unsigned int eq_cfgcnt; + +	/* Biquad filter for DAI1 and DAI2 */ +	struct max98095_biquad_cfg *bq_cfg; +	unsigned int bq_cfgcnt; + +	/* Analog/digital microphone configuration: +	 * 0 = analog microphone input (normal setting) +	 * 1 = digital microphone input +	 */ +	unsigned int digmic_left_mode:1; +	unsigned int digmic_right_mode:1; + +	/* Pin5 is the mechanical method of sensing jack insertion +	 * but it is something that might not be supported. +	 * 0 = PIN5 not supported +	 * 1 = PIN5 supported +	 */ +	unsigned int jack_detect_pin5en:1; + +	/* Slew amount for jack detection. Calculated as 4 * (delay + 1). +	 * Default delay is 24 to get a time of 100ms. +	 */ +	unsigned int jack_detect_delay; +}; + +#endif diff --git a/include/sound/memalloc.h b/include/sound/memalloc.h index c4250621264..782d1df3420 100644 --- a/include/sound/memalloc.h +++ b/include/sound/memalloc.h @@ -37,7 +37,7 @@ struct snd_dma_device {  #ifndef snd_dma_pci_data  #define snd_dma_pci_data(pci)	(&(pci)->dev)  #define snd_dma_isa_data()	NULL -#define snd_dma_continuous_data(x)	((struct device *)(unsigned long)(x)) +#define snd_dma_continuous_data(x)	((struct device *)(__force unsigned long)(x))  #endif @@ -52,6 +52,11 @@ struct snd_dma_device {  #else  #define SNDRV_DMA_TYPE_DEV_SG	SNDRV_DMA_TYPE_DEV /* no SG-buf support */  #endif +#ifdef CONFIG_GENERIC_ALLOCATOR +#define SNDRV_DMA_TYPE_DEV_IRAM		4	/* generic device iram-buffer */ +#else +#define SNDRV_DMA_TYPE_DEV_IRAM	SNDRV_DMA_TYPE_DEV +#endif  /*   * info for buffer allocation @@ -98,20 +103,43 @@ static inline unsigned int snd_sgbuf_aligned_pages(size_t size)  /*   * return the physical address at the corresponding offset   */ -static inline dma_addr_t snd_sgbuf_get_addr(struct snd_sg_buf *sgbuf, size_t offset) +static inline dma_addr_t snd_sgbuf_get_addr(struct snd_dma_buffer *dmab, +					   size_t offset)  { +	struct snd_sg_buf *sgbuf = dmab->private_data;  	dma_addr_t addr = sgbuf->table[offset >> PAGE_SHIFT].addr; -	addr &= PAGE_MASK; +	addr &= ~((dma_addr_t)PAGE_SIZE - 1);  	return addr + offset % PAGE_SIZE;  }  /*   * return the virtual address at the corresponding offset   */ -static inline void *snd_sgbuf_get_ptr(struct snd_sg_buf *sgbuf, size_t offset) +static inline void *snd_sgbuf_get_ptr(struct snd_dma_buffer *dmab, +				     size_t offset)  { +	struct snd_sg_buf *sgbuf = dmab->private_data;  	return sgbuf->table[offset >> PAGE_SHIFT].buf + offset % PAGE_SIZE;  } + +unsigned int snd_sgbuf_get_chunk_size(struct snd_dma_buffer *dmab, +				      unsigned int ofs, unsigned int size); +#else +/* non-SG versions */ +static inline dma_addr_t snd_sgbuf_get_addr(struct snd_dma_buffer *dmab, +					    size_t offset) +{ +	return dmab->addr + offset; +} + +static inline void *snd_sgbuf_get_ptr(struct snd_dma_buffer *dmab, +				      size_t offset) +{ +	return dmab->area + offset; +} + +#define snd_sgbuf_get_chunk_size(dmab, ofs, size)	(size) +  #endif /* CONFIG_SND_DMA_SGBUF */  /* allocate/release a buffer */ @@ -121,13 +149,6 @@ int snd_dma_alloc_pages_fallback(int type, struct device *dev, size_t size,                                   struct snd_dma_buffer *dmab);  void snd_dma_free_pages(struct snd_dma_buffer *dmab); -/* buffer-preservation managements */ - -#define snd_dma_pci_buf_id(pci)	(((unsigned int)(pci)->vendor << 16) | (pci)->device) - -size_t snd_dma_get_reserved_buf(struct snd_dma_buffer *dmab, unsigned int id); -int snd_dma_reserve_buf(struct snd_dma_buffer *dmab, unsigned int id); -  /* basic memory allocation functions */  void *snd_malloc_pages(size_t size, gfp_t gfp_flags);  void snd_free_pages(void *ptr, size_t size); diff --git a/include/sound/minors.h b/include/sound/minors.h index a81798ab73e..5978f9a8c8b 100644 --- a/include/sound/minors.h +++ b/include/sound/minors.h @@ -31,11 +31,11 @@  /* these minors can still be used for autoloading devices (/dev/aload*) */  #define SNDRV_MINOR_CONTROL		0	/* 0 */  #define SNDRV_MINOR_GLOBAL		1	/* 1 */ -#define SNDRV_MINOR_SEQUENCER		(SNDRV_MINOR_GLOBAL + 0 * 32) -#define SNDRV_MINOR_TIMER		(SNDRV_MINOR_GLOBAL + 1 * 32) +#define SNDRV_MINOR_SEQUENCER		1	/* SNDRV_MINOR_GLOBAL + 0 * 32 */ +#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 */ diff --git a/include/sound/mixer_oss.h b/include/sound/mixer_oss.h index 51fbcb4a277..13cb0b430a1 100644 --- a/include/sound/mixer_oss.h +++ b/include/sound/mixer_oss.h @@ -73,6 +73,9 @@ struct snd_mixer_oss_file {  	struct snd_mixer_oss *mixer;  }; +int snd_mixer_oss_ioctl_card(struct snd_card *card, +			     unsigned int cmd, unsigned long arg); +  #endif /* CONFIG_SND_MIXER_OSS */  #endif /* __SOUND_MIXER_OSS_H */ diff --git a/include/sound/mpu401.h b/include/sound/mpu401.h index 1f1d53f8830..e9420969251 100644 --- a/include/sound/mpu401.h +++ b/include/sound/mpu401.h @@ -22,7 +22,7 @@   *   */ -#include "rawmidi.h" +#include <sound/rawmidi.h>  #include <linux/interrupt.h>  #define MPU401_HW_MPU401		1	/* native MPU401 */ @@ -50,7 +50,10 @@  #define MPU401_INFO_INTEGRATED	(1 << 2)	/* integrated h/w port */  #define MPU401_INFO_MMIO	(1 << 3)	/* MMIO access */  #define MPU401_INFO_TX_IRQ	(1 << 4)	/* independent TX irq */ +#define MPU401_INFO_IRQ_HOOK	(1 << 5)	/* mpu401 irq handler is called +						   from driver irq handler */  #define MPU401_INFO_NO_ACK	(1 << 6)	/* No ACK cmd needed */ +#define MPU401_INFO_USE_TIMER	(1 << 15)	/* internal */  #define MPU401_MODE_BIT_INPUT		0  #define MPU401_MODE_BIT_OUTPUT		1 @@ -73,8 +76,7 @@ struct snd_mpu401 {  	unsigned long port;		/* base port of MPU-401 chip */  	unsigned long cport;		/* port + 1 (usually) */  	struct resource *res;		/* port resource */ -	int irq;			/* IRQ number of MPU-401 chip (-1 = poll) */ -	int irq_flags; +	int irq;			/* IRQ number of MPU-401 chip */  	unsigned long mode;		/* MPU401_MODE_XXXX */  	int timer_invoked; @@ -131,7 +133,6 @@ int snd_mpu401_uart_new(struct snd_card *card,  			unsigned long port,  			unsigned int info_flags,  			int irq, -			int irq_flags,  			struct snd_rawmidi ** rrawmidi);  #endif /* __SOUND_MPU401_H */ diff --git a/include/sound/omap-pcm.h b/include/sound/omap-pcm.h new file mode 100644 index 00000000000..c1d2f31d71e --- /dev/null +++ b/include/sound/omap-pcm.h @@ -0,0 +1,30 @@ +/* + * omap-pcm.h - OMAP PCM driver + * + * Copyright (C) 2014 Texas Instruments, Inc. + * + * Author: Peter Ujfalusi <peter.ujfalusi@ti.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + */ + +#ifndef __OMAP_PCM_H__ +#define __OMAP_PCM_H__ + +#if IS_ENABLED(CONFIG_SND_OMAP_SOC) +int omap_pcm_platform_register(struct device *dev); +#else +static inline int omap_pcm_platform_register(struct device *dev) +{ +	return 0; +} +#endif /* CONFIG_SND_OMAP_SOC */ + +#endif /* __OMAP_PCM_H__ */ diff --git a/include/sound/pcm.h b/include/sound/pcm.h index dfd9b76b185..d854fb31c00 100644 --- a/include/sound/pcm.h +++ b/include/sound/pcm.h @@ -29,13 +29,13 @@  #include <linux/poll.h>  #include <linux/mm.h>  #include <linux/bitops.h> -#include <linux/pm_qos_params.h> +#include <linux/pm_qos.h>  #define snd_pcm_substream_chip(substream) ((substream)->private_data)  #define snd_pcm_chip(pcm) ((pcm)->private_data)  #if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE) -#include "pcm_oss.h" +#include <sound/pcm_oss.h>  #endif  /* @@ -71,6 +71,8 @@ struct snd_pcm_ops {  	int (*prepare)(struct snd_pcm_substream *substream);  	int (*trigger)(struct snd_pcm_substream *substream, int cmd);  	snd_pcm_uframes_t (*pointer)(struct snd_pcm_substream *substream); +	int (*wall_clock)(struct snd_pcm_substream *substream, +			  struct timespec *audio_ts);  	int (*copy)(struct snd_pcm_substream *substream, int channel,  		    snd_pcm_uframes_t pos,  		    void __user *buf, snd_pcm_uframes_t count); @@ -136,48 +138,51 @@ struct snd_pcm_ops {  					 SNDRV_PCM_RATE_88200|SNDRV_PCM_RATE_96000)  #define SNDRV_PCM_RATE_8000_192000	(SNDRV_PCM_RATE_8000_96000|SNDRV_PCM_RATE_176400|\  					 SNDRV_PCM_RATE_192000) -#define SNDRV_PCM_FMTBIT_S8		(1ULL << SNDRV_PCM_FORMAT_S8) -#define SNDRV_PCM_FMTBIT_U8		(1ULL << SNDRV_PCM_FORMAT_U8) -#define SNDRV_PCM_FMTBIT_S16_LE		(1ULL << SNDRV_PCM_FORMAT_S16_LE) -#define SNDRV_PCM_FMTBIT_S16_BE		(1ULL << SNDRV_PCM_FORMAT_S16_BE) -#define SNDRV_PCM_FMTBIT_U16_LE		(1ULL << SNDRV_PCM_FORMAT_U16_LE) -#define SNDRV_PCM_FMTBIT_U16_BE		(1ULL << SNDRV_PCM_FORMAT_U16_BE) -#define SNDRV_PCM_FMTBIT_S24_LE		(1ULL << SNDRV_PCM_FORMAT_S24_LE) -#define SNDRV_PCM_FMTBIT_S24_BE		(1ULL << SNDRV_PCM_FORMAT_S24_BE) -#define SNDRV_PCM_FMTBIT_U24_LE		(1ULL << SNDRV_PCM_FORMAT_U24_LE) -#define SNDRV_PCM_FMTBIT_U24_BE		(1ULL << SNDRV_PCM_FORMAT_U24_BE) -#define SNDRV_PCM_FMTBIT_S32_LE		(1ULL << SNDRV_PCM_FORMAT_S32_LE) -#define SNDRV_PCM_FMTBIT_S32_BE		(1ULL << SNDRV_PCM_FORMAT_S32_BE) -#define SNDRV_PCM_FMTBIT_U32_LE		(1ULL << SNDRV_PCM_FORMAT_U32_LE) -#define SNDRV_PCM_FMTBIT_U32_BE		(1ULL << SNDRV_PCM_FORMAT_U32_BE) -#define SNDRV_PCM_FMTBIT_FLOAT_LE	(1ULL << SNDRV_PCM_FORMAT_FLOAT_LE) -#define SNDRV_PCM_FMTBIT_FLOAT_BE	(1ULL << SNDRV_PCM_FORMAT_FLOAT_BE) -#define SNDRV_PCM_FMTBIT_FLOAT64_LE	(1ULL << SNDRV_PCM_FORMAT_FLOAT64_LE) -#define SNDRV_PCM_FMTBIT_FLOAT64_BE	(1ULL << SNDRV_PCM_FORMAT_FLOAT64_BE) -#define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE (1ULL << SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE) -#define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE (1ULL << SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE) -#define SNDRV_PCM_FMTBIT_MU_LAW		(1ULL << SNDRV_PCM_FORMAT_MU_LAW) -#define SNDRV_PCM_FMTBIT_A_LAW		(1ULL << SNDRV_PCM_FORMAT_A_LAW) -#define SNDRV_PCM_FMTBIT_IMA_ADPCM	(1ULL << SNDRV_PCM_FORMAT_IMA_ADPCM) -#define SNDRV_PCM_FMTBIT_MPEG		(1ULL << SNDRV_PCM_FORMAT_MPEG) -#define SNDRV_PCM_FMTBIT_GSM		(1ULL << SNDRV_PCM_FORMAT_GSM) -#define SNDRV_PCM_FMTBIT_SPECIAL	(1ULL << SNDRV_PCM_FORMAT_SPECIAL) -#define SNDRV_PCM_FMTBIT_S24_3LE	(1ULL << SNDRV_PCM_FORMAT_S24_3LE) -#define SNDRV_PCM_FMTBIT_U24_3LE	(1ULL << SNDRV_PCM_FORMAT_U24_3LE) -#define SNDRV_PCM_FMTBIT_S24_3BE	(1ULL << SNDRV_PCM_FORMAT_S24_3BE) -#define SNDRV_PCM_FMTBIT_U24_3BE	(1ULL << SNDRV_PCM_FORMAT_U24_3BE) -#define SNDRV_PCM_FMTBIT_S20_3LE	(1ULL << SNDRV_PCM_FORMAT_S20_3LE) -#define SNDRV_PCM_FMTBIT_U20_3LE	(1ULL << SNDRV_PCM_FORMAT_U20_3LE) -#define SNDRV_PCM_FMTBIT_S20_3BE	(1ULL << SNDRV_PCM_FORMAT_S20_3BE) -#define SNDRV_PCM_FMTBIT_U20_3BE	(1ULL << SNDRV_PCM_FORMAT_U20_3BE) -#define SNDRV_PCM_FMTBIT_S18_3LE	(1ULL << SNDRV_PCM_FORMAT_S18_3LE) -#define SNDRV_PCM_FMTBIT_U18_3LE	(1ULL << SNDRV_PCM_FORMAT_U18_3LE) -#define SNDRV_PCM_FMTBIT_S18_3BE	(1ULL << SNDRV_PCM_FORMAT_S18_3BE) -#define SNDRV_PCM_FMTBIT_U18_3BE	(1ULL << SNDRV_PCM_FORMAT_U18_3BE) -#define SNDRV_PCM_FMTBIT_G723_24	(1ULL << SNDRV_PCM_FORMAT_G723_24) -#define SNDRV_PCM_FMTBIT_G723_24_1B	(1ULL << SNDRV_PCM_FORMAT_G723_24_1B) -#define SNDRV_PCM_FMTBIT_G723_40	(1ULL << SNDRV_PCM_FORMAT_G723_40) -#define SNDRV_PCM_FMTBIT_G723_40_1B	(1ULL << SNDRV_PCM_FORMAT_G723_40_1B) +#define _SNDRV_PCM_FMTBIT(fmt)		(1ULL << (__force int)SNDRV_PCM_FORMAT_##fmt) +#define SNDRV_PCM_FMTBIT_S8		_SNDRV_PCM_FMTBIT(S8) +#define SNDRV_PCM_FMTBIT_U8		_SNDRV_PCM_FMTBIT(U8) +#define SNDRV_PCM_FMTBIT_S16_LE		_SNDRV_PCM_FMTBIT(S16_LE) +#define SNDRV_PCM_FMTBIT_S16_BE		_SNDRV_PCM_FMTBIT(S16_BE) +#define SNDRV_PCM_FMTBIT_U16_LE		_SNDRV_PCM_FMTBIT(U16_LE) +#define SNDRV_PCM_FMTBIT_U16_BE		_SNDRV_PCM_FMTBIT(U16_BE) +#define SNDRV_PCM_FMTBIT_S24_LE		_SNDRV_PCM_FMTBIT(S24_LE) +#define SNDRV_PCM_FMTBIT_S24_BE		_SNDRV_PCM_FMTBIT(S24_BE) +#define SNDRV_PCM_FMTBIT_U24_LE		_SNDRV_PCM_FMTBIT(U24_LE) +#define SNDRV_PCM_FMTBIT_U24_BE		_SNDRV_PCM_FMTBIT(U24_BE) +#define SNDRV_PCM_FMTBIT_S32_LE		_SNDRV_PCM_FMTBIT(S32_LE) +#define SNDRV_PCM_FMTBIT_S32_BE		_SNDRV_PCM_FMTBIT(S32_BE) +#define SNDRV_PCM_FMTBIT_U32_LE		_SNDRV_PCM_FMTBIT(U32_LE) +#define SNDRV_PCM_FMTBIT_U32_BE		_SNDRV_PCM_FMTBIT(U32_BE) +#define SNDRV_PCM_FMTBIT_FLOAT_LE	_SNDRV_PCM_FMTBIT(FLOAT_LE) +#define SNDRV_PCM_FMTBIT_FLOAT_BE	_SNDRV_PCM_FMTBIT(FLOAT_BE) +#define SNDRV_PCM_FMTBIT_FLOAT64_LE	_SNDRV_PCM_FMTBIT(FLOAT64_LE) +#define SNDRV_PCM_FMTBIT_FLOAT64_BE	_SNDRV_PCM_FMTBIT(FLOAT64_BE) +#define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE _SNDRV_PCM_FMTBIT(IEC958_SUBFRAME_LE) +#define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE _SNDRV_PCM_FMTBIT(IEC958_SUBFRAME_BE) +#define SNDRV_PCM_FMTBIT_MU_LAW		_SNDRV_PCM_FMTBIT(MU_LAW) +#define SNDRV_PCM_FMTBIT_A_LAW		_SNDRV_PCM_FMTBIT(A_LAW) +#define SNDRV_PCM_FMTBIT_IMA_ADPCM	_SNDRV_PCM_FMTBIT(IMA_ADPCM) +#define SNDRV_PCM_FMTBIT_MPEG		_SNDRV_PCM_FMTBIT(MPEG) +#define SNDRV_PCM_FMTBIT_GSM		_SNDRV_PCM_FMTBIT(GSM) +#define SNDRV_PCM_FMTBIT_SPECIAL	_SNDRV_PCM_FMTBIT(SPECIAL) +#define SNDRV_PCM_FMTBIT_S24_3LE	_SNDRV_PCM_FMTBIT(S24_3LE) +#define SNDRV_PCM_FMTBIT_U24_3LE	_SNDRV_PCM_FMTBIT(U24_3LE) +#define SNDRV_PCM_FMTBIT_S24_3BE	_SNDRV_PCM_FMTBIT(S24_3BE) +#define SNDRV_PCM_FMTBIT_U24_3BE	_SNDRV_PCM_FMTBIT(U24_3BE) +#define SNDRV_PCM_FMTBIT_S20_3LE	_SNDRV_PCM_FMTBIT(S20_3LE) +#define SNDRV_PCM_FMTBIT_U20_3LE	_SNDRV_PCM_FMTBIT(U20_3LE) +#define SNDRV_PCM_FMTBIT_S20_3BE	_SNDRV_PCM_FMTBIT(S20_3BE) +#define SNDRV_PCM_FMTBIT_U20_3BE	_SNDRV_PCM_FMTBIT(U20_3BE) +#define SNDRV_PCM_FMTBIT_S18_3LE	_SNDRV_PCM_FMTBIT(S18_3LE) +#define SNDRV_PCM_FMTBIT_U18_3LE	_SNDRV_PCM_FMTBIT(U18_3LE) +#define SNDRV_PCM_FMTBIT_S18_3BE	_SNDRV_PCM_FMTBIT(S18_3BE) +#define SNDRV_PCM_FMTBIT_U18_3BE	_SNDRV_PCM_FMTBIT(U18_3BE) +#define SNDRV_PCM_FMTBIT_G723_24	_SNDRV_PCM_FMTBIT(G723_24) +#define SNDRV_PCM_FMTBIT_G723_24_1B	_SNDRV_PCM_FMTBIT(G723_24_1B) +#define SNDRV_PCM_FMTBIT_G723_40	_SNDRV_PCM_FMTBIT(G723_40) +#define SNDRV_PCM_FMTBIT_G723_40_1B	_SNDRV_PCM_FMTBIT(G723_40_1B) +#define SNDRV_PCM_FMTBIT_DSD_U8		_SNDRV_PCM_FMTBIT(DSD_U8) +#define SNDRV_PCM_FMTBIT_DSD_U16_LE	_SNDRV_PCM_FMTBIT(DSD_U16_LE)  #ifdef SNDRV_LITTLE_ENDIAN  #define SNDRV_PCM_FMTBIT_S16		SNDRV_PCM_FMTBIT_S16_LE @@ -263,7 +268,7 @@ struct snd_pcm_hw_constraint_ratdens {  struct snd_pcm_hw_constraint_list {  	unsigned int count; -	unsigned int *list; +	const unsigned int *list;  	unsigned int mask;  }; @@ -280,6 +285,7 @@ struct snd_pcm_runtime {  	unsigned long hw_ptr_jiffies;	/* Time when hw_ptr is updated */  	unsigned long hw_ptr_buffer_jiffies; /* buffer time in jiffies */  	snd_pcm_sframes_t delay;	/* extra delay; typically FIFO size */ +	u64 hw_ptr_wrap;                /* offset for hw_ptr due to boundary wrap-around */  	/* -- HW params -- */  	snd_pcm_access_t access;	/* access mode */ @@ -297,6 +303,7 @@ struct snd_pcm_runtime {  	unsigned int info;  	unsigned int rate_num;  	unsigned int rate_den; +	unsigned int no_period_wakeup: 1;  	/* -- SW params -- */  	int tstamp_mode;		/* mmap timestamp is updated */ @@ -371,13 +378,12 @@ struct snd_pcm_substream {  	int number;  	char name[32];			/* substream name */  	int stream;			/* stream (direction) */ -	struct pm_qos_request_list latency_pm_qos_req; /* pm_qos request */ +	struct pm_qos_request latency_pm_qos_req; /* pm_qos request */  	size_t buffer_bytes_max;	/* limit ring buffer size */  	struct snd_dma_buffer dma_buffer; -	unsigned int dma_buf_id;  	size_t dma_max;  	/* -- hardware operations -- */ -	struct snd_pcm_ops *ops; +	const struct snd_pcm_ops *ops;  	/* -- runtime information -- */  	struct snd_pcm_runtime *runtime;          /* -- timer section -- */ @@ -435,6 +441,7 @@ struct snd_pcm_str {  	struct snd_info_entry *proc_xrun_debug_entry;  #endif  #endif +	struct snd_kcontrol *chmap_kctl; /* channel-mapping controls */  };  struct snd_pcm { @@ -452,6 +459,7 @@ struct snd_pcm {  	void *private_data;  	void (*private_free) (struct snd_pcm *pcm);  	struct device *dev; /* actual hw device this belongs to */ +	bool internal; /* pcm is for internal use only */  #if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)  	struct snd_pcm_oss oss;  #endif @@ -473,6 +481,9 @@ extern const struct file_operations snd_pcm_f_ops[2];  int snd_pcm_new(struct snd_card *card, const char *id, int device,  		int playback_count, int capture_count,  		struct snd_pcm **rpcm); +int snd_pcm_new_internal(struct snd_card *card, const char *id, int device, +		int playback_count, int capture_count, +		struct snd_pcm **rpcm);  int snd_pcm_new_stream(struct snd_pcm *pcm, int stream, int substream_count);  int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree); @@ -489,7 +500,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream,  int snd_pcm_status(struct snd_pcm_substream *substream,  		   struct snd_pcm_status *status);  int snd_pcm_start(struct snd_pcm_substream *substream); -int snd_pcm_stop(struct snd_pcm_substream *substream, int status); +int snd_pcm_stop(struct snd_pcm_substream *substream, snd_pcm_state_t status);  int snd_pcm_drain_done(struct snd_pcm_substream *substream);  #ifdef CONFIG_PM  int snd_pcm_suspend(struct snd_pcm_substream *substream); @@ -505,6 +516,18 @@ void snd_pcm_detach_substream(struct snd_pcm_substream *substream);  void snd_pcm_vma_notify_data(void *client, void *data);  int snd_pcm_mmap_data(struct snd_pcm_substream *substream, struct file *file, struct vm_area_struct *area); + +#ifdef CONFIG_SND_DEBUG +void snd_pcm_debug_name(struct snd_pcm_substream *substream, +			   char *name, size_t len); +#else +static inline void +snd_pcm_debug_name(struct snd_pcm_substream *substream, char *buf, size_t size) +{ +	*buf = 0; +} +#endif +  /*   *  PCM library   */ @@ -637,7 +660,7 @@ static inline snd_pcm_sframes_t snd_pcm_capture_hw_avail(struct snd_pcm_runtime   *   * Checks whether enough free space is available on the playback buffer.   * - * Returns non-zero if available, or zero if not. + * Return: Non-zero if available, or zero if not.   */  static inline int snd_pcm_playback_ready(struct snd_pcm_substream *substream)  { @@ -651,7 +674,7 @@ static inline int snd_pcm_playback_ready(struct snd_pcm_substream *substream)   *   * Checks whether enough capture data is available on the capture buffer.   * - * Returns non-zero if available, or zero if not. + * Return: Non-zero if available, or zero if not.   */  static inline int snd_pcm_capture_ready(struct snd_pcm_substream *substream)  { @@ -663,10 +686,10 @@ static inline int snd_pcm_capture_ready(struct snd_pcm_substream *substream)   * snd_pcm_playback_data - check whether any data exists on the playback buffer   * @substream: the pcm substream instance   * - * Checks whether any data exists on the playback buffer. If stop_threshold - * is bigger or equal to boundary, then this function returns always non-zero. + * Checks whether any data exists on the playback buffer.   * - * Returns non-zero if exists, or zero if not. + * Return: Non-zero if any data exists, or zero if not. If stop_threshold + * is bigger or equal to boundary, then this function returns always non-zero.   */  static inline int snd_pcm_playback_data(struct snd_pcm_substream *substream)  { @@ -683,7 +706,7 @@ static inline int snd_pcm_playback_data(struct snd_pcm_substream *substream)   *   * Checks whether the playback buffer is empty.   * - * Returns non-zero if empty, or zero if not. + * Return: Non-zero if empty, or zero if not.   */  static inline int snd_pcm_playback_empty(struct snd_pcm_substream *substream)  { @@ -697,7 +720,7 @@ static inline int snd_pcm_playback_empty(struct snd_pcm_substream *substream)   *   * Checks whether the capture buffer is empty.   * - * Returns non-zero if empty, or zero if not. + * Return: Non-zero if empty, or zero if not.   */  static inline int snd_pcm_capture_empty(struct snd_pcm_substream *substream)  { @@ -747,17 +770,18 @@ static inline const struct snd_interval *hw_param_interval_c(const struct snd_pc  	return ¶ms->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];  } -#define params_access(p) snd_mask_min(hw_param_mask((p), SNDRV_PCM_HW_PARAM_ACCESS)) -#define params_format(p) snd_mask_min(hw_param_mask((p), SNDRV_PCM_HW_PARAM_FORMAT)) -#define params_subformat(p) snd_mask_min(hw_param_mask((p), SNDRV_PCM_HW_PARAM_SUBFORMAT)) -#define params_channels(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_CHANNELS)->min -#define params_rate(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_RATE)->min -#define params_period_size(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_PERIOD_SIZE)->min -#define params_period_bytes(p) ((params_period_size(p)*snd_pcm_format_physical_width(params_format(p))*params_channels(p))/8) -#define params_periods(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_PERIODS)->min -#define params_buffer_size(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_BUFFER_SIZE)->min -#define params_buffer_bytes(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_BUFFER_BYTES)->min - +#define params_channels(p) \ +	(hw_param_interval_c((p), SNDRV_PCM_HW_PARAM_CHANNELS)->min) +#define params_rate(p) \ +	(hw_param_interval_c((p), SNDRV_PCM_HW_PARAM_RATE)->min) +#define params_period_size(p) \ +	(hw_param_interval_c((p), SNDRV_PCM_HW_PARAM_PERIOD_SIZE)->min) +#define params_periods(p) \ +	(hw_param_interval_c((p), SNDRV_PCM_HW_PARAM_PERIODS)->min) +#define params_buffer_size(p) \ +	(hw_param_interval_c((p), SNDRV_PCM_HW_PARAM_BUFFER_SIZE)->min) +#define params_buffer_bytes(p) \ +	(hw_param_interval_c((p), SNDRV_PCM_HW_PARAM_BUFFER_BYTES)->min)  int snd_interval_refine(struct snd_interval *i, const struct snd_interval *v);  void snd_interval_mul(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c); @@ -766,7 +790,8 @@ void snd_interval_muldivk(const struct snd_interval *a, const struct snd_interva  			  unsigned int k, struct snd_interval *c);  void snd_interval_mulkdiv(const struct snd_interval *a, unsigned int k,  			  const struct snd_interval *b, struct snd_interval *c); -int snd_interval_list(struct snd_interval *i, unsigned int count, unsigned int *list, unsigned int mask); +int snd_interval_list(struct snd_interval *i, unsigned int count, +		      const unsigned int *list, unsigned int mask);  int snd_interval_ratnum(struct snd_interval *i,  			unsigned int rats_count, struct snd_ratnum *rats,  			unsigned int *nump, unsigned int *denp); @@ -790,7 +815,7 @@ int snd_pcm_hw_constraint_integer(struct snd_pcm_runtime *runtime, snd_pcm_hw_pa  int snd_pcm_hw_constraint_list(struct snd_pcm_runtime *runtime,   			       unsigned int cond,  			       snd_pcm_hw_param_t var, -			       struct snd_pcm_hw_constraint_list *l); +			       const struct snd_pcm_hw_constraint_list *l);  int snd_pcm_hw_constraint_ratnums(struct snd_pcm_runtime *runtime,   				  unsigned int cond,  				  snd_pcm_hw_param_t var, @@ -810,6 +835,8 @@ int snd_pcm_hw_constraint_step(struct snd_pcm_runtime *runtime,  int snd_pcm_hw_constraint_pow2(struct snd_pcm_runtime *runtime,  			       unsigned int cond,  			       snd_pcm_hw_param_t var); +int snd_pcm_hw_rule_noresample(struct snd_pcm_runtime *runtime, +			       unsigned int base_rate);  int snd_pcm_hw_rule_add(struct snd_pcm_runtime *runtime,  			unsigned int cond,  			int var, @@ -826,7 +853,7 @@ int snd_pcm_format_big_endian(snd_pcm_format_t format);   * snd_pcm_format_cpu_endian - Check the PCM format is CPU-endian   * @format: the format to check   * - * Returns 1 if the given PCM format is CPU-endian, 0 if + * Return: 1 if the given PCM format is CPU-endian, 0 if   * opposite, or a negative error code if endian not specified.   */  int snd_pcm_format_cpu_endian(snd_pcm_format_t format); @@ -841,9 +868,10 @@ int snd_pcm_format_physical_width(snd_pcm_format_t format);		/* in bits */  ssize_t snd_pcm_format_size(snd_pcm_format_t format, size_t samples);  const unsigned char *snd_pcm_format_silence_64(snd_pcm_format_t format);  int snd_pcm_format_set_silence(snd_pcm_format_t format, void *buf, unsigned int frames); -snd_pcm_format_t snd_pcm_build_linear_format(int width, int unsignd, int big_endian); +snd_pcm_format_t snd_pcm_build_linear_format(int width, int unsigned, int big_endian); -void snd_pcm_set_ops(struct snd_pcm * pcm, int direction, struct snd_pcm_ops *ops); +void snd_pcm_set_ops(struct snd_pcm * pcm, int direction, +		     const struct snd_pcm_ops *ops);  void snd_pcm_set_sync(struct snd_pcm_substream *substream);  int snd_pcm_lib_interleave_len(struct snd_pcm_substream *substream);  int snd_pcm_lib_ioctl(struct snd_pcm_substream *substream, @@ -871,6 +899,9 @@ extern const struct snd_pcm_hw_constraint_list snd_pcm_known_rates;  int snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime);  unsigned int snd_pcm_rate_to_rate_bit(unsigned int rate); +unsigned int snd_pcm_rate_bit_to_rate(unsigned int rate_bit); +unsigned int snd_pcm_rate_mask_intersect(unsigned int rates_a, +					 unsigned int rates_b);  static inline void snd_pcm_set_runtime_buffer(struct snd_pcm_substream *substream,  					      struct snd_dma_buffer *bufp) @@ -901,7 +932,7 @@ static inline void snd_pcm_gettime(struct snd_pcm_runtime *runtime,  				   struct timespec *tv)  {  	if (runtime->tstamp_type == SNDRV_PCM_TSTAMP_TYPE_MONOTONIC) -		do_posix_clock_monotonic_gettime(tv); +		ktime_get_ts(tv);  	else  		getnstimeofday(tv);  } @@ -936,7 +967,7 @@ struct page *snd_pcm_lib_get_vmalloc_page(struct snd_pcm_substream *substream,   * contiguous in kernel virtual space, but not in physical memory.  Use this   * if the buffer is accessed by kernel code but not by device DMA.   * - * Returns 1 if the buffer was changed, 0 if not changed, or a negative error + * Return: 1 if the buffer was changed, 0 if not changed, or a negative error   * code.   */  static int snd_pcm_lib_alloc_vmalloc_buffer @@ -948,6 +979,9 @@ static int snd_pcm_lib_alloc_vmalloc_buffer   *   * This function works like snd_pcm_lib_alloc_vmalloc_buffer(), but uses   * vmalloc_32(), i.e., the pages are allocated from 32-bit-addressable memory. + * + * Return: 1 if the buffer was changed, 0 if not changed, or a negative error + * code.   */  static int snd_pcm_lib_alloc_vmalloc_32_buffer  			(struct snd_pcm_substream *substream, size_t size); @@ -959,53 +993,42 @@ static int snd_pcm_lib_alloc_vmalloc_32_buffer  	_snd_pcm_lib_alloc_vmalloc_buffer \  			(subs, size, GFP_KERNEL | GFP_DMA32 | __GFP_ZERO) +#define snd_pcm_get_dma_buf(substream) ((substream)->runtime->dma_buffer_p) +  #ifdef CONFIG_SND_DMA_SGBUF  /*   * SG-buffer handling   */  #define snd_pcm_substream_sgbuf(substream) \ -	((substream)->runtime->dma_buffer_p->private_data) - -static inline dma_addr_t -snd_pcm_sgbuf_get_addr(struct snd_pcm_substream *substream, unsigned int ofs) -{ -	struct snd_sg_buf *sg = snd_pcm_substream_sgbuf(substream); -	return snd_sgbuf_get_addr(sg, ofs); -} - -static inline void * -snd_pcm_sgbuf_get_ptr(struct snd_pcm_substream *substream, unsigned int ofs) -{ -	struct snd_sg_buf *sg = snd_pcm_substream_sgbuf(substream); -	return snd_sgbuf_get_ptr(sg, ofs); -} +	snd_pcm_get_dma_buf(substream)->private_data  struct page *snd_pcm_sgbuf_ops_page(struct snd_pcm_substream *substream,  				    unsigned long offset); -unsigned int snd_pcm_sgbuf_get_chunk_size(struct snd_pcm_substream *substream, -					  unsigned int ofs, unsigned int size); -  #else /* !SND_DMA_SGBUF */  /*   * fake using a continuous buffer   */ +#define snd_pcm_sgbuf_ops_page	NULL +#endif /* SND_DMA_SGBUF */ +  static inline dma_addr_t  snd_pcm_sgbuf_get_addr(struct snd_pcm_substream *substream, unsigned int ofs)  { -	return substream->runtime->dma_addr + ofs; +	return snd_sgbuf_get_addr(snd_pcm_get_dma_buf(substream), ofs);  }  static inline void *  snd_pcm_sgbuf_get_ptr(struct snd_pcm_substream *substream, unsigned int ofs)  { -	return substream->runtime->dma_area + ofs; +	return snd_sgbuf_get_ptr(snd_pcm_get_dma_buf(substream), ofs);  } -#define snd_pcm_sgbuf_ops_page	NULL - -#define snd_pcm_sgbuf_get_chunk_size(subs, ofs, size)	(size) - -#endif /* SND_DMA_SGBUF */ +static inline unsigned int +snd_pcm_sgbuf_get_chunk_size(struct snd_pcm_substream *substream, +			     unsigned int ofs, unsigned int size) +{ +	return snd_sgbuf_get_chunk_size(snd_pcm_get_dma_buf(substream), ofs, size); +}  /* handle mmap counter - PCM mmap callback should handle this counter properly */  static inline void snd_pcm_mmap_data_open(struct vm_area_struct *area) @@ -1020,6 +1043,8 @@ static inline void snd_pcm_mmap_data_close(struct vm_area_struct *area)  	atomic_dec(&substream->mmap_count);  } +int snd_pcm_lib_default_mmap(struct snd_pcm_substream *substream, +			     struct vm_area_struct *area);  /* mmap for io-memory area */  #if defined(CONFIG_X86) || defined(CONFIG_PPC) || defined(CONFIG_ALPHA)  #define SNDRV_PCM_INFO_MMAP_IOMEM	SNDRV_PCM_INFO_MMAP @@ -1029,9 +1054,7 @@ int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, struct vm_area_s  #define snd_pcm_lib_mmap_iomem	NULL  #endif -int snd_pcm_lib_mmap_noncached(struct snd_pcm_substream *substream, -			       struct vm_area_struct *area); -#define snd_pcm_lib_mmap_vmalloc	snd_pcm_lib_mmap_noncached +#define snd_pcm_lib_mmap_vmalloc NULL  static inline void snd_pcm_limit_isa_dma_size(int dma, size_t *max)  { @@ -1051,4 +1074,79 @@ static inline void snd_pcm_limit_isa_dma_size(int dma, size_t *max)  const char *snd_pcm_format_name(snd_pcm_format_t format); +/** + * snd_pcm_stream_str - Get a string naming the direction of a stream + * @substream: the pcm substream instance + * + * Return: A string naming the direction of the stream. + */ +static inline const char *snd_pcm_stream_str(struct snd_pcm_substream *substream) +{ +	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) +		return "Playback"; +	else +		return "Capture"; +} + +/* + * PCM channel-mapping control API + */ +/* array element of channel maps */ +struct snd_pcm_chmap_elem { +	unsigned char channels; +	unsigned char map[15]; +}; + +/* channel map information; retrieved via snd_kcontrol_chip() */ +struct snd_pcm_chmap { +	struct snd_pcm *pcm;	/* assigned PCM instance */ +	int stream;		/* PLAYBACK or CAPTURE */ +	struct snd_kcontrol *kctl; +	const struct snd_pcm_chmap_elem *chmap; +	unsigned int max_channels; +	unsigned int channel_mask;	/* optional: active channels bitmask */ +	void *private_data;	/* optional: private data pointer */ +}; + +/* get the PCM substream assigned to the given chmap info */ +static inline struct snd_pcm_substream * +snd_pcm_chmap_substream(struct snd_pcm_chmap *info, unsigned int idx) +{ +	struct snd_pcm_substream *s; +	for (s = info->pcm->streams[info->stream].substream; s; s = s->next) +		if (s->number == idx) +			return s; +	return NULL; +} + +/* ALSA-standard channel maps (RL/RR prior to C/LFE) */ +extern const struct snd_pcm_chmap_elem snd_pcm_std_chmaps[]; +/* Other world's standard channel maps (C/LFE prior to RL/RR) */ +extern const struct snd_pcm_chmap_elem snd_pcm_alt_chmaps[]; + +/* bit masks to be passed to snd_pcm_chmap.channel_mask field */ +#define SND_PCM_CHMAP_MASK_24	((1U << 2) | (1U << 4)) +#define SND_PCM_CHMAP_MASK_246	(SND_PCM_CHMAP_MASK_24 | (1U << 6)) +#define SND_PCM_CHMAP_MASK_2468	(SND_PCM_CHMAP_MASK_246 | (1U << 8)) + +int snd_pcm_add_chmap_ctls(struct snd_pcm *pcm, int stream, +			   const struct snd_pcm_chmap_elem *chmap, +			   int max_channels, +			   unsigned long private_value, +			   struct snd_pcm_chmap **info_ret); + +/* Strong-typed conversion of pcm_format to bitwise */ +static inline u64 pcm_format_to_bits(snd_pcm_format_t pcm_format) +{ +	return 1ULL << (__force int) pcm_format; +} + +/* printk helpers */ +#define pcm_err(pcm, fmt, args...) \ +	dev_err((pcm)->card->dev, fmt, ##args) +#define pcm_warn(pcm, fmt, args...) \ +	dev_warn((pcm)->card->dev, fmt, ##args) +#define pcm_dbg(pcm, fmt, args...) \ +	dev_dbg((pcm)->card->dev, fmt, ##args) +  #endif /* __SOUND_PCM_H */ diff --git a/include/sound/pcm_params.h b/include/sound/pcm_params.h index 85cf1cf4f31..6b1c78f05fa 100644 --- a/include/sound/pcm_params.h +++ b/include/sound/pcm_params.h @@ -22,6 +22,8 @@   *   */ +#include <sound/pcm.h> +  int snd_pcm_hw_param_first(struct snd_pcm_substream *pcm,   			   struct snd_pcm_hw_params *params,  			   snd_pcm_hw_param_t var, int *dir); @@ -337,5 +339,31 @@ static inline unsigned int sub(unsigned int a, unsigned int b)  	return 0;  } -#endif /* __SOUND_PCM_PARAMS_H */ +#define params_access(p) ((__force snd_pcm_access_t)\ +		snd_mask_min(hw_param_mask_c((p), SNDRV_PCM_HW_PARAM_ACCESS))) +#define params_format(p) ((__force snd_pcm_format_t)\ +		snd_mask_min(hw_param_mask_c((p), SNDRV_PCM_HW_PARAM_FORMAT))) +#define params_subformat(p) \ +	snd_mask_min(hw_param_mask_c((p), SNDRV_PCM_HW_PARAM_SUBFORMAT)) + +static inline unsigned int +params_period_bytes(const struct snd_pcm_hw_params *p) +{ +	return (params_period_size(p) * +		snd_pcm_format_physical_width(params_format(p)) * +		params_channels(p)) / 8; +} + +static inline int +params_width(const struct snd_pcm_hw_params *p) +{ +	return snd_pcm_format_width(params_format(p)); +} + +static inline int +params_physical_width(const struct snd_pcm_hw_params *p) +{ +	return snd_pcm_format_physical_width(params_format(p)); +} +#endif /* __SOUND_PCM_PARAMS_H */ diff --git a/include/sound/pxa2xx-lib.h b/include/sound/pxa2xx-lib.h index 2fd3d251d9a..56e818e4a1c 100644 --- a/include/sound/pxa2xx-lib.h +++ b/include/sound/pxa2xx-lib.h @@ -6,13 +6,6 @@  /* PCM */ -struct pxa2xx_pcm_dma_params { -	char *name;			/* stream identifier */ -	u32 dcmd;			/* DMA descriptor dcmd field */ -	volatile u32 *drcmr;		/* the DMA request channel to use */ -	u32 dev_addr;			/* device physical address for DMA */ -}; -  extern int __pxa2xx_pcm_hw_params(struct snd_pcm_substream *substream,  				struct snd_pcm_hw_params *params);  extern int __pxa2xx_pcm_hw_free(struct snd_pcm_substream *substream); diff --git a/include/sound/rawmidi.h b/include/sound/rawmidi.h index 2480e7d10dc..311dafe6cc4 100644 --- a/include/sound/rawmidi.h +++ b/include/sound/rawmidi.h @@ -27,9 +27,10 @@  #include <linux/spinlock.h>  #include <linux/wait.h>  #include <linux/mutex.h> +#include <linux/workqueue.h>  #if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE) -#include "seq_device.h" +#include <sound/seq_device.h>  #endif  /* @@ -63,6 +64,7 @@ struct snd_rawmidi_global_ops {  };  struct snd_rawmidi_runtime { +	struct snd_rawmidi_substream *substream;  	unsigned int drain: 1,	/* drain stage */  		     oss: 1;	/* OSS compatible mode */  	/* midi stream buffer */ @@ -79,7 +81,7 @@ struct snd_rawmidi_runtime {  	/* event handler (new bytes, input only) */  	void (*event)(struct snd_rawmidi_substream *substream);  	/* defers calls to event [input] or ops->trigger [output] */ -	struct tasklet_struct tasklet; +	struct work_struct event_work;  	/* private data */  	void *private_data;  	void (*private_free)(struct snd_rawmidi_substream *substream); @@ -155,10 +157,8 @@ void snd_rawmidi_set_ops(struct snd_rawmidi *rmidi, int stream,  /* callbacks */ -void snd_rawmidi_receive_reset(struct snd_rawmidi_substream *substream);  int snd_rawmidi_receive(struct snd_rawmidi_substream *substream,  			const unsigned char *buffer, int count); -void snd_rawmidi_transmit_reset(struct snd_rawmidi_substream *substream);  int snd_rawmidi_transmit_empty(struct snd_rawmidi_substream *substream);  int snd_rawmidi_transmit_peek(struct snd_rawmidi_substream *substream,  			      unsigned char *buffer, int count); diff --git a/include/sound/rcar_snd.h b/include/sound/rcar_snd.h new file mode 100644 index 00000000000..f4a706f82cb --- /dev/null +++ b/include/sound/rcar_snd.h @@ -0,0 +1,102 @@ +/* + * Renesas R-Car SRU/SCU/SSIU/SSI support + * + * Copyright (C) 2013 Renesas Solutions Corp. + * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef RCAR_SND_H +#define RCAR_SND_H + +#include <linux/sh_clk.h> + +#define RSND_GEN1_SRU	0 +#define RSND_GEN1_ADG	1 +#define RSND_GEN1_SSI	2 + +#define RSND_GEN2_SCU	0 +#define RSND_GEN2_ADG	1 +#define RSND_GEN2_SSIU	2 +#define RSND_GEN2_SSI	3 + +#define RSND_BASE_MAX	4 + +/* + * flags + * + * 0xAB000000 + * + * A : clock sharing settings + * B : SSI direction + */ +#define RSND_SSI_CLK_PIN_SHARE		(1 << 31) + +#define RSND_SSI(_dma_id, _pio_irq, _flags)		\ +{ .dma_id = _dma_id, .pio_irq = _pio_irq, .flags = _flags } +#define RSND_SSI_UNUSED \ +{ .dma_id = -1, .pio_irq = -1, .flags = 0 } + +struct rsnd_ssi_platform_info { +	int dma_id; +	int pio_irq; +	u32 flags; +}; + +#define RSND_SRC(rate, _dma_id)						\ +{ .convert_rate = rate, .dma_id = _dma_id, } +#define RSND_SRC_UNUSED				\ +{ .convert_rate = 0, .dma_id = -1, } + +struct rsnd_src_platform_info { +	u32 convert_rate; /* sampling rate convert */ +	int dma_id; /* for Gen2 SCU */ +}; + +/* + * flags + */ +struct rsnd_dvc_platform_info { +	u32 flags; +}; + +struct rsnd_dai_path_info { +	struct rsnd_ssi_platform_info *ssi; +	struct rsnd_src_platform_info *src; +	struct rsnd_dvc_platform_info *dvc; +}; + +struct rsnd_dai_platform_info { +	struct rsnd_dai_path_info playback; +	struct rsnd_dai_path_info capture; +}; + +/* + * flags + * + * 0x0000000A + * + * A : generation + */ +#define RSND_GEN_MASK	(0xF << 0) +#define RSND_GEN1	(1 << 0) /* fixme */ +#define RSND_GEN2	(2 << 0) /* fixme */ + +struct rcar_snd_info { +	u32 flags; +	struct rsnd_ssi_platform_info *ssi_info; +	int ssi_info_nr; +	struct rsnd_src_platform_info *src_info; +	int src_info_nr; +	struct rsnd_dvc_platform_info *dvc_info; +	int dvc_info_nr; +	struct rsnd_dai_platform_info *dai_info; +	int dai_info_nr; +	int (*start)(int id); +	int (*stop)(int id); +}; + +#endif diff --git a/include/sound/rt5640.h b/include/sound/rt5640.h new file mode 100644 index 00000000000..59d26dd81e4 --- /dev/null +++ b/include/sound/rt5640.h @@ -0,0 +1,26 @@ +/* + * linux/sound/rt5640.h -- Platform data for RT5640 + * + * Copyright 2011 Realtek Microelectronics + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __LINUX_SND_RT5640_H +#define __LINUX_SND_RT5640_H + +struct rt5640_platform_data { +	/* IN1 & IN2 can optionally be differential */ +	bool in1_diff; +	bool in2_diff; + +	bool dmic_en; +	bool dmic1_data_pin; /* 0 = IN1P; 1 = GPIO3 */ +	bool dmic2_data_pin; /* 0 = IN1N; 1 = GPIO4 */ + +	int ldo1_en; /* GPIO for LDO1_EN */ +}; + +#endif diff --git a/include/sound/rt5645.h b/include/sound/rt5645.h new file mode 100644 index 00000000000..1de744c242f --- /dev/null +++ b/include/sound/rt5645.h @@ -0,0 +1,25 @@ +/* + * linux/sound/rt5645.h -- Platform data for RT5645 + * + * Copyright 2013 Realtek Microelectronics + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __LINUX_SND_RT5645_H +#define __LINUX_SND_RT5645_H + +struct rt5645_platform_data { +	/* IN2 can optionally be differential */ +	bool in2_diff; + +	bool dmic_en; +	unsigned int dmic1_data_pin; +	/* 0 = IN2N; 1 = GPIO5; 2 = GPIO11 */ +	unsigned int dmic2_data_pin; +	/* 0 = IN2P; 1 = GPIO6; 2 = GPIO10; 3 = GPIO12 */ +}; + +#endif diff --git a/include/sound/rt5651.h b/include/sound/rt5651.h new file mode 100644 index 00000000000..d35de758dfb --- /dev/null +++ b/include/sound/rt5651.h @@ -0,0 +1,21 @@ +/* + * linux/sound/rt286.h -- Platform data for RT286 + * + * Copyright 2013 Realtek Microelectronics + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __LINUX_SND_RT5651_H +#define __LINUX_SND_RT5651_H + +struct rt5651_platform_data { +	/* IN2 can optionally be differential */ +	bool in2_diff; + +	bool dmic_en; +}; + +#endif diff --git a/include/sound/rt5677.h b/include/sound/rt5677.h new file mode 100644 index 00000000000..3da14313bcf --- /dev/null +++ b/include/sound/rt5677.h @@ -0,0 +1,21 @@ +/* + * linux/sound/rt5677.h -- Platform data for RT5677 + * + * Copyright 2013 Realtek Semiconductor Corp. + * Author: Oder Chiou <oder_chiou@realtek.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __LINUX_SND_RT5677_H +#define __LINUX_SND_RT5677_H + +struct rt5677_platform_data { +	/* IN1 IN2 can optionally be differential */ +	bool in1_diff; +	bool in2_diff; +}; + +#endif diff --git a/include/sound/sb.h b/include/sound/sb.h index 95353542256..ba396032964 100644 --- a/include/sound/sb.h +++ b/include/sound/sb.h @@ -22,8 +22,8 @@   *   */ -#include "pcm.h" -#include "rawmidi.h" +#include <sound/pcm.h> +#include <sound/rawmidi.h>  #include <linux/interrupt.h>  #include <asm/io.h> diff --git a/include/sound/sb16_csp.h b/include/sound/sb16_csp.h index 736eac71d05..c7c7788005e 100644 --- a/include/sound/sb16_csp.h +++ b/include/sound/sb16_csp.h @@ -1,6 +1,3 @@ -#ifndef __SOUND_SB16_CSP_H -#define __SOUND_SB16_CSP_H -  /*   *  Copyright (c) 1999 by Uros Bizjak <uros@kss-loka.si>   *                        Takashi Iwai <tiwai@suse.de> @@ -22,99 +19,13 @@   *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   *   */ +#ifndef __SOUND_SB16_CSP_H +#define __SOUND_SB16_CSP_H -/* CSP modes */ -#define SNDRV_SB_CSP_MODE_NONE		0x00 -#define SNDRV_SB_CSP_MODE_DSP_READ	0x01	/* Record from DSP */ -#define SNDRV_SB_CSP_MODE_DSP_WRITE	0x02	/* Play to DSP */ -#define SNDRV_SB_CSP_MODE_QSOUND		0x04	/* QSound */ - -/* CSP load flags */ -#define SNDRV_SB_CSP_LOAD_FROMUSER	0x01 -#define SNDRV_SB_CSP_LOAD_INITBLOCK	0x02 - -/* CSP sample width */ -#define SNDRV_SB_CSP_SAMPLE_8BIT		0x01 -#define SNDRV_SB_CSP_SAMPLE_16BIT		0x02 - -/* CSP channels */ -#define SNDRV_SB_CSP_MONO			0x01 -#define SNDRV_SB_CSP_STEREO		0x02 - -/* CSP rates */ -#define SNDRV_SB_CSP_RATE_8000		0x01 -#define SNDRV_SB_CSP_RATE_11025		0x02 -#define SNDRV_SB_CSP_RATE_22050		0x04 -#define SNDRV_SB_CSP_RATE_44100		0x08 -#define SNDRV_SB_CSP_RATE_ALL		0x0f - -/* CSP running state */ -#define SNDRV_SB_CSP_ST_IDLE		0x00 -#define SNDRV_SB_CSP_ST_LOADED		0x01 -#define SNDRV_SB_CSP_ST_RUNNING		0x02 -#define SNDRV_SB_CSP_ST_PAUSED		0x04 -#define SNDRV_SB_CSP_ST_AUTO		0x08 -#define SNDRV_SB_CSP_ST_QSOUND		0x10 - -/* maximum QSound value (180 degrees right) */ -#define SNDRV_SB_CSP_QSOUND_MAX_RIGHT	0x20 - -/* maximum microcode RIFF file size */ -#define SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE	0x3000 - -/* microcode header */ -struct snd_sb_csp_mc_header { -	char codec_name[16];		/* id name of codec */ -	unsigned short func_req;	/* requested function */ -}; - -/* microcode to be loaded */ -struct snd_sb_csp_microcode { -	struct snd_sb_csp_mc_header info; -	unsigned char data[SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE]; -}; - -/* start CSP with sample_width in mono/stereo */ -struct snd_sb_csp_start { -	int sample_width;	/* sample width, look above */ -	int channels;		/* channels, look above */ -}; - -/* CSP information */ -struct snd_sb_csp_info { -	char codec_name[16];		/* id name of codec */ -	unsigned short func_nr;		/* function number */ -	unsigned int acc_format;	/* accepted PCM formats */ -	unsigned short acc_channels;	/* accepted channels */ -	unsigned short acc_width;	/* accepted sample width */ -	unsigned short acc_rates;	/* accepted sample rates */ -	unsigned short csp_mode;	/* CSP mode, see above */ -	unsigned short run_channels;	/* current channels  */ -	unsigned short run_width;	/* current sample width */ -	unsigned short version;		/* version id: 0x10 - 0x1f */ -	unsigned short state;		/* state bits */ -}; - -/* HWDEP controls */ -/* get CSP information */ -#define SNDRV_SB_CSP_IOCTL_INFO		_IOR('H', 0x10, struct snd_sb_csp_info) -/* load microcode to CSP */ -#define SNDRV_SB_CSP_IOCTL_LOAD_CODE	_IOW('H', 0x11, struct snd_sb_csp_microcode) -/* unload microcode from CSP */ -#define SNDRV_SB_CSP_IOCTL_UNLOAD_CODE	_IO('H', 0x12) -/* start CSP */ -#define SNDRV_SB_CSP_IOCTL_START		_IOW('H', 0x13, struct snd_sb_csp_start) -/* stop CSP */ -#define SNDRV_SB_CSP_IOCTL_STOP		_IO('H', 0x14) -/* pause CSP and DMA transfer */ -#define SNDRV_SB_CSP_IOCTL_PAUSE		_IO('H', 0x15) -/* restart CSP and DMA transfer */ -#define SNDRV_SB_CSP_IOCTL_RESTART	_IO('H', 0x16) - -#ifdef __KERNEL__ -#include "sb.h" -#include "hwdep.h" +#include <sound/sb.h> +#include <sound/hwdep.h>  #include <linux/firmware.h> +#include <uapi/sound/sb16_csp.h>  struct snd_sb_csp; @@ -176,6 +87,4 @@ struct snd_sb_csp {  };  int snd_sb_csp_new(struct snd_sb *chip, int device, struct snd_hwdep ** rhwdep); -#endif -  #endif /* __SOUND_SB16_CSP */ diff --git a/include/sound/seq_kernel.h b/include/sound/seq_kernel.h index 3d9afb6a8c9..2398521f099 100644 --- a/include/sound/seq_kernel.h +++ b/include/sound/seq_kernel.h @@ -22,7 +22,7 @@   *   */  #include <linux/time.h> -#include "asequencer.h" +#include <sound/asequencer.h>  typedef struct snd_seq_real_time snd_seq_real_time_t;  typedef union snd_seq_timestamp snd_seq_timestamp_t; @@ -75,9 +75,9 @@ struct snd_seq_port_callback {  };  /* interface for kernel client */ +__printf(3, 4)  int snd_seq_create_kernel_client(struct snd_card *card, int client_index, -				 const char *name_fmt, ...) -	__attribute__ ((format (printf, 3, 4))); +				 const char *name_fmt, ...);  int snd_seq_delete_kernel_client(int client);  int snd_seq_kernel_client_enqueue(int client, struct snd_seq_event *ev, int atomic, int hop);  int snd_seq_kernel_client_dispatch(int client, struct snd_seq_event *ev, int atomic, int hop); diff --git a/include/sound/seq_midi_emul.h b/include/sound/seq_midi_emul.h index d6c4615901b..8139d8c191e 100644 --- a/include/sound/seq_midi_emul.h +++ b/include/sound/seq_midi_emul.h @@ -22,7 +22,7 @@   *   */ -#include "seq_kernel.h" +#include <sound/seq_kernel.h>  /*   * This structure is used to keep track of the current state on each diff --git a/include/sound/seq_midi_event.h b/include/sound/seq_midi_event.h index 5efab8b29c5..e40f43e6fc7 100644 --- a/include/sound/seq_midi_event.h +++ b/include/sound/seq_midi_event.h @@ -22,7 +22,7 @@   *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   */ -#include "asequencer.h" +#include <sound/asequencer.h>  #define MAX_MIDI_EVENT_BUF	256 diff --git a/include/sound/seq_oss.h b/include/sound/seq_oss.h index 9b060bbd6e0..d0b27ec6f8b 100644 --- a/include/sound/seq_oss.h +++ b/include/sound/seq_oss.h @@ -21,8 +21,8 @@   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   */ -#include "asequencer.h" -#include "seq_kernel.h" +#include <sound/asequencer.h> +#include <sound/seq_kernel.h>  /*   * argument structure for synthesizer operations diff --git a/include/sound/seq_virmidi.h b/include/sound/seq_virmidi.h index d888433a309..a03acd0d398 100644 --- a/include/sound/seq_virmidi.h +++ b/include/sound/seq_virmidi.h @@ -22,8 +22,8 @@   *   */ -#include "rawmidi.h" -#include "seq_midi_event.h" +#include <sound/rawmidi.h> +#include <sound/seq_midi_event.h>  /*   * device file instance: diff --git a/include/sound/sfnt_info.h b/include/sound/sfnt_info.h deleted file mode 100644 index 1bce7fd1725..00000000000 --- a/include/sound/sfnt_info.h +++ /dev/null @@ -1,212 +0,0 @@ -#ifndef __SOUND_SFNT_INFO_H -#define __SOUND_SFNT_INFO_H - -/* - *  Patch record compatible with AWE driver on OSS - * - *  Copyright (C) 1999-2000 Takashi Iwai - * - *   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; either version 2 of the License, or - *   (at your option) any later version. - * - *   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 - * - */ - -#include <sound/asound.h> - -/* - * patch information record - */ - -#ifdef SNDRV_BIG_ENDIAN -#define SNDRV_OSS_PATCHKEY(id) (0xfd00|id) -#else -#define SNDRV_OSS_PATCHKEY(id) ((id<<8)|0xfd) -#endif - -/* patch interface header: 16 bytes */ -struct soundfont_patch_info { -	unsigned short key;		/* use the key below */ -#define SNDRV_OSS_SOUNDFONT_PATCH		SNDRV_OSS_PATCHKEY(0x07) - -	short device_no;		/* synthesizer number */ -	unsigned short sf_id;		/* file id (should be zero) */ -	short optarg;			/* optional argument */ -	int len;			/* data length (without this header) */ - -	short type;			/* patch operation type */ -#define SNDRV_SFNT_LOAD_INFO		0	/* awe_voice_rec */ -#define SNDRV_SFNT_LOAD_DATA		1	/* awe_sample_info */ -#define SNDRV_SFNT_OPEN_PATCH	2	/* awe_open_parm */ -#define SNDRV_SFNT_CLOSE_PATCH	3	/* none */ -	/* 4 is obsolete */ -#define SNDRV_SFNT_REPLACE_DATA	5	/* awe_sample_info (optarg=#channels)*/ -#define SNDRV_SFNT_MAP_PRESET	6	/* awe_voice_map */ -	/* 7 is not used */ -#define SNDRV_SFNT_PROBE_DATA		8	/* optarg=sample */ -#define SNDRV_SFNT_REMOVE_INFO		9	/* optarg=(bank<<8)|instr */ - -	short reserved;			/* word alignment data */ - -	/* the actual patch data begins after this */ -}; - - -/* - * open patch - */ - -#define SNDRV_SFNT_PATCH_NAME_LEN	32 - -struct soundfont_open_parm { -	unsigned short type;		/* sample type */ -#define SNDRV_SFNT_PAT_TYPE_MISC	0 -#define SNDRV_SFNT_PAT_TYPE_GUS	6 -#define SNDRV_SFNT_PAT_TYPE_MAP	7 -#define SNDRV_SFNT_PAT_LOCKED	0x100	/* lock the samples */ -#define SNDRV_SFNT_PAT_SHARED	0x200	/* sample is shared */ - -	short reserved; -	char name[SNDRV_SFNT_PATCH_NAME_LEN]; -}; - - -/* - * raw voice information record - */ - -/* wave table envelope & effect parameters to control EMU8000 */ -struct soundfont_voice_parm { -	unsigned short moddelay;	/* modulation delay (0x8000) */ -	unsigned short modatkhld;	/* modulation attack & hold time (0x7f7f) */ -	unsigned short moddcysus;	/* modulation decay & sustain (0x7f7f) */ -	unsigned short modrelease;	/* modulation release time (0x807f) */ -	short modkeyhold, modkeydecay;	/* envelope change per key (not used) */ -	unsigned short voldelay;	/* volume delay (0x8000) */ -	unsigned short volatkhld;	/* volume attack & hold time (0x7f7f) */ -	unsigned short voldcysus;	/* volume decay & sustain (0x7f7f) */ -	unsigned short volrelease;	/* volume release time (0x807f) */ -	short volkeyhold, volkeydecay;	/* envelope change per key (not used) */ -	unsigned short lfo1delay;	/* LFO1 delay (0x8000) */ -	unsigned short lfo2delay;	/* LFO2 delay (0x8000) */ -	unsigned short pefe;		/* modulation pitch & cutoff (0x0000) */ -	unsigned short fmmod;		/* LFO1 pitch & cutoff (0x0000) */ -	unsigned short tremfrq;		/* LFO1 volume & freq (0x0000) */ -	unsigned short fm2frq2;		/* LFO2 pitch & freq (0x0000) */ -	unsigned char cutoff;		/* initial cutoff (0xff) */ -	unsigned char filterQ;		/* initial filter Q [0-15] (0x0) */ -	unsigned char chorus;		/* chorus send (0x00) */ -	unsigned char reverb;		/* reverb send (0x00) */ -	unsigned short reserved[4];	/* not used */ -}; - - -/* wave table parameters: 92 bytes */ -struct soundfont_voice_info { -	unsigned short sf_id;		/* file id (should be zero) */ -	unsigned short sample;		/* sample id */ -	int start, end;			/* sample offset correction */ -	int loopstart, loopend;		/* loop offset correction */ -	short rate_offset;		/* sample rate pitch offset */ -	unsigned short mode;		/* sample mode */ -#define SNDRV_SFNT_MODE_ROMSOUND		0x8000 -#define SNDRV_SFNT_MODE_STEREO		1 -#define SNDRV_SFNT_MODE_LOOPING		2 -#define SNDRV_SFNT_MODE_NORELEASE		4	/* obsolete */ -#define SNDRV_SFNT_MODE_INIT_PARM		8 - -	short root;			/* midi root key */ -	short tune;			/* pitch tuning (in cents) */ -	unsigned char low, high;	/* key note range */ -	unsigned char vellow, velhigh;	/* velocity range */ -	signed char fixkey, fixvel;	/* fixed key, velocity */ -	signed char pan, fixpan;	/* panning, fixed panning */ -	short exclusiveClass;		/* exclusive class (0 = none) */ -	unsigned char amplitude;	/* sample volume (127 max) */ -	unsigned char attenuation;	/* attenuation (0.375dB) */ -	short scaleTuning;		/* pitch scale tuning(%), normally 100 */ -	struct soundfont_voice_parm parm;	/* voice envelope parameters */ -	unsigned short sample_mode;	/* sample mode_flag (set by driver) */ -}; - - -/* instrument info header: 4 bytes */ -struct soundfont_voice_rec_hdr { -	unsigned char bank;		/* midi bank number */ -	unsigned char instr;		/* midi preset number */ -	char nvoices;			/* number of voices */ -	char write_mode;		/* write mode; normally 0 */ -#define SNDRV_SFNT_WR_APPEND		0	/* append anyway */ -#define SNDRV_SFNT_WR_EXCLUSIVE		1	/* skip if already exists */ -#define SNDRV_SFNT_WR_REPLACE		2	/* replace if already exists */ -}; - - -/* - * sample wave information - */ - -/* wave table sample header: 32 bytes */ -struct soundfont_sample_info { -	unsigned short sf_id;		/* file id (should be zero) */ -	unsigned short sample;		/* sample id */ -	int start, end;			/* start & end offset */ -	int loopstart, loopend;		/* loop start & end offset */ -	int size;			/* size (0 = ROM) */ -	short dummy;			/* not used */ -	unsigned short mode_flags;	/* mode flags */ -#define SNDRV_SFNT_SAMPLE_8BITS		1	/* wave data is 8bits */ -#define SNDRV_SFNT_SAMPLE_UNSIGNED	2	/* wave data is unsigned */ -#define SNDRV_SFNT_SAMPLE_NO_BLANK	4	/* no blank loop is attached */ -#define SNDRV_SFNT_SAMPLE_SINGLESHOT	8	/* single-shot w/o loop */ -#define SNDRV_SFNT_SAMPLE_BIDIR_LOOP	16	/* bidirectional looping */ -#define SNDRV_SFNT_SAMPLE_STEREO_LEFT	32	/* stereo left sound */ -#define SNDRV_SFNT_SAMPLE_STEREO_RIGHT	64	/* stereo right sound */ -#define SNDRV_SFNT_SAMPLE_REVERSE_LOOP	128	/* reverse looping */ -	unsigned int truesize;		/* used memory size (set by driver) */ -}; - - -/* - * voice preset mapping (aliasing) - */ - -struct soundfont_voice_map { -	int map_bank, map_instr, map_key;	/* key = -1 means all keys */ -	int src_bank, src_instr, src_key; -}; - - -/* - * ioctls for hwdep - */ - -#define SNDRV_EMUX_HWDEP_NAME	"Emux WaveTable" - -#define SNDRV_EMUX_VERSION	((1 << 16) | (0 << 8) | 0)	/* 1.0.0 */ - -struct snd_emux_misc_mode { -	int port;	/* -1 = all */ -	int mode; -	int value; -	int value2;	/* reserved */ -}; - -#define SNDRV_EMUX_IOCTL_VERSION	_IOR('H', 0x80, unsigned int) -#define SNDRV_EMUX_IOCTL_LOAD_PATCH	_IOWR('H', 0x81, struct soundfont_patch_info) -#define SNDRV_EMUX_IOCTL_RESET_SAMPLES	_IO('H', 0x82) -#define SNDRV_EMUX_IOCTL_REMOVE_LAST_SAMPLES _IO('H', 0x83) -#define SNDRV_EMUX_IOCTL_MEM_AVAIL	_IOW('H', 0x84, int) -#define SNDRV_EMUX_IOCTL_MISC_MODE	_IOWR('H', 0x84, struct snd_emux_misc_mode) - -#endif /* __SOUND_SFNT_INFO_H */ diff --git a/include/sound/sh_fsi.h b/include/sound/sh_fsi.h index fa60cbda90a..7a9710b4b79 100644 --- a/include/sound/sh_fsi.h +++ b/include/sound/sh_fsi.h @@ -11,107 +11,25 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - -#define FSI_PORT_A	0 -#define FSI_PORT_B	1 - -/* flags format - - * 0xABCDEEFF - * - * A:  channel size for TDM (input) - * B:  channel size for TDM (ooutput) - * C:  inversion - * D:  mode - * E:  input format - * F:  output format - */ -  #include <linux/clk.h>  #include <sound/soc.h> -/* TDM channel */ -#define SH_FSI_SET_CH_I(x)	((x & 0xF) << 28) -#define SH_FSI_SET_CH_O(x)	((x & 0xF) << 24) - -#define SH_FSI_CH_IMASK		0xF0000000 -#define SH_FSI_CH_OMASK		0x0F000000 -#define SH_FSI_GET_CH_I(x)	((x & SH_FSI_CH_IMASK) >> 28) -#define SH_FSI_GET_CH_O(x)	((x & SH_FSI_CH_OMASK) >> 24) - -/* clock inversion */ -#define SH_FSI_INVERSION_MASK	0x00F00000 -#define SH_FSI_LRM_INV		(1 << 20) -#define SH_FSI_BRM_INV		(1 << 21) -#define SH_FSI_LRS_INV		(1 << 22) -#define SH_FSI_BRS_INV		(1 << 23) - -/* mode */ -#define SH_FSI_MODE_MASK	0x000F0000 -#define SH_FSI_IN_SLAVE_MODE	(1 << 16)  /* default master mode */ -#define SH_FSI_OUT_SLAVE_MODE	(1 << 17)  /* default master mode */ - -/* DI format */ -#define SH_FSI_FMT_MASK		0x000000FF -#define SH_FSI_IFMT(x)		(((SH_FSI_FMT_ ## x) & SH_FSI_FMT_MASK) << 8) -#define SH_FSI_OFMT(x)		(((SH_FSI_FMT_ ## x) & SH_FSI_FMT_MASK) << 0) -#define SH_FSI_GET_IFMT(x)	((x >> 8) & SH_FSI_FMT_MASK) -#define SH_FSI_GET_OFMT(x)	((x >> 0) & SH_FSI_FMT_MASK) - -#define SH_FSI_FMT_MONO		0 -#define SH_FSI_FMT_MONO_DELAY	1 -#define SH_FSI_FMT_PCM		2 -#define SH_FSI_FMT_I2S		3 -#define SH_FSI_FMT_TDM		4 -#define SH_FSI_FMT_TDM_DELAY	5 -#define SH_FSI_FMT_SPDIF	6 - - -#define SH_FSI_IFMT_TDM_CH(x) \ -	(SH_FSI_IFMT(TDM)	| SH_FSI_SET_CH_I(x)) -#define SH_FSI_IFMT_TDM_DELAY_CH(x) \ -	(SH_FSI_IFMT(TDM_DELAY)	| SH_FSI_SET_CH_I(x)) - -#define SH_FSI_OFMT_TDM_CH(x) \ -	(SH_FSI_OFMT(TDM)	| SH_FSI_SET_CH_O(x)) -#define SH_FSI_OFMT_TDM_DELAY_CH(x) \ -	(SH_FSI_OFMT(TDM_DELAY)	| SH_FSI_SET_CH_O(x)) - -  /* - * set_rate return value - * - * see ACKMD/BPFMD on - *     ACK_MD (FSI2) - *     CKG1   (FSI) - * - * err:  return value < 0 - * - * 0x-00000AB - * - * A:  ACKMD value - * B:  BPFMD value + * flags   */ - -#define SH_FSI_ACKMD_MASK	(0xF << 0) -#define SH_FSI_ACKMD_512	(1 << 0) -#define SH_FSI_ACKMD_256	(2 << 0) -#define SH_FSI_ACKMD_128	(3 << 0) -#define SH_FSI_ACKMD_64		(4 << 0) -#define SH_FSI_ACKMD_32		(5 << 0) - -#define SH_FSI_BPFMD_MASK	(0xF << 4) -#define SH_FSI_BPFMD_512	(1 << 4) -#define SH_FSI_BPFMD_256	(2 << 4) -#define SH_FSI_BPFMD_128	(3 << 4) -#define SH_FSI_BPFMD_64		(4 << 4) -#define SH_FSI_BPFMD_32		(5 << 4) -#define SH_FSI_BPFMD_16		(6 << 4) +#define SH_FSI_FMT_SPDIF		(1 << 0) /* spdif for HDMI */ +#define SH_FSI_ENABLE_STREAM_MODE	(1 << 1) /* for 16bit data */ +#define SH_FSI_CLK_CPG			(1 << 2) /* FSIxCK + FSI-DIV */ + +struct sh_fsi_port_info { +	unsigned long flags; +	int tx_id; +	int rx_id; +};  struct sh_fsi_platform_info { -	unsigned long porta_flags; -	unsigned long portb_flags; -	int (*set_rate)(int is_porta, int rate); /* for master mode */ +	struct sh_fsi_port_info port_a; +	struct sh_fsi_port_info port_b;  };  #endif /* __SOUND_FSI_H */ diff --git a/include/sound/simple_card.h b/include/sound/simple_card.h new file mode 100644 index 00000000000..9b0ac77177b --- /dev/null +++ b/include/sound/simple_card.h @@ -0,0 +1,36 @@ +/* + * ASoC simple sound card support + * + * Copyright (C) 2012 Renesas Solutions Corp. + * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __SIMPLE_CARD_H +#define __SIMPLE_CARD_H + +#include <sound/soc.h> + +struct asoc_simple_dai { +	const char *name; +	unsigned int fmt; +	unsigned int sysclk; +	int slots; +	int slot_width; +}; + +struct asoc_simple_card_info { +	const char *name; +	const char *card; +	const char *codec; +	const char *platform; + +	unsigned int daifmt; +	struct asoc_simple_dai cpu_dai; +	struct asoc_simple_dai codec_dai; +}; + +#endif /* __SIMPLE_CARD_H */ diff --git a/include/sound/snd_wavefront.h b/include/sound/snd_wavefront.h index fa149ca77e4..35e94b3d1ec 100644 --- a/include/sound/snd_wavefront.h +++ b/include/sound/snd_wavefront.h @@ -1,10 +1,10 @@  #ifndef __SOUND_SND_WAVEFRONT_H__  #define __SOUND_SND_WAVEFRONT_H__ -#include "mpu401.h" -#include "hwdep.h" -#include "rawmidi.h" -#include "wavefront.h"  /* generic OSS/ALSA/user-level wavefront header */ +#include <sound/mpu401.h> +#include <sound/hwdep.h> +#include <sound/rawmidi.h> +#include <sound/wavefront.h>  /* generic OSS/ALSA/user-level wavefront header */  /* MIDI interface */ diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h index e7b68024800..688f2ba8009 100644 --- a/include/sound/soc-dai.h +++ b/include/sound/soc-dai.h @@ -16,9 +16,9 @@  #include <linux/list.h> -#include <sound/soc.h> -  struct snd_pcm_substream; +struct snd_soc_dapm_widget; +struct snd_compr_stream;  /*   * DAI hardware audio formats. @@ -26,13 +26,13 @@ struct snd_pcm_substream;   * Describes the physical PCM data formating and clocking. Add new formats   * to the end.   */ -#define SND_SOC_DAIFMT_I2S		0 /* I2S mode */ -#define SND_SOC_DAIFMT_RIGHT_J		1 /* Right Justified mode */ -#define SND_SOC_DAIFMT_LEFT_J		2 /* Left Justified mode */ -#define SND_SOC_DAIFMT_DSP_A		3 /* L data MSB after FRM LRC */ -#define SND_SOC_DAIFMT_DSP_B		4 /* L data MSB during FRM LRC */ -#define SND_SOC_DAIFMT_AC97		5 /* AC97 */ -#define SND_SOC_DAIFMT_PDM		6 /* Pulse density modulation */ +#define SND_SOC_DAIFMT_I2S		1 /* I2S mode */ +#define SND_SOC_DAIFMT_RIGHT_J		2 /* Right Justified mode */ +#define SND_SOC_DAIFMT_LEFT_J		3 /* Left Justified mode */ +#define SND_SOC_DAIFMT_DSP_A		4 /* L data MSB after FRM LRC */ +#define SND_SOC_DAIFMT_DSP_B		5 /* L data MSB during FRM LRC */ +#define SND_SOC_DAIFMT_AC97		6 /* AC97 */ +#define SND_SOC_DAIFMT_PDM		7 /* Pulse density modulation */  /* left and right justified also known as MSB and LSB respectively */  #define SND_SOC_DAIFMT_MSB		SND_SOC_DAIFMT_LEFT_J @@ -44,8 +44,8 @@ struct snd_pcm_substream;   * DAI bit clocks can be be gated (disabled) when the DAI is not   * sending or receiving PCM data in a frame. This can be used to save power.   */ -#define SND_SOC_DAIFMT_CONT		(0 << 4) /* continuous clock */ -#define SND_SOC_DAIFMT_GATED		(1 << 4) /* clock is gated */ +#define SND_SOC_DAIFMT_CONT		(1 << 4) /* continuous clock */ +#define SND_SOC_DAIFMT_GATED		(0 << 4) /* clock is gated */  /*   * DAI hardware signal inversions. @@ -54,9 +54,9 @@ struct snd_pcm_substream;   * format.   */  #define SND_SOC_DAIFMT_NB_NF		(0 << 8) /* normal bit clock + frame */ -#define SND_SOC_DAIFMT_NB_IF		(1 << 8) /* normal BCLK + inv FRM */ -#define SND_SOC_DAIFMT_IB_NF		(2 << 8) /* invert BCLK + nor FRM */ -#define SND_SOC_DAIFMT_IB_IF		(3 << 8) /* invert BCLK + FRM */ +#define SND_SOC_DAIFMT_NB_IF		(2 << 8) /* normal BCLK + inv FRM */ +#define SND_SOC_DAIFMT_IB_NF		(3 << 8) /* invert BCLK + nor FRM */ +#define SND_SOC_DAIFMT_IB_IF		(4 << 8) /* invert BCLK + FRM */  /*   * DAI hardware clock masters. @@ -65,10 +65,10 @@ struct snd_pcm_substream;   * i.e. if the codec is clk and FRM master then the interface is   * clk and frame slave.   */ -#define SND_SOC_DAIFMT_CBM_CFM		(0 << 12) /* codec clk & FRM master */ -#define SND_SOC_DAIFMT_CBS_CFM		(1 << 12) /* codec clk slave & FRM master */ -#define SND_SOC_DAIFMT_CBM_CFS		(2 << 12) /* codec clk master & frame slave */ -#define SND_SOC_DAIFMT_CBS_CFS		(3 << 12) /* codec clk & FRM slave */ +#define SND_SOC_DAIFMT_CBM_CFM		(1 << 12) /* codec clk & FRM master */ +#define SND_SOC_DAIFMT_CBS_CFM		(2 << 12) /* codec clk slave & FRM master */ +#define SND_SOC_DAIFMT_CBM_CFS		(3 << 12) /* codec clk master & frame slave */ +#define SND_SOC_DAIFMT_CBS_CFS		(4 << 12) /* codec clk & FRM slave */  #define SND_SOC_DAIFMT_FORMAT_MASK	0x000f  #define SND_SOC_DAIFMT_CLOCK_MASK	0x00f0 @@ -95,14 +95,6 @@ struct snd_soc_dai_driver;  struct snd_soc_dai;  struct snd_ac97_bus_ops; -/* Digital Audio Interface registration */ -int snd_soc_register_dai(struct device *dev, -		struct snd_soc_dai_driver *dai_drv); -void snd_soc_unregister_dai(struct device *dev); -int snd_soc_register_dais(struct device *dev, -		struct snd_soc_dai_driver *dai_drv, size_t count); -void snd_soc_unregister_dais(struct device *dev, size_t count); -  /* Digital Audio Interface clocking API.*/  int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,  	unsigned int freq, int dir); @@ -113,6 +105,8 @@ int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai,  int snd_soc_dai_set_pll(struct snd_soc_dai *dai,  	int pll_id, int source, unsigned int freq_in, unsigned int freq_out); +int snd_soc_dai_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio); +  /* Digital Audio interface formatting */  int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt); @@ -126,7 +120,10 @@ int snd_soc_dai_set_channel_map(struct snd_soc_dai *dai,  int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate);  /* Digital Audio Interface mute */ -int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute); +int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute, +			     int direction); + +int snd_soc_dai_is_dummy(struct snd_soc_dai *dai);  struct snd_soc_dai_ops {  	/* @@ -138,12 +135,15 @@ struct snd_soc_dai_ops {  	int (*set_pll)(struct snd_soc_dai *dai, int pll_id, int source,  		unsigned int freq_in, unsigned int freq_out);  	int (*set_clkdiv)(struct snd_soc_dai *dai, int div_id, int div); +	int (*set_bclk_ratio)(struct snd_soc_dai *dai, unsigned int ratio);  	/*  	 * DAI format configuration  	 * Called by soc_card drivers, normally in their hw_params.  	 */  	int (*set_fmt)(struct snd_soc_dai *dai, unsigned int fmt); +	int (*xlate_tdm_slot_mask)(unsigned int slots, +		unsigned int *tx_mask, unsigned int *rx_mask);  	int (*set_tdm_slot)(struct snd_soc_dai *dai,  		unsigned int tx_mask, unsigned int rx_mask,  		int slots, int slot_width); @@ -157,6 +157,7 @@ struct snd_soc_dai_ops {  	 * Called by soc-core to minimise any pops.  	 */  	int (*digital_mute)(struct snd_soc_dai *dai, int mute); +	int (*mute_stream)(struct snd_soc_dai *dai, int mute, int stream);  	/*  	 * ALSA PCM audio operations - all optional. @@ -172,8 +173,17 @@ struct snd_soc_dai_ops {  		struct snd_soc_dai *);  	int (*prepare)(struct snd_pcm_substream *,  		struct snd_soc_dai *); +	/* +	 * NOTE: Commands passed to the trigger function are not necessarily +	 * compatible with the current state of the dai. For example this +	 * sequence of commands is possible: START STOP STOP. +	 * So do not unconditionally use refcounting functions in the trigger +	 * function, e.g. clk_enable/disable. +	 */  	int (*trigger)(struct snd_pcm_substream *, int,  		struct snd_soc_dai *); +	int (*bespoke_trigger)(struct snd_pcm_substream *, int, +		struct snd_soc_dai *);  	/*  	 * For hardware based FIFO caused delay reporting.  	 * Optional. @@ -197,20 +207,29 @@ struct snd_soc_dai_driver {  	const char *name;  	unsigned int id;  	int ac97_control; +	unsigned int base;  	/* DAI driver callbacks */  	int (*probe)(struct snd_soc_dai *dai);  	int (*remove)(struct snd_soc_dai *dai);  	int (*suspend)(struct snd_soc_dai *dai);  	int (*resume)(struct snd_soc_dai *dai); +	/* compress dai */ +	bool compress_dai;  	/* ops */ -	struct snd_soc_dai_ops *ops; +	const struct snd_soc_dai_ops *ops;  	/* DAI capabilities */  	struct snd_soc_pcm_stream capture;  	struct snd_soc_pcm_stream playback;  	unsigned int symmetric_rates:1; +	unsigned int symmetric_channels:1; +	unsigned int symmetric_samplebits:1; + +	/* probe ordering - for components with runtime dependencies */ +	int probe_order; +	int remove_order;  };  /* @@ -231,24 +250,32 @@ struct snd_soc_dai {  	unsigned int capture_active:1;		/* stream is in use */  	unsigned int playback_active:1;		/* stream is in use */  	unsigned int symmetric_rates:1; -	struct snd_pcm_runtime *runtime; +	unsigned int symmetric_channels:1; +	unsigned int symmetric_samplebits:1;  	unsigned int active; -	unsigned char pop_wait:1;  	unsigned char probed:1; +	struct snd_soc_dapm_widget *playback_widget; +	struct snd_soc_dapm_widget *capture_widget; +	struct snd_soc_dapm_context dapm; +  	/* DAI DMA data */  	void *playback_dma_data;  	void *capture_dma_data; +	/* Symmetry data - only valid if symmetry is being enforced */ +	unsigned int rate; +	unsigned int channels; +	unsigned int sample_bits; +  	/* parent platform/codec */ -	union { -		struct snd_soc_platform *platform; -		struct snd_soc_codec *codec; -	}; +	struct snd_soc_platform *platform; +	struct snd_soc_codec *codec; +	struct snd_soc_component *component; +  	struct snd_soc_card *card;  	struct list_head list; -	struct list_head card_list;  };  static inline void *snd_soc_dai_get_dma_data(const struct snd_soc_dai *dai, @@ -268,6 +295,13 @@ static inline void snd_soc_dai_set_dma_data(struct snd_soc_dai *dai,  		dai->capture_dma_data = data;  } +static inline void snd_soc_dai_init_dma_data(struct snd_soc_dai *dai, +					     void *playback, void *capture) +{ +	dai->playback_dma_data = playback; +	dai->capture_dma_data = capture; +} +  static inline void snd_soc_dai_set_drvdata(struct snd_soc_dai *dai,  		void *data)  { diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h index 8fd3b41b763..6b59471cdf4 100644 --- a/include/sound/soc-dapm.h +++ b/include/sound/soc-dapm.h @@ -13,10 +13,10 @@  #ifndef __LINUX_SND_SOC_DAPM_H  #define __LINUX_SND_SOC_DAPM_H -#include <linux/device.h>  #include <linux/types.h>  #include <sound/control.h> -#include <sound/soc.h> + +struct device;  /* widget has no PM register bit */  #define SND_SOC_NOPM	-1 @@ -24,8 +24,8 @@  /*   * SoC dynamic audio power management   * - * We can have upto 4 power domains - * 	1. Codec domain - VREF, VMID + * We can have up to 4 power domains + *  1. Codec domain - VREF, VMID   *     Usually controlled at codec probe/remove, although can be set   *     at stream time if power is not needed for sidetone, etc.   *  2. Platform/Machine domain - physically connected inputs and outputs @@ -40,225 +40,267 @@  /* codec domain */  #define SND_SOC_DAPM_VMID(wname) \ -{	.id = snd_soc_dapm_vmid, .name = wname, .kcontrols = NULL, \ +{	.id = snd_soc_dapm_vmid, .name = wname, .kcontrol_news = NULL, \  	.num_kcontrols = 0}  /* platform domain */ +#define SND_SOC_DAPM_SIGGEN(wname) \ +{	.id = snd_soc_dapm_siggen, .name = wname, .kcontrol_news = NULL, \ +	.num_kcontrols = 0, .reg = SND_SOC_NOPM }  #define SND_SOC_DAPM_INPUT(wname) \ -{	.id = snd_soc_dapm_input, .name = wname, .kcontrols = NULL, \ -	.num_kcontrols = 0} +{	.id = snd_soc_dapm_input, .name = wname, .kcontrol_news = NULL, \ +	.num_kcontrols = 0, .reg = SND_SOC_NOPM }  #define SND_SOC_DAPM_OUTPUT(wname) \ -{	.id = snd_soc_dapm_output, .name = wname, .kcontrols = NULL, \ -	.num_kcontrols = 0} +{	.id = snd_soc_dapm_output, .name = wname, .kcontrol_news = NULL, \ +	.num_kcontrols = 0, .reg = SND_SOC_NOPM }  #define SND_SOC_DAPM_MIC(wname, wevent) \ -{	.id = snd_soc_dapm_mic, .name = wname, .kcontrols = NULL, \ -	.num_kcontrols = 0, .event = wevent, \ +{	.id = snd_soc_dapm_mic, .name = wname, .kcontrol_news = NULL, \ +	.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \  	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD}  #define SND_SOC_DAPM_HP(wname, wevent) \ -{	.id = snd_soc_dapm_hp, .name = wname, .kcontrols = NULL, \ -	.num_kcontrols = 0, .event = wevent, \ +{	.id = snd_soc_dapm_hp, .name = wname, .kcontrol_news = NULL, \ +	.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \  	.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}  #define SND_SOC_DAPM_SPK(wname, wevent) \ -{	.id = snd_soc_dapm_spk, .name = wname, .kcontrols = NULL, \ -	.num_kcontrols = 0, .event = wevent, \ +{	.id = snd_soc_dapm_spk, .name = wname, .kcontrol_news = NULL, \ +	.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \  	.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}  #define SND_SOC_DAPM_LINE(wname, wevent) \ -{	.id = snd_soc_dapm_line, .name = wname, .kcontrols = NULL, \ -	.num_kcontrols = 0, .event = wevent, \ +{	.id = snd_soc_dapm_line, .name = wname, .kcontrol_news = NULL, \ +	.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \  	.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD} +#define SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert) \ +	.reg = wreg, .mask = 1, .shift = wshift, \ +	.on_val = winvert ? 0 : 1, .off_val = winvert ? 1 : 0 +  /* path domain */  #define SND_SOC_DAPM_PGA(wname, wreg, wshift, winvert,\  	 wcontrols, wncontrols) \ -{	.id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols} +{	.id = snd_soc_dapm_pga, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = wncontrols} +#define SND_SOC_DAPM_OUT_DRV(wname, wreg, wshift, winvert,\ +	 wcontrols, wncontrols) \ +{	.id = snd_soc_dapm_out_drv, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = wncontrols}  #define SND_SOC_DAPM_MIXER(wname, wreg, wshift, winvert, \  	 wcontrols, wncontrols)\ -{	.id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols} +{	.id = snd_soc_dapm_mixer, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = wncontrols}  #define SND_SOC_DAPM_MIXER_NAMED_CTL(wname, wreg, wshift, winvert, \  	 wcontrols, wncontrols)\ -{       .id = snd_soc_dapm_mixer_named_ctl, .name = wname, .reg = wreg, \ -	.shift = wshift, .invert = winvert, .kcontrols = wcontrols, \ -	.num_kcontrols = wncontrols} +{       .id = snd_soc_dapm_mixer_named_ctl, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = wncontrols}  #define SND_SOC_DAPM_MICBIAS(wname, wreg, wshift, winvert) \ -{	.id = snd_soc_dapm_micbias, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrols = NULL, .num_kcontrols = 0} +{	.id = snd_soc_dapm_micbias, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = NULL, .num_kcontrols = 0}  #define SND_SOC_DAPM_SWITCH(wname, wreg, wshift, winvert, wcontrols) \ -{	.id = snd_soc_dapm_switch, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1} +{	.id = snd_soc_dapm_switch, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = 1}  #define SND_SOC_DAPM_MUX(wname, wreg, wshift, winvert, wcontrols) \ -{	.id = snd_soc_dapm_mux, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1} -#define SND_SOC_DAPM_VALUE_MUX(wname, wreg, wshift, winvert, wcontrols) \ -{	.id = snd_soc_dapm_value_mux, .name = wname, .reg = wreg, \ -	.shift = wshift, .invert = winvert, .kcontrols = wcontrols, \ -	.num_kcontrols = 1} +{	.id = snd_soc_dapm_mux, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = 1}  /* Simplified versions of above macros, assuming wncontrols = ARRAY_SIZE(wcontrols) */  #define SOC_PGA_ARRAY(wname, wreg, wshift, winvert,\  	 wcontrols) \ -{	.id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols)} +{	.id = snd_soc_dapm_pga, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols)}  #define SOC_MIXER_ARRAY(wname, wreg, wshift, winvert, \  	 wcontrols)\ -{	.id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols)} +{	.id = snd_soc_dapm_mixer, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols)}  #define SOC_MIXER_NAMED_CTL_ARRAY(wname, wreg, wshift, winvert, \  	 wcontrols)\ -{       .id = snd_soc_dapm_mixer_named_ctl, .name = wname, .reg = wreg, \ -	.shift = wshift, .invert = winvert, .kcontrols = wcontrols, \ -	.num_kcontrols = ARRAY_SIZE(wcontrols)} +{       .id = snd_soc_dapm_mixer_named_ctl, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols)}  /* path domain with event - event handler must return 0 for success */  #define SND_SOC_DAPM_PGA_E(wname, wreg, wshift, winvert, wcontrols, \  	wncontrols, wevent, wflags) \ -{	.id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols, \ +{	.id = snd_soc_dapm_pga, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = wncontrols, \ +	.event = wevent, .event_flags = wflags} +#define SND_SOC_DAPM_OUT_DRV_E(wname, wreg, wshift, winvert, wcontrols, \ +	wncontrols, wevent, wflags) \ +{	.id = snd_soc_dapm_out_drv, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = wncontrols, \  	.event = wevent, .event_flags = wflags}  #define SND_SOC_DAPM_MIXER_E(wname, wreg, wshift, winvert, wcontrols, \  	wncontrols, wevent, wflags) \ -{	.id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols, \ +{	.id = snd_soc_dapm_mixer, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = wncontrols, \  	.event = wevent, .event_flags = wflags}  #define SND_SOC_DAPM_MIXER_NAMED_CTL_E(wname, wreg, wshift, winvert, \  	wcontrols, wncontrols, wevent, wflags) \ -{       .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrols = wcontrols, \ +{       .id = snd_soc_dapm_mixer, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, \  	.num_kcontrols = wncontrols, .event = wevent, .event_flags = wflags} -#define SND_SOC_DAPM_MICBIAS_E(wname, wreg, wshift, winvert, wevent, wflags) \ -{	.id = snd_soc_dapm_micbias, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrols = NULL, .num_kcontrols = 0, \ -	.event = wevent, .event_flags = wflags}  #define SND_SOC_DAPM_SWITCH_E(wname, wreg, wshift, winvert, wcontrols, \  	wevent, wflags) \ -{	.id = snd_soc_dapm_switch, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1, \ +{	.id = snd_soc_dapm_switch, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = 1, \  	.event = wevent, .event_flags = wflags}  #define SND_SOC_DAPM_MUX_E(wname, wreg, wshift, winvert, wcontrols, \  	wevent, wflags) \ -{	.id = snd_soc_dapm_mux, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1, \ +{	.id = snd_soc_dapm_mux, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = 1, \  	.event = wevent, .event_flags = wflags} +/* additional sequencing control within an event type */ +#define SND_SOC_DAPM_PGA_S(wname, wsubseq, wreg, wshift, winvert, \ +	wevent, wflags) \ +{	.id = snd_soc_dapm_pga, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.event = wevent, .event_flags = wflags, \ +	.subseq = wsubseq} +#define SND_SOC_DAPM_SUPPLY_S(wname, wsubseq, wreg, wshift, winvert, wevent, \ +	wflags)	\ +{	.id = snd_soc_dapm_supply, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.event = wevent, .event_flags = wflags, .subseq = wsubseq} +  /* Simplified versions of above macros, assuming wncontrols = ARRAY_SIZE(wcontrols) */  #define SOC_PGA_E_ARRAY(wname, wreg, wshift, winvert, wcontrols, \  	wevent, wflags) \ -{	.id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols), \ +{	.id = snd_soc_dapm_pga, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols), \  	.event = wevent, .event_flags = wflags}  #define SOC_MIXER_E_ARRAY(wname, wreg, wshift, winvert, wcontrols, \  	wevent, wflags) \ -{	.id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols), \ +{	.id = snd_soc_dapm_mixer, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols), \  	.event = wevent, .event_flags = wflags}  #define SOC_MIXER_NAMED_CTL_E_ARRAY(wname, wreg, wshift, winvert, \  	wcontrols, wevent, wflags) \ -{       .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrols = wcontrols, \ -	.num_kcontrols = ARRAY_SIZE(wcontrols), .event = wevent, .event_flags = wflags} +{       .id = snd_soc_dapm_mixer, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.kcontrol_news = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols), \ +	.event = wevent, .event_flags = wflags}  /* events that are pre and post DAPM */  #define SND_SOC_DAPM_PRE(wname, wevent) \ -{	.id = snd_soc_dapm_pre, .name = wname, .kcontrols = NULL, \ -	.num_kcontrols = 0, .event = wevent, \ +{	.id = snd_soc_dapm_pre, .name = wname, .kcontrol_news = NULL, \ +	.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \  	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD}  #define SND_SOC_DAPM_POST(wname, wevent) \ -{	.id = snd_soc_dapm_post, .name = wname, .kcontrols = NULL, \ -	.num_kcontrols = 0, .event = wevent, \ +{	.id = snd_soc_dapm_post, .name = wname, .kcontrol_news = NULL, \ +	.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \  	.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD}  /* stream domain */  #define SND_SOC_DAPM_AIF_IN(wname, stname, wslot, wreg, wshift, winvert) \  {	.id = snd_soc_dapm_aif_in, .name = wname, .sname = stname, \ -	.reg = wreg, .shift = wshift, .invert = winvert } +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), }  #define SND_SOC_DAPM_AIF_IN_E(wname, stname, wslot, wreg, wshift, winvert, \  			      wevent, wflags)				\  {	.id = snd_soc_dapm_aif_in, .name = wname, .sname = stname, \ -	.reg = wreg, .shift = wshift, .invert = winvert, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \  	.event = wevent, .event_flags = wflags }  #define SND_SOC_DAPM_AIF_OUT(wname, stname, wslot, wreg, wshift, winvert) \  {	.id = snd_soc_dapm_aif_out, .name = wname, .sname = stname, \ -	.reg = wreg, .shift = wshift, .invert = winvert } +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), }  #define SND_SOC_DAPM_AIF_OUT_E(wname, stname, wslot, wreg, wshift, winvert, \  			     wevent, wflags)				\  {	.id = snd_soc_dapm_aif_out, .name = wname, .sname = stname, \ -	.reg = wreg, .shift = wshift, .invert = winvert, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \  	.event = wevent, .event_flags = wflags }  #define SND_SOC_DAPM_DAC(wname, stname, wreg, wshift, winvert) \ -{	.id = snd_soc_dapm_dac, .name = wname, .sname = stname, .reg = wreg, \ -	.shift = wshift, .invert = winvert} +{	.id = snd_soc_dapm_dac, .name = wname, .sname = stname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert) }  #define SND_SOC_DAPM_DAC_E(wname, stname, wreg, wshift, winvert, \  			   wevent, wflags)				\ -{	.id = snd_soc_dapm_dac, .name = wname, .sname = stname, .reg = wreg, \ -	.shift = wshift, .invert = winvert, \ +{	.id = snd_soc_dapm_dac, .name = wname, .sname = stname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \  	.event = wevent, .event_flags = wflags} +  #define SND_SOC_DAPM_ADC(wname, stname, wreg, wshift, winvert) \ -{	.id = snd_soc_dapm_adc, .name = wname, .sname = stname, .reg = wreg, \ -	.shift = wshift, .invert = winvert} +{	.id = snd_soc_dapm_adc, .name = wname, .sname = stname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), }  #define SND_SOC_DAPM_ADC_E(wname, stname, wreg, wshift, winvert, \  			   wevent, wflags)				\ -{	.id = snd_soc_dapm_adc, .name = wname, .sname = stname, .reg = wreg, \ -	.shift = wshift, .invert = winvert, \ +{	.id = snd_soc_dapm_adc, .name = wname, .sname = stname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \  	.event = wevent, .event_flags = wflags} +#define SND_SOC_DAPM_CLOCK_SUPPLY(wname) \ +{	.id = snd_soc_dapm_clock_supply, .name = wname, \ +	.reg = SND_SOC_NOPM, .event = dapm_clock_event, \ +	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD }  /* generic widgets */  #define SND_SOC_DAPM_REG(wid, wname, wreg, wshift, wmask, won_val, woff_val) \ -{	.id = wid, .name = wname, .kcontrols = NULL, .num_kcontrols = 0, \ -	.reg = -((wreg) + 1), .shift = wshift, .mask = wmask, \ -	.on_val = won_val, .off_val = woff_val, .event = dapm_reg_event, \ -	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD} +{	.id = wid, .name = wname, .kcontrol_news = NULL, .num_kcontrols = 0, \ +	.reg = wreg, .shift = wshift, .mask = wmask, \ +	.on_val = won_val, .off_val = woff_val, }  #define SND_SOC_DAPM_SUPPLY(wname, wreg, wshift, winvert, wevent, wflags) \ -{	.id = snd_soc_dapm_supply, .name = wname, .reg = wreg,	\ -	.shift = wshift, .invert = winvert, .event = wevent, \ -	.event_flags = wflags} +{	.id = snd_soc_dapm_supply, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ +	.event = wevent, .event_flags = wflags} +#define SND_SOC_DAPM_REGULATOR_SUPPLY(wname, wdelay, wflags)	    \ +{	.id = snd_soc_dapm_regulator_supply, .name = wname, \ +	.reg = SND_SOC_NOPM, .shift = wdelay, .event = dapm_regulator_event, \ +	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD, \ +	.on_val = wflags} +  /* dapm kcontrol types */  #define SOC_DAPM_SINGLE(xname, reg, shift, max, invert) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \  	.info = snd_soc_info_volsw, \  	.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \ -	.private_value =  SOC_SINGLE_VALUE(reg, shift, max, invert) } -#define SOC_DAPM_DOUBLE(xname, reg, shift_left, shift_right, max, invert, \ -	power) \ -{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ +	.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) } +#define SOC_DAPM_SINGLE_AUTODISABLE(xname, reg, shift, max, invert) \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \  	.info = snd_soc_info_volsw, \ - 	.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \ - 	.private_value = (reg) | ((shift_left) << 8) | ((shift_right) << 12) |\ -		((max) << 16) | ((invert) << 24) } +	.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \ +	.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 1) } +#define SOC_DAPM_SINGLE_VIRT(xname, max) \ +	SOC_DAPM_SINGLE(xname, SND_SOC_NOPM, 0, max, 0)  #define SOC_DAPM_SINGLE_TLV(xname, reg, shift, max, invert, tlv_array) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \  	.info = snd_soc_info_volsw, \  	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\  	.tlv.p = (tlv_array), \  	.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \ -	.private_value =  SOC_SINGLE_VALUE(reg, shift, max, invert) } -#define SOC_DAPM_DOUBLE_TLV(xname, reg, shift_left, shift_right, max, invert, \ -	power, tlv_array) \ -{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ +	.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) } +#define SOC_DAPM_SINGLE_TLV_AUTODISABLE(xname, reg, shift, max, invert, tlv_array) \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ +	.info = snd_soc_info_volsw, \  	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\  	.tlv.p = (tlv_array), \ -	.info = snd_soc_info_volsw, \  	.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \ -	.private_value = (reg) | ((shift_left) << 8) | ((shift_right) << 12) |\ -		((max) << 16) | ((invert) << 24) } +	.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) } +#define SOC_DAPM_SINGLE_TLV_VIRT(xname, max, tlv_array) \ +	SOC_DAPM_SINGLE(xname, SND_SOC_NOPM, 0, max, 0, tlv_array)  #define SOC_DAPM_ENUM(xname, xenum) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \  	.info = snd_soc_info_enum_double, \   	.get = snd_soc_dapm_get_enum_double, \   	.put = snd_soc_dapm_put_enum_double, \    	.private_value = (unsigned long)&xenum } -#define SOC_DAPM_ENUM_VIRT(xname, xenum)		    \ -{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ -	.info = snd_soc_info_enum_double, \ -	.get = snd_soc_dapm_get_enum_virt, \ -	.put = snd_soc_dapm_put_enum_virt, \ -	.private_value = (unsigned long)&xenum } -#define SOC_DAPM_VALUE_ENUM(xname, xenum) \ +#define SOC_DAPM_ENUM_EXT(xname, xenum, xget, xput) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \  	.info = snd_soc_info_enum_double, \ -	.get = snd_soc_dapm_get_value_enum_double, \ -	.put = snd_soc_dapm_put_value_enum_double, \ +	.get = xget, \ +	.put = xput, \  	.private_value = (unsigned long)&xenum }  #define SOC_DAPM_PIN_SWITCH(xname) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname " Switch", \ @@ -283,6 +325,8 @@  #define SND_SOC_DAPM_POST_PMD	0x8		/* after widget power down */  #define SND_SOC_DAPM_PRE_REG	0x10	/* before audio path setup */  #define SND_SOC_DAPM_POST_REG	0x20	/* after audio path setup */ +#define SND_SOC_DAPM_WILL_PMU   0x40    /* called at start of sequence */ +#define SND_SOC_DAPM_WILL_PMD   0x80    /* called at start of sequence */  #define SND_SOC_DAPM_PRE_POST_PMD \  				(SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD) @@ -292,14 +336,23 @@  #define SND_SOC_DAPM_EVENT_OFF(e)	\  	(e & (SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD)) +/* regulator widget flags */ +#define SND_SOC_DAPM_REGULATOR_BYPASS     0x1     /* bypass when disabled */ +  struct snd_soc_dapm_widget;  enum snd_soc_dapm_type;  struct snd_soc_dapm_path;  struct snd_soc_dapm_pin;  struct snd_soc_dapm_route; +struct snd_soc_dapm_context; +struct regulator; +struct snd_soc_dapm_widget_list; +struct snd_soc_dapm_update; -int dapm_reg_event(struct snd_soc_dapm_widget *w, -		   struct snd_kcontrol *kcontrol, int event); +int dapm_regulator_event(struct snd_soc_dapm_widget *w, +			 struct snd_kcontrol *kcontrol, int event); +int dapm_clock_event(struct snd_soc_dapm_widget *w, +			 struct snd_kcontrol *kcontrol, int event);  /* dapm controls */  int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol, @@ -310,60 +363,94 @@ int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol);  int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol); -int snd_soc_dapm_get_enum_virt(struct snd_kcontrol *kcontrol, -	struct snd_ctl_elem_value *ucontrol); -int snd_soc_dapm_put_enum_virt(struct snd_kcontrol *kcontrol, -	struct snd_ctl_elem_value *ucontrol); -int snd_soc_dapm_get_value_enum_double(struct snd_kcontrol *kcontrol, -	struct snd_ctl_elem_value *ucontrol); -int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol, -	struct snd_ctl_elem_value *ucontrol);  int snd_soc_dapm_info_pin_switch(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_info *uinfo);  int snd_soc_dapm_get_pin_switch(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *uncontrol);  int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *uncontrol); -int snd_soc_dapm_new_control(struct snd_soc_codec *codec, -	const struct snd_soc_dapm_widget *widget); -int snd_soc_dapm_new_controls(struct snd_soc_codec *codec, +int snd_soc_dapm_new_controls(struct snd_soc_dapm_context *dapm,  	const struct snd_soc_dapm_widget *widget,  	int num); +int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm, +				 struct snd_soc_dai *dai); +int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card); +void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card); +int snd_soc_dapm_new_pcm(struct snd_soc_card *card, +			 const struct snd_soc_pcm_stream *params, +			 struct snd_soc_dapm_widget *source, +			 struct snd_soc_dapm_widget *sink);  /* dapm path setup */ -int snd_soc_dapm_new_widgets(struct snd_soc_codec *codec); -void snd_soc_dapm_free(struct snd_soc_codec *codec); -int snd_soc_dapm_add_routes(struct snd_soc_codec *codec, +int snd_soc_dapm_new_widgets(struct snd_soc_card *card); +void snd_soc_dapm_free(struct snd_soc_dapm_context *dapm); +int snd_soc_dapm_add_routes(struct snd_soc_dapm_context *dapm, +			    const struct snd_soc_dapm_route *route, int num); +int snd_soc_dapm_del_routes(struct snd_soc_dapm_context *dapm,  			    const struct snd_soc_dapm_route *route, int num); +int snd_soc_dapm_weak_routes(struct snd_soc_dapm_context *dapm, +			     const struct snd_soc_dapm_route *route, int num);  /* dapm events */ -int snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, -	const char *stream, int event); +void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream, +	int event);  void snd_soc_dapm_shutdown(struct snd_soc_card *card); +/* external DAPM widget events */ +int snd_soc_dapm_mixer_update_power(struct snd_soc_dapm_context *dapm, +		struct snd_kcontrol *kcontrol, int connect, +		struct snd_soc_dapm_update *update); +int snd_soc_dapm_mux_update_power(struct snd_soc_dapm_context *dapm, +		struct snd_kcontrol *kcontrol, int mux, struct soc_enum *e, +		struct snd_soc_dapm_update *update); +  /* dapm sys fs - used by the core */  int snd_soc_dapm_sys_add(struct device *dev); -void snd_soc_dapm_debugfs_init(struct snd_soc_codec *codec); +void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm, +				struct dentry *parent);  /* dapm audio pin control and status */ -int snd_soc_dapm_enable_pin(struct snd_soc_codec *codec, const char *pin); -int snd_soc_dapm_disable_pin(struct snd_soc_codec *codec, const char *pin); -int snd_soc_dapm_nc_pin(struct snd_soc_codec *codec, const char *pin); -int snd_soc_dapm_get_pin_status(struct snd_soc_codec *codec, const char *pin); -int snd_soc_dapm_sync(struct snd_soc_codec *codec); -int snd_soc_dapm_force_enable_pin(struct snd_soc_codec *codec, +int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, +			    const char *pin); +int snd_soc_dapm_enable_pin_unlocked(struct snd_soc_dapm_context *dapm, +				     const char *pin); +int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm, +			     const char *pin); +int snd_soc_dapm_disable_pin_unlocked(struct snd_soc_dapm_context *dapm, +				      const char *pin); +int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin); +int snd_soc_dapm_nc_pin_unlocked(struct snd_soc_dapm_context *dapm, +				 const char *pin); +int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm, +				const char *pin); +int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm); +int snd_soc_dapm_sync_unlocked(struct snd_soc_dapm_context *dapm); +int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm,  				  const char *pin); -int snd_soc_dapm_ignore_suspend(struct snd_soc_codec *codec, const char *pin); +int snd_soc_dapm_force_enable_pin_unlocked(struct snd_soc_dapm_context *dapm, +					   const char *pin); +int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm, +				const char *pin); +void snd_soc_dapm_auto_nc_codec_pins(struct snd_soc_codec *codec); + +/* Mostly internal - should not normally be used */ +void dapm_mark_io_dirty(struct snd_soc_dapm_context *dapm); + +/* dapm path query */ +int snd_soc_dapm_dai_get_connected_widgets(struct snd_soc_dai *dai, int stream, +	struct snd_soc_dapm_widget_list **list); + +struct snd_soc_codec *snd_soc_dapm_kcontrol_codec(struct snd_kcontrol *kcontrol);  /* dapm widget types */  enum snd_soc_dapm_type {  	snd_soc_dapm_input = 0,		/* input pin */  	snd_soc_dapm_output,		/* output pin */  	snd_soc_dapm_mux,			/* selects 1 analog signal from many inputs */ -	snd_soc_dapm_value_mux,			/* selects 1 analog signal from many inputs */  	snd_soc_dapm_mixer,			/* mixes several analog signals together */  	snd_soc_dapm_mixer_named_ctl,		/* mixer with named controls */  	snd_soc_dapm_pga,			/* programmable gain/attenuation (volume) */ +	snd_soc_dapm_out_drv,			/* output driver */  	snd_soc_dapm_adc,			/* analog to digital converter */  	snd_soc_dapm_dac,			/* digital to analog converter */  	snd_soc_dapm_micbias,		/* microphone bias (power) */ @@ -376,8 +463,20 @@ enum snd_soc_dapm_type {  	snd_soc_dapm_pre,			/* machine specific pre widget - exec first */  	snd_soc_dapm_post,			/* machine specific post widget - exec last */  	snd_soc_dapm_supply,		/* power/clock supply */ +	snd_soc_dapm_regulator_supply,	/* external regulator */ +	snd_soc_dapm_clock_supply,	/* external clock */  	snd_soc_dapm_aif_in,		/* audio interface input */  	snd_soc_dapm_aif_out,		/* audio interface output */ +	snd_soc_dapm_siggen,		/* signal generator */ +	snd_soc_dapm_dai_in,		/* link to DAI structure */ +	snd_soc_dapm_dai_out, +	snd_soc_dapm_dai_link,		/* link between two DAI structures */ +	snd_soc_dapm_kcontrol,		/* Auto-disabled kcontrol */ +}; + +enum snd_soc_dapm_subclass { +	SND_SOC_DAPM_CLASS_INIT		= 0, +	SND_SOC_DAPM_CLASS_RUNTIME	= 1,  };  /* @@ -398,50 +497,57 @@ struct snd_soc_dapm_route {  /* dapm audio path between two widgets */  struct snd_soc_dapm_path { -	char *name; -	char *long_name; +	const char *name;  	/* source (input) and sink (output) widgets */  	struct snd_soc_dapm_widget *source;  	struct snd_soc_dapm_widget *sink; -	struct snd_kcontrol *kcontrol;  	/* status */  	u32 connect:1;	/* source and sink widgets are connected */  	u32 walked:1;	/* path has been walked */ +	u32 walking:1;  /* path is in the process of being walked */ +	u32 weak:1;	/* path ignored for power management */  	int (*connected)(struct snd_soc_dapm_widget *source,  			 struct snd_soc_dapm_widget *sink);  	struct list_head list_source;  	struct list_head list_sink; +	struct list_head list_kcontrol;  	struct list_head list;  };  /* dapm widget */  struct snd_soc_dapm_widget {  	enum snd_soc_dapm_type id; -	char *name;		/* widget name */ -	char *sname;	/* stream name */ +	const char *name;		/* widget name */ +	const char *sname;	/* stream name */  	struct snd_soc_codec *codec; +	struct snd_soc_platform *platform;  	struct list_head list; +	struct snd_soc_dapm_context *dapm; + +	void *priv;				/* widget specific data */ +	struct regulator *regulator;		/* attached regulator */ +	const struct snd_soc_pcm_stream *params; /* params for dai links */  	/* dapm control */ -	short reg;						/* negative reg = no direct dapm */ +	int reg;				/* negative reg = no direct dapm */  	unsigned char shift;			/* bits to shift */ -	unsigned int saved_value;		/* widget saved value */ -	unsigned int value;				/* widget current value */  	unsigned int mask;			/* non-shifted mask */  	unsigned int on_val;			/* on state value */  	unsigned int off_val;			/* off state value */  	unsigned char power:1;			/* block power status */ -	unsigned char invert:1;			/* invert the power bit */  	unsigned char active:1;			/* active stream on DAC, ADC's */  	unsigned char connected:1;		/* connected codec pin */  	unsigned char new:1;			/* cnew complete */  	unsigned char ext:1;			/* has external widgets */  	unsigned char force:1;			/* force state */  	unsigned char ignore_suspend:1;         /* kept enabled over suspend */ +	unsigned char new_power:1;		/* power from this run */ +	unsigned char power_checked:1;		/* power checked this run */ +	int subseq;				/* sort within widget type */  	int (*power_check)(struct snd_soc_dapm_widget *w); @@ -451,7 +557,8 @@ struct snd_soc_dapm_widget {  	/* kcontrols that relate to this widget */  	int num_kcontrols; -	const struct snd_kcontrol_new *kcontrols; +	const struct snd_kcontrol_new *kcontrol_news; +	struct snd_kcontrol **kcontrols;  	/* widget input and outputs */  	struct list_head sources; @@ -459,6 +566,57 @@ struct snd_soc_dapm_widget {  	/* used during DAPM updates */  	struct list_head power_list; +	struct list_head dirty; +	int inputs; +	int outputs; + +	struct clk *clk; +}; + +struct snd_soc_dapm_update { +	struct snd_kcontrol *kcontrol; +	int reg; +	int mask; +	int val; +}; + +/* DAPM context */ +struct snd_soc_dapm_context { +	enum snd_soc_bias_level bias_level; +	enum snd_soc_bias_level suspend_bias_level; +	struct delayed_work delayed_work; +	unsigned int idle_bias_off:1; /* Use BIAS_OFF instead of STANDBY */ + +	void (*seq_notifier)(struct snd_soc_dapm_context *, +			     enum snd_soc_dapm_type, int); + +	struct device *dev; /* from parent - for debug */ +	struct snd_soc_component *component; /* parent component */ +	struct snd_soc_codec *codec; /* parent codec */ +	struct snd_soc_platform *platform; /* parent platform */ +	struct snd_soc_card *card; /* parent card */ + +	/* used during DAPM updates */ +	enum snd_soc_bias_level target_bias_level; +	struct list_head list; + +	int (*stream_event)(struct snd_soc_dapm_context *dapm, int event); + +#ifdef CONFIG_DEBUG_FS +	struct dentry *debugfs_dapm; +#endif +}; + +/* A list of widgets associated with an object, typically a snd_kcontrol */ +struct snd_soc_dapm_widget_list { +	int num_widgets; +	struct snd_soc_dapm_widget *widgets[0]; +}; + +struct snd_soc_dapm_stats { +	int power_checks; +	int path_checks; +	int neighbour_checks;  };  #endif diff --git a/include/sound/soc-dpcm.h b/include/sound/soc-dpcm.h new file mode 100644 index 00000000000..2883a7a6f9f --- /dev/null +++ b/include/sound/soc-dpcm.h @@ -0,0 +1,160 @@ +/* + * linux/sound/soc-dpcm.h -- ALSA SoC Dynamic PCM Support + * + * Author:		Liam Girdwood <lrg@ti.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __LINUX_SND_SOC_DPCM_H +#define __LINUX_SND_SOC_DPCM_H + +#include <linux/slab.h> +#include <linux/list.h> +#include <sound/pcm.h> + +struct snd_soc_pcm_runtime; + +/* + * Types of runtime_update to perform. e.g. originated from FE PCM ops + * or audio route changes triggered by muxes/mixers. + */ +enum snd_soc_dpcm_update { +	SND_SOC_DPCM_UPDATE_NO	= 0, +	SND_SOC_DPCM_UPDATE_BE, +	SND_SOC_DPCM_UPDATE_FE, +}; + +/* + * Dynamic PCM Frontend -> Backend link management states. + */ +enum snd_soc_dpcm_link_state { +	SND_SOC_DPCM_LINK_STATE_NEW	= 0,	/* newly created link */ +	SND_SOC_DPCM_LINK_STATE_FREE,		/* link to be dismantled */ +}; + +/* + * Dynamic PCM Frontend -> Backend link PCM states. + */ +enum snd_soc_dpcm_state { +	SND_SOC_DPCM_STATE_NEW	= 0, +	SND_SOC_DPCM_STATE_OPEN, +	SND_SOC_DPCM_STATE_HW_PARAMS, +	SND_SOC_DPCM_STATE_PREPARE, +	SND_SOC_DPCM_STATE_START, +	SND_SOC_DPCM_STATE_STOP, +	SND_SOC_DPCM_STATE_PAUSED, +	SND_SOC_DPCM_STATE_SUSPEND, +	SND_SOC_DPCM_STATE_HW_FREE, +	SND_SOC_DPCM_STATE_CLOSE, +}; + +/* + * Dynamic PCM trigger ordering. Triggering flexibility is required as some + * DSPs require triggering before/after their CPU platform and DAIs. + * + * i.e. some clients may want to manually order this call in their PCM + * trigger() whilst others will just use the regular core ordering. + */ +enum snd_soc_dpcm_trigger { +	SND_SOC_DPCM_TRIGGER_PRE		= 0, +	SND_SOC_DPCM_TRIGGER_POST, +	SND_SOC_DPCM_TRIGGER_BESPOKE, +}; + +/* + * Dynamic PCM link + * This links together a FE and BE DAI at runtime and stores the link + * state information and the hw_params configuration. + */ +struct snd_soc_dpcm { +	/* FE and BE DAIs*/ +	struct snd_soc_pcm_runtime *be; +	struct snd_soc_pcm_runtime *fe; + +	/* link state */ +	enum snd_soc_dpcm_link_state state; + +	/* list of BE and FE for this DPCM link */ +	struct list_head list_be; +	struct list_head list_fe; + +	/* hw params for this link - may be different for each link */ +	struct snd_pcm_hw_params hw_params; +#ifdef CONFIG_DEBUG_FS +	struct dentry *debugfs_state; +#endif +}; + +/* + * Dynamic PCM runtime data. + */ +struct snd_soc_dpcm_runtime { +	struct list_head be_clients; +	struct list_head fe_clients; + +	int users; +	struct snd_pcm_runtime *runtime; +	struct snd_pcm_hw_params hw_params; + +	/* state and update */ +	enum snd_soc_dpcm_update runtime_update; +	enum snd_soc_dpcm_state state; +}; + +/* can this BE stop and free */ +int snd_soc_dpcm_can_be_free_stop(struct snd_soc_pcm_runtime *fe, +		struct snd_soc_pcm_runtime *be, int stream); + +/* can this BE perform a hw_params() */ +int snd_soc_dpcm_can_be_params(struct snd_soc_pcm_runtime *fe, +		struct snd_soc_pcm_runtime *be, int stream); + +/* is the current PCM operation for this FE ? */ +int snd_soc_dpcm_fe_can_update(struct snd_soc_pcm_runtime *fe, int stream); + +/* is the current PCM operation for this BE ? */ +int snd_soc_dpcm_be_can_update(struct snd_soc_pcm_runtime *fe, +		struct snd_soc_pcm_runtime *be, int stream); + +/* get the substream for this BE */ +struct snd_pcm_substream * +	snd_soc_dpcm_get_substream(struct snd_soc_pcm_runtime *be, int stream); + +/* get the BE runtime state */ +enum snd_soc_dpcm_state +	snd_soc_dpcm_be_get_state(struct snd_soc_pcm_runtime *be, int stream); + +/* set the BE runtime state */ +void snd_soc_dpcm_be_set_state(struct snd_soc_pcm_runtime *be, int stream, +	enum snd_soc_dpcm_state state); + +/* internal use only */ +int soc_dpcm_be_digital_mute(struct snd_soc_pcm_runtime *fe, int mute); +int soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd); +int soc_dpcm_runtime_update(struct snd_soc_card *); + +int dpcm_path_get(struct snd_soc_pcm_runtime *fe, +	int stream, struct snd_soc_dapm_widget_list **list_); +int dpcm_process_paths(struct snd_soc_pcm_runtime *fe, +	int stream, struct snd_soc_dapm_widget_list **list, int new); +int dpcm_be_dai_startup(struct snd_soc_pcm_runtime *fe, int stream); +int dpcm_be_dai_shutdown(struct snd_soc_pcm_runtime *fe, int stream); +void dpcm_be_disconnect(struct snd_soc_pcm_runtime *fe, int stream); +void dpcm_clear_pending_state(struct snd_soc_pcm_runtime *fe, int stream); +int dpcm_be_dai_hw_free(struct snd_soc_pcm_runtime *fe, int stream); +int dpcm_be_dai_hw_params(struct snd_soc_pcm_runtime *fe, int tream); +int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream, int cmd); +int dpcm_be_dai_prepare(struct snd_soc_pcm_runtime *fe, int stream); +int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir, +	int event); + +static inline void dpcm_path_put(struct snd_soc_dapm_widget_list **list) +{ +	kfree(*list); +} + + +#endif diff --git a/include/sound/soc.h b/include/sound/soc.h index 5c3bce83f28..ed9e2d7e5fd 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -13,32 +13,60 @@  #ifndef __LINUX_SND_SOC_H  #define __LINUX_SND_SOC_H +#include <linux/of.h>  #include <linux/platform_device.h>  #include <linux/types.h>  #include <linux/notifier.h>  #include <linux/workqueue.h>  #include <linux/interrupt.h>  #include <linux/kernel.h> +#include <linux/regmap.h> +#include <linux/log2.h>  #include <sound/core.h>  #include <sound/pcm.h> +#include <sound/compress_driver.h>  #include <sound/control.h>  #include <sound/ac97_codec.h>  /*   * Convenience kcontrol builders   */ -#define SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert) \ +#define SOC_DOUBLE_VALUE(xreg, shift_left, shift_right, xmax, xinvert, xautodisable) \  	((unsigned long)&(struct soc_mixer_control) \ -	{.reg = xreg, .shift = xshift, .rshift = xshift, .max = xmax, \ -	.platform_max = xmax, .invert = xinvert}) +	{.reg = xreg, .rreg = xreg, .shift = shift_left, \ +	.rshift = shift_right, .max = xmax, .platform_max = xmax, \ +	.invert = xinvert, .autodisable = xautodisable}) +#define SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert, xautodisable) \ +	SOC_DOUBLE_VALUE(xreg, xshift, xshift, xmax, xinvert, xautodisable)  #define SOC_SINGLE_VALUE_EXT(xreg, xmax, xinvert) \  	((unsigned long)&(struct soc_mixer_control) \  	{.reg = xreg, .max = xmax, .platform_max = xmax, .invert = xinvert}) +#define SOC_DOUBLE_R_VALUE(xlreg, xrreg, xshift, xmax, xinvert) \ +	((unsigned long)&(struct soc_mixer_control) \ +	{.reg = xlreg, .rreg = xrreg, .shift = xshift, .rshift = xshift, \ +	.max = xmax, .platform_max = xmax, .invert = xinvert}) +#define SOC_DOUBLE_R_S_VALUE(xlreg, xrreg, xshift, xmin, xmax, xsign_bit, xinvert) \ +	((unsigned long)&(struct soc_mixer_control) \ +	{.reg = xlreg, .rreg = xrreg, .shift = xshift, .rshift = xshift, \ +	.max = xmax, .min = xmin, .platform_max = xmax, .sign_bit = xsign_bit, \ +	.invert = xinvert}) +#define SOC_DOUBLE_R_RANGE_VALUE(xlreg, xrreg, xshift, xmin, xmax, xinvert) \ +	((unsigned long)&(struct soc_mixer_control) \ +	{.reg = xlreg, .rreg = xrreg, .shift = xshift, .rshift = xshift, \ +	.min = xmin, .max = xmax, .platform_max = xmax, .invert = xinvert})  #define SOC_SINGLE(xname, reg, shift, max, invert) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \  	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\  	.put = snd_soc_put_volsw, \ -	.private_value =  SOC_SINGLE_VALUE(reg, shift, max, invert) } +	.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) } +#define SOC_SINGLE_RANGE(xname, xreg, xshift, xmin, xmax, xinvert) \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\ +	.info = snd_soc_info_volsw_range, .get = snd_soc_get_volsw_range, \ +	.put = snd_soc_put_volsw_range, \ +	.private_value = (unsigned long)&(struct soc_mixer_control) \ +		{.reg = xreg, .rreg = xreg, .shift = xshift, \ +		 .rshift = xshift,  .min = xmin, .max = xmax, \ +		 .platform_max = xmax, .invert = xinvert} }  #define SOC_SINGLE_TLV(xname, reg, shift, max, invert, tlv_array) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \  	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\ @@ -46,41 +74,98 @@  	.tlv.p = (tlv_array), \  	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\  	.put = snd_soc_put_volsw, \ -	.private_value =  SOC_SINGLE_VALUE(reg, shift, max, invert) } -#define SOC_DOUBLE(xname, xreg, shift_left, shift_right, xmax, xinvert) \ +	.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) } +#define SOC_SINGLE_SX_TLV(xname, xreg, xshift, xmin, xmax, tlv_array) \ +{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ +	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ +	SNDRV_CTL_ELEM_ACCESS_READWRITE, \ +	.tlv.p  = (tlv_array),\ +	.info = snd_soc_info_volsw, \ +	.get = snd_soc_get_volsw_sx,\ +	.put = snd_soc_put_volsw_sx, \ +	.private_value = (unsigned long)&(struct soc_mixer_control) \ +		{.reg = xreg, .rreg = xreg, \ +		.shift = xshift, .rshift = xshift, \ +		.max = xmax, .min = xmin} } +#define SOC_SINGLE_RANGE_TLV(xname, xreg, xshift, xmin, xmax, xinvert, tlv_array) \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\ +	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\ +		 SNDRV_CTL_ELEM_ACCESS_READWRITE,\ +	.tlv.p = (tlv_array), \ +	.info = snd_soc_info_volsw_range, \ +	.get = snd_soc_get_volsw_range, .put = snd_soc_put_volsw_range, \ +	.private_value = (unsigned long)&(struct soc_mixer_control) \ +		{.reg = xreg, .rreg = xreg, .shift = xshift, \ +		 .rshift = xshift, .min = xmin, .max = xmax, \ +		 .platform_max = xmax, .invert = xinvert} } +#define SOC_DOUBLE(xname, reg, shift_left, shift_right, max, invert) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\  	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \  	.put = snd_soc_put_volsw, \ -	.private_value = (unsigned long)&(struct soc_mixer_control) \ -		{.reg = xreg, .shift = shift_left, .rshift = shift_right, \ -		 .max = xmax, .platform_max = xmax, .invert = xinvert} } +	.private_value = SOC_DOUBLE_VALUE(reg, shift_left, shift_right, \ +					  max, invert, 0) }  #define SOC_DOUBLE_R(xname, reg_left, reg_right, xshift, xmax, xinvert) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ -	.info = snd_soc_info_volsw_2r, \ -	.get = snd_soc_get_volsw_2r, .put = snd_soc_put_volsw_2r, \ -	.private_value = (unsigned long)&(struct soc_mixer_control) \ -		{.reg = reg_left, .rreg = reg_right, .shift = xshift, \ -		.max = xmax, .platform_max = xmax, .invert = xinvert} } -#define SOC_DOUBLE_TLV(xname, xreg, shift_left, shift_right, xmax, xinvert, tlv_array) \ +	.info = snd_soc_info_volsw, \ +	.get = snd_soc_get_volsw, .put = snd_soc_put_volsw, \ +	.private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \ +					    xmax, xinvert) } +#define SOC_DOUBLE_R_RANGE(xname, reg_left, reg_right, xshift, xmin, \ +			   xmax, xinvert)		\ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\ +	.info = snd_soc_info_volsw_range, \ +	.get = snd_soc_get_volsw_range, .put = snd_soc_put_volsw_range, \ +	.private_value = SOC_DOUBLE_R_RANGE_VALUE(reg_left, reg_right, \ +					    xshift, xmin, xmax, xinvert) } +#define SOC_DOUBLE_TLV(xname, reg, shift_left, shift_right, max, invert, tlv_array) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\  	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\  		 SNDRV_CTL_ELEM_ACCESS_READWRITE,\  	.tlv.p = (tlv_array), \  	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \  	.put = snd_soc_put_volsw, \ -	.private_value = (unsigned long)&(struct soc_mixer_control) \ -		{.reg = xreg, .shift = shift_left, .rshift = shift_right,\ -		 .max = xmax, .platform_max = xmax, .invert = xinvert} } +	.private_value = SOC_DOUBLE_VALUE(reg, shift_left, shift_right, \ +					  max, invert, 0) }  #define SOC_DOUBLE_R_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert, tlv_array) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\  	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\  		 SNDRV_CTL_ELEM_ACCESS_READWRITE,\  	.tlv.p = (tlv_array), \ -	.info = snd_soc_info_volsw_2r, \ -	.get = snd_soc_get_volsw_2r, .put = snd_soc_put_volsw_2r, \ +	.info = snd_soc_info_volsw, \ +	.get = snd_soc_get_volsw, .put = snd_soc_put_volsw, \ +	.private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \ +					    xmax, xinvert) } +#define SOC_DOUBLE_R_RANGE_TLV(xname, reg_left, reg_right, xshift, xmin, \ +			       xmax, xinvert, tlv_array)		\ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\ +	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\ +		 SNDRV_CTL_ELEM_ACCESS_READWRITE,\ +	.tlv.p = (tlv_array), \ +	.info = snd_soc_info_volsw_range, \ +	.get = snd_soc_get_volsw_range, .put = snd_soc_put_volsw_range, \ +	.private_value = SOC_DOUBLE_R_RANGE_VALUE(reg_left, reg_right, \ +					    xshift, xmin, xmax, xinvert) } +#define SOC_DOUBLE_R_SX_TLV(xname, xreg, xrreg, xshift, xmin, xmax, tlv_array) \ +{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ +	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ +	SNDRV_CTL_ELEM_ACCESS_READWRITE, \ +	.tlv.p  = (tlv_array), \ +	.info = snd_soc_info_volsw, \ +	.get = snd_soc_get_volsw_sx, \ +	.put = snd_soc_put_volsw_sx, \  	.private_value = (unsigned long)&(struct soc_mixer_control) \ -		{.reg = reg_left, .rreg = reg_right, .shift = xshift, \ -		.max = xmax, .platform_max = xmax, .invert = xinvert} } +		{.reg = xreg, .rreg = xrreg, \ +		.shift = xshift, .rshift = xshift, \ +		.max = xmax, .min = xmin} } +#define SOC_DOUBLE_R_S_TLV(xname, reg_left, reg_right, xshift, xmin, xmax, xsign_bit, xinvert, tlv_array) \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\ +	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\ +		 SNDRV_CTL_ELEM_ACCESS_READWRITE,\ +	.tlv.p = (tlv_array), \ +	.info = snd_soc_info_volsw, \ +	.get = snd_soc_get_volsw, .put = snd_soc_put_volsw, \ +	.private_value = SOC_DOUBLE_R_S_VALUE(reg_left, reg_right, xshift, \ +					    xmin, xmax, xsign_bit, xinvert) }  #define SOC_DOUBLE_S8_TLV(xname, xreg, xmin, xmax, tlv_array) \  {	.iface  = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \  	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ @@ -91,43 +176,39 @@  	.private_value = (unsigned long)&(struct soc_mixer_control) \  		{.reg = xreg, .min = xmin, .max = xmax, \  		 .platform_max = xmax} } -#define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmax, xtexts) \ +#define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xitems, xtexts) \  {	.reg = xreg, .shift_l = xshift_l, .shift_r = xshift_r, \ -	.max = xmax, .texts = xtexts } -#define SOC_ENUM_SINGLE(xreg, xshift, xmax, xtexts) \ -	SOC_ENUM_DOUBLE(xreg, xshift, xshift, xmax, xtexts) -#define SOC_ENUM_SINGLE_EXT(xmax, xtexts) \ -{	.max = xmax, .texts = xtexts } -#define SOC_VALUE_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xmax, xtexts, xvalues) \ +	.items = xitems, .texts = xtexts, \ +	.mask = xitems ? roundup_pow_of_two(xitems) - 1 : 0} +#define SOC_ENUM_SINGLE(xreg, xshift, xitems, xtexts) \ +	SOC_ENUM_DOUBLE(xreg, xshift, xshift, xitems, xtexts) +#define SOC_ENUM_SINGLE_EXT(xitems, xtexts) \ +{	.items = xitems, .texts = xtexts } +#define SOC_VALUE_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xitems, xtexts, xvalues) \  {	.reg = xreg, .shift_l = xshift_l, .shift_r = xshift_r, \ -	.mask = xmask, .max = xmax, .texts = xtexts, .values = xvalues} -#define SOC_VALUE_ENUM_SINGLE(xreg, xshift, xmask, xmax, xtexts, xvalues) \ -	SOC_VALUE_ENUM_DOUBLE(xreg, xshift, xshift, xmask, xmax, xtexts, xvalues) +	.mask = xmask, .items = xitems, .texts = xtexts, .values = xvalues} +#define SOC_VALUE_ENUM_SINGLE(xreg, xshift, xmask, xnitmes, xtexts, xvalues) \ +	SOC_VALUE_ENUM_DOUBLE(xreg, xshift, xshift, xmask, xnitmes, xtexts, xvalues) +#define SOC_ENUM_SINGLE_VIRT(xitems, xtexts) \ +	SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, xitems, xtexts)  #define SOC_ENUM(xname, xenum) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\  	.info = snd_soc_info_enum_double, \  	.get = snd_soc_get_enum_double, .put = snd_soc_put_enum_double, \  	.private_value = (unsigned long)&xenum } -#define SOC_VALUE_ENUM(xname, xenum) \ -{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\ -	.info = snd_soc_info_enum_double, \ -	.get = snd_soc_get_value_enum_double, \ -	.put = snd_soc_put_value_enum_double, \ -	.private_value = (unsigned long)&xenum }  #define SOC_SINGLE_EXT(xname, xreg, xshift, xmax, xinvert,\  	 xhandler_get, xhandler_put) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \  	.info = snd_soc_info_volsw, \  	.get = xhandler_get, .put = xhandler_put, \ -	.private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert) } -#define SOC_DOUBLE_EXT(xname, xreg, shift_left, shift_right, xmax, xinvert,\ +	.private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert, 0) } +#define SOC_DOUBLE_EXT(xname, reg, shift_left, shift_right, max, invert,\  	 xhandler_get, xhandler_put) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\  	.info = snd_soc_info_volsw, \  	.get = xhandler_get, .put = xhandler_put, \ -	.private_value = (unsigned long)&(struct soc_mixer_control) \ -		{.reg = xreg, .shift = shift_left, .rshift = shift_right, \ -		 .max = xmax, .platform_max = xmax, .invert = xinvert} } +	.private_value = \ +		SOC_DOUBLE_VALUE(reg, shift_left, shift_right, max, invert, 0) }  #define SOC_SINGLE_EXT_TLV(xname, xreg, xshift, xmax, xinvert,\  	 xhandler_get, xhandler_put, tlv_array) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ @@ -136,7 +217,7 @@  	.tlv.p = (tlv_array), \  	.info = snd_soc_info_volsw, \  	.get = xhandler_get, .put = xhandler_put, \ -	.private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert) } +	.private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert, 0) }  #define SOC_DOUBLE_EXT_TLV(xname, xreg, shift_left, shift_right, xmax, xinvert,\  	 xhandler_get, xhandler_put, tlv_array) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ @@ -145,20 +226,18 @@  	.tlv.p = (tlv_array), \  	.info = snd_soc_info_volsw, \  	.get = xhandler_get, .put = xhandler_put, \ -	.private_value = (unsigned long)&(struct soc_mixer_control) \ -		{.reg = xreg, .shift = shift_left, .rshift = shift_right, \ -		.max = xmax, .platform_max = xmax, .invert = xinvert} } +	.private_value = SOC_DOUBLE_VALUE(xreg, shift_left, shift_right, \ +					  xmax, xinvert, 0) }  #define SOC_DOUBLE_R_EXT_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert,\  	 xhandler_get, xhandler_put, tlv_array) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \  	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \  		 SNDRV_CTL_ELEM_ACCESS_READWRITE, \  	.tlv.p = (tlv_array), \ -	.info = snd_soc_info_volsw_2r, \ +	.info = snd_soc_info_volsw, \  	.get = xhandler_get, .put = xhandler_put, \ -	.private_value = (unsigned long)&(struct soc_mixer_control) \ -		{.reg = reg_left, .rreg = reg_right, .shift = xshift, \ -		.max = xmax, .platform_max = xmax, .invert = xinvert} } +	.private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \ +					    xmax, xinvert) }  #define SOC_SINGLE_BOOL_EXT(xname, xdata, xhandler_get, xhandler_put) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \  	.info = snd_soc_info_bool_ext, \ @@ -166,41 +245,73 @@  	.private_value = xdata }  #define SOC_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ -	.info = snd_soc_info_enum_ext, \ +	.info = snd_soc_info_enum_double, \  	.get = xhandler_get, .put = xhandler_put, \  	.private_value = (unsigned long)&xenum } -#define SOC_DOUBLE_R_SX_TLV(xname, xreg_left, xreg_right, xshift,\ -		xmin, xmax, tlv_array) \ +#define SND_SOC_BYTES(xname, xbase, xregs)		      \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,   \ +	.info = snd_soc_bytes_info, .get = snd_soc_bytes_get, \ +	.put = snd_soc_bytes_put, .private_value =	      \ +		((unsigned long)&(struct soc_bytes)           \ +		{.base = xbase, .num_regs = xregs }) } + +#define SND_SOC_BYTES_MASK(xname, xbase, xregs, xmask)	      \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,   \ +	.info = snd_soc_bytes_info, .get = snd_soc_bytes_get, \ +	.put = snd_soc_bytes_put, .private_value =	      \ +		((unsigned long)&(struct soc_bytes)           \ +		{.base = xbase, .num_regs = xregs,	      \ +		 .mask = xmask }) } + +#define SND_SOC_BYTES_EXT(xname, xcount, xhandler_get, xhandler_put) \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ +	.info = snd_soc_bytes_info_ext, \ +	.get = xhandler_get, .put = xhandler_put, \ +	.private_value = (unsigned long)&(struct soc_bytes_ext) \ +		{.max = xcount} } + +#define SOC_SINGLE_XR_SX(xname, xregbase, xregcount, xnbits, \ +		xmin, xmax, xinvert) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ -	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ -		  SNDRV_CTL_ELEM_ACCESS_READWRITE, \ -	.tlv.p = (tlv_array), \ -	.info = snd_soc_info_volsw_2r_sx, \ -	.get = snd_soc_get_volsw_2r_sx, \ -	.put = snd_soc_put_volsw_2r_sx, \ -	.private_value = (unsigned long)&(struct soc_mixer_control) \ -		{.reg = xreg_left, \ -		 .rreg = xreg_right, .shift = xshift, \ -		 .min = xmin, .max = xmax} } +	.info = snd_soc_info_xr_sx, .get = snd_soc_get_xr_sx, \ +	.put = snd_soc_put_xr_sx, \ +	.private_value = (unsigned long)&(struct soc_mreg_control) \ +		{.regbase = xregbase, .regcount = xregcount, .nbits = xnbits, \ +		.invert = xinvert, .min = xmin, .max = xmax} } +#define SOC_SINGLE_STROBE(xname, xreg, xshift, xinvert) \ +	SOC_SINGLE_EXT(xname, xreg, xshift, 1, xinvert, \ +		snd_soc_get_strobe, snd_soc_put_strobe)  /*   * Simplified versions of above macros, declaring a struct and calculating   * ARRAY_SIZE internally   */  #define SOC_ENUM_DOUBLE_DECL(name, xreg, xshift_l, xshift_r, xtexts) \ -	struct soc_enum name = SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, \ +	const struct soc_enum name = SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, \  						ARRAY_SIZE(xtexts), xtexts)  #define SOC_ENUM_SINGLE_DECL(name, xreg, xshift, xtexts) \  	SOC_ENUM_DOUBLE_DECL(name, xreg, xshift, xshift, xtexts)  #define SOC_ENUM_SINGLE_EXT_DECL(name, xtexts) \ -	struct soc_enum name = SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(xtexts), xtexts) +	const struct soc_enum name = SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(xtexts), xtexts)  #define SOC_VALUE_ENUM_DOUBLE_DECL(name, xreg, xshift_l, xshift_r, xmask, xtexts, xvalues) \ -	struct soc_enum name = SOC_VALUE_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, \ +	const struct soc_enum name = SOC_VALUE_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, \  							ARRAY_SIZE(xtexts), xtexts, xvalues)  #define SOC_VALUE_ENUM_SINGLE_DECL(name, xreg, xshift, xmask, xtexts, xvalues) \  	SOC_VALUE_ENUM_DOUBLE_DECL(name, xreg, xshift, xshift, xmask, xtexts, xvalues) +#define SOC_ENUM_SINGLE_VIRT_DECL(name, xtexts) \ +	const struct soc_enum name = SOC_ENUM_SINGLE_VIRT(ARRAY_SIZE(xtexts), xtexts) + +/* + * Component probe and remove ordering levels for components with runtime + * dependencies. + */ +#define SND_SOC_COMP_ORDER_FIRST		-2 +#define SND_SOC_COMP_ORDER_EARLY		-1 +#define SND_SOC_COMP_ORDER_NORMAL		0 +#define SND_SOC_COMP_ORDER_LATE		1 +#define SND_SOC_COMP_ORDER_LAST		2  /*   * Bias levels @@ -214,18 +325,17 @@   * @OFF:     Power Off. No restrictions on transition times.   */  enum snd_soc_bias_level { -	SND_SOC_BIAS_OFF, -	SND_SOC_BIAS_STANDBY, -	SND_SOC_BIAS_PREPARE, -	SND_SOC_BIAS_ON, +	SND_SOC_BIAS_OFF = 0, +	SND_SOC_BIAS_STANDBY = 1, +	SND_SOC_BIAS_PREPARE = 2, +	SND_SOC_BIAS_ON = 3,  }; +struct device_node;  struct snd_jack;  struct snd_soc_card; -struct snd_soc_device;  struct snd_soc_pcm_stream;  struct snd_soc_ops; -struct snd_soc_dai_mode;  struct snd_soc_pcm_runtime;  struct snd_soc_dai;  struct snd_soc_dai_driver; @@ -234,36 +344,84 @@ struct snd_soc_dai_link;  struct snd_soc_platform_driver;  struct snd_soc_codec;  struct snd_soc_codec_driver; +struct snd_soc_component; +struct snd_soc_component_driver;  struct soc_enum; -struct snd_soc_ac97_ops;  struct snd_soc_jack; +struct snd_soc_jack_zone;  struct snd_soc_jack_pin; +#include <sound/soc-dapm.h> +#include <sound/soc-dpcm.h> -#ifdef CONFIG_GPIOLIB  struct snd_soc_jack_gpio; -#endif  typedef int (*hw_write_t)(void *,const char* ,int); -extern struct snd_ac97_bus_ops soc_ac97_ops; +extern struct snd_ac97_bus_ops *soc_ac97_ops; -enum snd_soc_control_type { -	SND_SOC_CUSTOM, -	SND_SOC_I2C, -	SND_SOC_SPI, +enum snd_soc_pcm_subclass { +	SND_SOC_PCM_CLASS_PCM	= 0, +	SND_SOC_PCM_CLASS_BE	= 1,  }; +enum snd_soc_card_subclass { +	SND_SOC_CARD_CLASS_INIT		= 0, +	SND_SOC_CARD_CLASS_RUNTIME	= 1, +}; + +int snd_soc_codec_set_sysclk(struct snd_soc_codec *codec, int clk_id, +			     int source, unsigned int freq, int dir); +int snd_soc_codec_set_pll(struct snd_soc_codec *codec, int pll_id, int source, +			  unsigned int freq_in, unsigned int freq_out); + +int snd_soc_register_card(struct snd_soc_card *card); +int snd_soc_unregister_card(struct snd_soc_card *card); +int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card); +int snd_soc_suspend(struct device *dev); +int snd_soc_resume(struct device *dev); +int snd_soc_poweroff(struct device *dev);  int snd_soc_register_platform(struct device *dev, -		struct snd_soc_platform_driver *platform_drv); +		const struct snd_soc_platform_driver *platform_drv); +int devm_snd_soc_register_platform(struct device *dev, +		const struct snd_soc_platform_driver *platform_drv);  void snd_soc_unregister_platform(struct device *dev); +int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform, +		const struct snd_soc_platform_driver *platform_drv); +void snd_soc_remove_platform(struct snd_soc_platform *platform); +struct snd_soc_platform *snd_soc_lookup_platform(struct device *dev);  int snd_soc_register_codec(struct device *dev, -		struct snd_soc_codec_driver *codec_drv, +		const struct snd_soc_codec_driver *codec_drv,  		struct snd_soc_dai_driver *dai_drv, int num_dai);  void snd_soc_unregister_codec(struct device *dev); -int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, int reg); -int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec, -			       int addr_bits, int data_bits, -			       enum snd_soc_control_type control); +int snd_soc_register_component(struct device *dev, +			 const struct snd_soc_component_driver *cmpnt_drv, +			 struct snd_soc_dai_driver *dai_drv, int num_dai); +int devm_snd_soc_register_component(struct device *dev, +			 const struct snd_soc_component_driver *cmpnt_drv, +			 struct snd_soc_dai_driver *dai_drv, int num_dai); +void snd_soc_unregister_component(struct device *dev); +int snd_soc_cache_sync(struct snd_soc_codec *codec); +int snd_soc_cache_init(struct snd_soc_codec *codec); +int snd_soc_cache_exit(struct snd_soc_codec *codec); +int snd_soc_cache_write(struct snd_soc_codec *codec, +			unsigned int reg, unsigned int value); +int snd_soc_cache_read(struct snd_soc_codec *codec, +		       unsigned int reg, unsigned int *value); +int snd_soc_platform_read(struct snd_soc_platform *platform, +					unsigned int reg); +int snd_soc_platform_write(struct snd_soc_platform *platform, +					unsigned int reg, unsigned int val); +int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num); +int soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num); + +struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card, +		const char *dai_link, int stream); +struct snd_soc_pcm_runtime *snd_soc_get_pcm_runtime(struct snd_soc_card *card, +		const char *dai_link); + +bool snd_soc_runtime_ignore_pmdown_time(struct snd_soc_pcm_runtime *rtd); +void snd_soc_runtime_activate(struct snd_soc_pcm_runtime *rtd, int stream); +void snd_soc_runtime_deactivate(struct snd_soc_pcm_runtime *rtd, int stream);  /* Utility functions to get clock rates from various things */  int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots); @@ -275,6 +433,9 @@ int snd_soc_params_to_bclk(struct snd_pcm_hw_params *parms);  int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,  	const struct snd_pcm_hardware *hw); +int snd_soc_platform_trigger(struct snd_pcm_substream *substream, +		int cmd, struct snd_soc_platform *platform); +  /* Jack reporting */  int snd_soc_jack_new(struct snd_soc_codec *codec, const char *id, int type,  		     struct snd_soc_jack *jack); @@ -285,59 +446,89 @@ void snd_soc_jack_notifier_register(struct snd_soc_jack *jack,  				    struct notifier_block *nb);  void snd_soc_jack_notifier_unregister(struct snd_soc_jack *jack,  				      struct notifier_block *nb); +int snd_soc_jack_add_zones(struct snd_soc_jack *jack, int count, +			  struct snd_soc_jack_zone *zones); +int snd_soc_jack_get_type(struct snd_soc_jack *jack, int micbias_voltage);  #ifdef CONFIG_GPIOLIB  int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,  			struct snd_soc_jack_gpio *gpios); +int snd_soc_jack_add_gpiods(struct device *gpiod_dev, +			    struct snd_soc_jack *jack, +			    int count, struct snd_soc_jack_gpio *gpios);  void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count,  			struct snd_soc_jack_gpio *gpios); +#else +static inline int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count, +					 struct snd_soc_jack_gpio *gpios) +{ +	return 0; +} + +static inline int snd_soc_jack_add_gpiods(struct device *gpiod_dev, +					  struct snd_soc_jack *jack, +					  int count, +					  struct snd_soc_jack_gpio *gpios) +{ +	return 0; +} + +static inline void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count, +					   struct snd_soc_jack_gpio *gpios) +{ +}  #endif  /* codec register bit access */ -int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned short reg, +int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned int reg,  				unsigned int mask, unsigned int value);  int snd_soc_update_bits_locked(struct snd_soc_codec *codec, -			       unsigned short reg, unsigned int mask, +			       unsigned int reg, unsigned int mask,  			       unsigned int value); -int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned short reg, +int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned int reg,  				unsigned int mask, unsigned int value);  int snd_soc_new_ac97_codec(struct snd_soc_codec *codec,  	struct snd_ac97_bus_ops *ops, int num);  void snd_soc_free_ac97_codec(struct snd_soc_codec *codec); +int snd_soc_set_ac97_ops(struct snd_ac97_bus_ops *ops); +int snd_soc_set_ac97_ops_of_reset(struct snd_ac97_bus_ops *ops, +		struct platform_device *pdev); +  /*   *Controls   */  struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template, -	void *data, char *long_name); -int snd_soc_add_controls(struct snd_soc_codec *codec, +				  void *data, const char *long_name, +				  const char *prefix); +struct snd_kcontrol *snd_soc_card_get_kcontrol(struct snd_soc_card *soc_card, +					       const char *name); +int snd_soc_add_codec_controls(struct snd_soc_codec *codec, +	const struct snd_kcontrol_new *controls, int num_controls); +int snd_soc_add_platform_controls(struct snd_soc_platform *platform, +	const struct snd_kcontrol_new *controls, int num_controls); +int snd_soc_add_card_controls(struct snd_soc_card *soc_card, +	const struct snd_kcontrol_new *controls, int num_controls); +int snd_soc_add_dai_controls(struct snd_soc_dai *dai,  	const struct snd_kcontrol_new *controls, int num_controls);  int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_info *uinfo); -int snd_soc_info_enum_ext(struct snd_kcontrol *kcontrol, -	struct snd_ctl_elem_info *uinfo);  int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol);  int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol); -int snd_soc_get_value_enum_double(struct snd_kcontrol *kcontrol, -	struct snd_ctl_elem_value *ucontrol); -int snd_soc_put_value_enum_double(struct snd_kcontrol *kcontrol, -	struct snd_ctl_elem_value *ucontrol);  int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_info *uinfo); -int snd_soc_info_volsw_ext(struct snd_kcontrol *kcontrol, -	struct snd_ctl_elem_info *uinfo);  #define snd_soc_info_bool_ext		snd_ctl_boolean_mono_info  int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol);  int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol); -int snd_soc_info_volsw_2r(struct snd_kcontrol *kcontrol, -	struct snd_ctl_elem_info *uinfo); -int snd_soc_get_volsw_2r(struct snd_kcontrol *kcontrol, +#define snd_soc_get_volsw_2r snd_soc_get_volsw +#define snd_soc_put_volsw_2r snd_soc_put_volsw +int snd_soc_get_volsw_sx(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol); -int snd_soc_put_volsw_2r(struct snd_kcontrol *kcontrol, +int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol);  int snd_soc_info_volsw_s8(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_info *uinfo); @@ -345,13 +536,31 @@ int snd_soc_get_volsw_s8(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol);  int snd_soc_put_volsw_s8(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol); +int snd_soc_info_volsw_range(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_info *uinfo); +int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_value *ucontrol); +int snd_soc_get_volsw_range(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_value *ucontrol);  int snd_soc_limit_volume(struct snd_soc_codec *codec,  	const char *name, int max); -int snd_soc_info_volsw_2r_sx(struct snd_kcontrol *kcontrol, +int snd_soc_bytes_info(struct snd_kcontrol *kcontrol, +		       struct snd_ctl_elem_info *uinfo); +int snd_soc_bytes_get(struct snd_kcontrol *kcontrol, +		      struct snd_ctl_elem_value *ucontrol); +int snd_soc_bytes_put(struct snd_kcontrol *kcontrol, +		      struct snd_ctl_elem_value *ucontrol); +int snd_soc_bytes_info_ext(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_info *ucontrol); +int snd_soc_info_xr_sx(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_info *uinfo); -int snd_soc_get_volsw_2r_sx(struct snd_kcontrol *kcontrol, +int snd_soc_get_xr_sx(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_value *ucontrol); +int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_value *ucontrol); +int snd_soc_get_strobe(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol); -int snd_soc_put_volsw_2r_sx(struct snd_kcontrol *kcontrol, +int snd_soc_put_strobe(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol);  /** @@ -369,34 +578,66 @@ struct snd_soc_jack_pin {  };  /** + * struct snd_soc_jack_zone - Describes voltage zones of jack detection + * + * @min_mv: start voltage in mv + * @max_mv: end voltage in mv + * @jack_type: type of jack that is expected for this voltage + * @debounce_time: debounce_time for jack, codec driver should wait for this + *		duration before reading the adc for voltages + * @:list: list container + */ +struct snd_soc_jack_zone { +	unsigned int min_mv; +	unsigned int max_mv; +	unsigned int jack_type; +	unsigned int debounce_time; +	struct list_head list; +}; + +/**   * struct snd_soc_jack_gpio - Describes a gpio pin for jack detection   * - * @gpio:         gpio number - * @name:         gpio name + * @gpio:         legacy gpio number + * @idx:          gpio descriptor index within the function of the GPIO + *                consumer device + * @gpiod_dev     GPIO consumer device + * @name:         gpio name. Also as connection ID for the GPIO consumer + *                device function name lookup   * @report:       value to report when jack detected   * @invert:       report presence in low state   * @debouce_time: debouce time in ms + * @wake:	  enable as wake source + * @jack_status_check: callback function which overrides the detection + *		       to provide more complex checks (eg, reading an + *		       ADC).   */ -#ifdef CONFIG_GPIOLIB  struct snd_soc_jack_gpio {  	unsigned int gpio; +	unsigned int idx; +	struct device *gpiod_dev;  	const char *name;  	int report;  	int invert;  	int debounce_time; +	bool wake; +  	struct snd_soc_jack *jack;  	struct delayed_work work; +	struct gpio_desc *desc; -	int (*jack_status_check)(void); +	void *data; +	int (*jack_status_check)(void *data);  }; -#endif  struct snd_soc_jack { +	struct mutex mutex;  	struct snd_jack *jack;  	struct snd_soc_codec *codec;  	struct list_head pins;  	int status;  	struct blocking_notifier_head notifier; +	struct list_head jack_zones;  };  /* SoC PCM stream information */ @@ -408,6 +649,7 @@ struct snd_soc_pcm_stream {  	unsigned int rate_max;		/* max rate */  	unsigned int channels_min;	/* min channels */  	unsigned int channels_max;	/* max channels */ +	unsigned int sig_bits;		/* number of bits of content */  };  /* SoC audio ops */ @@ -420,50 +662,90 @@ struct snd_soc_ops {  	int (*trigger)(struct snd_pcm_substream *, int);  }; +struct snd_soc_compr_ops { +	int (*startup)(struct snd_compr_stream *); +	void (*shutdown)(struct snd_compr_stream *); +	int (*set_params)(struct snd_compr_stream *); +	int (*trigger)(struct snd_compr_stream *); +}; + +/* component interface */ +struct snd_soc_component_driver { +	const char *name; + +	/* DT */ +	int (*of_xlate_dai_name)(struct snd_soc_component *component, +				 struct of_phandle_args *args, +				 const char **dai_name); +}; + +struct snd_soc_component { +	const char *name; +	int id; +	struct device *dev; + +	unsigned int active; + +	unsigned int ignore_pmdown_time:1; /* pmdown_time is ignored at stop */ +	unsigned int registered_as_component:1; + +	struct list_head list; + +	struct snd_soc_dai_driver *dai_drv; +	int num_dai; + +	const struct snd_soc_component_driver *driver; + +	struct list_head dai_list; + +	int (*read)(struct snd_soc_component *, unsigned int, unsigned int *); +	int (*write)(struct snd_soc_component *, unsigned int, unsigned int); + +	struct regmap *regmap; +	int val_bytes; + +	struct mutex io_mutex; +}; +  /* SoC Audio Codec device */  struct snd_soc_codec {  	const char *name; +	const char *name_prefix;  	int id;  	struct device *dev; -	struct snd_soc_codec_driver *driver; +	const struct snd_soc_codec_driver *driver;  	struct mutex mutex;  	struct snd_soc_card *card;  	struct list_head list;  	struct list_head card_list; -	int num_dai;  	/* runtime */  	struct snd_ac97 *ac97;  /* for ad-hoc ac97 devices */ -	unsigned int active; -	unsigned int idle_bias_off:1; /* Use BIAS_OFF instead of STANDBY */ -	unsigned int cache_only:1;  /* Suppress writes to hardware */ -	unsigned int cache_sync:1; /* Cache needs to be synced to hardware */ +	unsigned int cache_bypass:1; /* Suppress access to the cache */  	unsigned int suspended:1; /* Codec is in suspend PM state */  	unsigned int probed:1; /* Codec has been probed */  	unsigned int ac97_registered:1; /* Codec has been AC97 registered */  	unsigned int ac97_created:1; /* Codec has been created by SoC */ -	unsigned int sysfs_registered:1; /* codec has been sysfs registered */ +	unsigned int cache_init:1; /* codec cache has been initialized */ +	u32 cache_only;  /* Suppress writes to hardware */ +	u32 cache_sync; /* Cache needs to be synced to hardware */  	/* codec IO */  	void *control_data; /* codec control (i2c/3wire) data */  	hw_write_t hw_write; -	unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int);  	void *reg_cache; +	struct mutex cache_rw_mutex; + +	/* component */ +	struct snd_soc_component component;  	/* dapm */ -	u32 pop_time; -	struct list_head dapm_widgets; -	struct list_head dapm_paths; -	enum snd_soc_bias_level bias_level; -	enum snd_soc_bias_level suspend_bias_level; -	struct delayed_work delayed_work; +	struct snd_soc_dapm_context dapm;  #ifdef CONFIG_DEBUG_FS  	struct dentry *debugfs_codec_root;  	struct dentry *debugfs_reg; -	struct dentry *debugfs_pop_time; -	struct dentry *debugfs_dapm;  #endif  }; @@ -473,18 +755,29 @@ struct snd_soc_codec_driver {  	/* driver ops */  	int (*probe)(struct snd_soc_codec *);  	int (*remove)(struct snd_soc_codec *); -	int (*suspend)(struct snd_soc_codec *, -			pm_message_t state); +	int (*suspend)(struct snd_soc_codec *);  	int (*resume)(struct snd_soc_codec *); +	struct snd_soc_component_driver component_driver; + +	/* Default control and setup, added after probe() is run */ +	const struct snd_kcontrol_new *controls; +	int num_controls; +	const struct snd_soc_dapm_widget *dapm_widgets; +	int num_dapm_widgets; +	const struct snd_soc_dapm_route *dapm_routes; +	int num_dapm_routes; + +	/* codec wide operations */ +	int (*set_sysclk)(struct snd_soc_codec *codec, +			  int clk_id, int source, unsigned int freq, int dir); +	int (*set_pll)(struct snd_soc_codec *codec, int pll_id, int source, +		unsigned int freq_in, unsigned int freq_out);  	/* codec IO */ +	struct regmap *(*get_regmap)(struct device *);  	unsigned int (*read)(struct snd_soc_codec *, unsigned int);  	int (*write)(struct snd_soc_codec *, unsigned int, unsigned int); -	int (*display_register)(struct snd_soc_codec *, char *, -				size_t, unsigned int); -	int (*volatile_register)(unsigned int); -	int (*readable_register)(unsigned int); -	short reg_cache_size; +	unsigned int reg_cache_size;  	short reg_cache_step;  	short reg_word_size;  	const void *reg_cache_default; @@ -492,6 +785,19 @@ struct snd_soc_codec_driver {  	/* codec bias level */  	int (*set_bias_level)(struct snd_soc_codec *,  			      enum snd_soc_bias_level level); +	bool idle_bias_off; + +	void (*seq_notifier)(struct snd_soc_dapm_context *, +			     enum snd_soc_dapm_type, int); + +	/* codec stream completion event */ +	int (*stream_event)(struct snd_soc_dapm_context *dapm, int event); + +	bool ignore_pmdown_time;  /* Doesn't benefit from pmdown delay */ + +	/* probe ordering - for components with runtime dependencies */ +	int probe_order; +	int remove_order;  };  /* SoC platform interface */ @@ -501,12 +807,20 @@ struct snd_soc_platform_driver {  	int (*remove)(struct snd_soc_platform *);  	int (*suspend)(struct snd_soc_dai *dai);  	int (*resume)(struct snd_soc_dai *dai); +	struct snd_soc_component_driver component_driver;  	/* pcm creation and destruction */ -	int (*pcm_new)(struct snd_card *, struct snd_soc_dai *, -		struct snd_pcm *); +	int (*pcm_new)(struct snd_soc_pcm_runtime *);  	void (*pcm_free)(struct snd_pcm *); +	/* Default control and setup, added after probe() is run */ +	const struct snd_kcontrol_new *controls; +	int num_controls; +	const struct snd_soc_dapm_widget *dapm_widgets; +	int num_dapm_widgets; +	const struct snd_soc_dapm_route *dapm_routes; +	int num_dapm_routes; +  	/*  	 * For platform caused delay reporting.  	 * Optional. @@ -514,15 +828,30 @@ struct snd_soc_platform_driver {  	snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *,  		struct snd_soc_dai *); -	/* platform stream ops */ -	struct snd_pcm_ops *ops; +	/* platform stream pcm ops */ +	const struct snd_pcm_ops *ops; + +	/* platform stream compress ops */ +	const struct snd_compr_ops *compr_ops; + +	/* platform stream completion event */ +	int (*stream_event)(struct snd_soc_dapm_context *dapm, int event); + +	/* probe ordering - for components with runtime dependencies */ +	int probe_order; +	int remove_order; + +	/* platform IO - used for platform DAPM */ +	unsigned int (*read)(struct snd_soc_platform *, unsigned int); +	int (*write)(struct snd_soc_platform *, unsigned int, unsigned int); +	int (*bespoke_trigger)(struct snd_pcm_substream *, int);  };  struct snd_soc_platform {  	const char *name;  	int id;  	struct device *dev; -	struct snd_soc_platform_driver *driver; +	const struct snd_soc_platform_driver *driver;  	unsigned int suspended:1; /* platform is suspended */  	unsigned int probed:1; @@ -530,55 +859,156 @@ struct snd_soc_platform {  	struct snd_soc_card *card;  	struct list_head list;  	struct list_head card_list; + +	struct snd_soc_component component; + +	struct snd_soc_dapm_context dapm; + +#ifdef CONFIG_DEBUG_FS +	struct dentry *debugfs_platform_root; +#endif  };  struct snd_soc_dai_link {  	/* config - must be set by machine driver */  	const char *name;			/* Codec name */  	const char *stream_name;		/* Stream name */ -	const char *codec_name;		/* for multi-codec */ -	const char *platform_name;	/* for multi-platform */ +	/* +	 * You MAY specify the link's CPU-side device, either by device name, +	 * or by DT/OF node, but not both. If this information is omitted, +	 * the CPU-side DAI is matched using .cpu_dai_name only, which hence +	 * must be globally unique. These fields are currently typically used +	 * only for codec to codec links, or systems using device tree. +	 */ +	const char *cpu_name; +	const struct device_node *cpu_of_node; +	/* +	 * You MAY specify the DAI name of the CPU DAI. If this information is +	 * omitted, the CPU-side DAI is matched using .cpu_name/.cpu_of_node +	 * only, which only works well when that device exposes a single DAI. +	 */  	const char *cpu_dai_name; +	/* +	 * You MUST specify the link's codec, either by device name, or by +	 * DT/OF node, but not both. +	 */ +	const char *codec_name; +	const struct device_node *codec_of_node; +	/* You MUST specify the DAI name within the codec */  	const char *codec_dai_name; +	/* +	 * You MAY specify the link's platform/PCM/DMA driver, either by +	 * device name, or by DT/OF node, but not both. Some forms of link +	 * do not need a platform. +	 */ +	const char *platform_name; +	const struct device_node *platform_of_node; +	int be_id;	/* optional ID for machine driver BE identification */ + +	const struct snd_soc_pcm_stream *params; + +	unsigned int dai_fmt;           /* format to set on init */ + +	enum snd_soc_dpcm_trigger trigger[2]; /* trigger type for DPCM */  	/* Keep DAI active over suspend */  	unsigned int ignore_suspend:1;  	/* Symmetry requirements */  	unsigned int symmetric_rates:1; +	unsigned int symmetric_channels:1; +	unsigned int symmetric_samplebits:1; + +	/* Do not create a PCM for this DAI link (Backend link) */ +	unsigned int no_pcm:1; + +	/* This DAI link can route to other DAI links at runtime (Frontend)*/ +	unsigned int dynamic:1; + +	/* DPCM capture and Playback support */ +	unsigned int dpcm_capture:1; +	unsigned int dpcm_playback:1; + +	/* pmdown_time is ignored at stop */ +	unsigned int ignore_pmdown_time:1;  	/* codec/machine specific init - e.g. add machine controls */  	int (*init)(struct snd_soc_pcm_runtime *rtd); +	/* optional hw_params re-writing for BE and FE sync */ +	int (*be_hw_params_fixup)(struct snd_soc_pcm_runtime *rtd, +			struct snd_pcm_hw_params *params); +  	/* machine stream operations */ -	struct snd_soc_ops *ops; +	const struct snd_soc_ops *ops; +	const struct snd_soc_compr_ops *compr_ops; + +	/* For unidirectional dai links */ +	bool playback_only; +	bool capture_only; +}; + +struct snd_soc_codec_conf { +	/* +	 * specify device either by device name, or by +	 * DT/OF node, but not both. +	 */ +	const char *dev_name; +	const struct device_node *of_node; + +	/* +	 * optional map of kcontrol, widget and path name prefixes that are +	 * associated per device +	 */ +	const char *name_prefix; +}; + +struct snd_soc_aux_dev { +	const char *name;		/* Codec name */ + +	/* +	 * specify multi-codec either by device name, or by +	 * DT/OF node, but not both. +	 */ +	const char *codec_name; +	const struct device_node *codec_of_node; + +	/* codec/machine specific init - e.g. add machine controls */ +	int (*init)(struct snd_soc_dapm_context *dapm);  };  /* SoC card */  struct snd_soc_card {  	const char *name; +	const char *long_name; +	const char *driver_name;  	struct device *dev;  	struct snd_card *snd_card;  	struct module *owner; -	struct list_head list;  	struct mutex mutex; +	struct mutex dapm_mutex;  	bool instantiated; -	int (*probe)(struct platform_device *pdev); -	int (*remove)(struct platform_device *pdev); +	int (*probe)(struct snd_soc_card *card); +	int (*late_probe)(struct snd_soc_card *card); +	int (*remove)(struct snd_soc_card *card);  	/* the pre and post PM functions are used to do any PM work before and  	 * after the codec and DAI's do any PM work. */ -	int (*suspend_pre)(struct platform_device *pdev, pm_message_t state); -	int (*suspend_post)(struct platform_device *pdev, pm_message_t state); -	int (*resume_pre)(struct platform_device *pdev); -	int (*resume_post)(struct platform_device *pdev); +	int (*suspend_pre)(struct snd_soc_card *card); +	int (*suspend_post)(struct snd_soc_card *card); +	int (*resume_pre)(struct snd_soc_card *card); +	int (*resume_post)(struct snd_soc_card *card);  	/* callbacks */  	int (*set_bias_level)(struct snd_soc_card *, +			      struct snd_soc_dapm_context *dapm,  			      enum snd_soc_bias_level level); +	int (*set_bias_level_post)(struct snd_soc_card *, +				   struct snd_soc_dapm_context *dapm, +				   enum snd_soc_bias_level level);  	long pmdown_time; @@ -588,71 +1018,213 @@ struct snd_soc_card {  	struct snd_soc_pcm_runtime *rtd;  	int num_rtd; +	/* optional codec specific configuration */ +	struct snd_soc_codec_conf *codec_conf; +	int num_configs; + +	/* +	 * optional auxiliary devices such as amplifiers or codecs with DAI +	 * link unused +	 */ +	struct snd_soc_aux_dev *aux_dev; +	int num_aux_devs; +	struct snd_soc_pcm_runtime *rtd_aux; +	int num_aux_rtd; + +	const struct snd_kcontrol_new *controls; +	int num_controls; + +	/* +	 * Card-specific routes and widgets. +	 */ +	const struct snd_soc_dapm_widget *dapm_widgets; +	int num_dapm_widgets; +	const struct snd_soc_dapm_route *dapm_routes; +	int num_dapm_routes; +	bool fully_routed; +  	struct work_struct deferred_resume_work;  	/* lists of probed devices belonging to this card */  	struct list_head codec_dev_list;  	struct list_head platform_dev_list; -	struct list_head dai_dev_list; + +	struct list_head widgets; +	struct list_head paths; +	struct list_head dapm_list; +	struct list_head dapm_dirty; + +	/* Generic DAPM context for the card */ +	struct snd_soc_dapm_context dapm; +	struct snd_soc_dapm_stats dapm_stats; +	struct snd_soc_dapm_update *update; + +#ifdef CONFIG_DEBUG_FS +	struct dentry *debugfs_card_root; +	struct dentry *debugfs_pop_time; +#endif +	u32 pop_time; + +	void *drvdata;  };  /* SoC machine DAI configuration, glues a codec and cpu DAI together */ -struct snd_soc_pcm_runtime  { -	struct device dev; +struct snd_soc_pcm_runtime { +	struct device *dev;  	struct snd_soc_card *card;  	struct snd_soc_dai_link *dai_link; +	struct mutex pcm_mutex; +	enum snd_soc_pcm_subclass pcm_subclass; +	struct snd_pcm_ops ops; -	unsigned int complete:1;  	unsigned int dev_registered:1; -	/* Symmetry data - only valid if symmetry is being enforced */ -	unsigned int rate; +	/* Dynamic PCM BE runtime data */ +	struct snd_soc_dpcm_runtime dpcm[2]; +	int fe_compr; +  	long pmdown_time; +	unsigned char pop_wait:1;  	/* runtime devices */  	struct snd_pcm *pcm; +	struct snd_compr *compr;  	struct snd_soc_codec *codec;  	struct snd_soc_platform *platform;  	struct snd_soc_dai *codec_dai;  	struct snd_soc_dai *cpu_dai;  	struct delayed_work delayed_work; +#ifdef CONFIG_DEBUG_FS +	struct dentry *debugfs_dpcm_root; +	struct dentry *debugfs_dpcm_state; +#endif  };  /* mixer control */  struct soc_mixer_control {  	int min, max, platform_max; -	unsigned int reg, rreg, shift, rshift, invert; +	int reg, rreg; +	unsigned int shift, rshift; +	unsigned int sign_bit; +	unsigned int invert:1; +	unsigned int autodisable:1; +}; + +struct soc_bytes { +	int base; +	int num_regs; +	u32 mask; +}; + +struct soc_bytes_ext { +	int max; +}; + +/* multi register control */ +struct soc_mreg_control { +	long min, max; +	unsigned int regbase, regcount, nbits, invert;  };  /* enumerated kcontrol */  struct soc_enum { -	unsigned short reg; -	unsigned short reg2; +	int reg;  	unsigned char shift_l;  	unsigned char shift_r; -	unsigned int max; +	unsigned int items;  	unsigned int mask; -	const char **texts; +	const char * const *texts;  	const unsigned int *values; -	void *dapm;  }; -/* codec IO */ -static inline unsigned int snd_soc_read(struct snd_soc_codec *codec, -					unsigned int reg) +/** + * snd_soc_component_to_codec() - Casts a component to the CODEC it is embedded in + * @component: The component to cast to a CODEC + * + * This function must only be used on components that are known to be CODECs. + * Otherwise the behavior is undefined. + */ +static inline struct snd_soc_codec *snd_soc_component_to_codec( +	struct snd_soc_component *component) +{ +	return container_of(component, struct snd_soc_codec, component); +} + +/** + * snd_soc_component_to_platform() - Casts a component to the platform it is embedded in + * @component: The component to cast to a platform + * + * This function must only be used on components that are known to be platforms. + * Otherwise the behavior is undefined. + */ +static inline struct snd_soc_platform *snd_soc_component_to_platform( +	struct snd_soc_component *component) +{ +	return container_of(component, struct snd_soc_platform, component); +} + +/** + * snd_soc_dapm_to_codec() - Casts a DAPM context to the CODEC it is embedded in + * @dapm: The DAPM context to cast to the CODEC + * + * This function must only be used on DAPM contexts that are known to be part of + * a CODEC (e.g. in a CODEC driver). Otherwise the behavior is undefined. + */ +static inline struct snd_soc_codec *snd_soc_dapm_to_codec( +	struct snd_soc_dapm_context *dapm)  { -	return codec->driver->read(codec, reg); +	return container_of(dapm, struct snd_soc_codec, dapm);  } -static inline unsigned int snd_soc_write(struct snd_soc_codec *codec, -					 unsigned int reg, unsigned int val) +/** + * snd_soc_dapm_to_platform() - Casts a DAPM context to the platform it is + *  embedded in + * @dapm: The DAPM context to cast to the platform. + * + * This function must only be used on DAPM contexts that are known to be part of + * a platform (e.g. in a platform driver). Otherwise the behavior is undefined. + */ +static inline struct snd_soc_platform *snd_soc_dapm_to_platform( +	struct snd_soc_dapm_context *dapm)  { -	return codec->driver->write(codec, reg, val); +	return container_of(dapm, struct snd_soc_platform, dapm);  } +/* codec IO */ +unsigned int snd_soc_read(struct snd_soc_codec *codec, unsigned int reg); +int snd_soc_write(struct snd_soc_codec *codec, unsigned int reg, +	unsigned int val); + +/* component IO */ +int snd_soc_component_read(struct snd_soc_component *component, +	unsigned int reg, unsigned int *val); +int snd_soc_component_write(struct snd_soc_component *component, +	unsigned int reg, unsigned int val); +int snd_soc_component_update_bits(struct snd_soc_component *component, +	unsigned int reg, unsigned int mask, unsigned int val); +int snd_soc_component_update_bits_async(struct snd_soc_component *component, +	unsigned int reg, unsigned int mask, unsigned int val); +void snd_soc_component_async_complete(struct snd_soc_component *component); +int snd_soc_component_test_bits(struct snd_soc_component *component, +	unsigned int reg, unsigned int mask, unsigned int value); + +int snd_soc_component_init_io(struct snd_soc_component *component, +	struct regmap *regmap); +  /* device driver data */ +static inline void snd_soc_card_set_drvdata(struct snd_soc_card *card, +		void *data) +{ +	card->drvdata = data; +} + +static inline void *snd_soc_card_get_drvdata(struct snd_soc_card *card) +{ +	return card->drvdata; +} +  static inline void snd_soc_codec_set_drvdata(struct snd_soc_codec *codec,  		void *data)  { @@ -678,14 +1250,150 @@ static inline void *snd_soc_platform_get_drvdata(struct snd_soc_platform *platfo  static inline void snd_soc_pcm_set_drvdata(struct snd_soc_pcm_runtime *rtd,  		void *data)  { -	dev_set_drvdata(&rtd->dev, data); +	dev_set_drvdata(rtd->dev, data);  }  static inline void *snd_soc_pcm_get_drvdata(struct snd_soc_pcm_runtime *rtd)  { -	return dev_get_drvdata(&rtd->dev); +	return dev_get_drvdata(rtd->dev); +} + +static inline void snd_soc_initialize_card_lists(struct snd_soc_card *card) +{ +	INIT_LIST_HEAD(&card->codec_dev_list); +	INIT_LIST_HEAD(&card->platform_dev_list); +	INIT_LIST_HEAD(&card->widgets); +	INIT_LIST_HEAD(&card->paths); +	INIT_LIST_HEAD(&card->dapm_list);  } +static inline bool snd_soc_volsw_is_stereo(struct soc_mixer_control *mc) +{ +	if (mc->reg == mc->rreg && mc->shift == mc->rshift) +		return 0; +	/* +	 * mc->reg == mc->rreg && mc->shift != mc->rshift, or +	 * mc->reg != mc->rreg means that the control is +	 * stereo (bits in one register or in two registers) +	 */ +	return 1; +} + +static inline unsigned int snd_soc_enum_val_to_item(struct soc_enum *e, +	unsigned int val) +{ +	unsigned int i; + +	if (!e->values) +		return val; + +	for (i = 0; i < e->items; i++) +		if (val == e->values[i]) +			return i; + +	return 0; +} + +static inline unsigned int snd_soc_enum_item_to_val(struct soc_enum *e, +	unsigned int item) +{ +	if (!e->values) +		return item; + +	return e->values[item]; +} + +static inline bool snd_soc_component_is_active( +	struct snd_soc_component *component) +{ +	return component->active != 0; +} + +static inline bool snd_soc_codec_is_active(struct snd_soc_codec *codec) +{ +	return snd_soc_component_is_active(&codec->component); +} + +/** + * snd_soc_kcontrol_component() - Returns the component that registered the + *  control + * @kcontrol: The control for which to get the component + * + * Note: This function will work correctly if the control has been registered + * for a component. Either with snd_soc_add_codec_controls() or + * snd_soc_add_platform_controls() or via  table based setup for either a + * CODEC, a platform or component driver. Otherwise the behavior is undefined. + */ +static inline struct snd_soc_component *snd_soc_kcontrol_component( +	struct snd_kcontrol *kcontrol) +{ +	return snd_kcontrol_chip(kcontrol); +} + +/** + * snd_soc_kcontrol_codec() - Returns the CODEC that registered the control + * @kcontrol: The control for which to get the CODEC + * + * Note: This function will only work correctly if the control has been + * registered with snd_soc_add_codec_controls() or via table based setup of + * snd_soc_codec_driver. Otherwise the behavior is undefined. + */ +static inline struct snd_soc_codec *snd_soc_kcontrol_codec( +	struct snd_kcontrol *kcontrol) +{ +	return snd_soc_component_to_codec(snd_soc_kcontrol_component(kcontrol)); +} + +/** + * snd_soc_kcontrol_platform() - Returns the platform that registerd the control + * @kcontrol: The control for which to get the platform + * + * Note: This function will only work correctly if the control has been + * registered with snd_soc_add_platform_controls() or via table based setup of + * a snd_soc_platform_driver. Otherwise the behavior is undefined. + */ +static inline struct snd_soc_platform *snd_soc_kcontrol_platform( +	struct snd_kcontrol *kcontrol) +{ +	return snd_soc_component_to_platform(snd_soc_kcontrol_component(kcontrol)); +} + +int snd_soc_util_init(void); +void snd_soc_util_exit(void); + +int snd_soc_of_parse_card_name(struct snd_soc_card *card, +			       const char *propname); +int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card, +					  const char *propname); +int snd_soc_of_parse_tdm_slot(struct device_node *np, +			      unsigned int *slots, +			      unsigned int *slot_width); +int snd_soc_of_parse_audio_routing(struct snd_soc_card *card, +				   const char *propname); +unsigned int snd_soc_of_parse_daifmt(struct device_node *np, +				     const char *prefix, +				     struct device_node **bitclkmaster, +				     struct device_node **framemaster); +int snd_soc_of_get_dai_name(struct device_node *of_node, +			    const char **dai_name); +  #include <sound/soc-dai.h> +#ifdef CONFIG_DEBUG_FS +extern struct dentry *snd_soc_debugfs_root; +#endif + +extern const struct dev_pm_ops snd_soc_pm_ops; + +/* Helper functions */ +static inline void snd_soc_dapm_mutex_lock(struct snd_soc_dapm_context *dapm) +{ +	mutex_lock(&dapm->card->dapm_mutex); +} + +static inline void snd_soc_dapm_mutex_unlock(struct snd_soc_dapm_context *dapm) +{ +	mutex_unlock(&dapm->card->dapm_mutex); +} +  #endif diff --git a/include/sound/soundfont.h b/include/sound/soundfont.h index f95d99ba7f7..7c93efdba90 100644 --- a/include/sound/soundfont.h +++ b/include/sound/soundfont.h @@ -22,8 +22,8 @@   *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   */ -#include "sfnt_info.h" -#include "util_mem.h" +#include <sound/sfnt_info.h> +#include <sound/util_mem.h>  #define SF_MAX_INSTRUMENTS	128	/* maximum instrument number */  #define SF_MAX_PRESETS  256	/* drums are mapped from 128 to 256 */ @@ -121,7 +121,7 @@ int snd_soundfont_search_zone(struct snd_sf_list *sflist, int *notep, int vel,  int snd_sf_calc_parm_hold(int msec);  int snd_sf_calc_parm_attack(int msec);  int snd_sf_calc_parm_decay(int msec); -#define snd_sf_calc_parm_delay(msec) (0x8000 - (msec) * 1000 / 725); +#define snd_sf_calc_parm_delay(msec) (0x8000 - (msec) * 1000 / 725)  extern int snd_sf_vol_table[128];  int snd_sf_linear_to_log(unsigned int amount, int offset, int ratio); diff --git a/include/sound/spear_dma.h b/include/sound/spear_dma.h new file mode 100644 index 00000000000..65aca51fe25 --- /dev/null +++ b/include/sound/spear_dma.h @@ -0,0 +1,34 @@ +/* +* linux/spear_dma.h +* +* Copyright (ST) 2012 Rajeev Kumar (rajeev-dlh.kumar@st.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; either version 2 of the License, or +* (at your option) any later version. +* +* 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 SPEAR_DMA_H +#define SPEAR_DMA_H + +#include <linux/dmaengine.h> + +struct spear_dma_data { +	void *data; +	dma_addr_t addr; +	u32 max_burst; +	enum dma_slave_buswidth addr_width; +}; + +#endif /* SPEAR_DMA_H */ diff --git a/include/sound/spear_spdif.h b/include/sound/spear_spdif.h new file mode 100644 index 00000000000..a12f3969561 --- /dev/null +++ b/include/sound/spear_spdif.h @@ -0,0 +1,29 @@ +/* + * Copyright (ST) 2012 Vipin Kumar (vipin.kumar@st.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; either version 2 of the License, or + * (at your option) any later version. + * + * 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 __SOUND_SPDIF_H +#define __SOUND_SPDIF_H + +struct spear_spdif_platform_data { +	/* DMA params */ +	void *dma_params; +	bool (*filter)(struct dma_chan *chan, void *slave); +	void (*reset_perip)(void); +}; + +#endif /* SOUND_SPDIF_H */ diff --git a/include/sound/sta32x.h b/include/sound/sta32x.h new file mode 100644 index 00000000000..8d93b0357a1 --- /dev/null +++ b/include/sound/sta32x.h @@ -0,0 +1,35 @@ +/* + * Platform data for ST STA32x ASoC codec driver. + * + * Copyright: 2011 Raumfeld GmbH + * Author: Johannes Stezenbach <js@sig21.net> + * + * 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;  either version 2 of the  License, or (at your + * option) any later version. + */ +#ifndef __LINUX_SND__STA32X_H +#define __LINUX_SND__STA32X_H + +#define STA32X_OCFG_2CH		0 +#define STA32X_OCFG_2_1CH	1 +#define STA32X_OCFG_1CH		3 + +#define STA32X_OM_CH1		0 +#define STA32X_OM_CH2		1 +#define STA32X_OM_CH3		2 + +#define STA32X_THERMAL_ADJUSTMENT_ENABLE	1 +#define STA32X_THERMAL_RECOVERY_ENABLE		2 + +struct sta32x_platform_data { +	int output_conf; +	int ch1_output_mapping; +	int ch2_output_mapping; +	int ch3_output_mapping; +	int thermal_conf; +	int needs_esd_watchdog; +}; + +#endif /* __LINUX_SND__STA32X_H */ diff --git a/include/sound/sta350.h b/include/sound/sta350.h new file mode 100644 index 00000000000..42edceb096a --- /dev/null +++ b/include/sound/sta350.h @@ -0,0 +1,57 @@ +/* + * Platform data for ST STA350 ASoC codec driver. + * + * Copyright: 2014 Raumfeld GmbH + * Author: Sven Brandau <info@brandau.biz> + * + * 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;  either version 2 of the  License, or (at your + * option) any later version. + */ +#ifndef __LINUX_SND__STA350_H +#define __LINUX_SND__STA350_H + +#define STA350_OCFG_2CH		0 +#define STA350_OCFG_2_1CH	1 +#define STA350_OCFG_1CH		3 + +#define STA350_OM_CH1		0 +#define STA350_OM_CH2		1 +#define STA350_OM_CH3		2 + +#define STA350_THERMAL_ADJUSTMENT_ENABLE	1 +#define STA350_THERMAL_RECOVERY_ENABLE		2 +#define STA350_FAULT_DETECT_RECOVERY_BYPASS	1 + +#define STA350_FFX_PM_DROP_COMP			0 +#define STA350_FFX_PM_TAPERED_COMP		1 +#define STA350_FFX_PM_FULL_POWER		2 +#define STA350_FFX_PM_VARIABLE_DROP_COMP	3 + + +struct sta350_platform_data { +	u8 output_conf; +	u8 ch1_output_mapping; +	u8 ch2_output_mapping; +	u8 ch3_output_mapping; +	u8 ffx_power_output_mode; +	u8 drop_compensation_ns; +	u8 powerdown_delay_divider; +	unsigned int thermal_warning_recovery:1; +	unsigned int thermal_warning_adjustment:1; +	unsigned int fault_detect_recovery:1; +	unsigned int oc_warning_adjustment:1; +	unsigned int max_power_use_mpcc:1; +	unsigned int max_power_correction:1; +	unsigned int am_reduction_mode:1; +	unsigned int odd_pwm_speed_mode:1; +	unsigned int distortion_compensation:1; +	unsigned int invalid_input_detect_mute:1; +	unsigned int activate_mute_output:1; +	unsigned int bridge_immediate_off:1; +	unsigned int noise_shape_dc_cut:1; +	unsigned int powerdown_master_vol:1; +}; + +#endif /* __LINUX_SND__STA350_H */ diff --git a/include/sound/tas5086.h b/include/sound/tas5086.h new file mode 100644 index 00000000000..aac481b7db8 --- /dev/null +++ b/include/sound/tas5086.h @@ -0,0 +1,7 @@ +#ifndef _SND_SOC_CODEC_TAS5086_H_ +#define _SND_SOC_CODEC_TAS5086_H_ + +#define TAS5086_CLK_IDX_MCLK	0 +#define TAS5086_CLK_IDX_SCLK	1 + +#endif /* _SND_SOC_CODEC_TAS5086_H_ */ diff --git a/include/sound/tea575x-tuner.h b/include/sound/tea575x-tuner.h deleted file mode 100644 index 5718a02d3af..00000000000 --- a/include/sound/tea575x-tuner.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef __SOUND_TEA575X_TUNER_H -#define __SOUND_TEA575X_TUNER_H - -/* - *   ALSA driver for TEA5757/5759 Philips AM/FM tuner chips - * - *	Copyright (c) 2004 Jaroslav Kysela <perex@perex.cz> - * - *   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; either version 2 of the License, or - *   (at your option) any later version. - * - *   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 - * - */ - -#include <linux/videodev2.h> -#include <media/v4l2-dev.h> -#include <media/v4l2-ioctl.h> - -struct snd_tea575x; - -struct snd_tea575x_ops { -	void (*write)(struct snd_tea575x *tea, unsigned int val); -	unsigned int (*read)(struct snd_tea575x *tea); -	void (*mute)(struct snd_tea575x *tea, unsigned int mute); -}; - -struct snd_tea575x { -	struct snd_card *card; -	struct video_device *vd;	/* video device */ -	int dev_nr;			/* requested device number + 1 */ -	int tea5759;			/* 5759 chip is present */ -	int mute;			/* Device is muted? */ -	unsigned int freq_fixup;	/* crystal onboard */ -	unsigned int val;		/* hw value */ -	unsigned long freq;		/* frequency */ -	unsigned long in_use;		/* set if the device is in use */ -	struct snd_tea575x_ops *ops; -	void *private_data; -}; - -void snd_tea575x_init(struct snd_tea575x *tea); -void snd_tea575x_exit(struct snd_tea575x *tea); - -#endif /* __SOUND_TEA575X_TUNER_H */ diff --git a/include/sound/tea6330t.h b/include/sound/tea6330t.h index 51b282b7689..e6beec23d7f 100644 --- a/include/sound/tea6330t.h +++ b/include/sound/tea6330t.h @@ -22,7 +22,7 @@   *   */ -#include "i2c.h"		/* generic i2c support */ +#include <sound/i2c.h>		/* generic i2c support */  int snd_tea6330t_detect(struct snd_i2c_bus *bus, int equalizer);  int snd_tea6330t_update_mixer(struct snd_card *card, struct snd_i2c_bus *bus, diff --git a/include/sound/tlv.h b/include/sound/tlv.h index 7067e2dfb0b..e11e179420a 100644 --- a/include/sound/tlv.h +++ b/include/sound/tlv.h @@ -38,21 +38,31 @@  #define SNDRV_CTL_TLVT_DB_MINMAX 4	/* dB scale with min/max */  #define SNDRV_CTL_TLVT_DB_MINMAX_MUTE 5	/* dB scale with min/max with mute */ +#define TLV_ITEM(type, ...) \ +	(type), TLV_LENGTH(__VA_ARGS__), __VA_ARGS__ +#define TLV_LENGTH(...) \ +	((unsigned int)sizeof((const unsigned int[]) { __VA_ARGS__ })) + +#define TLV_CONTAINER_ITEM(...) \ +	TLV_ITEM(SNDRV_CTL_TLVT_CONTAINER, __VA_ARGS__) +#define DECLARE_TLV_CONTAINER(name, ...) \ +	unsigned int name[] = { TLV_CONTAINER_ITEM(__VA_ARGS__) } +  #define TLV_DB_SCALE_MASK	0xffff  #define TLV_DB_SCALE_MUTE	0x10000  #define TLV_DB_SCALE_ITEM(min, step, mute)			\ -	SNDRV_CTL_TLVT_DB_SCALE, 2 * sizeof(unsigned int),	\ -	(min), ((step) & TLV_DB_SCALE_MASK) | ((mute) ? TLV_DB_SCALE_MUTE : 0) +	TLV_ITEM(SNDRV_CTL_TLVT_DB_SCALE,			\ +		 (min),					\ +		 ((step) & TLV_DB_SCALE_MASK) |		\ +			((mute) ? TLV_DB_SCALE_MUTE : 0))  #define DECLARE_TLV_DB_SCALE(name, min, step, mute) \  	unsigned int name[] = { TLV_DB_SCALE_ITEM(min, step, mute) }  /* dB scale specified with min/max values instead of step */  #define TLV_DB_MINMAX_ITEM(min_dB, max_dB)			\ -	SNDRV_CTL_TLVT_DB_MINMAX, 2 * sizeof(unsigned int),	\ -	(min_dB), (max_dB) +	TLV_ITEM(SNDRV_CTL_TLVT_DB_MINMAX, (min_dB), (max_dB))  #define TLV_DB_MINMAX_MUTE_ITEM(min_dB, max_dB)			\ -	SNDRV_CTL_TLVT_DB_MINMAX_MUTE, 2 * sizeof(unsigned int),	\ -	(min_dB), (max_dB) +	TLV_ITEM(SNDRV_CTL_TLVT_DB_MINMAX_MUTE, (min_dB), (max_dB))  #define DECLARE_TLV_DB_MINMAX(name, min_dB, max_dB) \  	unsigned int name[] = { TLV_DB_MINMAX_ITEM(min_dB, max_dB) }  #define DECLARE_TLV_DB_MINMAX_MUTE(name, min_dB, max_dB) \ @@ -60,17 +70,32 @@  /* linear volume between min_dB and max_dB (.01dB unit) */  #define TLV_DB_LINEAR_ITEM(min_dB, max_dB)		    \ -	SNDRV_CTL_TLVT_DB_LINEAR, 2 * sizeof(unsigned int), \ -	(min_dB), (max_dB) +	TLV_ITEM(SNDRV_CTL_TLVT_DB_LINEAR, (min_dB), (max_dB))  #define DECLARE_TLV_DB_LINEAR(name, min_dB, max_dB)	\  	unsigned int name[] = { TLV_DB_LINEAR_ITEM(min_dB, max_dB) } -/* dB range container */ +/* dB range container: + * Items in dB range container must be ordered by their values and by their + * dB values. This implies that larger values must correspond with larger + * dB values (which is also required for all other mixer controls). + */  /* Each item is: <min> <max> <TLV> */ +#define TLV_DB_RANGE_ITEM(...) \ +	TLV_ITEM(SNDRV_CTL_TLVT_DB_RANGE, __VA_ARGS__) +#define DECLARE_TLV_DB_RANGE(name, ...) \ +	unsigned int name[] = { TLV_DB_RANGE_ITEM(__VA_ARGS__) }  /* The below assumes that each item TLV is 4 words like DB_SCALE or LINEAR */  #define TLV_DB_RANGE_HEAD(num)			\  	SNDRV_CTL_TLVT_DB_RANGE, 6 * (num) * sizeof(unsigned int)  #define TLV_DB_GAIN_MUTE	-9999999 +/* + * channel-mapping TLV items + *  TLV length must match with num_channels + */ +#define SNDRV_CTL_TLVT_CHMAP_FIXED	0x101	/* fixed channel position */ +#define SNDRV_CTL_TLVT_CHMAP_VAR	0x102	/* channels freely swappable */ +#define SNDRV_CTL_TLVT_CHMAP_PAIRED	0x103	/* pair-wise swappable */ +  #endif /* __SOUND_TLV_H */ diff --git a/include/sound/tlv320aic32x4.h b/include/sound/tlv320aic32x4.h new file mode 100644 index 00000000000..24e5d991f14 --- /dev/null +++ b/include/sound/tlv320aic32x4.h @@ -0,0 +1,32 @@ +/* + * tlv320aic32x4.h  --  TLV320AIC32X4 Soc Audio driver platform data + * + * Copyright 2011 Vista Silicon S.L. + * + * Author: Javier Martin <javier.martin@vista-silicon.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _AIC32X4_PDATA_H +#define _AIC32X4_PDATA_H + +#define AIC32X4_PWR_MICBIAS_2075_LDOIN		0x00000001 +#define AIC32X4_PWR_AVDD_DVDD_WEAK_DISABLE	0x00000002 +#define AIC32X4_PWR_AIC32X4_LDO_ENABLE		0x00000004 +#define AIC32X4_PWR_CMMODE_LDOIN_RANGE_18_36	0x00000008 +#define AIC32X4_PWR_CMMODE_HP_LDOIN_POWERED	0x00000010 + +#define AIC32X4_MICPGA_ROUTE_LMIC_IN2R_10K	0x00000001 +#define AIC32X4_MICPGA_ROUTE_RMIC_IN1L_10K	0x00000002 + +struct aic32x4_pdata { +	u32 power_cfg; +	u32 micpga_routing; +	bool swapdacs; +	int rstn_gpio; +}; + +#endif diff --git a/include/sound/tlv320aic3x.h b/include/sound/tlv320aic3x.h index 99e0308bf2c..9407fd00363 100644 --- a/include/sound/tlv320aic3x.h +++ b/include/sound/tlv320aic3x.h @@ -1,7 +1,7 @@  /*   * Platform data for Texas Instruments TLV320AIC3x codec   * - * Author: Jarkko Nikula <jhnikula@gmail.com> + * Author: Jarkko Nikula <jarkko.nikula@bitmer.com>   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License version 2 as @@ -46,6 +46,13 @@ enum {  	AIC3X_GPIO2_FUNC_BUTTON_PRESS_IRQ	= 15  }; +enum aic3x_micbias_voltage { +	AIC3X_MICBIAS_OFF = 0, +	AIC3X_MICBIAS_2_0V = 1, +	AIC3X_MICBIAS_2_5V = 2, +	AIC3X_MICBIAS_AVDDV = 3, +}; +  struct aic3x_setup_data {  	unsigned int gpio_func[2];  }; @@ -53,6 +60,9 @@ struct aic3x_setup_data {  struct aic3x_pdata {  	int gpio_reset; /* < 0 if not used */  	struct aic3x_setup_data *setup; + +	/* Selects the micbias voltage */ +	enum aic3x_micbias_voltage micbias_vg;  };  #endif diff --git a/include/sound/tlv320dac33-plat.h b/include/sound/tlv320dac33-plat.h index 6c664965679..0b94192a8cd 100644 --- a/include/sound/tlv320dac33-plat.h +++ b/include/sound/tlv320dac33-plat.h @@ -1,7 +1,7 @@  /*   * Platform header for Texas Instruments TLV320DAC33 codec driver   * - * Author:	Peter Ujfalusi <peter.ujfalusi@nokia.com> + * Author: Peter Ujfalusi <peter.ujfalusi@ti.com>   *   * Copyright:   (C) 2009 Nokia Corporation   * diff --git a/include/sound/tpa6130a2-plat.h b/include/sound/tpa6130a2-plat.h index e29fde6b5cb..4cc1093844c 100644 --- a/include/sound/tpa6130a2-plat.h +++ b/include/sound/tpa6130a2-plat.h @@ -3,7 +3,7 @@   *   * Copyright (C) Nokia Corporation   * - * Written by Peter Ujfalusi <peter.ujfalusi@nokia.com> + * Author: Peter Ujfalusi <peter.ujfalusi@ti.com>   *   * This program is free software; you can redistribute it and/or   * modify it under the terms of the GNU General Public License @@ -23,13 +23,7 @@  #ifndef TPA6130A2_PLAT_H  #define TPA6130A2_PLAT_H -enum tpa_model { -	TPA6130A2, -	TPA6140A2, -}; -  struct tpa6130a2_platform_data { -	enum tpa_model id;  	int power_gpio;  }; diff --git a/include/sound/trident.h b/include/sound/trident.h deleted file mode 100644 index 9f191a0a1e1..00000000000 --- a/include/sound/trident.h +++ /dev/null @@ -1,445 +0,0 @@ -#ifndef __SOUND_TRIDENT_H -#define __SOUND_TRIDENT_H - -/* - *  audio@tridentmicro.com - *  Fri Feb 19 15:55:28 MST 1999 - *  Definitions for Trident 4DWave DX/NX chips - * - * - *   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; either version 2 of the License, or - *   (at your option) any later version. - * - *   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 - * - */ - -#include "pcm.h" -#include "mpu401.h" -#include "ac97_codec.h" -#include "util_mem.h" - -#define TRIDENT_DEVICE_ID_DX		((PCI_VENDOR_ID_TRIDENT<<16)|PCI_DEVICE_ID_TRIDENT_4DWAVE_DX) -#define TRIDENT_DEVICE_ID_NX		((PCI_VENDOR_ID_TRIDENT<<16)|PCI_DEVICE_ID_TRIDENT_4DWAVE_NX) -#define TRIDENT_DEVICE_ID_SI7018	((PCI_VENDOR_ID_SI<<16)|PCI_DEVICE_ID_SI_7018) - -#define SNDRV_TRIDENT_VOICE_TYPE_PCM		0 -#define SNDRV_TRIDENT_VOICE_TYPE_SYNTH		1 -#define SNDRV_TRIDENT_VOICE_TYPE_MIDI		2 - -#define SNDRV_TRIDENT_VFLG_RUNNING		(1<<0) - -/* TLB code constants */ -#define SNDRV_TRIDENT_PAGE_SIZE			4096 -#define SNDRV_TRIDENT_PAGE_SHIFT			12 -#define SNDRV_TRIDENT_PAGE_MASK			((1<<SNDRV_TRIDENT_PAGE_SHIFT)-1) -#define SNDRV_TRIDENT_MAX_PAGES			4096 - -/* - * Direct registers - */ - -#define TRID_REG(trident, x) ((trident)->port + (x)) - -#define ID_4DWAVE_DX        0x2000 -#define ID_4DWAVE_NX        0x2001 - -/* Bank definitions */ - -#define T4D_BANK_A	0 -#define T4D_BANK_B	1 -#define T4D_NUM_BANKS	2 - -/* Register definitions */ - -/* Global registers */ - -enum global_control_bits { -	CHANNEL_IDX	= 0x0000003f, -	OVERRUN_IE	= 0x00000400,	/* interrupt enable: capture overrun */ -	UNDERRUN_IE	= 0x00000800,	/* interrupt enable: playback underrun */ -	ENDLP_IE	= 0x00001000,	/* interrupt enable: end of buffer */ -	MIDLP_IE	= 0x00002000,	/* interrupt enable: middle buffer */ -	ETOG_IE		= 0x00004000,	/* interrupt enable: envelope toggling */ -	EDROP_IE	= 0x00008000,	/* interrupt enable: envelope drop */ -	BANK_B_EN	= 0x00010000,	/* SiS: enable bank B (64 channels) */ -	PCMIN_B_MIX	= 0x00020000,	/* SiS: PCM IN B mixing enable */ -	I2S_OUT_ASSIGN	= 0x00040000,	/* SiS: I2S Out contains surround PCM */ -	SPDIF_OUT_ASSIGN= 0x00080000,	/* SiS: 0=S/PDIF L/R | 1=PCM Out FIFO */ -	MAIN_OUT_ASSIGN = 0x00100000,	/* SiS: 0=PCM Out FIFO | 1=MMC Out buffer */ -}; - -enum miscint_bits { -	PB_UNDERRUN_IRQ = 0x00000001, REC_OVERRUN_IRQ = 0x00000002, -	SB_IRQ		= 0x00000004, MPU401_IRQ      = 0x00000008, -	OPL3_IRQ        = 0x00000010, ADDRESS_IRQ     = 0x00000020, -	ENVELOPE_IRQ    = 0x00000040, PB_UNDERRUN     = 0x00000100, -	REC_OVERRUN	= 0x00000200, MIXER_UNDERFLOW = 0x00000400, -	MIXER_OVERFLOW  = 0x00000800, NX_SB_IRQ_DISABLE = 0x00001000, -        ST_TARGET_REACHED = 0x00008000, -	PB_24K_MODE     = 0x00010000, ST_IRQ_EN       = 0x00800000, -	ACGPIO_IRQ	= 0x01000000 -}; - -/* T2 legacy dma control registers. */ -#define LEGACY_DMAR0                0x00  // ADR0 -#define LEGACY_DMAR4                0x04  // CNT0 -#define LEGACY_DMAR6		    0x06  // CNT0 - High bits -#define LEGACY_DMAR11               0x0b  // MOD  -#define LEGACY_DMAR15               0x0f  // MMR  - -#define T4D_START_A		     0x80 -#define T4D_STOP_A		     0x84 -#define T4D_DLY_A		     0x88 -#define T4D_SIGN_CSO_A		     0x8c -#define T4D_CSPF_A		     0x90 -#define T4D_CSPF_B		     0xbc -#define T4D_CEBC_A		     0x94 -#define T4D_AINT_A		     0x98 -#define T4D_AINTEN_A		     0x9c -#define T4D_LFO_GC_CIR               0xa0 -#define T4D_MUSICVOL_WAVEVOL         0xa8 -#define T4D_SBDELTA_DELTA_R          0xac -#define T4D_MISCINT                  0xb0 -#define T4D_START_B                  0xb4 -#define T4D_STOP_B                   0xb8 -#define T4D_SBBL_SBCL                0xc0 -#define T4D_SBCTRL_SBE2R_SBDD        0xc4 -#define T4D_STIMER		     0xc8 -#define T4D_AINT_B                   0xd8 -#define T4D_AINTEN_B                 0xdc -#define T4D_RCI                      0x70 - -/* MPU-401 UART */ -#define T4D_MPU401_BASE             0x20 -#define T4D_MPUR0                   0x20 -#define T4D_MPUR1                   0x21 -#define T4D_MPUR2                   0x22 -#define T4D_MPUR3                   0x23 - -/* S/PDIF Registers */ -#define NX_SPCTRL_SPCSO             0x24 -#define NX_SPLBA                    0x28 -#define NX_SPESO                    0x2c -#define NX_SPCSTATUS                0x64 - -/* Joystick */ -#define GAMEPORT_GCR                0x30 -#define GAMEPORT_MODE_ADC           0x80 -#define GAMEPORT_LEGACY             0x31 -#define GAMEPORT_AXES               0x34 - -/* NX Specific Registers */ -#define NX_TLBC                     0x6c - -/* Channel Registers */ - -#define CH_START		    0xe0 - -#define CH_DX_CSO_ALPHA_FMS         0xe0 -#define CH_DX_ESO_DELTA             0xe8 -#define CH_DX_FMC_RVOL_CVOL         0xec - -#define CH_NX_DELTA_CSO             0xe0 -#define CH_NX_DELTA_ESO             0xe8 -#define CH_NX_ALPHA_FMS_FMC_RVOL_CVOL 0xec - -#define CH_LBA                      0xe4 -#define CH_GVSEL_PAN_VOL_CTRL_EC    0xf0 -#define CH_EBUF1                    0xf4 -#define CH_EBUF2                    0xf8 - -/* AC-97 Registers */ - -#define DX_ACR0_AC97_W              0x40 -#define DX_ACR1_AC97_R              0x44 -#define DX_ACR2_AC97_COM_STAT       0x48 - -#define NX_ACR0_AC97_COM_STAT       0x40 -#define NX_ACR1_AC97_W              0x44 -#define NX_ACR2_AC97_R_PRIMARY      0x48 -#define NX_ACR3_AC97_R_SECONDARY    0x4c - -#define SI_AC97_WRITE		    0x40 -#define SI_AC97_READ		    0x44 -#define SI_SERIAL_INTF_CTRL	    0x48 -#define SI_AC97_GPIO		    0x4c -#define SI_ASR0			    0x50 -#define SI_SPDIF_CS		    0x70 -#define SI_GPIO			    0x7c - -enum trident_nx_ac97_bits { -	/* ACR1-3 */ -	NX_AC97_BUSY_WRITE 	= 0x0800, -	NX_AC97_BUSY_READ	= 0x0800, -	NX_AC97_BUSY_DATA 	= 0x0400, -	NX_AC97_WRITE_SECONDARY = 0x0100, -	/* ACR0 */ -	NX_AC97_SECONDARY_READY = 0x0040, -	NX_AC97_SECONDARY_RECORD = 0x0020, -	NX_AC97_SURROUND_OUTPUT = 0x0010, -	NX_AC97_PRIMARY_READY	= 0x0008, -	NX_AC97_PRIMARY_RECORD	= 0x0004, -	NX_AC97_PCM_OUTPUT	= 0x0002, -	NX_AC97_WARM_RESET	= 0x0001 -}; - -enum trident_dx_ac97_bits { -	DX_AC97_BUSY_WRITE	= 0x8000, -	DX_AC97_BUSY_READ	= 0x8000, -	DX_AC97_READY		= 0x0010, -	DX_AC97_RECORD		= 0x0008, -	DX_AC97_PLAYBACK	= 0x0002 -}; - -enum sis7018_ac97_bits { -	SI_AC97_BUSY_WRITE =	0x00008000, -	SI_AC97_AUDIO_BUSY =	0x00004000, -	SI_AC97_MODEM_BUSY =	0x00002000, -	SI_AC97_BUSY_READ =	0x00008000, -	SI_AC97_SECONDARY =	0x00000080, -}; - -enum serial_intf_ctrl_bits { -	WARM_RESET	= 0x00000001, -	COLD_RESET	= 0x00000002, -	I2S_CLOCK	= 0x00000004, -	PCM_SEC_AC97	= 0x00000008, -	AC97_DBL_RATE	= 0x00000010, -	SPDIF_EN	= 0x00000020, -	I2S_OUTPUT_EN	= 0x00000040, -	I2S_INPUT_EN	= 0x00000080, -	PCMIN		= 0x00000100, -	LINE1IN		= 0x00000200, -	MICIN		= 0x00000400, -	LINE2IN		= 0x00000800, -	HEAD_SET_IN	= 0x00001000, -	GPIOIN		= 0x00002000, -	/* 7018 spec says id = 01 but the demo board routed to 10 -	   SECONDARY_ID= 0x00004000, */ -	SECONDARY_ID	= 0x00004000, -	PCMOUT		= 0x00010000, -	SURROUT		= 0x00020000, -	CENTEROUT	= 0x00040000, -	LFEOUT		= 0x00080000, -	LINE1OUT	= 0x00100000, -	LINE2OUT	= 0x00200000, -	GPIOOUT		= 0x00400000, -	SI_AC97_PRIMARY_READY = 0x01000000, -	SI_AC97_SECONDARY_READY = 0x02000000, -	SI_AC97_POWERDOWN = 0x04000000, -}; -                                                                                                                                    -/* PCM defaults */ - -#define T4D_DEFAULT_PCM_VOL	10	/* 0 - 255 */ -#define T4D_DEFAULT_PCM_PAN	0	/* 0 - 127 */ -#define T4D_DEFAULT_PCM_RVOL	127	/* 0 - 127 */ -#define T4D_DEFAULT_PCM_CVOL	127	/* 0 - 127 */ - -struct snd_trident; -struct snd_trident_voice; -struct snd_trident_pcm_mixer; - -struct snd_trident_port { -	struct snd_midi_channel_set * chset; -	struct snd_trident * trident; -	int mode;		/* operation mode */ -	int client;		/* sequencer client number */ -	int port;		/* sequencer port number */ -	unsigned int midi_has_voices: 1; -}; - -struct snd_trident_memblk_arg { -	short first_page, last_page; -}; - -struct snd_trident_tlb { -	unsigned int * entries;		/* 16k-aligned TLB table */ -	dma_addr_t entries_dmaaddr;	/* 16k-aligned PCI address to TLB table */ -	unsigned long * shadow_entries;	/* shadow entries with virtual addresses */ -	struct snd_dma_buffer buffer; -	struct snd_util_memhdr * memhdr;	/* page allocation list */ -	struct snd_dma_buffer silent_page; -}; - -struct snd_trident_voice { -	unsigned int number; -	unsigned int use: 1, -	    pcm: 1, -	    synth:1, -	    midi: 1; -	unsigned int flags; -	unsigned char client; -	unsigned char port; -	unsigned char index; - -	struct snd_trident_sample_ops *sample_ops; - -	/* channel parameters */ -	unsigned int CSO;		/* 24 bits (16 on DX) */ -	unsigned int ESO;		/* 24 bits (16 on DX) */ -	unsigned int LBA;		/* 30 bits */ -	unsigned short EC;		/* 12 bits */ -	unsigned short Alpha;		/* 12 bits */ -	unsigned short Delta;		/* 16 bits */ -	unsigned short Attribute;	/* 16 bits - SiS 7018 */ -	unsigned short Vol;		/* 12 bits (6.6) */ -	unsigned char Pan;		/* 7 bits (1.4.2) */ -	unsigned char GVSel;		/* 1 bit */ -	unsigned char RVol;		/* 7 bits (5.2) */ -	unsigned char CVol;		/* 7 bits (5.2) */ -	unsigned char FMC;		/* 2 bits */ -	unsigned char CTRL;		/* 4 bits */ -	unsigned char FMS;		/* 4 bits */ -	unsigned char LFO;		/* 8 bits */ - -	unsigned int negCSO;	/* nonzero - use negative CSO */ - -	struct snd_util_memblk *memblk;	/* memory block if TLB enabled */ - -	/* PCM data */ - -	struct snd_trident *trident; -	struct snd_pcm_substream *substream; -	struct snd_trident_voice *extra;	/* extra PCM voice (acts as interrupt generator) */ -	unsigned int running: 1, -            capture: 1, -            spdif: 1, -            foldback: 1, -            isync: 1, -            isync2: 1, -            isync3: 1; -	int foldback_chan;		/* foldback subdevice number */ -	unsigned int stimer;		/* global sample timer (to detect spurious interrupts) */ -	unsigned int spurious_threshold; /* spurious threshold */ -	unsigned int isync_mark; -	unsigned int isync_max; -	unsigned int isync_ESO; - -	/* --- */ - -	void *private_data; -	void (*private_free)(struct snd_trident_voice *voice); -}; - -struct snd_4dwave { -	int seq_client; - -	struct snd_trident_port seq_ports[4]; -	struct snd_trident_voice voices[64];	 - -	int ChanSynthCount;		/* number of allocated synth channels */ -	int max_size;			/* maximum synth memory size in bytes */ -	int current_size;		/* current allocated synth mem in bytes */ -}; - -struct snd_trident_pcm_mixer { -	struct snd_trident_voice *voice;	/* active voice */ -	unsigned short vol;		/* front volume */ -	unsigned char pan;		/* pan control */ -	unsigned char rvol;		/* rear volume */ -	unsigned char cvol;		/* center volume */ -	unsigned char pad; -}; - -struct snd_trident { -	int irq; - -	unsigned int device;	/* device ID */ - -        unsigned char  bDMAStart; - -	unsigned long port; -	unsigned long midi_port; - -	unsigned int spurious_irq_count; -	unsigned int spurious_irq_max_delta; - -        struct snd_trident_tlb tlb;	/* TLB entries for NX cards */ - -	unsigned char spdif_ctrl; -	unsigned char spdif_pcm_ctrl; -	unsigned int spdif_bits; -	unsigned int spdif_pcm_bits; -	struct snd_kcontrol *spdif_pcm_ctl;	/* S/PDIF settings */ -	unsigned int ac97_ctrl; -         -        unsigned int ChanMap[2];	/* allocation map for hardware channels */ -         -        int ChanPCM;			/* max number of PCM channels */ -	int ChanPCMcnt;			/* actual number of PCM channels */ - -	unsigned int ac97_detect: 1;	/* 1 = AC97 in detection phase */ -	unsigned int in_suspend: 1;	/* 1 during suspend/resume */ - -	struct snd_4dwave synth;	/* synth specific variables */ - -	spinlock_t event_lock; -	spinlock_t voice_alloc; - -	struct snd_dma_device dma_dev; - -	struct pci_dev *pci; -	struct snd_card *card; -	struct snd_pcm *pcm;		/* ADC/DAC PCM */ -	struct snd_pcm *foldback;	/* Foldback PCM */ -	struct snd_pcm *spdif;	/* SPDIF PCM */ -	struct snd_rawmidi *rmidi; - -	struct snd_ac97_bus *ac97_bus; -	struct snd_ac97 *ac97; -	struct snd_ac97 *ac97_sec; - -	unsigned int musicvol_wavevol; -	struct snd_trident_pcm_mixer pcm_mixer[32]; -	struct snd_kcontrol *ctl_vol;	/* front volume */ -	struct snd_kcontrol *ctl_pan;	/* pan */ -	struct snd_kcontrol *ctl_rvol;	/* rear volume */ -	struct snd_kcontrol *ctl_cvol;	/* center volume */ - -	spinlock_t reg_lock; - -	struct gameport *gameport; -}; - -int snd_trident_create(struct snd_card *card, -		       struct pci_dev *pci, -		       int pcm_streams, -		       int pcm_spdif_device, -		       int max_wavetable_size, -		       struct snd_trident ** rtrident); -int snd_trident_create_gameport(struct snd_trident *trident); - -int snd_trident_pcm(struct snd_trident * trident, int device, struct snd_pcm **rpcm); -int snd_trident_foldback_pcm(struct snd_trident * trident, int device, struct snd_pcm **rpcm); -int snd_trident_spdif_pcm(struct snd_trident * trident, int device, struct snd_pcm **rpcm); -int snd_trident_attach_synthesizer(struct snd_trident * trident); -struct snd_trident_voice *snd_trident_alloc_voice(struct snd_trident * trident, int type, -					     int client, int port); -void snd_trident_free_voice(struct snd_trident * trident, struct snd_trident_voice *voice); -void snd_trident_start_voice(struct snd_trident * trident, unsigned int voice); -void snd_trident_stop_voice(struct snd_trident * trident, unsigned int voice); -void snd_trident_write_voice_regs(struct snd_trident * trident, struct snd_trident_voice *voice); -int snd_trident_suspend(struct pci_dev *pci, pm_message_t state); -int snd_trident_resume(struct pci_dev *pci); - -/* TLB memory allocation */ -struct snd_util_memblk *snd_trident_alloc_pages(struct snd_trident *trident, -						struct snd_pcm_substream *substream); -int snd_trident_free_pages(struct snd_trident *trident, struct snd_util_memblk *blk); -struct snd_util_memblk *snd_trident_synth_alloc(struct snd_trident *trident, unsigned int size); -int snd_trident_synth_free(struct snd_trident *trident, struct snd_util_memblk *blk); -int snd_trident_synth_copy_from_user(struct snd_trident *trident, struct snd_util_memblk *blk, -				     int offset, const char __user *data, int size); - -#endif /* __SOUND_TRIDENT_H */ diff --git a/include/sound/version.h b/include/sound/version.h deleted file mode 100644 index bf69a5b7e65..00000000000 --- a/include/sound/version.h +++ /dev/null @@ -1,3 +0,0 @@ -/* include/version.h */ -#define CONFIG_SND_VERSION "1.0.23" -#define CONFIG_SND_DATE "" diff --git a/include/sound/vx_core.h b/include/sound/vx_core.h index 5456343ebe4..f634f8f85db 100644 --- a/include/sound/vx_core.h +++ b/include/sound/vx_core.h @@ -27,12 +27,6 @@  #include <sound/hwdep.h>  #include <linux/interrupt.h> -#if defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE) -#if !defined(CONFIG_USE_VXLOADER) && !defined(CONFIG_SND_VX_LIB) /* built-in kernel */ -#define SND_VX_FW_LOADER	/* use the standard firmware loader */ -#endif -#endif -  struct firmware;  struct device; @@ -341,7 +335,7 @@ int vx_change_frequency(struct vx_core *chip);  /*   * PM   */ -int snd_vx_suspend(struct vx_core *card, pm_message_t state); +int snd_vx_suspend(struct vx_core *card);  int snd_vx_resume(struct vx_core *card);  /* diff --git a/include/sound/wm0010.h b/include/sound/wm0010.h new file mode 100644 index 00000000000..3261e90815a --- /dev/null +++ b/include/sound/wm0010.h @@ -0,0 +1,27 @@ +/* + * wm0010.h -- Platform data for WM0010 DSP Driver + * + * Copyright 2012 Wolfson Microelectronics PLC. + * + * Author: Dimitris Papastamos <dp@opensource.wolfsonmicro.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;  either version 2 of the  License, or (at your + * option) any later version. + */ + +#ifndef WM0010_PDATA_H +#define WM0010_PDATA_H + +struct wm0010_pdata { +	int gpio_reset; + +	/* Set if there is an inverter between the GPIO controlling +	 * the reset signal and the device. +	 */ +	int reset_active_high; +	int irq_flags; +}; + +#endif diff --git a/include/sound/wm1250-ev1.h b/include/sound/wm1250-ev1.h new file mode 100644 index 00000000000..7dff8283412 --- /dev/null +++ b/include/sound/wm1250-ev1.h @@ -0,0 +1,27 @@ +/* + * linux/sound/wm1250-ev1.h - Platform data for WM1250-EV1 + * + * Copyright 2011 Wolfson Microelectronics. PLC. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __LINUX_SND_WM1250_EV1_H +#define __LINUX_SND_WM1250_EV1_H + +#define WM1250_EV1_NUM_GPIOS 5 + +#define WM1250_EV1_GPIO_CLK_ENA  0 +#define WM1250_EV1_GPIO_CLK_SEL0 1 +#define WM1250_EV1_GPIO_CLK_SEL1 2 +#define WM1250_EV1_GPIO_OSR      3 +#define WM1250_EV1_GPIO_MASTER   4 + + +struct wm1250_ev1_pdata { +	int gpios[WM1250_EV1_NUM_GPIOS]; +}; + +#endif diff --git a/include/sound/wm2000.h b/include/sound/wm2000.h index aa388ca9ec6..4de81f41c90 100644 --- a/include/sound/wm2000.h +++ b/include/sound/wm2000.h @@ -15,9 +15,6 @@ struct wm2000_platform_data {  	/** Filename for system-specific image to download to device. */  	const char *download_file; -	/** Divide MCLK by 2 for system clock? */ -	unsigned int mclkdiv2:1; -  	/** Disable speech clarity enhancement, for use when an  	 * external algorithm is used. */  	unsigned int speech_enh_disable:1; diff --git a/include/sound/wm2200.h b/include/sound/wm2200.h new file mode 100644 index 00000000000..bc7ab1a4b48 --- /dev/null +++ b/include/sound/wm2200.h @@ -0,0 +1,61 @@ +/* + * linux/sound/wm2200.h -- Platform data for WM2200 + * + * Copyright 2012 Wolfson Microelectronics. PLC. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __LINUX_SND_WM2200_H +#define __LINUX_SND_WM2200_H + +#define WM2200_GPIO_SET 0x10000 +#define WM2200_MAX_MICBIAS 2 + +enum wm2200_in_mode { +	WM2200_IN_SE = 0, +	WM2200_IN_DIFF = 1, +	WM2200_IN_DMIC = 2, +}; + +enum wm2200_dmic_sup { +	WM2200_DMIC_SUP_MICVDD = 0, +	WM2200_DMIC_SUP_MICBIAS1 = 1, +	WM2200_DMIC_SUP_MICBIAS2 = 2, +}; + +enum wm2200_mbias_lvl { +	WM2200_MBIAS_LVL_1V5 = 1, +	WM2200_MBIAS_LVL_1V8 = 2, +	WM2200_MBIAS_LVL_1V9 = 3, +	WM2200_MBIAS_LVL_2V0 = 4, +	WM2200_MBIAS_LVL_2V2 = 5, +	WM2200_MBIAS_LVL_2V4 = 6, +	WM2200_MBIAS_LVL_2V5 = 7, +	WM2200_MBIAS_LVL_2V6 = 8, +}; + +struct wm2200_micbias { +	enum wm2200_mbias_lvl mb_lvl;      /** Regulated voltage */ +	unsigned int discharge:1;          /** Actively discharge */ +	unsigned int fast_start:1;         /** Enable aggressive startup ramp rate */ +	unsigned int bypass:1;             /** Use bypass mode */ +}; + +struct wm2200_pdata { +	int reset;      /** GPIO controlling /RESET, if any */ +	int ldo_ena;    /** GPIO controlling LODENA, if any */ +	int irq_flags; + +	int gpio_defaults[4]; + +	enum wm2200_in_mode in_mode[3]; +	enum wm2200_dmic_sup dmic_sup[3]; + +	/** MICBIAS configurations */ +	struct wm2200_micbias micbias[WM2200_MAX_MICBIAS]; +}; + +#endif diff --git a/include/sound/wm5100.h b/include/sound/wm5100.h new file mode 100644 index 00000000000..617d0c4a159 --- /dev/null +++ b/include/sound/wm5100.h @@ -0,0 +1,59 @@ +/* + * linux/sound/wm5100.h -- Platform data for WM5100 + * + * Copyright 2011 Wolfson Microelectronics. PLC. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __LINUX_SND_WM5100_H +#define __LINUX_SND_WM5100_H + +enum wm5100_in_mode { +	WM5100_IN_SE = 0, +	WM5100_IN_DIFF = 1, +	WM5100_IN_DMIC = 2, +}; + +enum wm5100_dmic_sup { +	WM5100_DMIC_SUP_MICVDD = 0, +	WM5100_DMIC_SUP_MICBIAS1 = 1, +	WM5100_DMIC_SUP_MICBIAS2 = 2, +	WM5100_DMIC_SUP_MICBIAS3 = 3, +}; + +enum wm5100_micdet_bias { +	WM5100_MICDET_MICBIAS1 = 0, +	WM5100_MICDET_MICBIAS2 = 1, +	WM5100_MICDET_MICBIAS3 = 2, +}; + +struct wm5100_jack_mode { +	enum wm5100_micdet_bias bias; +	int hp_pol; +	int micd_src; +}; + +#define WM5100_GPIO_SET 0x10000 + +struct wm5100_pdata { +	int reset;      /** GPIO controlling /RESET, if any */ +	int ldo_ena;    /** GPIO controlling LODENA, if any */ +	int hp_pol;     /** GPIO controlling headset polarity, if any */ +	int irq_flags; +	int gpio_base; + +	struct wm5100_jack_mode jack_modes[2]; + +	/* Input pin mode selection */ +	enum wm5100_in_mode in_mode[4]; + +	/* DMIC supply selection */ +	enum wm5100_dmic_sup dmic_sup[4]; + +	int gpio_defaults[6]; +}; + +#endif diff --git a/include/sound/wm8903.h b/include/sound/wm8903.h index b4a0db2307e..b310c5a3a95 100644 --- a/include/sound/wm8903.h +++ b/include/sound/wm8903.h @@ -11,19 +11,18 @@  #ifndef __LINUX_SND_WM8903_H  #define __LINUX_SND_WM8903_H -/* Used to enable configuration of a GPIO to all zeros */ -#define WM8903_GPIO_NO_CONFIG 0x8000 +/* + * Used to enable configuration of a GPIO to all zeros; a gpio_cfg value of + * zero in platform data means "don't touch this pin". + */ +#define WM8903_GPIO_CONFIG_ZERO 0x8000  /*   * R6 (0x06) - Mic Bias Control 0   */ -#define WM8903_MICDET_HYST_ENA                  0x0080  /* MICDET_HYST_ENA */ -#define WM8903_MICDET_HYST_ENA_MASK             0x0080  /* MICDET_HYST_ENA */ -#define WM8903_MICDET_HYST_ENA_SHIFT                 7  /* MICDET_HYST_ENA */ -#define WM8903_MICDET_HYST_ENA_WIDTH                 1  /* MICDET_HYST_ENA */ -#define WM8903_MICDET_THR_MASK                  0x0070  /* MICDET_THR - [6:4] */ -#define WM8903_MICDET_THR_SHIFT                      4  /* MICDET_THR - [6:4] */ -#define WM8903_MICDET_THR_WIDTH                      3  /* MICDET_THR - [6:4] */ +#define WM8903_MICDET_THR_MASK                  0x0030  /* MICDET_THR - [5:4] */ +#define WM8903_MICDET_THR_SHIFT                      4  /* MICDET_THR - [5:4] */ +#define WM8903_MICDET_THR_WIDTH                      2  /* MICDET_THR - [5:4] */  #define WM8903_MICSHORT_THR_MASK                0x000C  /* MICSHORT_THR - [3:2] */  #define WM8903_MICSHORT_THR_SHIFT                    2  /* MICSHORT_THR - [3:2] */  #define WM8903_MICSHORT_THR_WIDTH                    2  /* MICSHORT_THR - [3:2] */ @@ -37,6 +36,21 @@  #define WM8903_MICBIAS_ENA_WIDTH                     1  /* MICBIAS_ENA */  /* + * WM8903_GPn_FN values + * + * See datasheets for list of valid values per pin + */ +#define WM8903_GPn_FN_GPIO_OUTPUT                    0 +#define WM8903_GPn_FN_BCLK                           1 +#define WM8903_GPn_FN_IRQ_OUTPT                      2 +#define WM8903_GPn_FN_GPIO_INPUT                     3 +#define WM8903_GPn_FN_MICBIAS_CURRENT_DETECT         4 +#define WM8903_GPn_FN_MICBIAS_SHORT_DETECT           5 +#define WM8903_GPn_FN_DMIC_LR_CLK_OUTPUT             6 +#define WM8903_GPn_FN_FLL_LOCK_OUTPUT                8 +#define WM8903_GPn_FN_FLL_CLOCK_OUTPUT               9 + +/*   * R116 (0x74) - GPIO Control 1   */  #define WM8903_GP1_FN_MASK                      0x1F00  /* GP1_FN - [12:8] */ @@ -231,6 +245,8 @@  #define WM8903_GP5_DB_SHIFT                          0  /* GP5_DB */  #define WM8903_GP5_DB_WIDTH                          1  /* GP5_DB */ +#define WM8903_NUM_GPIO 5 +  struct wm8903_platform_data {  	bool irq_active_low;   /* Set if IRQ active low, default high */ @@ -243,7 +259,8 @@ struct wm8903_platform_data {  	int micdet_delay;      /* Delay after microphone detection (ms) */ -	u32 gpio_cfg[5];       /* Default register values for GPIO pin mux */ +	int gpio_base; +	u32 gpio_cfg[WM8903_NUM_GPIO]; /* Default register values for GPIO pin mux */  };  #endif diff --git a/include/sound/wm8960.h b/include/sound/wm8960.h index 74e9a95529c..e8ce8ee7d62 100644 --- a/include/sound/wm8960.h +++ b/include/sound/wm8960.h @@ -18,7 +18,7 @@  struct wm8960_data {  	bool capless;  /* Headphone outputs configured in capless mode */ -	int dres;  /* Discharge resistance for headphone outputs */ +	bool shared_lrclk;  /* DAC and ADC LRCLKs are wired together */  };  #endif diff --git a/include/sound/wm8962.h b/include/sound/wm8962.h index 2b5306c503f..79e6d427b85 100644 --- a/include/sound/wm8962.h +++ b/include/sound/wm8962.h @@ -14,6 +14,28 @@  /* Use to set GPIO default values to zero */  #define WM8962_GPIO_SET 0x10000 +#define WM8962_GPIO_FN_CLKOUT           0 +#define WM8962_GPIO_FN_LOGIC            1 +#define WM8962_GPIO_FN_SDOUT            2 +#define WM8962_GPIO_FN_IRQ              3 +#define WM8962_GPIO_FN_THERMAL          4 +#define WM8962_GPIO_FN_PLL2_LOCK        6 +#define WM8962_GPIO_FN_PLL3_LOCK        7 +#define WM8962_GPIO_FN_FLL_LOCK         9 +#define WM8962_GPIO_FN_DRC_ACT         10 +#define WM8962_GPIO_FN_WSEQ_DONE       11 +#define WM8962_GPIO_FN_ALC_NG_ACT      12 +#define WM8962_GPIO_FN_ALC_PEAK_LIMIT  13 +#define WM8962_GPIO_FN_ALC_SATURATION  14 +#define WM8962_GPIO_FN_ALC_LEVEL_THR   15 +#define WM8962_GPIO_FN_ALC_LEVEL_LOCK  16 +#define WM8962_GPIO_FN_FIFO_ERR        17 +#define WM8962_GPIO_FN_OPCLK           18 +#define WM8962_GPIO_FN_DMICCLK         19 +#define WM8962_GPIO_FN_DMICDAT         20 +#define WM8962_GPIO_FN_MICD            21 +#define WM8962_GPIO_FN_MICSCD          22 +  struct wm8962_pdata {  	int gpio_base;  	u32 gpio_init[WM8962_MAX_GPIO]; @@ -27,6 +49,12 @@ struct wm8962_pdata {  	bool irq_active_low;  	bool spk_mono;   /* Speaker outputs tied together as mono */ + +	/** +	 * This flag should be set if one or both IN4 inputs is wired +	 * in a DC measurement configuration. +	 */ +	bool in4_dc_measure;  };  #endif diff --git a/include/sound/wm8993.h b/include/sound/wm8993.h index eee19f63c0d..8016fd826f5 100644 --- a/include/sound/wm8993.h +++ b/include/sound/wm8993.h @@ -32,6 +32,10 @@ struct wm8993_platform_data {  	unsigned int lineout1fb:1;  	unsigned int lineout2fb:1; +	/* Delay to add for microphones to stabalise after power up */ +	int micbias1_delay; +	int micbias2_delay; +  	/* Microphone biases: 0=0.9*AVDD1 1=0.65*AVVD1 */  	unsigned int micbias1_lvl:1;  	unsigned int micbias2_lvl:1; diff --git a/include/sound/wm8996.h b/include/sound/wm8996.h new file mode 100644 index 00000000000..ea4d88f4397 --- /dev/null +++ b/include/sound/wm8996.h @@ -0,0 +1,55 @@ +/* + * linux/sound/wm8996.h -- Platform data for WM8996 + * + * Copyright 2011 Wolfson Microelectronics. PLC. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __LINUX_SND_WM8996_H +#define __LINUX_SND_WM8996_H + +enum wm8996_inmode { +	WM8996_DIFFERRENTIAL_1 = 0,   /* IN1xP - IN1xN */ +	WM8996_INVERTING = 1,         /* IN1xN */ +	WM8996_NON_INVERTING = 2,     /* IN1xP */ +	WM8996_DIFFERENTIAL_2 = 3,    /* IN2xP - IN2xP */ +}; + +/** + * ReTune Mobile configurations are specified with a label, sample + * rate and set of values to write (the enable bits will be ignored). + * + * Configurations are expected to be generated using the ReTune Mobile + * control panel in WISCE - see http://www.wolfsonmicro.com/wisce/ + */ +struct wm8996_retune_mobile_config { +	const char *name; +	int rate; +	u16 regs[20]; +}; + +#define WM8996_SET_DEFAULT 0x10000 + +struct wm8996_pdata { +	int irq_flags;  /** Set IRQ trigger flags; default active low */ + +	int ldo_ena;  /** GPIO for LDO1; -1 for none */ + +	int micdet_def;  /** Default MICDET_SRC/HP1FB_SRC/MICD_BIAS */ + +	enum wm8996_inmode inl_mode; +	enum wm8996_inmode inr_mode; + +	u32 spkmute_seq;  /** Value for register 0x802 */ + +	int gpio_base; +	u32 gpio_default[5]; + +	int num_retune_mobile_cfgs; +	struct wm8996_retune_mobile_config *retune_mobile_cfgs; +}; + +#endif diff --git a/include/sound/wm9081.h b/include/sound/wm9081.h index e173ddbf6bd..f34b0b1716d 100644 --- a/include/sound/wm9081.h +++ b/include/sound/wm9081.h @@ -17,9 +17,12 @@ struct wm9081_retune_mobile_setting {  	u16 config[20];  }; -struct wm9081_retune_mobile_config { -	struct wm9081_retune_mobile_setting *configs; -	int num_configs; +struct wm9081_pdata { +	bool irq_high;   /* IRQ is active high */ +	bool irq_cmos;   /* IRQ is in CMOS mode */ + +	struct wm9081_retune_mobile_setting *retune_configs; +	int num_retune_configs;  };  #endif diff --git a/include/sound/wss.h b/include/sound/wss.h index fd01f22825c..0c7f034f1e8 100644 --- a/include/sound/wss.h +++ b/include/sound/wss.h @@ -22,11 +22,11 @@   *   */ -#include "control.h" -#include "pcm.h" -#include "timer.h" +#include <sound/control.h> +#include <sound/pcm.h> +#include <sound/timer.h> -#include "cs4231-regs.h" +#include <sound/cs4231-regs.h>  /* defines for codec.mode */ diff --git a/include/sound/ymfpci.h b/include/sound/ymfpci.h deleted file mode 100644 index 444cd6ba0ba..00000000000 --- a/include/sound/ymfpci.h +++ /dev/null @@ -1,388 +0,0 @@ -#ifndef __SOUND_YMFPCI_H -#define __SOUND_YMFPCI_H - -/* - *  Copyright (c) by Jaroslav Kysela <perex@perex.cz> - *  Definitions for Yahama YMF724/740/744/754 chips - * - * - *   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; either version 2 of the License, or - *   (at your option) any later version. - * - *   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 - * - */ - -#include "pcm.h" -#include "rawmidi.h" -#include "ac97_codec.h" -#include "timer.h" -#include <linux/gameport.h> - -/* - *  Direct registers - */ - -#define YMFREG(chip, reg)		(chip->port + YDSXGR_##reg) - -#define	YDSXGR_INTFLAG			0x0004 -#define	YDSXGR_ACTIVITY			0x0006 -#define	YDSXGR_GLOBALCTRL		0x0008 -#define	YDSXGR_ZVCTRL			0x000A -#define	YDSXGR_TIMERCTRL		0x0010 -#define	YDSXGR_TIMERCOUNT		0x0012 -#define	YDSXGR_SPDIFOUTCTRL		0x0018 -#define	YDSXGR_SPDIFOUTSTATUS		0x001C -#define	YDSXGR_EEPROMCTRL		0x0020 -#define	YDSXGR_SPDIFINCTRL		0x0034 -#define	YDSXGR_SPDIFINSTATUS		0x0038 -#define	YDSXGR_DSPPROGRAMDL		0x0048 -#define	YDSXGR_DLCNTRL			0x004C -#define	YDSXGR_GPIOININTFLAG		0x0050 -#define	YDSXGR_GPIOININTENABLE		0x0052 -#define	YDSXGR_GPIOINSTATUS		0x0054 -#define	YDSXGR_GPIOOUTCTRL		0x0056 -#define	YDSXGR_GPIOFUNCENABLE		0x0058 -#define	YDSXGR_GPIOTYPECONFIG		0x005A -#define	YDSXGR_AC97CMDDATA		0x0060 -#define	YDSXGR_AC97CMDADR		0x0062 -#define	YDSXGR_PRISTATUSDATA		0x0064 -#define	YDSXGR_PRISTATUSADR		0x0066 -#define	YDSXGR_SECSTATUSDATA		0x0068 -#define	YDSXGR_SECSTATUSADR		0x006A -#define	YDSXGR_SECCONFIG		0x0070 -#define	YDSXGR_LEGACYOUTVOL		0x0080 -#define	YDSXGR_LEGACYOUTVOLL		0x0080 -#define	YDSXGR_LEGACYOUTVOLR		0x0082 -#define	YDSXGR_NATIVEDACOUTVOL		0x0084 -#define	YDSXGR_NATIVEDACOUTVOLL		0x0084 -#define	YDSXGR_NATIVEDACOUTVOLR		0x0086 -#define	YDSXGR_ZVOUTVOL			0x0088 -#define	YDSXGR_ZVOUTVOLL		0x0088 -#define	YDSXGR_ZVOUTVOLR		0x008A -#define	YDSXGR_SECADCOUTVOL		0x008C -#define	YDSXGR_SECADCOUTVOLL		0x008C -#define	YDSXGR_SECADCOUTVOLR		0x008E -#define	YDSXGR_PRIADCOUTVOL		0x0090 -#define	YDSXGR_PRIADCOUTVOLL		0x0090 -#define	YDSXGR_PRIADCOUTVOLR		0x0092 -#define	YDSXGR_LEGACYLOOPVOL		0x0094 -#define	YDSXGR_LEGACYLOOPVOLL		0x0094 -#define	YDSXGR_LEGACYLOOPVOLR		0x0096 -#define	YDSXGR_NATIVEDACLOOPVOL		0x0098 -#define	YDSXGR_NATIVEDACLOOPVOLL	0x0098 -#define	YDSXGR_NATIVEDACLOOPVOLR	0x009A -#define	YDSXGR_ZVLOOPVOL		0x009C -#define	YDSXGR_ZVLOOPVOLL		0x009E -#define	YDSXGR_ZVLOOPVOLR		0x009E -#define	YDSXGR_SECADCLOOPVOL		0x00A0 -#define	YDSXGR_SECADCLOOPVOLL		0x00A0 -#define	YDSXGR_SECADCLOOPVOLR		0x00A2 -#define	YDSXGR_PRIADCLOOPVOL		0x00A4 -#define	YDSXGR_PRIADCLOOPVOLL		0x00A4 -#define	YDSXGR_PRIADCLOOPVOLR		0x00A6 -#define	YDSXGR_NATIVEADCINVOL		0x00A8 -#define	YDSXGR_NATIVEADCINVOLL		0x00A8 -#define	YDSXGR_NATIVEADCINVOLR		0x00AA -#define	YDSXGR_NATIVEDACINVOL		0x00AC -#define	YDSXGR_NATIVEDACINVOLL		0x00AC -#define	YDSXGR_NATIVEDACINVOLR		0x00AE -#define	YDSXGR_BUF441OUTVOL		0x00B0 -#define	YDSXGR_BUF441OUTVOLL		0x00B0 -#define	YDSXGR_BUF441OUTVOLR		0x00B2 -#define	YDSXGR_BUF441LOOPVOL		0x00B4 -#define	YDSXGR_BUF441LOOPVOLL		0x00B4 -#define	YDSXGR_BUF441LOOPVOLR		0x00B6 -#define	YDSXGR_SPDIFOUTVOL		0x00B8 -#define	YDSXGR_SPDIFOUTVOLL		0x00B8 -#define	YDSXGR_SPDIFOUTVOLR		0x00BA -#define	YDSXGR_SPDIFLOOPVOL		0x00BC -#define	YDSXGR_SPDIFLOOPVOLL		0x00BC -#define	YDSXGR_SPDIFLOOPVOLR		0x00BE -#define	YDSXGR_ADCSLOTSR		0x00C0 -#define	YDSXGR_RECSLOTSR		0x00C4 -#define	YDSXGR_ADCFORMAT		0x00C8 -#define	YDSXGR_RECFORMAT		0x00CC -#define	YDSXGR_P44SLOTSR		0x00D0 -#define	YDSXGR_STATUS			0x0100 -#define	YDSXGR_CTRLSELECT		0x0104 -#define	YDSXGR_MODE			0x0108 -#define	YDSXGR_SAMPLECOUNT		0x010C -#define	YDSXGR_NUMOFSAMPLES		0x0110 -#define	YDSXGR_CONFIG			0x0114 -#define	YDSXGR_PLAYCTRLSIZE		0x0140 -#define	YDSXGR_RECCTRLSIZE		0x0144 -#define	YDSXGR_EFFCTRLSIZE		0x0148 -#define	YDSXGR_WORKSIZE			0x014C -#define	YDSXGR_MAPOFREC			0x0150 -#define	YDSXGR_MAPOFEFFECT		0x0154 -#define	YDSXGR_PLAYCTRLBASE		0x0158 -#define	YDSXGR_RECCTRLBASE		0x015C -#define	YDSXGR_EFFCTRLBASE		0x0160 -#define	YDSXGR_WORKBASE			0x0164 -#define	YDSXGR_DSPINSTRAM		0x1000 -#define	YDSXGR_CTRLINSTRAM		0x4000 - -#define YDSXG_AC97READCMD		0x8000 -#define YDSXG_AC97WRITECMD		0x0000 - -#define PCIR_DSXG_LEGACY		0x40 -#define PCIR_DSXG_ELEGACY		0x42 -#define PCIR_DSXG_CTRL			0x48 -#define PCIR_DSXG_PWRCTRL1		0x4a -#define PCIR_DSXG_PWRCTRL2		0x4e -#define PCIR_DSXG_FMBASE		0x60 -#define PCIR_DSXG_SBBASE		0x62 -#define PCIR_DSXG_MPU401BASE		0x64 -#define PCIR_DSXG_JOYBASE		0x66 - -#define YDSXG_DSPLENGTH			0x0080 -#define YDSXG_CTRLLENGTH		0x3000 - -#define YDSXG_DEFAULT_WORK_SIZE		0x0400 - -#define YDSXG_PLAYBACK_VOICES		64 -#define YDSXG_CAPTURE_VOICES		2 -#define YDSXG_EFFECT_VOICES		5 - -#define YMFPCI_LEGACY_SBEN	(1 << 0)	/* soundblaster enable */ -#define YMFPCI_LEGACY_FMEN	(1 << 1)	/* OPL3 enable */ -#define YMFPCI_LEGACY_JPEN	(1 << 2)	/* joystick enable */ -#define YMFPCI_LEGACY_MEN	(1 << 3)	/* MPU401 enable */ -#define YMFPCI_LEGACY_MIEN	(1 << 4)	/* MPU RX irq enable */ -#define YMFPCI_LEGACY_IOBITS	(1 << 5)	/* i/o bits range, 0 = 16bit, 1 =10bit */ -#define YMFPCI_LEGACY_SDMA	(3 << 6)	/* SB DMA select */ -#define YMFPCI_LEGACY_SBIRQ	(7 << 8)	/* SB IRQ select */ -#define YMFPCI_LEGACY_MPUIRQ	(7 << 11)	/* MPU IRQ select */ -#define YMFPCI_LEGACY_SIEN	(1 << 14)	/* serialized IRQ */ -#define YMFPCI_LEGACY_LAD	(1 << 15)	/* legacy audio disable */ - -#define YMFPCI_LEGACY2_FMIO	(3 << 0)	/* OPL3 i/o address (724/740) */ -#define YMFPCI_LEGACY2_SBIO	(3 << 2)	/* SB i/o address (724/740) */ -#define YMFPCI_LEGACY2_MPUIO	(3 << 4)	/* MPU401 i/o address (724/740) */ -#define YMFPCI_LEGACY2_JSIO	(3 << 6)	/* joystick i/o address (724/740) */ -#define YMFPCI_LEGACY2_MAIM	(1 << 8)	/* MPU401 ack intr mask */ -#define YMFPCI_LEGACY2_SMOD	(3 << 11)	/* SB DMA mode */ -#define YMFPCI_LEGACY2_SBVER	(3 << 13)	/* SB version select */ -#define YMFPCI_LEGACY2_IMOD	(1 << 15)	/* legacy IRQ mode */ -/* SIEN:IMOD 0:0 = legacy irq, 0:1 = INTA, 1:0 = serialized IRQ */ - -#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE)) -#define SUPPORT_JOYSTICK -#endif - -/* - * - */ - -struct snd_ymfpci_playback_bank { -	u32 format; -	u32 loop_default; -	u32 base;			/* 32-bit address */ -	u32 loop_start;			/* 32-bit offset */ -	u32 loop_end;			/* 32-bit offset */ -	u32 loop_frac;			/* 8-bit fraction - loop_start */ -	u32 delta_end;			/* pitch delta end */ -	u32 lpfK_end; -	u32 eg_gain_end; -	u32 left_gain_end; -	u32 right_gain_end; -	u32 eff1_gain_end; -	u32 eff2_gain_end; -	u32 eff3_gain_end; -	u32 lpfQ; -	u32 status; -	u32 num_of_frames; -	u32 loop_count; -	u32 start; -	u32 start_frac; -	u32 delta; -	u32 lpfK; -	u32 eg_gain; -	u32 left_gain; -	u32 right_gain; -	u32 eff1_gain; -	u32 eff2_gain; -	u32 eff3_gain; -	u32 lpfD1; -	u32 lpfD2; - }; - -struct snd_ymfpci_capture_bank { -	u32 base;			/* 32-bit address */ -	u32 loop_end;			/* 32-bit offset */ -	u32 start;			/* 32-bit offset */ -	u32 num_of_loops;		/* counter */ -}; - -struct snd_ymfpci_effect_bank { -	u32 base;			/* 32-bit address */ -	u32 loop_end;			/* 32-bit offset */ -	u32 start;			/* 32-bit offset */ -	u32 temp; -}; - -struct snd_ymfpci_pcm; -struct snd_ymfpci; - -enum snd_ymfpci_voice_type { -	YMFPCI_PCM, -	YMFPCI_SYNTH, -	YMFPCI_MIDI -}; - -struct snd_ymfpci_voice { -	struct snd_ymfpci *chip; -	int number; -	unsigned int use: 1, -	    pcm: 1, -	    synth: 1, -	    midi: 1; -	struct snd_ymfpci_playback_bank *bank; -	dma_addr_t bank_addr; -	void (*interrupt)(struct snd_ymfpci *chip, struct snd_ymfpci_voice *voice); -	struct snd_ymfpci_pcm *ypcm; -}; - -enum snd_ymfpci_pcm_type { -	PLAYBACK_VOICE, -	CAPTURE_REC, -	CAPTURE_AC97, -	EFFECT_DRY_LEFT, -	EFFECT_DRY_RIGHT, -	EFFECT_EFF1, -	EFFECT_EFF2, -	EFFECT_EFF3 -}; - -struct snd_ymfpci_pcm { -	struct snd_ymfpci *chip; -	enum snd_ymfpci_pcm_type type; -	struct snd_pcm_substream *substream; -	struct snd_ymfpci_voice *voices[2];	/* playback only */ -	unsigned int running: 1, -		     use_441_slot: 1, -	             output_front: 1, -	             output_rear: 1, -	             swap_rear: 1; -	unsigned int update_pcm_vol; -	u32 period_size;		/* cached from runtime->period_size */ -	u32 buffer_size;		/* cached from runtime->buffer_size */ -	u32 period_pos; -	u32 last_pos; -	u32 capture_bank_number; -	u32 shift; -}; - -struct snd_ymfpci { -	int irq; - -	unsigned int device_id;	/* PCI device ID */ -	unsigned char rev;	/* PCI revision */ -	unsigned long reg_area_phys; -	void __iomem *reg_area_virt; -	struct resource *res_reg_area; -	struct resource *fm_res; -	struct resource *mpu_res; - -	unsigned short old_legacy_ctrl; -#ifdef SUPPORT_JOYSTICK -	struct gameport *gameport; -#endif - -	struct snd_dma_buffer work_ptr; - -	unsigned int bank_size_playback; -	unsigned int bank_size_capture; -	unsigned int bank_size_effect; -	unsigned int work_size; - -	void *bank_base_playback; -	void *bank_base_capture; -	void *bank_base_effect; -	void *work_base; -	dma_addr_t bank_base_playback_addr; -	dma_addr_t bank_base_capture_addr; -	dma_addr_t bank_base_effect_addr; -	dma_addr_t work_base_addr; -	struct snd_dma_buffer ac3_tmp_base; - -	u32 *ctrl_playback; -	struct snd_ymfpci_playback_bank *bank_playback[YDSXG_PLAYBACK_VOICES][2]; -	struct snd_ymfpci_capture_bank *bank_capture[YDSXG_CAPTURE_VOICES][2]; -	struct snd_ymfpci_effect_bank *bank_effect[YDSXG_EFFECT_VOICES][2]; - -	int start_count; - -	u32 active_bank; -	struct snd_ymfpci_voice voices[64]; -	int src441_used; - -	struct snd_ac97_bus *ac97_bus; -	struct snd_ac97 *ac97; -	struct snd_rawmidi *rawmidi; -	struct snd_timer *timer; -	unsigned int timer_ticks; - -	struct pci_dev *pci; -	struct snd_card *card; -	struct snd_pcm *pcm; -	struct snd_pcm *pcm2; -	struct snd_pcm *pcm_spdif; -	struct snd_pcm *pcm_4ch; -	struct snd_pcm_substream *capture_substream[YDSXG_CAPTURE_VOICES]; -	struct snd_pcm_substream *effect_substream[YDSXG_EFFECT_VOICES]; -	struct snd_kcontrol *ctl_vol_recsrc; -	struct snd_kcontrol *ctl_vol_adcrec; -	struct snd_kcontrol *ctl_vol_spdifrec; -	unsigned short spdif_bits, spdif_pcm_bits; -	struct snd_kcontrol *spdif_pcm_ctl; -	int mode_dup4ch; -	int rear_opened; -	int spdif_opened; -	struct snd_ymfpci_pcm_mixer { -		u16 left; -		u16 right; -		struct snd_kcontrol *ctl; -	} pcm_mixer[32]; - -	spinlock_t reg_lock; -	spinlock_t voice_lock; -	wait_queue_head_t interrupt_sleep; -	atomic_t interrupt_sleep_count; -	struct snd_info_entry *proc_entry; -	const struct firmware *dsp_microcode; -	const struct firmware *controller_microcode; - -#ifdef CONFIG_PM -	u32 *saved_regs; -	u32 saved_ydsxgr_mode; -#endif -}; - -int snd_ymfpci_create(struct snd_card *card, -		      struct pci_dev *pci, -		      unsigned short old_legacy_ctrl, -		      struct snd_ymfpci ** rcodec); -void snd_ymfpci_free_gameport(struct snd_ymfpci *chip); - -int snd_ymfpci_suspend(struct pci_dev *pci, pm_message_t state); -int snd_ymfpci_resume(struct pci_dev *pci); - -int snd_ymfpci_pcm(struct snd_ymfpci *chip, int device, struct snd_pcm **rpcm); -int snd_ymfpci_pcm2(struct snd_ymfpci *chip, int device, struct snd_pcm **rpcm); -int snd_ymfpci_pcm_spdif(struct snd_ymfpci *chip, int device, struct snd_pcm **rpcm); -int snd_ymfpci_pcm_4ch(struct snd_ymfpci *chip, int device, struct snd_pcm **rpcm); -int snd_ymfpci_mixer(struct snd_ymfpci *chip, int rear_switch); -int snd_ymfpci_timer(struct snd_ymfpci *chip, int device); - -#endif /* __SOUND_YMFPCI_H */  | 
