mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 05:04:09 +08:00
sound updates for 4.19
It's been busy summer weeks and hence lots of changes, partly for a few new drivers and partly for a wide range of fixes. Here are highlights: ALSA Core: - Fix rawmidi buffer management, code cleanup / refactoring - Fix the SG-buffer page handling with incorrect fallback size - Fix the stall at virmidi trigger callback with a large buffer; also offloading and code-refactoring along with it - Various ALSA sequencer code cleanups ASoC: - Deploy the standard snd_pcm_stop_xrun() helper in several drivers - Support for providing name prefixes to generic component nodes - Quite a few fixes for DPCM as it gains a bit wider use and more robust testing - Generalization of the DIO2125 support to a simple amplifier driver - Accessory detection support for the audio graph card - DT support for PXA AC'97 devices - Quirks for a number of new x86 systems - Support for AM Logic Meson, Everest ES7154, Intel systems with RT5682, Qualcomm QDSP6 and WCD9335, Realtek RT5682 and TI TAS5707 HD-audio: - Code refactoring in HD-audio ext codec codes to drop own classes; preliminary works for the upcoming legacy codec support - Generalized DRM audio component for the upcoming radeon / amdgpu support - Unification of mic mute-LED and GPIO support for various codecs - Further improvement of CA0132 codec support including Recon3D - Proper vga_switcheroo handling for AMD i-GPU - Update of model list in documentation - Fixups for another HP Spectre x360, Conexant codecs, power-save blacklist update USB-audio: - Fix the invalid sample rate setup with external clock - Support of UAC3 selector units and processing units - Basic UAC3 power-domain support - Support for Encore mDSD and Thesycon-based DSD devices - Preparation for future complete callback changes Firewire: - Add support for MOTU Traveler Misc: - The endianess notation fixes in various drivers - Add fall-through comment in lots of drivers - Various sparse warning fixes, e.g. about PCM format types -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAltxhXUOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE9BPxAAnJyKM2IcfVKanjFZQmM4w1gEM3nt+EBvbOF5 155Mq5ELNLxwwCav0eyoeTVD+mB4UO1y9+64SK73dUzBvj7llILs8s5VNMg7KYn6 MnYMo0UIDlvQ/ZwJzzpU04QZVOIHa5HK9XG+u+Fycr8YOCdhGD6m/zGiBStd/xGd Bvgw2eHF10l+zqN+Vf+1P2/ENRyNxLYpJYYC02zl0nfXP29ZY+CjicDoRvD8/97X Pe5Jcfj/4oJZlN0MMXfLLP0vaWbUyogG3a4mzVRC+wHG2FZ5hGfFb92mfT8Yce3H dq9eaih6zMMiDuP4ipClMv/0t64cA8HD+Du/Enq9Jc/g41QAU1JFzj4qi1Ga7S2w F80uWCedwZ5FLXYAAK2kIunIaaD5phD+8DegzchiVzL6eg7BLmi/Rsfg9VkuC1Ir ZZERtT07XCzwXke0IAQQ1yhTE/uMxqntCJlZ0FoohvIABgH0jvrpp/cdDYFdC3it TaNk9REAuCVjr2ket1Jrw6pKNgtry7cDkKFK5d8S5HTNFEL+sWwz2NcSdPNRIIFT aqeUWt/H1P5G25if/636UJtf+EtlRPqC2Eng8OpY8hitb2vB3trjY25T4a5x5FW5 S4oTyVWmxa4Xxj4QMMhpo7jxxwsux8J1fghDCpEqekiwt72CyVP2UN/cU8HJL7kN IWqnZgg= =eTIC -----END PGP SIGNATURE----- Merge tag 'sound-4.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound updates from Takashi Iwai: "It's been busy summer weeks and hence lots of changes, partly for a few new drivers and partly for a wide range of fixes. Here are highlights: ALSA Core: - Fix rawmidi buffer management, code cleanup / refactoring - Fix the SG-buffer page handling with incorrect fallback size - Fix the stall at virmidi trigger callback with a large buffer; also offloading and code-refactoring along with it - Various ALSA sequencer code cleanups ASoC: - Deploy the standard snd_pcm_stop_xrun() helper in several drivers - Support for providing name prefixes to generic component nodes - Quite a few fixes for DPCM as it gains a bit wider use and more robust testing - Generalization of the DIO2125 support to a simple amplifier driver - Accessory detection support for the audio graph card - DT support for PXA AC'97 devices - Quirks for a number of new x86 systems - Support for AM Logic Meson, Everest ES7154, Intel systems with RT5682, Qualcomm QDSP6 and WCD9335, Realtek RT5682 and TI TAS5707 HD-audio: - Code refactoring in HD-audio ext codec codes to drop own classes; preliminary works for the upcoming legacy codec support - Generalized DRM audio component for the upcoming radeon / amdgpu support - Unification of mic mute-LED and GPIO support for various codecs - Further improvement of CA0132 codec support including Recon3D - Proper vga_switcheroo handling for AMD i-GPU - Update of model list in documentation - Fixups for another HP Spectre x360, Conexant codecs, power-save blacklist update USB-audio: - Fix the invalid sample rate setup with external clock - Support of UAC3 selector units and processing units - Basic UAC3 power-domain support - Support for Encore mDSD and Thesycon-based DSD devices - Preparation for future complete callback changes Firewire: - Add support for MOTU Traveler Misc: - The endianess notation fixes in various drivers - Add fall-through comment in lots of drivers - Various sparse warning fixes, e.g. about PCM format types" * tag 'sound-4.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (529 commits) ASoC: adav80x: mark expected switch fall-through ASoC: da7219: Add delays to capture path to remove DC offset noise ALSA: usb-audio: Mark expected switch fall-through ALSA: mixart: Mark expected switch fall-through ALSA: opl3: Mark expected switch fall-through ALSA: hda/ca0132 - Add exit commands for Recon3D ALSA: hda/ca0132 - Change mixer controls for Recon3D ALSA: hda/ca0132 - Add Recon3D input and output select commands ALSA: hda/ca0132 - Add DSP setup defaults for Recon3D ALSA: hda/ca0132 - Add Recon3D startup functions and setup ALSA: hda/ca0132 - Add bool variable to enable/disable pci region2 mmio ALSA: hda/ca0132 - Add Recon3D pincfg ALSA: hda/ca0132 - Add quirk ID and enum for Recon3D ALSA: hda/ca0132 - Add alt_functions unsolicited response ALSA: hda/ca0132 - Clean up ca0132_init function. ALSA: hda/ca0132 - Create mmio gpio function to make code clearer ASoC: wm_adsp: Make DSP name configurable by codec driver ASoC: wm_adsp: Declare firmware controls from codec driver ASoC: max98373: Added software reset register to readable registers ASoC: wm_adsp: Correct DSP pointer for preloader control ...
This commit is contained in:
commit
747f62305d
32
Documentation/devicetree/bindings/sound/ac97-bus.txt
Normal file
32
Documentation/devicetree/bindings/sound/ac97-bus.txt
Normal file
@ -0,0 +1,32 @@
|
||||
Generic AC97 Device Properties
|
||||
|
||||
This documents describes the devicetree bindings for an ac97 controller child
|
||||
node describing ac97 codecs.
|
||||
|
||||
Required properties:
|
||||
-compatible : Must be "ac97,vendor_id1,vendor_id2
|
||||
The ids shall be the 4 characters hexadecimal encoding, such as
|
||||
given by "%04x" formatting of printf
|
||||
-reg : Must be the ac97 codec number, between 0 and 3
|
||||
|
||||
Example:
|
||||
ac97: sound@40500000 {
|
||||
compatible = "marvell,pxa270-ac97";
|
||||
reg = < 0x40500000 0x1000 >;
|
||||
interrupts = <14>;
|
||||
reset-gpios = <&gpio 95 GPIO_ACTIVE_HIGH>;
|
||||
#sound-dai-cells = <1>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = < &pinctrl_ac97_default >;
|
||||
clocks = <&clks CLK_AC97>, <&clks CLK_AC97CONF>;
|
||||
clock-names = "AC97CLK", "AC97CONFCLK";
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
audio-codec@0 {
|
||||
reg = <0>;
|
||||
compatible = "ac97,574d,4c13";
|
||||
clocks = <&fixed_wm9713_clock>;
|
||||
clock-names = "ac97_clk";
|
||||
}
|
||||
};
|
23
Documentation/devicetree/bindings/sound/amlogic,axg-fifo.txt
Normal file
23
Documentation/devicetree/bindings/sound/amlogic,axg-fifo.txt
Normal file
@ -0,0 +1,23 @@
|
||||
* Amlogic Audio FIFO controllers
|
||||
|
||||
Required properties:
|
||||
- compatible: 'amlogic,axg-toddr' or
|
||||
'amlogic,axg-frddr'
|
||||
- reg: physical base address of the controller and length of memory
|
||||
mapped region.
|
||||
- interrupts: interrupt specifier for the fifo.
|
||||
- clocks: phandle to the fifo peripheral clock provided by the audio
|
||||
clock controller.
|
||||
- resets: phandle to memory ARB line provided by the arb reset controller.
|
||||
- #sound-dai-cells: must be 0.
|
||||
|
||||
Example of FRDDR A on the A113 SoC:
|
||||
|
||||
frddr_a: audio-controller@1c0 {
|
||||
compatible = "amlogic,axg-frddr";
|
||||
reg = <0x0 0x1c0 0x0 0x1c>;
|
||||
#sound-dai-cells = <0>;
|
||||
interrupts = <GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
|
||||
clocks = <&clkc_audio AUD_CLKID_FRDDR_A>;
|
||||
resets = <&arb AXG_ARB_FRDDR_A>;
|
||||
};
|
@ -0,0 +1,124 @@
|
||||
Amlogic AXG sound card:
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: "amlogic,axg-sound-card"
|
||||
- model : User specified audio sound card name, one string
|
||||
|
||||
Optional properties:
|
||||
|
||||
- audio-aux-devs : List of phandles pointing to auxiliary devices
|
||||
- audio-widgets : Please refer to widgets.txt.
|
||||
- audio-routing : A list of the connections between audio components.
|
||||
|
||||
Subnodes:
|
||||
|
||||
- dai-link: Container for dai-link level properties and the CODEC
|
||||
sub-nodes. There should be at least one (and probably more)
|
||||
subnode of this type.
|
||||
|
||||
Required dai-link properties:
|
||||
|
||||
- sound-dai: phandle and port of the CPU DAI.
|
||||
|
||||
Required TDM Backend dai-link properties:
|
||||
- dai-format : CPU/CODEC common audio format
|
||||
|
||||
Optional TDM Backend dai-link properties:
|
||||
- dai-tdm-slot-rx-mask-{0,1,2,3}: Receive direction slot masks
|
||||
- dai-tdm-slot-tx-mask-{0,1,2,3}: Transmit direction slot masks
|
||||
When omitted, mask is assumed to have to no
|
||||
slots. A valid must have at one slot, so at
|
||||
least one these mask should be provided with
|
||||
an enabled slot.
|
||||
- dai-tdm-slot-num : Please refer to tdm-slot.txt.
|
||||
If omitted, slot number is set to accommodate the largest
|
||||
mask provided.
|
||||
- dai-tdm-slot-width : Please refer to tdm-slot.txt. default to 32 if omitted.
|
||||
- mclk-fs : Multiplication factor between stream rate and mclk
|
||||
|
||||
Backend dai-link subnodes:
|
||||
|
||||
- codec: dai-link representing backend links should have at least one subnode.
|
||||
One subnode for each codec of the dai-link.
|
||||
dai-link representing frontend links have no codec, therefore have no
|
||||
subnodes
|
||||
|
||||
Required codec subnodes properties:
|
||||
|
||||
- sound-dai: phandle and port of the CODEC DAI.
|
||||
|
||||
Optional codec subnodes properties:
|
||||
|
||||
- dai-tdm-slot-tx-mask : Please refer to tdm-slot.txt.
|
||||
- dai-tdm-slot-rx-mask : Please refer to tdm-slot.txt.
|
||||
|
||||
Example:
|
||||
|
||||
sound {
|
||||
compatible = "amlogic,axg-sound-card";
|
||||
model = "AXG-S420";
|
||||
audio-aux-devs = <&tdmin_a>, <&tdmout_c>;
|
||||
audio-widgets = "Line", "Lineout",
|
||||
"Line", "Linein",
|
||||
"Speaker", "Speaker1 Left",
|
||||
"Speaker", "Speaker1 Right";
|
||||
"Speaker", "Speaker2 Left",
|
||||
"Speaker", "Speaker2 Right";
|
||||
audio-routing = "TDMOUT_C IN 0", "FRDDR_A OUT 2",
|
||||
"SPDIFOUT IN 0", "FRDDR_A OUT 3",
|
||||
"TDM_C Playback", "TDMOUT_C OUT",
|
||||
"TDMIN_A IN 2", "TDM_C Capture",
|
||||
"TDMIN_A IN 5", "TDM_C Loopback",
|
||||
"TODDR_A IN 0", "TDMIN_A OUT",
|
||||
"Lineout", "Lineout AOUTL",
|
||||
"Lineout", "Lineout AOUTR",
|
||||
"Speaker1 Left", "SPK1 OUT_A",
|
||||
"Speaker2 Left", "SPK2 OUT_A",
|
||||
"Speaker1 Right", "SPK1 OUT_B",
|
||||
"Speaker2 Right", "SPK2 OUT_B",
|
||||
"Linein AINL", "Linein",
|
||||
"Linein AINR", "Linein";
|
||||
|
||||
dai-link@0 {
|
||||
sound-dai = <&frddr_a>;
|
||||
};
|
||||
|
||||
dai-link@1 {
|
||||
sound-dai = <&toddr_a>;
|
||||
};
|
||||
|
||||
dai-link@2 {
|
||||
sound-dai = <&tdmif_c>;
|
||||
dai-format = "i2s";
|
||||
dai-tdm-slot-tx-mask-2 = <1 1>;
|
||||
dai-tdm-slot-tx-mask-3 = <1 1>;
|
||||
dai-tdm-slot-rx-mask-1 = <1 1>;
|
||||
mclk-fs = <256>;
|
||||
|
||||
codec@0 {
|
||||
sound-dai = <&lineout>;
|
||||
};
|
||||
|
||||
codec@1 {
|
||||
sound-dai = <&speaker_amp1>;
|
||||
};
|
||||
|
||||
codec@2 {
|
||||
sound-dai = <&speaker_amp2>;
|
||||
};
|
||||
|
||||
codec@3 {
|
||||
sound-dai = <&linein>;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
dai-link@3 {
|
||||
sound-dai = <&spdifout>;
|
||||
|
||||
codec {
|
||||
sound-dai = <&spdif_dit>;
|
||||
};
|
||||
};
|
||||
};
|
@ -0,0 +1,20 @@
|
||||
* Amlogic Audio SPDIF Output
|
||||
|
||||
Required properties:
|
||||
- compatible: 'amlogic,axg-spdifout'
|
||||
- clocks: list of clock phandle, one for each entry clock-names.
|
||||
- clock-names: should contain the following:
|
||||
* "pclk" : peripheral clock.
|
||||
* "mclk" : master clock
|
||||
- #sound-dai-cells: must be 0.
|
||||
|
||||
Example on the A113 SoC:
|
||||
|
||||
spdifout: audio-controller@480 {
|
||||
compatible = "amlogic,axg-spdifout";
|
||||
reg = <0x0 0x480 0x0 0x50>;
|
||||
#sound-dai-cells = <0>;
|
||||
clocks = <&clkc_audio AUD_CLKID_SPDIFOUT>,
|
||||
<&clkc_audio AUD_CLKID_SPDIFOUT_CLK>;
|
||||
clock-names = "pclk", "mclk";
|
||||
};
|
@ -0,0 +1,28 @@
|
||||
* Amlogic Audio TDM formatters
|
||||
|
||||
Required properties:
|
||||
- compatible: 'amlogic,axg-tdmin' or
|
||||
'amlogic,axg-tdmout'
|
||||
- reg: physical base address of the controller and length of memory
|
||||
mapped region.
|
||||
- clocks: list of clock phandle, one for each entry clock-names.
|
||||
- clock-names: should contain the following:
|
||||
* "pclk" : peripheral clock.
|
||||
* "sclk" : bit clock.
|
||||
* "sclk_sel" : bit clock input multiplexer.
|
||||
* "lrclk" : sample clock
|
||||
* "lrclk_sel": sample clock input multiplexer
|
||||
|
||||
Example of TDMOUT_A on the A113 SoC:
|
||||
|
||||
tdmout_a: audio-controller@500 {
|
||||
compatible = "amlogic,axg-tdmout";
|
||||
reg = <0x0 0x500 0x0 0x40>;
|
||||
clocks = <&clkc_audio AUD_CLKID_TDMOUT_A>,
|
||||
<&clkc_audio AUD_CLKID_TDMOUT_A_SCLK>,
|
||||
<&clkc_audio AUD_CLKID_TDMOUT_A_SCLK_SEL>,
|
||||
<&clkc_audio AUD_CLKID_TDMOUT_A_LRCLK>,
|
||||
<&clkc_audio AUD_CLKID_TDMOUT_A_LRCLK>;
|
||||
clock-names = "pclk", "sclk", "sclk_sel",
|
||||
"lrclk", "lrclk_sel";
|
||||
};
|
@ -0,0 +1,22 @@
|
||||
* Amlogic Audio TDM Interfaces
|
||||
|
||||
Required properties:
|
||||
- compatible: 'amlogic,axg-tdm-iface'
|
||||
- clocks: list of clock phandle, one for each entry clock-names.
|
||||
- clock-names: should contain the following:
|
||||
* "sclk" : bit clock.
|
||||
* "lrclk": sample clock
|
||||
* "mclk" : master clock
|
||||
-> optional if the interface is in clock slave mode.
|
||||
- #sound-dai-cells: must be 0.
|
||||
|
||||
Example of TDM_A on the A113 SoC:
|
||||
|
||||
tdmif_a: audio-controller@0 {
|
||||
compatible = "amlogic,axg-tdm-iface";
|
||||
#sound-dai-cells = <0>;
|
||||
clocks = <&clkc_audio AUD_CLKID_MST_A_MCLK>,
|
||||
<&clkc_audio AUD_CLKID_MST_A_SCLK>,
|
||||
<&clkc_audio AUD_CLKID_MST_A_LRCLK>;
|
||||
clock-names = "mclk", "sclk", "lrclk";
|
||||
};
|
@ -15,7 +15,6 @@ Required properties:
|
||||
- clock-names: Should be one of each entry matching the clocks phandles list:
|
||||
- "pclk" (peripheral clock) Required.
|
||||
- "gclk" (generated clock) Optional (1).
|
||||
- "aclk" (Audio PLL clock) Optional (1).
|
||||
- "muxclk" (I2S mux clock) Optional (1).
|
||||
|
||||
Optional properties:
|
||||
@ -23,9 +22,9 @@ Optional properties:
|
||||
- princtrl-names: Should contain only one value - "default".
|
||||
|
||||
|
||||
(1) : Only the peripheral clock is required. The generated clock, the Audio
|
||||
PLL clock adn the I2S mux clock are optional and should only be set
|
||||
together, when Master Mode is required.
|
||||
(1) : Only the peripheral clock is required. The generated clock and the I2S
|
||||
mux clock are optional and should only be set together, when Master Mode
|
||||
is required.
|
||||
|
||||
Example:
|
||||
|
||||
@ -40,8 +39,8 @@ Example:
|
||||
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) |
|
||||
AT91_XDMAC_DT_PERID(32))>;
|
||||
dma-names = "tx", "rx";
|
||||
clocks = <&i2s0_clk>, <&i2s0_gclk>, <&audio_pll_pmc>, <&i2s0muxck>;
|
||||
clock-names = "pclk", "gclk", "aclk", "muxclk";
|
||||
clocks = <&i2s0_clk>, <&i2s0_gclk>, <&i2s0muxck>;
|
||||
clock-names = "pclk", "gclk", "muxclk";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2s0_default>;
|
||||
};
|
||||
|
@ -18,6 +18,8 @@ Below are same as Simple-Card.
|
||||
- bitclock-inversion
|
||||
- frame-inversion
|
||||
- mclk-fs
|
||||
- hp-det-gpio
|
||||
- mic-det-gpio
|
||||
- dai-tdm-slot-num
|
||||
- dai-tdm-slot-width
|
||||
- clocks / system-clock-frequency
|
||||
|
@ -1,12 +0,0 @@
|
||||
DIO2125 Audio Driver
|
||||
|
||||
Required properties:
|
||||
- compatible : "dioo,dio2125"
|
||||
- enable-gpios : the gpio connected to the enable pin of the dio2125
|
||||
|
||||
Example:
|
||||
|
||||
amp: analog-amplifier {
|
||||
compatible = "dioo,dio2125";
|
||||
enable-gpios = <&gpio GPIOH_3 0>;
|
||||
};
|
@ -1,10 +1,15 @@
|
||||
ES7134 i2s DA converter
|
||||
|
||||
Required properties:
|
||||
- compatible : "everest,es7134" or "everest,es7144"
|
||||
- compatible : "everest,es7134" or
|
||||
"everest,es7144" or
|
||||
"everest,es7154"
|
||||
- VDD-supply : regulator phandle for the VDD supply
|
||||
- PVDD-supply: regulator phandle for the PVDD supply for the es7154
|
||||
|
||||
Example:
|
||||
|
||||
i2s_codec: external-codec {
|
||||
compatible = "everest,es7134";
|
||||
VDD-supply = <&vcc_5v>;
|
||||
};
|
||||
|
28
Documentation/devicetree/bindings/sound/everest,es7241.txt
Normal file
28
Documentation/devicetree/bindings/sound/everest,es7241.txt
Normal file
@ -0,0 +1,28 @@
|
||||
ES7241 i2s AD converter
|
||||
|
||||
Required properties:
|
||||
- compatible : "everest,es7241"
|
||||
- VDDP-supply: regulator phandle for the VDDA supply
|
||||
- VDDA-supply: regulator phandle for the VDDP supply
|
||||
- VDDD-supply: regulator phandle for the VDDD supply
|
||||
|
||||
Optional properties:
|
||||
- reset-gpios: gpio connected to the reset pin
|
||||
- m0-gpios : gpio connected to the m0 pin
|
||||
- m1-gpios : gpio connected to the m1 pin
|
||||
- everest,sdout-pull-down:
|
||||
Format used by the serial interface is controlled by pulling
|
||||
the sdout. If the sdout is pulled down, leftj format is used.
|
||||
If this property is not provided, sdout is assumed to pulled
|
||||
up and i2s format is used
|
||||
|
||||
Example:
|
||||
|
||||
linein: audio-codec@2 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "everest,es7241";
|
||||
VDDA-supply = <&vcc_3v3>;
|
||||
VDDP-supply = <&vcc_3v3>;
|
||||
VDDD-supply = <&vcc_3v3>;
|
||||
reset-gpios = <&gpio GPIOH_42>;
|
||||
};
|
@ -0,0 +1,27 @@
|
||||
Marvell PXA2xx audio complex
|
||||
|
||||
This descriptions matches the AC97 controller found in pxa2xx and pxa3xx series.
|
||||
|
||||
Required properties:
|
||||
- compatible: should be one of the following:
|
||||
"marvell,pxa250-ac97"
|
||||
"marvell,pxa270-ac97"
|
||||
"marvell,pxa300-ac97"
|
||||
- reg: device MMIO address space
|
||||
- interrupts: single interrupt generated by AC97 IP
|
||||
- clocks: input clock of the AC97 IP, refer to clock-bindings.txt
|
||||
|
||||
Optional properties:
|
||||
- pinctrl-names, pinctrl-0: refer to pinctrl-bindings.txt
|
||||
- reset-gpios: gpio used for AC97 reset, refer to gpio.txt
|
||||
|
||||
Example:
|
||||
ac97: sound@40500000 {
|
||||
compatible = "marvell,pxa250-ac97";
|
||||
reg = < 0x40500000 0x1000 >;
|
||||
interrupts = <14>;
|
||||
reset-gpios = <&gpio 113 GPIO_ACTIVE_HIGH>;
|
||||
#sound-dai-cells = <1>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = < &pmux_ac97_default >;
|
||||
};
|
@ -5,6 +5,14 @@ Required properties:
|
||||
compatible Must be "mrvl,pxa-ssp-dai"
|
||||
port A phandle reference to a PXA ssp upstream device
|
||||
|
||||
Optional properties:
|
||||
|
||||
clock-names
|
||||
clocks Through "clock-names" and "clocks", external clocks
|
||||
can be configured. If a clock names "extclk" exists,
|
||||
it will be set to the mclk rate of the audio stream
|
||||
and be used as clock provider of the DAI.
|
||||
|
||||
Example:
|
||||
|
||||
/* upstream device */
|
||||
|
@ -1,15 +0,0 @@
|
||||
DT bindings for ARM PXA2xx PCM platform driver
|
||||
|
||||
This is just a dummy driver that registers the PXA ASoC platform driver.
|
||||
It does not have any resources assigned.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible 'mrvl,pxa-pcm-audio'
|
||||
|
||||
Example:
|
||||
|
||||
pxa_pcm_audio: snd_soc_pxa_audio {
|
||||
compatible = "mrvl,pxa-pcm-audio";
|
||||
};
|
||||
|
24
Documentation/devicetree/bindings/sound/name-prefix.txt
Normal file
24
Documentation/devicetree/bindings/sound/name-prefix.txt
Normal file
@ -0,0 +1,24 @@
|
||||
Name prefix:
|
||||
|
||||
Card implementing the routing property define the connection between
|
||||
audio components as list of string pair. Component using the same
|
||||
sink/source names may use the name prefix property to prepend the
|
||||
name of their sinks/sources with the provided string.
|
||||
|
||||
Optional name prefix property:
|
||||
- sound-name-prefix : string using as prefix for the sink/source names of
|
||||
the component.
|
||||
|
||||
Example: Two instances of the same component.
|
||||
|
||||
amp0: analog-amplifier@0 {
|
||||
compatible = "simple-audio-amplifier";
|
||||
enable-gpios = <&gpio GPIOH_3 0>;
|
||||
sound-name-prefix = "FRONT";
|
||||
};
|
||||
|
||||
amp1: analog-amplifier@1 {
|
||||
compatible = "simple-audio-amplifier";
|
||||
enable-gpios = <&gpio GPIOH_4 0>;
|
||||
sound-name-prefix = "BACK";
|
||||
};
|
@ -7,7 +7,7 @@ This binding describes the APQ8096 sound card, which uses qdsp for audio.
|
||||
Value type: <stringlist>
|
||||
Definition: must be "qcom,apq8096-sndcard"
|
||||
|
||||
- qcom,audio-routing:
|
||||
- audio-routing:
|
||||
Usage: Optional
|
||||
Value type: <stringlist>
|
||||
Definition: A list of the connections between audio components.
|
||||
@ -49,6 +49,12 @@ This binding describes the APQ8096 sound card, which uses qdsp for audio.
|
||||
"DMIC1"
|
||||
"DMIC2"
|
||||
"DMIC3"
|
||||
|
||||
- model:
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: The user-visible name of this sound card.
|
||||
|
||||
= dailinks
|
||||
Each subnode of sndcard represents either a dailink, and subnodes of each
|
||||
dailinks would be cpu/codec/platform dais.
|
||||
@ -79,11 +85,16 @@ dailinks would be cpu/codec/platform dais.
|
||||
Value type: <phandle with arguments>
|
||||
Definition: dai phandle/s and port of CPU/CODEC/PLATFORM node.
|
||||
|
||||
Obsolete:
|
||||
qcom,model: String for soundcard name (Use model instead)
|
||||
qcom,audio-routing: A list of the connections between audio components.
|
||||
(Use audio-routing instead)
|
||||
|
||||
Example:
|
||||
|
||||
audio {
|
||||
compatible = "qcom,apq8096-sndcard";
|
||||
qcom,model = "DB820c";
|
||||
model = "DB820c";
|
||||
|
||||
mm1-dai-link {
|
||||
link-name = "MultiMedia1";
|
||||
|
@ -18,6 +18,11 @@ used by the apr service device.
|
||||
= ADM routing
|
||||
"routing" subnode of the ADM node represents adm routing specific configuration
|
||||
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: must be "qcom,q6adm-routing".
|
||||
|
||||
- #sound-dai-cells
|
||||
Usage: required
|
||||
Value type: <u32>
|
||||
@ -28,6 +33,7 @@ q6adm@8 {
|
||||
compatible = "qcom,q6adm";
|
||||
reg = <APR_SVC_ADM>;
|
||||
q6routing: routing {
|
||||
compatible = "qcom,q6adm-routing";
|
||||
#sound-dai-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
@ -17,6 +17,11 @@ used by all apr services. Must contain the following properties.
|
||||
subnode of "dais" representing board specific dai setup.
|
||||
"dais" node should have following properties followed by dai children.
|
||||
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: must be "qcom,q6afe-dais"
|
||||
|
||||
- #sound-dai-cells
|
||||
Usage: required
|
||||
Value type: <u32>
|
||||
@ -100,6 +105,7 @@ q6afe@4 {
|
||||
reg = <APR_SVC_AFE>;
|
||||
|
||||
dais {
|
||||
compatible = "qcom,q6afe-dais";
|
||||
#sound-dai-cells = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
@ -17,6 +17,11 @@ used by the apr service device.
|
||||
= ASM DAIs (Digial Audio Interface)
|
||||
"dais" subnode of the ASM node represents dai specific configuration
|
||||
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: must be "qcom,q6asm-dais".
|
||||
|
||||
- #sound-dai-cells
|
||||
Usage: required
|
||||
Value type: <u32>
|
||||
@ -28,6 +33,7 @@ q6asm@7 {
|
||||
compatible = "qcom,q6asm";
|
||||
reg = <APR_SVC_ASM>;
|
||||
q6asmdai: dais {
|
||||
compatible = "qcom,q6asm-dais";
|
||||
#sound-dai-cells = <1>;
|
||||
};
|
||||
};
|
||||
|
80
Documentation/devicetree/bindings/sound/qcom,sdm845.txt
Normal file
80
Documentation/devicetree/bindings/sound/qcom,sdm845.txt
Normal file
@ -0,0 +1,80 @@
|
||||
* Qualcomm Technologies Inc. SDM845 ASoC sound card driver
|
||||
|
||||
This binding describes the SDM845 sound card, which uses qdsp for audio.
|
||||
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: must be "qcom,sdm845-sndcard"
|
||||
|
||||
- audio-routing:
|
||||
Usage: Optional
|
||||
Value type: <stringlist>
|
||||
Definition: 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, MicBias
|
||||
of codec and the jacks on the board.
|
||||
|
||||
- model:
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: The user-visible name of this sound card.
|
||||
|
||||
= dailinks
|
||||
Each subnode of sndcard represents either a dailink, and subnodes of each
|
||||
dailinks would be cpu/codec/platform dais.
|
||||
|
||||
- link-name:
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: User friendly name for dai link
|
||||
|
||||
= CPU, PLATFORM, CODEC dais subnodes
|
||||
- cpu:
|
||||
Usage: required
|
||||
Value type: <subnode>
|
||||
Definition: cpu dai sub-node
|
||||
|
||||
- codec:
|
||||
Usage: required
|
||||
Value type: <subnode>
|
||||
Definition: codec dai sub-node
|
||||
|
||||
- platform:
|
||||
Usage: Optional
|
||||
Value type: <subnode>
|
||||
Definition: platform dai sub-node
|
||||
|
||||
- sound-dai:
|
||||
Usage: required
|
||||
Value type: <phandle>
|
||||
Definition: dai phandle/s and port of CPU/CODEC/PLATFORM node.
|
||||
|
||||
Example:
|
||||
|
||||
audio {
|
||||
compatible = "qcom,sdm845-sndcard";
|
||||
model = "sdm845-snd-card";
|
||||
pinctrl-names = "default", "sleep";
|
||||
pinctrl-0 = <&pri_mi2s_active &pri_mi2s_ws_active>;
|
||||
pinctrl-1 = <&pri_mi2s_sleep &pri_mi2s_ws_sleep>;
|
||||
|
||||
mm1-dai-link {
|
||||
link-name = "MultiMedia1";
|
||||
cpu {
|
||||
sound-dai = <&q6asmdai MSM_FRONTEND_DAI_MULTIMEDIA1>;
|
||||
};
|
||||
};
|
||||
|
||||
pri-mi2s-dai-link {
|
||||
link-name = "PRI MI2S Playback";
|
||||
cpu {
|
||||
sound-dai = <&q6afedai PRIMARY_MI2S_RX>;
|
||||
};
|
||||
|
||||
platform {
|
||||
sound-dai = <&q6routing>;
|
||||
};
|
||||
};
|
||||
};
|
123
Documentation/devicetree/bindings/sound/qcom,wcd9335.txt
Normal file
123
Documentation/devicetree/bindings/sound/qcom,wcd9335.txt
Normal file
@ -0,0 +1,123 @@
|
||||
QCOM WCD9335 Codec
|
||||
|
||||
Qualcomm WCD9335 Codec is a standalone Hi-Fi audio codec IC, supports
|
||||
Qualcomm Technologies, Inc. (QTI) multimedia solutions, including
|
||||
the MSM8996, MSM8976, and MSM8956 chipsets. It has in-built
|
||||
Soundwire controller, interrupt mux. It supports both I2S/I2C and
|
||||
SLIMbus audio interfaces.
|
||||
|
||||
Required properties with SLIMbus Interface:
|
||||
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: For SLIMbus interface it should be "slimMID,PID",
|
||||
textual representation of Manufacturer ID, Product Code,
|
||||
shall be in lower case hexadecimal with leading zeroes
|
||||
suppressed. Refer to slimbus/bus.txt for details.
|
||||
Should be:
|
||||
"slim217,1a0" for MSM8996 and APQ8096 SoCs with SLIMbus.
|
||||
|
||||
- reg
|
||||
Usage: required
|
||||
Value type: <u32 u32>
|
||||
Definition: Should be ('Device index', 'Instance ID')
|
||||
|
||||
- interrupts
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: Interrupts via WCD INTR1 and INTR2 pins
|
||||
|
||||
- interrupt-names:
|
||||
Usage: required
|
||||
Value type: <String array>
|
||||
Definition: Interrupt names of WCD INTR1 and INTR2
|
||||
Should be: "intr1", "intr2"
|
||||
|
||||
- reset-gpio:
|
||||
Usage: required
|
||||
Value type: <String Array>
|
||||
Definition: Reset gpio line
|
||||
|
||||
- qcom,ifd:
|
||||
Usage: required
|
||||
Value type: <phandle>
|
||||
Definition: SLIM interface device
|
||||
|
||||
- clocks:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: See clock-bindings.txt section "consumers". List of
|
||||
three clock specifiers for mclk, mclk2 and slimbus clock.
|
||||
|
||||
- clock-names:
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: Must contain "mclk", "mclk2" and "slimbus" strings.
|
||||
|
||||
- vdd-buck-supply:
|
||||
Usage: required
|
||||
Value type: <phandle>
|
||||
Definition: Should contain a reference to the 1.8V buck supply
|
||||
|
||||
- vdd-buck-sido-supply:
|
||||
Usage: required
|
||||
Value type: <phandle>
|
||||
Definition: Should contain a reference to the 1.8V SIDO buck supply
|
||||
|
||||
- vdd-rx-supply:
|
||||
Usage: required
|
||||
Value type: <phandle>
|
||||
Definition: Should contain a reference to the 1.8V rx supply
|
||||
|
||||
- vdd-tx-supply:
|
||||
Usage: required
|
||||
Value type: <phandle>
|
||||
Definition: Should contain a reference to the 1.8V tx supply
|
||||
|
||||
- vdd-vbat-supply:
|
||||
Usage: Optional
|
||||
Value type: <phandle>
|
||||
Definition: Should contain a reference to the vbat supply
|
||||
|
||||
- vdd-micbias-supply:
|
||||
Usage: required
|
||||
Value type: <phandle>
|
||||
Definition: Should contain a reference to the micbias supply
|
||||
|
||||
- vdd-io-supply:
|
||||
Usage: required
|
||||
Value type: <phandle>
|
||||
Definition: Should contain a reference to the 1.8V io supply
|
||||
|
||||
- interrupt-controller:
|
||||
Usage: required
|
||||
Definition: Indicating that this is a interrupt controller
|
||||
|
||||
- #interrupt-cells:
|
||||
Usage: required
|
||||
Value type: <int>
|
||||
Definition: should be 1
|
||||
|
||||
#sound-dai-cells
|
||||
Usage: required
|
||||
Value type: <u32>
|
||||
Definition: Must be 1
|
||||
|
||||
codec@1{
|
||||
compatible = "slim217,1a0";
|
||||
reg = <1 0>;
|
||||
interrupts = <&msmgpio 54 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "intr2"
|
||||
reset-gpio = <&msmgpio 64 0>;
|
||||
qcom,ifd = <&wc9335_ifd>;
|
||||
clock-names = "mclk", "native";
|
||||
clocks = <&rpmcc RPM_SMD_DIV_CLK1>,
|
||||
<&rpmcc RPM_SMD_BB_CLK1>;
|
||||
vdd-buck-supply = <&pm8994_s4>;
|
||||
vdd-rx-supply = <&pm8994_s4>;
|
||||
vdd-buck-sido-supply = <&pm8994_s4>;
|
||||
vdd-tx-supply = <&pm8994_s4>;
|
||||
vdd-io-supply = <&pm8994_s4>;
|
||||
#sound-dai-cells = <1>;
|
||||
}
|
@ -352,6 +352,7 @@ Required properties:
|
||||
- "renesas,rcar_sound-r8a7794" (R-Car E2)
|
||||
- "renesas,rcar_sound-r8a7795" (R-Car H3)
|
||||
- "renesas,rcar_sound-r8a7796" (R-Car M3-W)
|
||||
- "renesas,rcar_sound-r8a77965" (R-Car M3-N)
|
||||
- reg : Should contain the register physical address.
|
||||
required register is
|
||||
SRU/ADG/SSI if generation1
|
||||
|
@ -7,6 +7,7 @@ Required properties:
|
||||
|
||||
- compatible: should be one of the following:
|
||||
- "rockchip,rk3066-i2s": for rk3066
|
||||
- "rockchip,px30-i2s", "rockchip,rk3066-i2s": for px30
|
||||
- "rockchip,rk3036-i2s", "rockchip,rk3066-i2s": for rk3036
|
||||
- "rockchip,rk3188-i2s", "rockchip,rk3066-i2s": for rk3188
|
||||
- "rockchip,rk3228-i2s", "rockchip,rk3066-i2s": for rk3228
|
||||
|
50
Documentation/devicetree/bindings/sound/rt5682.txt
Normal file
50
Documentation/devicetree/bindings/sound/rt5682.txt
Normal file
@ -0,0 +1,50 @@
|
||||
RT5682 audio CODEC
|
||||
|
||||
This device supports I2C only.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : "realtek,rt5682" or "realtek,rt5682i"
|
||||
|
||||
- reg : The I2C address of the device.
|
||||
|
||||
Optional properties:
|
||||
|
||||
- interrupts : The CODEC's interrupt output.
|
||||
|
||||
- realtek,dmic1-data-pin
|
||||
0: dmic1 is not used
|
||||
1: using GPIO2 pin as dmic1 data pin
|
||||
2: using GPIO5 pin as dmic1 data pin
|
||||
|
||||
- realtek,dmic1-clk-pin
|
||||
0: using GPIO1 pin as dmic1 clock pin
|
||||
1: using GPIO3 pin as dmic1 clock pin
|
||||
|
||||
- realtek,jd-src
|
||||
0: No JD is used
|
||||
1: using JD1 as JD source
|
||||
|
||||
- realtek,ldo1-en-gpios : The GPIO that controls the CODEC's LDO1_EN pin.
|
||||
|
||||
Pins on the device (for linking into audio routes) for RT5682:
|
||||
|
||||
* DMIC L1
|
||||
* DMIC R1
|
||||
* IN1P
|
||||
* HPOL
|
||||
* HPOR
|
||||
|
||||
Example:
|
||||
|
||||
rt5682 {
|
||||
compatible = "realtek,rt5682i";
|
||||
reg = <0x1a>;
|
||||
interrupt-parent = <&gpio>;
|
||||
interrupts = <TEGRA_GPIO(U, 6) GPIO_ACTIVE_HIGH>;
|
||||
realtek,ldo1-en-gpios =
|
||||
<&gpio TEGRA_GPIO(R, 2) GPIO_ACTIVE_HIGH>;
|
||||
realtek,dmic1-data-pin = <1>;
|
||||
realtek,dmic1-clk-pin = <1>;
|
||||
realtek,jd-src = <1>;
|
||||
};
|
@ -17,7 +17,7 @@ Optional properties:
|
||||
|
||||
- VDDD-supply : the regulator provider of VDDD
|
||||
|
||||
- micbias-resistor-k-ohms : the bias resistor to be used in kOmhs
|
||||
- micbias-resistor-k-ohms : the bias resistor to be used in kOhms
|
||||
The resistor can take values of 2k, 4k or 8k.
|
||||
If set to 0 it will be off.
|
||||
If this node is not mentioned or if the value is unknown, then
|
||||
|
12
Documentation/devicetree/bindings/sound/simple-amplifier.txt
Normal file
12
Documentation/devicetree/bindings/sound/simple-amplifier.txt
Normal file
@ -0,0 +1,12 @@
|
||||
Simple Amplifier Audio Driver
|
||||
|
||||
Required properties:
|
||||
- compatible : "dioo,dio2125" or "simple-audio-amplifier"
|
||||
- enable-gpios : the gpio connected to the enable pin of the simple amplifier
|
||||
|
||||
Example:
|
||||
|
||||
amp: analog-amplifier {
|
||||
compatible = "simple-audio-amplifier";
|
||||
enable-gpios = <&gpio GPIOH_3 0>;
|
||||
};
|
@ -7,6 +7,7 @@ powerdown (optional).
|
||||
Required properties:
|
||||
|
||||
- compatible: should be one of the following:
|
||||
- "ti,tas5707"
|
||||
- "ti,tas5711",
|
||||
- "ti,tas5717",
|
||||
- "ti,tas5719",
|
||||
|
@ -1568,7 +1568,7 @@ joystick_io
|
||||
The driver requires firmware files ``turtlebeach/msndinit.bin`` and
|
||||
``turtlebeach/msndperm.bin`` in the proper firmware directory.
|
||||
|
||||
See Documentation/sound/oss/MultiSound for important information
|
||||
See Documentation/sound/cards/multisound.sh for important information
|
||||
about this driver. Note that it has been discontinued, but the
|
||||
Voyetra Turtle Beach knowledge base entry for it is still available
|
||||
at
|
||||
|
1139
Documentation/sound/cards/multisound.sh
Executable file
1139
Documentation/sound/cards/multisound.sh
Executable file
File diff suppressed because it is too large
Load Diff
@ -34,6 +34,22 @@ ALC262
|
||||
======
|
||||
inv-dmic
|
||||
Inverted internal mic workaround
|
||||
fsc-h270
|
||||
Fixups for Fujitsu-Siemens Celsius H270
|
||||
fsc-s7110
|
||||
Fixups for Fujitsu-Siemens Lifebook S7110
|
||||
hp-z200
|
||||
Fixups for HP Z200
|
||||
tyan
|
||||
Fixups for Tyan Thunder n6650W
|
||||
lenovo-3000
|
||||
Fixups for Lenovo 3000
|
||||
benq
|
||||
Fixups for Benq ED8
|
||||
benq-t31
|
||||
Fixups for Benq T31
|
||||
bayleybay
|
||||
Fixups for Intel BayleyBay
|
||||
|
||||
ALC267/268
|
||||
==========
|
||||
@ -41,6 +57,8 @@ inv-dmic
|
||||
Inverted internal mic workaround
|
||||
hp-eapd
|
||||
Disable HP EAPD on NID 0x15
|
||||
spdif
|
||||
Enable SPDIF output on NID 0x1e
|
||||
|
||||
ALC22x/23x/25x/269/27x/28x/29x (and vendor-specific ALC3xxx models)
|
||||
===================================================================
|
||||
@ -70,6 +88,10 @@ 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
|
||||
dell-headset3
|
||||
Headset jack (without mic-in), and also dock I/O, variant 3
|
||||
dell-headset4
|
||||
Headset jack (without mic-in), and also dock I/O, variant 4
|
||||
alc283-dac-wcaps
|
||||
Fixups for Chromebook with ALC283
|
||||
alc283-sense-combo
|
||||
@ -80,15 +102,173 @@ tpt440
|
||||
Lenovo Thinkpad T440s setup
|
||||
tpt460
|
||||
Lenovo Thinkpad T460/560 setup
|
||||
tpt470-dock
|
||||
Lenovo Thinkpad T470 dock setup
|
||||
dual-codecs
|
||||
Lenovo laptops with dual codecs
|
||||
alc700-ref
|
||||
Intel reference board with ALC700 codec
|
||||
vaio
|
||||
Pin fixups for Sony VAIO laptops
|
||||
dell-m101z
|
||||
COEF setup for Dell M101z
|
||||
asus-g73jw
|
||||
Subwoofer pin fixup for ASUS G73JW
|
||||
lenovo-eapd
|
||||
Inversed EAPD setup for Lenovo laptops
|
||||
sony-hweq
|
||||
H/W EQ COEF setup for Sony laptops
|
||||
pcm44k
|
||||
Fixed PCM 44kHz constraints (for buggy devices)
|
||||
lifebook
|
||||
Dock pin fixups for Fujitsu Lifebook
|
||||
lifebook-extmic
|
||||
Headset mic fixup for Fujitsu Lifebook
|
||||
lifebook-hp-pin
|
||||
Headphone pin fixup for Fujitsu Lifebook
|
||||
lifebook-u7x7
|
||||
Lifebook U7x7 fixups
|
||||
alc269vb-amic
|
||||
ALC269VB analog mic pin fixups
|
||||
alc269vb-dmic
|
||||
ALC269VB digital mic pin fixups
|
||||
hp-mute-led-mic1
|
||||
Mute LED via Mic1 pin on HP
|
||||
hp-mute-led-mic2
|
||||
Mute LED via Mic2 pin on HP
|
||||
hp-mute-led-mic3
|
||||
Mute LED via Mic3 pin on HP
|
||||
hp-gpio-mic1
|
||||
GPIO + Mic1 pin LED on HP
|
||||
hp-line1-mic1
|
||||
Mute LED via Line1 + Mic1 pins on HP
|
||||
noshutup
|
||||
Skip shutup callback
|
||||
sony-nomic
|
||||
Headset mic fixup for Sony laptops
|
||||
aspire-headset-mic
|
||||
Headset pin fixup for Acer Aspire
|
||||
asus-x101
|
||||
ASUS X101 fixups
|
||||
acer-ao7xx
|
||||
Acer AO7xx fixups
|
||||
acer-aspire-e1
|
||||
Acer Aspire E1 fixups
|
||||
acer-ac700
|
||||
Acer AC700 fixups
|
||||
limit-mic-boost
|
||||
Limit internal mic boost on Lenovo machines
|
||||
asus-zenbook
|
||||
ASUS Zenbook fixups
|
||||
asus-zenbook-ux31a
|
||||
ASUS Zenbook UX31A fixups
|
||||
ordissimo
|
||||
Ordissimo EVE2 (or Malata PC-B1303) fixups
|
||||
asus-tx300
|
||||
ASUS TX300 fixups
|
||||
alc283-int-mic
|
||||
ALC283 COEF setup for Lenovo machines
|
||||
mono-speakers
|
||||
Subwoofer and headset fixupes for Dell Inspiron
|
||||
alc290-subwoofer
|
||||
Subwoofer fixups for Dell Vostro
|
||||
thinkpad
|
||||
Binding with thinkpad_acpi driver for Lenovo machines
|
||||
dmic-thinkpad
|
||||
thinkpad_acpi binding + digital mic support
|
||||
alc255-acer
|
||||
ALC255 fixups on Acer machines
|
||||
alc255-asus
|
||||
ALC255 fixups on ASUS machines
|
||||
alc255-dell1
|
||||
ALC255 fixups on Dell machines
|
||||
alc255-dell2
|
||||
ALC255 fixups on Dell machines, variant 2
|
||||
alc293-dell1
|
||||
ALC293 fixups on Dell machines
|
||||
alc283-headset
|
||||
Headset pin fixups on ALC283
|
||||
aspire-v5
|
||||
Acer Aspire V5 fixups
|
||||
hp-gpio4
|
||||
GPIO and Mic1 pin mute LED fixups for HP
|
||||
hp-gpio-led
|
||||
GPIO mute LEDs on HP
|
||||
hp-gpio2-hotkey
|
||||
GPIO mute LED with hot key handling on HP
|
||||
hp-dock-pins
|
||||
GPIO mute LEDs and dock support on HP
|
||||
hp-dock-gpio-mic
|
||||
GPIO, Mic mute LED and dock support on HP
|
||||
hp-9480m
|
||||
HP 9480m fixups
|
||||
alc288-dell1
|
||||
ALC288 fixups on Dell machines
|
||||
alc288-dell-xps13
|
||||
ALC288 fixups on Dell XPS13
|
||||
dell-e7x
|
||||
Dell E7x fixups
|
||||
alc293-dell
|
||||
ALC293 fixups on Dell machines
|
||||
alc298-dell1
|
||||
ALC298 fixups on Dell machines
|
||||
alc298-dell-aio
|
||||
ALC298 fixups on Dell AIO machines
|
||||
alc275-dell-xps
|
||||
ALC275 fixups on Dell XPS models
|
||||
alc256-dell-xps13
|
||||
ALC256 fixups on Dell XPS13
|
||||
lenovo-spk-noise
|
||||
Workaround for speaker noise on Lenovo machines
|
||||
lenovo-hotkey
|
||||
Hot-key support via Mic2 pin on Lenovo machines
|
||||
dell-spk-noise
|
||||
Workaround for speaker noise on Dell machines
|
||||
alc255-dell1
|
||||
ALC255 fixups on Dell machines
|
||||
alc295-disable-dac3
|
||||
Disable DAC3 routing on ALC295
|
||||
alc280-hp-headset
|
||||
HP Elitebook fixups
|
||||
alc221-hp-mic
|
||||
Front mic pin fixup on HP machines
|
||||
alc298-spk-volume
|
||||
Speaker pin routing workaround on ALC298
|
||||
dell-inspiron-7559
|
||||
Dell Inspiron 7559 fixups
|
||||
ativ-book
|
||||
Samsung Ativ book 8 fixups
|
||||
alc221-hp-mic
|
||||
ALC221 headset fixups on HP machines
|
||||
alc256-asus-mic
|
||||
ALC256 fixups on ASUS machines
|
||||
alc256-asus-aio
|
||||
ALC256 fixups on ASUS AIO machines
|
||||
alc233-eapd
|
||||
ALC233 fixups on ASUS machines
|
||||
alc294-lenovo-mic
|
||||
ALC294 Mic pin fixup for Lenovo AIO machines
|
||||
alc225-wyse
|
||||
Dell Wyse fixups
|
||||
alc274-dell-aio
|
||||
ALC274 fixups on Dell AIO machines
|
||||
alc255-dummy-lineout
|
||||
Dell Precision 3930 fixups
|
||||
alc255-dell-headset"},
|
||||
Dell Precision 3630 fixups
|
||||
alc295-hp-x360
|
||||
HP Spectre X360 fixups
|
||||
|
||||
ALC66x/67x/892
|
||||
==============
|
||||
aspire
|
||||
Subwoofer pin fixup for Aspire laptops
|
||||
ideapad
|
||||
Subwoofer pin fixup for Ideapad laptops
|
||||
mario
|
||||
Chromebook mario model fixup
|
||||
hp-rp5800
|
||||
Headphone pin fixup for HP RP5800
|
||||
asus-mode1
|
||||
ASUS
|
||||
asus-mode2
|
||||
@ -105,10 +285,40 @@ asus-mode7
|
||||
ASUS
|
||||
asus-mode8
|
||||
ASUS
|
||||
zotac-z68
|
||||
Front HP fixup for Zotac Z68
|
||||
inv-dmic
|
||||
Inverted internal mic workaround
|
||||
alc662-headset-multi
|
||||
Dell headset jack, which can also be used as mic-in (ALC662)
|
||||
dell-headset-multi
|
||||
Headset jack, which can also be used as mic-in
|
||||
alc662-headset
|
||||
Headset mode support on ALC662
|
||||
alc668-headset
|
||||
Headset mode support on ALC668
|
||||
bass16
|
||||
Bass speaker fixup on pin 0x16
|
||||
bass1a
|
||||
Bass speaker fixup on pin 0x1a
|
||||
automute
|
||||
Auto-mute fixups for ALC668
|
||||
dell-xps13
|
||||
Dell XPS13 fixups
|
||||
asus-nx50
|
||||
ASUS Nx50 fixups
|
||||
asus-nx51
|
||||
ASUS Nx51 fixups
|
||||
alc891-headset
|
||||
Headset mode support on ALC891
|
||||
alc891-headset-multi
|
||||
Dell headset jack, which can also be used as mic-in (ALC891)
|
||||
acer-veriton
|
||||
Acer Veriton speaker pin fixup
|
||||
asrock-mobo
|
||||
Fix invalid 0x15 / 0x16 pins
|
||||
usi-headset
|
||||
Headset support on USI machines
|
||||
dual-codecs
|
||||
Lenovo laptops with dual codecs
|
||||
|
||||
@ -116,20 +326,70 @@ ALC680
|
||||
======
|
||||
N/A
|
||||
|
||||
ALC88x/898/1150
|
||||
======================
|
||||
ALC88x/898/1150/1220
|
||||
====================
|
||||
abit-aw9d
|
||||
Pin fixups for Abit AW9D-MAX
|
||||
lenovo-y530
|
||||
Pin fixups for Lenovo Y530
|
||||
acer-aspire-7736
|
||||
Fixup for Acer Aspire 7736
|
||||
asus-w90v
|
||||
Pin fixup for ASUS W90V
|
||||
cd
|
||||
Enable audio CD pin NID 0x1c
|
||||
no-front-hp
|
||||
Disable front HP pin NID 0x1b
|
||||
vaio-tt
|
||||
Pin fixup for VAIO TT
|
||||
eee1601
|
||||
COEF setups for ASUS Eee 1601
|
||||
alc882-eapd
|
||||
Change EAPD COEF mode on ALC882
|
||||
alc883-eapd
|
||||
Change EAPD COEF mode on ALC883
|
||||
gpio1
|
||||
Enable GPIO1
|
||||
gpio2
|
||||
Enable GPIO2
|
||||
gpio3
|
||||
Enable GPIO3
|
||||
alc889-coef
|
||||
Setup ALC889 COEF
|
||||
asus-w2jc
|
||||
Fixups for ASUS W2JC
|
||||
acer-aspire-4930g
|
||||
Acer Aspire 4930G/5930G/6530G/6930G/7730G
|
||||
acer-aspire-8930g
|
||||
Acer Aspire 8330G/6935G
|
||||
acer-aspire
|
||||
Acer Aspire others
|
||||
macpro-gpio
|
||||
GPIO setup for Mac Pro
|
||||
dac-route
|
||||
Workaround for DAC routing on Acer Aspire
|
||||
mbp-vref
|
||||
Vref setup for Macbook Pro
|
||||
imac91-vref
|
||||
Vref setup for iMac 9,1
|
||||
mba11-vref
|
||||
Vref setup for MacBook Air 1,1
|
||||
mba21-vref
|
||||
Vref setup for MacBook Air 2,1
|
||||
mp11-vref
|
||||
Vref setup for Mac Pro 1,1
|
||||
mp41-vref
|
||||
Vref setup for Mac Pro 4,1
|
||||
inv-dmic
|
||||
Inverted internal mic workaround
|
||||
no-primary-hp
|
||||
VAIO Z/VGC-LN51JGB workaround (for fixed speaker DAC)
|
||||
asus-bass
|
||||
Bass speaker setup for ASUS ET2700
|
||||
dual-codecs
|
||||
ALC1220 dual codecs for Gaming mobos
|
||||
clevo-p950
|
||||
Fixups for Clevo P950
|
||||
|
||||
ALC861/660
|
||||
==========
|
||||
|
@ -254,9 +254,7 @@ configuration.
|
||||
channels->min = channels->max = 2;
|
||||
|
||||
/* set DAI0 to 16 bit */
|
||||
snd_mask_set(¶ms->masks[SNDRV_PCM_HW_PARAM_FORMAT -
|
||||
SNDRV_PCM_HW_PARAM_FIRST_MASK],
|
||||
SNDRV_PCM_FORMAT_S16_LE);
|
||||
params_set_format(params, SNDRV_PCM_FORMAT_S16_LE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
15
MAINTAINERS
15
MAINTAINERS
@ -13585,6 +13585,13 @@ L: linux-block@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/block/skd*[ch]
|
||||
|
||||
STI AUDIO (ASoC) DRIVERS
|
||||
M: Arnaud Pouliquen <arnaud.pouliquen@st.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/sound/st,sti-asoc-card.txt
|
||||
F: sound/soc/sti/
|
||||
|
||||
STI CEC DRIVER
|
||||
M: Benjamin Gaignard <benjamin.gaignard@linaro.org>
|
||||
S: Maintained
|
||||
@ -13598,6 +13605,14 @@ T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/usb/stk1160/
|
||||
|
||||
STM32 AUDIO (ASoC) DRIVERS
|
||||
M: Olivier Moysan <olivier.moysan@st.com>
|
||||
M: Arnaud Pouliquen <arnaud.pouliquen@st.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/sound/st,stm32-*.txt
|
||||
F: sound/soc/stm/
|
||||
|
||||
STM32 TIMER/LPTIMER DRIVERS
|
||||
M: Fabrice Gasnier <fabrice.gasnier@st.com>
|
||||
S: Maintained
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/spi/pxa2xx_spi.h>
|
||||
#include <linux/platform_data/i2c-pxa.h>
|
||||
|
||||
@ -59,16 +60,6 @@ static struct resource pxamci_resources[] = {
|
||||
.end = IRQ_MMC,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = 21,
|
||||
.end = 21,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
[3] = {
|
||||
.start = 22,
|
||||
.end = 22,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
static u64 pxamci_dmamask = 0xffffffffUL;
|
||||
@ -406,16 +397,6 @@ static struct resource pxa_ir_resources[] = {
|
||||
.end = 0x40700023,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[5] = {
|
||||
.start = 17,
|
||||
.end = 17,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
[6] = {
|
||||
.start = 18,
|
||||
.end = 18,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device pxa_device_ficp = {
|
||||
@ -544,18 +525,6 @@ static struct resource pxa25x_resource_ssp[] = {
|
||||
.end = IRQ_SSP,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
/* DRCMR for RX */
|
||||
.start = 13,
|
||||
.end = 13,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
[3] = {
|
||||
/* DRCMR for TX */
|
||||
.start = 14,
|
||||
.end = 14,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device pxa25x_device_ssp = {
|
||||
@ -582,18 +551,6 @@ static struct resource pxa25x_resource_nssp[] = {
|
||||
.end = IRQ_NSSP,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
/* DRCMR for RX */
|
||||
.start = 15,
|
||||
.end = 15,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
[3] = {
|
||||
/* DRCMR for TX */
|
||||
.start = 16,
|
||||
.end = 16,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device pxa25x_device_nssp = {
|
||||
@ -620,18 +577,6 @@ static struct resource pxa25x_resource_assp[] = {
|
||||
.end = IRQ_ASSP,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
/* DRCMR for RX */
|
||||
.start = 23,
|
||||
.end = 23,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
[3] = {
|
||||
/* DRCMR for TX */
|
||||
.start = 24,
|
||||
.end = 24,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device pxa25x_device_assp = {
|
||||
@ -750,18 +695,6 @@ static struct resource pxa27x_resource_ssp1[] = {
|
||||
.end = IRQ_SSP,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
/* DRCMR for RX */
|
||||
.start = 13,
|
||||
.end = 13,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
[3] = {
|
||||
/* DRCMR for TX */
|
||||
.start = 14,
|
||||
.end = 14,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device pxa27x_device_ssp1 = {
|
||||
@ -788,18 +721,6 @@ static struct resource pxa27x_resource_ssp2[] = {
|
||||
.end = IRQ_SSP2,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
/* DRCMR for RX */
|
||||
.start = 15,
|
||||
.end = 15,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
[3] = {
|
||||
/* DRCMR for TX */
|
||||
.start = 16,
|
||||
.end = 16,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device pxa27x_device_ssp2 = {
|
||||
@ -826,18 +747,6 @@ static struct resource pxa27x_resource_ssp3[] = {
|
||||
.end = IRQ_SSP3,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
/* DRCMR for RX */
|
||||
.start = 66,
|
||||
.end = 66,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
[3] = {
|
||||
/* DRCMR for TX */
|
||||
.start = 67,
|
||||
.end = 67,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device pxa27x_device_ssp3 = {
|
||||
@ -894,16 +803,6 @@ static struct resource pxa3xx_resources_mci2[] = {
|
||||
.end = IRQ_MMC2,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = 93,
|
||||
.end = 93,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
[3] = {
|
||||
.start = 94,
|
||||
.end = 94,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device pxa3xx_device_mci2 = {
|
||||
@ -933,16 +832,6 @@ static struct resource pxa3xx_resources_mci3[] = {
|
||||
.end = IRQ_MMC3,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = 100,
|
||||
.end = 100,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
[3] = {
|
||||
.start = 101,
|
||||
.end = 101,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device pxa3xx_device_mci3 = {
|
||||
@ -1020,18 +909,6 @@ static struct resource pxa3xx_resources_nand[] = {
|
||||
.end = IRQ_NAND,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
/* DRCMR for Data DMA */
|
||||
.start = 97,
|
||||
.end = 97,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
[3] = {
|
||||
/* DRCMR for Command DMA */
|
||||
.start = 99,
|
||||
.end = 99,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
static u64 pxa3xx_nand_dma_mask = DMA_BIT_MASK(32);
|
||||
@ -1065,18 +942,6 @@ static struct resource pxa3xx_resource_ssp4[] = {
|
||||
.end = IRQ_SSP4,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
/* DRCMR for RX */
|
||||
.start = 2,
|
||||
.end = 2,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
[3] = {
|
||||
/* DRCMR for TX */
|
||||
.start = 3,
|
||||
.end = 3,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
@ -1202,11 +1067,6 @@ void __init pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_master *info)
|
||||
platform_device_add(pd);
|
||||
}
|
||||
|
||||
static struct mmp_dma_platdata pxa_dma_pdata = {
|
||||
.dma_channels = 0,
|
||||
.nb_requestors = 0,
|
||||
};
|
||||
|
||||
static struct resource pxa_dma_resource[] = {
|
||||
[0] = {
|
||||
.start = 0x40000000,
|
||||
@ -1233,9 +1093,7 @@ static struct platform_device pxa2xx_pxa_dma = {
|
||||
.resource = pxa_dma_resource,
|
||||
};
|
||||
|
||||
void __init pxa2xx_set_dmac_info(int nb_channels, int nb_requestors)
|
||||
void __init pxa2xx_set_dmac_info(struct mmp_dma_platdata *dma_pdata)
|
||||
{
|
||||
pxa_dma_pdata.dma_channels = nb_channels;
|
||||
pxa_dma_pdata.nb_requestors = nb_requestors;
|
||||
pxa_register_device(&pxa2xx_pxa_dma, &pxa_dma_pdata);
|
||||
pxa_register_device(&pxa2xx_pxa_dma, dma_pdata);
|
||||
}
|
||||
|
@ -1,4 +1,8 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#define PDMA_FILTER_PARAM(_prio, _requestor) (&(struct pxad_param) { \
|
||||
.prio = PXAD_PRIO_##_prio, .drcmr = _requestor })
|
||||
struct mmp_dma_platdata;
|
||||
|
||||
extern struct platform_device pxa_device_pmu;
|
||||
extern struct platform_device pxa_device_mci;
|
||||
extern struct platform_device pxa3xx_device_mci2;
|
||||
@ -55,7 +59,7 @@ extern struct platform_device pxa3xx_device_gpio;
|
||||
extern struct platform_device pxa93x_device_gpio;
|
||||
|
||||
void __init pxa_register_device(struct platform_device *dev, void *data);
|
||||
void __init pxa2xx_set_dmac_info(int nb_channels, int nb_requestors);
|
||||
void __init pxa2xx_set_dmac_info(struct mmp_dma_platdata *dma_pdata);
|
||||
|
||||
struct i2c_pxa_platform_data;
|
||||
extern void pxa_set_i2c_info(struct i2c_pxa_platform_data *info);
|
||||
|
@ -16,6 +16,8 @@
|
||||
* initialization stuff for PXA machines which can be overridden later if
|
||||
* need be.
|
||||
*/
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/dma/pxa-dma.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio-pxa.h>
|
||||
#include <linux/module.h>
|
||||
@ -26,6 +28,7 @@
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/platform_data/mmp_dma.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/suspend.h>
|
||||
@ -201,6 +204,39 @@ static struct platform_device *pxa25x_devices[] __initdata = {
|
||||
&pxa_device_asoc_platform,
|
||||
};
|
||||
|
||||
static const struct dma_slave_map pxa25x_slave_map[] = {
|
||||
/* PXA25x, PXA27x and PXA3xx common entries */
|
||||
{ "pxa2xx-ac97", "pcm_pcm_mic_mono", PDMA_FILTER_PARAM(LOWEST, 8) },
|
||||
{ "pxa2xx-ac97", "pcm_pcm_aux_mono_in", PDMA_FILTER_PARAM(LOWEST, 9) },
|
||||
{ "pxa2xx-ac97", "pcm_pcm_aux_mono_out",
|
||||
PDMA_FILTER_PARAM(LOWEST, 10) },
|
||||
{ "pxa2xx-ac97", "pcm_pcm_stereo_in", PDMA_FILTER_PARAM(LOWEST, 11) },
|
||||
{ "pxa2xx-ac97", "pcm_pcm_stereo_out", PDMA_FILTER_PARAM(LOWEST, 12) },
|
||||
{ "pxa-ssp-dai.1", "rx", PDMA_FILTER_PARAM(LOWEST, 13) },
|
||||
{ "pxa-ssp-dai.1", "tx", PDMA_FILTER_PARAM(LOWEST, 14) },
|
||||
{ "pxa-ssp-dai.2", "rx", PDMA_FILTER_PARAM(LOWEST, 15) },
|
||||
{ "pxa-ssp-dai.2", "tx", PDMA_FILTER_PARAM(LOWEST, 16) },
|
||||
{ "pxa2xx-ir", "rx", PDMA_FILTER_PARAM(LOWEST, 17) },
|
||||
{ "pxa2xx-ir", "tx", PDMA_FILTER_PARAM(LOWEST, 18) },
|
||||
{ "pxa2xx-mci.0", "rx", PDMA_FILTER_PARAM(LOWEST, 21) },
|
||||
{ "pxa2xx-mci.0", "tx", PDMA_FILTER_PARAM(LOWEST, 22) },
|
||||
|
||||
/* PXA25x specific map */
|
||||
{ "pxa25x-ssp.0", "rx", PDMA_FILTER_PARAM(LOWEST, 13) },
|
||||
{ "pxa25x-ssp.0", "tx", PDMA_FILTER_PARAM(LOWEST, 14) },
|
||||
{ "pxa25x-nssp.1", "rx", PDMA_FILTER_PARAM(LOWEST, 15) },
|
||||
{ "pxa25x-nssp.1", "tx", PDMA_FILTER_PARAM(LOWEST, 16) },
|
||||
{ "pxa25x-nssp.2", "rx", PDMA_FILTER_PARAM(LOWEST, 23) },
|
||||
{ "pxa25x-nssp.2", "tx", PDMA_FILTER_PARAM(LOWEST, 24) },
|
||||
};
|
||||
|
||||
static struct mmp_dma_platdata pxa25x_dma_pdata = {
|
||||
.dma_channels = 16,
|
||||
.nb_requestors = 40,
|
||||
.slave_map = pxa25x_slave_map,
|
||||
.slave_map_cnt = ARRAY_SIZE(pxa25x_slave_map),
|
||||
};
|
||||
|
||||
static int __init pxa25x_init(void)
|
||||
{
|
||||
int ret = 0;
|
||||
@ -215,7 +251,7 @@ static int __init pxa25x_init(void)
|
||||
register_syscore_ops(&pxa2xx_mfp_syscore_ops);
|
||||
|
||||
if (!of_have_populated_dt()) {
|
||||
pxa2xx_set_dmac_info(16, 40);
|
||||
pxa2xx_set_dmac_info(&pxa25x_dma_pdata);
|
||||
pxa_register_device(&pxa25x_device_gpio, &pxa25x_gpio_info);
|
||||
ret = platform_add_devices(pxa25x_devices,
|
||||
ARRAY_SIZE(pxa25x_devices));
|
||||
|
@ -11,6 +11,8 @@
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/dma/pxa-dma.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio-pxa.h>
|
||||
#include <linux/module.h>
|
||||
@ -23,6 +25,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/platform_data/i2c-pxa.h>
|
||||
#include <linux/platform_data/mmp_dma.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
#include <mach/hardware.h>
|
||||
@ -297,6 +300,40 @@ static struct platform_device *devices[] __initdata = {
|
||||
&pxa27x_device_pwm1,
|
||||
};
|
||||
|
||||
static const struct dma_slave_map pxa27x_slave_map[] = {
|
||||
/* PXA25x, PXA27x and PXA3xx common entries */
|
||||
{ "pxa2xx-ac97", "pcm_pcm_mic_mono", PDMA_FILTER_PARAM(LOWEST, 8) },
|
||||
{ "pxa2xx-ac97", "pcm_pcm_aux_mono_in", PDMA_FILTER_PARAM(LOWEST, 9) },
|
||||
{ "pxa2xx-ac97", "pcm_pcm_aux_mono_out",
|
||||
PDMA_FILTER_PARAM(LOWEST, 10) },
|
||||
{ "pxa2xx-ac97", "pcm_pcm_stereo_in", PDMA_FILTER_PARAM(LOWEST, 11) },
|
||||
{ "pxa2xx-ac97", "pcm_pcm_stereo_out", PDMA_FILTER_PARAM(LOWEST, 12) },
|
||||
{ "pxa-ssp-dai.0", "rx", PDMA_FILTER_PARAM(LOWEST, 13) },
|
||||
{ "pxa-ssp-dai.0", "tx", PDMA_FILTER_PARAM(LOWEST, 14) },
|
||||
{ "pxa-ssp-dai.1", "rx", PDMA_FILTER_PARAM(LOWEST, 15) },
|
||||
{ "pxa-ssp-dai.1", "tx", PDMA_FILTER_PARAM(LOWEST, 16) },
|
||||
{ "pxa2xx-ir", "rx", PDMA_FILTER_PARAM(LOWEST, 17) },
|
||||
{ "pxa2xx-ir", "tx", PDMA_FILTER_PARAM(LOWEST, 18) },
|
||||
{ "pxa2xx-mci.0", "rx", PDMA_FILTER_PARAM(LOWEST, 21) },
|
||||
{ "pxa2xx-mci.0", "tx", PDMA_FILTER_PARAM(LOWEST, 22) },
|
||||
{ "pxa-ssp-dai.2", "rx", PDMA_FILTER_PARAM(LOWEST, 66) },
|
||||
{ "pxa-ssp-dai.2", "tx", PDMA_FILTER_PARAM(LOWEST, 67) },
|
||||
|
||||
/* PXA27x specific map */
|
||||
{ "pxa2xx-i2s", "rx", PDMA_FILTER_PARAM(LOWEST, 2) },
|
||||
{ "pxa2xx-i2s", "tx", PDMA_FILTER_PARAM(LOWEST, 3) },
|
||||
{ "pxa27x-camera.0", "CI_Y", PDMA_FILTER_PARAM(HIGHEST, 68) },
|
||||
{ "pxa27x-camera.0", "CI_U", PDMA_FILTER_PARAM(HIGHEST, 69) },
|
||||
{ "pxa27x-camera.0", "CI_V", PDMA_FILTER_PARAM(HIGHEST, 70) },
|
||||
};
|
||||
|
||||
static struct mmp_dma_platdata pxa27x_dma_pdata = {
|
||||
.dma_channels = 32,
|
||||
.nb_requestors = 75,
|
||||
.slave_map = pxa27x_slave_map,
|
||||
.slave_map_cnt = ARRAY_SIZE(pxa27x_slave_map),
|
||||
};
|
||||
|
||||
static int __init pxa27x_init(void)
|
||||
{
|
||||
int ret = 0;
|
||||
@ -313,7 +350,7 @@ static int __init pxa27x_init(void)
|
||||
if (!of_have_populated_dt()) {
|
||||
pxa_register_device(&pxa27x_device_gpio,
|
||||
&pxa27x_gpio_info);
|
||||
pxa2xx_set_dmac_info(32, 75);
|
||||
pxa2xx_set_dmac_info(&pxa27x_dma_pdata);
|
||||
ret = platform_add_devices(devices,
|
||||
ARRAY_SIZE(devices));
|
||||
}
|
||||
|
@ -12,6 +12,8 @@
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/dma/pxa-dma.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
@ -24,6 +26,7 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/platform_data/i2c-pxa.h>
|
||||
#include <linux/platform_data/mmp_dma.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/suspend.h>
|
||||
@ -421,6 +424,42 @@ static struct platform_device *devices[] __initdata = {
|
||||
&pxa27x_device_pwm1,
|
||||
};
|
||||
|
||||
static const struct dma_slave_map pxa3xx_slave_map[] = {
|
||||
/* PXA25x, PXA27x and PXA3xx common entries */
|
||||
{ "pxa2xx-ac97", "pcm_pcm_mic_mono", PDMA_FILTER_PARAM(LOWEST, 8) },
|
||||
{ "pxa2xx-ac97", "pcm_pcm_aux_mono_in", PDMA_FILTER_PARAM(LOWEST, 9) },
|
||||
{ "pxa2xx-ac97", "pcm_pcm_aux_mono_out",
|
||||
PDMA_FILTER_PARAM(LOWEST, 10) },
|
||||
{ "pxa2xx-ac97", "pcm_pcm_stereo_in", PDMA_FILTER_PARAM(LOWEST, 11) },
|
||||
{ "pxa2xx-ac97", "pcm_pcm_stereo_out", PDMA_FILTER_PARAM(LOWEST, 12) },
|
||||
{ "pxa-ssp-dai.0", "rx", PDMA_FILTER_PARAM(LOWEST, 13) },
|
||||
{ "pxa-ssp-dai.0", "tx", PDMA_FILTER_PARAM(LOWEST, 14) },
|
||||
{ "pxa-ssp-dai.1", "rx", PDMA_FILTER_PARAM(LOWEST, 15) },
|
||||
{ "pxa-ssp-dai.1", "tx", PDMA_FILTER_PARAM(LOWEST, 16) },
|
||||
{ "pxa2xx-ir", "rx", PDMA_FILTER_PARAM(LOWEST, 17) },
|
||||
{ "pxa2xx-ir", "tx", PDMA_FILTER_PARAM(LOWEST, 18) },
|
||||
{ "pxa2xx-mci.0", "rx", PDMA_FILTER_PARAM(LOWEST, 21) },
|
||||
{ "pxa2xx-mci.0", "tx", PDMA_FILTER_PARAM(LOWEST, 22) },
|
||||
{ "pxa-ssp-dai.2", "rx", PDMA_FILTER_PARAM(LOWEST, 66) },
|
||||
{ "pxa-ssp-dai.2", "tx", PDMA_FILTER_PARAM(LOWEST, 67) },
|
||||
|
||||
/* PXA3xx specific map */
|
||||
{ "pxa-ssp-dai.3", "rx", PDMA_FILTER_PARAM(LOWEST, 2) },
|
||||
{ "pxa-ssp-dai.3", "tx", PDMA_FILTER_PARAM(LOWEST, 3) },
|
||||
{ "pxa2xx-mci.1", "rx", PDMA_FILTER_PARAM(LOWEST, 93) },
|
||||
{ "pxa2xx-mci.1", "tx", PDMA_FILTER_PARAM(LOWEST, 94) },
|
||||
{ "pxa3xx-nand", "data", PDMA_FILTER_PARAM(LOWEST, 97) },
|
||||
{ "pxa2xx-mci.2", "rx", PDMA_FILTER_PARAM(LOWEST, 100) },
|
||||
{ "pxa2xx-mci.2", "tx", PDMA_FILTER_PARAM(LOWEST, 101) },
|
||||
};
|
||||
|
||||
static struct mmp_dma_platdata pxa3xx_dma_pdata = {
|
||||
.dma_channels = 32,
|
||||
.nb_requestors = 100,
|
||||
.slave_map = pxa3xx_slave_map,
|
||||
.slave_map_cnt = ARRAY_SIZE(pxa3xx_slave_map),
|
||||
};
|
||||
|
||||
static int __init pxa3xx_init(void)
|
||||
{
|
||||
int ret = 0;
|
||||
@ -456,7 +495,7 @@ static int __init pxa3xx_init(void)
|
||||
if (of_have_populated_dt())
|
||||
return 0;
|
||||
|
||||
pxa2xx_set_dmac_info(32, 100);
|
||||
pxa2xx_set_dmac_info(&pxa3xx_dma_pdata);
|
||||
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -127,53 +127,6 @@ static int pxa_ssp_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(ssp->clk))
|
||||
return PTR_ERR(ssp->clk);
|
||||
|
||||
if (dev->of_node) {
|
||||
struct of_phandle_args dma_spec;
|
||||
struct device_node *np = dev->of_node;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* FIXME: we should allocate the DMA channel from this
|
||||
* context and pass the channel down to the ssp users.
|
||||
* For now, we lookup the rx and tx indices manually
|
||||
*/
|
||||
|
||||
/* rx */
|
||||
ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells",
|
||||
0, &dma_spec);
|
||||
|
||||
if (ret) {
|
||||
dev_err(dev, "Can't parse dmas property\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
ssp->drcmr_rx = dma_spec.args[0];
|
||||
of_node_put(dma_spec.np);
|
||||
|
||||
/* tx */
|
||||
ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells",
|
||||
1, &dma_spec);
|
||||
if (ret) {
|
||||
dev_err(dev, "Can't parse dmas property\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
ssp->drcmr_tx = dma_spec.args[0];
|
||||
of_node_put(dma_spec.np);
|
||||
} else {
|
||||
res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
|
||||
if (res == NULL) {
|
||||
dev_err(dev, "no SSP RX DRCMR defined\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
ssp->drcmr_rx = res->start;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
|
||||
if (res == NULL) {
|
||||
dev_err(dev, "no SSP TX DRCMR defined\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
ssp->drcmr_tx = res->start;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (res == NULL) {
|
||||
dev_err(dev, "no memory resource defined\n");
|
||||
|
@ -25,7 +25,6 @@
|
||||
#include <linux/libata.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/dma/pxa-dma.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/completion.h>
|
||||
@ -180,8 +179,6 @@ static int pxa_ata_probe(struct platform_device *pdev)
|
||||
struct resource *irq_res;
|
||||
struct pata_pxa_pdata *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct dma_slave_config config;
|
||||
dma_cap_mask_t mask;
|
||||
struct pxad_param param;
|
||||
int ret = 0;
|
||||
|
||||
/*
|
||||
@ -278,10 +275,6 @@ static int pxa_ata_probe(struct platform_device *pdev)
|
||||
|
||||
ap->private_data = data;
|
||||
|
||||
dma_cap_zero(mask);
|
||||
dma_cap_set(DMA_SLAVE, mask);
|
||||
param.prio = PXAD_PRIO_LOWEST;
|
||||
param.drcmr = pdata->dma_dreq;
|
||||
memset(&config, 0, sizeof(config));
|
||||
config.src_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
|
||||
config.dst_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
|
||||
@ -294,8 +287,7 @@ static int pxa_ata_probe(struct platform_device *pdev)
|
||||
* Request the DMA channel
|
||||
*/
|
||||
data->dma_chan =
|
||||
dma_request_slave_channel_compat(mask, pxad_filter_fn,
|
||||
¶m, &pdev->dev, "data");
|
||||
dma_request_slave_channel(&pdev->dev, "data");
|
||||
if (!data->dma_chan)
|
||||
return -EBUSY;
|
||||
ret = dmaengine_slave_config(data->dma_chan, &config);
|
||||
|
@ -67,6 +67,7 @@ struct clk_core {
|
||||
unsigned long max_rate;
|
||||
unsigned long accuracy;
|
||||
int phase;
|
||||
struct clk_duty duty;
|
||||
struct hlist_head children;
|
||||
struct hlist_node child_node;
|
||||
struct hlist_head clks;
|
||||
@ -2401,6 +2402,172 @@ int clk_get_phase(struct clk *clk)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clk_get_phase);
|
||||
|
||||
static void clk_core_reset_duty_cycle_nolock(struct clk_core *core)
|
||||
{
|
||||
/* Assume a default value of 50% */
|
||||
core->duty.num = 1;
|
||||
core->duty.den = 2;
|
||||
}
|
||||
|
||||
static int clk_core_update_duty_cycle_parent_nolock(struct clk_core *core);
|
||||
|
||||
static int clk_core_update_duty_cycle_nolock(struct clk_core *core)
|
||||
{
|
||||
struct clk_duty *duty = &core->duty;
|
||||
int ret = 0;
|
||||
|
||||
if (!core->ops->get_duty_cycle)
|
||||
return clk_core_update_duty_cycle_parent_nolock(core);
|
||||
|
||||
ret = core->ops->get_duty_cycle(core->hw, duty);
|
||||
if (ret)
|
||||
goto reset;
|
||||
|
||||
/* Don't trust the clock provider too much */
|
||||
if (duty->den == 0 || duty->num > duty->den) {
|
||||
ret = -EINVAL;
|
||||
goto reset;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
reset:
|
||||
clk_core_reset_duty_cycle_nolock(core);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int clk_core_update_duty_cycle_parent_nolock(struct clk_core *core)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (core->parent &&
|
||||
core->flags & CLK_DUTY_CYCLE_PARENT) {
|
||||
ret = clk_core_update_duty_cycle_nolock(core->parent);
|
||||
memcpy(&core->duty, &core->parent->duty, sizeof(core->duty));
|
||||
} else {
|
||||
clk_core_reset_duty_cycle_nolock(core);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int clk_core_set_duty_cycle_parent_nolock(struct clk_core *core,
|
||||
struct clk_duty *duty);
|
||||
|
||||
static int clk_core_set_duty_cycle_nolock(struct clk_core *core,
|
||||
struct clk_duty *duty)
|
||||
{
|
||||
int ret;
|
||||
|
||||
lockdep_assert_held(&prepare_lock);
|
||||
|
||||
if (clk_core_rate_is_protected(core))
|
||||
return -EBUSY;
|
||||
|
||||
trace_clk_set_duty_cycle(core, duty);
|
||||
|
||||
if (!core->ops->set_duty_cycle)
|
||||
return clk_core_set_duty_cycle_parent_nolock(core, duty);
|
||||
|
||||
ret = core->ops->set_duty_cycle(core->hw, duty);
|
||||
if (!ret)
|
||||
memcpy(&core->duty, duty, sizeof(*duty));
|
||||
|
||||
trace_clk_set_duty_cycle_complete(core, duty);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int clk_core_set_duty_cycle_parent_nolock(struct clk_core *core,
|
||||
struct clk_duty *duty)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (core->parent &&
|
||||
core->flags & (CLK_DUTY_CYCLE_PARENT | CLK_SET_RATE_PARENT)) {
|
||||
ret = clk_core_set_duty_cycle_nolock(core->parent, duty);
|
||||
memcpy(&core->duty, &core->parent->duty, sizeof(core->duty));
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* clk_set_duty_cycle - adjust the duty cycle ratio of a clock signal
|
||||
* @clk: clock signal source
|
||||
* @num: numerator of the duty cycle ratio to be applied
|
||||
* @den: denominator of the duty cycle ratio to be applied
|
||||
*
|
||||
* Apply the duty cycle ratio if the ratio is valid and the clock can
|
||||
* perform this operation
|
||||
*
|
||||
* Returns (0) on success, a negative errno otherwise.
|
||||
*/
|
||||
int clk_set_duty_cycle(struct clk *clk, unsigned int num, unsigned int den)
|
||||
{
|
||||
int ret;
|
||||
struct clk_duty duty;
|
||||
|
||||
if (!clk)
|
||||
return 0;
|
||||
|
||||
/* sanity check the ratio */
|
||||
if (den == 0 || num > den)
|
||||
return -EINVAL;
|
||||
|
||||
duty.num = num;
|
||||
duty.den = den;
|
||||
|
||||
clk_prepare_lock();
|
||||
|
||||
if (clk->exclusive_count)
|
||||
clk_core_rate_unprotect(clk->core);
|
||||
|
||||
ret = clk_core_set_duty_cycle_nolock(clk->core, &duty);
|
||||
|
||||
if (clk->exclusive_count)
|
||||
clk_core_rate_protect(clk->core);
|
||||
|
||||
clk_prepare_unlock();
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clk_set_duty_cycle);
|
||||
|
||||
static int clk_core_get_scaled_duty_cycle(struct clk_core *core,
|
||||
unsigned int scale)
|
||||
{
|
||||
struct clk_duty *duty = &core->duty;
|
||||
int ret;
|
||||
|
||||
clk_prepare_lock();
|
||||
|
||||
ret = clk_core_update_duty_cycle_nolock(core);
|
||||
if (!ret)
|
||||
ret = mult_frac(scale, duty->num, duty->den);
|
||||
|
||||
clk_prepare_unlock();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* clk_get_scaled_duty_cycle - return the duty cycle ratio of a clock signal
|
||||
* @clk: clock signal source
|
||||
* @scale: scaling factor to be applied to represent the ratio as an integer
|
||||
*
|
||||
* Returns the duty cycle ratio of a clock node multiplied by the provided
|
||||
* scaling factor, or negative errno on error.
|
||||
*/
|
||||
int clk_get_scaled_duty_cycle(struct clk *clk, unsigned int scale)
|
||||
{
|
||||
if (!clk)
|
||||
return 0;
|
||||
|
||||
return clk_core_get_scaled_duty_cycle(clk->core, scale);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clk_get_scaled_duty_cycle);
|
||||
|
||||
/**
|
||||
* clk_is_match - check if two clk's point to the same hardware clock
|
||||
* @p: clk compared against q
|
||||
@ -2454,12 +2621,13 @@ static void clk_summary_show_one(struct seq_file *s, struct clk_core *c,
|
||||
if (!c)
|
||||
return;
|
||||
|
||||
seq_printf(s, "%*s%-*s %7d %8d %8d %11lu %10lu %-3d\n",
|
||||
seq_printf(s, "%*s%-*s %7d %8d %8d %11lu %10lu %5d %6d\n",
|
||||
level * 3 + 1, "",
|
||||
30 - level * 3, c->name,
|
||||
c->enable_count, c->prepare_count, c->protect_count,
|
||||
clk_core_get_rate(c), clk_core_get_accuracy(c),
|
||||
clk_core_get_phase(c));
|
||||
clk_core_get_phase(c),
|
||||
clk_core_get_scaled_duty_cycle(c, 100000));
|
||||
}
|
||||
|
||||
static void clk_summary_show_subtree(struct seq_file *s, struct clk_core *c,
|
||||
@ -2481,9 +2649,9 @@ static int clk_summary_show(struct seq_file *s, void *data)
|
||||
struct clk_core *c;
|
||||
struct hlist_head **lists = (struct hlist_head **)s->private;
|
||||
|
||||
seq_puts(s, " enable prepare protect \n");
|
||||
seq_puts(s, " clock count count count rate accuracy phase\n");
|
||||
seq_puts(s, "----------------------------------------------------------------------------------------\n");
|
||||
seq_puts(s, " enable prepare protect duty\n");
|
||||
seq_puts(s, " clock count count count rate accuracy phase cycle\n");
|
||||
seq_puts(s, "---------------------------------------------------------------------------------------------\n");
|
||||
|
||||
clk_prepare_lock();
|
||||
|
||||
@ -2510,6 +2678,8 @@ static void clk_dump_one(struct seq_file *s, struct clk_core *c, int level)
|
||||
seq_printf(s, "\"rate\": %lu,", clk_core_get_rate(c));
|
||||
seq_printf(s, "\"accuracy\": %lu,", clk_core_get_accuracy(c));
|
||||
seq_printf(s, "\"phase\": %d", clk_core_get_phase(c));
|
||||
seq_printf(s, "\"duty_cycle\": %u",
|
||||
clk_core_get_scaled_duty_cycle(c, 100000));
|
||||
}
|
||||
|
||||
static void clk_dump_subtree(struct seq_file *s, struct clk_core *c, int level)
|
||||
@ -2571,6 +2741,7 @@ static const struct {
|
||||
ENTRY(CLK_SET_RATE_UNGATE),
|
||||
ENTRY(CLK_IS_CRITICAL),
|
||||
ENTRY(CLK_OPS_PARENT_ENABLE),
|
||||
ENTRY(CLK_DUTY_CYCLE_PARENT),
|
||||
#undef ENTRY
|
||||
};
|
||||
|
||||
@ -2609,6 +2780,17 @@ static int possible_parents_show(struct seq_file *s, void *data)
|
||||
}
|
||||
DEFINE_SHOW_ATTRIBUTE(possible_parents);
|
||||
|
||||
static int clk_duty_cycle_show(struct seq_file *s, void *data)
|
||||
{
|
||||
struct clk_core *core = s->private;
|
||||
struct clk_duty *duty = &core->duty;
|
||||
|
||||
seq_printf(s, "%u/%u\n", duty->num, duty->den);
|
||||
|
||||
return 0;
|
||||
}
|
||||
DEFINE_SHOW_ATTRIBUTE(clk_duty_cycle);
|
||||
|
||||
static void clk_debug_create_one(struct clk_core *core, struct dentry *pdentry)
|
||||
{
|
||||
struct dentry *root;
|
||||
@ -2627,6 +2809,8 @@ static void clk_debug_create_one(struct clk_core *core, struct dentry *pdentry)
|
||||
debugfs_create_u32("clk_enable_count", 0444, root, &core->enable_count);
|
||||
debugfs_create_u32("clk_protect_count", 0444, root, &core->protect_count);
|
||||
debugfs_create_u32("clk_notifier_count", 0444, root, &core->notifier_count);
|
||||
debugfs_create_file("clk_duty_cycle", 0444, root, core,
|
||||
&clk_duty_cycle_fops);
|
||||
|
||||
if (core->num_parents > 1)
|
||||
debugfs_create_file("clk_possible_parents", 0444, root, core,
|
||||
@ -2844,6 +3028,11 @@ static int __clk_core_init(struct clk_core *core)
|
||||
else
|
||||
core->phase = 0;
|
||||
|
||||
/*
|
||||
* Set clk's duty cycle.
|
||||
*/
|
||||
clk_core_update_duty_cycle_nolock(core);
|
||||
|
||||
/*
|
||||
* Set clk's rate. The preferred method is to use .recalc_rate. For
|
||||
* simple clocks and lazy developers the default fallback is to use the
|
||||
|
@ -179,6 +179,8 @@ static unsigned int pxad_drcmr(unsigned int line)
|
||||
return 0x1000 + line * 4;
|
||||
}
|
||||
|
||||
bool pxad_filter_fn(struct dma_chan *chan, void *param);
|
||||
|
||||
/*
|
||||
* Debug fs
|
||||
*/
|
||||
@ -760,6 +762,8 @@ static void pxad_free_chan_resources(struct dma_chan *dchan)
|
||||
dma_pool_destroy(chan->desc_pool);
|
||||
chan->desc_pool = NULL;
|
||||
|
||||
chan->drcmr = U32_MAX;
|
||||
chan->prio = PXAD_PRIO_LOWEST;
|
||||
}
|
||||
|
||||
static void pxad_free_desc(struct virt_dma_desc *vd)
|
||||
@ -1384,6 +1388,9 @@ static int pxad_init_dmadev(struct platform_device *op,
|
||||
c = devm_kzalloc(&op->dev, sizeof(*c), GFP_KERNEL);
|
||||
if (!c)
|
||||
return -ENOMEM;
|
||||
|
||||
c->drcmr = U32_MAX;
|
||||
c->prio = PXAD_PRIO_LOWEST;
|
||||
c->vc.desc_free = pxad_free_desc;
|
||||
vchan_init(&c->vc, &pdev->slave);
|
||||
init_waitqueue_head(&c->wq_state);
|
||||
@ -1396,9 +1403,10 @@ static int pxad_probe(struct platform_device *op)
|
||||
{
|
||||
struct pxad_device *pdev;
|
||||
const struct of_device_id *of_id;
|
||||
const struct dma_slave_map *slave_map = NULL;
|
||||
struct mmp_dma_platdata *pdata = dev_get_platdata(&op->dev);
|
||||
struct resource *iores;
|
||||
int ret, dma_channels = 0, nb_requestors = 0;
|
||||
int ret, dma_channels = 0, nb_requestors = 0, slave_map_cnt = 0;
|
||||
const enum dma_slave_buswidth widths =
|
||||
DMA_SLAVE_BUSWIDTH_1_BYTE | DMA_SLAVE_BUSWIDTH_2_BYTES |
|
||||
DMA_SLAVE_BUSWIDTH_4_BYTES;
|
||||
@ -1429,6 +1437,8 @@ static int pxad_probe(struct platform_device *op)
|
||||
} else if (pdata && pdata->dma_channels) {
|
||||
dma_channels = pdata->dma_channels;
|
||||
nb_requestors = pdata->nb_requestors;
|
||||
slave_map = pdata->slave_map;
|
||||
slave_map_cnt = pdata->slave_map_cnt;
|
||||
} else {
|
||||
dma_channels = 32; /* default 32 channel */
|
||||
}
|
||||
@ -1440,6 +1450,9 @@ static int pxad_probe(struct platform_device *op)
|
||||
pdev->slave.device_prep_dma_memcpy = pxad_prep_memcpy;
|
||||
pdev->slave.device_prep_slave_sg = pxad_prep_slave_sg;
|
||||
pdev->slave.device_prep_dma_cyclic = pxad_prep_dma_cyclic;
|
||||
pdev->slave.filter.map = slave_map;
|
||||
pdev->slave.filter.mapcnt = slave_map_cnt;
|
||||
pdev->slave.filter.fn = pxad_filter_fn;
|
||||
|
||||
pdev->slave.copy_align = PDMA_ALIGNMENT;
|
||||
pdev->slave.src_addr_widths = widths;
|
||||
|
@ -23,6 +23,7 @@ config DRM_I915
|
||||
select SYNC_FILE
|
||||
select IOSF_MBI
|
||||
select CRC32
|
||||
select SND_HDA_I915 if SND_HDA_CORE
|
||||
help
|
||||
Choose this option if you have a system that has "Intel Graphics
|
||||
Media Accelerator" or "HD Graphics" integrated graphics,
|
||||
|
@ -639,11 +639,12 @@ void intel_audio_codec_enable(struct intel_encoder *encoder,
|
||||
dev_priv->av_enc_map[pipe] = encoder;
|
||||
mutex_unlock(&dev_priv->av_mutex);
|
||||
|
||||
if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify) {
|
||||
if (acomp && acomp->base.audio_ops &&
|
||||
acomp->base.audio_ops->pin_eld_notify) {
|
||||
/* audio drivers expect pipe = -1 to indicate Non-MST cases */
|
||||
if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST))
|
||||
pipe = -1;
|
||||
acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr,
|
||||
acomp->base.audio_ops->pin_eld_notify(acomp->base.audio_ops->audio_ptr,
|
||||
(int) port, (int) pipe);
|
||||
}
|
||||
|
||||
@ -681,11 +682,12 @@ void intel_audio_codec_disable(struct intel_encoder *encoder,
|
||||
dev_priv->av_enc_map[pipe] = NULL;
|
||||
mutex_unlock(&dev_priv->av_mutex);
|
||||
|
||||
if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify) {
|
||||
if (acomp && acomp->base.audio_ops &&
|
||||
acomp->base.audio_ops->pin_eld_notify) {
|
||||
/* audio drivers expect pipe = -1 to indicate Non-MST cases */
|
||||
if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST))
|
||||
pipe = -1;
|
||||
acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr,
|
||||
acomp->base.audio_ops->pin_eld_notify(acomp->base.audio_ops->audio_ptr,
|
||||
(int) port, (int) pipe);
|
||||
}
|
||||
|
||||
@ -880,7 +882,7 @@ static int i915_audio_component_get_eld(struct device *kdev, int port,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct i915_audio_component_ops i915_audio_component_ops = {
|
||||
static const struct drm_audio_component_ops i915_audio_component_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.get_power = i915_audio_component_get_power,
|
||||
.put_power = i915_audio_component_put_power,
|
||||
@ -897,12 +899,12 @@ static int i915_audio_component_bind(struct device *i915_kdev,
|
||||
struct drm_i915_private *dev_priv = kdev_to_i915(i915_kdev);
|
||||
int i;
|
||||
|
||||
if (WARN_ON(acomp->ops || acomp->dev))
|
||||
if (WARN_ON(acomp->base.ops || acomp->base.dev))
|
||||
return -EEXIST;
|
||||
|
||||
drm_modeset_lock_all(&dev_priv->drm);
|
||||
acomp->ops = &i915_audio_component_ops;
|
||||
acomp->dev = i915_kdev;
|
||||
acomp->base.ops = &i915_audio_component_ops;
|
||||
acomp->base.dev = i915_kdev;
|
||||
BUILD_BUG_ON(MAX_PORTS != I915_MAX_PORTS);
|
||||
for (i = 0; i < ARRAY_SIZE(acomp->aud_sample_rate); i++)
|
||||
acomp->aud_sample_rate[i] = 0;
|
||||
@ -919,8 +921,8 @@ static void i915_audio_component_unbind(struct device *i915_kdev,
|
||||
struct drm_i915_private *dev_priv = kdev_to_i915(i915_kdev);
|
||||
|
||||
drm_modeset_lock_all(&dev_priv->drm);
|
||||
acomp->ops = NULL;
|
||||
acomp->dev = NULL;
|
||||
acomp->base.ops = NULL;
|
||||
acomp->base.dev = NULL;
|
||||
dev_priv->audio_component = NULL;
|
||||
drm_modeset_unlock_all(&dev_priv->drm);
|
||||
}
|
||||
|
@ -103,9 +103,11 @@
|
||||
* runtime pm. If true, writing ON and OFF to the vga_switcheroo debugfs
|
||||
* interface is a no-op so as not to interfere with runtime pm
|
||||
* @list: client list
|
||||
* @vga_dev: pci device, indicate which GPU is bound to current audio client
|
||||
*
|
||||
* Registered client. A client can be either a GPU or an audio device on a GPU.
|
||||
* For audio clients, the @fb_info and @active members are bogus.
|
||||
* For audio clients, the @fb_info and @active members are bogus. For GPU
|
||||
* clients, the @vga_dev is bogus.
|
||||
*/
|
||||
struct vga_switcheroo_client {
|
||||
struct pci_dev *pdev;
|
||||
@ -116,6 +118,7 @@ struct vga_switcheroo_client {
|
||||
bool active;
|
||||
bool driver_power_control;
|
||||
struct list_head list;
|
||||
struct pci_dev *vga_dev;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -161,9 +164,8 @@ struct vgasr_priv {
|
||||
};
|
||||
|
||||
#define ID_BIT_AUDIO 0x100
|
||||
#define client_is_audio(c) ((c)->id & ID_BIT_AUDIO)
|
||||
#define client_is_vga(c) ((c)->id == VGA_SWITCHEROO_UNKNOWN_ID || \
|
||||
!client_is_audio(c))
|
||||
#define client_is_audio(c) ((c)->id & ID_BIT_AUDIO)
|
||||
#define client_is_vga(c) (!client_is_audio(c))
|
||||
#define client_id(c) ((c)->id & ~ID_BIT_AUDIO)
|
||||
|
||||
static int vga_switcheroo_debugfs_init(struct vgasr_priv *priv);
|
||||
@ -192,14 +194,29 @@ static void vga_switcheroo_enable(void)
|
||||
vgasr_priv.handler->init();
|
||||
|
||||
list_for_each_entry(client, &vgasr_priv.clients, list) {
|
||||
if (client->id != VGA_SWITCHEROO_UNKNOWN_ID)
|
||||
if (!client_is_vga(client) ||
|
||||
client_id(client) != VGA_SWITCHEROO_UNKNOWN_ID)
|
||||
continue;
|
||||
|
||||
ret = vgasr_priv.handler->get_client_id(client->pdev);
|
||||
if (ret < 0)
|
||||
return;
|
||||
|
||||
client->id = ret;
|
||||
}
|
||||
|
||||
list_for_each_entry(client, &vgasr_priv.clients, list) {
|
||||
if (!client_is_audio(client) ||
|
||||
client_id(client) != VGA_SWITCHEROO_UNKNOWN_ID)
|
||||
continue;
|
||||
|
||||
ret = vgasr_priv.handler->get_client_id(client->vga_dev);
|
||||
if (ret < 0)
|
||||
return;
|
||||
|
||||
client->id = ret | ID_BIT_AUDIO;
|
||||
}
|
||||
|
||||
vga_switcheroo_debugfs_init(&vgasr_priv);
|
||||
vgasr_priv.active = true;
|
||||
}
|
||||
@ -272,7 +289,9 @@ EXPORT_SYMBOL(vga_switcheroo_handler_flags);
|
||||
|
||||
static int register_client(struct pci_dev *pdev,
|
||||
const struct vga_switcheroo_client_ops *ops,
|
||||
enum vga_switcheroo_client_id id, bool active,
|
||||
enum vga_switcheroo_client_id id,
|
||||
struct pci_dev *vga_dev,
|
||||
bool active,
|
||||
bool driver_power_control)
|
||||
{
|
||||
struct vga_switcheroo_client *client;
|
||||
@ -287,6 +306,7 @@ static int register_client(struct pci_dev *pdev,
|
||||
client->id = id;
|
||||
client->active = active;
|
||||
client->driver_power_control = driver_power_control;
|
||||
client->vga_dev = vga_dev;
|
||||
|
||||
mutex_lock(&vgasr_mutex);
|
||||
list_add_tail(&client->list, &vgasr_priv.clients);
|
||||
@ -319,7 +339,7 @@ int vga_switcheroo_register_client(struct pci_dev *pdev,
|
||||
const struct vga_switcheroo_client_ops *ops,
|
||||
bool driver_power_control)
|
||||
{
|
||||
return register_client(pdev, ops, VGA_SWITCHEROO_UNKNOWN_ID,
|
||||
return register_client(pdev, ops, VGA_SWITCHEROO_UNKNOWN_ID, NULL,
|
||||
pdev == vga_default_device(),
|
||||
driver_power_control);
|
||||
}
|
||||
@ -329,19 +349,40 @@ EXPORT_SYMBOL(vga_switcheroo_register_client);
|
||||
* vga_switcheroo_register_audio_client - register audio client
|
||||
* @pdev: client pci device
|
||||
* @ops: client callbacks
|
||||
* @id: client identifier
|
||||
* @vga_dev: pci device which is bound to current audio client
|
||||
*
|
||||
* Register audio client (audio device on a GPU). The client is assumed
|
||||
* to use runtime PM. Beforehand, vga_switcheroo_client_probe_defer()
|
||||
* shall be called to ensure that all prerequisites are met.
|
||||
*
|
||||
* Return: 0 on success, -ENOMEM on memory allocation error.
|
||||
* Return: 0 on success, -ENOMEM on memory allocation error, -EINVAL on getting
|
||||
* client id error.
|
||||
*/
|
||||
int vga_switcheroo_register_audio_client(struct pci_dev *pdev,
|
||||
const struct vga_switcheroo_client_ops *ops,
|
||||
enum vga_switcheroo_client_id id)
|
||||
struct pci_dev *vga_dev)
|
||||
{
|
||||
return register_client(pdev, ops, id | ID_BIT_AUDIO, false, true);
|
||||
enum vga_switcheroo_client_id id = VGA_SWITCHEROO_UNKNOWN_ID;
|
||||
|
||||
/*
|
||||
* if vga_switcheroo has enabled, that mean two GPU clients and also
|
||||
* handler are registered. Get audio client id from bound GPU client
|
||||
* id directly, otherwise, set it as VGA_SWITCHEROO_UNKNOWN_ID,
|
||||
* it will set to correct id in later when vga_switcheroo_enable()
|
||||
* is called.
|
||||
*/
|
||||
mutex_lock(&vgasr_mutex);
|
||||
if (vgasr_priv.active) {
|
||||
id = vgasr_priv.handler->get_client_id(vga_dev);
|
||||
if (id < 0) {
|
||||
mutex_unlock(&vgasr_mutex);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&vgasr_mutex);
|
||||
|
||||
return register_client(pdev, ops, id | ID_BIT_AUDIO, vga_dev,
|
||||
false, true);
|
||||
}
|
||||
EXPORT_SYMBOL(vga_switcheroo_register_audio_client);
|
||||
|
||||
|
@ -2375,8 +2375,6 @@ static int pxa_camera_probe(struct platform_device *pdev)
|
||||
.src_maxburst = 8,
|
||||
.direction = DMA_DEV_TO_MEM,
|
||||
};
|
||||
dma_cap_mask_t mask;
|
||||
struct pxad_param params;
|
||||
char clk_name[V4L2_CLK_NAME_SIZE];
|
||||
int irq;
|
||||
int err = 0, i;
|
||||
@ -2450,34 +2448,20 @@ static int pxa_camera_probe(struct platform_device *pdev)
|
||||
pcdev->base = base;
|
||||
|
||||
/* request dma */
|
||||
dma_cap_zero(mask);
|
||||
dma_cap_set(DMA_SLAVE, mask);
|
||||
dma_cap_set(DMA_PRIVATE, mask);
|
||||
|
||||
params.prio = 0;
|
||||
params.drcmr = 68;
|
||||
pcdev->dma_chans[0] =
|
||||
dma_request_slave_channel_compat(mask, pxad_filter_fn,
|
||||
¶ms, &pdev->dev, "CI_Y");
|
||||
pcdev->dma_chans[0] = dma_request_slave_channel(&pdev->dev, "CI_Y");
|
||||
if (!pcdev->dma_chans[0]) {
|
||||
dev_err(&pdev->dev, "Can't request DMA for Y\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
params.drcmr = 69;
|
||||
pcdev->dma_chans[1] =
|
||||
dma_request_slave_channel_compat(mask, pxad_filter_fn,
|
||||
¶ms, &pdev->dev, "CI_U");
|
||||
pcdev->dma_chans[1] = dma_request_slave_channel(&pdev->dev, "CI_U");
|
||||
if (!pcdev->dma_chans[1]) {
|
||||
dev_err(&pdev->dev, "Can't request DMA for Y\n");
|
||||
err = -ENODEV;
|
||||
goto exit_free_dma_y;
|
||||
}
|
||||
|
||||
params.drcmr = 70;
|
||||
pcdev->dma_chans[2] =
|
||||
dma_request_slave_channel_compat(mask, pxad_filter_fn,
|
||||
¶ms, &pdev->dev, "CI_V");
|
||||
pcdev->dma_chans[2] = dma_request_slave_channel(&pdev->dev, "CI_V");
|
||||
if (!pcdev->dma_chans[2]) {
|
||||
dev_err(&pdev->dev, "Can't request DMA for V\n");
|
||||
err = -ENODEV;
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/dma/pxa-dma.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/mmc/host.h>
|
||||
@ -637,10 +636,8 @@ static int pxamci_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct mmc_host *mmc;
|
||||
struct pxamci_host *host = NULL;
|
||||
struct resource *r, *dmarx, *dmatx;
|
||||
struct pxad_param param_rx, param_tx;
|
||||
struct resource *r;
|
||||
int ret, irq, gpio_cd = -1, gpio_ro = -1, gpio_power = -1;
|
||||
dma_cap_mask_t mask;
|
||||
|
||||
ret = pxamci_of_init(pdev);
|
||||
if (ret)
|
||||
@ -739,34 +736,14 @@ static int pxamci_probe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, mmc);
|
||||
|
||||
if (!pdev->dev.of_node) {
|
||||
dmarx = platform_get_resource(pdev, IORESOURCE_DMA, 0);
|
||||
dmatx = platform_get_resource(pdev, IORESOURCE_DMA, 1);
|
||||
if (!dmarx || !dmatx) {
|
||||
ret = -ENXIO;
|
||||
goto out;
|
||||
}
|
||||
param_rx.prio = PXAD_PRIO_LOWEST;
|
||||
param_rx.drcmr = dmarx->start;
|
||||
param_tx.prio = PXAD_PRIO_LOWEST;
|
||||
param_tx.drcmr = dmatx->start;
|
||||
}
|
||||
|
||||
dma_cap_zero(mask);
|
||||
dma_cap_set(DMA_SLAVE, mask);
|
||||
|
||||
host->dma_chan_rx =
|
||||
dma_request_slave_channel_compat(mask, pxad_filter_fn,
|
||||
¶m_rx, &pdev->dev, "rx");
|
||||
host->dma_chan_rx = dma_request_slave_channel(&pdev->dev, "rx");
|
||||
if (host->dma_chan_rx == NULL) {
|
||||
dev_err(&pdev->dev, "unable to request rx dma channel\n");
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
host->dma_chan_tx =
|
||||
dma_request_slave_channel_compat(mask, pxad_filter_fn,
|
||||
¶m_tx, &pdev->dev, "tx");
|
||||
host->dma_chan_tx = dma_request_slave_channel(&pdev->dev, "tx");
|
||||
if (host->dma_chan_tx == NULL) {
|
||||
dev_err(&pdev->dev, "unable to request tx dma channel\n");
|
||||
ret = -ENODEV;
|
||||
|
@ -2618,8 +2618,6 @@ static int marvell_nfc_init_dma(struct marvell_nfc *nfc)
|
||||
dev);
|
||||
struct dma_slave_config config = {};
|
||||
struct resource *r;
|
||||
dma_cap_mask_t mask;
|
||||
struct pxad_param param;
|
||||
int ret;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_PXA_DMA)) {
|
||||
@ -2632,20 +2630,7 @@ static int marvell_nfc_init_dma(struct marvell_nfc *nfc)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
r = platform_get_resource(pdev, IORESOURCE_DMA, 0);
|
||||
if (!r) {
|
||||
dev_err(nfc->dev, "No resource defined for data DMA\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
param.drcmr = r->start;
|
||||
param.prio = PXAD_PRIO_LOWEST;
|
||||
dma_cap_zero(mask);
|
||||
dma_cap_set(DMA_SLAVE, mask);
|
||||
nfc->dma_chan =
|
||||
dma_request_slave_channel_compat(mask, pxad_filter_fn,
|
||||
¶m, nfc->dev,
|
||||
"data");
|
||||
nfc->dma_chan = dma_request_slave_channel(nfc->dev, "data");
|
||||
if (!nfc->dma_chan) {
|
||||
dev_err(nfc->dev,
|
||||
"Unable to request data DMA channel\n");
|
||||
|
@ -457,7 +457,6 @@ static const struct snd_pcm_ops pcm_ops = {
|
||||
.trigger = pcm_trigger,
|
||||
.pointer = pcm_pointer,
|
||||
.page = snd_pcm_lib_get_vmalloc_page,
|
||||
.mmap = snd_pcm_lib_mmap_vmalloc,
|
||||
};
|
||||
|
||||
static int split_arg_list(char *buf, char **card_name, u16 *ch_num,
|
||||
|
118
include/drm/drm_audio_component.h
Normal file
118
include/drm/drm_audio_component.h
Normal file
@ -0,0 +1,118 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2014 Intel Corporation
|
||||
|
||||
#ifndef _DRM_AUDIO_COMPONENT_H_
|
||||
#define _DRM_AUDIO_COMPONENT_H_
|
||||
|
||||
struct drm_audio_component;
|
||||
|
||||
/**
|
||||
* struct drm_audio_component_ops - Ops implemented by DRM driver, called by hda driver
|
||||
*/
|
||||
struct drm_audio_component_ops {
|
||||
/**
|
||||
* @owner: drm module to pin down
|
||||
*/
|
||||
struct module *owner;
|
||||
/**
|
||||
* @get_power: get the POWER_DOMAIN_AUDIO power well
|
||||
*
|
||||
* Request the power well to be turned on.
|
||||
*/
|
||||
void (*get_power)(struct device *);
|
||||
/**
|
||||
* @put_power: put the POWER_DOMAIN_AUDIO power well
|
||||
*
|
||||
* Allow the power well to be turned off.
|
||||
*/
|
||||
void (*put_power)(struct device *);
|
||||
/**
|
||||
* @codec_wake_override: Enable/disable codec wake signal
|
||||
*/
|
||||
void (*codec_wake_override)(struct device *, bool enable);
|
||||
/**
|
||||
* @get_cdclk_freq: Get the Core Display Clock in kHz
|
||||
*/
|
||||
int (*get_cdclk_freq)(struct device *);
|
||||
/**
|
||||
* @sync_audio_rate: set n/cts based on the sample rate
|
||||
*
|
||||
* Called from audio driver. After audio driver sets the
|
||||
* sample rate, it will call this function to set n/cts
|
||||
*/
|
||||
int (*sync_audio_rate)(struct device *, int port, int pipe, int rate);
|
||||
/**
|
||||
* @get_eld: fill the audio state and ELD bytes for the given port
|
||||
*
|
||||
* Called from audio driver to get the HDMI/DP audio state of the given
|
||||
* digital port, and also fetch ELD bytes to the given pointer.
|
||||
*
|
||||
* It returns the byte size of the original ELD (not the actually
|
||||
* copied size), zero for an invalid ELD, or a negative error code.
|
||||
*
|
||||
* Note that the returned size may be over @max_bytes. Then it
|
||||
* implies that only a part of ELD has been copied to the buffer.
|
||||
*/
|
||||
int (*get_eld)(struct device *, int port, int pipe, bool *enabled,
|
||||
unsigned char *buf, int max_bytes);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct drm_audio_component_audio_ops - Ops implemented by hda driver, called by DRM driver
|
||||
*/
|
||||
struct drm_audio_component_audio_ops {
|
||||
/**
|
||||
* @audio_ptr: Pointer to be used in call to pin_eld_notify
|
||||
*/
|
||||
void *audio_ptr;
|
||||
/**
|
||||
* @pin_eld_notify: Notify the HDA driver that pin sense and/or ELD information has changed
|
||||
*
|
||||
* Called when the DRM driver has set up audio pipeline or has just
|
||||
* begun to tear it down. This allows the HDA driver to update its
|
||||
* status accordingly (even when the HDA controller is in power save
|
||||
* mode).
|
||||
*/
|
||||
void (*pin_eld_notify)(void *audio_ptr, int port, int pipe);
|
||||
/**
|
||||
* @pin2port: Check and convert from pin node to port number
|
||||
*
|
||||
* Called by HDA driver to check and convert from the pin widget node
|
||||
* number to a port number in the graphics side.
|
||||
*/
|
||||
int (*pin2port)(void *audio_ptr, int pin);
|
||||
/**
|
||||
* @master_bind: (Optional) component master bind callback
|
||||
*
|
||||
* Called at binding master component, for HDA codec-specific
|
||||
* handling of dynamic binding.
|
||||
*/
|
||||
int (*master_bind)(struct device *dev, struct drm_audio_component *);
|
||||
/**
|
||||
* @master_unbind: (Optional) component master unbind callback
|
||||
*
|
||||
* Called at unbinding master component, for HDA codec-specific
|
||||
* handling of dynamic unbinding.
|
||||
*/
|
||||
void (*master_unbind)(struct device *dev, struct drm_audio_component *);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct drm_audio_component - Used for direct communication between DRM and hda drivers
|
||||
*/
|
||||
struct drm_audio_component {
|
||||
/**
|
||||
* @dev: DRM device, used as parameter for ops
|
||||
*/
|
||||
struct device *dev;
|
||||
/**
|
||||
* @ops: Ops implemented by DRM driver, called by hda driver
|
||||
*/
|
||||
const struct drm_audio_component_ops *ops;
|
||||
/**
|
||||
* @audio_ops: Ops implemented by hda driver, called by DRM driver
|
||||
*/
|
||||
const struct drm_audio_component_audio_ops *audio_ops;
|
||||
};
|
||||
|
||||
#endif /* _DRM_AUDIO_COMPONENT_H_ */
|
@ -24,101 +24,26 @@
|
||||
#ifndef _I915_COMPONENT_H_
|
||||
#define _I915_COMPONENT_H_
|
||||
|
||||
#include "drm_audio_component.h"
|
||||
|
||||
/* MAX_PORT is the number of port
|
||||
* It must be sync with I915_MAX_PORTS defined i915_drv.h
|
||||
*/
|
||||
#define MAX_PORTS 6
|
||||
|
||||
/**
|
||||
* struct i915_audio_component_ops - Ops implemented by i915 driver, called by hda driver
|
||||
*/
|
||||
struct i915_audio_component_ops {
|
||||
/**
|
||||
* @owner: i915 module
|
||||
*/
|
||||
struct module *owner;
|
||||
/**
|
||||
* @get_power: get the POWER_DOMAIN_AUDIO power well
|
||||
*
|
||||
* Request the power well to be turned on.
|
||||
*/
|
||||
void (*get_power)(struct device *);
|
||||
/**
|
||||
* @put_power: put the POWER_DOMAIN_AUDIO power well
|
||||
*
|
||||
* Allow the power well to be turned off.
|
||||
*/
|
||||
void (*put_power)(struct device *);
|
||||
/**
|
||||
* @codec_wake_override: Enable/disable codec wake signal
|
||||
*/
|
||||
void (*codec_wake_override)(struct device *, bool enable);
|
||||
/**
|
||||
* @get_cdclk_freq: Get the Core Display Clock in kHz
|
||||
*/
|
||||
int (*get_cdclk_freq)(struct device *);
|
||||
/**
|
||||
* @sync_audio_rate: set n/cts based on the sample rate
|
||||
*
|
||||
* Called from audio driver. After audio driver sets the
|
||||
* sample rate, it will call this function to set n/cts
|
||||
*/
|
||||
int (*sync_audio_rate)(struct device *, int port, int pipe, int rate);
|
||||
/**
|
||||
* @get_eld: fill the audio state and ELD bytes for the given port
|
||||
*
|
||||
* Called from audio driver to get the HDMI/DP audio state of the given
|
||||
* digital port, and also fetch ELD bytes to the given pointer.
|
||||
*
|
||||
* It returns the byte size of the original ELD (not the actually
|
||||
* copied size), zero for an invalid ELD, or a negative error code.
|
||||
*
|
||||
* Note that the returned size may be over @max_bytes. Then it
|
||||
* implies that only a part of ELD has been copied to the buffer.
|
||||
*/
|
||||
int (*get_eld)(struct device *, int port, int pipe, bool *enabled,
|
||||
unsigned char *buf, int max_bytes);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct i915_audio_component_audio_ops - Ops implemented by hda driver, called by i915 driver
|
||||
*/
|
||||
struct i915_audio_component_audio_ops {
|
||||
/**
|
||||
* @audio_ptr: Pointer to be used in call to pin_eld_notify
|
||||
*/
|
||||
void *audio_ptr;
|
||||
/**
|
||||
* @pin_eld_notify: Notify the HDA driver that pin sense and/or ELD information has changed
|
||||
*
|
||||
* Called when the i915 driver has set up audio pipeline or has just
|
||||
* begun to tear it down. This allows the HDA driver to update its
|
||||
* status accordingly (even when the HDA controller is in power save
|
||||
* mode).
|
||||
*/
|
||||
void (*pin_eld_notify)(void *audio_ptr, int port, int pipe);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct i915_audio_component - Used for direct communication between i915 and hda drivers
|
||||
*/
|
||||
struct i915_audio_component {
|
||||
/**
|
||||
* @dev: i915 device, used as parameter for ops
|
||||
* @base: the drm_audio_component base class
|
||||
*/
|
||||
struct device *dev;
|
||||
struct drm_audio_component base;
|
||||
|
||||
/**
|
||||
* @aud_sample_rate: the array of audio sample rate per port
|
||||
*/
|
||||
int aud_sample_rate[MAX_PORTS];
|
||||
/**
|
||||
* @ops: Ops implemented by i915 driver, called by hda driver
|
||||
*/
|
||||
const struct i915_audio_component_ops *ops;
|
||||
/**
|
||||
* @audio_ops: Ops implemented by hda driver, called by i915 driver
|
||||
*/
|
||||
const struct i915_audio_component_audio_ops *audio_ops;
|
||||
};
|
||||
|
||||
#endif /* _I915_COMPONENT_H_ */
|
||||
|
@ -38,6 +38,8 @@
|
||||
#define CLK_IS_CRITICAL BIT(11) /* do not gate, ever */
|
||||
/* parents need enable during gate/ungate, set rate and re-parent */
|
||||
#define CLK_OPS_PARENT_ENABLE BIT(12)
|
||||
/* duty cycle call may be forwarded to the parent clock */
|
||||
#define CLK_DUTY_CYCLE_PARENT BIT(13)
|
||||
|
||||
struct clk;
|
||||
struct clk_hw;
|
||||
@ -66,6 +68,17 @@ struct clk_rate_request {
|
||||
struct clk_hw *best_parent_hw;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct clk_duty - Struture encoding the duty cycle ratio of a clock
|
||||
*
|
||||
* @num: Numerator of the duty cycle ratio
|
||||
* @den: Denominator of the duty cycle ratio
|
||||
*/
|
||||
struct clk_duty {
|
||||
unsigned int num;
|
||||
unsigned int den;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct clk_ops - Callback operations for hardware clocks; these are to
|
||||
* be provided by the clock implementation, and will be called by drivers
|
||||
@ -169,6 +182,15 @@ struct clk_rate_request {
|
||||
* by the second argument. Valid values for degrees are
|
||||
* 0-359. Return 0 on success, otherwise -EERROR.
|
||||
*
|
||||
* @get_duty_cycle: Queries the hardware to get the current duty cycle ratio
|
||||
* of a clock. Returned values denominator cannot be 0 and must be
|
||||
* superior or equal to the numerator.
|
||||
*
|
||||
* @set_duty_cycle: Apply the duty cycle ratio to this clock signal specified by
|
||||
* the numerator (2nd argurment) and denominator (3rd argument).
|
||||
* Argument must be a valid ratio (denominator > 0
|
||||
* and >= numerator) Return 0 on success, otherwise -EERROR.
|
||||
*
|
||||
* @init: Perform platform-specific initialization magic.
|
||||
* This is not not used by any of the basic clock types.
|
||||
* Please consider other ways of solving initialization problems
|
||||
@ -218,6 +240,10 @@ struct clk_ops {
|
||||
unsigned long parent_accuracy);
|
||||
int (*get_phase)(struct clk_hw *hw);
|
||||
int (*set_phase)(struct clk_hw *hw, int degrees);
|
||||
int (*get_duty_cycle)(struct clk_hw *hw,
|
||||
struct clk_duty *duty);
|
||||
int (*set_duty_cycle)(struct clk_hw *hw,
|
||||
struct clk_duty *duty);
|
||||
void (*init)(struct clk_hw *hw);
|
||||
void (*debug_init)(struct clk_hw *hw, struct dentry *dentry);
|
||||
};
|
||||
|
@ -141,6 +141,27 @@ int clk_set_phase(struct clk *clk, int degrees);
|
||||
*/
|
||||
int clk_get_phase(struct clk *clk);
|
||||
|
||||
/**
|
||||
* clk_set_duty_cycle - adjust the duty cycle ratio of a clock signal
|
||||
* @clk: clock signal source
|
||||
* @num: numerator of the duty cycle ratio to be applied
|
||||
* @den: denominator of the duty cycle ratio to be applied
|
||||
*
|
||||
* Adjust the duty cycle of a clock signal by the specified ratio. Returns 0 on
|
||||
* success, -EERROR otherwise.
|
||||
*/
|
||||
int clk_set_duty_cycle(struct clk *clk, unsigned int num, unsigned int den);
|
||||
|
||||
/**
|
||||
* clk_get_duty_cycle - return the duty cycle ratio of a clock signal
|
||||
* @clk: clock signal source
|
||||
* @scale: scaling factor to be applied to represent the ratio as an integer
|
||||
*
|
||||
* Returns the duty cycle ratio multiplied by the scale provided, otherwise
|
||||
* returns -EERROR.
|
||||
*/
|
||||
int clk_get_scaled_duty_cycle(struct clk *clk, unsigned int scale);
|
||||
|
||||
/**
|
||||
* clk_is_match - check if two clk's point to the same hardware clock
|
||||
* @p: clk compared against q
|
||||
@ -183,6 +204,18 @@ static inline long clk_get_phase(struct clk *clk)
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline int clk_set_duty_cycle(struct clk *clk, unsigned int num,
|
||||
unsigned int den)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline unsigned int clk_get_scaled_duty_cycle(struct clk *clk,
|
||||
unsigned int scale)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline bool clk_is_match(const struct clk *p, const struct clk *q)
|
||||
{
|
||||
return p == q;
|
||||
|
@ -9,6 +9,15 @@ enum pxad_chan_prio {
|
||||
PXAD_PRIO_LOWEST,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct pxad_param - dma channel request parameters
|
||||
* @drcmr: requestor line number
|
||||
* @prio: minimal mandatory priority of the channel
|
||||
*
|
||||
* If a requested channel is granted, its priority will be at least @prio,
|
||||
* ie. if PXAD_PRIO_LOW is required, the requested channel will be either
|
||||
* PXAD_PRIO_LOW, PXAD_PRIO_NORMAL or PXAD_PRIO_HIGHEST.
|
||||
*/
|
||||
struct pxad_param {
|
||||
unsigned int drcmr;
|
||||
enum pxad_chan_prio prio;
|
||||
|
@ -12,9 +12,13 @@
|
||||
#ifndef MMP_DMA_H
|
||||
#define MMP_DMA_H
|
||||
|
||||
struct dma_slave_map;
|
||||
|
||||
struct mmp_dma_platdata {
|
||||
int dma_channels;
|
||||
int nb_requestors;
|
||||
int slave_map_cnt;
|
||||
const struct dma_slave_map *slave_map;
|
||||
};
|
||||
|
||||
#endif /* MMP_DMA_H */
|
||||
|
@ -171,6 +171,14 @@
|
||||
#define SSACD_SCDB (1 << 3) /* SSPSYSCLK Divider Bypass */
|
||||
#define SSACD_ACPS(x) ((x) << 4) /* Audio clock PLL select */
|
||||
#define SSACD_ACDS(x) ((x) << 0) /* Audio clock divider select */
|
||||
#define SSACD_ACDS_1 (0)
|
||||
#define SSACD_ACDS_2 (1)
|
||||
#define SSACD_ACDS_4 (2)
|
||||
#define SSACD_ACDS_8 (3)
|
||||
#define SSACD_ACDS_16 (4)
|
||||
#define SSACD_ACDS_32 (5)
|
||||
#define SSACD_SCDB_4X (0)
|
||||
#define SSACD_SCDB_1X (1)
|
||||
#define SSACD_SCDX8 (1 << 7) /* SYSCLK division ratio select */
|
||||
|
||||
/* LPSS SSP */
|
||||
@ -212,8 +220,6 @@ struct ssp_device {
|
||||
int type;
|
||||
int use_count;
|
||||
int irq;
|
||||
int drcmr_rx;
|
||||
int drcmr_tx;
|
||||
|
||||
struct device_node *of_node;
|
||||
};
|
||||
|
@ -387,6 +387,12 @@ struct uac3_interrupt_data_msg {
|
||||
#define UAC3_CONNECTORS 0x0f
|
||||
#define UAC3_POWER_DOMAIN 0x10
|
||||
|
||||
/* A.20 PROCESSING UNIT PROCESS TYPES */
|
||||
#define UAC3_PROCESS_UNDEFINED 0x00
|
||||
#define UAC3_PROCESS_UP_DOWNMIX 0x01
|
||||
#define UAC3_PROCESS_STEREO_EXTENDER 0x02
|
||||
#define UAC3_PROCESS_MULTI_FUNCTION 0x03
|
||||
|
||||
/* A.22 AUDIO CLASS-SPECIFIC REQUEST CODES */
|
||||
/* see audio-v2.h for the rest, which is identical to v2 */
|
||||
#define UAC3_CS_REQ_INTEN 0x04
|
||||
@ -406,6 +412,15 @@ struct uac3_interrupt_data_msg {
|
||||
#define UAC3_TE_OVERFLOW 0x04
|
||||
#define UAC3_TE_LATENCY 0x05
|
||||
|
||||
/* A.23.10 PROCESSING UNITS CONTROL SELECTROS */
|
||||
|
||||
/* Up/Down Mixer */
|
||||
#define UAC3_UD_MODE_SELECT 0x01
|
||||
|
||||
/* Stereo Extender */
|
||||
#define UAC3_EXT_WIDTH_CONTROL 0x01
|
||||
|
||||
|
||||
/* BADD predefined Unit/Terminal values */
|
||||
#define UAC3_BADD_IT_ID1 1 /* Input Terminal ID1: bTerminalID = 1 */
|
||||
#define UAC3_BADD_FU_ID2 2 /* Feature Unit ID2: bUnitID = 2 */
|
||||
@ -432,4 +447,8 @@ struct uac3_interrupt_data_msg {
|
||||
/* BADD sample rate is always fixed to 48kHz */
|
||||
#define UAC3_BADD_SAMPLING_RATE 48000
|
||||
|
||||
/* BADD power domains recovery times in 50us increments */
|
||||
#define UAC3_BADD_PD_RECOVER_D1D0 0x0258 /* 30ms */
|
||||
#define UAC3_BADD_PD_RECOVER_D2D0 0x1770 /* 300ms */
|
||||
|
||||
#endif /* __LINUX_USB_AUDIO_V3_H */
|
||||
|
@ -84,8 +84,8 @@ enum vga_switcheroo_state {
|
||||
* Client identifier. Audio clients use the same identifier & 0x100.
|
||||
*/
|
||||
enum vga_switcheroo_client_id {
|
||||
VGA_SWITCHEROO_UNKNOWN_ID = -1,
|
||||
VGA_SWITCHEROO_IGD,
|
||||
VGA_SWITCHEROO_UNKNOWN_ID = 0x1000,
|
||||
VGA_SWITCHEROO_IGD = 0,
|
||||
VGA_SWITCHEROO_DIS,
|
||||
VGA_SWITCHEROO_MAX_CLIENTS,
|
||||
};
|
||||
@ -151,7 +151,7 @@ int vga_switcheroo_register_client(struct pci_dev *dev,
|
||||
bool driver_power_control);
|
||||
int vga_switcheroo_register_audio_client(struct pci_dev *pdev,
|
||||
const struct vga_switcheroo_client_ops *ops,
|
||||
enum vga_switcheroo_client_id id);
|
||||
struct pci_dev *vga_dev);
|
||||
|
||||
void vga_switcheroo_client_fb_set(struct pci_dev *dev,
|
||||
struct fb_info *info);
|
||||
@ -180,7 +180,7 @@ static inline int vga_switcheroo_register_handler(const struct vga_switcheroo_ha
|
||||
enum vga_switcheroo_handler_flags_t handler_flags) { return 0; }
|
||||
static inline int vga_switcheroo_register_audio_client(struct pci_dev *pdev,
|
||||
const struct vga_switcheroo_client_ops *ops,
|
||||
enum vga_switcheroo_client_id id) { return 0; }
|
||||
struct pci_dev *vga_dev) { return 0; }
|
||||
static inline void vga_switcheroo_unregister_handler(void) {}
|
||||
static inline enum vga_switcheroo_handler_flags_t vga_switcheroo_handler_flags(void) { return 0; }
|
||||
static inline int vga_switcheroo_lock_ddc(struct pci_dev *pdev) { return -ENODEV; }
|
||||
|
@ -1,10 +1,8 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Robert Jarzmik <robert.jarzmik@free.fr>
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* 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.
|
||||
* Copyright (C) 2016 Robert Jarzmik <robert.jarzmik@free.fr>
|
||||
*/
|
||||
|
||||
#ifndef __SOUND_AC97_CODEC2_H
|
||||
#define __SOUND_AC97_CODEC2_H
|
||||
|
||||
|
@ -1,14 +1,11 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Robert Jarzmik <robert.jarzmik@free.fr>
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* 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.
|
||||
* Copyright (C) 2016 Robert Jarzmik <robert.jarzmik@free.fr>
|
||||
*
|
||||
* This file is for backward compatibility with snd_ac97 structure and its
|
||||
* multiple usages, such as the snd_ac97_bus and snd_ac97_build_ops.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef AC97_COMPAT_H
|
||||
#define AC97_COMPAT_H
|
||||
|
||||
|
@ -1,10 +1,8 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Robert Jarzmik <robert.jarzmik@free.fr>
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* 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.
|
||||
* Copyright (C) 2016 Robert Jarzmik <robert.jarzmik@free.fr>
|
||||
*/
|
||||
|
||||
#ifndef AC97_CONTROLLER_H
|
||||
#define AC97_CONTROLLER_H
|
||||
|
||||
|
@ -1,27 +1,11 @@
|
||||
/*
|
||||
/* SPDX-License-Identifier: GPL-2.0+
|
||||
*
|
||||
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||
* Universal interface for Audio Codec '97
|
||||
*
|
||||
* For more details look to AC '97 component specification revision 2.1
|
||||
* by Intel Corporation (http://developer.intel.com).
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* AC'97 codec registers
|
||||
*/
|
||||
|
@ -1,30 +1,15 @@
|
||||
#ifndef __SOUND_AC97_CODEC_H
|
||||
#define __SOUND_AC97_CODEC_H
|
||||
|
||||
/*
|
||||
/* SPDX-License-Identifier: GPL-2.0+
|
||||
*
|
||||
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||
* Universal interface for Audio Codec '97
|
||||
*
|
||||
* For more details look to AC '97 component specification revision 2.1
|
||||
* by Intel Corporation (http://developer.intel.com).
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __SOUND_AC97_CODEC_H
|
||||
#define __SOUND_AC97_CODEC_H
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
@ -1,27 +1,12 @@
|
||||
/*
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* compress_driver.h - compress offload driver definations
|
||||
*
|
||||
* Copyright (C) 2011 Intel Corporation
|
||||
* Authors: Vinod Koul <vinod.koul@linux.intel.com>
|
||||
* Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __COMPRESS_DRIVER_H
|
||||
#define __COMPRESS_DRIVER_H
|
||||
|
||||
|
@ -1,17 +1,9 @@
|
||||
/*
|
||||
/* SPDX-License-Identifier: GPL-2.0+
|
||||
*
|
||||
* Copyright (C) 2012, Analog Devices Inc.
|
||||
* Author: Lars-Peter Clausen <lars@metafoo.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __SOUND_DMAENGINE_PCM_H__
|
||||
#define __SOUND_DMAENGINE_PCM_H__
|
||||
|
||||
|
61
include/sound/hda_component.h
Normal file
61
include/sound/hda_component.h
Normal file
@ -0,0 +1,61 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
// HD-Audio helpers to sync with DRM driver
|
||||
|
||||
#ifndef __SOUND_HDA_COMPONENT_H
|
||||
#define __SOUND_HDA_COMPONENT_H
|
||||
|
||||
#include <drm/drm_audio_component.h>
|
||||
|
||||
#ifdef CONFIG_SND_HDA_COMPONENT
|
||||
int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable);
|
||||
int snd_hdac_display_power(struct hdac_bus *bus, bool enable);
|
||||
int snd_hdac_sync_audio_rate(struct hdac_device *codec, hda_nid_t nid,
|
||||
int dev_id, int rate);
|
||||
int snd_hdac_acomp_get_eld(struct hdac_device *codec, hda_nid_t nid, int dev_id,
|
||||
bool *audio_enabled, char *buffer, int max_bytes);
|
||||
int snd_hdac_acomp_init(struct hdac_bus *bus,
|
||||
const struct drm_audio_component_audio_ops *aops,
|
||||
int (*match_master)(struct device *, void *),
|
||||
size_t extra_size);
|
||||
int snd_hdac_acomp_exit(struct hdac_bus *bus);
|
||||
int snd_hdac_acomp_register_notifier(struct hdac_bus *bus,
|
||||
const struct drm_audio_component_audio_ops *ops);
|
||||
#else
|
||||
static inline int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int snd_hdac_display_power(struct hdac_bus *bus, bool enable)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int snd_hdac_sync_audio_rate(struct hdac_device *codec,
|
||||
hda_nid_t nid, int dev_id, int rate)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int snd_hdac_acomp_get_eld(struct hdac_device *codec, hda_nid_t nid,
|
||||
int dev_id, bool *audio_enabled,
|
||||
char *buffer, int max_bytes)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static inline int snd_hdac_acomp_init(struct hdac_bus *bus,
|
||||
const struct drm_audio_component_audio_ops *aops,
|
||||
int (*match_master)(struct device *, void *),
|
||||
size_t extra_size)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static inline int snd_hdac_acomp_exit(struct hdac_bus *bus)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int snd_hdac_acomp_register_notifier(struct hdac_bus *bus,
|
||||
const struct drm_audio_component_audio_ops *ops)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __SOUND_HDA_COMPONENT_H */
|
@ -5,54 +5,23 @@
|
||||
#ifndef __SOUND_HDA_I915_H
|
||||
#define __SOUND_HDA_I915_H
|
||||
|
||||
#include <drm/i915_component.h>
|
||||
#include "hda_component.h"
|
||||
|
||||
#ifdef CONFIG_SND_HDA_I915
|
||||
int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable);
|
||||
int snd_hdac_display_power(struct hdac_bus *bus, bool enable);
|
||||
void snd_hdac_i915_set_bclk(struct hdac_bus *bus);
|
||||
int snd_hdac_sync_audio_rate(struct hdac_device *codec, hda_nid_t nid,
|
||||
int dev_id, int rate);
|
||||
int snd_hdac_acomp_get_eld(struct hdac_device *codec, hda_nid_t nid, int dev_id,
|
||||
bool *audio_enabled, char *buffer, int max_bytes);
|
||||
int snd_hdac_i915_init(struct hdac_bus *bus);
|
||||
int snd_hdac_i915_exit(struct hdac_bus *bus);
|
||||
int snd_hdac_i915_register_notifier(const struct i915_audio_component_audio_ops *);
|
||||
#else
|
||||
static inline int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int snd_hdac_display_power(struct hdac_bus *bus, bool enable)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void snd_hdac_i915_set_bclk(struct hdac_bus *bus)
|
||||
{
|
||||
}
|
||||
static inline int snd_hdac_sync_audio_rate(struct hdac_device *codec,
|
||||
hda_nid_t nid, int dev_id, int rate)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int snd_hdac_acomp_get_eld(struct hdac_device *codec, hda_nid_t nid,
|
||||
int dev_id, bool *audio_enabled,
|
||||
char *buffer, int max_bytes)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static inline int snd_hdac_i915_init(struct hdac_bus *bus)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
static inline int snd_hdac_i915_exit(struct hdac_bus *bus)
|
||||
{
|
||||
return 0;
|
||||
return snd_hdac_acomp_exit(bus);
|
||||
}
|
||||
static inline int snd_hdac_i915_register_notifier(const struct i915_audio_component_audio_ops *ops)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __SOUND_HDA_I915_H */
|
||||
|
@ -8,8 +8,10 @@
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/timecounter.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/memalloc.h>
|
||||
#include <sound/hda_verbs.h>
|
||||
#include <drm/i915_component.h>
|
||||
@ -132,7 +134,7 @@ int snd_hdac_get_sub_nodes(struct hdac_device *codec, hda_nid_t nid,
|
||||
hda_nid_t *start_id);
|
||||
unsigned int snd_hdac_calc_stream_format(unsigned int rate,
|
||||
unsigned int channels,
|
||||
unsigned int format,
|
||||
snd_pcm_format_t format,
|
||||
unsigned int maxbps,
|
||||
unsigned short spdif_ctls);
|
||||
int snd_hdac_query_supported_pcm(struct hdac_device *codec, hda_nid_t nid,
|
||||
@ -171,12 +173,38 @@ int snd_hdac_power_down(struct hdac_device *codec);
|
||||
int snd_hdac_power_up_pm(struct hdac_device *codec);
|
||||
int snd_hdac_power_down_pm(struct hdac_device *codec);
|
||||
int snd_hdac_keep_power_up(struct hdac_device *codec);
|
||||
|
||||
/* call this at entering into suspend/resume callbacks in codec driver */
|
||||
static inline void snd_hdac_enter_pm(struct hdac_device *codec)
|
||||
{
|
||||
atomic_inc(&codec->in_pm);
|
||||
}
|
||||
|
||||
/* call this at leaving from suspend/resume callbacks in codec driver */
|
||||
static inline void snd_hdac_leave_pm(struct hdac_device *codec)
|
||||
{
|
||||
atomic_dec(&codec->in_pm);
|
||||
}
|
||||
|
||||
static inline bool snd_hdac_is_in_pm(struct hdac_device *codec)
|
||||
{
|
||||
return atomic_read(&codec->in_pm);
|
||||
}
|
||||
|
||||
static inline bool snd_hdac_is_power_on(struct hdac_device *codec)
|
||||
{
|
||||
return !pm_runtime_suspended(&codec->dev);
|
||||
}
|
||||
#else
|
||||
static inline int snd_hdac_power_up(struct hdac_device *codec) { return 0; }
|
||||
static inline int snd_hdac_power_down(struct hdac_device *codec) { return 0; }
|
||||
static inline int snd_hdac_power_up_pm(struct hdac_device *codec) { return 0; }
|
||||
static inline int snd_hdac_power_down_pm(struct hdac_device *codec) { return 0; }
|
||||
static inline int snd_hdac_keep_power_up(struct hdac_device *codec) { return 0; }
|
||||
static inline void snd_hdac_enter_pm(struct hdac_device *codec) {}
|
||||
static inline void snd_hdac_leave_pm(struct hdac_device *codec) {}
|
||||
static inline bool snd_hdac_is_in_pm(struct hdac_device *codec) { return 0; }
|
||||
static inline bool snd_hdac_is_power_on(struct hdac_device *codec) { return 1; }
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -188,6 +216,11 @@ struct hdac_driver {
|
||||
const struct hda_device_id *id_table;
|
||||
int (*match)(struct hdac_device *dev, struct hdac_driver *drv);
|
||||
void (*unsol_event)(struct hdac_device *dev, unsigned int event);
|
||||
|
||||
/* fields used by ext bus APIs */
|
||||
int (*probe)(struct hdac_device *dev);
|
||||
int (*remove)(struct hdac_device *dev);
|
||||
void (*shutdown)(struct hdac_device *dev);
|
||||
};
|
||||
|
||||
#define drv_to_hdac_driver(_drv) container_of(_drv, struct hdac_driver, driver)
|
||||
@ -208,6 +241,14 @@ struct hdac_bus_ops {
|
||||
int (*link_power)(struct hdac_bus *bus, bool enable);
|
||||
};
|
||||
|
||||
/*
|
||||
* ops used for ASoC HDA codec drivers
|
||||
*/
|
||||
struct hdac_ext_bus_ops {
|
||||
int (*hdev_attach)(struct hdac_device *hdev);
|
||||
int (*hdev_detach)(struct hdac_device *hdev);
|
||||
};
|
||||
|
||||
/*
|
||||
* Lowlevel I/O operators
|
||||
*/
|
||||
@ -250,11 +291,17 @@ struct hdac_rb {
|
||||
* @mlcap: MultiLink capabilities pointer
|
||||
* @gtscap: gts capabilities pointer
|
||||
* @drsmcap: dma resume capabilities pointer
|
||||
* @num_streams: streams supported
|
||||
* @idx: HDA link index
|
||||
* @hlink_list: link list of HDA links
|
||||
* @lock: lock for link mgmt
|
||||
* @cmd_dma_state: state of cmd DMAs: CORB and RIRB
|
||||
*/
|
||||
struct hdac_bus {
|
||||
struct device *dev;
|
||||
const struct hdac_bus_ops *ops;
|
||||
const struct hdac_io_ops *io_ops;
|
||||
const struct hdac_ext_bus_ops *ext_ops;
|
||||
|
||||
/* h/w resources */
|
||||
unsigned long addr;
|
||||
@ -314,9 +361,19 @@ struct hdac_bus {
|
||||
spinlock_t reg_lock;
|
||||
struct mutex cmd_mutex;
|
||||
|
||||
/* i915 component interface */
|
||||
struct i915_audio_component *audio_component;
|
||||
int i915_power_refcount;
|
||||
/* DRM component interface */
|
||||
struct drm_audio_component *audio_component;
|
||||
int drm_power_refcount;
|
||||
|
||||
/* parameters required for enhanced capabilities */
|
||||
int num_streams;
|
||||
int idx;
|
||||
|
||||
struct list_head hlink_list;
|
||||
|
||||
struct mutex lock;
|
||||
bool cmd_dma_state;
|
||||
|
||||
};
|
||||
|
||||
int snd_hdac_bus_init(struct hdac_bus *bus, struct device *dev,
|
||||
|
@ -4,38 +4,16 @@
|
||||
|
||||
#include <sound/hdaudio.h>
|
||||
|
||||
/**
|
||||
* hdac_ext_bus: HDAC extended bus for extended HDA caps
|
||||
*
|
||||
* @bus: hdac bus
|
||||
* @num_streams: streams supported
|
||||
* @hlink_list: link list of HDA links
|
||||
* @lock: lock for link mgmt
|
||||
* @cmd_dma_state: state of cmd DMAs: CORB and RIRB
|
||||
*/
|
||||
struct hdac_ext_bus {
|
||||
struct hdac_bus bus;
|
||||
int num_streams;
|
||||
int idx;
|
||||
|
||||
struct list_head hlink_list;
|
||||
|
||||
struct mutex lock;
|
||||
bool cmd_dma_state;
|
||||
};
|
||||
|
||||
int snd_hdac_ext_bus_init(struct hdac_ext_bus *sbus, struct device *dev,
|
||||
int snd_hdac_ext_bus_init(struct hdac_bus *bus, struct device *dev,
|
||||
const struct hdac_bus_ops *ops,
|
||||
const struct hdac_io_ops *io_ops);
|
||||
const struct hdac_io_ops *io_ops,
|
||||
const struct hdac_ext_bus_ops *ext_ops);
|
||||
|
||||
void snd_hdac_ext_bus_exit(struct hdac_ext_bus *sbus);
|
||||
int snd_hdac_ext_bus_device_init(struct hdac_ext_bus *sbus, int addr);
|
||||
void snd_hdac_ext_bus_exit(struct hdac_bus *bus);
|
||||
int snd_hdac_ext_bus_device_init(struct hdac_bus *bus, int addr,
|
||||
struct hdac_device *hdev);
|
||||
void snd_hdac_ext_bus_device_exit(struct hdac_device *hdev);
|
||||
void snd_hdac_ext_bus_device_remove(struct hdac_ext_bus *ebus);
|
||||
|
||||
#define ebus_to_hbus(ebus) (&(ebus)->bus)
|
||||
#define hbus_to_ebus(_bus) \
|
||||
container_of(_bus, struct hdac_ext_bus, bus)
|
||||
void snd_hdac_ext_bus_device_remove(struct hdac_bus *bus);
|
||||
|
||||
#define HDA_CODEC_REV_EXT_ENTRY(_vid, _rev, _name, drv_data) \
|
||||
{ .vendor_id = (_vid), .rev_id = (_rev), .name = (_name), \
|
||||
@ -44,14 +22,14 @@ void snd_hdac_ext_bus_device_remove(struct hdac_ext_bus *ebus);
|
||||
#define HDA_CODEC_EXT_ENTRY(_vid, _revid, _name, _drv_data) \
|
||||
HDA_CODEC_REV_EXT_ENTRY(_vid, _revid, _name, _drv_data)
|
||||
|
||||
void snd_hdac_ext_bus_ppcap_enable(struct hdac_ext_bus *chip, bool enable);
|
||||
void snd_hdac_ext_bus_ppcap_int_enable(struct hdac_ext_bus *chip, bool enable);
|
||||
void snd_hdac_ext_bus_ppcap_enable(struct hdac_bus *chip, bool enable);
|
||||
void snd_hdac_ext_bus_ppcap_int_enable(struct hdac_bus *chip, bool enable);
|
||||
|
||||
void snd_hdac_ext_stream_spbcap_enable(struct hdac_ext_bus *chip,
|
||||
void snd_hdac_ext_stream_spbcap_enable(struct hdac_bus *chip,
|
||||
bool enable, int index);
|
||||
|
||||
int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_ext_bus *bus);
|
||||
struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_ext_bus *bus,
|
||||
int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_bus *bus);
|
||||
struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_bus *bus,
|
||||
const char *codec_name);
|
||||
|
||||
enum hdac_ext_stream_type {
|
||||
@ -100,28 +78,28 @@ struct hdac_ext_stream {
|
||||
#define stream_to_hdac_ext_stream(s) \
|
||||
container_of(s, struct hdac_ext_stream, hstream)
|
||||
|
||||
void snd_hdac_ext_stream_init(struct hdac_ext_bus *bus,
|
||||
void snd_hdac_ext_stream_init(struct hdac_bus *bus,
|
||||
struct hdac_ext_stream *stream, int idx,
|
||||
int direction, int tag);
|
||||
int snd_hdac_ext_stream_init_all(struct hdac_ext_bus *ebus, int start_idx,
|
||||
int snd_hdac_ext_stream_init_all(struct hdac_bus *bus, int start_idx,
|
||||
int num_stream, int dir);
|
||||
void snd_hdac_stream_free_all(struct hdac_ext_bus *ebus);
|
||||
void snd_hdac_link_free_all(struct hdac_ext_bus *ebus);
|
||||
struct hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_ext_bus *bus,
|
||||
void snd_hdac_stream_free_all(struct hdac_bus *bus);
|
||||
void snd_hdac_link_free_all(struct hdac_bus *bus);
|
||||
struct hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_bus *bus,
|
||||
struct snd_pcm_substream *substream,
|
||||
int type);
|
||||
void snd_hdac_ext_stream_release(struct hdac_ext_stream *azx_dev, int type);
|
||||
void snd_hdac_ext_stream_decouple(struct hdac_ext_bus *bus,
|
||||
void snd_hdac_ext_stream_decouple(struct hdac_bus *bus,
|
||||
struct hdac_ext_stream *azx_dev, bool decouple);
|
||||
void snd_hdac_ext_stop_streams(struct hdac_ext_bus *sbus);
|
||||
void snd_hdac_ext_stop_streams(struct hdac_bus *bus);
|
||||
|
||||
int snd_hdac_ext_stream_set_spib(struct hdac_ext_bus *ebus,
|
||||
int snd_hdac_ext_stream_set_spib(struct hdac_bus *bus,
|
||||
struct hdac_ext_stream *stream, u32 value);
|
||||
int snd_hdac_ext_stream_get_spbmaxfifo(struct hdac_ext_bus *ebus,
|
||||
int snd_hdac_ext_stream_get_spbmaxfifo(struct hdac_bus *bus,
|
||||
struct hdac_ext_stream *stream);
|
||||
void snd_hdac_ext_stream_drsm_enable(struct hdac_ext_bus *ebus,
|
||||
void snd_hdac_ext_stream_drsm_enable(struct hdac_bus *bus,
|
||||
bool enable, int index);
|
||||
int snd_hdac_ext_stream_set_dpibr(struct hdac_ext_bus *ebus,
|
||||
int snd_hdac_ext_stream_set_dpibr(struct hdac_bus *bus,
|
||||
struct hdac_ext_stream *stream, u32 value);
|
||||
int snd_hdac_ext_stream_set_lpib(struct hdac_ext_stream *stream, u32 value);
|
||||
|
||||
@ -144,17 +122,15 @@ struct hdac_ext_link {
|
||||
|
||||
int snd_hdac_ext_bus_link_power_up(struct hdac_ext_link *link);
|
||||
int snd_hdac_ext_bus_link_power_down(struct hdac_ext_link *link);
|
||||
int snd_hdac_ext_bus_link_power_up_all(struct hdac_ext_bus *ebus);
|
||||
int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus);
|
||||
int snd_hdac_ext_bus_link_power_up_all(struct hdac_bus *bus);
|
||||
int snd_hdac_ext_bus_link_power_down_all(struct hdac_bus *bus);
|
||||
void snd_hdac_ext_link_set_stream_id(struct hdac_ext_link *link,
|
||||
int stream);
|
||||
void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link,
|
||||
int stream);
|
||||
|
||||
int snd_hdac_ext_bus_link_get(struct hdac_ext_bus *ebus,
|
||||
struct hdac_ext_link *link);
|
||||
int snd_hdac_ext_bus_link_put(struct hdac_ext_bus *ebus,
|
||||
struct hdac_ext_link *link);
|
||||
int snd_hdac_ext_bus_link_get(struct hdac_bus *bus, struct hdac_ext_link *link);
|
||||
int snd_hdac_ext_bus_link_put(struct hdac_bus *bus, struct hdac_ext_link *link);
|
||||
|
||||
/* update register macro */
|
||||
#define snd_hdac_updatel(addr, reg, mask, val) \
|
||||
@ -181,53 +157,12 @@ struct hda_dai_map {
|
||||
u32 maxbps;
|
||||
};
|
||||
|
||||
#define HDA_MAX_NIDS 16
|
||||
|
||||
/**
|
||||
* struct hdac_ext_device - HDAC Ext device
|
||||
*
|
||||
* @hdac: hdac core device
|
||||
* @nid_list - the dai map which matches the dai-name with the nid
|
||||
* @map_cur_idx - the idx in use in dai_map
|
||||
* @ops - the hda codec ops common to all codec drivers
|
||||
* @pvt_data - private data, for asoc contains asoc codec object
|
||||
*/
|
||||
struct hdac_ext_device {
|
||||
struct hdac_device hdev;
|
||||
struct hdac_ext_bus *ebus;
|
||||
|
||||
/* soc-dai to nid map */
|
||||
struct hda_dai_map nid_list[HDA_MAX_NIDS];
|
||||
unsigned int map_cur_idx;
|
||||
|
||||
/* codec ops */
|
||||
struct hdac_ext_codec_ops ops;
|
||||
|
||||
struct snd_card *card;
|
||||
void *scodec;
|
||||
void *private_data;
|
||||
};
|
||||
|
||||
struct hdac_ext_dma_params {
|
||||
u32 format;
|
||||
u8 stream_tag;
|
||||
};
|
||||
#define to_ehdac_device(dev) (container_of((dev), \
|
||||
struct hdac_ext_device, hdev))
|
||||
/*
|
||||
* HD-audio codec base driver
|
||||
*/
|
||||
struct hdac_ext_driver {
|
||||
struct hdac_driver hdac;
|
||||
|
||||
int (*probe)(struct hdac_ext_device *dev);
|
||||
int (*remove)(struct hdac_ext_device *dev);
|
||||
void (*shutdown)(struct hdac_ext_device *dev);
|
||||
};
|
||||
|
||||
int snd_hda_ext_driver_register(struct hdac_ext_driver *drv);
|
||||
void snd_hda_ext_driver_unregister(struct hdac_ext_driver *drv);
|
||||
|
||||
#define to_ehdac_driver(_drv) container_of(_drv, struct hdac_ext_driver, hdac)
|
||||
int snd_hda_ext_driver_register(struct hdac_driver *drv);
|
||||
void snd_hda_ext_driver_unregister(struct hdac_driver *drv);
|
||||
|
||||
#endif /* __SOUND_HDAUDIO_EXT_H */
|
||||
|
@ -24,6 +24,8 @@
|
||||
#ifndef __SOUND_MEMALLOC_H
|
||||
#define __SOUND_MEMALLOC_H
|
||||
|
||||
#include <asm/page.h>
|
||||
|
||||
struct device;
|
||||
|
||||
/*
|
||||
@ -67,6 +69,14 @@ struct snd_dma_buffer {
|
||||
void *private_data; /* private for allocator; don't touch */
|
||||
};
|
||||
|
||||
/*
|
||||
* return the pages matching with the given byte size
|
||||
*/
|
||||
static inline unsigned int snd_sgbuf_aligned_pages(size_t size)
|
||||
{
|
||||
return (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SND_DMA_SGBUF
|
||||
/*
|
||||
* Scatter-Gather generic device pages
|
||||
@ -90,14 +100,6 @@ struct snd_sg_buf {
|
||||
struct device *dev;
|
||||
};
|
||||
|
||||
/*
|
||||
* return the pages matching with the given byte size
|
||||
*/
|
||||
static inline unsigned int snd_sgbuf_aligned_pages(size_t size)
|
||||
{
|
||||
return (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
}
|
||||
|
||||
/*
|
||||
* return the physical address at the corresponding offset
|
||||
*/
|
||||
|
@ -462,6 +462,7 @@ struct snd_pcm_substream {
|
||||
/* -- timer section -- */
|
||||
struct snd_timer *timer; /* timer */
|
||||
unsigned timer_running: 1; /* time is running */
|
||||
long wait_time; /* time in ms for R/W to wait for avail */
|
||||
/* -- next substream -- */
|
||||
struct snd_pcm_substream *next;
|
||||
/* -- linked substreams -- */
|
||||
@ -1089,14 +1090,14 @@ static inline snd_pcm_sframes_t
|
||||
snd_pcm_lib_write(struct snd_pcm_substream *substream,
|
||||
const void __user *buf, snd_pcm_uframes_t frames)
|
||||
{
|
||||
return __snd_pcm_lib_xfer(substream, (void *)buf, true, frames, false);
|
||||
return __snd_pcm_lib_xfer(substream, (void __force *)buf, true, frames, false);
|
||||
}
|
||||
|
||||
static inline snd_pcm_sframes_t
|
||||
snd_pcm_lib_read(struct snd_pcm_substream *substream,
|
||||
void __user *buf, snd_pcm_uframes_t frames)
|
||||
{
|
||||
return __snd_pcm_lib_xfer(substream, (void *)buf, true, frames, false);
|
||||
return __snd_pcm_lib_xfer(substream, (void __force *)buf, true, frames, false);
|
||||
}
|
||||
|
||||
static inline snd_pcm_sframes_t
|
||||
@ -1341,8 +1342,6 @@ int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, struct vm_area_s
|
||||
#define snd_pcm_lib_mmap_iomem NULL
|
||||
#endif
|
||||
|
||||
#define snd_pcm_lib_mmap_vmalloc NULL
|
||||
|
||||
/**
|
||||
* snd_pcm_limit_isa_dma_size - Get the max size fitting with ISA DMA transfer
|
||||
* @dma: DMA number
|
||||
|
@ -87,6 +87,13 @@ static inline void snd_mask_set(struct snd_mask *mask, unsigned int val)
|
||||
mask->bits[MASK_OFS(val)] |= MASK_BIT(val);
|
||||
}
|
||||
|
||||
/* Most of drivers need only this one */
|
||||
static inline void snd_mask_set_format(struct snd_mask *mask,
|
||||
snd_pcm_format_t format)
|
||||
{
|
||||
snd_mask_set(mask, (__force unsigned int)format);
|
||||
}
|
||||
|
||||
static inline void snd_mask_reset(struct snd_mask *mask, unsigned int val)
|
||||
{
|
||||
mask->bits[MASK_OFS(val)] &= ~MASK_BIT(val);
|
||||
@ -369,8 +376,7 @@ static inline int params_physical_width(const struct snd_pcm_hw_params *p)
|
||||
static inline void
|
||||
params_set_format(struct snd_pcm_hw_params *p, snd_pcm_format_t fmt)
|
||||
{
|
||||
snd_mask_set(hw_param_mask(p, SNDRV_PCM_HW_PARAM_FORMAT),
|
||||
(__force int)fmt);
|
||||
snd_mask_set_format(hw_param_mask(p, SNDRV_PCM_HW_PARAM_FORMAT), fmt);
|
||||
}
|
||||
|
||||
#endif /* __SOUND_PCM_PARAMS_H */
|
||||
|
@ -8,20 +8,23 @@
|
||||
/* PCM */
|
||||
struct snd_pcm_substream;
|
||||
struct snd_pcm_hw_params;
|
||||
struct snd_soc_pcm_runtime;
|
||||
struct snd_pcm;
|
||||
|
||||
extern int __pxa2xx_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
extern int pxa2xx_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params);
|
||||
extern int __pxa2xx_pcm_hw_free(struct snd_pcm_substream *substream);
|
||||
extern int pxa2xx_pcm_hw_free(struct snd_pcm_substream *substream);
|
||||
extern int pxa2xx_pcm_trigger(struct snd_pcm_substream *substream, int cmd);
|
||||
extern snd_pcm_uframes_t pxa2xx_pcm_pointer(struct snd_pcm_substream *substream);
|
||||
extern int __pxa2xx_pcm_prepare(struct snd_pcm_substream *substream);
|
||||
extern int __pxa2xx_pcm_open(struct snd_pcm_substream *substream);
|
||||
extern int __pxa2xx_pcm_close(struct snd_pcm_substream *substream);
|
||||
extern int pxa2xx_pcm_prepare(struct snd_pcm_substream *substream);
|
||||
extern int pxa2xx_pcm_open(struct snd_pcm_substream *substream);
|
||||
extern int pxa2xx_pcm_close(struct snd_pcm_substream *substream);
|
||||
extern int pxa2xx_pcm_mmap(struct snd_pcm_substream *substream,
|
||||
struct vm_area_struct *vma);
|
||||
extern int pxa2xx_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream);
|
||||
extern void pxa2xx_pcm_free_dma_buffers(struct snd_pcm *pcm);
|
||||
extern int pxa2xx_soc_pcm_new(struct snd_soc_pcm_runtime *rtd);
|
||||
extern const struct snd_pcm_ops pxa2xx_pcm_ops;
|
||||
|
||||
/* AC97 */
|
||||
|
||||
|
40
include/sound/rt5682.h
Normal file
40
include/sound/rt5682.h
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* linux/sound/rt5682.h -- Platform data for RT5682
|
||||
*
|
||||
* Copyright 2018 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_RT5682_H
|
||||
#define __LINUX_SND_RT5682_H
|
||||
|
||||
enum rt5682_dmic1_data_pin {
|
||||
RT5682_DMIC1_NULL,
|
||||
RT5682_DMIC1_DATA_GPIO2,
|
||||
RT5682_DMIC1_DATA_GPIO5,
|
||||
};
|
||||
|
||||
enum rt5682_dmic1_clk_pin {
|
||||
RT5682_DMIC1_CLK_GPIO1,
|
||||
RT5682_DMIC1_CLK_GPIO3,
|
||||
};
|
||||
|
||||
enum rt5682_jd_src {
|
||||
RT5682_JD_NULL,
|
||||
RT5682_JD1,
|
||||
};
|
||||
|
||||
struct rt5682_platform_data {
|
||||
|
||||
int ldo1_en; /* GPIO for LDO1_EN */
|
||||
|
||||
enum rt5682_dmic1_data_pin dmic1_data_pin;
|
||||
enum rt5682_dmic1_clk_pin dmic1_clk_pin;
|
||||
enum rt5682_jd_src jd_src;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -46,7 +46,7 @@ enum {
|
||||
struct snd_sb_csp_ops {
|
||||
int (*csp_use) (struct snd_sb_csp * p);
|
||||
int (*csp_unuse) (struct snd_sb_csp * p);
|
||||
int (*csp_autoload) (struct snd_sb_csp * p, int pcm_sfmt, int play_rec_mode);
|
||||
int (*csp_autoload) (struct snd_sb_csp * p, snd_pcm_format_t pcm_sfmt, int play_rec_mode);
|
||||
int (*csp_start) (struct snd_sb_csp * p, int sample_width, int channels);
|
||||
int (*csp_stop) (struct snd_sb_csp * p);
|
||||
int (*csp_qsound_transfer) (struct snd_sb_csp * p);
|
||||
|
@ -43,10 +43,8 @@ void snd_midi_event_free(struct snd_midi_event *dev);
|
||||
void snd_midi_event_reset_encode(struct snd_midi_event *dev);
|
||||
void snd_midi_event_reset_decode(struct snd_midi_event *dev);
|
||||
void snd_midi_event_no_status(struct snd_midi_event *dev, int on);
|
||||
/* encode from byte stream - return number of written bytes if success */
|
||||
long snd_midi_event_encode(struct snd_midi_event *dev, unsigned char *buf, long count,
|
||||
struct snd_seq_event *ev);
|
||||
int snd_midi_event_encode_byte(struct snd_midi_event *dev, int c, struct snd_seq_event *ev);
|
||||
bool snd_midi_event_encode_byte(struct snd_midi_event *dev, unsigned char c,
|
||||
struct snd_seq_event *ev);
|
||||
/* decode from event to bytes - return number of written bytes if success */
|
||||
long snd_midi_event_decode(struct snd_midi_event *dev, unsigned char *buf, long count,
|
||||
struct snd_seq_event *ev);
|
||||
|
@ -36,11 +36,12 @@ struct snd_virmidi {
|
||||
int seq_mode;
|
||||
int client;
|
||||
int port;
|
||||
unsigned int trigger: 1;
|
||||
bool trigger;
|
||||
struct snd_midi_event *parser;
|
||||
struct snd_seq_event event;
|
||||
struct snd_virmidi_dev *rdev;
|
||||
struct snd_rawmidi_substream *substream;
|
||||
struct work_struct output_work;
|
||||
};
|
||||
|
||||
#define SNDRV_VIRMIDI_SUBSCRIBE (1<<0)
|
||||
|
@ -1,16 +1,13 @@
|
||||
#ifndef __SOUND_FSI_H
|
||||
#define __SOUND_FSI_H
|
||||
|
||||
/*
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* Fifo-attached Serial Interface (FSI) support for SH7724
|
||||
*
|
||||
* Copyright (C) 2009 Renesas Solutions Corp.
|
||||
* Kuninori Morimoto <morimoto.kuninori@renesas.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef __SOUND_FSI_H
|
||||
#define __SOUND_FSI_H
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <sound/soc.h>
|
||||
|
||||
|
@ -1,12 +1,9 @@
|
||||
/*
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* ASoC simple sound card support
|
||||
*
|
||||
* Copyright (C) 2012 Renesas Solutions Corp.
|
||||
* Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __SIMPLE_CARD_H
|
||||
|
@ -1,17 +1,20 @@
|
||||
/*
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* simple_card_utils.h
|
||||
*
|
||||
* Copyright (c) 2016 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __SIMPLE_CARD_UTILS_H
|
||||
#define __SIMPLE_CARD_UTILS_H
|
||||
|
||||
#include <sound/soc.h>
|
||||
|
||||
#define asoc_simple_card_init_hp(card, sjack, prefix) \
|
||||
asoc_simple_card_init_jack(card, sjack, 1, prefix)
|
||||
#define asoc_simple_card_init_mic(card, sjack, prefix) \
|
||||
asoc_simple_card_init_jack(card, sjack, 0, prefix)
|
||||
|
||||
struct asoc_simple_dai {
|
||||
const char *name;
|
||||
unsigned int sysclk;
|
||||
@ -28,6 +31,12 @@ struct asoc_simple_card_data {
|
||||
u32 convert_channels;
|
||||
};
|
||||
|
||||
struct asoc_simple_jack {
|
||||
struct snd_soc_jack jack;
|
||||
struct snd_soc_jack_pin pin;
|
||||
struct snd_soc_jack_gpio gpio;
|
||||
};
|
||||
|
||||
int asoc_simple_card_parse_daifmt(struct device *dev,
|
||||
struct device_node *node,
|
||||
struct device_node *codec,
|
||||
@ -107,4 +116,8 @@ int asoc_simple_card_of_parse_routing(struct snd_soc_card *card,
|
||||
int asoc_simple_card_of_parse_widgets(struct snd_soc_card *card,
|
||||
char *prefix);
|
||||
|
||||
int asoc_simple_card_init_jack(struct snd_soc_card *card,
|
||||
struct asoc_simple_jack *sjack,
|
||||
int is_hp, char *prefix);
|
||||
|
||||
#endif /* __SIMPLE_CARD_UTILS_H */
|
||||
|
@ -1,16 +1,6 @@
|
||||
|
||||
/*
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* Copyright (C) 2017, Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version
|
||||
* 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_SND_SOC_ACPI_INTEL_MATCH_H
|
||||
@ -29,5 +19,10 @@ extern struct snd_soc_acpi_mach snd_soc_acpi_intel_broadwell_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_baytrail_legacy_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_baytrail_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_cherrytrail_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_skl_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_kbl_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_bxt_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_glk_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_cnl_machines[];
|
||||
|
||||
#endif
|
||||
|
@ -1,15 +1,6 @@
|
||||
/*
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* Copyright (C) 2013-15, Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version
|
||||
* 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_SND_SOC_ACPI_H
|
||||
|
@ -1,12 +1,9 @@
|
||||
/*
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* linux/sound/soc-dai.h -- ALSA SoC Layer
|
||||
*
|
||||
* Copyright: 2005-2008 Wolfson Microelectronics. PLC.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Digital Audio Interface (DAI) API.
|
||||
*/
|
||||
|
||||
@ -141,6 +138,11 @@ int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate);
|
||||
int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute,
|
||||
int direction);
|
||||
|
||||
|
||||
int snd_soc_dai_get_channel_map(struct snd_soc_dai *dai,
|
||||
unsigned int *tx_num, unsigned int *tx_slot,
|
||||
unsigned int *rx_num, unsigned int *rx_slot);
|
||||
|
||||
int snd_soc_dai_is_dummy(struct snd_soc_dai *dai);
|
||||
|
||||
struct snd_soc_dai_ops {
|
||||
@ -168,6 +170,9 @@ struct snd_soc_dai_ops {
|
||||
int (*set_channel_map)(struct snd_soc_dai *dai,
|
||||
unsigned int tx_num, unsigned int *tx_slot,
|
||||
unsigned int rx_num, unsigned int *rx_slot);
|
||||
int (*get_channel_map)(struct snd_soc_dai *dai,
|
||||
unsigned int *tx_num, unsigned int *tx_slot,
|
||||
unsigned int *rx_num, unsigned int *rx_slot);
|
||||
int (*set_tristate)(struct snd_soc_dai *dai, int tristate);
|
||||
|
||||
int (*set_sdw_stream)(struct snd_soc_dai *dai,
|
||||
|
@ -1,13 +1,10 @@
|
||||
/*
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* linux/sound/soc-dapm.h -- ALSA SoC Dynamic Audio Power Management
|
||||
*
|
||||
* Author: Liam Girdwood
|
||||
* Created: Aug 11th 2005
|
||||
* Author: Liam Girdwood
|
||||
* Created: Aug 11th 2005
|
||||
* Copyright: Wolfson Microelectronics. PLC.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_SND_SOC_DAPM_H
|
||||
|
@ -1,11 +1,8 @@
|
||||
/*
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* linux/sound/soc-dpcm.h -- ALSA SoC Dynamic PCM Support
|
||||
*
|
||||
* Author: Liam Girdwood <lrg@ti.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_SND_SOC_DPCM_H
|
||||
|
@ -1,13 +1,10 @@
|
||||
/*
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* linux/sound/soc-topology.h -- ALSA SoC Firmware Controls and DAPM
|
||||
*
|
||||
* Copyright (C) 2012 Texas Instruments Inc.
|
||||
* Copyright (C) 2015 Intel Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Simple file API to load FW that includes mixers, coefficients, DAPM graphs,
|
||||
* algorithms, equalisers, DAIs, widgets, FE caps, BE caps, codec link caps etc.
|
||||
*/
|
||||
@ -30,6 +27,9 @@ struct snd_soc_dapm_context;
|
||||
struct snd_soc_card;
|
||||
struct snd_kcontrol_new;
|
||||
struct snd_soc_dai_link;
|
||||
struct snd_soc_dai_driver;
|
||||
struct snd_soc_dai;
|
||||
struct snd_soc_dapm_route;
|
||||
|
||||
/* object scan be loaded and unloaded in groups with identfying indexes */
|
||||
#define SND_SOC_TPLG_INDEX_ALL 0 /* ID that matches all FW objects */
|
||||
@ -109,35 +109,44 @@ struct snd_soc_tplg_widget_events {
|
||||
struct snd_soc_tplg_ops {
|
||||
|
||||
/* external kcontrol init - used for any driver specific init */
|
||||
int (*control_load)(struct snd_soc_component *,
|
||||
int (*control_load)(struct snd_soc_component *, int index,
|
||||
struct snd_kcontrol_new *, struct snd_soc_tplg_ctl_hdr *);
|
||||
int (*control_unload)(struct snd_soc_component *,
|
||||
struct snd_soc_dobj *);
|
||||
|
||||
/* DAPM graph route element loading and unloading */
|
||||
int (*dapm_route_load)(struct snd_soc_component *, int index,
|
||||
struct snd_soc_dapm_route *route);
|
||||
int (*dapm_route_unload)(struct snd_soc_component *,
|
||||
struct snd_soc_dobj *);
|
||||
|
||||
/* external widget init - used for any driver specific init */
|
||||
int (*widget_load)(struct snd_soc_component *,
|
||||
int (*widget_load)(struct snd_soc_component *, int index,
|
||||
struct snd_soc_dapm_widget *,
|
||||
struct snd_soc_tplg_dapm_widget *);
|
||||
int (*widget_ready)(struct snd_soc_component *,
|
||||
int (*widget_ready)(struct snd_soc_component *, int index,
|
||||
struct snd_soc_dapm_widget *,
|
||||
struct snd_soc_tplg_dapm_widget *);
|
||||
int (*widget_unload)(struct snd_soc_component *,
|
||||
struct snd_soc_dobj *);
|
||||
|
||||
/* FE DAI - used for any driver specific init */
|
||||
int (*dai_load)(struct snd_soc_component *,
|
||||
struct snd_soc_dai_driver *dai_drv);
|
||||
int (*dai_load)(struct snd_soc_component *, int index,
|
||||
struct snd_soc_dai_driver *dai_drv,
|
||||
struct snd_soc_tplg_pcm *pcm, struct snd_soc_dai *dai);
|
||||
|
||||
int (*dai_unload)(struct snd_soc_component *,
|
||||
struct snd_soc_dobj *);
|
||||
|
||||
/* DAI link - used for any driver specific init */
|
||||
int (*link_load)(struct snd_soc_component *,
|
||||
struct snd_soc_dai_link *link);
|
||||
int (*link_load)(struct snd_soc_component *, int index,
|
||||
struct snd_soc_dai_link *link,
|
||||
struct snd_soc_tplg_link_config *cfg);
|
||||
int (*link_unload)(struct snd_soc_component *,
|
||||
struct snd_soc_dobj *);
|
||||
|
||||
/* callback to handle vendor bespoke data */
|
||||
int (*vendor_load)(struct snd_soc_component *,
|
||||
int (*vendor_load)(struct snd_soc_component *, int index,
|
||||
struct snd_soc_tplg_hdr *);
|
||||
int (*vendor_unload)(struct snd_soc_component *,
|
||||
struct snd_soc_tplg_hdr *);
|
||||
@ -146,7 +155,7 @@ struct snd_soc_tplg_ops {
|
||||
void (*complete)(struct snd_soc_component *);
|
||||
|
||||
/* manifest - optional to inform component of manifest */
|
||||
int (*manifest)(struct snd_soc_component *,
|
||||
int (*manifest)(struct snd_soc_component *, int index,
|
||||
struct snd_soc_tplg_manifest *);
|
||||
|
||||
/* vendor specific kcontrol handlers available for binding */
|
||||
|
@ -1,13 +1,10 @@
|
||||
/*
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* linux/sound/soc.h -- ALSA SoC Layer
|
||||
*
|
||||
* Author: Liam Girdwood
|
||||
* Created: Aug 11th 2005
|
||||
* Author: Liam Girdwood
|
||||
* Created: Aug 11th 2005
|
||||
* Copyright: Wolfson Microelectronics. PLC.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_SND_SOC_H
|
||||
@ -806,6 +803,14 @@ struct snd_soc_component_driver {
|
||||
unsigned int use_pmdown_time:1; /* care pmdown_time at stop */
|
||||
unsigned int endianness:1;
|
||||
unsigned int non_legacy_dai_naming:1;
|
||||
|
||||
/* this component uses topology and ignore machine driver FEs */
|
||||
const char *ignore_machine;
|
||||
const char *topology_name_prefix;
|
||||
int (*be_hw_params_fixup)(struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_pcm_hw_params *params);
|
||||
bool use_dai_pcm_id; /* use the DAI link PCM ID as PCM device number */
|
||||
int be_pcm_base; /* base device ID for all BE PCMs */
|
||||
};
|
||||
|
||||
struct snd_soc_component {
|
||||
@ -957,10 +962,17 @@ struct snd_soc_dai_link {
|
||||
|
||||
/* DPCM used FE & BE merged format */
|
||||
unsigned int dpcm_merged_format:1;
|
||||
/* DPCM used FE & BE merged channel */
|
||||
unsigned int dpcm_merged_chan:1;
|
||||
/* DPCM used FE & BE merged rate */
|
||||
unsigned int dpcm_merged_rate:1;
|
||||
|
||||
/* pmdown_time is ignored at stop */
|
||||
unsigned int ignore_pmdown_time:1;
|
||||
|
||||
/* Do not create a PCM for this DAI link (Backend link) */
|
||||
unsigned int ignore:1;
|
||||
|
||||
struct list_head list; /* DAI link list of the soc card */
|
||||
struct snd_soc_dobj dobj; /* For topology */
|
||||
};
|
||||
@ -1000,6 +1012,7 @@ struct snd_soc_card {
|
||||
const char *long_name;
|
||||
const char *driver_name;
|
||||
char dmi_longname[80];
|
||||
char topology_shortname[32];
|
||||
|
||||
struct device *dev;
|
||||
struct snd_card *snd_card;
|
||||
@ -1009,6 +1022,7 @@ struct snd_soc_card {
|
||||
struct mutex dapm_mutex;
|
||||
|
||||
bool instantiated;
|
||||
bool topology_shortname_created;
|
||||
|
||||
int (*probe)(struct snd_soc_card *card);
|
||||
int (*late_probe)(struct snd_soc_card *card);
|
||||
@ -1412,6 +1426,9 @@ int snd_soc_of_parse_card_name(struct snd_soc_card *card,
|
||||
const char *propname);
|
||||
int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card,
|
||||
const char *propname);
|
||||
int snd_soc_of_get_slot_mask(struct device_node *np,
|
||||
const char *prop_name,
|
||||
unsigned int *mask);
|
||||
int snd_soc_of_parse_tdm_slot(struct device_node *np,
|
||||
unsigned int *tx_mask,
|
||||
unsigned int *rx_mask,
|
||||
|
@ -192,6 +192,42 @@ DEFINE_EVENT(clk_phase, clk_set_phase_complete,
|
||||
TP_ARGS(core, phase)
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(clk_duty_cycle,
|
||||
|
||||
TP_PROTO(struct clk_core *core, struct clk_duty *duty),
|
||||
|
||||
TP_ARGS(core, duty),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string( name, core->name )
|
||||
__field( unsigned int, num )
|
||||
__field( unsigned int, den )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(name, core->name);
|
||||
__entry->num = duty->num;
|
||||
__entry->den = duty->den;
|
||||
),
|
||||
|
||||
TP_printk("%s %u/%u", __get_str(name), (unsigned int)__entry->num,
|
||||
(unsigned int)__entry->den)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(clk_duty_cycle, clk_set_duty_cycle,
|
||||
|
||||
TP_PROTO(struct clk_core *core, struct clk_duty *duty),
|
||||
|
||||
TP_ARGS(core, duty)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(clk_duty_cycle, clk_set_duty_cycle_complete,
|
||||
|
||||
TP_PROTO(struct clk_core *core, struct clk_duty *duty),
|
||||
|
||||
TP_ARGS(core, duty)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_CLK_H */
|
||||
|
||||
/* This part must be outside protection */
|
||||
|
@ -390,33 +390,64 @@ static inline __u8 uac_processing_unit_iChannelNames(struct uac_processing_unit_
|
||||
static inline __u8 uac_processing_unit_bControlSize(struct uac_processing_unit_descriptor *desc,
|
||||
int protocol)
|
||||
{
|
||||
return (protocol == UAC_VERSION_1) ?
|
||||
desc->baSourceID[desc->bNrInPins + 4] :
|
||||
2; /* in UAC2, this value is constant */
|
||||
switch (protocol) {
|
||||
case UAC_VERSION_1:
|
||||
return desc->baSourceID[desc->bNrInPins + 4];
|
||||
case UAC_VERSION_2:
|
||||
return 2; /* in UAC2, this value is constant */
|
||||
case UAC_VERSION_3:
|
||||
return 4; /* in UAC3, this value is constant */
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static inline __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_descriptor *desc,
|
||||
int protocol)
|
||||
{
|
||||
return (protocol == UAC_VERSION_1) ?
|
||||
&desc->baSourceID[desc->bNrInPins + 5] :
|
||||
&desc->baSourceID[desc->bNrInPins + 6];
|
||||
switch (protocol) {
|
||||
case UAC_VERSION_1:
|
||||
return &desc->baSourceID[desc->bNrInPins + 5];
|
||||
case UAC_VERSION_2:
|
||||
return &desc->baSourceID[desc->bNrInPins + 6];
|
||||
case UAC_VERSION_3:
|
||||
return &desc->baSourceID[desc->bNrInPins + 2];
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static inline __u8 uac_processing_unit_iProcessing(struct uac_processing_unit_descriptor *desc,
|
||||
int protocol)
|
||||
{
|
||||
__u8 control_size = uac_processing_unit_bControlSize(desc, protocol);
|
||||
return *(uac_processing_unit_bmControls(desc, protocol)
|
||||
+ control_size);
|
||||
|
||||
switch (protocol) {
|
||||
case UAC_VERSION_1:
|
||||
case UAC_VERSION_2:
|
||||
default:
|
||||
return *(uac_processing_unit_bmControls(desc, protocol)
|
||||
+ control_size);
|
||||
case UAC_VERSION_3:
|
||||
return 0; /* UAC3 does not have this field */
|
||||
}
|
||||
}
|
||||
|
||||
static inline __u8 *uac_processing_unit_specific(struct uac_processing_unit_descriptor *desc,
|
||||
int protocol)
|
||||
{
|
||||
__u8 control_size = uac_processing_unit_bControlSize(desc, protocol);
|
||||
return uac_processing_unit_bmControls(desc, protocol)
|
||||
|
||||
switch (protocol) {
|
||||
case UAC_VERSION_1:
|
||||
case UAC_VERSION_2:
|
||||
default:
|
||||
return uac_processing_unit_bmControls(desc, protocol)
|
||||
+ control_size + 1;
|
||||
case UAC_VERSION_3:
|
||||
return uac_processing_unit_bmControls(desc, protocol)
|
||||
+ control_size;
|
||||
}
|
||||
}
|
||||
|
||||
/* 4.5.2 Class-Specific AS Interface Descriptor */
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <linux/idr.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/slab.h>
|
||||
@ -68,6 +69,27 @@ ac97_codec_find(struct ac97_controller *ac97_ctrl, unsigned int codec_num)
|
||||
return ac97_ctrl->codecs[codec_num];
|
||||
}
|
||||
|
||||
static struct device_node *
|
||||
ac97_of_get_child_device(struct ac97_controller *ac97_ctrl, int idx,
|
||||
unsigned int vendor_id)
|
||||
{
|
||||
struct device_node *node;
|
||||
u32 reg;
|
||||
char compat[] = "ac97,0000,0000";
|
||||
|
||||
snprintf(compat, sizeof(compat), "ac97,%04x,%04x",
|
||||
vendor_id >> 16, vendor_id & 0xffff);
|
||||
|
||||
for_each_child_of_node(ac97_ctrl->parent->of_node, node) {
|
||||
if ((idx != of_property_read_u32(node, "reg", ®)) ||
|
||||
!of_device_is_compatible(node, compat))
|
||||
continue;
|
||||
return of_node_get(node);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void ac97_codec_release(struct device *dev)
|
||||
{
|
||||
struct ac97_codec_device *adev;
|
||||
@ -76,6 +98,7 @@ static void ac97_codec_release(struct device *dev)
|
||||
adev = to_ac97_device(dev);
|
||||
ac97_ctrl = adev->ac97_ctrl;
|
||||
ac97_ctrl->codecs[adev->num] = NULL;
|
||||
of_node_put(dev->of_node);
|
||||
kfree(adev);
|
||||
}
|
||||
|
||||
@ -98,6 +121,8 @@ static int ac97_codec_add(struct ac97_controller *ac97_ctrl, int idx,
|
||||
|
||||
device_initialize(&codec->dev);
|
||||
dev_set_name(&codec->dev, "%s:%u", dev_name(ac97_ctrl->parent), idx);
|
||||
codec->dev.of_node = ac97_of_get_child_device(ac97_ctrl, idx,
|
||||
vendor_id);
|
||||
|
||||
ret = device_add(&codec->dev);
|
||||
if (ret)
|
||||
@ -105,6 +130,7 @@ static int ac97_codec_add(struct ac97_controller *ac97_ctrl, int idx,
|
||||
|
||||
return 0;
|
||||
err_free_codec:
|
||||
of_node_put(codec->dev.of_node);
|
||||
put_device(&codec->dev);
|
||||
kfree(codec);
|
||||
ac97_ctrl->codecs[idx] = NULL;
|
||||
|
@ -88,8 +88,10 @@ static struct device_node *get_gpio(char *name,
|
||||
}
|
||||
|
||||
reg = of_get_property(np, "reg", NULL);
|
||||
if (!reg)
|
||||
if (!reg) {
|
||||
of_node_put(np);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
*gpioptr = *reg;
|
||||
|
||||
|
@ -17,14 +17,9 @@ config SND_ARMAACI
|
||||
select SND_PCM
|
||||
select SND_AC97_CODEC
|
||||
|
||||
config SND_PXA2XX_PCM
|
||||
tristate
|
||||
select SND_PCM
|
||||
|
||||
config SND_PXA2XX_AC97
|
||||
tristate "AC97 driver for the Intel PXA2xx chip"
|
||||
depends on ARCH_PXA
|
||||
select SND_PXA2XX_PCM
|
||||
select SND_AC97_CODEC
|
||||
select SND_PXA2XX_LIB
|
||||
select SND_PXA2XX_LIB_AC97
|
||||
|
@ -6,9 +6,6 @@
|
||||
obj-$(CONFIG_SND_ARMAACI) += snd-aaci.o
|
||||
snd-aaci-objs := aaci.o
|
||||
|
||||
obj-$(CONFIG_SND_PXA2XX_PCM) += snd-pxa2xx-pcm.o
|
||||
snd-pxa2xx-pcm-objs := pxa2xx-pcm.o
|
||||
|
||||
obj-$(CONFIG_SND_PXA2XX_LIB) += snd-pxa2xx-lib.o
|
||||
snd-pxa2xx-lib-y := pxa2xx-pcm-lib.o
|
||||
snd-pxa2xx-lib-$(CONFIG_SND_PXA2XX_LIB_AC97) += pxa2xx-ac97-lib.o
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/of_gpio.h>
|
||||
|
||||
#include <sound/pxa2xx-lib.h>
|
||||
|
||||
@ -337,6 +338,17 @@ int pxa2xx_ac97_hw_probe(struct platform_device *dev)
|
||||
dev_err(&dev->dev, "Invalid reset GPIO %d\n",
|
||||
pdata->reset_gpio);
|
||||
}
|
||||
} else if (!pdata && dev->dev.of_node) {
|
||||
pdata = devm_kzalloc(&dev->dev, sizeof(*pdata), GFP_KERNEL);
|
||||
if (!pdata)
|
||||
return -ENOMEM;
|
||||
pdata->reset_gpio = of_get_named_gpio(dev->dev.of_node,
|
||||
"reset-gpios", 0);
|
||||
if (pdata->reset_gpio == -ENOENT)
|
||||
pdata->reset_gpio = -1;
|
||||
else if (pdata->reset_gpio < 0)
|
||||
return pdata->reset_gpio;
|
||||
reset_gpio = pdata->reset_gpio;
|
||||
} else {
|
||||
if (cpu_is_pxa27x())
|
||||
reset_gpio = 113;
|
||||
|
@ -15,7 +15,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/dma/pxa-dma.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
||||
#include <sound/core.h>
|
||||
#include <sound/pcm.h>
|
||||
@ -27,8 +27,6 @@
|
||||
#include <mach/regs-ac97.h>
|
||||
#include <mach/audio.h>
|
||||
|
||||
#include "pxa2xx-pcm.h"
|
||||
|
||||
static void pxa2xx_ac97_legacy_reset(struct snd_ac97 *ac97)
|
||||
{
|
||||
if (!pxa2xx_ac97_try_cold_reset())
|
||||
@ -63,61 +61,46 @@ static struct snd_ac97_bus_ops pxa2xx_ac97_ops = {
|
||||
.reset = pxa2xx_ac97_legacy_reset,
|
||||
};
|
||||
|
||||
static struct pxad_param pxa2xx_ac97_pcm_out_req = {
|
||||
.prio = PXAD_PRIO_LOWEST,
|
||||
.drcmr = 12,
|
||||
};
|
||||
|
||||
static struct snd_dmaengine_dai_dma_data pxa2xx_ac97_pcm_out = {
|
||||
.addr = __PREG(PCDR),
|
||||
.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES,
|
||||
.maxburst = 32,
|
||||
.filter_data = &pxa2xx_ac97_pcm_out_req,
|
||||
};
|
||||
|
||||
static struct pxad_param pxa2xx_ac97_pcm_in_req = {
|
||||
.prio = PXAD_PRIO_LOWEST,
|
||||
.drcmr = 11,
|
||||
};
|
||||
|
||||
static struct snd_dmaengine_dai_dma_data pxa2xx_ac97_pcm_in = {
|
||||
.addr = __PREG(PCDR),
|
||||
.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES,
|
||||
.maxburst = 32,
|
||||
.filter_data = &pxa2xx_ac97_pcm_in_req,
|
||||
};
|
||||
|
||||
static struct snd_pcm *pxa2xx_ac97_pcm;
|
||||
static struct snd_ac97 *pxa2xx_ac97_ac97;
|
||||
|
||||
static int pxa2xx_ac97_pcm_startup(struct snd_pcm_substream *substream)
|
||||
static int pxa2xx_ac97_pcm_open(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
pxa2xx_audio_ops_t *platform_ops;
|
||||
int r;
|
||||
int ret, i;
|
||||
|
||||
ret = pxa2xx_pcm_open(substream);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
runtime->hw.channels_min = 2;
|
||||
runtime->hw.channels_max = 2;
|
||||
|
||||
r = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
|
||||
AC97_RATES_FRONT_DAC : AC97_RATES_ADC;
|
||||
runtime->hw.rates = pxa2xx_ac97_ac97->rates[r];
|
||||
i = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
|
||||
AC97_RATES_FRONT_DAC : AC97_RATES_ADC;
|
||||
runtime->hw.rates = pxa2xx_ac97_ac97->rates[i];
|
||||
snd_pcm_limit_hw_rates(runtime);
|
||||
|
||||
platform_ops = substream->pcm->card->dev->platform_data;
|
||||
if (platform_ops && platform_ops->startup)
|
||||
return platform_ops->startup(substream, platform_ops->priv);
|
||||
else
|
||||
return 0;
|
||||
platform_ops = substream->pcm->card->dev->platform_data;
|
||||
if (platform_ops && platform_ops->startup) {
|
||||
ret = platform_ops->startup(substream, platform_ops->priv);
|
||||
if (ret < 0)
|
||||
pxa2xx_pcm_close(substream);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void pxa2xx_ac97_pcm_shutdown(struct snd_pcm_substream *substream)
|
||||
static int pxa2xx_ac97_pcm_close(struct snd_pcm_substream *substream)
|
||||
{
|
||||
pxa2xx_audio_ops_t *platform_ops;
|
||||
|
||||
platform_ops = substream->pcm->card->dev->platform_data;
|
||||
platform_ops = substream->pcm->card->dev->platform_data;
|
||||
if (platform_ops && platform_ops->shutdown)
|
||||
platform_ops->shutdown(substream, platform_ops->priv);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pxa2xx_ac97_pcm_prepare(struct snd_pcm_substream *substream)
|
||||
@ -125,17 +108,15 @@ static int pxa2xx_ac97_pcm_prepare(struct snd_pcm_substream *substream)
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
int reg = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
|
||||
AC97_PCM_FRONT_DAC_RATE : AC97_PCM_LR_ADC_RATE;
|
||||
int ret;
|
||||
|
||||
ret = pxa2xx_pcm_prepare(substream);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return snd_ac97_set_rate(pxa2xx_ac97_ac97, reg, runtime->rate);
|
||||
}
|
||||
|
||||
static struct pxa2xx_pcm_client pxa2xx_ac97_pcm_client = {
|
||||
.playback_params = &pxa2xx_ac97_pcm_out,
|
||||
.capture_params = &pxa2xx_ac97_pcm_in,
|
||||
.startup = pxa2xx_ac97_pcm_startup,
|
||||
.shutdown = pxa2xx_ac97_pcm_shutdown,
|
||||
.prepare = pxa2xx_ac97_pcm_prepare,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
|
||||
static int pxa2xx_ac97_do_suspend(struct snd_card *card)
|
||||
@ -193,6 +174,53 @@ static int pxa2xx_ac97_resume(struct device *dev)
|
||||
static SIMPLE_DEV_PM_OPS(pxa2xx_ac97_pm_ops, pxa2xx_ac97_suspend, pxa2xx_ac97_resume);
|
||||
#endif
|
||||
|
||||
static const struct snd_pcm_ops pxa2xx_ac97_pcm_ops = {
|
||||
.open = pxa2xx_ac97_pcm_open,
|
||||
.close = pxa2xx_ac97_pcm_close,
|
||||
.ioctl = snd_pcm_lib_ioctl,
|
||||
.hw_params = pxa2xx_pcm_hw_params,
|
||||
.hw_free = pxa2xx_pcm_hw_free,
|
||||
.prepare = pxa2xx_ac97_pcm_prepare,
|
||||
.trigger = pxa2xx_pcm_trigger,
|
||||
.pointer = pxa2xx_pcm_pointer,
|
||||
.mmap = pxa2xx_pcm_mmap,
|
||||
};
|
||||
|
||||
|
||||
static int pxa2xx_ac97_pcm_new(struct snd_card *card)
|
||||
{
|
||||
struct snd_pcm *pcm;
|
||||
int stream, ret;
|
||||
|
||||
ret = snd_pcm_new(card, "PXA2xx-PCM", 0, 1, 1, &pcm);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
pcm->private_free = pxa2xx_pcm_free_dma_buffers;
|
||||
|
||||
ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32));
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
stream = SNDRV_PCM_STREAM_PLAYBACK;
|
||||
snd_pcm_set_ops(pcm, stream, &pxa2xx_ac97_pcm_ops);
|
||||
ret = pxa2xx_pcm_preallocate_dma_buffer(pcm, stream);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
stream = SNDRV_PCM_STREAM_CAPTURE;
|
||||
snd_pcm_set_ops(pcm, stream, &pxa2xx_ac97_pcm_ops);
|
||||
ret = pxa2xx_pcm_preallocate_dma_buffer(pcm, stream);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
pxa2xx_ac97_pcm = pcm;
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int pxa2xx_ac97_probe(struct platform_device *dev)
|
||||
{
|
||||
struct snd_card *card;
|
||||
@ -214,7 +242,7 @@ static int pxa2xx_ac97_probe(struct platform_device *dev)
|
||||
|
||||
strlcpy(card->driver, dev->dev.driver->name, sizeof(card->driver));
|
||||
|
||||
ret = pxa2xx_pcm_new(card, &pxa2xx_ac97_pcm_client, &pxa2xx_ac97_pcm);
|
||||
ret = pxa2xx_ac97_pcm_new(card);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
|
@ -16,8 +16,6 @@
|
||||
#include <sound/pxa2xx-lib.h>
|
||||
#include <sound/dmaengine_pcm.h>
|
||||
|
||||
#include "pxa2xx-pcm.h"
|
||||
|
||||
static const struct snd_pcm_hardware pxa2xx_pcm_hardware = {
|
||||
.info = SNDRV_PCM_INFO_MMAP |
|
||||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
@ -25,8 +23,8 @@ static const struct snd_pcm_hardware pxa2xx_pcm_hardware = {
|
||||
SNDRV_PCM_INFO_PAUSE |
|
||||
SNDRV_PCM_INFO_RESUME,
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_LE |
|
||||
SNDRV_PCM_FMTBIT_S24_LE |
|
||||
SNDRV_PCM_FMTBIT_S32_LE,
|
||||
SNDRV_PCM_FMTBIT_S24_LE |
|
||||
SNDRV_PCM_FMTBIT_S32_LE,
|
||||
.period_bytes_min = 32,
|
||||
.period_bytes_max = 8192 - 32,
|
||||
.periods_min = 1,
|
||||
@ -35,8 +33,8 @@ static const struct snd_pcm_hardware pxa2xx_pcm_hardware = {
|
||||
.fifo_size = 32,
|
||||
};
|
||||
|
||||
int __pxa2xx_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
int pxa2xx_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
struct dma_chan *chan = snd_dmaengine_pcm_get_chan(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
@ -64,14 +62,14 @@ int __pxa2xx_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(__pxa2xx_pcm_hw_params);
|
||||
EXPORT_SYMBOL(pxa2xx_pcm_hw_params);
|
||||
|
||||
int __pxa2xx_pcm_hw_free(struct snd_pcm_substream *substream)
|
||||
int pxa2xx_pcm_hw_free(struct snd_pcm_substream *substream)
|
||||
{
|
||||
snd_pcm_set_runtime_buffer(substream, NULL);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(__pxa2xx_pcm_hw_free);
|
||||
EXPORT_SYMBOL(pxa2xx_pcm_hw_free);
|
||||
|
||||
int pxa2xx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
||||
{
|
||||
@ -86,13 +84,13 @@ pxa2xx_pcm_pointer(struct snd_pcm_substream *substream)
|
||||
}
|
||||
EXPORT_SYMBOL(pxa2xx_pcm_pointer);
|
||||
|
||||
int __pxa2xx_pcm_prepare(struct snd_pcm_substream *substream)
|
||||
int pxa2xx_pcm_prepare(struct snd_pcm_substream *substream)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(__pxa2xx_pcm_prepare);
|
||||
EXPORT_SYMBOL(pxa2xx_pcm_prepare);
|
||||
|
||||
int __pxa2xx_pcm_open(struct snd_pcm_substream *substream)
|
||||
int pxa2xx_pcm_open(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
@ -125,17 +123,17 @@ int __pxa2xx_pcm_open(struct snd_pcm_substream *substream)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return snd_dmaengine_pcm_open_request_chan(substream,
|
||||
pxad_filter_fn,
|
||||
dma_params->filter_data);
|
||||
return snd_dmaengine_pcm_open(
|
||||
substream, dma_request_slave_channel(rtd->cpu_dai->dev,
|
||||
dma_params->chan_name));
|
||||
}
|
||||
EXPORT_SYMBOL(__pxa2xx_pcm_open);
|
||||
EXPORT_SYMBOL(pxa2xx_pcm_open);
|
||||
|
||||
int __pxa2xx_pcm_close(struct snd_pcm_substream *substream)
|
||||
int pxa2xx_pcm_close(struct snd_pcm_substream *substream)
|
||||
{
|
||||
return snd_dmaengine_pcm_close_release_chan(substream);
|
||||
}
|
||||
EXPORT_SYMBOL(__pxa2xx_pcm_close);
|
||||
EXPORT_SYMBOL(pxa2xx_pcm_close);
|
||||
|
||||
int pxa2xx_pcm_mmap(struct snd_pcm_substream *substream,
|
||||
struct vm_area_struct *vma)
|
||||
@ -181,6 +179,47 @@ void pxa2xx_pcm_free_dma_buffers(struct snd_pcm *pcm)
|
||||
}
|
||||
EXPORT_SYMBOL(pxa2xx_pcm_free_dma_buffers);
|
||||
|
||||
int pxa2xx_soc_pcm_new(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_card *card = rtd->card->snd_card;
|
||||
struct snd_pcm *pcm = rtd->pcm;
|
||||
int ret;
|
||||
|
||||
ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) {
|
||||
ret = pxa2xx_pcm_preallocate_dma_buffer(pcm,
|
||||
SNDRV_PCM_STREAM_PLAYBACK);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) {
|
||||
ret = pxa2xx_pcm_preallocate_dma_buffer(pcm,
|
||||
SNDRV_PCM_STREAM_CAPTURE);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(pxa2xx_soc_pcm_new);
|
||||
|
||||
const struct snd_pcm_ops pxa2xx_pcm_ops = {
|
||||
.open = pxa2xx_pcm_open,
|
||||
.close = pxa2xx_pcm_close,
|
||||
.ioctl = snd_pcm_lib_ioctl,
|
||||
.hw_params = pxa2xx_pcm_hw_params,
|
||||
.hw_free = pxa2xx_pcm_hw_free,
|
||||
.prepare = pxa2xx_pcm_prepare,
|
||||
.trigger = pxa2xx_pcm_trigger,
|
||||
.pointer = pxa2xx_pcm_pointer,
|
||||
.mmap = pxa2xx_pcm_mmap,
|
||||
};
|
||||
EXPORT_SYMBOL(pxa2xx_pcm_ops);
|
||||
|
||||
MODULE_AUTHOR("Nicolas Pitre");
|
||||
MODULE_DESCRIPTION("Intel PXA2xx sound library");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -1,129 +0,0 @@
|
||||
/*
|
||||
* linux/sound/arm/pxa2xx-pcm.c -- ALSA PCM interface for the Intel PXA2xx chip
|
||||
*
|
||||
* Author: Nicolas Pitre
|
||||
* Created: Nov 30, 2004
|
||||
* Copyright: (C) 2004 MontaVista Software, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/dmaengine.h>
|
||||
|
||||
#include <mach/dma.h>
|
||||
|
||||
#include <sound/core.h>
|
||||
#include <sound/pxa2xx-lib.h>
|
||||
#include <sound/dmaengine_pcm.h>
|
||||
|
||||
#include "pxa2xx-pcm.h"
|
||||
|
||||
static int pxa2xx_pcm_prepare(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct pxa2xx_pcm_client *client = substream->private_data;
|
||||
|
||||
__pxa2xx_pcm_prepare(substream);
|
||||
|
||||
return client->prepare(substream);
|
||||
}
|
||||
|
||||
static int pxa2xx_pcm_open(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct pxa2xx_pcm_client *client = substream->private_data;
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct pxa2xx_runtime_data *rtd;
|
||||
int ret;
|
||||
|
||||
ret = __pxa2xx_pcm_open(substream);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
rtd = runtime->private_data;
|
||||
|
||||
rtd->params = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
|
||||
client->playback_params : client->capture_params;
|
||||
|
||||
ret = client->startup(substream);
|
||||
if (!ret)
|
||||
goto err2;
|
||||
|
||||
return 0;
|
||||
|
||||
err2:
|
||||
__pxa2xx_pcm_close(substream);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int pxa2xx_pcm_close(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct pxa2xx_pcm_client *client = substream->private_data;
|
||||
|
||||
client->shutdown(substream);
|
||||
|
||||
return __pxa2xx_pcm_close(substream);
|
||||
}
|
||||
|
||||
static const struct snd_pcm_ops pxa2xx_pcm_ops = {
|
||||
.open = pxa2xx_pcm_open,
|
||||
.close = pxa2xx_pcm_close,
|
||||
.ioctl = snd_pcm_lib_ioctl,
|
||||
.hw_params = __pxa2xx_pcm_hw_params,
|
||||
.hw_free = __pxa2xx_pcm_hw_free,
|
||||
.prepare = pxa2xx_pcm_prepare,
|
||||
.trigger = pxa2xx_pcm_trigger,
|
||||
.pointer = pxa2xx_pcm_pointer,
|
||||
.mmap = pxa2xx_pcm_mmap,
|
||||
};
|
||||
|
||||
int pxa2xx_pcm_new(struct snd_card *card, struct pxa2xx_pcm_client *client,
|
||||
struct snd_pcm **rpcm)
|
||||
{
|
||||
struct snd_pcm *pcm;
|
||||
int play = client->playback_params ? 1 : 0;
|
||||
int capt = client->capture_params ? 1 : 0;
|
||||
int ret;
|
||||
|
||||
ret = snd_pcm_new(card, "PXA2xx-PCM", 0, play, capt, &pcm);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
pcm->private_data = client;
|
||||
pcm->private_free = pxa2xx_pcm_free_dma_buffers;
|
||||
|
||||
ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32));
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (play) {
|
||||
int stream = SNDRV_PCM_STREAM_PLAYBACK;
|
||||
snd_pcm_set_ops(pcm, stream, &pxa2xx_pcm_ops);
|
||||
ret = pxa2xx_pcm_preallocate_dma_buffer(pcm, stream);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
if (capt) {
|
||||
int stream = SNDRV_PCM_STREAM_CAPTURE;
|
||||
snd_pcm_set_ops(pcm, stream, &pxa2xx_pcm_ops);
|
||||
ret = pxa2xx_pcm_preallocate_dma_buffer(pcm, stream);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (rpcm)
|
||||
*rpcm = pcm;
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(pxa2xx_pcm_new);
|
||||
|
||||
MODULE_AUTHOR("Nicolas Pitre");
|
||||
MODULE_DESCRIPTION("Intel PXA2xx PCM DMA module");
|
||||
MODULE_LICENSE("GPL");
|
@ -1,27 +0,0 @@
|
||||
/*
|
||||
* linux/sound/arm/pxa2xx-pcm.h -- ALSA PCM interface for the Intel PXA2xx chip
|
||||
*
|
||||
* Author: Nicolas Pitre
|
||||
* Created: Nov 30, 2004
|
||||
* Copyright: MontaVista Software, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
struct pxa2xx_runtime_data {
|
||||
int dma_ch;
|
||||
struct snd_dmaengine_dai_dma_data *params;
|
||||
};
|
||||
|
||||
struct pxa2xx_pcm_client {
|
||||
struct snd_dmaengine_dai_dma_data *playback_params;
|
||||
struct snd_dmaengine_dai_dma_data *capture_params;
|
||||
int (*startup)(struct snd_pcm_substream *);
|
||||
void (*shutdown)(struct snd_pcm_substream *);
|
||||
int (*prepare)(struct snd_pcm_substream *);
|
||||
};
|
||||
|
||||
extern int pxa2xx_pcm_new(struct snd_card *, struct pxa2xx_pcm_client *, struct snd_pcm **);
|
||||
|
@ -1160,18 +1160,6 @@ int snd_compress_deregister(struct snd_compr *device)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_compress_deregister);
|
||||
|
||||
static int __init snd_compress_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit snd_compress_exit(void)
|
||||
{
|
||||
}
|
||||
|
||||
module_init(snd_compress_init);
|
||||
module_exit(snd_compress_exit);
|
||||
|
||||
MODULE_DESCRIPTION("ALSA Compressed offload framework");
|
||||
MODULE_AUTHOR("Vinod Koul <vinod.koul@linux.intel.com>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -242,16 +242,12 @@ int snd_dma_alloc_pages_fallback(int type, struct device *device, size_t size,
|
||||
int err;
|
||||
|
||||
while ((err = snd_dma_alloc_pages(type, device, size, dmab)) < 0) {
|
||||
size_t aligned_size;
|
||||
if (err != -ENOMEM)
|
||||
return err;
|
||||
if (size <= PAGE_SIZE)
|
||||
return -ENOMEM;
|
||||
aligned_size = PAGE_SIZE << get_order(size);
|
||||
if (size != aligned_size)
|
||||
size = aligned_size;
|
||||
else
|
||||
size >>= 1;
|
||||
size >>= 1;
|
||||
size = PAGE_SIZE << get_order(size);
|
||||
}
|
||||
if (! dmab->area)
|
||||
return -ENOMEM;
|
||||
|
@ -1851,7 +1851,7 @@ static int snd_pcm_oss_get_formats(struct snd_pcm_oss_file *pcm_oss_file)
|
||||
format_mask = hw_param_mask_c(params, SNDRV_PCM_HW_PARAM_FORMAT);
|
||||
for (fmt = 0; fmt < 32; ++fmt) {
|
||||
if (snd_mask_test(format_mask, fmt)) {
|
||||
int f = snd_pcm_oss_format_to(fmt);
|
||||
int f = snd_pcm_oss_format_to((__force snd_pcm_format_t)fmt);
|
||||
if (f >= 0)
|
||||
formats |= f;
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user