mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 21:51:40 +00:00
Sound updates for 3.7-rc1
This contains pretty many small commits covering fairly large range of files in sound/ directory. Partly because of additional API support and partly because of constantly developed ASoC and ARM stuff. Some highlights: - Introduced the helper function and documentation for exposing the channel map via control API, as discussed in Plumbers; most of PCI drivers are covered, will follow more drivers later - Most of drivers have been replaced with the new PM callbacks (if the bus is supported) - HD-audio controller got the support of runtime PM and the support of D3 clock-stop. Also changing the power_save option in sysfs kicks off immediately to enable / disable the power-save mode. - Another significant code change in HD-audio is the rewrite of firmware loading code. Other than that, most of changes in HD-audio are continued cleanups and standardization for the generic auto parser and bug fixes (HBR, device-specific fixups), in addition to the support of channel-map API. - Addition of ASoC bindings for the compressed API, used by the mid-x86 drivers. - Lots of cleanups and API refreshes for ASoC codec drivers and DaVinci. - Conversion of OMAP to dmaengine. - New machine driver for Wolfson Microelectronics Bells. - New CODEC driver for Wolfson Microelectronics WM0010. - Enhancements to the ux500 and wm2000 drivers - A new driver for DA9055 and the support for regulator bypass mode. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iQIcBAABAgAGBQJQcpeWAAoJEGwxgFQ9KSmkpi4P/2etDDz5aEkEHNa1l4xEmFcm ymiGTgjaalqpUAVbM/gYx9G59EFMEbzUl1BHAqE5La4wO/v9lNPb+VrdUo+B+NZ7 WSxIPWcNqdinSuoSqyYPjoPMVnhs3EMtNOqmf4jm1JOvdqA+4rO29xQVAqK/5Gfu LpMOyPiRi5ODnbQ1BOIWwpKICioY/mLwGJudK3z0i/fYVA7gLub20f+w+sOjKIA4 wmwQAMTjAR798Cg/tVy4fQmf4SLw+c2nIgGe/PD+2gVlGXLNKBrJfMonHPTbmwKu lmJO/EtnijNOnpbn6up7ryUQ9cSoZAUZOfdIOgmAeQgQ/LWR0f+zf2IQehSPwrul g6hqOnQI2DNN7ugT3cYVbYnsh56TjyhnxhhxZgkapqh706QkqHGyKJNMRetzuXmP 1O//MnZJrFQWd6sOKLlTL2ZzRvnxEJcNVGaE6bbwZTfQMtPeo9l1842uIq1dLUtG VxZb/svKUkMXv4is1dwUYUkpDsKxsgMEmabmuovceGf2N7jj/irkXgqxf6LWkaY1 JQ7ZFWUJyDzEMXRaFfzdGO15T532CfB84wvFX5xoPMwMste2AA7QuybFBVstXhKu AtKNDgRJFUTlnLIxydpPBWdWH3UJdEaFwwsSfuNKI8OmmGKhWC/aP83k4hzueu9H KYLvY/0ObMSMqiwh/ndQ =uNqD -----END PGP SIGNATURE----- Merge tag 'sound-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound updates from Takashi Iwai: "This contains pretty many small commits covering fairly large range of files in sound/ directory. Partly because of additional API support and partly because of constantly developed ASoC and ARM stuff. Some highlights: - Introduced the helper function and documentation for exposing the channel map via control API, as discussed in Plumbers; most of PCI drivers are covered, will follow more drivers later - Most of drivers have been replaced with the new PM callbacks (if the bus is supported) - HD-audio controller got the support of runtime PM and the support of D3 clock-stop. Also changing the power_save option in sysfs kicks off immediately to enable / disable the power-save mode. - Another significant code change in HD-audio is the rewrite of firmware loading code. Other than that, most of changes in HD-audio are continued cleanups and standardization for the generic auto parser and bug fixes (HBR, device-specific fixups), in addition to the support of channel-map API. - Addition of ASoC bindings for the compressed API, used by the mid-x86 drivers. - Lots of cleanups and API refreshes for ASoC codec drivers and DaVinci. - Conversion of OMAP to dmaengine. - New machine driver for Wolfson Microelectronics Bells. - New CODEC driver for Wolfson Microelectronics WM0010. - Enhancements to the ux500 and wm2000 drivers - A new driver for DA9055 and the support for regulator bypass mode." Fix up various arm soc header file reorg conflicts. * tag 'sound-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (339 commits) ALSA: hda - Add new codec ALC283 ALC290 support ALSA: hda - avoid unneccesary indices on "Headphone Jack" controls ALSA: hda - fix indices on boost volume on Conexant ALSA: aloop - add locking to timer access ALSA: hda - Fix hang caused by race during suspend. sound: Remove unnecessary semicolon ALSA: hda/realtek - Fix detection of ALC271X codec ALSA: hda - Add inverted internal mic quirk for Lenovo IdeaPad U310 ALSA: hda - make Realtek/Sigmatel/Conexant use the generic unsol event ALSA: hda - make a generic unsol event handler ASoC: codecs: Add DA9055 codec driver ASoC: eukrea-tlv320: Convert it to platform driver ALSA: ASoC: add DT bindings for CS4271 ASoC: wm_hubs: Ensure volume updates are handled during class W startup ASoC: wm5110: Adding missing volume update bits ASoC: wm5110: Add OUT3R support ASoC: wm5110: Add AEC loopback support ASoC: wm5110: Rename EPOUT to HPOUT3 ASoC: arizona: Add more clock rates ASoC: arizona: Add more DSP options for mixer input muxes ...
This commit is contained in:
commit
f5a246eab9
21
Documentation/devicetree/bindings/sound/cs4270.txt
Normal file
21
Documentation/devicetree/bindings/sound/cs4270.txt
Normal file
@ -0,0 +1,21 @@
|
||||
CS4270 audio CODEC
|
||||
|
||||
The driver for this device currently only supports I2C.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : "cirrus,cs4270"
|
||||
|
||||
- reg : the I2C address of the device for I2C
|
||||
|
||||
Optional properties:
|
||||
|
||||
- reset-gpio : a GPIO spec for the reset pin. If specified, it will be
|
||||
deasserted before communication to the codec starts.
|
||||
|
||||
Example:
|
||||
|
||||
codec: cs4270@48 {
|
||||
compatible = "cirrus,cs4270";
|
||||
reg = <0x48>;
|
||||
};
|
36
Documentation/devicetree/bindings/sound/cs4271.txt
Normal file
36
Documentation/devicetree/bindings/sound/cs4271.txt
Normal file
@ -0,0 +1,36 @@
|
||||
Cirrus Logic CS4271 DT bindings
|
||||
|
||||
This driver supports both the I2C and the SPI bus.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: "cirrus,cs4271"
|
||||
|
||||
For required properties on SPI, please consult
|
||||
Documentation/devicetree/bindings/spi/spi-bus.txt
|
||||
|
||||
Required properties on I2C:
|
||||
|
||||
- reg: the i2c address
|
||||
|
||||
|
||||
Optional properties:
|
||||
|
||||
- reset-gpio: a GPIO spec to define which pin is connected to the chip's
|
||||
!RESET pin
|
||||
|
||||
Examples:
|
||||
|
||||
codec_i2c: cs4271@10 {
|
||||
compatible = "cirrus,cs4271";
|
||||
reg = <0x10>;
|
||||
reset-gpio = <&gpio 23 0>;
|
||||
};
|
||||
|
||||
codec_spi: cs4271@0 {
|
||||
compatible = "cirrus,cs4271";
|
||||
reg = <0x0>;
|
||||
reset-gpio = <&gpio 23 0>;
|
||||
spi-max-frequency = <6000000>;
|
||||
};
|
||||
|
@ -0,0 +1,45 @@
|
||||
Texas Instruments McASP controller
|
||||
|
||||
Required properties:
|
||||
- compatible :
|
||||
"ti,dm646x-mcasp-audio" : for DM646x platforms
|
||||
"ti,da830-mcasp-audio" : for both DA830 & DA850 platforms
|
||||
"ti,omap2-mcasp-audio" : for OMAP2 platforms (TI81xx, AM33xx)
|
||||
|
||||
- reg : Should contain McASP registers offset and length
|
||||
- interrupts : Interrupt number for McASP
|
||||
- op-mode : I2S/DIT ops mode.
|
||||
- tdm-slots : Slots for TDM operation.
|
||||
- num-serializer : Serializers used by McASP.
|
||||
- serial-dir : A list of serializer pin mode. The list number should be equal
|
||||
to "num-serializer" parameter. Each entry is a number indication
|
||||
serializer pin direction. (0 - INACTIVE, 1 - TX, 2 - RX)
|
||||
|
||||
|
||||
Optional properties:
|
||||
|
||||
- ti,hwmods : Must be "mcasp<n>", n is controller instance starting 0
|
||||
- tx-num-evt : FIFO levels.
|
||||
- rx-num-evt : FIFO levels.
|
||||
- sram-size-playback : size of sram to be allocated during playback
|
||||
- sram-size-capture : size of sram to be allocated during capture
|
||||
|
||||
Example:
|
||||
|
||||
mcasp0: mcasp0@1d00000 {
|
||||
compatible = "ti,da830-mcasp-audio";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x100000 0x3000>;
|
||||
interrupts = <82 83>;
|
||||
op-mode = <0>; /* MCASP_IIS_MODE */
|
||||
tdm-slots = <2>;
|
||||
num-serializer = <16>;
|
||||
serial-dir = <
|
||||
0 0 0 0 /* 0: INACTIVE, 1: TX, 2: RX */
|
||||
0 0 0 0
|
||||
0 0 0 1
|
||||
2 0 0 0 >;
|
||||
tx-num-evt = <1>;
|
||||
rx-num-evt = <1>;
|
||||
};
|
91
Documentation/devicetree/bindings/sound/omap-abe-twl6040.txt
Normal file
91
Documentation/devicetree/bindings/sound/omap-abe-twl6040.txt
Normal file
@ -0,0 +1,91 @@
|
||||
* Texas Instruments OMAP4+ and twl6040 based audio setups
|
||||
|
||||
Required properties:
|
||||
- compatible: "ti,abe-twl6040"
|
||||
- ti,model: Name of the sound card ( for example "SDP4430")
|
||||
- ti,mclk-freq: MCLK frequency for HPPLL operation
|
||||
- ti,mcpdm: phandle for the McPDM node
|
||||
- ti,twl6040: phandle for the twl6040 core node
|
||||
- ti,audio-routing: List of connections between audio components.
|
||||
Each entry is a pair of strings, the first being the connection's sink,
|
||||
the second being the connection's source.
|
||||
|
||||
Optional properties:
|
||||
- ti,dmic: phandle for the OMAP dmic node if the machine have it connected
|
||||
- ti,jack_detection: Need to be set to <1> if the board capable to detect jack
|
||||
insertion, removal.
|
||||
|
||||
Available audio endpoints for the audio-routing table:
|
||||
|
||||
Board connectors:
|
||||
* Headset Stereophone
|
||||
* Earphone Spk
|
||||
* Ext Spk
|
||||
* Line Out
|
||||
* Vibrator
|
||||
* Headset Mic
|
||||
* Main Handset Mic
|
||||
* Sub Handset Mic
|
||||
* Line In
|
||||
* Digital Mic
|
||||
|
||||
twl6040 pins:
|
||||
* HSOL
|
||||
* HSOR
|
||||
* EP
|
||||
* HFL
|
||||
* HFR
|
||||
* AUXL
|
||||
* AUXR
|
||||
* VIBRAL
|
||||
* VIBRAR
|
||||
* HSMIC
|
||||
* MAINMIC
|
||||
* SUBMIC
|
||||
* AFML
|
||||
* AFMR
|
||||
|
||||
* Headset Mic Bias
|
||||
* Main Mic Bias
|
||||
* Digital Mic1 Bias
|
||||
* Digital Mic2 Bias
|
||||
|
||||
Digital mic pins:
|
||||
* DMic
|
||||
|
||||
Example:
|
||||
|
||||
sound {
|
||||
compatible = "ti,abe-twl6040";
|
||||
ti,model = "SDP4430";
|
||||
|
||||
ti,jack-detection = <1>;
|
||||
ti,mclk-freq = <38400000>;
|
||||
|
||||
ti,mcpdm = <&mcpdm>;
|
||||
ti,dmic = <&dmic>;
|
||||
|
||||
ti,twl6040 = <&twl6040>;
|
||||
|
||||
/* Audio routing */
|
||||
ti,audio-routing =
|
||||
"Headset Stereophone", "HSOL",
|
||||
"Headset Stereophone", "HSOR",
|
||||
"Earphone Spk", "EP",
|
||||
"Ext Spk", "HFL",
|
||||
"Ext Spk", "HFR",
|
||||
"Line Out", "AUXL",
|
||||
"Line Out", "AUXR",
|
||||
"Vibrator", "VIBRAL",
|
||||
"Vibrator", "VIBRAR",
|
||||
"HSMIC", "Headset Mic",
|
||||
"Headset Mic", "Headset Mic Bias",
|
||||
"MAINMIC", "Main Handset Mic",
|
||||
"Main Handset Mic", "Main Mic Bias",
|
||||
"SUBMIC", "Sub Handset Mic",
|
||||
"Sub Handset Mic", "Main Mic Bias",
|
||||
"AFML", "Line In",
|
||||
"AFMR", "Line In",
|
||||
"DMic", "Digital Mic",
|
||||
"Digital Mic", "Digital Mic1 Bias";
|
||||
};
|
37
Documentation/devicetree/bindings/sound/omap-mcbsp.txt
Normal file
37
Documentation/devicetree/bindings/sound/omap-mcbsp.txt
Normal file
@ -0,0 +1,37 @@
|
||||
* Texas Instruments OMAP2+ McBSP module
|
||||
|
||||
Required properties:
|
||||
- compatible: "ti,omap2420-mcbsp" for McBSP on OMAP2420
|
||||
"ti,omap2430-mcbsp" for McBSP on OMAP2430
|
||||
"ti,omap3-mcbsp" for McBSP on OMAP3
|
||||
"ti,omap4-mcbsp" for McBSP on OMAP4 and newer SoC
|
||||
- reg: Register location and size, for OMAP4+ as an array:
|
||||
<MPU access base address, size>,
|
||||
<L3 interconnect address, size>;
|
||||
- reg-names: Array of strings associated with the address space
|
||||
- interrupts: Interrupt numbers for the McBSP port, as an array in case the
|
||||
McBSP IP have more interrupt lines:
|
||||
<OCP compliant irq>,
|
||||
<TX irq>,
|
||||
<RX irq>;
|
||||
- interrupt-names: Array of strings associated with the interrupt numbers
|
||||
- interrupt-parent: The parent interrupt controller
|
||||
- ti,buffer-size: Size of the FIFO on the port (OMAP2430 and newer SoC)
|
||||
- ti,hwmods: Name of the hwmod associated to the McBSP port
|
||||
|
||||
Example:
|
||||
|
||||
mcbsp2: mcbsp@49022000 {
|
||||
compatible = "ti,omap3-mcbsp";
|
||||
reg = <0x49022000 0xff>,
|
||||
<0x49028000 0xff>;
|
||||
reg-names = "mpu", "sidetone";
|
||||
interrupts = <0 17 0x4>, /* OCP compliant interrupt */
|
||||
<0 62 0x4>, /* TX interrupt */
|
||||
<0 63 0x4>, /* RX interrupt */
|
||||
<0 4 0x4>; /* Sidetone */
|
||||
interrupt-names = "common", "tx", "rx", "sidetone";
|
||||
interrupt-parent = <&intc>;
|
||||
ti,buffer-size = <1280>;
|
||||
ti,hwmods = "mcbsp2";
|
||||
};
|
17
Documentation/devicetree/bindings/sound/omap-twl4030.txt
Normal file
17
Documentation/devicetree/bindings/sound/omap-twl4030.txt
Normal file
@ -0,0 +1,17 @@
|
||||
* Texas Instruments SoC with twl4030 based audio setups
|
||||
|
||||
Required properties:
|
||||
- compatible: "ti,omap-twl4030"
|
||||
- ti,model: Name of the sound card (for example "omap3beagle")
|
||||
- ti,mcbsp: phandle for the McBSP node
|
||||
- ti,codec: phandle for the twl4030 audio node
|
||||
|
||||
Example:
|
||||
|
||||
sound {
|
||||
compatible = "ti,omap-twl4030";
|
||||
ti,model = "omap3beagle";
|
||||
|
||||
ti,mcbsp = <&mcbsp2>;
|
||||
ti,codec = <&twl_audio>;
|
||||
};
|
20
Documentation/devicetree/bindings/sound/tlv320aic3x.txt
Normal file
20
Documentation/devicetree/bindings/sound/tlv320aic3x.txt
Normal file
@ -0,0 +1,20 @@
|
||||
Texas Instruments - tlv320aic3x Codec module
|
||||
|
||||
The tlv320aic3x serial control bus communicates through I2C protocols
|
||||
|
||||
Required properties:
|
||||
- compatible - "string" - "ti,tlv320aic3x"
|
||||
- reg - <int> - I2C slave address
|
||||
|
||||
|
||||
Optional properties:
|
||||
|
||||
- gpio-reset - gpio pin number used for codec reset
|
||||
- ai3x-gpio-func - <array of 2 int> - AIC3X_GPIO1 & AIC3X_GPIO2 Functionality
|
||||
|
||||
Example:
|
||||
|
||||
tlv320aic3x: tlv320aic3x@1b {
|
||||
compatible = "ti,tlv320aic3x";
|
||||
reg = <0x1b>;
|
||||
};
|
@ -860,8 +860,14 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
|
||||
[Multiple options for each card instance]
|
||||
model - force the model name
|
||||
position_fix - Fix DMA pointer (0 = auto, 1 = use LPIB, 2 = POSBUF,
|
||||
3 = VIACOMBO, 4 = COMBO)
|
||||
position_fix - Fix DMA pointer
|
||||
-1 = system default: choose appropriate one per controller
|
||||
hardware
|
||||
0 = auto: falls back to LPIB when POSBUF doesn't work
|
||||
1 = use LPIB
|
||||
2 = POSBUF: use position buffer
|
||||
3 = VIACOMBO: VIA-specific workaround for capture
|
||||
4 = COMBO: use LPIB for playback, auto for capture stream
|
||||
probe_mask - Bitmask to probe codecs (default = -1, meaning all slots)
|
||||
When the bit 8 (0x100) is set, the lower 8 bits are used
|
||||
as the "fixed" codec slots; i.e. the driver probes the
|
||||
|
153
Documentation/sound/alsa/Channel-Mapping-API.txt
Normal file
153
Documentation/sound/alsa/Channel-Mapping-API.txt
Normal file
@ -0,0 +1,153 @@
|
||||
ALSA PCM channel-mapping API
|
||||
============================
|
||||
Takashi Iwai <tiwai@suse.de>
|
||||
|
||||
GENERAL
|
||||
-------
|
||||
|
||||
The channel mapping API allows user to query the possible channel maps
|
||||
and the current channel map, also optionally to modify the channel map
|
||||
of the current stream.
|
||||
|
||||
A channel map is an array of position for each PCM channel.
|
||||
Typically, a stereo PCM stream has a channel map of
|
||||
{ front_left, front_right }
|
||||
while a 4.0 surround PCM stream has a channel map of
|
||||
{ front left, front right, rear left, rear right }.
|
||||
|
||||
The problem, so far, was that we had no standard channel map
|
||||
explicitly, and applications had no way to know which channel
|
||||
corresponds to which (speaker) position. Thus, applications applied
|
||||
wrong channels for 5.1 outputs, and you hear suddenly strange sound
|
||||
from rear. Or, some devices secretly assume that center/LFE is the
|
||||
third/fourth channels while others that C/LFE as 5th/6th channels.
|
||||
|
||||
Also, some devices such as HDMI are configurable for different speaker
|
||||
positions even with the same number of total channels. However, there
|
||||
was no way to specify this because of lack of channel map
|
||||
specification. These are the main motivations for the new channel
|
||||
mapping API.
|
||||
|
||||
|
||||
DESIGN
|
||||
------
|
||||
|
||||
Actually, "the channel mapping API" doesn't introduce anything new in
|
||||
the kernel/user-space ABI perspective. It uses only the existing
|
||||
control element features.
|
||||
|
||||
As a ground design, each PCM substream may contain a control element
|
||||
providing the channel mapping information and configuration. This
|
||||
element is specified by:
|
||||
iface = SNDRV_CTL_ELEM_IFACE_PCM
|
||||
name = "Playback Channel Map" or "Capture Channel Map"
|
||||
device = the same device number for the assigned PCM substream
|
||||
index = the same index number for the assigned PCM substream
|
||||
|
||||
Note the name is different depending on the PCM substream direction.
|
||||
|
||||
Each control element provides at least the TLV read operation and the
|
||||
read operation. Optionally, the write operation can be provided to
|
||||
allow user to change the channel map dynamically.
|
||||
|
||||
* TLV
|
||||
|
||||
The TLV operation gives the list of available channel
|
||||
maps. A list item of a channel map is usually a TLV of
|
||||
type data-bytes ch0 ch1 ch2...
|
||||
where type is the TLV type value, the second argument is the total
|
||||
bytes (not the numbers) of channel values, and the rest are the
|
||||
position value for each channel.
|
||||
|
||||
As a TLV type, either SNDRV_CTL_TLVT_CHMAP_FIXED,
|
||||
SNDRV_CTL_TLV_CHMAP_VAR or SNDRV_CTL_TLVT_CHMAP_PAIRED can be used.
|
||||
The _FIXED type is for a channel map with the fixed channel position
|
||||
while the latter two are for flexible channel positions. _VAR type is
|
||||
for a channel map where all channels are freely swappable and _PAIRED
|
||||
type is where pair-wise channels are swappable. For example, when you
|
||||
have {FL/FR/RL/RR} channel map, _PAIRED type would allow you to swap
|
||||
only {RL/RR/FL/FR} while _VAR type would allow even swapping FL and
|
||||
RR.
|
||||
|
||||
These new TLV types are defined in sound/tlv.h.
|
||||
|
||||
The available channel position values are defined in sound/asound.h,
|
||||
here is a cut:
|
||||
|
||||
/* channel positions */
|
||||
enum {
|
||||
SNDRV_CHMAP_UNKNOWN = 0,
|
||||
SNDRV_CHMAP_NA, /* N/A, silent */
|
||||
SNDRV_CHMAP_MONO, /* mono stream */
|
||||
/* this follows the alsa-lib mixer channel value + 3 */
|
||||
SNDRV_CHMAP_FL, /* front left */
|
||||
SNDRV_CHMAP_FR, /* front right */
|
||||
SNDRV_CHMAP_RL, /* rear left */
|
||||
SNDRV_CHMAP_RR, /* rear right */
|
||||
SNDRV_CHMAP_FC, /* front center */
|
||||
SNDRV_CHMAP_LFE, /* LFE */
|
||||
SNDRV_CHMAP_SL, /* side left */
|
||||
SNDRV_CHMAP_SR, /* side right */
|
||||
SNDRV_CHMAP_RC, /* rear center */
|
||||
/* new definitions */
|
||||
SNDRV_CHMAP_FLC, /* front left center */
|
||||
SNDRV_CHMAP_FRC, /* front right center */
|
||||
SNDRV_CHMAP_RLC, /* rear left center */
|
||||
SNDRV_CHMAP_RRC, /* rear right center */
|
||||
SNDRV_CHMAP_FLW, /* front left wide */
|
||||
SNDRV_CHMAP_FRW, /* front right wide */
|
||||
SNDRV_CHMAP_FLH, /* front left high */
|
||||
SNDRV_CHMAP_FCH, /* front center high */
|
||||
SNDRV_CHMAP_FRH, /* front right high */
|
||||
SNDRV_CHMAP_TC, /* top center */
|
||||
SNDRV_CHMAP_TFL, /* top front left */
|
||||
SNDRV_CHMAP_TFR, /* top front right */
|
||||
SNDRV_CHMAP_TFC, /* top front center */
|
||||
SNDRV_CHMAP_TRL, /* top rear left */
|
||||
SNDRV_CHMAP_TRR, /* top rear right */
|
||||
SNDRV_CHMAP_TRC, /* top rear center */
|
||||
SNDRV_CHMAP_LAST = SNDRV_CHMAP_TRC,
|
||||
};
|
||||
|
||||
When a PCM stream can provide more than one channel map, you can
|
||||
provide multiple channel maps in a TLV container type. The TLV data
|
||||
to be returned will contain such as:
|
||||
SNDRV_CTL_TLVT_CONTAINER 96
|
||||
SNDRV_CTL_TLVT_CHMAP_FIXED 4 SNDRV_CHMAP_FC
|
||||
SNDRV_CTL_TLVT_CHMAP_FIXED 8 SNDRV_CHMAP_FL SNDRV_CHMAP_FR
|
||||
SNDRV_CTL_TLVT_CHMAP_FIXED 16 NDRV_CHMAP_FL SNDRV_CHMAP_FR \
|
||||
SNDRV_CHMAP_RL SNDRV_CHMAP_RR
|
||||
|
||||
The channel position is provided in LSB 16bits. The upper bits are
|
||||
used for bit flags.
|
||||
|
||||
#define SNDRV_CHMAP_POSITION_MASK 0xffff
|
||||
#define SNDRV_CHMAP_PHASE_INVERSE (0x01 << 16)
|
||||
#define SNDRV_CHMAP_DRIVER_SPEC (0x02 << 16)
|
||||
|
||||
SNDRV_CHMAP_PHASE_INVERSE indicates the channel is phase inverted,
|
||||
(thus summing left and right channels would result in almost silence).
|
||||
Some digital mic devices have this.
|
||||
|
||||
When SNDRV_CHMAP_DRIVER_SPEC is set, all the channel position values
|
||||
don't follow the standard definition above but driver-specific.
|
||||
|
||||
* READ OPERATION
|
||||
|
||||
The control read operation is for providing the current channel map of
|
||||
the given stream. The control element returns an integer array
|
||||
containing the position of each channel.
|
||||
|
||||
When this is performed before the number of the channel is specified
|
||||
(i.e. hw_params is set), it should return all channels set to
|
||||
UNKNOWN.
|
||||
|
||||
* WRITE OPERATION
|
||||
|
||||
The control write operation is optional, and only for devices that can
|
||||
change the channel configuration on the fly, such as HDMI. User needs
|
||||
to pass an integer value containing the valid channel positions for
|
||||
all channels of the assigned PCM substream.
|
||||
|
||||
This operation is allowed only at PCM PREPARED state. When called in
|
||||
other states, it shall return an error.
|
@ -74,7 +74,8 @@ CMI9880
|
||||
|
||||
AD1882 / AD1882A
|
||||
================
|
||||
3stack 3-stack mode (default)
|
||||
3stack 3-stack mode
|
||||
3stack-automute 3-stack with automute front HP (default)
|
||||
6stack 6-stack mode
|
||||
|
||||
AD1884A / AD1883 / AD1984A / AD1984B
|
||||
|
49
arch/arm/mach-davinci/asp.h
Normal file
49
arch/arm/mach-davinci/asp.h
Normal file
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* TI DaVinci Audio definitions
|
||||
*/
|
||||
#ifndef __ASM_ARCH_DAVINCI_ASP_H
|
||||
#define __ASM_ARCH_DAVINCI_ASP_H
|
||||
|
||||
/* Bases of dm644x and dm355 register banks */
|
||||
#define DAVINCI_ASP0_BASE 0x01E02000
|
||||
#define DAVINCI_ASP1_BASE 0x01E04000
|
||||
|
||||
/* Bases of dm365 register banks */
|
||||
#define DAVINCI_DM365_ASP0_BASE 0x01D02000
|
||||
|
||||
/* Bases of dm646x register banks */
|
||||
#define DAVINCI_DM646X_MCASP0_REG_BASE 0x01D01000
|
||||
#define DAVINCI_DM646X_MCASP1_REG_BASE 0x01D01800
|
||||
|
||||
/* Bases of da850/da830 McASP0 register banks */
|
||||
#define DAVINCI_DA8XX_MCASP0_REG_BASE 0x01D00000
|
||||
|
||||
/* Bases of da830 McASP1 register banks */
|
||||
#define DAVINCI_DA830_MCASP1_REG_BASE 0x01D04000
|
||||
|
||||
/* EDMA channels of dm644x and dm355 */
|
||||
#define DAVINCI_DMA_ASP0_TX 2
|
||||
#define DAVINCI_DMA_ASP0_RX 3
|
||||
#define DAVINCI_DMA_ASP1_TX 8
|
||||
#define DAVINCI_DMA_ASP1_RX 9
|
||||
|
||||
/* EDMA channels of dm646x */
|
||||
#define DAVINCI_DM646X_DMA_MCASP0_AXEVT0 6
|
||||
#define DAVINCI_DM646X_DMA_MCASP0_AREVT0 9
|
||||
#define DAVINCI_DM646X_DMA_MCASP1_AXEVT1 12
|
||||
|
||||
/* EDMA channels of da850/da830 McASP0 */
|
||||
#define DAVINCI_DA8XX_DMA_MCASP0_AREVT 0
|
||||
#define DAVINCI_DA8XX_DMA_MCASP0_AXEVT 1
|
||||
|
||||
/* EDMA channels of da830 McASP1 */
|
||||
#define DAVINCI_DA830_DMA_MCASP1_AREVT 2
|
||||
#define DAVINCI_DA830_DMA_MCASP1_AXEVT 3
|
||||
|
||||
/* Interrupts */
|
||||
#define DAVINCI_ASP0_RX_INT IRQ_MBRINT
|
||||
#define DAVINCI_ASP0_TX_INT IRQ_MBXINT
|
||||
#define DAVINCI_ASP1_RX_INT IRQ_MBRINT
|
||||
#define DAVINCI_ASP1_TX_INT IRQ_MBXINT
|
||||
|
||||
#endif /* __ASM_ARCH_DAVINCI_ASP_H */
|
@ -22,10 +22,10 @@
|
||||
#include <linux/davinci_emac.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
#include <mach/asp.h>
|
||||
#include <linux/platform_data/davinci_asp.h>
|
||||
#include <linux/platform_data/keyscan-davinci.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/edma.h>
|
||||
|
||||
#include <media/davinci/vpfe_capture.h>
|
||||
#include <media/davinci/vpif_types.h>
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <mach/cpuidle.h>
|
||||
|
||||
#include "clock.h"
|
||||
#include "asp.h"
|
||||
|
||||
#define DA8XX_TPCC_BASE 0x01c00000
|
||||
#define DA8XX_TPTC0_BASE 0x01c08000
|
||||
@ -505,15 +506,8 @@ static struct platform_device da850_mcasp_device = {
|
||||
.resource = da850_mcasp_resources,
|
||||
};
|
||||
|
||||
static struct platform_device davinci_pcm_device = {
|
||||
.name = "davinci-pcm-audio",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
void __init da8xx_register_mcasp(int id, struct snd_platform_data *pdata)
|
||||
{
|
||||
platform_device_register(&davinci_pcm_device);
|
||||
|
||||
/* DA830/OMAP-L137 has 3 instances of McASP */
|
||||
if (cpu_is_davinci_da830() && id == 1) {
|
||||
da830_mcasp1_device.dev.platform_data = pdata;
|
||||
|
@ -313,16 +313,6 @@ static void davinci_init_wdt(void)
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
static struct platform_device davinci_pcm_device = {
|
||||
.name = "davinci-pcm-audio",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static void davinci_init_pcm(void)
|
||||
{
|
||||
platform_device_register(&davinci_pcm_device);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
struct davinci_timer_instance davinci_timer_instance[2] = {
|
||||
@ -345,7 +335,6 @@ static int __init davinci_init_devices(void)
|
||||
/* please keep these calls, and their implementations above,
|
||||
* in alphabetical order so they're easier to sort through.
|
||||
*/
|
||||
davinci_init_pcm();
|
||||
davinci_init_wdt();
|
||||
|
||||
return 0;
|
||||
|
@ -26,13 +26,13 @@
|
||||
#include <mach/time.h>
|
||||
#include <mach/serial.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/asp.h>
|
||||
#include <linux/platform_data/spi-davinci.h>
|
||||
#include <mach/gpio-davinci.h>
|
||||
|
||||
#include "davinci.h"
|
||||
#include "clock.h"
|
||||
#include "mux.h"
|
||||
#include "asp.h"
|
||||
|
||||
#define DM355_UART2_BASE (IO_PHYS + 0x206000)
|
||||
|
||||
|
@ -29,7 +29,6 @@
|
||||
#include <mach/time.h>
|
||||
#include <mach/serial.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/asp.h>
|
||||
#include <linux/platform_data/keyscan-davinci.h>
|
||||
#include <linux/platform_data/spi-davinci.h>
|
||||
#include <mach/gpio-davinci.h>
|
||||
@ -37,6 +36,7 @@
|
||||
#include "davinci.h"
|
||||
#include "clock.h"
|
||||
#include "mux.h"
|
||||
#include "asp.h"
|
||||
|
||||
#define DM365_REF_FREQ 24000000 /* 24 MHz on the DM365 EVM */
|
||||
|
||||
|
@ -23,12 +23,12 @@
|
||||
#include <mach/time.h>
|
||||
#include <mach/serial.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/asp.h>
|
||||
#include <mach/gpio-davinci.h>
|
||||
|
||||
#include "davinci.h"
|
||||
#include "clock.h"
|
||||
#include "mux.h"
|
||||
#include "asp.h"
|
||||
|
||||
/*
|
||||
* Device specific clocks
|
||||
|
@ -24,12 +24,12 @@
|
||||
#include <mach/time.h>
|
||||
#include <mach/serial.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/asp.h>
|
||||
#include <mach/gpio-davinci.h>
|
||||
|
||||
#include "davinci.h"
|
||||
#include "clock.h"
|
||||
#include "mux.h"
|
||||
#include "asp.h"
|
||||
|
||||
#define DAVINCI_VPIF_BASE (0x01C12000)
|
||||
|
||||
|
@ -16,10 +16,10 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/davinci_emac.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/platform_data/davinci_asp.h>
|
||||
|
||||
#include <mach/serial.h>
|
||||
#include <mach/edma.h>
|
||||
#include <mach/asp.h>
|
||||
#include <mach/pm.h>
|
||||
#include <linux/platform_data/i2c-davinci.h>
|
||||
#include <linux/platform_data/mmc-davinci.h>
|
||||
|
@ -348,4 +348,5 @@ void __init eukrea_mbimx27_baseboard_init(void)
|
||||
imx27_add_imx_keypad(&eukrea_mbimx27_keymap_data);
|
||||
|
||||
gpio_led_register_device(-1, &eukrea_mbimx27_gpio_led_info);
|
||||
imx_add_platform_device("eukrea_tlv320", 0, NULL, 0, NULL, 0);
|
||||
}
|
||||
|
@ -306,4 +306,5 @@ void __init eukrea_mbimxsd25_baseboard_init(void)
|
||||
platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
|
||||
gpio_led_register_device(-1, &eukrea_mbimxsd_led_info);
|
||||
imx_add_gpio_keys(&eukrea_mbimxsd_button_data);
|
||||
imx_add_platform_device("eukrea_tlv320", 0, NULL, 0, NULL, 0);
|
||||
}
|
||||
|
@ -315,4 +315,5 @@ void __init eukrea_mbimxsd35_baseboard_init(void)
|
||||
platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
|
||||
gpio_led_register_device(-1, &eukrea_mbimxsd_led_info);
|
||||
imx_add_gpio_keys(&eukrea_mbimxsd_button_data);
|
||||
imx_add_platform_device("eukrea_tlv320", 0, NULL, 0, NULL, 0);
|
||||
}
|
||||
|
@ -228,4 +228,5 @@ void __init eukrea_mbimxsd51_baseboard_init(void)
|
||||
|
||||
gpio_led_register_device(-1, &eukrea_mbimxsd51_led_info);
|
||||
imx_add_gpio_keys(&eukrea_mbimxsd51_button_data);
|
||||
imx_add_platform_device("eukrea_tlv320", 0, NULL, 0, NULL, 0);
|
||||
}
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/platform_data/asoc-mx27vis.h>
|
||||
#include <media/soc_camera.h>
|
||||
#include <sound/tlv320aic32x4.h>
|
||||
#include <asm/mach-types.h>
|
||||
@ -58,6 +59,11 @@
|
||||
#define EXPBOARD_BIT1 (GPIO_PORTD + 27)
|
||||
#define EXPBOARD_BIT0 (GPIO_PORTD + 28)
|
||||
|
||||
#define AMP_GAIN_0 (GPIO_PORTF + 9)
|
||||
#define AMP_GAIN_1 (GPIO_PORTF + 8)
|
||||
#define AMP_MUTE_SDL (GPIO_PORTE + 5)
|
||||
#define AMP_MUTE_SDR (GPIO_PORTF + 7)
|
||||
|
||||
static const int visstrim_m10_pins[] __initconst = {
|
||||
/* UART1 (console) */
|
||||
PE12_PF_UART1_TXD,
|
||||
@ -139,6 +145,11 @@ static const int visstrim_m10_pins[] __initconst = {
|
||||
EXPBOARD_BIT2 | GPIO_GPIO | GPIO_IN | GPIO_PUEN,
|
||||
EXPBOARD_BIT1 | GPIO_GPIO | GPIO_IN | GPIO_PUEN,
|
||||
EXPBOARD_BIT0 | GPIO_GPIO | GPIO_IN | GPIO_PUEN,
|
||||
/* Audio AMP control */
|
||||
AMP_GAIN_0 | GPIO_GPIO | GPIO_OUT,
|
||||
AMP_GAIN_1 | GPIO_GPIO | GPIO_OUT,
|
||||
AMP_MUTE_SDL | GPIO_GPIO | GPIO_OUT,
|
||||
AMP_MUTE_SDR | GPIO_GPIO | GPIO_OUT,
|
||||
};
|
||||
|
||||
static struct gpio visstrim_m10_version_gpios[] = {
|
||||
@ -166,6 +177,26 @@ static const struct gpio visstrim_m10_gpios[] __initconst = {
|
||||
.flags = GPIOF_DIR_OUT | GPIOF_INIT_LOW,
|
||||
.label = "usbotg_cs",
|
||||
},
|
||||
{
|
||||
.gpio = AMP_GAIN_0,
|
||||
.flags = GPIOF_DIR_OUT,
|
||||
.label = "amp-gain-0",
|
||||
},
|
||||
{
|
||||
.gpio = AMP_GAIN_1,
|
||||
.flags = GPIOF_DIR_OUT,
|
||||
.label = "amp-gain-1",
|
||||
},
|
||||
{
|
||||
.gpio = AMP_MUTE_SDL,
|
||||
.flags = GPIOF_DIR_OUT,
|
||||
.label = "amp-mute-sdl",
|
||||
},
|
||||
{
|
||||
.gpio = AMP_MUTE_SDR,
|
||||
.flags = GPIOF_DIR_OUT,
|
||||
.label = "amp-mute-sdr",
|
||||
},
|
||||
};
|
||||
|
||||
/* Camera */
|
||||
@ -444,6 +475,14 @@ static void __init visstrim_deinterlace_init(void)
|
||||
}
|
||||
|
||||
|
||||
/* Audio */
|
||||
static const struct snd_mx27vis_platform_data snd_mx27vis_pdata __initconst = {
|
||||
.amp_gain0_gpio = AMP_GAIN_0,
|
||||
.amp_gain1_gpio = AMP_GAIN_1,
|
||||
.amp_mutel_gpio = AMP_MUTE_SDL,
|
||||
.amp_muter_gpio = AMP_MUTE_SDR,
|
||||
};
|
||||
|
||||
static void __init visstrim_m10_revision(void)
|
||||
{
|
||||
int exp_version = 0;
|
||||
@ -502,7 +541,8 @@ static void __init visstrim_m10_board_init(void)
|
||||
imx27_add_fec(NULL);
|
||||
imx_add_gpio_keys(&visstrim_gpio_keys_platform_data);
|
||||
platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
|
||||
imx_add_platform_device("mx27vis", 0, NULL, 0, NULL, 0);
|
||||
imx_add_platform_device("mx27vis", 0, NULL, 0, &snd_mx27vis_pdata,
|
||||
sizeof(snd_mx27vis_pdata));
|
||||
platform_device_register_resndata(NULL, "soc-camera-pdrv", 0, NULL, 0,
|
||||
&iclink_tvp5150, sizeof(iclink_tvp5150));
|
||||
gpio_led_register_device(0, &visstrim_m10_led_data);
|
||||
|
@ -263,6 +263,16 @@ static __init void am3517_evm_musb_init(void)
|
||||
usb_musb_init(&musb_board_data);
|
||||
}
|
||||
|
||||
static __init void am3517_evm_mcbsp1_init(void)
|
||||
{
|
||||
u32 devconf0;
|
||||
|
||||
/* McBSP1 CLKR/FSR signal to be connected to CLKX/FSX pin */
|
||||
devconf0 = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
|
||||
devconf0 |= OMAP2_MCBSP1_CLKR_MASK | OMAP2_MCBSP1_FSR_MASK;
|
||||
omap_ctrl_writel(devconf0, OMAP2_CONTROL_DEVCONF0);
|
||||
}
|
||||
|
||||
static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
|
||||
.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
|
||||
#if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \
|
||||
@ -366,6 +376,9 @@ static void __init am3517_evm_init(void)
|
||||
/* MUSB */
|
||||
am3517_evm_musb_init();
|
||||
|
||||
/* McBSP1 */
|
||||
am3517_evm_mcbsp1_init();
|
||||
|
||||
/* MMC init function */
|
||||
omap_hsmmc_init(mmc);
|
||||
}
|
||||
|
@ -723,6 +723,7 @@ static void __init cm_t3x_common_init(void)
|
||||
cm_t35_init_ethernet();
|
||||
cm_t35_init_led();
|
||||
cm_t35_init_display();
|
||||
omap_twl4030_audio_init("cm-t3x");
|
||||
|
||||
usb_musb_init(NULL);
|
||||
cm_t35_init_usbh();
|
||||
|
@ -623,6 +623,7 @@ static void __init devkit8000_init(void)
|
||||
usbhs_init(&usbhs_bdata);
|
||||
omap_nand_flash_init(NAND_BUSWIDTH_16, devkit8000_nand_partitions,
|
||||
ARRAY_SIZE(devkit8000_nand_partitions));
|
||||
omap_twl4030_audio_init("omap3beagle");
|
||||
|
||||
/* Ensure SDRC pins are mux'd for self-refresh */
|
||||
omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
|
||||
|
@ -625,6 +625,7 @@ static void __init igep_init(void)
|
||||
|
||||
igep_flash_init();
|
||||
igep_leds_init();
|
||||
omap_twl4030_audio_init("igep2");
|
||||
|
||||
/*
|
||||
* WLAN-BT combo module from MuRata which has a Marvell WLAN
|
||||
|
@ -514,6 +514,7 @@ static void __init omap3_beagle_init(void)
|
||||
usbhs_init(&usbhs_bdata);
|
||||
omap_nand_flash_init(NAND_BUSWIDTH_16, omap3beagle_nand_partitions,
|
||||
ARRAY_SIZE(omap3beagle_nand_partitions));
|
||||
omap_twl4030_audio_init("omap3beagle");
|
||||
|
||||
/* Ensure msecure is mux'd to be able to set the RTC. */
|
||||
omap_mux_init_signal("sys_drm_msecure", OMAP_PIN_OFF_OUTPUT_HIGH);
|
||||
|
@ -739,6 +739,7 @@ static void __init omap3_evm_init(void)
|
||||
omap3evm_init_smsc911x();
|
||||
omap3_evm_display_init();
|
||||
omap3_evm_wl12xx_init();
|
||||
omap_twl4030_audio_init("omap3evm");
|
||||
}
|
||||
|
||||
MACHINE_START(OMAP3EVM, "OMAP3 EVM")
|
||||
|
@ -504,6 +504,7 @@ static void __init overo_init(void)
|
||||
overo_display_init();
|
||||
overo_init_led();
|
||||
overo_init_keys();
|
||||
omap_twl4030_audio_init("overo");
|
||||
|
||||
/* Ensure SDRC pins are mux'd for self-refresh */
|
||||
omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
|
||||
|
@ -35,6 +35,7 @@
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define OMAP_ZOOM_WLAN_PMENA_GPIO (101)
|
||||
#define ZOOM2_HEADSET_EXTMUTE_GPIO (153)
|
||||
#define OMAP_ZOOM_WLAN_IRQ_GPIO (162)
|
||||
|
||||
#define LCD_PANEL_ENABLE_GPIO (7 + OMAP_MAX_GPIO_LINES)
|
||||
@ -245,12 +246,6 @@ static int zoom_twl_gpio_setup(struct device *dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* EXTMUTE callback function */
|
||||
static void zoom2_set_hs_extmute(int mute)
|
||||
{
|
||||
gpio_set_value(ZOOM2_HEADSET_EXTMUTE_GPIO, mute);
|
||||
}
|
||||
|
||||
static struct twl4030_gpio_platform_data zoom_gpio_data = {
|
||||
.setup = zoom_twl_gpio_setup,
|
||||
};
|
||||
@ -277,7 +272,7 @@ static int __init omap_i2c_init(void)
|
||||
|
||||
codec_data->ramp_delay_value = 3; /* 161 ms */
|
||||
codec_data->hs_extmute = 1;
|
||||
codec_data->set_hs_extmute = zoom2_set_hs_extmute;
|
||||
codec_data->hs_extmute_gpio = ZOOM2_HEADSET_EXTMUTE_GPIO;
|
||||
}
|
||||
omap_pmic_init(1, 2400, "twl5030", 7 + OMAP_INTC_START, &zoom_twldata);
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
|
@ -8,5 +8,3 @@
|
||||
extern int __init zoom_debugboard_init(void);
|
||||
extern void __init zoom_peripherals_init(void);
|
||||
extern void __init zoom_display_init(void);
|
||||
|
||||
#define ZOOM2_HEADSET_EXTMUTE_GPIO 153
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/platform_data/asoc-ti-mcbsp.h>
|
||||
@ -23,8 +24,6 @@
|
||||
#include <plat/omap_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include "control.h"
|
||||
|
||||
/*
|
||||
* FIXME: Find a mechanism to enable/disable runtime the McBSP ICLK autoidle.
|
||||
* Sidetone needs non-gated ICLK and sidetone autoidle is broken.
|
||||
@ -32,112 +31,6 @@
|
||||
#include "cm2xxx_3xxx.h"
|
||||
#include "cm-regbits-34xx.h"
|
||||
|
||||
/* McBSP1 internal signal muxing function for OMAP2/3 */
|
||||
static int omap2_mcbsp1_mux_rx_clk(struct device *dev, const char *signal,
|
||||
const char *src)
|
||||
{
|
||||
u32 v;
|
||||
|
||||
v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
|
||||
|
||||
if (!strcmp(signal, "clkr")) {
|
||||
if (!strcmp(src, "clkr"))
|
||||
v &= ~OMAP2_MCBSP1_CLKR_MASK;
|
||||
else if (!strcmp(src, "clkx"))
|
||||
v |= OMAP2_MCBSP1_CLKR_MASK;
|
||||
else
|
||||
return -EINVAL;
|
||||
} else if (!strcmp(signal, "fsr")) {
|
||||
if (!strcmp(src, "fsr"))
|
||||
v &= ~OMAP2_MCBSP1_FSR_MASK;
|
||||
else if (!strcmp(src, "fsx"))
|
||||
v |= OMAP2_MCBSP1_FSR_MASK;
|
||||
else
|
||||
return -EINVAL;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* McBSP4 internal signal muxing function for OMAP4 */
|
||||
#define OMAP4_CONTROL_MCBSPLP_ALBCTRLRX_FSX (1 << 31)
|
||||
#define OMAP4_CONTROL_MCBSPLP_ALBCTRLRX_CLKX (1 << 30)
|
||||
static int omap4_mcbsp4_mux_rx_clk(struct device *dev, const char *signal,
|
||||
const char *src)
|
||||
{
|
||||
u32 v;
|
||||
|
||||
/*
|
||||
* In CONTROL_MCBSPLP register only bit 30 (CLKR mux), and bit 31 (FSR
|
||||
* mux) is used */
|
||||
v = omap4_ctrl_pad_readl(OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_MCBSPLP);
|
||||
|
||||
if (!strcmp(signal, "clkr")) {
|
||||
if (!strcmp(src, "clkr"))
|
||||
v &= ~OMAP4_CONTROL_MCBSPLP_ALBCTRLRX_CLKX;
|
||||
else if (!strcmp(src, "clkx"))
|
||||
v |= OMAP4_CONTROL_MCBSPLP_ALBCTRLRX_CLKX;
|
||||
else
|
||||
return -EINVAL;
|
||||
} else if (!strcmp(signal, "fsr")) {
|
||||
if (!strcmp(src, "fsr"))
|
||||
v &= ~OMAP4_CONTROL_MCBSPLP_ALBCTRLRX_FSX;
|
||||
else if (!strcmp(src, "fsx"))
|
||||
v |= OMAP4_CONTROL_MCBSPLP_ALBCTRLRX_FSX;
|
||||
else
|
||||
return -EINVAL;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
omap4_ctrl_pad_writel(v, OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_MCBSPLP);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* McBSP CLKS source switching function */
|
||||
static int omap2_mcbsp_set_clk_src(struct device *dev, struct clk *clk,
|
||||
const char *src)
|
||||
{
|
||||
struct clk *fck_src;
|
||||
char *fck_src_name;
|
||||
int r;
|
||||
|
||||
if (!strcmp(src, "clks_ext"))
|
||||
fck_src_name = "pad_fck";
|
||||
else if (!strcmp(src, "clks_fclk"))
|
||||
fck_src_name = "prcm_fck";
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
fck_src = clk_get(dev, fck_src_name);
|
||||
if (IS_ERR_OR_NULL(fck_src)) {
|
||||
pr_err("omap-mcbsp: %s: could not clk_get() %s\n", "clks",
|
||||
fck_src_name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pm_runtime_put_sync(dev);
|
||||
|
||||
r = clk_set_parent(clk, fck_src);
|
||||
if (IS_ERR_VALUE(r)) {
|
||||
pr_err("omap-mcbsp: %s: could not clk_set_parent() to %s\n",
|
||||
"clks", fck_src_name);
|
||||
clk_put(fck_src);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pm_runtime_get_sync(dev);
|
||||
|
||||
clk_put(fck_src);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int omap3_enable_st_clock(unsigned int id, bool enable)
|
||||
{
|
||||
unsigned int w;
|
||||
@ -179,17 +72,11 @@ static int __init omap_init_mcbsp(struct omap_hwmod *oh, void *unused)
|
||||
pdata->reg_size = 4;
|
||||
pdata->has_ccr = true;
|
||||
}
|
||||
pdata->set_clk_src = omap2_mcbsp_set_clk_src;
|
||||
|
||||
/* On OMAP2/3 the McBSP1 port has 6 pin configuration */
|
||||
if (id == 1 && oh->class->rev < MCBSP_CONFIG_TYPE4)
|
||||
pdata->mux_signal = omap2_mcbsp1_mux_rx_clk;
|
||||
|
||||
/* On OMAP4 the McBSP4 port has 6 pin configuration */
|
||||
if (id == 4 && oh->class->rev == MCBSP_CONFIG_TYPE4)
|
||||
pdata->mux_signal = omap4_mcbsp4_mux_rx_clk;
|
||||
|
||||
if (oh->class->rev == MCBSP_CONFIG_TYPE3) {
|
||||
if (oh->class->rev == MCBSP_CONFIG_TYPE2) {
|
||||
/* The FIFO has 128 locations */
|
||||
pdata->buffer_size = 0x80;
|
||||
} else if (oh->class->rev == MCBSP_CONFIG_TYPE3) {
|
||||
if (id == 2)
|
||||
/* The FIFO has 1024 + 256 locations */
|
||||
pdata->buffer_size = 0x500;
|
||||
@ -225,7 +112,8 @@ static int __init omap_init_mcbsp(struct omap_hwmod *oh, void *unused)
|
||||
|
||||
static int __init omap2_mcbsp_init(void)
|
||||
{
|
||||
omap_hwmod_for_each_by_class("mcbsp", omap_init_mcbsp, NULL);
|
||||
if (!of_have_populated_dt())
|
||||
omap_hwmod_for_each_by_class("mcbsp", omap_init_mcbsp, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -5269,6 +5269,7 @@ static struct omap_hwmod_ocp_if omap44xx_l4_per__mcbsp4 = {
|
||||
|
||||
static struct omap_hwmod_addr_space omap44xx_mcpdm_addrs[] = {
|
||||
{
|
||||
.name = "mpu",
|
||||
.pa_start = 0x40132000,
|
||||
.pa_end = 0x4013207f,
|
||||
.flags = ADDR_TYPE_RT
|
||||
@ -5287,6 +5288,7 @@ static struct omap_hwmod_ocp_if omap44xx_l4_abe__mcpdm = {
|
||||
|
||||
static struct omap_hwmod_addr_space omap44xx_mcpdm_dma_addrs[] = {
|
||||
{
|
||||
.name = "dma",
|
||||
.pa_start = 0x49032000,
|
||||
.pa_end = 0x4903207f,
|
||||
.flags = ADDR_TYPE_RT
|
||||
|
@ -519,3 +519,30 @@ void __init omap4_pmic_get_config(struct twl4030_platform_data *pmic_data,
|
||||
pmic_data->v2v1 = &omap4_v2v1_idata;
|
||||
}
|
||||
#endif /* CONFIG_ARCH_OMAP4 */
|
||||
|
||||
#if defined(CONFIG_SND_OMAP_SOC_OMAP_TWL4030) || \
|
||||
defined(CONFIG_SND_OMAP_SOC_OMAP_TWL4030_MODULE)
|
||||
#include <linux/platform_data/omap-twl4030.h>
|
||||
|
||||
static struct omap_tw4030_pdata omap_twl4030_audio_data;
|
||||
|
||||
static struct platform_device audio_device = {
|
||||
.name = "omap-twl4030",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &omap_twl4030_audio_data,
|
||||
},
|
||||
};
|
||||
|
||||
void __init omap_twl4030_audio_init(char *card_name)
|
||||
{
|
||||
omap_twl4030_audio_data.card_name = card_name;
|
||||
platform_device_register(&audio_device);
|
||||
}
|
||||
|
||||
#else /* SOC_OMAP_TWL4030 */
|
||||
void __init omap_twl4030_audio_init(char *card_name)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif /* SOC_OMAP_TWL4030 */
|
||||
|
@ -60,4 +60,6 @@ void omap3_pmic_get_config(struct twl4030_platform_data *pmic_data,
|
||||
void omap4_pmic_get_config(struct twl4030_platform_data *pmic_data,
|
||||
u32 pdata_flags, u32 regulators_flags);
|
||||
|
||||
void omap_twl4030_audio_init(char *card_name);
|
||||
|
||||
#endif /* __OMAP_PMIC_COMMON__ */
|
||||
|
@ -91,7 +91,8 @@ static int samsung_dmadev_prepare(unsigned ch,
|
||||
break;
|
||||
case DMA_CYCLIC:
|
||||
desc = dmaengine_prep_dma_cyclic(chan, param->buf,
|
||||
param->len, param->period, param->direction);
|
||||
param->len, param->period, param->direction,
|
||||
DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
|
||||
break;
|
||||
default:
|
||||
dev_err(&chan->dev->device, "unsupported format\n");
|
||||
|
@ -587,6 +587,21 @@ static struct platform_device bfin_tdm = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) \
|
||||
|| defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||
static const char * const ad1836_link[] = {
|
||||
"bfin-tdm.0",
|
||||
"spi0.4",
|
||||
};
|
||||
static struct platform_device bfin_ad1836_machine = {
|
||||
.name = "bfin-snd-ad1836",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = (void *)ad1836_link,
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
||||
#if defined(CONFIG_MTD_M25P80) \
|
||||
|| defined(CONFIG_MTD_M25P80_MODULE)
|
||||
@ -1269,6 +1284,11 @@ static struct platform_device *stamp_devices[] __initdata = {
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
&bfin_tdm,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) || \
|
||||
defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||
&bfin_ad1836_machine,
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init ezkit_init(void)
|
||||
|
@ -617,6 +617,21 @@ static struct platform_device bfin_ac97_pcm = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) \
|
||||
|| defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||
static const char * const ad1836_link[] = {
|
||||
"bfin-tdm.0",
|
||||
"spi0.4",
|
||||
};
|
||||
static struct platform_device bfin_ad1836_machine = {
|
||||
.name = "bfin-snd-ad1836",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = (void *)ad1836_link,
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD73311) || \
|
||||
defined(CONFIG_SND_BF5XX_SOC_AD73311_MODULE)
|
||||
static const unsigned ad73311_gpio[] = {
|
||||
@ -754,6 +769,11 @@ static struct platform_device *stamp_devices[] __initdata = {
|
||||
&bfin_ac97_pcm,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) || \
|
||||
defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||
&bfin_ad1836_machine,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD73311) || \
|
||||
defined(CONFIG_SND_BF5XX_SOC_AD73311_MODULE)
|
||||
&bfin_ad73311_machine,
|
||||
|
@ -2641,6 +2641,21 @@ static struct platform_device bfin_ac97_pcm = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) \
|
||||
|| defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||
static const char * const ad1836_link[] = {
|
||||
"bfin-tdm.0",
|
||||
"spi0.4",
|
||||
};
|
||||
static struct platform_device bfin_ad1836_machine = {
|
||||
.name = "bfin-snd-ad1836",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = (void *)ad1836_link,
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD73311) || \
|
||||
defined(CONFIG_SND_BF5XX_SOC_AD73311_MODULE)
|
||||
static const unsigned ad73311_gpio[] = {
|
||||
@ -2927,6 +2942,11 @@ static struct platform_device *stamp_devices[] __initdata = {
|
||||
&bfin_ac97_pcm,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) || \
|
||||
defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||
&bfin_ad1836_machine,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD73311) || \
|
||||
defined(CONFIG_SND_BF5XX_SOC_AD73311_MODULE)
|
||||
&bfin_ad73311_machine,
|
||||
|
@ -539,6 +539,21 @@ static struct platform_device bfin_ac97 = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) \
|
||||
|| defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||
static const char * const ad1836_link[] = {
|
||||
"bfin-tdm.0",
|
||||
"spi0.4",
|
||||
};
|
||||
static struct platform_device bfin_ad1836_machine = {
|
||||
.name = "bfin-snd-ad1836",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = (void *)ad1836_link,
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct platform_device *ezkit_devices[] __initdata = {
|
||||
|
||||
&bfin_dpmc,
|
||||
@ -603,6 +618,11 @@ static struct platform_device *ezkit_devices[] __initdata = {
|
||||
#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
&bfin_ac97,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) || \
|
||||
defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||
&bfin_ad1836_machine,
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init net2272_init(void)
|
||||
|
@ -818,6 +818,21 @@ static struct platform_device bfin_i2s = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) \
|
||||
|| defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||
static const char * const ad1836_link[] = {
|
||||
"bfin-tdm.0",
|
||||
"spi0.76",
|
||||
};
|
||||
static struct platform_device bfin_ad1836_machine = {
|
||||
.name = "bfin-snd-ad1836",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = (void *)ad1836_link,
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_SOC_BFIN_EVAL_ADAU1X61) || \
|
||||
defined(CONFIG_SND_SOC_BFIN_EVAL_ADAU1X61_MODULE)
|
||||
static struct platform_device adau1761_device = {
|
||||
@ -1557,6 +1572,10 @@ static struct platform_device *ezkit_devices[] __initdata = {
|
||||
defined(CONFIG_SND_BF6XX_SOC_I2S_MODULE)
|
||||
&bfin_i2s,
|
||||
#endif
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) || \
|
||||
defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||
&bfin_ad1836_machine,
|
||||
#endif
|
||||
#if defined(CONFIG_SND_SOC_BFIN_EVAL_ADAU1X61) || \
|
||||
defined(CONFIG_SND_SOC_BFIN_EVAL_ADAU1X61_MODULE)
|
||||
&adau1761_device,
|
||||
|
@ -852,12 +852,13 @@ atc_dma_cyclic_fill_desc(struct dma_chan *chan, struct at_desc *desc,
|
||||
* @buf_len: total number of bytes for the entire buffer
|
||||
* @period_len: number of bytes for each period
|
||||
* @direction: transfer direction, to or from device
|
||||
* @flags: tx descriptor status flags
|
||||
* @context: transfer context (ignored)
|
||||
*/
|
||||
static struct dma_async_tx_descriptor *
|
||||
atc_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
|
||||
size_t period_len, enum dma_transfer_direction direction,
|
||||
void *context)
|
||||
unsigned long flags, void *context)
|
||||
{
|
||||
struct at_dma_chan *atchan = to_at_dma_chan(chan);
|
||||
struct at_dma_slave *atslave = chan->private;
|
||||
|
@ -1120,6 +1120,7 @@ fail:
|
||||
* @buf_len: length of the buffer (in bytes)
|
||||
* @period_len: length of a single period
|
||||
* @dir: direction of the operation
|
||||
* @flags: tx descriptor status flags
|
||||
* @context: operation context (ignored)
|
||||
*
|
||||
* Prepares a descriptor for cyclic DMA operation. This means that once the
|
||||
@ -1133,7 +1134,8 @@ fail:
|
||||
static struct dma_async_tx_descriptor *
|
||||
ep93xx_dma_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t dma_addr,
|
||||
size_t buf_len, size_t period_len,
|
||||
enum dma_transfer_direction dir, void *context)
|
||||
enum dma_transfer_direction dir, unsigned long flags,
|
||||
void *context)
|
||||
{
|
||||
struct ep93xx_dma_chan *edmac = to_ep93xx_dma_chan(chan);
|
||||
struct ep93xx_dma_desc *desc, *first;
|
||||
|
@ -801,7 +801,7 @@ static struct dma_async_tx_descriptor *imxdma_prep_slave_sg(
|
||||
static struct dma_async_tx_descriptor *imxdma_prep_dma_cyclic(
|
||||
struct dma_chan *chan, dma_addr_t dma_addr, size_t buf_len,
|
||||
size_t period_len, enum dma_transfer_direction direction,
|
||||
void *context)
|
||||
unsigned long flags, void *context)
|
||||
{
|
||||
struct imxdma_channel *imxdmac = to_imxdma_chan(chan);
|
||||
struct imxdma_engine *imxdma = imxdmac->imxdma;
|
||||
|
@ -1012,7 +1012,7 @@ err_out:
|
||||
static struct dma_async_tx_descriptor *sdma_prep_dma_cyclic(
|
||||
struct dma_chan *chan, dma_addr_t dma_addr, size_t buf_len,
|
||||
size_t period_len, enum dma_transfer_direction direction,
|
||||
void *context)
|
||||
unsigned long flags, void *context)
|
||||
{
|
||||
struct sdma_channel *sdmac = to_sdma_chan(chan);
|
||||
struct sdma_engine *sdma = sdmac->sdma;
|
||||
|
@ -358,7 +358,7 @@ struct mmp_tdma_desc *mmp_tdma_alloc_descriptor(struct mmp_tdma_chan *tdmac)
|
||||
static struct dma_async_tx_descriptor *mmp_tdma_prep_dma_cyclic(
|
||||
struct dma_chan *chan, dma_addr_t dma_addr, size_t buf_len,
|
||||
size_t period_len, enum dma_transfer_direction direction,
|
||||
void *context)
|
||||
unsigned long flags, void *context)
|
||||
{
|
||||
struct mmp_tdma_chan *tdmac = to_mmp_tdma_chan(chan);
|
||||
struct mmp_tdma_desc *desc;
|
||||
|
@ -531,7 +531,7 @@ err_out:
|
||||
static struct dma_async_tx_descriptor *mxs_dma_prep_dma_cyclic(
|
||||
struct dma_chan *chan, dma_addr_t dma_addr, size_t buf_len,
|
||||
size_t period_len, enum dma_transfer_direction direction,
|
||||
void *context)
|
||||
unsigned long flags, void *context)
|
||||
{
|
||||
struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan);
|
||||
struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
|
||||
|
@ -36,6 +36,7 @@ struct omap_chan {
|
||||
struct dma_slave_config cfg;
|
||||
unsigned dma_sig;
|
||||
bool cyclic;
|
||||
bool paused;
|
||||
|
||||
int dma_ch;
|
||||
struct omap_desc *desc;
|
||||
@ -367,7 +368,8 @@ static struct dma_async_tx_descriptor *omap_dma_prep_slave_sg(
|
||||
|
||||
static struct dma_async_tx_descriptor *omap_dma_prep_dma_cyclic(
|
||||
struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
|
||||
size_t period_len, enum dma_transfer_direction dir, void *context)
|
||||
size_t period_len, enum dma_transfer_direction dir, unsigned long flags,
|
||||
void *context)
|
||||
{
|
||||
struct omap_chan *c = to_omap_dma_chan(chan);
|
||||
enum dma_slave_buswidth dev_width;
|
||||
@ -415,7 +417,10 @@ static struct dma_async_tx_descriptor *omap_dma_prep_dma_cyclic(
|
||||
d->dev_addr = dev_addr;
|
||||
d->fi = burst;
|
||||
d->es = es;
|
||||
d->sync_mode = OMAP_DMA_SYNC_PACKET;
|
||||
if (burst)
|
||||
d->sync_mode = OMAP_DMA_SYNC_PACKET;
|
||||
else
|
||||
d->sync_mode = OMAP_DMA_SYNC_ELEMENT;
|
||||
d->sync_type = sync_type;
|
||||
d->periph_port = OMAP_DMA_PORT_MPUI;
|
||||
d->sg[0].addr = buf_addr;
|
||||
@ -426,7 +431,10 @@ static struct dma_async_tx_descriptor *omap_dma_prep_dma_cyclic(
|
||||
if (!c->cyclic) {
|
||||
c->cyclic = true;
|
||||
omap_dma_link_lch(c->dma_ch, c->dma_ch);
|
||||
omap_enable_dma_irq(c->dma_ch, OMAP_DMA_FRAME_IRQ);
|
||||
|
||||
if (flags & DMA_PREP_INTERRUPT)
|
||||
omap_enable_dma_irq(c->dma_ch, OMAP_DMA_FRAME_IRQ);
|
||||
|
||||
omap_disable_dma_irq(c->dma_ch, OMAP_DMA_BLOCK_IRQ);
|
||||
}
|
||||
|
||||
@ -435,7 +443,7 @@ static struct dma_async_tx_descriptor *omap_dma_prep_dma_cyclic(
|
||||
omap_set_dma_dest_burst_mode(c->dma_ch, OMAP_DMA_DATA_BURST_16);
|
||||
}
|
||||
|
||||
return vchan_tx_prep(&c->vc, &d->vd, DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
|
||||
return vchan_tx_prep(&c->vc, &d->vd, flags);
|
||||
}
|
||||
|
||||
static int omap_dma_slave_config(struct omap_chan *c, struct dma_slave_config *cfg)
|
||||
@ -469,11 +477,14 @@ static int omap_dma_terminate_all(struct omap_chan *c)
|
||||
*/
|
||||
if (c->desc) {
|
||||
c->desc = NULL;
|
||||
omap_stop_dma(c->dma_ch);
|
||||
/* Avoid stopping the dma twice */
|
||||
if (!c->paused)
|
||||
omap_stop_dma(c->dma_ch);
|
||||
}
|
||||
|
||||
if (c->cyclic) {
|
||||
c->cyclic = false;
|
||||
c->paused = false;
|
||||
omap_dma_unlink_lch(c->dma_ch, c->dma_ch);
|
||||
}
|
||||
|
||||
@ -486,14 +497,30 @@ static int omap_dma_terminate_all(struct omap_chan *c)
|
||||
|
||||
static int omap_dma_pause(struct omap_chan *c)
|
||||
{
|
||||
/* FIXME: not supported by platform private API */
|
||||
return -EINVAL;
|
||||
/* Pause/Resume only allowed with cyclic mode */
|
||||
if (!c->cyclic)
|
||||
return -EINVAL;
|
||||
|
||||
if (!c->paused) {
|
||||
omap_stop_dma(c->dma_ch);
|
||||
c->paused = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int omap_dma_resume(struct omap_chan *c)
|
||||
{
|
||||
/* FIXME: not supported by platform private API */
|
||||
return -EINVAL;
|
||||
/* Pause/Resume only allowed with cyclic mode */
|
||||
if (!c->cyclic)
|
||||
return -EINVAL;
|
||||
|
||||
if (c->paused) {
|
||||
omap_start_dma(c->dma_ch);
|
||||
c->paused = false;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int omap_dma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
|
||||
|
@ -2685,7 +2685,7 @@ static inline int get_burst_len(struct dma_pl330_desc *desc, size_t len)
|
||||
static struct dma_async_tx_descriptor *pl330_prep_dma_cyclic(
|
||||
struct dma_chan *chan, dma_addr_t dma_addr, size_t len,
|
||||
size_t period_len, enum dma_transfer_direction direction,
|
||||
void *context)
|
||||
unsigned long flags, void *context)
|
||||
{
|
||||
struct dma_pl330_desc *desc;
|
||||
struct dma_pl330_chan *pch = to_pchan(chan);
|
||||
|
@ -614,7 +614,7 @@ static struct dma_async_tx_descriptor *sa11x0_dma_prep_slave_sg(
|
||||
|
||||
static struct dma_async_tx_descriptor *sa11x0_dma_prep_dma_cyclic(
|
||||
struct dma_chan *chan, dma_addr_t addr, size_t size, size_t period,
|
||||
enum dma_transfer_direction dir, void *context)
|
||||
enum dma_transfer_direction dir, unsigned long flags, void *context)
|
||||
{
|
||||
struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
|
||||
struct sa11x0_dma_desc *txd;
|
||||
|
@ -489,7 +489,7 @@ err_dir:
|
||||
static struct dma_async_tx_descriptor *
|
||||
sirfsoc_dma_prep_cyclic(struct dma_chan *chan, dma_addr_t addr,
|
||||
size_t buf_len, size_t period_len,
|
||||
enum dma_transfer_direction direction, void *context)
|
||||
enum dma_transfer_direction direction, unsigned long flags, void *context)
|
||||
{
|
||||
struct sirfsoc_dma_chan *schan = dma_chan_to_sirfsoc_dma_chan(chan);
|
||||
struct sirfsoc_dma_desc *sdesc = NULL;
|
||||
|
@ -2347,7 +2347,8 @@ static struct dma_async_tx_descriptor *d40_prep_slave_sg(struct dma_chan *chan,
|
||||
static struct dma_async_tx_descriptor *
|
||||
dma40_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t dma_addr,
|
||||
size_t buf_len, size_t period_len,
|
||||
enum dma_transfer_direction direction, void *context)
|
||||
enum dma_transfer_direction direction, unsigned long flags,
|
||||
void *context)
|
||||
{
|
||||
unsigned int periods = buf_len / period_len;
|
||||
struct dma_async_tx_descriptor *txd;
|
||||
|
@ -990,7 +990,7 @@ static struct dma_async_tx_descriptor *tegra_dma_prep_slave_sg(
|
||||
struct dma_async_tx_descriptor *tegra_dma_prep_dma_cyclic(
|
||||
struct dma_chan *dc, dma_addr_t buf_addr, size_t buf_len,
|
||||
size_t period_len, enum dma_transfer_direction direction,
|
||||
void *context)
|
||||
unsigned long flags, void *context)
|
||||
{
|
||||
struct tegra_dma_channel *tdc = to_tegra_dma_chan(dc);
|
||||
struct tegra_dma_desc *dma_desc = NULL;
|
||||
|
@ -591,7 +591,7 @@ struct dma_device {
|
||||
struct dma_async_tx_descriptor *(*device_prep_dma_cyclic)(
|
||||
struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
|
||||
size_t period_len, enum dma_transfer_direction direction,
|
||||
void *context);
|
||||
unsigned long flags, void *context);
|
||||
struct dma_async_tx_descriptor *(*device_prep_interleaved_dma)(
|
||||
struct dma_chan *chan, struct dma_interleaved_template *xt,
|
||||
unsigned long flags);
|
||||
@ -653,10 +653,11 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_rio_sg(
|
||||
|
||||
static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_cyclic(
|
||||
struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
|
||||
size_t period_len, enum dma_transfer_direction dir)
|
||||
size_t period_len, enum dma_transfer_direction dir,
|
||||
unsigned long flags)
|
||||
{
|
||||
return chan->device->device_prep_dma_cyclic(chan, buf_addr, buf_len,
|
||||
period_len, dir, NULL);
|
||||
period_len, dir, flags, NULL);
|
||||
}
|
||||
|
||||
static inline int dmaengine_terminate_all(struct dma_chan *chan)
|
||||
|
@ -664,7 +664,7 @@ struct twl4030_codec_data {
|
||||
unsigned int check_defaults:1;
|
||||
unsigned int reset_registers:1;
|
||||
unsigned int hs_extmute:1;
|
||||
void (*set_hs_extmute)(int mute);
|
||||
int hs_extmute_gpio;
|
||||
};
|
||||
|
||||
struct twl4030_vibra_data {
|
||||
|
@ -164,6 +164,10 @@ struct wm8994_pdata {
|
||||
int num_micd_rates;
|
||||
struct wm8958_micd_rate *micd_rates;
|
||||
|
||||
/* Power up delays to add after microphone bias power up (ms) */
|
||||
int micb1_delay;
|
||||
int micb2_delay;
|
||||
|
||||
/* LINEOUT can be differential or single ended */
|
||||
unsigned int lineout1_diff:1;
|
||||
unsigned int lineout2_diff:1;
|
||||
|
11
include/linux/platform_data/asoc-mx27vis.h
Normal file
11
include/linux/platform_data/asoc-mx27vis.h
Normal file
@ -0,0 +1,11 @@
|
||||
#ifndef __PLATFORM_DATA_ASOC_MX27VIS_H
|
||||
#define __PLATFORM_DATA_ASOC_MX27VIS_H
|
||||
|
||||
struct snd_mx27vis_platform_data {
|
||||
int amp_gain0_gpio;
|
||||
int amp_gain1_gpio;
|
||||
int amp_mutel_gpio;
|
||||
int amp_muter_gpio;
|
||||
};
|
||||
|
||||
#endif /* __PLATFORM_DATA_ASOC_MX27VIS_H */
|
@ -47,8 +47,6 @@ struct omap_mcbsp_platform_data {
|
||||
bool has_wakeup; /* Wakeup capability */
|
||||
bool has_ccr; /* Transceiver has configuration control registers */
|
||||
int (*enable_st_clock)(unsigned int, bool);
|
||||
int (*set_clk_src)(struct device *dev, struct clk *clk, const char *src);
|
||||
int (*mux_signal)(struct device *dev, const char *signal, const char *src);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -1,59 +1,26 @@
|
||||
/*
|
||||
* <mach/asp.h> - DaVinci Audio Serial Port support
|
||||
* TI DaVinci Audio Serial Port support
|
||||
*
|
||||
* Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.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.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#ifndef __ASM_ARCH_DAVINCI_ASP_H
|
||||
#define __ASM_ARCH_DAVINCI_ASP_H
|
||||
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/edma.h>
|
||||
|
||||
/* Bases of dm644x and dm355 register banks */
|
||||
#define DAVINCI_ASP0_BASE 0x01E02000
|
||||
#define DAVINCI_ASP1_BASE 0x01E04000
|
||||
|
||||
/* Bases of dm365 register banks */
|
||||
#define DAVINCI_DM365_ASP0_BASE 0x01D02000
|
||||
|
||||
/* Bases of dm646x register banks */
|
||||
#define DAVINCI_DM646X_MCASP0_REG_BASE 0x01D01000
|
||||
#define DAVINCI_DM646X_MCASP1_REG_BASE 0x01D01800
|
||||
|
||||
/* Bases of da850/da830 McASP0 register banks */
|
||||
#define DAVINCI_DA8XX_MCASP0_REG_BASE 0x01D00000
|
||||
|
||||
/* Bases of da830 McASP1 register banks */
|
||||
#define DAVINCI_DA830_MCASP1_REG_BASE 0x01D04000
|
||||
|
||||
/* EDMA channels of dm644x and dm355 */
|
||||
#define DAVINCI_DMA_ASP0_TX 2
|
||||
#define DAVINCI_DMA_ASP0_RX 3
|
||||
#define DAVINCI_DMA_ASP1_TX 8
|
||||
#define DAVINCI_DMA_ASP1_RX 9
|
||||
|
||||
/* EDMA channels of dm646x */
|
||||
#define DAVINCI_DM646X_DMA_MCASP0_AXEVT0 6
|
||||
#define DAVINCI_DM646X_DMA_MCASP0_AREVT0 9
|
||||
#define DAVINCI_DM646X_DMA_MCASP1_AXEVT1 12
|
||||
|
||||
/* EDMA channels of da850/da830 McASP0 */
|
||||
#define DAVINCI_DA8XX_DMA_MCASP0_AREVT 0
|
||||
#define DAVINCI_DA8XX_DMA_MCASP0_AXEVT 1
|
||||
|
||||
/* EDMA channels of da830 McASP1 */
|
||||
#define DAVINCI_DA830_DMA_MCASP1_AREVT 2
|
||||
#define DAVINCI_DA830_DMA_MCASP1_AXEVT 3
|
||||
|
||||
/* Interrupts */
|
||||
#define DAVINCI_ASP0_RX_INT IRQ_MBRINT
|
||||
#define DAVINCI_ASP0_TX_INT IRQ_MBXINT
|
||||
#define DAVINCI_ASP1_RX_INT IRQ_MBRINT
|
||||
#define DAVINCI_ASP1_TX_INT IRQ_MBXINT
|
||||
#ifndef __DAVINCI_ASP_H
|
||||
#define __DAVINCI_ASP_H
|
||||
|
||||
struct snd_platform_data {
|
||||
u32 tx_dma_offset;
|
||||
u32 rx_dma_offset;
|
||||
enum dma_event_q asp_chan_q; /* event queue number for ASP channel */
|
||||
enum dma_event_q ram_chan_q; /* event queue number for RAM channel */
|
||||
int asp_chan_q; /* event queue number for ASP channel */
|
||||
int ram_chan_q; /* event queue number for RAM channel */
|
||||
unsigned int codec_fmt;
|
||||
/*
|
||||
* Allowing this is more efficient and eliminates left and right swaps
|
||||
@ -70,7 +37,7 @@ struct snd_platform_data {
|
||||
* and MCBSP_CLKS.
|
||||
* Depending on different hardware connections it is possible
|
||||
* to use this setting to change the behaviour of McBSP
|
||||
* driver. The dm365_clk_input_pin enum is available for dm365
|
||||
* driver.
|
||||
*/
|
||||
int clk_input_pin;
|
||||
|
||||
@ -120,10 +87,11 @@ struct snd_platform_data {
|
||||
enum {
|
||||
MCASP_VERSION_1 = 0, /* DM646x */
|
||||
MCASP_VERSION_2, /* DA8xx/OMAPL1x */
|
||||
MCASP_VERSION_3, /* TI81xx/AM33xx */
|
||||
};
|
||||
|
||||
enum dm365_clk_input_pin {
|
||||
MCBSP_CLKR = 0, /* DM365 */
|
||||
enum mcbsp_clk_input_pin {
|
||||
MCBSP_CLKR = 0, /* as in DM365 */
|
||||
MCBSP_CLKS,
|
||||
};
|
||||
|
||||
@ -134,4 +102,4 @@ enum dm365_clk_input_pin {
|
||||
#define DAVINCI_MCASP_IIS_MODE 0
|
||||
#define DAVINCI_MCASP_DIT_MODE 1
|
||||
|
||||
#endif /* __ASM_ARCH_DAVINCI_ASP_H */
|
||||
#endif
|
32
include/linux/platform_data/omap-twl4030.h
Normal file
32
include/linux/platform_data/omap-twl4030.h
Normal file
@ -0,0 +1,32 @@
|
||||
/**
|
||||
* omap-twl4030.h - ASoC machine driver for TI SoC based boards with twl4030
|
||||
* codec, header.
|
||||
*
|
||||
* Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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 _OMAP_TWL4030_H_
|
||||
#define _OMAP_TWL4030_H_
|
||||
|
||||
struct omap_tw4030_pdata {
|
||||
const char *card_name;
|
||||
};
|
||||
|
||||
#endif /* _OMAP_TWL4030_H_ */
|
@ -422,6 +422,7 @@
|
||||
*/
|
||||
|
||||
struct snd_ac97;
|
||||
struct snd_pcm_chmap;
|
||||
|
||||
struct snd_ac97_build_ops {
|
||||
int (*build_3d) (struct snd_ac97 *ac97);
|
||||
@ -528,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)
|
||||
|
@ -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 */
|
||||
|
@ -472,6 +472,45 @@ enum {
|
||||
SNDRV_PCM_TSTAMP_TYPE_LAST = SNDRV_PCM_TSTAMP_TYPE_MONOTONIC,
|
||||
};
|
||||
|
||||
/* channel positions */
|
||||
enum {
|
||||
SNDRV_CHMAP_UNKNOWN = 0,
|
||||
SNDRV_CHMAP_NA, /* N/A, silent */
|
||||
SNDRV_CHMAP_MONO, /* mono stream */
|
||||
/* this follows the alsa-lib mixer channel value + 3 */
|
||||
SNDRV_CHMAP_FL, /* front left */
|
||||
SNDRV_CHMAP_FR, /* front right */
|
||||
SNDRV_CHMAP_RL, /* rear left */
|
||||
SNDRV_CHMAP_RR, /* rear right */
|
||||
SNDRV_CHMAP_FC, /* front center */
|
||||
SNDRV_CHMAP_LFE, /* LFE */
|
||||
SNDRV_CHMAP_SL, /* side left */
|
||||
SNDRV_CHMAP_SR, /* side right */
|
||||
SNDRV_CHMAP_RC, /* rear center */
|
||||
/* new definitions */
|
||||
SNDRV_CHMAP_FLC, /* front left center */
|
||||
SNDRV_CHMAP_FRC, /* front right center */
|
||||
SNDRV_CHMAP_RLC, /* rear left center */
|
||||
SNDRV_CHMAP_RRC, /* rear right center */
|
||||
SNDRV_CHMAP_FLW, /* front left wide */
|
||||
SNDRV_CHMAP_FRW, /* front right wide */
|
||||
SNDRV_CHMAP_FLH, /* front left high */
|
||||
SNDRV_CHMAP_FCH, /* front center high */
|
||||
SNDRV_CHMAP_FRH, /* front right high */
|
||||
SNDRV_CHMAP_TC, /* top center */
|
||||
SNDRV_CHMAP_TFL, /* top front left */
|
||||
SNDRV_CHMAP_TFR, /* top front right */
|
||||
SNDRV_CHMAP_TFC, /* top front center */
|
||||
SNDRV_CHMAP_TRL, /* top rear left */
|
||||
SNDRV_CHMAP_TRR, /* top rear right */
|
||||
SNDRV_CHMAP_TRC, /* top rear center */
|
||||
SNDRV_CHMAP_LAST = SNDRV_CHMAP_TRC,
|
||||
};
|
||||
|
||||
#define SNDRV_CHMAP_POSITION_MASK 0xffff
|
||||
#define SNDRV_CHMAP_PHASE_INVERSE (0x01 << 16)
|
||||
#define SNDRV_CHMAP_DRIVER_SPEC (0x02 << 16)
|
||||
|
||||
#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)
|
||||
|
@ -61,6 +61,7 @@ struct snd_compr_runtime {
|
||||
u64 total_bytes_available;
|
||||
u64 total_bytes_transferred;
|
||||
wait_queue_head_t sleep;
|
||||
void *private_data;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -72,6 +72,7 @@
|
||||
#define SND_AUDIOCODEC_IEC61937 ((__u32) 0x0000000B)
|
||||
#define SND_AUDIOCODEC_G723_1 ((__u32) 0x0000000C)
|
||||
#define SND_AUDIOCODEC_G729 ((__u32) 0x0000000D)
|
||||
#define SND_AUDIOCODEC_MAX SND_AUDIOCODEC_G729
|
||||
|
||||
/*
|
||||
* Profile and modes are listed with bit masks. This allows for a
|
||||
|
33
include/sound/da9055.h
Normal file
33
include/sound/da9055.h
Normal file
@ -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
|
@ -1788,7 +1788,7 @@ struct snd_emu10k1 {
|
||||
unsigned int efx_voices_mask[2];
|
||||
unsigned int next_free_voice;
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
unsigned int *saved_ptr;
|
||||
unsigned int *saved_gpr;
|
||||
unsigned int *tram_val_saved;
|
||||
@ -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);
|
||||
|
@ -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>
|
||||
|
||||
|
@ -98,8 +98,10 @@ 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;
|
||||
return addr + offset % PAGE_SIZE;
|
||||
@ -108,10 +110,31 @@ static inline dma_addr_t snd_sgbuf_get_addr(struct snd_sg_buf *sgbuf, size_t off
|
||||
/*
|
||||
* 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 */
|
||||
|
@ -437,6 +437,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 {
|
||||
@ -982,53 +983,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)
|
||||
@ -1086,4 +1076,51 @@ static inline const char *snd_pcm_stream_str(struct snd_pcm_substream *substream
|
||||
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);
|
||||
|
||||
#endif /* __SOUND_PCM_H */
|
||||
|
@ -18,6 +18,7 @@
|
||||
|
||||
struct snd_pcm_substream;
|
||||
struct snd_soc_dapm_widget;
|
||||
struct snd_compr_stream;
|
||||
|
||||
/*
|
||||
* DAI hardware audio formats.
|
||||
@ -205,6 +206,8 @@ struct snd_soc_dai_driver {
|
||||
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 */
|
||||
const struct snd_soc_dai_ops *ops;
|
||||
|
@ -244,10 +244,11 @@ struct device;
|
||||
{ .id = snd_soc_dapm_supply, .name = wname, .reg = wreg, \
|
||||
.shift = wshift, .invert = winvert, .event = wevent, \
|
||||
.event_flags = wflags}
|
||||
#define SND_SOC_DAPM_REGULATOR_SUPPLY(wname, wdelay) \
|
||||
#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 }
|
||||
.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD, \
|
||||
.invert = wflags}
|
||||
|
||||
|
||||
/* dapm kcontrol types */
|
||||
@ -319,6 +320,9 @@ struct device;
|
||||
#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;
|
||||
@ -412,6 +416,7 @@ void snd_soc_dapm_auto_nc_codec_pins(struct snd_soc_codec *codec);
|
||||
|
||||
/* Mostly internal - should not normally be used */
|
||||
void dapm_mark_dirty(struct snd_soc_dapm_widget *w, const char *reason);
|
||||
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,
|
||||
@ -510,7 +515,6 @@ struct snd_soc_dapm_widget {
|
||||
/* dapm control */
|
||||
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 */
|
||||
|
@ -20,8 +20,10 @@
|
||||
#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>
|
||||
|
||||
@ -159,7 +161,8 @@
|
||||
.platform_max = xmax} }
|
||||
#define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmax, xtexts) \
|
||||
{ .reg = xreg, .shift_l = xshift_l, .shift_r = xshift_r, \
|
||||
.max = xmax, .texts = xtexts }
|
||||
.max = xmax, .texts = xtexts, \
|
||||
.mask = xmax ? roundup_pow_of_two(xmax) - 1 : 0}
|
||||
#define SOC_ENUM_SINGLE(xreg, xshift, xmax, xtexts) \
|
||||
SOC_ENUM_DOUBLE(xreg, xshift, xshift, xmax, xtexts)
|
||||
#define SOC_ENUM_SINGLE_EXT(xmax, xtexts) \
|
||||
@ -399,6 +402,7 @@ int snd_soc_platform_read(struct snd_soc_platform *platform,
|
||||
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);
|
||||
@ -632,6 +636,13 @@ 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 *);
|
||||
};
|
||||
|
||||
/* SoC cache ops */
|
||||
struct snd_soc_cache_ops {
|
||||
const char *name;
|
||||
@ -787,9 +798,12 @@ struct snd_soc_platform_driver {
|
||||
snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *,
|
||||
struct snd_soc_dai *);
|
||||
|
||||
/* platform stream ops */
|
||||
/* platform stream pcm ops */
|
||||
struct snd_pcm_ops *ops;
|
||||
|
||||
/* platform stream compress ops */
|
||||
struct snd_compr_ops *compr_ops;
|
||||
|
||||
/* platform stream completion event */
|
||||
int (*stream_event)(struct snd_soc_dapm_context *dapm, int event);
|
||||
|
||||
@ -891,6 +905,7 @@ struct snd_soc_dai_link {
|
||||
|
||||
/* machine stream operations */
|
||||
struct snd_soc_ops *ops;
|
||||
struct snd_soc_compr_ops *compr_ops;
|
||||
};
|
||||
|
||||
struct snd_soc_codec_conf {
|
||||
@ -1027,6 +1042,7 @@ struct snd_soc_pcm_runtime {
|
||||
|
||||
/* 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;
|
||||
|
@ -1,6 +1,4 @@
|
||||
/*
|
||||
* arch/arm/mach-tegra/include/mach/tegra_wm8903_pdata.h
|
||||
*
|
||||
* Copyright 2011 NVIDIA, Inc.
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
@ -14,6 +12,9 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __SOUND_TEGRA_WM38903_H
|
||||
#define __SOUND_TEGRA_WM38903_H
|
||||
|
||||
struct tegra_wm8903_platform_data {
|
||||
int gpio_spkr_en;
|
||||
int gpio_hp_det;
|
||||
@ -21,3 +22,5 @@ struct tegra_wm8903_platform_data {
|
||||
int gpio_int_mic_en;
|
||||
int gpio_ext_mic_en;
|
||||
};
|
||||
|
||||
#endif
|
@ -86,4 +86,12 @@
|
||||
|
||||
#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 */
|
||||
|
@ -1,3 +0,0 @@
|
||||
/* include/version.h */
|
||||
#define CONFIG_SND_VERSION "1.0.25"
|
||||
#define CONFIG_SND_DATE ""
|
27
include/sound/wm0010.h
Normal file
27
include/sound/wm0010.h
Normal file
@ -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
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -425,6 +425,26 @@ static int snd_compr_allocate_buffer(struct snd_compr_stream *stream,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_compress_check_input(struct snd_compr_params *params)
|
||||
{
|
||||
/* first let's check the buffer parameter's */
|
||||
if (params->buffer.fragment_size == 0 ||
|
||||
params->buffer.fragments > SIZE_MAX / params->buffer.fragment_size)
|
||||
return -EINVAL;
|
||||
|
||||
/* now codec parameters */
|
||||
if (params->codec.id == 0 || params->codec.id > SND_AUDIOCODEC_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
if (params->codec.ch_in == 0 || params->codec.ch_out == 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (!(params->codec.sample_rate & SNDRV_PCM_RATE_8000_192000))
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg)
|
||||
{
|
||||
@ -443,11 +463,17 @@ snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg)
|
||||
retval = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
retval = snd_compress_check_input(params);
|
||||
if (retval)
|
||||
goto out;
|
||||
|
||||
retval = snd_compr_allocate_buffer(stream, params);
|
||||
if (retval) {
|
||||
retval = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
retval = stream->ops->set_params(stream, params);
|
||||
if (retval)
|
||||
goto out;
|
||||
|
@ -246,6 +246,7 @@ struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new *ncontrol,
|
||||
kctl.count = ncontrol->count ? ncontrol->count : 1;
|
||||
access = ncontrol->access == 0 ? SNDRV_CTL_ELEM_ACCESS_READWRITE :
|
||||
(ncontrol->access & (SNDRV_CTL_ELEM_ACCESS_READWRITE|
|
||||
SNDRV_CTL_ELEM_ACCESS_VOLATILE|
|
||||
SNDRV_CTL_ELEM_ACCESS_INACTIVE|
|
||||
SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE|
|
||||
SNDRV_CTL_ELEM_ACCESS_TLV_COMMAND|
|
||||
|
@ -28,7 +28,7 @@
|
||||
#include <sound/core.h>
|
||||
#include <sound/minors.h>
|
||||
#include <sound/info.h>
|
||||
#include <sound/version.h>
|
||||
#include <linux/utsname.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <stdarg.h>
|
||||
@ -986,9 +986,8 @@ static struct snd_info_entry *snd_info_version_entry;
|
||||
static void snd_info_version_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer)
|
||||
{
|
||||
snd_iprintf(buffer,
|
||||
"Advanced Linux Sound Architecture Driver Version "
|
||||
CONFIG_SND_VERSION CONFIG_SND_DATE ".\n"
|
||||
);
|
||||
"Advanced Linux Sound Architecture Driver Version k%s.\n",
|
||||
init_utsname()->release);
|
||||
}
|
||||
|
||||
static int __init snd_info_version_init(void)
|
||||
|
@ -26,7 +26,6 @@
|
||||
#include <sound/core.h>
|
||||
#include <sound/minors.h>
|
||||
#include <sound/info.h>
|
||||
#include <sound/version.h>
|
||||
#include <linux/utsname.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
@ -94,7 +93,7 @@ static int snd_sndstat_show_strings(struct snd_info_buffer *buf, char *id, int d
|
||||
static void snd_sndstat_proc_read(struct snd_info_entry *entry,
|
||||
struct snd_info_buffer *buffer)
|
||||
{
|
||||
snd_iprintf(buffer, "Sound Driver:3.8.1a-980706 (ALSA v" CONFIG_SND_VERSION " emulation code)\n");
|
||||
snd_iprintf(buffer, "Sound Driver:3.8.1a-980706 (ALSA emulation code)\n");
|
||||
snd_iprintf(buffer, "Kernel: %s %s %s %s %s\n",
|
||||
init_utsname()->sysname,
|
||||
init_utsname()->nodename,
|
||||
|
@ -1046,6 +1046,7 @@ static int snd_mixer_oss_build_input(struct snd_mixer_oss *mixer, struct snd_mix
|
||||
|
||||
if (kctl->info(kctl, uinfo)) {
|
||||
up_read(&mixer->card->controls_rwsem);
|
||||
kfree(uinfo);
|
||||
return 0;
|
||||
}
|
||||
strcpy(str, ptr->name);
|
||||
@ -1061,6 +1062,7 @@ static int snd_mixer_oss_build_input(struct snd_mixer_oss *mixer, struct snd_mix
|
||||
uinfo->value.enumerated.item = slot.capture_item;
|
||||
if (kctl->info(kctl, uinfo)) {
|
||||
up_read(&mixer->card->controls_rwsem);
|
||||
kfree(uinfo);
|
||||
return 0;
|
||||
}
|
||||
if (!strcmp(uinfo->value.enumerated.name, str)) {
|
||||
|
@ -1105,6 +1105,10 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
|
||||
break;
|
||||
}
|
||||
snd_unregister_device(devtype, pcm->card, pcm->device);
|
||||
if (pcm->streams[cidx].chmap_kctl) {
|
||||
snd_ctl_remove(pcm->card, pcm->streams[cidx].chmap_kctl);
|
||||
pcm->streams[cidx].chmap_kctl = NULL;
|
||||
}
|
||||
}
|
||||
unlock:
|
||||
mutex_unlock(®ister_mutex);
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include <linux/export.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/control.h>
|
||||
#include <sound/tlv.h>
|
||||
#include <sound/info.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/pcm_params.h>
|
||||
@ -2302,3 +2303,216 @@ snd_pcm_sframes_t snd_pcm_lib_readv(struct snd_pcm_substream *substream,
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(snd_pcm_lib_readv);
|
||||
|
||||
/*
|
||||
* standard channel mapping helpers
|
||||
*/
|
||||
|
||||
/* default channel maps for multi-channel playbacks, up to 8 channels */
|
||||
const struct snd_pcm_chmap_elem snd_pcm_std_chmaps[] = {
|
||||
{ .channels = 1,
|
||||
.map = { SNDRV_CHMAP_MONO } },
|
||||
{ .channels = 2,
|
||||
.map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
|
||||
{ .channels = 4,
|
||||
.map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
|
||||
SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
|
||||
{ .channels = 6,
|
||||
.map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
|
||||
SNDRV_CHMAP_RL, SNDRV_CHMAP_RR,
|
||||
SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE } },
|
||||
{ .channels = 8,
|
||||
.map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
|
||||
SNDRV_CHMAP_RL, SNDRV_CHMAP_RR,
|
||||
SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE,
|
||||
SNDRV_CHMAP_SL, SNDRV_CHMAP_SR } },
|
||||
{ }
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(snd_pcm_std_chmaps);
|
||||
|
||||
/* alternative channel maps with CLFE <-> surround swapped for 6/8 channels */
|
||||
const struct snd_pcm_chmap_elem snd_pcm_alt_chmaps[] = {
|
||||
{ .channels = 1,
|
||||
.map = { SNDRV_CHMAP_MONO } },
|
||||
{ .channels = 2,
|
||||
.map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
|
||||
{ .channels = 4,
|
||||
.map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
|
||||
SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
|
||||
{ .channels = 6,
|
||||
.map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
|
||||
SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE,
|
||||
SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
|
||||
{ .channels = 8,
|
||||
.map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
|
||||
SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE,
|
||||
SNDRV_CHMAP_RL, SNDRV_CHMAP_RR,
|
||||
SNDRV_CHMAP_SL, SNDRV_CHMAP_SR } },
|
||||
{ }
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(snd_pcm_alt_chmaps);
|
||||
|
||||
static bool valid_chmap_channels(const struct snd_pcm_chmap *info, int ch)
|
||||
{
|
||||
if (ch > info->max_channels)
|
||||
return false;
|
||||
return !info->channel_mask || (info->channel_mask & (1U << ch));
|
||||
}
|
||||
|
||||
static int pcm_chmap_ctl_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo)
|
||||
{
|
||||
struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
|
||||
|
||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
|
||||
uinfo->count = 0;
|
||||
uinfo->count = info->max_channels;
|
||||
uinfo->value.integer.min = 0;
|
||||
uinfo->value.integer.max = SNDRV_CHMAP_LAST;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* get callback for channel map ctl element
|
||||
* stores the channel position firstly matching with the current channels
|
||||
*/
|
||||
static int pcm_chmap_ctl_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
|
||||
unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
|
||||
struct snd_pcm_substream *substream;
|
||||
const struct snd_pcm_chmap_elem *map;
|
||||
|
||||
if (snd_BUG_ON(!info->chmap))
|
||||
return -EINVAL;
|
||||
substream = snd_pcm_chmap_substream(info, idx);
|
||||
if (!substream)
|
||||
return -ENODEV;
|
||||
memset(ucontrol->value.integer.value, 0,
|
||||
sizeof(ucontrol->value.integer.value));
|
||||
if (!substream->runtime)
|
||||
return 0; /* no channels set */
|
||||
for (map = info->chmap; map->channels; map++) {
|
||||
int i;
|
||||
if (map->channels == substream->runtime->channels &&
|
||||
valid_chmap_channels(info, map->channels)) {
|
||||
for (i = 0; i < map->channels; i++)
|
||||
ucontrol->value.integer.value[i] = map->map[i];
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* tlv callback for channel map ctl element
|
||||
* expands the pre-defined channel maps in a form of TLV
|
||||
*/
|
||||
static int pcm_chmap_ctl_tlv(struct snd_kcontrol *kcontrol, int op_flag,
|
||||
unsigned int size, unsigned int __user *tlv)
|
||||
{
|
||||
struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
|
||||
const struct snd_pcm_chmap_elem *map;
|
||||
unsigned int __user *dst;
|
||||
int c, count = 0;
|
||||
|
||||
if (snd_BUG_ON(!info->chmap))
|
||||
return -EINVAL;
|
||||
if (size < 8)
|
||||
return -ENOMEM;
|
||||
if (put_user(SNDRV_CTL_TLVT_CONTAINER, tlv))
|
||||
return -EFAULT;
|
||||
size -= 8;
|
||||
dst = tlv + 2;
|
||||
for (map = info->chmap; map->channels; map++) {
|
||||
int chs_bytes = map->channels * 4;
|
||||
if (!valid_chmap_channels(info, map->channels))
|
||||
continue;
|
||||
if (size < 8)
|
||||
return -ENOMEM;
|
||||
if (put_user(SNDRV_CTL_TLVT_CHMAP_FIXED, dst) ||
|
||||
put_user(chs_bytes, dst + 1))
|
||||
return -EFAULT;
|
||||
dst += 2;
|
||||
size -= 8;
|
||||
count += 8;
|
||||
if (size < chs_bytes)
|
||||
return -ENOMEM;
|
||||
size -= chs_bytes;
|
||||
count += chs_bytes;
|
||||
for (c = 0; c < map->channels; c++) {
|
||||
if (put_user(map->map[c], dst))
|
||||
return -EFAULT;
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
if (put_user(count, tlv + 1))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pcm_chmap_ctl_private_free(struct snd_kcontrol *kcontrol)
|
||||
{
|
||||
struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
|
||||
info->pcm->streams[info->stream].chmap_kctl = NULL;
|
||||
kfree(info);
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_pcm_add_chmap_ctls - create channel-mapping control elements
|
||||
* @pcm: the assigned PCM instance
|
||||
* @stream: stream direction
|
||||
* @chmap: channel map elements (for query)
|
||||
* @max_channels: the max number of channels for the stream
|
||||
* @private_value: the value passed to each kcontrol's private_value field
|
||||
* @info_ret: store struct snd_pcm_chmap instance if non-NULL
|
||||
*
|
||||
* Create channel-mapping control elements assigned to the given PCM stream(s).
|
||||
* Returns zero if succeed, or a negative error value.
|
||||
*/
|
||||
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)
|
||||
{
|
||||
struct snd_pcm_chmap *info;
|
||||
struct snd_kcontrol_new knew = {
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
|
||||
.access = SNDRV_CTL_ELEM_ACCESS_READ |
|
||||
SNDRV_CTL_ELEM_ACCESS_TLV_READ |
|
||||
SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK,
|
||||
.info = pcm_chmap_ctl_info,
|
||||
.get = pcm_chmap_ctl_get,
|
||||
.tlv.c = pcm_chmap_ctl_tlv,
|
||||
};
|
||||
int err;
|
||||
|
||||
info = kzalloc(sizeof(*info), GFP_KERNEL);
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
info->pcm = pcm;
|
||||
info->stream = stream;
|
||||
info->chmap = chmap;
|
||||
info->max_channels = max_channels;
|
||||
if (stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
knew.name = "Playback Channel Map";
|
||||
else
|
||||
knew.name = "Capture Channel Map";
|
||||
knew.device = pcm->device;
|
||||
knew.count = pcm->streams[stream].substream_count;
|
||||
knew.private_value = private_value;
|
||||
info->kctl = snd_ctl_new1(&knew, info);
|
||||
if (!info->kctl) {
|
||||
kfree(info);
|
||||
return -ENOMEM;
|
||||
}
|
||||
info->kctl->private_free = pcm_chmap_ctl_private_free;
|
||||
err = snd_ctl_add(pcm->card, info->kctl);
|
||||
if (err < 0)
|
||||
return err;
|
||||
pcm->streams[stream].chmap_kctl = info->kctl;
|
||||
if (info_ret)
|
||||
*info_ret = info;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_pcm_add_chmap_ctls);
|
||||
|
@ -327,32 +327,6 @@ struct page *snd_pcm_sgbuf_ops_page(struct snd_pcm_substream *substream, unsigne
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(snd_pcm_sgbuf_ops_page);
|
||||
|
||||
/*
|
||||
* compute the max chunk size with continuous pages on sg-buffer
|
||||
*/
|
||||
unsigned int snd_pcm_sgbuf_get_chunk_size(struct snd_pcm_substream *substream,
|
||||
unsigned int ofs, unsigned int size)
|
||||
{
|
||||
struct snd_sg_buf *sg = snd_pcm_substream_sgbuf(substream);
|
||||
unsigned int start, end, pg;
|
||||
|
||||
start = ofs >> PAGE_SHIFT;
|
||||
end = (ofs + size - 1) >> PAGE_SHIFT;
|
||||
/* check page continuity */
|
||||
pg = sg->table[start].addr >> PAGE_SHIFT;
|
||||
for (;;) {
|
||||
start++;
|
||||
if (start > end)
|
||||
break;
|
||||
pg++;
|
||||
if ((sg->table[start].addr >> PAGE_SHIFT) != pg)
|
||||
return (start << PAGE_SHIFT) - ofs;
|
||||
}
|
||||
/* ok, all on continuous pages */
|
||||
return size;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_pcm_sgbuf_get_chunk_size);
|
||||
#endif /* CONFIG_SND_DMA_SGBUF */
|
||||
|
||||
/**
|
||||
|
@ -569,5 +569,7 @@ EXPORT_SYMBOL(snd_seq_device_load_drivers);
|
||||
EXPORT_SYMBOL(snd_seq_device_new);
|
||||
EXPORT_SYMBOL(snd_seq_device_register_driver);
|
||||
EXPORT_SYMBOL(snd_seq_device_unregister_driver);
|
||||
#ifdef CONFIG_MODULES
|
||||
EXPORT_SYMBOL(snd_seq_autoload_lock);
|
||||
EXPORT_SYMBOL(snd_seq_autoload_unlock);
|
||||
#endif
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/export.h>
|
||||
#include <sound/memalloc.h>
|
||||
|
||||
|
||||
@ -136,3 +137,29 @@ void *snd_malloc_sgbuf_pages(struct device *device,
|
||||
snd_free_sgbuf_pages(dmab); /* free the table */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* compute the max chunk size with continuous pages on sg-buffer
|
||||
*/
|
||||
unsigned int snd_sgbuf_get_chunk_size(struct snd_dma_buffer *dmab,
|
||||
unsigned int ofs, unsigned int size)
|
||||
{
|
||||
struct snd_sg_buf *sg = dmab->private_data;
|
||||
unsigned int start, end, pg;
|
||||
|
||||
start = ofs >> PAGE_SHIFT;
|
||||
end = (ofs + size - 1) >> PAGE_SHIFT;
|
||||
/* check page continuity */
|
||||
pg = sg->table[start].addr >> PAGE_SHIFT;
|
||||
for (;;) {
|
||||
start++;
|
||||
if (start > end)
|
||||
break;
|
||||
pg++;
|
||||
if ((sg->table[start].addr >> PAGE_SHIFT) != pg)
|
||||
return (start << PAGE_SHIFT) - ofs;
|
||||
}
|
||||
/* ok, all on continuous pages */
|
||||
return size;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_sgbuf_get_chunk_size);
|
||||
|
@ -27,7 +27,6 @@
|
||||
#include <sound/core.h>
|
||||
#include <sound/minors.h>
|
||||
#include <sound/info.h>
|
||||
#include <sound/version.h>
|
||||
#include <sound/control.h>
|
||||
#include <sound/initval.h>
|
||||
#include <linux/kmod.h>
|
||||
@ -468,7 +467,7 @@ static int __init alsa_sound_init(void)
|
||||
}
|
||||
snd_info_minor_register();
|
||||
#ifndef MODULE
|
||||
printk(KERN_INFO "Advanced Linux Sound Architecture Driver Version " CONFIG_SND_VERSION CONFIG_SND_DATE ".\n");
|
||||
printk(KERN_INFO "Advanced Linux Sound Architecture Driver Initialized.\n");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
@ -120,6 +120,7 @@ struct loopback_pcm {
|
||||
unsigned int last_drift;
|
||||
unsigned long last_jiffies;
|
||||
struct timer_list timer;
|
||||
spinlock_t timer_lock;
|
||||
};
|
||||
|
||||
static struct platform_device *devices[SNDRV_CARDS];
|
||||
@ -170,6 +171,7 @@ static void loopback_timer_start(struct loopback_pcm *dpcm)
|
||||
unsigned long tick;
|
||||
unsigned int rate_shift = get_rate_shift(dpcm);
|
||||
|
||||
spin_lock(&dpcm->timer_lock);
|
||||
if (rate_shift != dpcm->pcm_rate_shift) {
|
||||
dpcm->pcm_rate_shift = rate_shift;
|
||||
dpcm->period_size_frac = frac_pos(dpcm, dpcm->pcm_period_size);
|
||||
@ -182,12 +184,15 @@ static void loopback_timer_start(struct loopback_pcm *dpcm)
|
||||
tick = (tick + dpcm->pcm_bps - 1) / dpcm->pcm_bps;
|
||||
dpcm->timer.expires = jiffies + tick;
|
||||
add_timer(&dpcm->timer);
|
||||
spin_unlock(&dpcm->timer_lock);
|
||||
}
|
||||
|
||||
static inline void loopback_timer_stop(struct loopback_pcm *dpcm)
|
||||
{
|
||||
spin_lock(&dpcm->timer_lock);
|
||||
del_timer(&dpcm->timer);
|
||||
dpcm->timer.expires = 0;
|
||||
spin_unlock(&dpcm->timer_lock);
|
||||
}
|
||||
|
||||
#define CABLE_VALID_PLAYBACK (1 << SNDRV_PCM_STREAM_PLAYBACK)
|
||||
@ -667,6 +672,7 @@ static int loopback_open(struct snd_pcm_substream *substream)
|
||||
dpcm->substream = substream;
|
||||
setup_timer(&dpcm->timer, loopback_timer_function,
|
||||
(unsigned long)dpcm);
|
||||
spin_lock_init(&dpcm->timer_lock);
|
||||
|
||||
cable = loopback->cables[substream->number][dev];
|
||||
if (!cable) {
|
||||
|
@ -163,7 +163,7 @@ static int opl3_get_voice(struct snd_opl3 *opl3, int instr_4op,
|
||||
struct best *bp;
|
||||
|
||||
for (i = 0; i < END; i++) {
|
||||
best[i].time = (unsigned int)(-1); /* XXX MAX_?INT really */;
|
||||
best[i].time = (unsigned int)(-1); /* XXX MAX_?INT really */
|
||||
best[i].voice = -1;
|
||||
}
|
||||
|
||||
|
@ -504,8 +504,7 @@ void snd_opl4_note_on(void *private_data, int note, int vel, struct snd_midi_cha
|
||||
spin_lock_irqsave(&opl4->reg_lock, flags);
|
||||
for (i = 0; i < voices; i++) {
|
||||
voice[i] = snd_opl4_get_voice(opl4);
|
||||
list_del(&voice[i]->list);
|
||||
list_add_tail(&voice[i]->list, &opl4->on_voices);
|
||||
list_move_tail(&voice[i]->list, &opl4->on_voices);
|
||||
voice[i]->chan = chan;
|
||||
voice[i]->note = note;
|
||||
voice[i]->velocity = vel & 0x7f;
|
||||
@ -555,8 +554,7 @@ void snd_opl4_note_on(void *private_data, int note, int vel, struct snd_midi_cha
|
||||
|
||||
static void snd_opl4_voice_off(struct snd_opl4 *opl4, struct opl4_voice *voice)
|
||||
{
|
||||
list_del(&voice->list);
|
||||
list_add_tail(&voice->list, &opl4->off_voices);
|
||||
list_move_tail(&voice->list, &opl4->off_voices);
|
||||
|
||||
voice->reg_misc &= ~OPL4_KEY_ON_BIT;
|
||||
snd_opl4_write(opl4, OPL4_REG_MISC + voice->number, voice->reg_misc);
|
||||
@ -571,8 +569,7 @@ void snd_opl4_note_off(void *private_data, int note, int vel, struct snd_midi_ch
|
||||
|
||||
static void snd_opl4_terminate_voice(struct snd_opl4 *opl4, struct opl4_voice *voice)
|
||||
{
|
||||
list_del(&voice->list);
|
||||
list_add_tail(&voice->list, &opl4->off_voices);
|
||||
list_move_tail(&voice->list, &opl4->off_voices);
|
||||
|
||||
voice->reg_misc = (voice->reg_misc & ~OPL4_KEY_ON_BIT) | OPL4_DAMP_BIT;
|
||||
snd_opl4_write(opl4, OPL4_REG_MISC + voice->number, voice->reg_misc);
|
||||
|
@ -184,7 +184,7 @@ static int vx_set_format(struct vx_core *chip, struct vx_pipe *pipe,
|
||||
default :
|
||||
snd_BUG();
|
||||
return -EINVAL;
|
||||
};
|
||||
}
|
||||
|
||||
return vx_set_stream_format(chip, pipe, header);
|
||||
}
|
||||
|
@ -117,6 +117,18 @@ config SND_AZT2320
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called snd-azt2320.
|
||||
|
||||
config SND_CMI8328
|
||||
tristate "C-Media CMI8328"
|
||||
select SND_WSS_LIB
|
||||
select SND_OPL3_LIB
|
||||
select SND_MPU401_UART
|
||||
help
|
||||
Say Y here to include support for soundcards based on the
|
||||
C-Media CMI8328 chip.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called snd-cmi8328.
|
||||
|
||||
config SND_CMI8330
|
||||
tristate "C-Media CMI8330"
|
||||
select SND_WSS_LIB
|
||||
|
@ -6,6 +6,7 @@
|
||||
snd-adlib-objs := adlib.o
|
||||
snd-als100-objs := als100.o
|
||||
snd-azt2320-objs := azt2320.o
|
||||
snd-cmi8328-objs := cmi8328.o
|
||||
snd-cmi8330-objs := cmi8330.o
|
||||
snd-es18xx-objs := es18xx.o
|
||||
snd-opl3sa2-objs := opl3sa2.o
|
||||
@ -16,6 +17,7 @@ snd-sscape-objs := sscape.o
|
||||
obj-$(CONFIG_SND_ADLIB) += snd-adlib.o
|
||||
obj-$(CONFIG_SND_ALS100) += snd-als100.o
|
||||
obj-$(CONFIG_SND_AZT2320) += snd-azt2320.o
|
||||
obj-$(CONFIG_SND_CMI8328) += snd-cmi8328.o
|
||||
obj-$(CONFIG_SND_CMI8330) += snd-cmi8330.o
|
||||
obj-$(CONFIG_SND_ES18XX) += snd-es18xx.o
|
||||
obj-$(CONFIG_SND_OPL3SA2) += snd-opl3sa2.o
|
||||
|
@ -63,11 +63,6 @@ MODULE_PARM_DESC(enable, "Enable ad1816a based soundcard.");
|
||||
module_param_array(clockfreq, int, NULL, 0444);
|
||||
MODULE_PARM_DESC(clockfreq, "Clock frequency for ad1816a driver (default = 0).");
|
||||
|
||||
struct snd_card_ad1816a {
|
||||
struct pnp_dev *dev;
|
||||
struct pnp_dev *devmpu;
|
||||
};
|
||||
|
||||
static struct pnp_card_device_id snd_ad1816a_pnpids[] = {
|
||||
/* Analog Devices AD1815 */
|
||||
{ .id = "ADS7150", .devs = { { .id = "ADS7150" }, { .id = "ADS7151" } } },
|
||||
@ -99,25 +94,16 @@ MODULE_DEVICE_TABLE(pnp_card, snd_ad1816a_pnpids);
|
||||
#define DRIVER_NAME "snd-card-ad1816a"
|
||||
|
||||
|
||||
static int __devinit snd_card_ad1816a_pnp(int dev, struct snd_card_ad1816a *acard,
|
||||
struct pnp_card_link *card,
|
||||
static int __devinit snd_card_ad1816a_pnp(int dev, struct pnp_card_link *card,
|
||||
const struct pnp_card_device_id *id)
|
||||
{
|
||||
struct pnp_dev *pdev;
|
||||
int err;
|
||||
|
||||
acard->dev = pnp_request_card_device(card, id->devs[0].id, NULL);
|
||||
if (acard->dev == NULL)
|
||||
pdev = pnp_request_card_device(card, id->devs[0].id, NULL);
|
||||
if (pdev == NULL)
|
||||
return -EBUSY;
|
||||
|
||||
acard->devmpu = pnp_request_card_device(card, id->devs[1].id, NULL);
|
||||
if (acard->devmpu == NULL) {
|
||||
mpu_port[dev] = -1;
|
||||
snd_printk(KERN_WARNING PFX "MPU401 device busy, skipping.\n");
|
||||
}
|
||||
|
||||
pdev = acard->dev;
|
||||
|
||||
err = pnp_activate_dev(pdev);
|
||||
if (err < 0) {
|
||||
printk(KERN_ERR PFX "AUDIO PnP configure failure\n");
|
||||
@ -130,16 +116,17 @@ static int __devinit snd_card_ad1816a_pnp(int dev, struct snd_card_ad1816a *acar
|
||||
dma2[dev] = pnp_dma(pdev, 1);
|
||||
irq[dev] = pnp_irq(pdev, 0);
|
||||
|
||||
if (acard->devmpu == NULL)
|
||||
pdev = pnp_request_card_device(card, id->devs[1].id, NULL);
|
||||
if (pdev == NULL) {
|
||||
mpu_port[dev] = -1;
|
||||
snd_printk(KERN_WARNING PFX "MPU401 device busy, skipping.\n");
|
||||
return 0;
|
||||
|
||||
pdev = acard->devmpu;
|
||||
}
|
||||
|
||||
err = pnp_activate_dev(pdev);
|
||||
if (err < 0) {
|
||||
printk(KERN_ERR PFX "MPU401 PnP configure failure\n");
|
||||
mpu_port[dev] = -1;
|
||||
acard->devmpu = NULL;
|
||||
} else {
|
||||
mpu_port[dev] = pnp_port_start(pdev, 0);
|
||||
mpu_irq[dev] = pnp_irq(pdev, 0);
|
||||
@ -153,18 +140,17 @@ static int __devinit snd_card_ad1816a_probe(int dev, struct pnp_card_link *pcard
|
||||
{
|
||||
int error;
|
||||
struct snd_card *card;
|
||||
struct snd_card_ad1816a *acard;
|
||||
struct snd_ad1816a *chip;
|
||||
struct snd_opl3 *opl3;
|
||||
struct snd_timer *timer;
|
||||
|
||||
error = snd_card_create(index[dev], id[dev], THIS_MODULE,
|
||||
sizeof(struct snd_card_ad1816a), &card);
|
||||
sizeof(struct snd_ad1816a), &card);
|
||||
if (error < 0)
|
||||
return error;
|
||||
acard = card->private_data;
|
||||
chip = card->private_data;
|
||||
|
||||
if ((error = snd_card_ad1816a_pnp(dev, acard, pcard, pid))) {
|
||||
if ((error = snd_card_ad1816a_pnp(dev, pcard, pid))) {
|
||||
snd_card_free(card);
|
||||
return error;
|
||||
}
|
||||
@ -174,7 +160,7 @@ static int __devinit snd_card_ad1816a_probe(int dev, struct pnp_card_link *pcard
|
||||
irq[dev],
|
||||
dma1[dev],
|
||||
dma2[dev],
|
||||
&chip)) < 0) {
|
||||
chip)) < 0) {
|
||||
snd_card_free(card);
|
||||
return error;
|
||||
}
|
||||
@ -258,13 +244,37 @@ static void __devexit snd_ad1816a_pnp_remove(struct pnp_card_link * pcard)
|
||||
pnp_set_card_drvdata(pcard, NULL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int snd_ad1816a_pnp_suspend(struct pnp_card_link *pcard,
|
||||
pm_message_t state)
|
||||
{
|
||||
struct snd_card *card = pnp_get_card_drvdata(pcard);
|
||||
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
snd_ad1816a_suspend(card->private_data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_ad1816a_pnp_resume(struct pnp_card_link *pcard)
|
||||
{
|
||||
struct snd_card *card = pnp_get_card_drvdata(pcard);
|
||||
|
||||
snd_ad1816a_resume(card->private_data);
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct pnp_card_driver ad1816a_pnpc_driver = {
|
||||
.flags = PNP_DRIVER_RES_DISABLE,
|
||||
.name = "ad1816a",
|
||||
.id_table = snd_ad1816a_pnpids,
|
||||
.probe = snd_ad1816a_pnp_detect,
|
||||
.remove = __devexit_p(snd_ad1816a_pnp_remove),
|
||||
/* FIXME: suspend/resume */
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = snd_ad1816a_pnp_suspend,
|
||||
.resume = snd_ad1816a_pnp_resume,
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init alsa_card_ad1816a_init(void)
|
||||
|
@ -491,7 +491,7 @@ static int snd_ad1816a_capture_close(struct snd_pcm_substream *substream)
|
||||
}
|
||||
|
||||
|
||||
static void __devinit snd_ad1816a_init(struct snd_ad1816a *chip)
|
||||
static void snd_ad1816a_init(struct snd_ad1816a *chip)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
@ -511,6 +511,32 @@ static void __devinit snd_ad1816a_init(struct snd_ad1816a *chip)
|
||||
spin_unlock_irqrestore(&chip->lock, flags);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
void snd_ad1816a_suspend(struct snd_ad1816a *chip)
|
||||
{
|
||||
int reg;
|
||||
unsigned long flags;
|
||||
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
spin_lock_irqsave(&chip->lock, flags);
|
||||
for (reg = 0; reg < 48; reg++)
|
||||
chip->image[reg] = snd_ad1816a_read(chip, reg);
|
||||
spin_unlock_irqrestore(&chip->lock, flags);
|
||||
}
|
||||
|
||||
void snd_ad1816a_resume(struct snd_ad1816a *chip)
|
||||
{
|
||||
int reg;
|
||||
unsigned long flags;
|
||||
|
||||
snd_ad1816a_init(chip);
|
||||
spin_lock_irqsave(&chip->lock, flags);
|
||||
for (reg = 0; reg < 48; reg++)
|
||||
snd_ad1816a_write(chip, reg, chip->image[reg]);
|
||||
spin_unlock_irqrestore(&chip->lock, flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __devinit snd_ad1816a_probe(struct snd_ad1816a *chip)
|
||||
{
|
||||
unsigned long flags;
|
||||
@ -548,7 +574,6 @@ static int snd_ad1816a_free(struct snd_ad1816a *chip)
|
||||
snd_dma_disable(chip->dma2);
|
||||
free_dma(chip->dma2);
|
||||
}
|
||||
kfree(chip);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -573,19 +598,13 @@ static const char __devinit *snd_ad1816a_chip_id(struct snd_ad1816a *chip)
|
||||
|
||||
int __devinit snd_ad1816a_create(struct snd_card *card,
|
||||
unsigned long port, int irq, int dma1, int dma2,
|
||||
struct snd_ad1816a **rchip)
|
||||
struct snd_ad1816a *chip)
|
||||
{
|
||||
static struct snd_device_ops ops = {
|
||||
.dev_free = snd_ad1816a_dev_free,
|
||||
};
|
||||
int error;
|
||||
struct snd_ad1816a *chip;
|
||||
|
||||
*rchip = NULL;
|
||||
|
||||
chip = kzalloc(sizeof(*chip), GFP_KERNEL);
|
||||
if (chip == NULL)
|
||||
return -ENOMEM;
|
||||
chip->irq = -1;
|
||||
chip->dma1 = -1;
|
||||
chip->dma2 = -1;
|
||||
@ -631,7 +650,6 @@ int __devinit snd_ad1816a_create(struct snd_card *card,
|
||||
return error;
|
||||
}
|
||||
|
||||
*rchip = chip;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user