sound updates for 3.11
A relative calm release at this time with a flat diffstat. The only significant change in the ALSA core side is the support for more than 32 card instances, configurable via kconfig. Other than that, in both ASoC and other parts, mostly some improvements and fixes on the driver side. - hda: More quirks for ALC269-variants on Dell & co, VIA codec fixes - hda: Haswell HDMI audio fixes, runtime PM improvements - hda: Intel BayTrail support, ALC5505 DSP support - es1968: MediaForte M56VAP support - usb-audio: Improved support for Yamaha/Roland devices - usb-audio: M2Tech hiFace, Audio Advantage Micro II support - hdspm: wordclock fixes - ASoC: Pending fixes for WM8962 - ASoC: Cleanups and fixes for Blackfin, SGTL5000 and UX500 - ASoC: Generalisation of the Bluetooth and HDMI stub drivers - ASoC: SSM2518 and RT5640 codec drivers. - ASoC: Tegra CPUs with RT5640 machine driver - ASoC: AC'97 refactoring bug fixes - ASoC: ADAU1701 driver fixes - Clean up of *_set_drvdata() in a wide range of drivers -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iQIcBAABAgAGBQJR1BNeAAoJEGwxgFQ9KSmk5mAP/iH8IPdaMq/EI3Kdk2lwqXwK xQvpQCKTeux4UrETSDM5kOfk+Nv0oq7jD60wEZs6eONAZdfIzACEjdpQBdC4vr6f 2S8b9J6xBe2siHGbzBsgV9g8xhnYXC5m0u8QBRa9fyNVpMu1o1X6Mv7FS/wUCMZ6 M7vaSdrU4pfa4v9sy9loOYbyDZoSZg0revwqWAm8Kfp4XSd1aPwiCVPLVOWcvNYC hriz5ICARFg+yqzJADPBYtSU752zxlZd/N1b2YQw1YnoxA66FoVaqQfYD1voL0WY 8m9abNlnln6qxyeQPMvRMZty1I/kCwOlp5dO0OZHisMLE8MApLk1e7ct9+W+b9hn NORbo3klmwZfIl1s8JSGHs5Nknqzhdzau35TVPTmtC50wgnPO6EYVeYFiZqkuYyK UdCHJTRjyS6HlmbdKeSaRr+PoCR0zVQruXFjWnAwQ9Zy+1qrnVb5Ly9np7YCc8YC 3iYOygJyn+JmyfeeIxVUCg6Rdf4NUv+JPx48yuoq79YnWAbRiSSct1/J+4YcYcm5 VjJdtCwElil3dSeba+Oy2wcSwaJzyaINbClzmZdysT26M8QLZaRCBU0zujeiyl/n lV/p/n+UmmtfHIdJDz6Eu6fQVAbh0v89mZrEJdjroLebwS1NBLAaKkb9vY63AdKt P5c/7KWejQ/CtoVYeo3O =i5lT -----END PGP SIGNATURE----- Merge tag 'sound-3.11' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound updates from Takashi Iwai: "A relative calm release at this time with a flat diffstat. The only significant change in the ALSA core side is the support for more than 32 card instances, configurable via kconfig. Other than that, in both ASoC and other parts, mostly some improvements and fixes on the driver side. - hda: More quirks for ALC269-variants on Dell & co, VIA codec fixes - hda: Haswell HDMI audio fixes, runtime PM improvements - hda: Intel BayTrail support, ALC5505 DSP support - es1968: MediaForte M56VAP support - usb-audio: Improved support for Yamaha/Roland devices - usb-audio: M2Tech hiFace, Audio Advantage Micro II support - hdspm: wordclock fixes - ASoC: Pending fixes for WM8962 - ASoC: Cleanups and fixes for Blackfin, SGTL5000 and UX500 - ASoC: Generalisation of the Bluetooth and HDMI stub drivers - ASoC: SSM2518 and RT5640 codec drivers. - ASoC: Tegra CPUs with RT5640 machine driver - ASoC: AC'97 refactoring bug fixes - ASoC: ADAU1701 driver fixes - Clean up of *_set_drvdata() in a wide range of drivers" * tag 'sound-3.11' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (284 commits) ALSA: vmaster: Fix the regression of missing vmaster hook call ALSA: hda - Add Dell SSID to support Headset Mic recording ASoC: adau1701: remove control_data assignment ASoC: adau1701: more direct regmap usage ASoC: ac97: fixup multi-platform AC'97 module build failure ASoC: pxa2xx: fixup multi-platform AC'97 build failures ASoC: tegra20-ac97: Remove unused variable ASoC: tegra20-ac97: Remove duplicate error message ALSA: usb-audio: Add Audio Advantage Micro II ASoC: tas5086: fix Mid-Z implementation ASoC: tas5086: fix TAS5086_CLOCK_CONTROL register size ALSA: Replace the magic number 44 with const ALSA: hda - Fix the max length of control name in generic parser ALSA: hda - Guess what, it's two more Dell headset mic quirks ALSA: hda - Yet another Dell headset mic quirk ALSA: hda - Add support for ALC5505 DSP power-save mode ASoC: mfld: Remove unused variable ALSA: usb-audio: add quirks for Roland QUAD/OCTO-CAPTURE ALSA: usb-audio: claim autodetected PCM interfaces all at once ALSA: usb-audio: remove superfluous Roland quirks ...
This commit is contained in:
commit
1286da8bc0
62
Documentation/devicetree/bindings/mfd/arizona.txt
Normal file
62
Documentation/devicetree/bindings/mfd/arizona.txt
Normal file
@ -0,0 +1,62 @@
|
||||
Wolfson Arizona class audio SoCs
|
||||
|
||||
These devices are audio SoCs with extensive digital capabilites and a range
|
||||
of analogue I/O.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : one of the following chip-specific strings:
|
||||
"wlf,wm5102"
|
||||
"wlf,wm5110"
|
||||
- reg : I2C slave address when connected using I2C, chip select number when
|
||||
using SPI.
|
||||
|
||||
- interrupts : The interrupt line the /IRQ signal for the device is
|
||||
connected to.
|
||||
- interrupt-controller : Arizona class devices contain interrupt controllers
|
||||
and may provide interrupt services to other devices.
|
||||
- interrupt-parent : The parent interrupt controller.
|
||||
- #interrupt-cells: the number of cells to describe an IRQ, this should be 2.
|
||||
The first cell is the IRQ number.
|
||||
The second cell is the flags, encoded as the trigger masks from
|
||||
Documentation/devicetree/bindings/interrupts.txt
|
||||
|
||||
- gpio-controller : Indicates this device is a GPIO controller.
|
||||
- #gpio-cells : Must be 2. The first cell is the pin number and the
|
||||
second cell is used to specify optional parameters (currently unused).
|
||||
|
||||
- AVDD1-supply, DBVDD1-supply, DBVDD2-supply, DBVDD3-supply, CPVDD-supply,
|
||||
SPKVDDL-supply, SPKVDDR-supply : power supplies for the device, as covered
|
||||
in Documentation/devicetree/bindings/regulator/regulator.txt
|
||||
|
||||
Optional properties:
|
||||
|
||||
- wlf,reset : GPIO specifier for the GPIO controlling /RESET
|
||||
- wlf,ldoena : GPIO specifier for the GPIO controlling LDOENA
|
||||
|
||||
- wlf,gpio-defaults : A list of GPIO configuration register values. If
|
||||
absent, no configuration of these registers is performed. If any
|
||||
entry has a value that is out of range for a 16 bit register then
|
||||
the chip default will be used. If present exactly five values must
|
||||
be specified.
|
||||
|
||||
Example:
|
||||
|
||||
codec: wm5102@1a {
|
||||
compatible = "wlf,wm5102";
|
||||
reg = <0x1a>;
|
||||
interrupts = <347>;
|
||||
#interrupt-cells = <2>;
|
||||
interrupt-parent = <&gic>;
|
||||
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
|
||||
wlf,gpio-defaults = <
|
||||
0x00000000, /* AIF1TXLRCLK */
|
||||
0xffffffff,
|
||||
0xffffffff,
|
||||
0xffffffff,
|
||||
0xffffffff,
|
||||
>;
|
||||
};
|
35
Documentation/devicetree/bindings/sound/adi,adau1701.txt
Normal file
35
Documentation/devicetree/bindings/sound/adi,adau1701.txt
Normal file
@ -0,0 +1,35 @@
|
||||
Analog Devices ADAU1701
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: Should contain "adi,adau1701"
|
||||
- reg: The i2c address. Value depends on the state of ADDR0
|
||||
and ADDR1, as wired in hardware.
|
||||
|
||||
Optional properties:
|
||||
|
||||
- reset-gpio: A GPIO spec to define which pin is connected to the
|
||||
chip's !RESET pin. If specified, the driver will
|
||||
assert a hardware reset at probe time.
|
||||
- adi,pll-mode-gpios: An array of two GPIO specs to describe the GPIOs
|
||||
the ADAU's PLL config pins are connected to.
|
||||
The state of the pins are set according to the
|
||||
configured clock divider on ASoC side before the
|
||||
firmware is loaded.
|
||||
- adi,pin-config: An array of 12 numerical values selecting one of the
|
||||
pin configurations as described in the datasheet,
|
||||
table 53. Note that the value of this property has
|
||||
to be prefixed with '/bits/ 8'.
|
||||
|
||||
Examples:
|
||||
|
||||
i2c_bus {
|
||||
adau1701@34 {
|
||||
compatible = "adi,adau1701";
|
||||
reg = <0x34>;
|
||||
reset-gpio = <&gpio 23 0>;
|
||||
adi,pll-mode-gpios = <&gpio 24 0 &gpio 25 0>;
|
||||
adi,pin-config = /bits/ 8 <0x4 0x7 0x5 0x5 0x4 0x4
|
||||
0x4 0x4 0x4 0x4 0x4 0x4>;
|
||||
};
|
||||
};
|
46
Documentation/devicetree/bindings/sound/imx-audio-wm8962.txt
Normal file
46
Documentation/devicetree/bindings/sound/imx-audio-wm8962.txt
Normal file
@ -0,0 +1,46 @@
|
||||
Freescale i.MX audio complex with WM8962 codec
|
||||
|
||||
Required properties:
|
||||
- compatible : "fsl,imx-audio-wm8962"
|
||||
- model : The user-visible name of this sound complex
|
||||
- ssi-controller : The phandle of the i.MX SSI controller
|
||||
- audio-codec : The phandle of the WM8962 audio codec
|
||||
- audio-routing : A list of the 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. Valid names could be power
|
||||
supplies, WM8962 pins, and the jacks on the board:
|
||||
|
||||
Power supplies:
|
||||
* Mic Bias
|
||||
|
||||
Board connectors:
|
||||
* Mic Jack
|
||||
* Headphone Jack
|
||||
* Ext Spk
|
||||
|
||||
- mux-int-port : The internal port of the i.MX audio muxer (AUDMUX)
|
||||
- mux-ext-port : The external port of the i.MX audio muxer
|
||||
|
||||
Note: The AUDMUX port numbering should start at 1, which is consistent with
|
||||
hardware manual.
|
||||
|
||||
Example:
|
||||
|
||||
sound {
|
||||
compatible = "fsl,imx6q-sabresd-wm8962",
|
||||
"fsl,imx-audio-wm8962";
|
||||
model = "wm8962-audio";
|
||||
ssi-controller = <&ssi2>;
|
||||
audio-codec = <&codec>;
|
||||
audio-routing =
|
||||
"Headphone Jack", "HPOUTL",
|
||||
"Headphone Jack", "HPOUTR",
|
||||
"Ext Spk", "SPKOUTL",
|
||||
"Ext Spk", "SPKOUTR",
|
||||
"MICBIAS", "AMIC",
|
||||
"IN3R", "MICBIAS",
|
||||
"DMIC", "MICBIAS",
|
||||
"DMICDAT", "DMIC";
|
||||
mux-int-port = <2>;
|
||||
mux-ext-port = <3>;
|
||||
};
|
@ -3,8 +3,11 @@
|
||||
Required properties:
|
||||
- compatible: Should be "fsl,<chip>-saif"
|
||||
- reg: Should contain registers location and length
|
||||
- interrupts: Should contain ERROR and DMA interrupts
|
||||
- fsl,saif-dma-channel: APBX DMA channel for the SAIF
|
||||
- interrupts: Should contain ERROR interrupt number
|
||||
- dmas: DMA specifier, consisting of a phandle to DMA controller node
|
||||
and SAIF DMA channel ID.
|
||||
Refer to dma.txt and fsl-mxs-dma.txt for details.
|
||||
- dma-names: Must be "rx-tx".
|
||||
|
||||
Optional properties:
|
||||
- fsl,saif-master: phandle to the master SAIF. It's only required for
|
||||
@ -23,14 +26,16 @@ aliases {
|
||||
saif0: saif@80042000 {
|
||||
compatible = "fsl,imx28-saif";
|
||||
reg = <0x80042000 2000>;
|
||||
interrupts = <59 80>;
|
||||
fsl,saif-dma-channel = <4>;
|
||||
interrupts = <59>;
|
||||
dmas = <&dma_apbx 4>;
|
||||
dma-names = "rx-tx";
|
||||
};
|
||||
|
||||
saif1: saif@80046000 {
|
||||
compatible = "fsl,imx28-saif";
|
||||
reg = <0x80046000 2000>;
|
||||
interrupts = <58 81>;
|
||||
fsl,saif-dma-channel = <5>;
|
||||
interrupts = <58>;
|
||||
dmas = <&dma_apbx 5>;
|
||||
dma-names = "rx-tx";
|
||||
fsl,saif-master = <&saif0>;
|
||||
};
|
||||
|
@ -0,0 +1,71 @@
|
||||
NVIDIA Tegra audio complex, with RT5640 CODEC
|
||||
|
||||
Required properties:
|
||||
- compatible : "nvidia,tegra-audio-rt5640"
|
||||
- clocks : Must contain an entry for each entry in clock-names.
|
||||
- clock-names : Must include the following entries:
|
||||
"pll_a" (The Tegra clock of that name),
|
||||
"pll_a_out0" (The Tegra clock of that name),
|
||||
"mclk" (The Tegra cdev1/extern1 clock, which feeds the CODEC's mclk)
|
||||
- nvidia,model : The user-visible name of this sound complex.
|
||||
- nvidia,audio-routing : A list of the 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. Valid names for sources and
|
||||
sinks are the RT5640's pins, and the jacks on the board:
|
||||
|
||||
RT5640 pins:
|
||||
|
||||
* DMIC1
|
||||
* DMIC2
|
||||
* MICBIAS1
|
||||
* IN1P
|
||||
* IN1R
|
||||
* IN2P
|
||||
* IN2R
|
||||
* HPOL
|
||||
* HPOR
|
||||
* LOUTL
|
||||
* LOUTR
|
||||
* MONOP
|
||||
* MONON
|
||||
* SPOLP
|
||||
* SPOLN
|
||||
* SPORP
|
||||
* SPORN
|
||||
|
||||
Board connectors:
|
||||
|
||||
* Headphones
|
||||
* Speakers
|
||||
|
||||
- nvidia,i2s-controller : The phandle of the Tegra I2S controller that's
|
||||
connected to the CODEC.
|
||||
- nvidia,audio-codec : The phandle of the RT5640 audio codec. This binding
|
||||
assumes that AIF1 on the CODEC is connected to Tegra.
|
||||
|
||||
Optional properties:
|
||||
- nvidia,hp-det-gpios : The GPIO that detects headphones are plugged in
|
||||
|
||||
Example:
|
||||
|
||||
sound {
|
||||
compatible = "nvidia,tegra-audio-rt5640-dalmore",
|
||||
"nvidia,tegra-audio-rt5640";
|
||||
nvidia,model = "NVIDIA Tegra Dalmore";
|
||||
|
||||
nvidia,audio-routing =
|
||||
"Headphones", "HPOR",
|
||||
"Headphones", "HPOL",
|
||||
"Speakers", "SPORP",
|
||||
"Speakers", "SPORN",
|
||||
"Speakers", "SPOLP",
|
||||
"Speakers", "SPOLN";
|
||||
|
||||
nvidia,i2s-controller = <&tegra_i2s1>;
|
||||
nvidia,audio-codec = <&rt5640>;
|
||||
|
||||
nvidia,hp-det-gpios = <&gpio 143 0>; /* GPIO PR7 */
|
||||
|
||||
clocks = <&tegra_car 216>, <&tegra_car 217>, <&tegra_car 120>;
|
||||
clock-names = "pll_a", "pll_a_out0", "mclk";
|
||||
};
|
30
Documentation/devicetree/bindings/sound/rt5640.txt
Normal file
30
Documentation/devicetree/bindings/sound/rt5640.txt
Normal file
@ -0,0 +1,30 @@
|
||||
RT5640 audio CODEC
|
||||
|
||||
This device supports I2C only.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : "realtek,rt5640".
|
||||
|
||||
- reg : The I2C address of the device.
|
||||
|
||||
- interrupts : The CODEC's interrupt output.
|
||||
|
||||
Optional properties:
|
||||
|
||||
- realtek,in1-differential
|
||||
- realtek,in2-differential
|
||||
Boolean. Indicate MIC1/2 input are differential, rather than single-ended.
|
||||
|
||||
- realtek,ldo1-en-gpios : The GPIO that controls the CODEC's LDO1_EN pin.
|
||||
|
||||
Example:
|
||||
|
||||
rt5640 {
|
||||
compatible = "realtek,rt5640";
|
||||
reg = <0x1c>;
|
||||
interrupt-parent = <&gpio>;
|
||||
interrupts = <TEGRA_GPIO(W, 3) GPIO_ACTIVE_HIGH>;
|
||||
realtek,ldo1-en-gpios =
|
||||
<&gpio TEGRA_GPIO(V, 3) GPIO_ACTIVE_HIGH>;
|
||||
};
|
@ -5,9 +5,12 @@ Required properties:
|
||||
|
||||
- reg : the I2C address of the device
|
||||
|
||||
- clocks : the clock provider of SYS_MCLK
|
||||
|
||||
Example:
|
||||
|
||||
codec: sgtl5000@0a {
|
||||
compatible = "fsl,sgtl5000";
|
||||
reg = <0x0a>;
|
||||
clocks = <&clks 150>;
|
||||
};
|
||||
|
10
Documentation/devicetree/bindings/sound/spdif-receiver.txt
Normal file
10
Documentation/devicetree/bindings/sound/spdif-receiver.txt
Normal file
@ -0,0 +1,10 @@
|
||||
Device-Tree bindings for dummy spdif receiver
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "linux,spdif-dir".
|
||||
|
||||
Example node:
|
||||
|
||||
codec: spdif-receiver {
|
||||
compatible = "linux,spdif-dir";
|
||||
};
|
@ -0,0 +1,10 @@
|
||||
Device-Tree bindings for dummy spdif transmitter
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "linux,spdif-dit".
|
||||
|
||||
Example node:
|
||||
|
||||
codec: spdif-transmitter {
|
||||
compatible = "linux,spdif-dit";
|
||||
};
|
20
Documentation/devicetree/bindings/sound/ssm2518.txt
Normal file
20
Documentation/devicetree/bindings/sound/ssm2518.txt
Normal file
@ -0,0 +1,20 @@
|
||||
SSM2518 audio amplifier
|
||||
|
||||
This device supports I2C only.
|
||||
|
||||
Required properties:
|
||||
- compatible : Must be "adi,ssm2518"
|
||||
- reg : the I2C address of the device. This will either be 0x34 (ADDR pin low)
|
||||
or 0x35 (ADDR pin high)
|
||||
|
||||
Optional properties:
|
||||
- gpios : GPIO connected to the nSD pin. If the property is not present it is
|
||||
assumed that the nSD pin is hardwired to always on.
|
||||
|
||||
Example:
|
||||
|
||||
ssm2518: ssm2518@34 {
|
||||
compatible = "adi,ssm2518";
|
||||
reg = <0x34>;
|
||||
gpios = <&gpio 5 0>;
|
||||
};
|
@ -20,6 +20,17 @@ Optional properties:
|
||||
When not specified, the hardware default of 1300ms
|
||||
is retained.
|
||||
|
||||
- ti,mid-z-channel-X: Boolean properties, X being a number from 1 to 6.
|
||||
If given, channel X will start with the Mid-Z start
|
||||
sequence, otherwise the default Low-Z scheme is used.
|
||||
|
||||
The correct configuration depends on how the power
|
||||
stages connected to the PWM output pins work. Not all
|
||||
power stages are compatible to Mid-Z - please refer
|
||||
to the datasheets for more details.
|
||||
|
||||
Most systems should not set any of these properties.
|
||||
|
||||
Examples:
|
||||
|
||||
i2c_bus {
|
||||
|
@ -8,9 +8,32 @@ Required properties:
|
||||
|
||||
- reg : the I2C address of the device.
|
||||
|
||||
Optional properties:
|
||||
- spk-mono: This is a boolean property. If present, the SPK_MONO bit
|
||||
of R51 (Class D Control 2) gets set, indicating that the speaker is
|
||||
in mono mode.
|
||||
|
||||
- mic-cfg : Default register value for R48 (Additional Control 4).
|
||||
If absent, the default should be the register default.
|
||||
|
||||
- gpio-cfg : A list of GPIO configuration register values. The list must
|
||||
be 6 entries long. If absent, no configuration of these registers is
|
||||
performed. And note that only the value within [0x0, 0xffff] is valid.
|
||||
Any other value is regarded as setting the GPIO register by its reset
|
||||
value 0x0.
|
||||
|
||||
Example:
|
||||
|
||||
codec: wm8962@1a {
|
||||
compatible = "wlf,wm8962";
|
||||
reg = <0x1a>;
|
||||
|
||||
gpio-cfg = <
|
||||
0x0000 /* 0:Default */
|
||||
0x0000 /* 1:Default */
|
||||
0x0013 /* 2:FN_DMICCLK */
|
||||
0x0000 /* 3:Default */
|
||||
0x8014 /* 4:FN_DMICCDAT */
|
||||
0x0000 /* 5:Default */
|
||||
>;
|
||||
};
|
||||
|
@ -21,41 +21,41 @@ ALC267/268
|
||||
==========
|
||||
inv-dmic Inverted internal mic workaround
|
||||
|
||||
ALC269/270/275/276/280/282
|
||||
ALC269/270/275/276/28x/29x
|
||||
======
|
||||
laptop-amic Laptops with analog-mic input
|
||||
laptop-dmic Laptops with digital-mic input
|
||||
alc269-dmic Enable ALC269(VA) digital mic workaround
|
||||
alc271-dmic Enable ALC271X digital mic workaround
|
||||
inv-dmic Inverted internal mic workaround
|
||||
lenovo-dock Enables docking station I/O for some Lenovos
|
||||
laptop-amic Laptops with analog-mic input
|
||||
laptop-dmic Laptops with digital-mic input
|
||||
alc269-dmic Enable ALC269(VA) digital mic workaround
|
||||
alc271-dmic Enable ALC271X digital mic workaround
|
||||
inv-dmic Inverted internal mic workaround
|
||||
lenovo-dock Enables docking station I/O for some Lenovos
|
||||
dell-headset-multi Headset jack, which can also be used as mic-in
|
||||
dell-headset-dock Headset jack (without mic-in), and also dock I/O
|
||||
|
||||
ALC662/663/272
|
||||
ALC66x/67x/892
|
||||
==============
|
||||
mario Chromebook mario model fixup
|
||||
asus-mode1 ASUS
|
||||
asus-mode2 ASUS
|
||||
asus-mode3 ASUS
|
||||
asus-mode4 ASUS
|
||||
asus-mode5 ASUS
|
||||
asus-mode6 ASUS
|
||||
asus-mode7 ASUS
|
||||
asus-mode8 ASUS
|
||||
inv-dmic Inverted internal mic workaround
|
||||
mario Chromebook mario model fixup
|
||||
asus-mode1 ASUS
|
||||
asus-mode2 ASUS
|
||||
asus-mode3 ASUS
|
||||
asus-mode4 ASUS
|
||||
asus-mode5 ASUS
|
||||
asus-mode6 ASUS
|
||||
asus-mode7 ASUS
|
||||
asus-mode8 ASUS
|
||||
inv-dmic Inverted internal mic workaround
|
||||
dell-headset-multi Headset jack, which can also be used as mic-in
|
||||
|
||||
ALC680
|
||||
======
|
||||
N/A
|
||||
|
||||
ALC882/883/885/888/889
|
||||
ALC88x/898/1150
|
||||
======================
|
||||
acer-aspire-4930g Acer Aspire 4930G/5930G/6530G/6930G/7730G
|
||||
acer-aspire-8930g Acer Aspire 8330G/6935G
|
||||
acer-aspire Acer Aspire others
|
||||
inv-dmic Inverted internal mic workaround
|
||||
inv-dmic Inverted internal mic workaround
|
||||
no-primary-hp VAIO Z/VGC-LN51JGB workaround (for fixed speaker DAC)
|
||||
|
||||
ALC861/660
|
||||
|
@ -283,14 +283,6 @@ static struct platform_device bfin_i2s = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
static struct platform_device bfin_tdm = {
|
||||
.name = "bfin-tdm",
|
||||
.id = CONFIG_SND_BF5XX_SPORT_NUM,
|
||||
/* TODO: add platform data here */
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
||||
#if defined(CONFIG_MTD_M25P80) \
|
||||
|| defined(CONFIG_MTD_M25P80_MODULE)
|
||||
@ -800,10 +792,6 @@ static struct platform_device *stamp_devices[] __initdata = {
|
||||
#if defined(CONFIG_SND_BF5XX_I2S) || defined(CONFIG_SND_BF5XX_I2S_MODULE)
|
||||
&bfin_i2s,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
&bfin_tdm,
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init ad7160eval_init(void)
|
||||
|
@ -493,8 +493,7 @@ static const struct ad7879_platform_data bfin_ad7879_ts_info = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_I2S) || defined(CONFIG_SND_BF5XX_I2S_MODULE) || \
|
||||
defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
#if defined(CONFIG_SND_BF5XX_I2S) || defined(CONFIG_SND_BF5XX_I2S_MODULE)
|
||||
|
||||
static const u16 bfin_snd_pin[][7] = {
|
||||
{P_SPORT0_DTPRI, P_SPORT0_TSCLK, P_SPORT0_RFS,
|
||||
@ -549,13 +548,6 @@ static struct platform_device bfin_i2s_pcm = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
static struct platform_device bfin_tdm_pcm = {
|
||||
.name = "bfin-tdm-pcm-audio",
|
||||
.id = -1,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
static struct platform_device bfin_ac97_pcm = {
|
||||
.name = "bfin-ac97-pcm-audio",
|
||||
@ -575,22 +567,10 @@ static struct platform_device bfin_i2s = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
static struct platform_device bfin_tdm = {
|
||||
.name = "bfin-tdm",
|
||||
.id = CONFIG_SND_BF5XX_SPORT_NUM,
|
||||
.num_resources = ARRAY_SIZE(bfin_snd_resources[CONFIG_SND_BF5XX_SPORT_NUM]),
|
||||
.resource = bfin_snd_resources[CONFIG_SND_BF5XX_SPORT_NUM],
|
||||
.dev = {
|
||||
.platform_data = &bfin_snd_data[CONFIG_SND_BF5XX_SPORT_NUM],
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) \
|
||||
|| defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||
static const char * const ad1836_link[] = {
|
||||
"bfin-tdm.0",
|
||||
"bfin-i2s.0",
|
||||
"spi0.4",
|
||||
};
|
||||
static struct platform_device bfin_ad1836_machine = {
|
||||
@ -1269,10 +1249,6 @@ static struct platform_device *stamp_devices[] __initdata = {
|
||||
&bfin_i2s_pcm,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
&bfin_tdm_pcm,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
&bfin_ac97_pcm,
|
||||
#endif
|
||||
@ -1281,10 +1257,6 @@ static struct platform_device *stamp_devices[] __initdata = {
|
||||
&bfin_i2s,
|
||||
#endif
|
||||
|
||||
#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,
|
||||
|
@ -450,14 +450,6 @@ static struct platform_device bfin_i2s = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
static struct platform_device bfin_tdm = {
|
||||
.name = "bfin-tdm",
|
||||
.id = CONFIG_SND_BF5XX_SPORT_NUM,
|
||||
/* TODO: add platform data here */
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
static struct platform_device bfin_ac97 = {
|
||||
.name = "bfin-ac97",
|
||||
@ -516,10 +508,6 @@ static struct platform_device *ezkit_devices[] __initdata = {
|
||||
&bfin_i2s,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
&bfin_tdm,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
&bfin_ac97,
|
||||
#endif
|
||||
|
@ -542,8 +542,7 @@ static struct platform_device bfin_dpmc = {
|
||||
};
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_I2S) || defined(CONFIG_SND_BF5XX_I2S_MODULE) || \
|
||||
defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE) \
|
||||
|| defined(CONFIG_SND_BF5XX_AC97) || \
|
||||
defined(CONFIG_SND_BF5XX_AC97) || \
|
||||
defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
|
||||
#include <asm/bfin_sport.h>
|
||||
@ -603,13 +602,6 @@ static struct platform_device bfin_i2s_pcm = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
static struct platform_device bfin_tdm_pcm = {
|
||||
.name = "bfin-tdm-pcm-audio",
|
||||
.id = -1,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
static struct platform_device bfin_ac97_pcm = {
|
||||
.name = "bfin-ac97-pcm-audio",
|
||||
@ -620,7 +612,7 @@ static struct platform_device bfin_ac97_pcm = {
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) \
|
||||
|| defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||
static const char * const ad1836_link[] = {
|
||||
"bfin-tdm.0",
|
||||
"bfin-i2s.0",
|
||||
"spi0.4",
|
||||
};
|
||||
static struct platform_device bfin_ad1836_machine = {
|
||||
@ -675,20 +667,6 @@ static struct platform_device bfin_i2s = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_TDM) || \
|
||||
defined(CONFIG_SND_BF5XX_SOC_TDM_MODULE)
|
||||
static struct platform_device bfin_tdm = {
|
||||
.name = "bfin-tdm",
|
||||
.id = CONFIG_SND_BF5XX_SPORT_NUM,
|
||||
.num_resources =
|
||||
ARRAY_SIZE(bfin_snd_resources[CONFIG_SND_BF5XX_SPORT_NUM]),
|
||||
.resource = bfin_snd_resources[CONFIG_SND_BF5XX_SPORT_NUM],
|
||||
.dev = {
|
||||
.platform_data = &bfin_snd_data[CONFIG_SND_BF5XX_SPORT_NUM],
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AC97) || \
|
||||
defined(CONFIG_SND_BF5XX_SOC_AC97_MODULE)
|
||||
static struct platform_device bfin_ac97 = {
|
||||
@ -761,10 +739,6 @@ static struct platform_device *stamp_devices[] __initdata = {
|
||||
&bfin_i2s_pcm,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
&bfin_tdm_pcm,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
&bfin_ac97_pcm,
|
||||
#endif
|
||||
@ -792,11 +766,6 @@ static struct platform_device *stamp_devices[] __initdata = {
|
||||
&bfin_i2s,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_TDM) || \
|
||||
defined(CONFIG_SND_BF5XX_SOC_TDM_MODULE)
|
||||
&bfin_tdm,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AC97) || \
|
||||
defined(CONFIG_SND_BF5XX_SOC_AC97_MODULE)
|
||||
&bfin_ac97,
|
||||
|
@ -2570,7 +2570,6 @@ static struct platform_device bfin_dpmc = {
|
||||
};
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_I2S) || defined(CONFIG_SND_BF5XX_I2S_MODULE) || \
|
||||
defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE) || \
|
||||
defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
|
||||
#define SPORT_REQ(x) \
|
||||
@ -2628,13 +2627,6 @@ static struct platform_device bfin_i2s_pcm = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
static struct platform_device bfin_tdm_pcm = {
|
||||
.name = "bfin-tdm-pcm-audio",
|
||||
.id = -1,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
static struct platform_device bfin_ac97_pcm = {
|
||||
.name = "bfin-ac97-pcm-audio",
|
||||
@ -2645,7 +2637,7 @@ static struct platform_device bfin_ac97_pcm = {
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) \
|
||||
|| defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||
static const char * const ad1836_link[] = {
|
||||
"bfin-tdm.0",
|
||||
"bfin-i2s.0",
|
||||
"spi0.4",
|
||||
};
|
||||
static struct platform_device bfin_ad1836_machine = {
|
||||
@ -2699,18 +2691,6 @@ static struct platform_device bfin_i2s = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_TDM) || defined(CONFIG_SND_BF5XX_SOC_TDM_MODULE)
|
||||
static struct platform_device bfin_tdm = {
|
||||
.name = "bfin-tdm",
|
||||
.id = CONFIG_SND_BF5XX_SPORT_NUM,
|
||||
.num_resources = ARRAY_SIZE(bfin_snd_resources[CONFIG_SND_BF5XX_SPORT_NUM]),
|
||||
.resource = bfin_snd_resources[CONFIG_SND_BF5XX_SPORT_NUM],
|
||||
.dev = {
|
||||
.platform_data = &bfin_snd_data[CONFIG_SND_BF5XX_SPORT_NUM],
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AC97) || defined(CONFIG_SND_BF5XX_SOC_AC97_MODULE)
|
||||
static struct platform_device bfin_ac97 = {
|
||||
.name = "bfin-ac97",
|
||||
@ -2935,10 +2915,6 @@ static struct platform_device *stamp_devices[] __initdata = {
|
||||
&bfin_i2s_pcm,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
&bfin_tdm_pcm,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
&bfin_ac97_pcm,
|
||||
#endif
|
||||
@ -2961,10 +2937,6 @@ static struct platform_device *stamp_devices[] __initdata = {
|
||||
&bfin_i2s,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_TDM) || defined(CONFIG_SND_BF5XX_SOC_TDM_MODULE)
|
||||
&bfin_tdm,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AC97) || defined(CONFIG_SND_BF5XX_SOC_AC97_MODULE)
|
||||
&bfin_ac97,
|
||||
#endif
|
||||
|
@ -1393,7 +1393,6 @@ static struct platform_device bfin_dpmc = {
|
||||
};
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_I2S) || defined(CONFIG_SND_BF5XX_I2S_MODULE) || \
|
||||
defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE) || \
|
||||
defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
|
||||
#define SPORT_REQ(x) \
|
||||
@ -1461,13 +1460,6 @@ static struct platform_device bfin_i2s_pcm = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
static struct platform_device bfin_tdm_pcm = {
|
||||
.name = "bfin-tdm-pcm-audio",
|
||||
.id = -1,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
static struct platform_device bfin_ac97_pcm = {
|
||||
.name = "bfin-ac97-pcm-audio",
|
||||
@ -1501,18 +1493,6 @@ static struct platform_device bfin_i2s = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_TDM) || defined(CONFIG_SND_BF5XX_SOC_TDM_MODULE)
|
||||
static struct platform_device bfin_tdm = {
|
||||
.name = "bfin-tdm",
|
||||
.id = CONFIG_SND_BF5XX_SPORT_NUM,
|
||||
.num_resources = ARRAY_SIZE(bfin_snd_resources[CONFIG_SND_BF5XX_SPORT_NUM]),
|
||||
.resource = bfin_snd_resources[CONFIG_SND_BF5XX_SPORT_NUM],
|
||||
.dev = {
|
||||
.platform_data = &bfin_snd_data[CONFIG_SND_BF5XX_SPORT_NUM],
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AC97) || defined(CONFIG_SND_BF5XX_SOC_AC97_MODULE)
|
||||
static struct platform_device bfin_ac97 = {
|
||||
.name = "bfin-ac97",
|
||||
@ -1646,9 +1626,7 @@ static struct platform_device *ezkit_devices[] __initdata = {
|
||||
#if defined(CONFIG_SND_BF5XX_I2S) || defined(CONFIG_SND_BF5XX_I2S_MODULE)
|
||||
&bfin_i2s_pcm,
|
||||
#endif
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
&bfin_tdm_pcm,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
&bfin_ac97_pcm,
|
||||
#endif
|
||||
@ -1661,10 +1639,6 @@ static struct platform_device *ezkit_devices[] __initdata = {
|
||||
&bfin_i2s,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
&bfin_tdm,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
&bfin_ac97,
|
||||
#endif
|
||||
|
@ -523,14 +523,6 @@ static struct platform_device bfin_i2s = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
static struct platform_device bfin_tdm = {
|
||||
.name = "bfin-tdm",
|
||||
.id = CONFIG_SND_BF5XX_SPORT_NUM,
|
||||
/* TODO: add platform data here */
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
static struct platform_device bfin_ac97 = {
|
||||
.name = "bfin-ac97",
|
||||
@ -542,7 +534,7 @@ static struct platform_device bfin_ac97 = {
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) \
|
||||
|| defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||
static const char * const ad1836_link[] = {
|
||||
"bfin-tdm.0",
|
||||
"bfin-i2s.0",
|
||||
"spi0.4",
|
||||
};
|
||||
static struct platform_device bfin_ad1836_machine = {
|
||||
@ -611,10 +603,6 @@ static struct platform_device *ezkit_devices[] __initdata = {
|
||||
&bfin_i2s,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||
&bfin_tdm,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
|
||||
&bfin_ac97,
|
||||
#endif
|
||||
|
@ -821,7 +821,7 @@ static struct platform_device bfin_i2s = {
|
||||
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) \
|
||||
|| defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||
static const char * const ad1836_link[] = {
|
||||
"bfin-tdm.0",
|
||||
"bfin-i2s.0",
|
||||
"spi0.76",
|
||||
};
|
||||
static struct platform_device bfin_ad1836_machine = {
|
||||
|
@ -16,9 +16,13 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/mfd/core.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <linux/mfd/arizona/core.h>
|
||||
@ -344,6 +348,17 @@ static int arizona_runtime_resume(struct device *dev)
|
||||
|
||||
switch (arizona->type) {
|
||||
case WM5102:
|
||||
if (arizona->external_dcvdd) {
|
||||
ret = regmap_update_bits(arizona->regmap,
|
||||
ARIZONA_ISOLATION_CONTROL,
|
||||
ARIZONA_ISOLATE_DCVDD1, 0);
|
||||
if (ret != 0) {
|
||||
dev_err(arizona->dev,
|
||||
"Failed to connect DCVDD: %d\n", ret);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
ret = wm5102_patch(arizona);
|
||||
if (ret != 0) {
|
||||
dev_err(arizona->dev, "Failed to apply patch: %d\n",
|
||||
@ -365,6 +380,28 @@ static int arizona_runtime_resume(struct device *dev)
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (arizona->external_dcvdd) {
|
||||
ret = regmap_update_bits(arizona->regmap,
|
||||
ARIZONA_ISOLATION_CONTROL,
|
||||
ARIZONA_ISOLATE_DCVDD1, 0);
|
||||
if (ret != 0) {
|
||||
dev_err(arizona->dev,
|
||||
"Failed to connect DCVDD: %d\n", ret);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
switch (arizona->type) {
|
||||
case WM5102:
|
||||
ret = wm5102_patch(arizona);
|
||||
if (ret != 0) {
|
||||
dev_err(arizona->dev, "Failed to apply patch: %d\n",
|
||||
ret);
|
||||
goto err;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@ -385,9 +422,22 @@ err:
|
||||
static int arizona_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct arizona *arizona = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
dev_dbg(arizona->dev, "Entering AoD mode\n");
|
||||
|
||||
if (arizona->external_dcvdd) {
|
||||
ret = regmap_update_bits(arizona->regmap,
|
||||
ARIZONA_ISOLATION_CONTROL,
|
||||
ARIZONA_ISOLATE_DCVDD1,
|
||||
ARIZONA_ISOLATE_DCVDD1);
|
||||
if (ret != 0) {
|
||||
dev_err(arizona->dev, "Failed to isolate DCVDD: %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
regulator_disable(arizona->dcvdd);
|
||||
regcache_cache_only(arizona->regmap, true);
|
||||
regcache_mark_dirty(arizona->regmap);
|
||||
@ -397,6 +447,26 @@ static int arizona_runtime_suspend(struct device *dev)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int arizona_suspend(struct device *dev)
|
||||
{
|
||||
struct arizona *arizona = dev_get_drvdata(dev);
|
||||
|
||||
dev_dbg(arizona->dev, "Suspend, disabling IRQ\n");
|
||||
disable_irq(arizona->irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int arizona_suspend_late(struct device *dev)
|
||||
{
|
||||
struct arizona *arizona = dev_get_drvdata(dev);
|
||||
|
||||
dev_dbg(arizona->dev, "Late suspend, reenabling IRQ\n");
|
||||
enable_irq(arizona->irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int arizona_resume_noirq(struct device *dev)
|
||||
{
|
||||
struct arizona *arizona = dev_get_drvdata(dev);
|
||||
@ -422,13 +492,78 @@ const struct dev_pm_ops arizona_pm_ops = {
|
||||
SET_RUNTIME_PM_OPS(arizona_runtime_suspend,
|
||||
arizona_runtime_resume,
|
||||
NULL)
|
||||
SET_SYSTEM_SLEEP_PM_OPS(NULL, arizona_resume)
|
||||
SET_SYSTEM_SLEEP_PM_OPS(arizona_suspend, arizona_resume)
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.suspend_late = arizona_suspend_late,
|
||||
.resume_noirq = arizona_resume_noirq,
|
||||
#endif
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(arizona_pm_ops);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
int arizona_of_get_type(struct device *dev)
|
||||
{
|
||||
const struct of_device_id *id = of_match_device(arizona_of_match, dev);
|
||||
|
||||
if (id)
|
||||
return (int)id->data;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(arizona_of_get_type);
|
||||
|
||||
static int arizona_of_get_core_pdata(struct arizona *arizona)
|
||||
{
|
||||
int ret, i;
|
||||
|
||||
arizona->pdata.reset = of_get_named_gpio(arizona->dev->of_node,
|
||||
"wlf,reset", 0);
|
||||
if (arizona->pdata.reset < 0)
|
||||
arizona->pdata.reset = 0;
|
||||
|
||||
arizona->pdata.ldoena = of_get_named_gpio(arizona->dev->of_node,
|
||||
"wlf,ldoena", 0);
|
||||
if (arizona->pdata.ldoena < 0)
|
||||
arizona->pdata.ldoena = 0;
|
||||
|
||||
ret = of_property_read_u32_array(arizona->dev->of_node,
|
||||
"wlf,gpio-defaults",
|
||||
arizona->pdata.gpio_defaults,
|
||||
ARRAY_SIZE(arizona->pdata.gpio_defaults));
|
||||
if (ret >= 0) {
|
||||
/*
|
||||
* All values are literal except out of range values
|
||||
* which are chip default, translate into platform
|
||||
* data which uses 0 as chip default and out of range
|
||||
* as zero.
|
||||
*/
|
||||
for (i = 0; i < ARRAY_SIZE(arizona->pdata.gpio_defaults); i++) {
|
||||
if (arizona->pdata.gpio_defaults[i] > 0xffff)
|
||||
arizona->pdata.gpio_defaults[i] = 0;
|
||||
if (arizona->pdata.gpio_defaults[i] == 0)
|
||||
arizona->pdata.gpio_defaults[i] = 0x10000;
|
||||
}
|
||||
} else {
|
||||
dev_err(arizona->dev, "Failed to parse GPIO defaults: %d\n",
|
||||
ret);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct of_device_id arizona_of_match[] = {
|
||||
{ .compatible = "wlf,wm5102", .data = (void *)WM5102 },
|
||||
{ .compatible = "wlf,wm5110", .data = (void *)WM5110 },
|
||||
{},
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(arizona_of_match);
|
||||
#else
|
||||
static inline int arizona_of_get_core_pdata(struct arizona *arizona)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct mfd_cell early_devs[] = {
|
||||
{ .name = "arizona-ldo1" },
|
||||
};
|
||||
@ -462,6 +597,8 @@ int arizona_dev_init(struct arizona *arizona)
|
||||
dev_set_drvdata(arizona->dev, arizona);
|
||||
mutex_init(&arizona->clk_lock);
|
||||
|
||||
arizona_of_get_core_pdata(arizona);
|
||||
|
||||
if (dev_get_platdata(arizona->dev))
|
||||
memcpy(&arizona->pdata, dev_get_platdata(arizona->dev),
|
||||
sizeof(arizona->pdata));
|
||||
@ -536,6 +673,63 @@ int arizona_dev_init(struct arizona *arizona)
|
||||
|
||||
regcache_cache_only(arizona->regmap, false);
|
||||
|
||||
/* Verify that this is a chip we know about */
|
||||
ret = regmap_read(arizona->regmap, ARIZONA_SOFTWARE_RESET, ®);
|
||||
if (ret != 0) {
|
||||
dev_err(dev, "Failed to read ID register: %d\n", ret);
|
||||
goto err_reset;
|
||||
}
|
||||
|
||||
switch (reg) {
|
||||
case 0x5102:
|
||||
case 0x5110:
|
||||
break;
|
||||
default:
|
||||
dev_err(arizona->dev, "Unknown device ID: %x\n", reg);
|
||||
goto err_reset;
|
||||
}
|
||||
|
||||
/* If we have a /RESET GPIO we'll already be reset */
|
||||
if (!arizona->pdata.reset) {
|
||||
regcache_mark_dirty(arizona->regmap);
|
||||
|
||||
ret = regmap_write(arizona->regmap, ARIZONA_SOFTWARE_RESET, 0);
|
||||
if (ret != 0) {
|
||||
dev_err(dev, "Failed to reset device: %d\n", ret);
|
||||
goto err_reset;
|
||||
}
|
||||
|
||||
msleep(1);
|
||||
|
||||
ret = regcache_sync(arizona->regmap);
|
||||
if (ret != 0) {
|
||||
dev_err(dev, "Failed to sync device: %d\n", ret);
|
||||
goto err_reset;
|
||||
}
|
||||
}
|
||||
|
||||
/* Ensure device startup is complete */
|
||||
switch (arizona->type) {
|
||||
case WM5102:
|
||||
ret = regmap_read(arizona->regmap, 0x19, &val);
|
||||
if (ret != 0)
|
||||
dev_err(dev,
|
||||
"Failed to check write sequencer state: %d\n",
|
||||
ret);
|
||||
else if (val & 0x01)
|
||||
break;
|
||||
/* Fall through */
|
||||
default:
|
||||
ret = arizona_wait_for_boot(arizona);
|
||||
if (ret != 0) {
|
||||
dev_err(arizona->dev,
|
||||
"Device failed initial boot: %d\n", ret);
|
||||
goto err_reset;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/* Read the device ID information & do device specific stuff */
|
||||
ret = regmap_read(arizona->regmap, ARIZONA_SOFTWARE_RESET, ®);
|
||||
if (ret != 0) {
|
||||
dev_err(dev, "Failed to read ID register: %d\n", ret);
|
||||
@ -581,45 +775,6 @@ int arizona_dev_init(struct arizona *arizona)
|
||||
|
||||
dev_info(dev, "%s revision %c\n", type_name, arizona->rev + 'A');
|
||||
|
||||
/* If we have a /RESET GPIO we'll already be reset */
|
||||
if (!arizona->pdata.reset) {
|
||||
regcache_mark_dirty(arizona->regmap);
|
||||
|
||||
ret = regmap_write(arizona->regmap, ARIZONA_SOFTWARE_RESET, 0);
|
||||
if (ret != 0) {
|
||||
dev_err(dev, "Failed to reset device: %d\n", ret);
|
||||
goto err_reset;
|
||||
}
|
||||
|
||||
msleep(1);
|
||||
|
||||
ret = regcache_sync(arizona->regmap);
|
||||
if (ret != 0) {
|
||||
dev_err(dev, "Failed to sync device: %d\n", ret);
|
||||
goto err_reset;
|
||||
}
|
||||
}
|
||||
|
||||
switch (arizona->type) {
|
||||
case WM5102:
|
||||
ret = regmap_read(arizona->regmap, 0x19, &val);
|
||||
if (ret != 0)
|
||||
dev_err(dev,
|
||||
"Failed to check write sequencer state: %d\n",
|
||||
ret);
|
||||
else if (val & 0x01)
|
||||
break;
|
||||
/* Fall through */
|
||||
default:
|
||||
ret = arizona_wait_for_boot(arizona);
|
||||
if (ret != 0) {
|
||||
dev_err(arizona->dev,
|
||||
"Device failed initial boot: %d\n", ret);
|
||||
goto err_reset;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (apply_patch) {
|
||||
ret = apply_patch(arizona);
|
||||
if (ret != 0) {
|
||||
@ -651,6 +806,14 @@ int arizona_dev_init(struct arizona *arizona)
|
||||
arizona->pdata.gpio_defaults[i]);
|
||||
}
|
||||
|
||||
/*
|
||||
* LDO1 can only be used to supply DCVDD so if it has no
|
||||
* consumers then DCVDD is supplied externally.
|
||||
*/
|
||||
if (arizona->pdata.ldo1 &&
|
||||
arizona->pdata.ldo1->num_consumer_supplies == 0)
|
||||
arizona->external_dcvdd = true;
|
||||
|
||||
pm_runtime_set_autosuspend_delay(arizona->dev, 100);
|
||||
pm_runtime_use_autosuspend(arizona->dev);
|
||||
pm_runtime_enable(arizona->dev);
|
||||
@ -697,7 +860,7 @@ int arizona_dev_init(struct arizona *arizona)
|
||||
if (arizona->pdata.micbias[i].discharge)
|
||||
val |= ARIZONA_MICB1_DISCH;
|
||||
|
||||
if (arizona->pdata.micbias[i].fast_start)
|
||||
if (arizona->pdata.micbias[i].soft_start)
|
||||
val |= ARIZONA_MICB1_RATE;
|
||||
|
||||
if (arizona->pdata.micbias[i].bypass)
|
||||
@ -809,6 +972,11 @@ int arizona_dev_exit(struct arizona *arizona)
|
||||
arizona_free_irq(arizona, ARIZONA_IRQ_CLKGEN_ERR, arizona);
|
||||
pm_runtime_disable(arizona->dev);
|
||||
arizona_irq_exit(arizona);
|
||||
if (arizona->pdata.reset)
|
||||
gpio_set_value_cansleep(arizona->pdata.reset, 0);
|
||||
regulator_disable(arizona->dcvdd);
|
||||
regulator_bulk_disable(ARRAY_SIZE(arizona->core_supplies),
|
||||
arizona->core_supplies);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(arizona_dev_exit);
|
||||
|
@ -27,9 +27,14 @@ static int arizona_i2c_probe(struct i2c_client *i2c,
|
||||
{
|
||||
struct arizona *arizona;
|
||||
const struct regmap_config *regmap_config;
|
||||
int ret;
|
||||
int ret, type;
|
||||
|
||||
switch (id->driver_data) {
|
||||
if (i2c->dev.of_node)
|
||||
type = arizona_of_get_type(&i2c->dev);
|
||||
else
|
||||
type = id->driver_data;
|
||||
|
||||
switch (type) {
|
||||
#ifdef CONFIG_MFD_WM5102
|
||||
case WM5102:
|
||||
regmap_config = &wm5102_i2c_regmap;
|
||||
@ -84,6 +89,7 @@ static struct i2c_driver arizona_i2c_driver = {
|
||||
.name = "arizona",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &arizona_pm_ops,
|
||||
.of_match_table = of_match_ptr(arizona_of_match),
|
||||
},
|
||||
.probe = arizona_i2c_probe,
|
||||
.remove = arizona_i2c_remove,
|
||||
|
@ -27,9 +27,14 @@ static int arizona_spi_probe(struct spi_device *spi)
|
||||
const struct spi_device_id *id = spi_get_device_id(spi);
|
||||
struct arizona *arizona;
|
||||
const struct regmap_config *regmap_config;
|
||||
int ret;
|
||||
int ret, type;
|
||||
|
||||
switch (id->driver_data) {
|
||||
if (spi->dev.of_node)
|
||||
type = arizona_of_get_type(&spi->dev);
|
||||
else
|
||||
type = id->driver_data;
|
||||
|
||||
switch (type) {
|
||||
#ifdef CONFIG_MFD_WM5102
|
||||
case WM5102:
|
||||
regmap_config = &wm5102_spi_regmap;
|
||||
@ -84,6 +89,7 @@ static struct spi_driver arizona_spi_driver = {
|
||||
.name = "arizona",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &arizona_pm_ops,
|
||||
.of_match_table = of_match_ptr(arizona_of_match),
|
||||
},
|
||||
.probe = arizona_spi_probe,
|
||||
.remove = arizona_spi_remove,
|
||||
|
@ -13,6 +13,7 @@
|
||||
#ifndef _WM5102_H
|
||||
#define _WM5102_H
|
||||
|
||||
#include <linux/of.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/pm.h>
|
||||
|
||||
@ -26,6 +27,8 @@ extern const struct regmap_config wm5110_spi_regmap;
|
||||
|
||||
extern const struct dev_pm_ops arizona_pm_ops;
|
||||
|
||||
extern const struct of_device_id arizona_of_match[];
|
||||
|
||||
extern const struct regmap_irq_chip wm5102_aod;
|
||||
extern const struct regmap_irq_chip wm5102_irq;
|
||||
|
||||
@ -37,4 +40,13 @@ int arizona_dev_exit(struct arizona *arizona);
|
||||
int arizona_irq_init(struct arizona *arizona);
|
||||
int arizona_irq_exit(struct arizona *arizona);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
int arizona_of_get_type(struct device *dev);
|
||||
#else
|
||||
static inline int arizona_of_get_type(struct device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -65,7 +65,8 @@ static const struct reg_default wm5102_revb_patch[] = {
|
||||
{ 0x418, 0xa080 },
|
||||
{ 0x420, 0xa080 },
|
||||
{ 0x428, 0xe000 },
|
||||
{ 0x443, 0xDC1A },
|
||||
{ 0x442, 0x3F0A },
|
||||
{ 0x443, 0xDC1F },
|
||||
{ 0x4B0, 0x0066 },
|
||||
{ 0x458, 0x000b },
|
||||
{ 0x212, 0x0000 },
|
||||
@ -424,6 +425,9 @@ static const struct reg_default wm5102_reg_default[] = {
|
||||
{ 0x00000435, 0x0180 }, /* R1077 - DAC Digital Volume 5R */
|
||||
{ 0x00000436, 0x0081 }, /* R1078 - DAC Volume Limit 5R */
|
||||
{ 0x00000437, 0x0200 }, /* R1079 - Noise Gate Select 5R */
|
||||
{ 0x00000440, 0x8FFF }, /* R1088 - DRE Enable */
|
||||
{ 0x00000442, 0x3F0A }, /* R1090 - DRE Control 2 */
|
||||
{ 0x00000443, 0xDC1F }, /* R1090 - DRE Control 3 */
|
||||
{ 0x00000450, 0x0000 }, /* R1104 - DAC AEC Control 1 */
|
||||
{ 0x00000458, 0x000B }, /* R1112 - Noise Gate Control */
|
||||
{ 0x00000490, 0x0069 }, /* R1168 - PDM SPK1 CTRL 1 */
|
||||
@ -1197,6 +1201,9 @@ static bool wm5102_readable_register(struct device *dev, unsigned int reg)
|
||||
case ARIZONA_DAC_DIGITAL_VOLUME_5R:
|
||||
case ARIZONA_DAC_VOLUME_LIMIT_5R:
|
||||
case ARIZONA_NOISE_GATE_SELECT_5R:
|
||||
case ARIZONA_DRE_ENABLE:
|
||||
case ARIZONA_DRE_CONTROL_2:
|
||||
case ARIZONA_DRE_CONTROL_3:
|
||||
case ARIZONA_DAC_AEC_CONTROL_1:
|
||||
case ARIZONA_NOISE_GATE_CONTROL:
|
||||
case ARIZONA_PDM_SPK1_CTRL_1:
|
||||
|
@ -2273,18 +2273,22 @@ static bool wm5110_readable_register(struct device *dev, unsigned int reg)
|
||||
case ARIZONA_DSP1_CLOCKING_1:
|
||||
case ARIZONA_DSP1_STATUS_1:
|
||||
case ARIZONA_DSP1_STATUS_2:
|
||||
case ARIZONA_DSP1_STATUS_3:
|
||||
case ARIZONA_DSP2_CONTROL_1:
|
||||
case ARIZONA_DSP2_CLOCKING_1:
|
||||
case ARIZONA_DSP2_STATUS_1:
|
||||
case ARIZONA_DSP2_STATUS_2:
|
||||
case ARIZONA_DSP2_STATUS_3:
|
||||
case ARIZONA_DSP3_CONTROL_1:
|
||||
case ARIZONA_DSP3_CLOCKING_1:
|
||||
case ARIZONA_DSP3_STATUS_1:
|
||||
case ARIZONA_DSP3_STATUS_2:
|
||||
case ARIZONA_DSP3_STATUS_3:
|
||||
case ARIZONA_DSP4_CONTROL_1:
|
||||
case ARIZONA_DSP4_CLOCKING_1:
|
||||
case ARIZONA_DSP4_STATUS_1:
|
||||
case ARIZONA_DSP4_STATUS_2:
|
||||
case ARIZONA_DSP4_STATUS_3:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
@ -2334,12 +2338,16 @@ static bool wm5110_volatile_register(struct device *dev, unsigned int reg)
|
||||
case ARIZONA_DSP1_CLOCKING_1:
|
||||
case ARIZONA_DSP1_STATUS_1:
|
||||
case ARIZONA_DSP1_STATUS_2:
|
||||
case ARIZONA_DSP1_STATUS_3:
|
||||
case ARIZONA_DSP2_STATUS_1:
|
||||
case ARIZONA_DSP2_STATUS_2:
|
||||
case ARIZONA_DSP2_STATUS_3:
|
||||
case ARIZONA_DSP3_STATUS_1:
|
||||
case ARIZONA_DSP3_STATUS_2:
|
||||
case ARIZONA_DSP3_STATUS_3:
|
||||
case ARIZONA_DSP4_STATUS_1:
|
||||
case ARIZONA_DSP4_STATUS_2:
|
||||
case ARIZONA_DSP4_STATUS_3:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
|
@ -58,7 +58,7 @@ struct ssc_device *ssc_request(unsigned int ssc_num)
|
||||
ssc->user++;
|
||||
spin_unlock(&user_lock);
|
||||
|
||||
clk_enable(ssc->clk);
|
||||
clk_prepare_enable(ssc->clk);
|
||||
|
||||
return ssc;
|
||||
}
|
||||
@ -69,7 +69,7 @@ void ssc_free(struct ssc_device *ssc)
|
||||
spin_lock(&user_lock);
|
||||
if (ssc->user) {
|
||||
ssc->user--;
|
||||
clk_disable(ssc->clk);
|
||||
clk_disable_unprepare(ssc->clk);
|
||||
} else {
|
||||
dev_dbg(&ssc->pdev->dev, "device already free\n");
|
||||
}
|
||||
@ -167,10 +167,10 @@ static int ssc_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
/* disable all interrupts */
|
||||
clk_enable(ssc->clk);
|
||||
clk_prepare_enable(ssc->clk);
|
||||
ssc_writel(ssc->regs, IDR, -1);
|
||||
ssc_readl(ssc->regs, SR);
|
||||
clk_disable(ssc->clk);
|
||||
clk_disable_unprepare(ssc->clk);
|
||||
|
||||
ssc->irq = platform_get_irq(pdev, 0);
|
||||
if (!ssc->irq) {
|
||||
|
@ -95,6 +95,8 @@ struct arizona {
|
||||
|
||||
struct arizona_pdata pdata;
|
||||
|
||||
unsigned int external_dcvdd:1;
|
||||
|
||||
int irq;
|
||||
struct irq_domain *virq;
|
||||
struct regmap_irq_chip_data *aod_irq_chip;
|
||||
|
@ -77,7 +77,7 @@ struct arizona_micbias {
|
||||
int mV; /** Regulated voltage */
|
||||
unsigned int ext_cap:1; /** External capacitor fitted */
|
||||
unsigned int discharge:1; /** Actively discharge */
|
||||
unsigned int fast_start:1; /** Enable aggressive startup ramp rate */
|
||||
unsigned int soft_start:1; /** Disable aggressive startup ramp rate */
|
||||
unsigned int bypass:1; /** Use bypass mode */
|
||||
};
|
||||
|
||||
|
@ -215,6 +215,9 @@
|
||||
#define ARIZONA_DAC_DIGITAL_VOLUME_6R 0x43D
|
||||
#define ARIZONA_DAC_VOLUME_LIMIT_6R 0x43E
|
||||
#define ARIZONA_NOISE_GATE_SELECT_6R 0x43F
|
||||
#define ARIZONA_DRE_ENABLE 0x440
|
||||
#define ARIZONA_DRE_CONTROL_2 0x442
|
||||
#define ARIZONA_DRE_CONTROL_3 0x443
|
||||
#define ARIZONA_DAC_AEC_CONTROL_1 0x450
|
||||
#define ARIZONA_NOISE_GATE_CONTROL 0x458
|
||||
#define ARIZONA_PDM_SPK1_CTRL_1 0x490
|
||||
@ -1002,6 +1005,7 @@
|
||||
#define ARIZONA_DSP2_CLOCKING_1 0x1201
|
||||
#define ARIZONA_DSP2_STATUS_1 0x1204
|
||||
#define ARIZONA_DSP2_STATUS_2 0x1205
|
||||
#define ARIZONA_DSP2_STATUS_3 0x1206
|
||||
#define ARIZONA_DSP2_SCRATCH_0 0x1240
|
||||
#define ARIZONA_DSP2_SCRATCH_1 0x1241
|
||||
#define ARIZONA_DSP2_SCRATCH_2 0x1242
|
||||
@ -1010,6 +1014,7 @@
|
||||
#define ARIZONA_DSP3_CLOCKING_1 0x1301
|
||||
#define ARIZONA_DSP3_STATUS_1 0x1304
|
||||
#define ARIZONA_DSP3_STATUS_2 0x1305
|
||||
#define ARIZONA_DSP3_STATUS_3 0x1306
|
||||
#define ARIZONA_DSP3_SCRATCH_0 0x1340
|
||||
#define ARIZONA_DSP3_SCRATCH_1 0x1341
|
||||
#define ARIZONA_DSP3_SCRATCH_2 0x1342
|
||||
@ -1018,6 +1023,7 @@
|
||||
#define ARIZONA_DSP4_CLOCKING_1 0x1401
|
||||
#define ARIZONA_DSP4_STATUS_1 0x1404
|
||||
#define ARIZONA_DSP4_STATUS_2 0x1405
|
||||
#define ARIZONA_DSP4_STATUS_3 0x1406
|
||||
#define ARIZONA_DSP4_SCRATCH_0 0x1440
|
||||
#define ARIZONA_DSP4_SCRATCH_1 0x1441
|
||||
#define ARIZONA_DSP4_SCRATCH_2 0x1442
|
||||
@ -3129,6 +3135,47 @@
|
||||
#define ARIZONA_OUT6R_NGATE_SRC_SHIFT 0 /* OUT6R_NGATE_SRC - [11:0] */
|
||||
#define ARIZONA_OUT6R_NGATE_SRC_WIDTH 12 /* OUT6R_NGATE_SRC - [11:0] */
|
||||
|
||||
/*
|
||||
* R1088 (0x440) - DRE Enable
|
||||
*/
|
||||
#define ARIZONA_DRE3L_ENA 0x0010 /* DRE3L_ENA */
|
||||
#define ARIZONA_DRE3L_ENA_MASK 0x0010 /* DRE3L_ENA */
|
||||
#define ARIZONA_DRE3L_ENA_SHIFT 4 /* DRE3L_ENA */
|
||||
#define ARIZONA_DRE3L_ENA_WIDTH 1 /* DRE3L_ENA */
|
||||
#define ARIZONA_DRE2R_ENA 0x0008 /* DRE2R_ENA */
|
||||
#define ARIZONA_DRE2R_ENA_MASK 0x0008 /* DRE2R_ENA */
|
||||
#define ARIZONA_DRE2R_ENA_SHIFT 3 /* DRE2R_ENA */
|
||||
#define ARIZONA_DRE2R_ENA_WIDTH 1 /* DRE2R_ENA */
|
||||
#define ARIZONA_DRE2L_ENA 0x0004 /* DRE2L_ENA */
|
||||
#define ARIZONA_DRE2L_ENA_MASK 0x0004 /* DRE2L_ENA */
|
||||
#define ARIZONA_DRE2L_ENA_SHIFT 2 /* DRE2L_ENA */
|
||||
#define ARIZONA_DRE2L_ENA_WIDTH 1 /* DRE2L_ENA */
|
||||
#define ARIZONA_DRE1R_ENA 0x0002 /* DRE1R_ENA */
|
||||
#define ARIZONA_DRE1R_ENA_MASK 0x0002 /* DRE1R_ENA */
|
||||
#define ARIZONA_DRE1R_ENA_SHIFT 1 /* DRE1R_ENA */
|
||||
#define ARIZONA_DRE1R_ENA_WIDTH 1 /* DRE1R_ENA */
|
||||
#define ARIZONA_DRE1L_ENA 0x0001 /* DRE1L_ENA */
|
||||
#define ARIZONA_DRE1L_ENA_MASK 0x0001 /* DRE1L_ENA */
|
||||
#define ARIZONA_DRE1L_ENA_SHIFT 0 /* DRE1L_ENA */
|
||||
#define ARIZONA_DRE1L_ENA_WIDTH 1 /* DRE1L_ENA */
|
||||
|
||||
/*
|
||||
* R1090 (0x442) - DRE Control 2
|
||||
*/
|
||||
#define ARIZONA_DRE_T_LOW_MASK 0x3F00 /* DRE_T_LOW - [13:8] */
|
||||
#define ARIZONA_DRE_T_LOW_SHIFT 8 /* DRE_T_LOW - [13:8] */
|
||||
#define ARIZONA_DRE_T_LOW_WIDTH 6 /* DRE_T_LOW - [13:8] */
|
||||
|
||||
/*
|
||||
* R1091 (0x443) - DRE Control 3
|
||||
*/
|
||||
#define ARIZONA_DRE_GAIN_SHIFT_MASK 0xC000 /* DRE_GAIN_SHIFT - [15:14] */
|
||||
#define ARIZONA_DRE_GAIN_SHIFT_SHIFT 14 /* DRE_GAIN_SHIFT - [15:14] */
|
||||
#define ARIZONA_DRE_GAIN_SHIFT_WIDTH 2 /* DRE_GAIN_SHIFT - [15:14] */
|
||||
#define ARIZONA_DRE_LOW_LEVEL_ABS_MASK 0x000F /* LOW_LEVEL_ABS - [3:0] */
|
||||
#define ARIZONA_DRE_LOW_LEVEL_ABS_SHIFT 0 /* LOW_LEVEL_ABS - [3:0] */
|
||||
#define ARIZONA_DRE_LOW_LEVEL_ABS_WIDTH 4 /* LOW_LEVEL_ABS - [3:0] */
|
||||
|
||||
/*
|
||||
* R1104 (0x450) - DAC AEC Control 1
|
||||
*/
|
||||
|
@ -125,8 +125,15 @@
|
||||
|
||||
#define TWL6040_HSDACENA (1 << 0)
|
||||
#define TWL6040_HSDACMODE (1 << 1)
|
||||
#define TWL6040_HSDRVENA (1 << 2)
|
||||
#define TWL6040_HSDRVMODE (1 << 3)
|
||||
|
||||
/* HFLCTL/R (0x14/0x16) fields */
|
||||
|
||||
#define TWL6040_HFDACENA (1 << 0)
|
||||
#define TWL6040_HFPGAENA (1 << 1)
|
||||
#define TWL6040_HFDRVENA (1 << 4)
|
||||
|
||||
/* VIBCTLL/R (0x18/0x1A) fields */
|
||||
|
||||
#define TWL6040_VIBENA (1 << 0)
|
||||
|
@ -182,6 +182,11 @@ struct wm8994_pdata {
|
||||
*/
|
||||
int micdet_delay;
|
||||
|
||||
/* Delay between microphone detect completing and reporting on
|
||||
* insert (specified in ms)
|
||||
*/
|
||||
int mic_id_delay;
|
||||
|
||||
/* IRQ for microphone detection if brought out directly as a
|
||||
* signal.
|
||||
*/
|
||||
|
@ -2668,6 +2668,10 @@
|
||||
/*
|
||||
* R772 (0x304) - AIF1ADC LRCLK
|
||||
*/
|
||||
#define WM8958_AIF1_LRCLK_INV 0x1000 /* AIF1_LRCLK_INV */
|
||||
#define WM8958_AIF1_LRCLK_INV_MASK 0x1000 /* AIF1_LRCLK_INV */
|
||||
#define WM8958_AIF1_LRCLK_INV_SHIFT 12 /* AIF1_LRCLK_INV */
|
||||
#define WM8958_AIF1_LRCLK_INV_WIDTH 1 /* AIF1_LRCLK_INV */
|
||||
#define WM8994_AIF1ADC_LRCLK_DIR 0x0800 /* AIF1ADC_LRCLK_DIR */
|
||||
#define WM8994_AIF1ADC_LRCLK_DIR_MASK 0x0800 /* AIF1ADC_LRCLK_DIR */
|
||||
#define WM8994_AIF1ADC_LRCLK_DIR_SHIFT 11 /* AIF1ADC_LRCLK_DIR */
|
||||
@ -2679,6 +2683,10 @@
|
||||
/*
|
||||
* R773 (0x305) - AIF1DAC LRCLK
|
||||
*/
|
||||
#define WM8958_AIF1_LRCLK_INV 0x1000 /* AIF1_LRCLK_INV */
|
||||
#define WM8958_AIF1_LRCLK_INV_MASK 0x1000 /* AIF1_LRCLK_INV */
|
||||
#define WM8958_AIF1_LRCLK_INV_SHIFT 12 /* AIF1_LRCLK_INV */
|
||||
#define WM8958_AIF1_LRCLK_INV_WIDTH 1 /* AIF1_LRCLK_INV */
|
||||
#define WM8994_AIF1DAC_LRCLK_DIR 0x0800 /* AIF1DAC_LRCLK_DIR */
|
||||
#define WM8994_AIF1DAC_LRCLK_DIR_MASK 0x0800 /* AIF1DAC_LRCLK_DIR */
|
||||
#define WM8994_AIF1DAC_LRCLK_DIR_SHIFT 11 /* AIF1DAC_LRCLK_DIR */
|
||||
|
22
include/linux/platform_data/ssm2518.h
Normal file
22
include/linux/platform_data/ssm2518.h
Normal file
@ -0,0 +1,22 @@
|
||||
/*
|
||||
* SSM2518 amplifier audio driver
|
||||
*
|
||||
* Copyright 2013 Analog Devices Inc.
|
||||
* Author: Lars-Peter Clausen <lars@metafoo.de>
|
||||
*
|
||||
* Licensed under the GPL-2.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_PLATFORM_DATA_SSM2518_H__
|
||||
#define __LINUX_PLATFORM_DATA_SSM2518_H__
|
||||
|
||||
/**
|
||||
* struct ssm2518_platform_data - Platform data for the ssm2518 driver
|
||||
* @enable_gpio: GPIO connected to the nSD pin. Set to -1 if the nSD pin is
|
||||
* hardwired.
|
||||
*/
|
||||
struct ssm2518_platform_data {
|
||||
int enable_gpio;
|
||||
};
|
||||
|
||||
#endif
|
@ -233,7 +233,8 @@ snd_ctl_add_slave_uncached(struct snd_kcontrol *master,
|
||||
int snd_ctl_add_vmaster_hook(struct snd_kcontrol *kctl,
|
||||
void (*hook)(void *private_data, int),
|
||||
void *private_data);
|
||||
void snd_ctl_sync_vmaster_hook(struct snd_kcontrol *kctl);
|
||||
void snd_ctl_sync_vmaster(struct snd_kcontrol *kctl, bool hook_only);
|
||||
#define snd_ctl_sync_vmaster_hook(kctl) snd_ctl_sync_vmaster(kctl, true)
|
||||
|
||||
/*
|
||||
* Helper functions for jack-detection controls
|
||||
|
@ -30,7 +30,7 @@
|
||||
|
||||
/* number of supported soundcards */
|
||||
#ifdef CONFIG_SND_DYNAMIC_MINORS
|
||||
#define SNDRV_CARDS 32
|
||||
#define SNDRV_CARDS CONFIG_SND_MAX_CARDS
|
||||
#else
|
||||
#define SNDRV_CARDS 8 /* don't change - minor numbers */
|
||||
#endif
|
||||
|
@ -384,7 +384,7 @@ struct snd_pcm_substream {
|
||||
unsigned int dma_buf_id;
|
||||
size_t dma_max;
|
||||
/* -- hardware operations -- */
|
||||
struct snd_pcm_ops *ops;
|
||||
const struct snd_pcm_ops *ops;
|
||||
/* -- runtime information -- */
|
||||
struct snd_pcm_runtime *runtime;
|
||||
/* -- timer section -- */
|
||||
@ -871,7 +871,8 @@ const unsigned char *snd_pcm_format_silence_64(snd_pcm_format_t format);
|
||||
int snd_pcm_format_set_silence(snd_pcm_format_t format, void *buf, unsigned int frames);
|
||||
snd_pcm_format_t snd_pcm_build_linear_format(int width, int unsigned, int big_endian);
|
||||
|
||||
void snd_pcm_set_ops(struct snd_pcm * pcm, int direction, struct snd_pcm_ops *ops);
|
||||
void snd_pcm_set_ops(struct snd_pcm * pcm, int direction,
|
||||
const struct snd_pcm_ops *ops);
|
||||
void snd_pcm_set_sync(struct snd_pcm_substream *substream);
|
||||
int snd_pcm_lib_interleave_len(struct snd_pcm_substream *substream);
|
||||
int snd_pcm_lib_ioctl(struct snd_pcm_substream *substream,
|
||||
|
22
include/sound/rt5640.h
Normal file
22
include/sound/rt5640.h
Normal file
@ -0,0 +1,22 @@
|
||||
/*
|
||||
* linux/sound/rt5640.h -- Platform data for RT5640
|
||||
*
|
||||
* Copyright 2011 Realtek Microelectronics
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_SND_RT5640_H
|
||||
#define __LINUX_SND_RT5640_H
|
||||
|
||||
struct rt5640_platform_data {
|
||||
/* IN1 & IN2 can optionally be differential */
|
||||
bool in1_diff;
|
||||
bool in2_diff;
|
||||
|
||||
int ldo1_en; /* GPIO for LDO1_EN */
|
||||
};
|
||||
|
||||
#endif
|
@ -311,6 +311,8 @@ struct device;
|
||||
#define SND_SOC_DAPM_POST_PMD 0x8 /* after widget power down */
|
||||
#define SND_SOC_DAPM_PRE_REG 0x10 /* before audio path setup */
|
||||
#define SND_SOC_DAPM_POST_REG 0x20 /* after audio path setup */
|
||||
#define SND_SOC_DAPM_WILL_PMU 0x40 /* called at start of sequence */
|
||||
#define SND_SOC_DAPM_WILL_PMD 0x80 /* called at start of sequence */
|
||||
#define SND_SOC_DAPM_PRE_POST_PMD \
|
||||
(SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD)
|
||||
|
||||
@ -479,7 +481,6 @@ struct snd_soc_dapm_route {
|
||||
/* dapm audio path between two widgets */
|
||||
struct snd_soc_dapm_path {
|
||||
const char *name;
|
||||
const char *long_name;
|
||||
|
||||
/* source (input) and sink (output) widgets */
|
||||
struct snd_soc_dapm_widget *source;
|
||||
|
@ -340,7 +340,7 @@ struct snd_soc_jack_gpio;
|
||||
|
||||
typedef int (*hw_write_t)(void *,const char* ,int);
|
||||
|
||||
extern struct snd_ac97_bus_ops soc_ac97_ops;
|
||||
extern struct snd_ac97_bus_ops *soc_ac97_ops;
|
||||
|
||||
enum snd_soc_control_type {
|
||||
SND_SOC_I2C = 1,
|
||||
@ -467,6 +467,8 @@ int snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
|
||||
struct snd_ac97_bus_ops *ops, int num);
|
||||
void snd_soc_free_ac97_codec(struct snd_soc_codec *codec);
|
||||
|
||||
int snd_soc_set_ac97_ops(struct snd_ac97_bus_ops *ops);
|
||||
|
||||
/*
|
||||
*Controls
|
||||
*/
|
||||
|
@ -817,6 +817,8 @@ typedef int __bitwise snd_ctl_elem_iface_t;
|
||||
#define SNDRV_CTL_POWER_D3hot (SNDRV_CTL_POWER_D3|0x0000) /* Off, with power */
|
||||
#define SNDRV_CTL_POWER_D3cold (SNDRV_CTL_POWER_D3|0x0001) /* Off, without power */
|
||||
|
||||
#define SNDRV_CTL_ELEM_ID_NAME_MAXLEN 44
|
||||
|
||||
struct snd_ctl_elem_id {
|
||||
unsigned int numid; /* numeric identifier, zero = invalid */
|
||||
snd_ctl_elem_iface_t iface; /* interface identifier */
|
||||
|
@ -1076,8 +1076,6 @@ static int aaci_remove(struct amba_device *dev)
|
||||
{
|
||||
struct snd_card *card = amba_get_drvdata(dev);
|
||||
|
||||
amba_set_drvdata(dev, NULL);
|
||||
|
||||
if (card) {
|
||||
struct aaci *aaci = card->private_data;
|
||||
writel(0, aaci->base + AACI_MAINCR);
|
||||
|
@ -230,7 +230,6 @@ static int pxa2xx_ac97_remove(struct platform_device *dev)
|
||||
|
||||
if (card) {
|
||||
snd_card_free(card);
|
||||
platform_set_drvdata(dev, NULL);
|
||||
pxa2xx_ac97_hw_remove(dev);
|
||||
}
|
||||
|
||||
|
@ -157,6 +157,15 @@ config SND_DYNAMIC_MINORS
|
||||
|
||||
If you are unsure about this, say N here.
|
||||
|
||||
config SND_MAX_CARDS
|
||||
int "Max number of sound cards"
|
||||
range 4 256
|
||||
default 32
|
||||
depends on SND_DYNAMIC_MINORS
|
||||
help
|
||||
Specify the max number of sound cards that can be assigned
|
||||
on a single machine.
|
||||
|
||||
config SND_SUPPORT_OLD_API
|
||||
bool "Support old ALSA API"
|
||||
default y
|
||||
|
@ -46,7 +46,8 @@ static LIST_HEAD(shutdown_files);
|
||||
|
||||
static const struct file_operations snd_shutdown_f_ops;
|
||||
|
||||
static unsigned int snd_cards_lock; /* locked for registering/using */
|
||||
/* locked for registering/using */
|
||||
static DECLARE_BITMAP(snd_cards_lock, SNDRV_CARDS);
|
||||
struct snd_card *snd_cards[SNDRV_CARDS];
|
||||
EXPORT_SYMBOL(snd_cards);
|
||||
|
||||
@ -167,29 +168,35 @@ int snd_card_create(int idx, const char *xid,
|
||||
err = 0;
|
||||
mutex_lock(&snd_card_mutex);
|
||||
if (idx < 0) {
|
||||
for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++)
|
||||
for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++) {
|
||||
/* idx == -1 == 0xffff means: take any free slot */
|
||||
if (~snd_cards_lock & idx & 1<<idx2) {
|
||||
if (idx2 < sizeof(int) && !(idx & (1U << idx2)))
|
||||
continue;
|
||||
if (!test_bit(idx2, snd_cards_lock)) {
|
||||
if (module_slot_match(module, idx2)) {
|
||||
idx = idx2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (idx < 0) {
|
||||
for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++)
|
||||
for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++) {
|
||||
/* idx == -1 == 0xffff means: take any free slot */
|
||||
if (~snd_cards_lock & idx & 1<<idx2) {
|
||||
if (idx2 < sizeof(int) && !(idx & (1U << idx2)))
|
||||
continue;
|
||||
if (!test_bit(idx2, snd_cards_lock)) {
|
||||
if (!slots[idx2] || !*slots[idx2]) {
|
||||
idx = idx2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (idx < 0)
|
||||
err = -ENODEV;
|
||||
else if (idx < snd_ecards_limit) {
|
||||
if (snd_cards_lock & (1 << idx))
|
||||
if (test_bit(idx, snd_cards_lock))
|
||||
err = -EBUSY; /* invalid */
|
||||
} else if (idx >= SNDRV_CARDS)
|
||||
err = -ENODEV;
|
||||
@ -199,7 +206,7 @@ int snd_card_create(int idx, const char *xid,
|
||||
idx, snd_ecards_limit - 1, err);
|
||||
goto __error;
|
||||
}
|
||||
snd_cards_lock |= 1 << idx; /* lock it */
|
||||
set_bit(idx, snd_cards_lock); /* lock it */
|
||||
if (idx >= snd_ecards_limit)
|
||||
snd_ecards_limit = idx + 1; /* increase the limit */
|
||||
mutex_unlock(&snd_card_mutex);
|
||||
@ -249,7 +256,7 @@ int snd_card_locked(int card)
|
||||
int locked;
|
||||
|
||||
mutex_lock(&snd_card_mutex);
|
||||
locked = snd_cards_lock & (1 << card);
|
||||
locked = test_bit(card, snd_cards_lock);
|
||||
mutex_unlock(&snd_card_mutex);
|
||||
return locked;
|
||||
}
|
||||
@ -361,7 +368,7 @@ int snd_card_disconnect(struct snd_card *card)
|
||||
/* phase 1: disable fops (user space) operations for ALSA API */
|
||||
mutex_lock(&snd_card_mutex);
|
||||
snd_cards[card->number] = NULL;
|
||||
snd_cards_lock &= ~(1 << card->number);
|
||||
clear_bit(card->number, snd_cards_lock);
|
||||
mutex_unlock(&snd_card_mutex);
|
||||
|
||||
/* phase 2: replace file->f_op with special dummy operations */
|
||||
@ -549,7 +556,6 @@ static void snd_card_set_id_no_lock(struct snd_card *card, const char *src,
|
||||
const char *nid)
|
||||
{
|
||||
int len, loops;
|
||||
bool with_suffix;
|
||||
bool is_default = false;
|
||||
char *id;
|
||||
|
||||
@ -565,26 +571,23 @@ static void snd_card_set_id_no_lock(struct snd_card *card, const char *src,
|
||||
is_default = true;
|
||||
}
|
||||
|
||||
with_suffix = false;
|
||||
len = strlen(id);
|
||||
for (loops = 0; loops < SNDRV_CARDS; loops++) {
|
||||
char *spos;
|
||||
char sfxstr[5]; /* "_012" */
|
||||
int sfxlen;
|
||||
|
||||
if (card_id_ok(card, id))
|
||||
return; /* OK */
|
||||
|
||||
len = strlen(id);
|
||||
if (!with_suffix) {
|
||||
/* add the "_X" suffix */
|
||||
char *spos = id + len;
|
||||
if (len > sizeof(card->id) - 3)
|
||||
spos = id + sizeof(card->id) - 3;
|
||||
strcpy(spos, "_1");
|
||||
with_suffix = true;
|
||||
} else {
|
||||
/* modify the existing suffix */
|
||||
if (id[len - 1] != '9')
|
||||
id[len - 1]++;
|
||||
else
|
||||
id[len - 1] = 'A';
|
||||
}
|
||||
/* Add _XYZ suffix */
|
||||
sprintf(sfxstr, "_%X", loops + 1);
|
||||
sfxlen = strlen(sfxstr);
|
||||
if (len + sfxlen >= sizeof(card->id))
|
||||
spos = id + sizeof(card->id) - sfxlen - 1;
|
||||
else
|
||||
spos = id + len;
|
||||
strcpy(spos, sfxstr);
|
||||
}
|
||||
/* fallback to the default id */
|
||||
if (!is_default) {
|
||||
|
@ -568,7 +568,8 @@ int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream)
|
||||
*
|
||||
* Sets the given PCM operators to the pcm instance.
|
||||
*/
|
||||
void snd_pcm_set_ops(struct snd_pcm *pcm, int direction, struct snd_pcm_ops *ops)
|
||||
void snd_pcm_set_ops(struct snd_pcm *pcm, int direction,
|
||||
const struct snd_pcm_ops *ops)
|
||||
{
|
||||
struct snd_pcm_str *stream = &pcm->streams[direction];
|
||||
struct snd_pcm_substream *substream;
|
||||
|
@ -310,20 +310,10 @@ static int master_get(struct snd_kcontrol *kcontrol,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int master_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
static int sync_slaves(struct link_master *master, int old_val, int new_val)
|
||||
{
|
||||
struct link_master *master = snd_kcontrol_chip(kcontrol);
|
||||
struct link_slave *slave;
|
||||
struct snd_ctl_elem_value *uval;
|
||||
int err, old_val;
|
||||
|
||||
err = master_init(master);
|
||||
if (err < 0)
|
||||
return err;
|
||||
old_val = master->val;
|
||||
if (ucontrol->value.integer.value[0] == old_val)
|
||||
return 0;
|
||||
|
||||
uval = kmalloc(sizeof(*uval), GFP_KERNEL);
|
||||
if (!uval)
|
||||
@ -332,11 +322,33 @@ static int master_put(struct snd_kcontrol *kcontrol,
|
||||
master->val = old_val;
|
||||
uval->id = slave->slave.id;
|
||||
slave_get_val(slave, uval);
|
||||
master->val = ucontrol->value.integer.value[0];
|
||||
master->val = new_val;
|
||||
slave_put_val(slave, uval);
|
||||
}
|
||||
kfree(uval);
|
||||
if (master->hook && !err)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int master_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct link_master *master = snd_kcontrol_chip(kcontrol);
|
||||
int err, new_val, old_val;
|
||||
bool first_init;
|
||||
|
||||
err = master_init(master);
|
||||
if (err < 0)
|
||||
return err;
|
||||
first_init = err;
|
||||
old_val = master->val;
|
||||
new_val = ucontrol->value.integer.value[0];
|
||||
if (new_val == old_val)
|
||||
return 0;
|
||||
|
||||
err = sync_slaves(master, old_val, new_val);
|
||||
if (err < 0)
|
||||
return err;
|
||||
if (master->hook && !first_init)
|
||||
master->hook(master->hook_private_data, master->val);
|
||||
return 1;
|
||||
}
|
||||
@ -442,20 +454,33 @@ int snd_ctl_add_vmaster_hook(struct snd_kcontrol *kcontrol,
|
||||
EXPORT_SYMBOL_GPL(snd_ctl_add_vmaster_hook);
|
||||
|
||||
/**
|
||||
* snd_ctl_sync_vmaster_hook - Sync the vmaster hook
|
||||
* snd_ctl_sync_vmaster - Sync the vmaster slaves and hook
|
||||
* @kcontrol: vmaster kctl element
|
||||
* @hook_only: sync only the hook
|
||||
*
|
||||
* Call the hook function to synchronize with the current value of the given
|
||||
* vmaster element. NOP when NULL is passed to @kcontrol or the hook doesn't
|
||||
* exist.
|
||||
* Forcibly call the put callback of each slave and call the hook function
|
||||
* to synchronize with the current value of the given vmaster element.
|
||||
* NOP when NULL is passed to @kcontrol.
|
||||
*/
|
||||
void snd_ctl_sync_vmaster_hook(struct snd_kcontrol *kcontrol)
|
||||
void snd_ctl_sync_vmaster(struct snd_kcontrol *kcontrol, bool hook_only)
|
||||
{
|
||||
struct link_master *master;
|
||||
bool first_init = false;
|
||||
|
||||
if (!kcontrol)
|
||||
return;
|
||||
master = snd_kcontrol_chip(kcontrol);
|
||||
if (master->hook)
|
||||
if (!hook_only) {
|
||||
int err = master_init(master);
|
||||
if (err < 0)
|
||||
return;
|
||||
first_init = err;
|
||||
err = sync_slaves(master, master->val, master->val);
|
||||
if (err < 0)
|
||||
return;
|
||||
}
|
||||
|
||||
if (master->hook && !first_init)
|
||||
master->hook(master->hook_private_data, master->val);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_ctl_sync_vmaster_hook);
|
||||
EXPORT_SYMBOL_GPL(snd_ctl_sync_vmaster);
|
||||
|
@ -1183,7 +1183,6 @@ static int loopback_probe(struct platform_device *devptr)
|
||||
static int loopback_remove(struct platform_device *devptr)
|
||||
{
|
||||
snd_card_free(platform_get_drvdata(devptr));
|
||||
platform_set_drvdata(devptr, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1129,7 +1129,6 @@ static int snd_dummy_probe(struct platform_device *devptr)
|
||||
static int snd_dummy_remove(struct platform_device *devptr)
|
||||
{
|
||||
snd_card_free(platform_get_drvdata(devptr));
|
||||
platform_set_drvdata(devptr, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1325,7 +1325,6 @@ static int snd_ml403_ac97cr_probe(struct platform_device *pfdev)
|
||||
static int snd_ml403_ac97cr_remove(struct platform_device *pfdev)
|
||||
{
|
||||
snd_card_free(platform_get_drvdata(pfdev));
|
||||
platform_set_drvdata(pfdev, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -129,7 +129,6 @@ static int snd_mpu401_probe(struct platform_device *devptr)
|
||||
static int snd_mpu401_remove(struct platform_device *devptr)
|
||||
{
|
||||
snd_card_free(platform_get_drvdata(devptr));
|
||||
platform_set_drvdata(devptr, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -749,7 +749,6 @@ static int snd_mtpav_probe(struct platform_device *dev)
|
||||
static int snd_mtpav_remove(struct platform_device *devptr)
|
||||
{
|
||||
snd_card_free(platform_get_drvdata(devptr));
|
||||
platform_set_drvdata(devptr, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -189,7 +189,6 @@ static int pcsp_remove(struct platform_device *dev)
|
||||
struct snd_pcsp *chip = platform_get_drvdata(dev);
|
||||
alsa_card_pcsp_exit(chip);
|
||||
pcspkr_input_remove(chip->input_dev);
|
||||
platform_set_drvdata(dev, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -985,7 +985,6 @@ static int snd_serial_probe(struct platform_device *devptr)
|
||||
static int snd_serial_remove(struct platform_device *devptr)
|
||||
{
|
||||
snd_card_free(platform_get_drvdata(devptr));
|
||||
platform_set_drvdata(devptr, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -132,7 +132,6 @@ static int snd_virmidi_probe(struct platform_device *devptr)
|
||||
static int snd_virmidi_remove(struct platform_device *devptr)
|
||||
{
|
||||
snd_card_free(platform_get_drvdata(devptr));
|
||||
platform_set_drvdata(devptr, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -205,7 +205,7 @@ static int vx_read_status(struct vx_core *chip, struct vx_rmh *rmh)
|
||||
|
||||
if (size < 1)
|
||||
return 0;
|
||||
if (snd_BUG_ON(size > SIZE_MAX_STATUS))
|
||||
if (snd_BUG_ON(size >= SIZE_MAX_STATUS))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 1; i <= size; i++) {
|
||||
|
@ -3,7 +3,6 @@
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include "packets-buffer.h"
|
||||
|
||||
/**
|
||||
|
@ -405,8 +405,10 @@ static int scs_probe(struct device *unit_dev)
|
||||
scs->output_idle = true;
|
||||
|
||||
scs->buffer = kmalloc(HSS1394_MAX_PACKET_SIZE, GFP_KERNEL);
|
||||
if (!scs->buffer)
|
||||
if (!scs->buffer) {
|
||||
err = -ENOMEM;
|
||||
goto err_card;
|
||||
}
|
||||
|
||||
scs->hss_handler.length = HSS1394_MAX_PACKET_SIZE;
|
||||
scs->hss_handler.address_callback = handle_hss;
|
||||
|
@ -571,7 +571,7 @@ static int ak4xxx_capture_source_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
|
||||
int mixer_ch = AK_GET_SHIFT(kcontrol->private_value);
|
||||
const char **input_names;
|
||||
int num_names, idx;
|
||||
unsigned int num_names, idx;
|
||||
|
||||
num_names = ak4xxx_capture_num_inputs(ak, mixer_ch);
|
||||
if (!num_names)
|
||||
|
@ -135,7 +135,6 @@ out: snd_card_free(card);
|
||||
static int snd_ad1848_remove(struct device *dev, unsigned int n)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(dev));
|
||||
dev_set_drvdata(dev, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -101,7 +101,6 @@ out: snd_card_free(card);
|
||||
static int snd_adlib_remove(struct device *dev, unsigned int n)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(dev));
|
||||
dev_set_drvdata(dev, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -418,7 +418,6 @@ static int snd_cmi8328_remove(struct device *pdev, unsigned int dev)
|
||||
snd_cmi8328_cfg_write(cmi->port, CFG2, 0);
|
||||
snd_cmi8328_cfg_write(cmi->port, CFG3, 0);
|
||||
snd_card_free(card);
|
||||
dev_set_drvdata(pdev, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -651,7 +651,6 @@ static int snd_cmi8330_isa_remove(struct device *devptr,
|
||||
unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
dev_set_drvdata(devptr, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -151,7 +151,6 @@ out: snd_card_free(card);
|
||||
static int snd_cs4231_remove(struct device *dev, unsigned int n)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(dev));
|
||||
dev_set_drvdata(dev, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -504,7 +504,6 @@ static int snd_cs423x_isa_remove(struct device *pdev,
|
||||
unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(pdev));
|
||||
dev_set_drvdata(pdev, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -600,7 +599,6 @@ static int snd_cs423x_pnpbios_detect(struct pnp_dev *pdev,
|
||||
static void snd_cs423x_pnp_remove(struct pnp_dev *pdev)
|
||||
{
|
||||
snd_card_free(pnp_get_drvdata(pdev));
|
||||
pnp_set_drvdata(pdev, NULL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
@ -213,7 +213,6 @@ out:
|
||||
static int snd_es1688_isa_remove(struct device *dev, unsigned int n)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(dev));
|
||||
dev_set_drvdata(dev, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2235,7 +2235,6 @@ static int snd_es18xx_isa_remove(struct device *devptr,
|
||||
unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
dev_set_drvdata(devptr, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2305,7 +2304,6 @@ static int snd_audiodrive_pnp_detect(struct pnp_dev *pdev,
|
||||
static void snd_audiodrive_pnp_remove(struct pnp_dev *pdev)
|
||||
{
|
||||
snd_card_free(pnp_get_drvdata(pdev));
|
||||
pnp_set_drvdata(pdev, NULL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
@ -623,7 +623,6 @@ error:
|
||||
static int snd_galaxy_remove(struct device *dev, unsigned int n)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(dev));
|
||||
dev_set_drvdata(dev, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -215,7 +215,6 @@ out: snd_card_free(card);
|
||||
static int snd_gusclassic_remove(struct device *dev, unsigned int n)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(dev));
|
||||
dev_set_drvdata(dev, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -344,7 +344,6 @@ out: snd_card_free(card);
|
||||
static int snd_gusextreme_remove(struct device *dev, unsigned int n)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(dev));
|
||||
dev_set_drvdata(dev, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -357,7 +357,6 @@ static int snd_gusmax_probe(struct device *pdev, unsigned int dev)
|
||||
static int snd_gusmax_remove(struct device *devptr, unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
dev_set_drvdata(devptr, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -849,7 +849,6 @@ static int snd_interwave_isa_probe(struct device *pdev,
|
||||
static int snd_interwave_isa_remove(struct device *devptr, unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
dev_set_drvdata(devptr, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1064,7 +1064,6 @@ cfg_error:
|
||||
static int snd_msnd_isa_remove(struct device *pdev, unsigned int dev)
|
||||
{
|
||||
snd_msnd_unload(dev_get_drvdata(pdev));
|
||||
dev_set_drvdata(pdev, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -757,7 +757,6 @@ static int snd_opl3sa2_pnp_detect(struct pnp_dev *pdev,
|
||||
static void snd_opl3sa2_pnp_remove(struct pnp_dev *pdev)
|
||||
{
|
||||
snd_card_free(pnp_get_drvdata(pdev));
|
||||
pnp_set_drvdata(pdev, NULL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
@ -900,7 +899,6 @@ static int snd_opl3sa2_isa_remove(struct device *devptr,
|
||||
unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
dev_set_drvdata(devptr, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1495,7 +1495,6 @@ static int snd_miro_isa_remove(struct device *devptr,
|
||||
unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
dev_set_drvdata(devptr, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1035,7 +1035,6 @@ static int snd_opti9xx_isa_remove(struct device *devptr,
|
||||
unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
dev_set_drvdata(devptr, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -345,7 +345,6 @@ static int snd_jazz16_remove(struct device *devptr, unsigned int dev)
|
||||
{
|
||||
struct snd_card *card = dev_get_drvdata(devptr);
|
||||
|
||||
dev_set_drvdata(devptr, NULL);
|
||||
snd_card_free(card);
|
||||
return 0;
|
||||
}
|
||||
|
@ -566,7 +566,6 @@ static int snd_sb16_isa_probe(struct device *pdev, unsigned int dev)
|
||||
static int snd_sb16_isa_remove(struct device *pdev, unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(pdev));
|
||||
dev_set_drvdata(pdev, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -208,7 +208,6 @@ static int snd_sb8_probe(struct device *pdev, unsigned int dev)
|
||||
static int snd_sb8_remove(struct device *pdev, unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(pdev));
|
||||
dev_set_drvdata(pdev, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -698,7 +698,6 @@ static int snd_sc6000_remove(struct device *devptr, unsigned int dev)
|
||||
release_region(port[dev], 0x10);
|
||||
release_region(mss_port[dev], 4);
|
||||
|
||||
dev_set_drvdata(devptr, NULL);
|
||||
snd_card_free(card);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1200,7 +1200,6 @@ _release_card:
|
||||
static int snd_sscape_remove(struct device *devptr, unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
dev_set_drvdata(devptr, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -581,7 +581,6 @@ static int snd_wavefront_isa_remove(struct device *devptr,
|
||||
unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
dev_set_drvdata(devptr, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -178,7 +178,6 @@ static int probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
return 0;
|
||||
|
||||
err_out_free:
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
kfree(hw_config);
|
||||
return 1;
|
||||
}
|
||||
@ -187,7 +186,6 @@ static void remove_one(struct pci_dev *pdev)
|
||||
{
|
||||
struct address_info *hw_config = pci_get_drvdata(pdev);
|
||||
sb_dsp_unload(hw_config, 0);
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
kfree(hw_config);
|
||||
}
|
||||
|
||||
|
@ -902,8 +902,6 @@ snd_harmony_free(struct snd_harmony *h)
|
||||
if (h->iobase)
|
||||
iounmap(h->iobase);
|
||||
|
||||
parisc_set_drvdata(h->dev, NULL);
|
||||
|
||||
kfree(h);
|
||||
return 0;
|
||||
}
|
||||
@ -1016,7 +1014,6 @@ static int
|
||||
snd_harmony_remove(struct parisc_device *padev)
|
||||
{
|
||||
snd_card_free(parisc_get_drvdata(padev));
|
||||
parisc_set_drvdata(padev, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1296,7 +1296,7 @@ static int snd_ac97_cmix_new_stereo(struct snd_card *card, const char *pfx,
|
||||
struct snd_ac97 *ac97)
|
||||
{
|
||||
int err;
|
||||
char name[44];
|
||||
char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
|
||||
unsigned char lo_max, hi_max;
|
||||
|
||||
if (! snd_ac97_valid_reg(ac97, reg))
|
||||
|
@ -1046,7 +1046,6 @@ static void
|
||||
snd_ad1889_remove(struct pci_dev *pci)
|
||||
{
|
||||
snd_card_free(pci_get_drvdata(pci));
|
||||
pci_set_drvdata(pci, NULL);
|
||||
}
|
||||
|
||||
static DEFINE_PCI_DEVICE_TABLE(snd_ad1889_ids) = {
|
||||
|
@ -2298,7 +2298,6 @@ static int snd_ali_probe(struct pci_dev *pci,
|
||||
static void snd_ali_remove(struct pci_dev *pci)
|
||||
{
|
||||
snd_card_free(pci_get_drvdata(pci));
|
||||
pci_set_drvdata(pci, NULL);
|
||||
}
|
||||
|
||||
static struct pci_driver ali5451_driver = {
|
||||
|
@ -282,7 +282,6 @@ static void snd_als300_remove(struct pci_dev *pci)
|
||||
{
|
||||
snd_als300_dbgcallenter();
|
||||
snd_card_free(pci_get_drvdata(pci));
|
||||
pci_set_drvdata(pci, NULL);
|
||||
snd_als300_dbgcallleave();
|
||||
}
|
||||
|
||||
|
@ -984,7 +984,6 @@ out:
|
||||
static void snd_card_als4000_remove(struct pci_dev *pci)
|
||||
{
|
||||
snd_card_free(pci_get_drvdata(pci));
|
||||
pci_set_drvdata(pci, NULL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
|
@ -1278,7 +1278,7 @@ struct hpi_control {
|
||||
u16 dst_node_type;
|
||||
u16 dst_node_index;
|
||||
u16 band;
|
||||
char name[44]; /* copied to snd_ctl_elem_id.name[44]; */
|
||||
char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* copied to snd_ctl_elem_id.name[44]; */
|
||||
};
|
||||
|
||||
static const char * const asihpi_tuner_band_names[] = {
|
||||
|
@ -445,7 +445,6 @@ void asihpi_adapter_remove(struct pci_dev *pci_dev)
|
||||
if (pa->p_buffer)
|
||||
vfree(pa->p_buffer);
|
||||
|
||||
pci_set_drvdata(pci_dev, NULL);
|
||||
if (1)
|
||||
dev_info(&pci_dev->dev,
|
||||
"remove %04x:%04x,%04x:%04x,%04x, HPI index %d\n",
|
||||
|
@ -1714,7 +1714,6 @@ static int snd_atiixp_probe(struct pci_dev *pci,
|
||||
static void snd_atiixp_remove(struct pci_dev *pci)
|
||||
{
|
||||
snd_card_free(pci_get_drvdata(pci));
|
||||
pci_set_drvdata(pci, NULL);
|
||||
}
|
||||
|
||||
static struct pci_driver atiixp_driver = {
|
||||
|
@ -1334,7 +1334,6 @@ static int snd_atiixp_probe(struct pci_dev *pci,
|
||||
static void snd_atiixp_remove(struct pci_dev *pci)
|
||||
{
|
||||
snd_card_free(pci_get_drvdata(pci));
|
||||
pci_set_drvdata(pci, NULL);
|
||||
}
|
||||
|
||||
static struct pci_driver atiixp_modem_driver = {
|
||||
|
@ -371,7 +371,6 @@ snd_vortex_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
|
||||
static void snd_vortex_remove(struct pci_dev *pci)
|
||||
{
|
||||
snd_card_free(pci_get_drvdata(pci));
|
||||
pci_set_drvdata(pci, NULL);
|
||||
}
|
||||
|
||||
// pci_driver definition
|
||||
|
@ -392,7 +392,6 @@ static int snd_aw2_probe(struct pci_dev *pci,
|
||||
static void snd_aw2_remove(struct pci_dev *pci)
|
||||
{
|
||||
snd_card_free(pci_get_drvdata(pci));
|
||||
pci_set_drvdata(pci, NULL);
|
||||
}
|
||||
|
||||
/* open callback */
|
||||
|
@ -2725,7 +2725,6 @@ snd_azf3328_remove(struct pci_dev *pci)
|
||||
{
|
||||
snd_azf3328_dbgcallenter();
|
||||
snd_card_free(pci_get_drvdata(pci));
|
||||
pci_set_drvdata(pci, NULL);
|
||||
snd_azf3328_dbgcallleave();
|
||||
}
|
||||
|
||||
|
@ -953,7 +953,6 @@ _error:
|
||||
static void snd_bt87x_remove(struct pci_dev *pci)
|
||||
{
|
||||
snd_card_free(pci_get_drvdata(pci));
|
||||
pci_set_drvdata(pci, NULL);
|
||||
}
|
||||
|
||||
/* default entries for all Bt87x cards - it's not exported */
|
||||
|
@ -1896,7 +1896,6 @@ static int snd_ca0106_probe(struct pci_dev *pci,
|
||||
static void snd_ca0106_remove(struct pci_dev *pci)
|
||||
{
|
||||
snd_card_free(pci_get_drvdata(pci));
|
||||
pci_set_drvdata(pci, NULL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
|
@ -3317,7 +3317,6 @@ static int snd_cmipci_probe(struct pci_dev *pci,
|
||||
static void snd_cmipci_remove(struct pci_dev *pci)
|
||||
{
|
||||
snd_card_free(pci_get_drvdata(pci));
|
||||
pci_set_drvdata(pci, NULL);
|
||||
}
|
||||
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user