mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-29 17:22:07 +00:00
sound updates for 6.0-rc1
As diffstat shows, we've had lots of developments in a wide range at this time; the majority of changes are about ASoC, including subsystem-wide cleanups, continued SOF / Intel updates and a bunch of new drivers (as usual), while there have been some significant (but almost invisible) improvements in ALSA core side, too. Below are some highlights: Core: - Faster lookups of control elements with Xarray; normal user won't notice, but on the devices with tons of control elements, it can be visibly faster - Support for input validation for controls; this will harden for badly written drivers in general with a slight overhead - Deferred async signal handling for working around the potential deadlocks - Cleanup / refactoring raw MIDI locking code ASoC: - Restructing of the set_fmt() callbacks for making things clearer in situations like CODEC to CODEC links - Clean up and modernizing the DAI naming scheme setups - Merge of more of the Intel AVS driver stack, including some board integrations - New version 4 mechanism for communication with SOF DSPs - Suppoort for dynamically selecting the PLL to use at runtime on i.MX platforms - Improvements for CODEC to CODEC support in the generic cards - Support for AMD Jadeite and various machines, AMD RPL, Intel MetorLake DSPs, Mediatek MT8186 DSPs and MT6366, nVidia Tegra MDDRC, OPE and PEQ, NXP TFA9890, Qualcomm SDM845, WCD9335 and WAS883x, and Texas Instruments TAS2780 HD- and USB-audio: - Continued improvement for CS35L41 (sub)codec support - More quirks for various devices (HP, Lenovo, Dell, Clevo) -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmLr5bcOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE93IQ/+OleeiGv7C487QN5MrBCkdFnSAiXsXDArcMgo Gt6XLubH54et1tqi2ms4gRQOqr4HiBelERuqmaCLMZfEgVDc0VhJnf2jjhluYq9+ o9+kcYKul6qTZeNZLPjEX8pBvDe7HzOl7yep++ZnKeH6DAKNQQLDjVuOcQU/BXdY kL8vYrLI3zfqj/pCePb5xpkBx4XdCrE3TfiCr3tAHVg9MyvSGOJyWs02mEBqQRnc rlLmkjQVQyln/AGK4RAPMmrrFytktAvBjmIDyFL7kAzhdxe0ouNzTvdxESeojNJv CVo/p3hl/+0LYjpD2x9v2pQuifOfpjwSCy6f8jsaF366sMwR1D45h051prILsxAF 05D5AOwMCnnJdFQFxw3mIkoDva3/PRX8GFfHsXoz+efc5Ibp8ksNYVgAJ3D2TTtt 7nAYMn0dimVDtw2LHiKantgWAs/rOqD3hDzGxFj2sR662ahsHr8pT8csnJAGoBvW 7kgx7ZzFo/wSyZJqVqV7p4g6J79ScehRwhqoiwZau9Eo+PhuxZUKvm4RwGFh0Vvg GbiVRPfLV4xQd/pDin6qRX1M7cgPc62qGLkhQHAzrX6H5ipwIbQrpyDGLjwdSEp8 XcQmzCG1zGOvb9A8BY1VBOQXxZRTqN58XujbZ6hsms7Uw8sqagxpYLA/e1bvt1E1 RQoHQRw= =1n0/ -----END PGP SIGNATURE----- Merge tag 'sound-6.0-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound updates from Takashi Iwai: "As the diffstat shows, we've had lots of developments in a wide range at this time; the majority of changes are about ASoC, including subsystem-wide cleanups, continued SOF / Intel updates and a bunch of new drivers (as usual), while there have been some significant (but almost invisible) improvements in ALSA core side, too. Below are some highlights: Core: - Faster lookups of control elements with Xarray; normal user won't notice, but on the devices with tons of control elements, it can be visibly faster - Support for input validation for controls; this will harden for badly written drivers in general with a slight overhead - Deferred async signal handling for working around the potential deadlocks - Cleanup / refactoring raw MIDI locking code ASoC: - Restructing of the set_fmt() callbacks for making things clearer in situations like CODEC to CODEC links - Clean up and modernizing the DAI naming scheme setups - Merge of more of the Intel AVS driver stack, including some board integrations - New version 4 mechanism for communication with SOF DSPs - Suppoort for dynamically selecting the PLL to use at runtime on i.MX platforms - Improvements for CODEC to CODEC support in the generic cards - Support for AMD Jadeite and various machines, AMD RPL, Intel MetorLake DSPs, Mediatek MT8186 DSPs and MT6366, nVidia Tegra MDDRC, OPE and PEQ, NXP TFA9890, Qualcomm SDM845, WCD9335 and WAS883x, and Texas Instruments TAS2780 HD- and USB-audio: - Continued improvement for CS35L41 (sub)codec support - More quirks for various devices (HP, Lenovo, Dell, Clevo)" * tag 'sound-6.0-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (778 commits) ALSA: hda/realtek: Add quirk for HP Spectre x360 15-eb0xxx ALSA: line6: Replace sprintf() with sysfs_emit() ALSA: hda: Replace sprintf() with sysfs_emit() ALSA: pcm: Replace sprintf() with sysfs_emit() ALSA: core: Replace scnprintf() with sysfs_emit() ALSA: control-led: Replace sprintf() with sysfs_emit() ALSA: aoa: Replace sprintf() with sysfs_emit() ALSA: ac97: Replace sprintf() with sysfs_emit() ALSA: hda/realtek: Add quirk for Clevo NV45PZ ALSA: hda/realtek: Add quirk for Lenovo Yoga9 14IAP7 ALSA: control: Use deferred fasync helper ALSA: pcm: Use deferred fasync helper ALSA: timer: Use deferred fasync helper ALSA: core: Add async signal helpers ASoC: q6asm: use kcalloc() instead of kzalloc() ACPI: scan: Add CLSA0101 Laptop Support ALSA: hda: cs35l41: Support CLSA0101 ALSA: hda: cs35l41: Use the CS35L41 HDA internal define ASoC: dt-bindings: use spi-peripheral-props.yaml ASoC: codecs: va-macro: use fsgen as clock ...
This commit is contained in:
commit
668c3c237f
@ -0,0 +1,91 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/dsp/mediatek,mt8186-dsp.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: MediaTek mt8186 DSP core
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Tinghan Shen <tinghan.shen@mediatek.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
MediaTek mt8186 SoC contains a DSP core used for
|
||||||
|
advanced pre- and post- audio processing.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: mediatek,mt8186-dsp
|
||||||
|
|
||||||
|
reg:
|
||||||
|
items:
|
||||||
|
- description: Address and size of the DSP config registers
|
||||||
|
- description: Address and size of the DSP SRAM
|
||||||
|
- description: Address and size of the DSP secure registers
|
||||||
|
- description: Address and size of the DSP bus registers
|
||||||
|
|
||||||
|
reg-names:
|
||||||
|
items:
|
||||||
|
- const: cfg
|
||||||
|
- const: sram
|
||||||
|
- const: sec
|
||||||
|
- const: bus
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: mux for audio dsp clock
|
||||||
|
- description: mux for audio dsp local bus
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: audiodsp
|
||||||
|
- const: adsp_bus
|
||||||
|
|
||||||
|
power-domains:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
mboxes:
|
||||||
|
items:
|
||||||
|
- description: mailbox for receiving audio DSP requests.
|
||||||
|
- description: mailbox for transmitting requests to audio DSP.
|
||||||
|
|
||||||
|
mbox-names:
|
||||||
|
items:
|
||||||
|
- const: rx
|
||||||
|
- const: tx
|
||||||
|
|
||||||
|
memory-region:
|
||||||
|
items:
|
||||||
|
- description: dma buffer between host and DSP.
|
||||||
|
- description: DSP system memory.
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- reg-names
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
- power-domains
|
||||||
|
- mbox-names
|
||||||
|
- mboxes
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/mt8186-clk.h>
|
||||||
|
dsp@10680000 {
|
||||||
|
compatible = "mediatek,mt8186-dsp";
|
||||||
|
reg = <0x10680000 0x2000>,
|
||||||
|
<0x10800000 0x100000>,
|
||||||
|
<0x1068b000 0x100>,
|
||||||
|
<0x1068f000 0x1000>;
|
||||||
|
reg-names = "cfg", "sram", "sec", "bus";
|
||||||
|
clocks = <&topckgen CLK_TOP_AUDIODSP>,
|
||||||
|
<&topckgen CLK_TOP_ADSP_BUS>;
|
||||||
|
clock-names = "audiodsp",
|
||||||
|
"adsp_bus";
|
||||||
|
power-domains = <&spm 6>;
|
||||||
|
mbox-names = "rx", "tx";
|
||||||
|
mboxes = <&adsp_mailbox0>, <&adsp_mailbox1>;
|
||||||
|
};
|
@ -50,13 +50,13 @@ properties:
|
|||||||
|
|
||||||
mboxes:
|
mboxes:
|
||||||
items:
|
items:
|
||||||
- description: ipc reply between host and audio DSP.
|
- description: mailbox for receiving audio DSP requests.
|
||||||
- description: ipc request between host and audio DSP.
|
- description: mailbox for transmitting requests to audio DSP.
|
||||||
|
|
||||||
mbox-names:
|
mbox-names:
|
||||||
items:
|
items:
|
||||||
- const: mbox0
|
- const: rx
|
||||||
- const: mbox1
|
- const: tx
|
||||||
|
|
||||||
memory-region:
|
memory-region:
|
||||||
items:
|
items:
|
||||||
@ -100,6 +100,6 @@ examples:
|
|||||||
memory-region = <&adsp_dma_mem_reserved>,
|
memory-region = <&adsp_dma_mem_reserved>,
|
||||||
<&adsp_mem_reserved>;
|
<&adsp_mem_reserved>;
|
||||||
power-domains = <&spm 6>; //MT8195_POWER_DOMAIN_ADSP
|
power-domains = <&spm 6>; //MT8195_POWER_DOMAIN_ADSP
|
||||||
mbox-names = "mbox0", "mbox1";
|
mbox-names = "rx", "tx";
|
||||||
mboxes = <&adsp_mailbox0>, <&adsp_mailbox1>;
|
mboxes = <&adsp_mailbox0>, <&adsp_mailbox1>;
|
||||||
};
|
};
|
||||||
|
@ -32,8 +32,6 @@ properties:
|
|||||||
reset-gpios:
|
reset-gpios:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
spi-max-frequency: true
|
|
||||||
|
|
||||||
AVDD-supply:
|
AVDD-supply:
|
||||||
description: Analog power support for the device.
|
description: Analog power support for the device.
|
||||||
|
|
||||||
@ -52,7 +50,10 @@ required:
|
|||||||
- compatible
|
- compatible
|
||||||
- AVDD-supply
|
- AVDD-supply
|
||||||
|
|
||||||
additionalProperties: false
|
allOf:
|
||||||
|
- $ref: /schemas/spi/spi-peripheral-props.yaml#
|
||||||
|
|
||||||
|
unevaluatedProperties: false
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
- |
|
- |
|
||||||
|
@ -24,6 +24,21 @@ properties:
|
|||||||
maxItems: 1
|
maxItems: 1
|
||||||
description: I2C address of the device.
|
description: I2C address of the device.
|
||||||
|
|
||||||
|
avdd-supply:
|
||||||
|
description: A 1.8V supply that powers up the AVDD pin.
|
||||||
|
|
||||||
|
dvdd-supply:
|
||||||
|
description: A 1.2V supply that powers up the DVDD pin.
|
||||||
|
|
||||||
|
dvddio-supply:
|
||||||
|
description: A 1.2V or 1.8V supply that powers up the VDDIO pin.
|
||||||
|
|
||||||
|
pvdd-supply:
|
||||||
|
description: A 3.0V to 20V supply that powers up the PVDD pin.
|
||||||
|
|
||||||
|
vbat-supply:
|
||||||
|
description: A 3.3V to 5.5V supply that powers up the VBAT pin.
|
||||||
|
|
||||||
adi,vmon-slot-no:
|
adi,vmon-slot-no:
|
||||||
description: slot number of the voltage sense monitor
|
description: slot number of the voltage sense monitor
|
||||||
$ref: "/schemas/types.yaml#/definitions/uint32"
|
$ref: "/schemas/types.yaml#/definitions/uint32"
|
||||||
@ -36,13 +51,22 @@ properties:
|
|||||||
$ref: "/schemas/types.yaml#/definitions/uint32"
|
$ref: "/schemas/types.yaml#/definitions/uint32"
|
||||||
minimum: 0
|
minimum: 0
|
||||||
maximum: 15
|
maximum: 15
|
||||||
default: 0
|
default: 1
|
||||||
|
|
||||||
adi,spkfb-slot-no:
|
adi,spkfb-slot-no:
|
||||||
description: slot number of speaker DSP monitor
|
description: slot number of speaker DSP monitor
|
||||||
$ref: "/schemas/types.yaml#/definitions/uint32"
|
$ref: "/schemas/types.yaml#/definitions/uint32"
|
||||||
minimum: 0
|
minimum: 0
|
||||||
maximum: 15
|
maximum: 15
|
||||||
|
default: 2
|
||||||
|
|
||||||
|
adi,bypass-slot-no:
|
||||||
|
description:
|
||||||
|
Selects the PCM data input channel that is routed to the speaker
|
||||||
|
audio processing bypass path.
|
||||||
|
$ref: "/schemas/types.yaml#/definitions/uint32"
|
||||||
|
minimum: 0
|
||||||
|
maximum: 15
|
||||||
default: 0
|
default: 0
|
||||||
|
|
||||||
adi,interleave-mode:
|
adi,interleave-mode:
|
||||||
@ -72,6 +96,10 @@ examples:
|
|||||||
max98396: amplifier@39 {
|
max98396: amplifier@39 {
|
||||||
compatible = "adi,max98396";
|
compatible = "adi,max98396";
|
||||||
reg = <0x39>;
|
reg = <0x39>;
|
||||||
|
dvdd-supply = <®ulator_1v2>;
|
||||||
|
dvddio-supply = <®ulator_1v8>;
|
||||||
|
avdd-supply = <®ulator_1v8>;
|
||||||
|
pvdd-supply = <®ulator_pvdd>;
|
||||||
adi,vmon-slot-no = <0>;
|
adi,vmon-slot-no = <0>;
|
||||||
adi,imon-slot-no = <1>;
|
adi,imon-slot-no = <1>;
|
||||||
reset-gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
|
reset-gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
|
||||||
|
@ -21,6 +21,11 @@ properties:
|
|||||||
description:
|
description:
|
||||||
Regulator for the headphone amplifier
|
Regulator for the headphone amplifier
|
||||||
|
|
||||||
|
allwinner,internal-bias-resistor:
|
||||||
|
description:
|
||||||
|
Enable the internal 2.2K bias resistor between HBIAS and MICDET pins
|
||||||
|
type: boolean
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
- reg
|
- reg
|
||||||
|
@ -0,0 +1,100 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
# Copyright (C) 2022 Microchip Technology, Inc. and its subsidiaries
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/sound/atmel,sama5d2-classd.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Atmel ClassD Amplifier
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Nicolas Ferre <nicolas.ferre@microchip.com>
|
||||||
|
- Alexandre Belloni <alexandre.belloni@bootlin.com>
|
||||||
|
- Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
|
|
||||||
|
description:
|
||||||
|
The Audio Class D Amplifier (CLASSD) is a digital input, Pulse Width
|
||||||
|
Modulated (PWM) output stereo Class D amplifier.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: atmel,sama5d2-classd
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
dmas:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
dma-names:
|
||||||
|
const: tx
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
maxItems: 2
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: pclk
|
||||||
|
- const: gclk
|
||||||
|
|
||||||
|
atmel,model:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
default: CLASSD
|
||||||
|
description: The user-visible name of this sound complex.
|
||||||
|
|
||||||
|
atmel,pwm-type:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum:
|
||||||
|
- single
|
||||||
|
- diff
|
||||||
|
default: single
|
||||||
|
description: PWM modulation type.
|
||||||
|
|
||||||
|
atmel,non-overlap-time:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum:
|
||||||
|
- 5
|
||||||
|
- 10
|
||||||
|
- 15
|
||||||
|
- 20
|
||||||
|
default: 10
|
||||||
|
description:
|
||||||
|
Set non-overlapping time, the unit is nanosecond(ns).
|
||||||
|
Non-overlapping will be disabled if not specified.
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- interrupts
|
||||||
|
- dmas
|
||||||
|
- dma-names
|
||||||
|
- clock-names
|
||||||
|
- clocks
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/dma/at91.h>
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
|
||||||
|
classd: sound@fc048000 {
|
||||||
|
compatible = "atmel,sama5d2-classd";
|
||||||
|
reg = <0xfc048000 0x100>;
|
||||||
|
interrupts = <59 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||||
|
dmas = <&dma0
|
||||||
|
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1)
|
||||||
|
| AT91_XDMAC_DT_PERID(47))>;
|
||||||
|
dma-names = "tx";
|
||||||
|
clocks = <&classd_clk>, <&classd_gclk>;
|
||||||
|
clock-names = "pclk", "gclk";
|
||||||
|
assigned-clocks = <&classd_gclk>;
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&pinctrl_classd_default>;
|
||||||
|
atmel,model = "classd @ SAMA5D2-Xplained";
|
||||||
|
atmel,pwm-type = "diff";
|
||||||
|
atmel,non-overlap-time = <10>;
|
||||||
|
};
|
@ -0,0 +1,85 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
# Copyright (C) 2022 Microchip Technology, Inc. and its subsidiaries
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/sound/atmel,sama5d2-i2s.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Atmel I2S controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Nicolas Ferre <nicolas.ferre@microchip.com>
|
||||||
|
- Alexandre Belloni <alexandre.belloni@bootlin.com>
|
||||||
|
- Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
|
|
||||||
|
description:
|
||||||
|
Atmel I2S (Inter-IC Sound Controller) bus is the standard
|
||||||
|
interface for connecting audio devices, such as audio codecs.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: atmel,sama5d2-i2s
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: Peripheral clock
|
||||||
|
- description: Generated clock (Optional)
|
||||||
|
- description: I2S mux clock (Optional). Set
|
||||||
|
with gclk when Master Mode is required.
|
||||||
|
minItems: 1
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: pclk
|
||||||
|
- const: gclk
|
||||||
|
- const: muxclk
|
||||||
|
minItems: 1
|
||||||
|
|
||||||
|
dmas:
|
||||||
|
items:
|
||||||
|
- description: TX DMA Channel
|
||||||
|
- description: RX DMA Channel
|
||||||
|
|
||||||
|
dma-names:
|
||||||
|
items:
|
||||||
|
- const: tx
|
||||||
|
- const: rx
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- interrupts
|
||||||
|
- dmas
|
||||||
|
- dma-names
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/dma/at91.h>
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
|
||||||
|
i2s@f8050000 {
|
||||||
|
compatible = "atmel,sama5d2-i2s";
|
||||||
|
reg = <0xf8050000 0x300>;
|
||||||
|
interrupts = <54 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||||
|
dmas = <&dma0
|
||||||
|
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) |
|
||||||
|
AT91_XDMAC_DT_PERID(31))>,
|
||||||
|
<&dma0
|
||||||
|
(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>, <&i2s0muxck>;
|
||||||
|
clock-names = "pclk", "gclk", "muxclk";
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&pinctrl_i2s0_default>;
|
||||||
|
};
|
@ -0,0 +1,98 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
# Copyright (C) 2022 Microchip Technology, Inc. and its subsidiaries
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/sound/atmel,sama5d2-pdmic.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Atmel PDMIC decoder
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
|
|
||||||
|
description:
|
||||||
|
Atmel Pulse Density Modulation Interface Controller
|
||||||
|
(PDMIC) peripheral is a mono PDM decoder module
|
||||||
|
that decodes an incoming PDM sample stream.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: atmel,sama5d2-pdmic
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: peripheral clock
|
||||||
|
- description: generated clock
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: pclk
|
||||||
|
- const: gclk
|
||||||
|
|
||||||
|
dmas:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
dma-names:
|
||||||
|
const: rx
|
||||||
|
|
||||||
|
atmel,mic-min-freq:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
description:
|
||||||
|
The minimal frequency that the microphone supports.
|
||||||
|
|
||||||
|
atmel,mic-max-freq:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
description:
|
||||||
|
The maximal frequency that the microphone supports.
|
||||||
|
|
||||||
|
atmel,model:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
default: PDMIC
|
||||||
|
description: The user-visible name of this sound card.
|
||||||
|
|
||||||
|
atmel,mic-offset:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/int32
|
||||||
|
default: 0
|
||||||
|
description: The offset that should be added.
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- interrupts
|
||||||
|
- dmas
|
||||||
|
- dma-names
|
||||||
|
- clock-names
|
||||||
|
- clocks
|
||||||
|
- atmel,mic-min-freq
|
||||||
|
- atmel,mic-max-freq
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/dma/at91.h>
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
|
||||||
|
pdmic: sound@f8018000 {
|
||||||
|
compatible = "atmel,sama5d2-pdmic";
|
||||||
|
reg = <0xf8018000 0x124>;
|
||||||
|
interrupts = <48 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||||
|
dmas = <&dma0
|
||||||
|
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1)
|
||||||
|
| AT91_XDMAC_DT_PERID(50))>;
|
||||||
|
dma-names = "rx";
|
||||||
|
clocks = <&pdmic_clk>, <&pdmic_gclk>;
|
||||||
|
clock-names = "pclk", "gclk";
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&pinctrl_pdmic_default>;
|
||||||
|
atmel,model = "PDMIC@sama5d2_xplained";
|
||||||
|
atmel,mic-min-freq = <1000000>;
|
||||||
|
atmel,mic-max-freq = <3246000>;
|
||||||
|
atmel,mic-offset = <0x0>;
|
||||||
|
};
|
@ -1,55 +0,0 @@
|
|||||||
* Atmel ClassD driver under ALSA SoC architecture
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- compatible
|
|
||||||
Should be "atmel,sama5d2-classd".
|
|
||||||
- reg
|
|
||||||
Should contain ClassD registers location and length.
|
|
||||||
- interrupts
|
|
||||||
Should contain the IRQ line for the ClassD.
|
|
||||||
- dmas
|
|
||||||
One DMA specifiers as described in atmel-dma.txt and dma.txt files.
|
|
||||||
- dma-names
|
|
||||||
Must be "tx".
|
|
||||||
- clock-names
|
|
||||||
Tuple listing input clock names.
|
|
||||||
Required elements: "pclk" and "gclk".
|
|
||||||
- clocks
|
|
||||||
Please refer to clock-bindings.txt.
|
|
||||||
- assigned-clocks
|
|
||||||
Should be <&classd_gclk>.
|
|
||||||
|
|
||||||
Optional properties:
|
|
||||||
- pinctrl-names, pinctrl-0
|
|
||||||
Please refer to pinctrl-bindings.txt.
|
|
||||||
- atmel,model
|
|
||||||
The user-visible name of this sound complex.
|
|
||||||
The default value is "CLASSD".
|
|
||||||
- atmel,pwm-type
|
|
||||||
PWM modulation type, "single" or "diff".
|
|
||||||
The default value is "single".
|
|
||||||
- atmel,non-overlap-time
|
|
||||||
Set non-overlapping time, the unit is nanosecond(ns).
|
|
||||||
There are four values,
|
|
||||||
<5>, <10>, <15>, <20>, the default value is <10>.
|
|
||||||
Non-overlapping will be disabled if not specified.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
classd: classd@fc048000 {
|
|
||||||
compatible = "atmel,sama5d2-classd";
|
|
||||||
reg = <0xfc048000 0x100>;
|
|
||||||
interrupts = <59 IRQ_TYPE_LEVEL_HIGH 7>;
|
|
||||||
dmas = <&dma0
|
|
||||||
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1)
|
|
||||||
| AT91_XDMAC_DT_PERID(47))>;
|
|
||||||
dma-names = "tx";
|
|
||||||
clocks = <&classd_clk>, <&classd_gclk>;
|
|
||||||
clock-names = "pclk", "gclk";
|
|
||||||
assigned-clocks = <&classd_gclk>;
|
|
||||||
|
|
||||||
pinctrl-names = "default";
|
|
||||||
pinctrl-0 = <&pinctrl_classd_default>;
|
|
||||||
atmel,model = "classd @ SAMA5D2-Xplained";
|
|
||||||
atmel,pwm-type = "diff";
|
|
||||||
atmel,non-overlap-time = <10>;
|
|
||||||
};
|
|
@ -1,46 +0,0 @@
|
|||||||
* Atmel I2S controller
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- compatible: Should be "atmel,sama5d2-i2s".
|
|
||||||
- reg: Should be the physical base address of the controller and the
|
|
||||||
length of memory mapped region.
|
|
||||||
- interrupts: Should contain the interrupt for the controller.
|
|
||||||
- dmas: Should be one per channel name listed in the dma-names property,
|
|
||||||
as described in atmel-dma.txt and dma.txt files.
|
|
||||||
- dma-names: Two dmas have to be defined, "tx" and "rx".
|
|
||||||
This IP also supports one shared channel for both rx and tx;
|
|
||||||
if this mode is used, one "rx-tx" name must be used.
|
|
||||||
- clocks: Must contain an entry for each entry in clock-names.
|
|
||||||
Please refer to clock-bindings.txt.
|
|
||||||
- clock-names: Should be one of each entry matching the clocks phandles list:
|
|
||||||
- "pclk" (peripheral clock) Required.
|
|
||||||
- "gclk" (generated clock) Optional (1).
|
|
||||||
- "muxclk" (I2S mux clock) Optional (1).
|
|
||||||
|
|
||||||
Optional properties:
|
|
||||||
- pinctrl-0: Should specify pin control groups used for this controller.
|
|
||||||
- princtrl-names: Should contain only one value - "default".
|
|
||||||
|
|
||||||
|
|
||||||
(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:
|
|
||||||
|
|
||||||
i2s@f8050000 {
|
|
||||||
compatible = "atmel,sama5d2-i2s";
|
|
||||||
reg = <0xf8050000 0x300>;
|
|
||||||
interrupts = <54 IRQ_TYPE_LEVEL_HIGH 7>;
|
|
||||||
dmas = <&dma0
|
|
||||||
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) |
|
|
||||||
AT91_XDMAC_DT_PERID(31))>,
|
|
||||||
<&dma0
|
|
||||||
(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>, <&i2s0muxck>;
|
|
||||||
clock-names = "pclk", "gclk", "muxclk";
|
|
||||||
pinctrl-names = "default";
|
|
||||||
pinctrl-0 = <&pinctrl_i2s0_default>;
|
|
||||||
};
|
|
@ -1,55 +0,0 @@
|
|||||||
* Atmel PDMIC driver under ALSA SoC architecture
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- compatible
|
|
||||||
Should be "atmel,sama5d2-pdmic".
|
|
||||||
- reg
|
|
||||||
Should contain PDMIC registers location and length.
|
|
||||||
- interrupts
|
|
||||||
Should contain the IRQ line for the PDMIC.
|
|
||||||
- dmas
|
|
||||||
One DMA specifiers as described in atmel-dma.txt and dma.txt files.
|
|
||||||
- dma-names
|
|
||||||
Must be "rx".
|
|
||||||
- clock-names
|
|
||||||
Required elements:
|
|
||||||
- "pclk" peripheral clock
|
|
||||||
- "gclk" generated clock
|
|
||||||
- clocks
|
|
||||||
Must contain an entry for each required entry in clock-names.
|
|
||||||
Please refer to clock-bindings.txt.
|
|
||||||
- atmel,mic-min-freq
|
|
||||||
The minimal frequency that the micphone supports.
|
|
||||||
- atmel,mic-max-freq
|
|
||||||
The maximal frequency that the micphone supports.
|
|
||||||
|
|
||||||
Optional properties:
|
|
||||||
- pinctrl-names, pinctrl-0
|
|
||||||
Please refer to pinctrl-bindings.txt.
|
|
||||||
- atmel,model
|
|
||||||
The user-visible name of this sound card.
|
|
||||||
The default value is "PDMIC".
|
|
||||||
- atmel,mic-offset
|
|
||||||
The offset that should be added.
|
|
||||||
The range is from -32768 to 32767.
|
|
||||||
The default value is 0.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
pdmic@f8018000 {
|
|
||||||
compatible = "atmel,sama5d2-pdmic";
|
|
||||||
reg = <0xf8018000 0x124>;
|
|
||||||
interrupts = <48 IRQ_TYPE_LEVEL_HIGH 7>;
|
|
||||||
dmas = <&dma0
|
|
||||||
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1)
|
|
||||||
| AT91_XDMAC_DT_PERID(50))>;
|
|
||||||
dma-names = "rx";
|
|
||||||
clocks = <&pdmic_clk>, <&pdmic_gclk>;
|
|
||||||
clock-names = "pclk", "gclk";
|
|
||||||
|
|
||||||
pinctrl-names = "default";
|
|
||||||
pinctrl-0 = <&pinctrl_pdmic_default>;
|
|
||||||
atmel,model = "PDMIC @ sama5d2_xplained";
|
|
||||||
atmel,mic-min-freq = <1000000>;
|
|
||||||
atmel,mic-max-freq = <3246000>;
|
|
||||||
atmel,mic-offset = <0x0>;
|
|
||||||
};
|
|
@ -16,7 +16,7 @@ Board connectors:
|
|||||||
* Line In Jack
|
* Line In Jack
|
||||||
|
|
||||||
wm8731 pins:
|
wm8731 pins:
|
||||||
cf Documentation/devicetree/bindings/sound/wm8731.txt
|
cf Documentation/devicetree/bindings/sound/wlf,wm8731.yaml
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
sound {
|
sound {
|
||||||
|
@ -1,35 +0,0 @@
|
|||||||
DesignWare I2S controller
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- compatible : Must be "snps,designware-i2s"
|
|
||||||
- reg : Must contain the I2S core's registers location and length
|
|
||||||
- clocks : Pairs of phandle and specifier referencing the controller's
|
|
||||||
clocks. The controller expects one clock: the clock used as the sampling
|
|
||||||
rate reference clock sample.
|
|
||||||
- clock-names : "i2sclk" for the sample rate reference clock.
|
|
||||||
- dmas: Pairs of phandle and specifier for the DMA channels that are used by
|
|
||||||
the core. The core expects one or two dma channels: one for transmit and
|
|
||||||
one for receive.
|
|
||||||
- dma-names : "tx" for the transmit channel, "rx" for the receive channel.
|
|
||||||
|
|
||||||
Optional properties:
|
|
||||||
- interrupts: The interrupt line number for the I2S controller. Add this
|
|
||||||
parameter if the I2S controller that you are using does not support DMA.
|
|
||||||
|
|
||||||
For more details on the 'dma', 'dma-names', 'clock' and 'clock-names'
|
|
||||||
properties please check:
|
|
||||||
* resource-names.txt
|
|
||||||
* clock/clock-bindings.txt
|
|
||||||
* dma/dma.txt
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
soc_i2s: i2s@7ff90000 {
|
|
||||||
compatible = "snps,designware-i2s";
|
|
||||||
reg = <0x0 0x7ff90000 0x0 0x1000>;
|
|
||||||
clocks = <&scpi_i2sclk 0>;
|
|
||||||
clock-names = "i2sclk";
|
|
||||||
#sound-dai-cells = <0>;
|
|
||||||
dmas = <&dma0 5>;
|
|
||||||
dma-names = "tx";
|
|
||||||
};
|
|
@ -1,33 +0,0 @@
|
|||||||
NXP MICFIL Digital Audio Interface (MICFIL).
|
|
||||||
|
|
||||||
The MICFIL digital interface provides a 16-bit audio signal from a PDM
|
|
||||||
microphone bitstream in a configurable output sampling rate.
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
|
|
||||||
- compatible : Compatible list, contains "fsl,imx8mm-micfil"
|
|
||||||
or "fsl,imx8mp-micfil"
|
|
||||||
|
|
||||||
- reg : Offset and length of the register set for the device.
|
|
||||||
|
|
||||||
- interrupts : Contains the micfil interrupts.
|
|
||||||
|
|
||||||
- clocks : Must contain an entry for each entry in clock-names.
|
|
||||||
|
|
||||||
- clock-names : Must include the "ipg_clk" for register access and
|
|
||||||
"ipg_clk_app" for internal micfil clock.
|
|
||||||
|
|
||||||
- dmas : Generic dma devicetree binding as described in
|
|
||||||
Documentation/devicetree/bindings/dma/dma.txt.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
micfil: micfil@30080000 {
|
|
||||||
compatible = "fsl,imx8mm-micfil";
|
|
||||||
reg = <0x0 0x30080000 0x0 0x10000>;
|
|
||||||
interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>,
|
|
||||||
<GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
|
|
||||||
clocks = <&clk IMX8MM_CLK_PDM_IPG>,
|
|
||||||
<&clk IMX8MM_CLK_PDM_ROOT>;
|
|
||||||
clock-names = "ipg_clk", "ipg_clk_app";
|
|
||||||
dmas = <&sdma2 24 26 0x80000000>;
|
|
||||||
};
|
|
85
Documentation/devicetree/bindings/sound/fsl,micfil.yaml
Normal file
85
Documentation/devicetree/bindings/sound/fsl,micfil.yaml
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/sound/fsl,micfil.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: NXP MICFIL Digital Audio Interface (MICFIL)
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Shengjiu Wang <shengjiu.wang@nxp.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
The MICFIL digital interface provides a 16-bit or 24-bit audio signal
|
||||||
|
from a PDM microphone bitstream in a configurable output sampling rate.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- fsl,imx8mm-micfil
|
||||||
|
- fsl,imx8mp-micfil
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
items:
|
||||||
|
- description: Digital Microphone interface interrupt
|
||||||
|
- description: Digital Microphone interface error interrupt
|
||||||
|
- description: voice activity detector event interrupt
|
||||||
|
- description: voice activity detector error interrupt
|
||||||
|
|
||||||
|
dmas:
|
||||||
|
items:
|
||||||
|
- description: DMA controller phandle and request line for RX
|
||||||
|
|
||||||
|
dma-names:
|
||||||
|
items:
|
||||||
|
- const: rx
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: The ipg clock for register access
|
||||||
|
- description: internal micfil clock
|
||||||
|
- description: PLL clock source for 8kHz series
|
||||||
|
- description: PLL clock source for 11kHz series
|
||||||
|
- description: External clock 3
|
||||||
|
minItems: 2
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: ipg_clk
|
||||||
|
- const: ipg_clk_app
|
||||||
|
- const: pll8k
|
||||||
|
- const: pll11k
|
||||||
|
- const: clkext3
|
||||||
|
minItems: 2
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- interrupts
|
||||||
|
- dmas
|
||||||
|
- dma-names
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
#include <dt-bindings/clock/imx8mm-clock.h>
|
||||||
|
micfil: audio-controller@30080000 {
|
||||||
|
compatible = "fsl,imx8mm-micfil";
|
||||||
|
reg = <0x30080000 0x10000>;
|
||||||
|
interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&clk IMX8MM_CLK_PDM_IPG>,
|
||||||
|
<&clk IMX8MM_CLK_PDM_ROOT>;
|
||||||
|
clock-names = "ipg_clk", "ipg_clk_app";
|
||||||
|
dmas = <&sdma2 24 25 0>;
|
||||||
|
dma-names = "rx";
|
||||||
|
};
|
@ -2,7 +2,7 @@ fsl,mqs audio CODEC
|
|||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible : Must contain one of "fsl,imx6sx-mqs", "fsl,codec-mqs"
|
- compatible : Must contain one of "fsl,imx6sx-mqs", "fsl,codec-mqs"
|
||||||
"fsl,imx8qm-mqs", "fsl,imx8qxp-mqs".
|
"fsl,imx8qm-mqs", "fsl,imx8qxp-mqs", "fsl,imx93-mqs".
|
||||||
- clocks : A list of phandles + clock-specifiers, one for each entry in
|
- clocks : A list of phandles + clock-specifiers, one for each entry in
|
||||||
clock-names
|
clock-names
|
||||||
- clock-names : "mclk" - must required.
|
- clock-names : "mclk" - must required.
|
||||||
|
@ -58,6 +58,8 @@ properties:
|
|||||||
slave of the Shared Peripheral Bus and when two or more bus masters
|
slave of the Shared Peripheral Bus and when two or more bus masters
|
||||||
(CPU, DMA or DSP) try to access it. This property is optional depending
|
(CPU, DMA or DSP) try to access it. This property is optional depending
|
||||||
on the SoC design.
|
on the SoC design.
|
||||||
|
- description: PLL clock source for 8kHz series rate, optional.
|
||||||
|
- description: PLL clock source for 11khz series rate, optional.
|
||||||
minItems: 9
|
minItems: 9
|
||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
@ -72,6 +74,8 @@ properties:
|
|||||||
- const: rxtx6
|
- const: rxtx6
|
||||||
- const: rxtx7
|
- const: rxtx7
|
||||||
- const: spba
|
- const: spba
|
||||||
|
- const: pll8k
|
||||||
|
- const: pll11k
|
||||||
minItems: 9
|
minItems: 9
|
||||||
|
|
||||||
big-endian:
|
big-endian:
|
||||||
|
@ -21,6 +21,9 @@ Required properties:
|
|||||||
- clock-names : Must include the "bus" for register access and
|
- clock-names : Must include the "bus" for register access and
|
||||||
"mclk1", "mclk2", "mclk3" for bit clock and frame
|
"mclk1", "mclk2", "mclk3" for bit clock and frame
|
||||||
clock providing.
|
clock providing.
|
||||||
|
"pll8k", "pll11k" are optional, they are the clock
|
||||||
|
source for root clock, one is for 8kHz series rates
|
||||||
|
another one is for 11kHz series rates.
|
||||||
- dmas : Generic dma devicetree binding as described in
|
- dmas : Generic dma devicetree binding as described in
|
||||||
Documentation/devicetree/bindings/dma/dma.txt.
|
Documentation/devicetree/bindings/dma/dma.txt.
|
||||||
|
|
||||||
@ -49,6 +52,14 @@ Required properties:
|
|||||||
receive data by following their own bit clocks and
|
receive data by following their own bit clocks and
|
||||||
frame sync clocks separately.
|
frame sync clocks separately.
|
||||||
|
|
||||||
|
- fsl,dataline : configure the dataline. it has 3 value for each configuration
|
||||||
|
first one means the type: I2S(1) or PDM(2)
|
||||||
|
second one is dataline mask for 'rx'
|
||||||
|
third one is dataline mask for 'tx'.
|
||||||
|
for example: fsl,dataline = <1 0xff 0xff 2 0xff 0x11>;
|
||||||
|
it means I2S type rx mask is 0xff, tx mask is 0xff, PDM type
|
||||||
|
rx mask is 0xff, tx mask is 0x11 (dataline 1 and 4 enabled).
|
||||||
|
|
||||||
Optional properties:
|
Optional properties:
|
||||||
|
|
||||||
- big-endian : Boolean property, required if all the SAI
|
- big-endian : Boolean property, required if all the SAI
|
||||||
|
@ -7,7 +7,9 @@ Must be a child node of PMIC wrapper.
|
|||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
|
|
||||||
- compatible : "mediatek,mt6358-sound".
|
- compatible - "string" - One of:
|
||||||
|
"mediatek,mt6358-sound"
|
||||||
|
"mediatek,mt6366-sound"
|
||||||
- Avdd-supply : power source of AVDD
|
- Avdd-supply : power source of AVDD
|
||||||
|
|
||||||
Optional properties:
|
Optional properties:
|
||||||
|
175
Documentation/devicetree/bindings/sound/mt8186-afe-pcm.yaml
Normal file
175
Documentation/devicetree/bindings/sound/mt8186-afe-pcm.yaml
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/sound/mt8186-afe-pcm.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Mediatek AFE PCM controller for mt8186
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Jiaxin Yu <jiaxin.yu@mediatek.com>
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: mediatek,mt8186-sound
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
resets:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
reset-names:
|
||||||
|
const: audiosys
|
||||||
|
|
||||||
|
mediatek,apmixedsys:
|
||||||
|
$ref: "/schemas/types.yaml#/definitions/phandle"
|
||||||
|
description: The phandle of the mediatek apmixedsys controller
|
||||||
|
|
||||||
|
mediatek,infracfg:
|
||||||
|
$ref: "/schemas/types.yaml#/definitions/phandle"
|
||||||
|
description: The phandle of the mediatek infracfg controller
|
||||||
|
|
||||||
|
mediatek,topckgen:
|
||||||
|
$ref: "/schemas/types.yaml#/definitions/phandle"
|
||||||
|
description: The phandle of the mediatek topckgen controller
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: audio infra sys clock
|
||||||
|
- description: audio infra 26M clock
|
||||||
|
- description: audio top mux
|
||||||
|
- description: audio intbus mux
|
||||||
|
- description: mainpll 136.5M clock
|
||||||
|
- description: faud1 mux
|
||||||
|
- description: apll1 clock
|
||||||
|
- description: faud2 mux
|
||||||
|
- description: apll2 clock
|
||||||
|
- description: audio engen1 mux
|
||||||
|
- description: apll1_d8 22.5792M clock
|
||||||
|
- description: audio engen2 mux
|
||||||
|
- description: apll2_d8 24.576M clock
|
||||||
|
- description: i2s0 mclk mux
|
||||||
|
- description: i2s1 mclk mux
|
||||||
|
- description: i2s2 mclk mux
|
||||||
|
- description: i2s4 mclk mux
|
||||||
|
- description: tdm mclk mux
|
||||||
|
- description: i2s0_mck divider
|
||||||
|
- description: i2s1_mck divider
|
||||||
|
- description: i2s2_mck divider
|
||||||
|
- description: i2s4_mck divider
|
||||||
|
- description: tdm_mck divider
|
||||||
|
- description: audio hires mux
|
||||||
|
- description: 26M clock
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: aud_infra_clk
|
||||||
|
- const: mtkaif_26m_clk
|
||||||
|
- const: top_mux_audio
|
||||||
|
- const: top_mux_audio_int
|
||||||
|
- const: top_mainpll_d2_d4
|
||||||
|
- const: top_mux_aud_1
|
||||||
|
- const: top_apll1_ck
|
||||||
|
- const: top_mux_aud_2
|
||||||
|
- const: top_apll2_ck
|
||||||
|
- const: top_mux_aud_eng1
|
||||||
|
- const: top_apll1_d8
|
||||||
|
- const: top_mux_aud_eng2
|
||||||
|
- const: top_apll2_d8
|
||||||
|
- const: top_i2s0_m_sel
|
||||||
|
- const: top_i2s1_m_sel
|
||||||
|
- const: top_i2s2_m_sel
|
||||||
|
- const: top_i2s4_m_sel
|
||||||
|
- const: top_tdm_m_sel
|
||||||
|
- const: top_apll12_div0
|
||||||
|
- const: top_apll12_div1
|
||||||
|
- const: top_apll12_div2
|
||||||
|
- const: top_apll12_div4
|
||||||
|
- const: top_apll12_div_tdm
|
||||||
|
- const: top_mux_audio_h
|
||||||
|
- const: top_clk26m_clk
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- interrupts
|
||||||
|
- resets
|
||||||
|
- reset-names
|
||||||
|
- mediatek,apmixedsys
|
||||||
|
- mediatek,infracfg
|
||||||
|
- mediatek,topckgen
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
#include <dt-bindings/interrupt-controller/irq.h>
|
||||||
|
|
||||||
|
afe: mt8186-afe-pcm@11210000 {
|
||||||
|
compatible = "mediatek,mt8186-sound";
|
||||||
|
reg = <0x11210000 0x2000>;
|
||||||
|
interrupts = <GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
resets = <&watchdog 17>; //MT8186_TOPRGU_AUDIO_SW_RST
|
||||||
|
reset-names = "audiosys";
|
||||||
|
mediatek,apmixedsys = <&apmixedsys>;
|
||||||
|
mediatek,infracfg = <&infracfg>;
|
||||||
|
mediatek,topckgen = <&topckgen>;
|
||||||
|
clocks = <&infracfg_ao 44>, //CLK_INFRA_AO_AUDIO
|
||||||
|
<&infracfg_ao 54>, //CLK_INFRA_AO_AUDIO_26M_BCLK
|
||||||
|
<&topckgen 15>, //CLK_TOP_AUDIO
|
||||||
|
<&topckgen 16>, //CLK_TOP_AUD_INTBUS
|
||||||
|
<&topckgen 70>, //CLK_TOP_MAINPLL_D2_D4
|
||||||
|
<&topckgen 17>, //CLK_TOP_AUD_1
|
||||||
|
<&apmixedsys 12>, //CLK_APMIXED_APLL1
|
||||||
|
<&topckgen 18>, //CLK_TOP_AUD_2
|
||||||
|
<&apmixedsys 13>, //CLK_APMIXED_APLL2
|
||||||
|
<&topckgen 19>, //CLK_TOP_AUD_ENGEN1
|
||||||
|
<&topckgen 101>, //CLK_TOP_APLL1_D8
|
||||||
|
<&topckgen 20>, //CLK_TOP_AUD_ENGEN2
|
||||||
|
<&topckgen 104>, //CLK_TOP_APLL2_D8
|
||||||
|
<&topckgen 63>, //CLK_TOP_APLL_I2S0_MCK_SEL
|
||||||
|
<&topckgen 64>, //CLK_TOP_APLL_I2S1_MCK_SEL
|
||||||
|
<&topckgen 65>, //CLK_TOP_APLL_I2S2_MCK_SEL
|
||||||
|
<&topckgen 66>, //CLK_TOP_APLL_I2S4_MCK_SEL
|
||||||
|
<&topckgen 67>, //CLK_TOP_APLL_TDMOUT_MCK_SEL
|
||||||
|
<&topckgen 131>, //CLK_TOP_APLL12_CK_DIV0
|
||||||
|
<&topckgen 132>, //CLK_TOP_APLL12_CK_DIV1
|
||||||
|
<&topckgen 133>, //CLK_TOP_APLL12_CK_DIV2
|
||||||
|
<&topckgen 134>, //CLK_TOP_APLL12_CK_DIV4
|
||||||
|
<&topckgen 135>, //CLK_TOP_APLL12_CK_DIV_TDMOUT_M
|
||||||
|
<&topckgen 44>, //CLK_TOP_AUDIO_H
|
||||||
|
<&clk26m>;
|
||||||
|
clock-names = "aud_infra_clk",
|
||||||
|
"mtkaif_26m_clk",
|
||||||
|
"top_mux_audio",
|
||||||
|
"top_mux_audio_int",
|
||||||
|
"top_mainpll_d2_d4",
|
||||||
|
"top_mux_aud_1",
|
||||||
|
"top_apll1_ck",
|
||||||
|
"top_mux_aud_2",
|
||||||
|
"top_apll2_ck",
|
||||||
|
"top_mux_aud_eng1",
|
||||||
|
"top_apll1_d8",
|
||||||
|
"top_mux_aud_eng2",
|
||||||
|
"top_apll2_d8",
|
||||||
|
"top_i2s0_m_sel",
|
||||||
|
"top_i2s1_m_sel",
|
||||||
|
"top_i2s2_m_sel",
|
||||||
|
"top_i2s4_m_sel",
|
||||||
|
"top_tdm_m_sel",
|
||||||
|
"top_apll12_div0",
|
||||||
|
"top_apll12_div1",
|
||||||
|
"top_apll12_div2",
|
||||||
|
"top_apll12_div4",
|
||||||
|
"top_apll12_div_tdm",
|
||||||
|
"top_mux_audio_h",
|
||||||
|
"top_clk26m_clk";
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
@ -0,0 +1,75 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/sound/mt8186-mt6366-da7219-max98357.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Mediatek MT8186 with MT6366, DA7219 and MAX98357 ASoC sound card driver
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Jiaxin Yu <jiaxin.yu@mediatek.com>
|
||||||
|
|
||||||
|
description:
|
||||||
|
This binding describes the MT8186 sound card.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- mediatek,mt8186-mt6366-da7219-max98357-sound
|
||||||
|
|
||||||
|
mediatek,platform:
|
||||||
|
$ref: "/schemas/types.yaml#/definitions/phandle"
|
||||||
|
description: The phandle of MT8186 ASoC platform.
|
||||||
|
|
||||||
|
headset-codec:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
sound-dai:
|
||||||
|
maxItems: 1
|
||||||
|
required:
|
||||||
|
- sound-dai
|
||||||
|
|
||||||
|
playback-codecs:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
sound-dai:
|
||||||
|
items:
|
||||||
|
- description: phandle of dp codec
|
||||||
|
- description: phandle of l channel speaker codec
|
||||||
|
- description: phandle of r channel speaker codec
|
||||||
|
minItems: 2
|
||||||
|
required:
|
||||||
|
- sound-dai
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- mediatek,platform
|
||||||
|
- headset-codec
|
||||||
|
- playback-codecs
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
|
||||||
|
sound: mt8186-sound {
|
||||||
|
compatible = "mediatek,mt8186-mt6366-da7219-max98357-sound";
|
||||||
|
mediatek,platform = <&afe>;
|
||||||
|
pinctrl-names = "aud_clk_mosi_off",
|
||||||
|
"aud_clk_mosi_on";
|
||||||
|
pinctrl-0 = <&aud_clk_mosi_off>;
|
||||||
|
pinctrl-1 = <&aud_clk_mosi_on>;
|
||||||
|
|
||||||
|
headset-codec {
|
||||||
|
sound-dai = <&da7219>;
|
||||||
|
};
|
||||||
|
|
||||||
|
playback-codecs {
|
||||||
|
sound-dai = <&anx_bridge_dp>,
|
||||||
|
<&max98357a>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
@ -0,0 +1,75 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/sound/mt8186-mt6366-rt1019-rt5682s.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Mediatek MT8186 with MT6366, RT1019 and RT5682S ASoC sound card driver
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Jiaxin Yu <jiaxin.yu@mediatek.com>
|
||||||
|
|
||||||
|
description:
|
||||||
|
This binding describes the MT8186 sound card.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- mediatek,mt8186-mt6366-rt1019-rt5682s-sound
|
||||||
|
|
||||||
|
mediatek,platform:
|
||||||
|
$ref: "/schemas/types.yaml#/definitions/phandle"
|
||||||
|
description: The phandle of MT8186 ASoC platform.
|
||||||
|
|
||||||
|
headset-codec:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
sound-dai:
|
||||||
|
maxItems: 1
|
||||||
|
required:
|
||||||
|
- sound-dai
|
||||||
|
|
||||||
|
playback-codecs:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
sound-dai:
|
||||||
|
items:
|
||||||
|
- description: phandle of dp codec
|
||||||
|
- description: phandle of l channel speaker codec
|
||||||
|
- description: phandle of r channel speaker codec
|
||||||
|
minItems: 2
|
||||||
|
required:
|
||||||
|
- sound-dai
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- mediatek,platform
|
||||||
|
- headset-codec
|
||||||
|
- playback-codecs
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
|
||||||
|
sound: mt8186-sound {
|
||||||
|
compatible = "mediatek,mt8186-mt6366-rt1019-rt5682s-sound";
|
||||||
|
mediatek,platform = <&afe>;
|
||||||
|
pinctrl-names = "aud_clk_mosi_off",
|
||||||
|
"aud_clk_mosi_on";
|
||||||
|
pinctrl-0 = <&aud_clk_mosi_off>;
|
||||||
|
pinctrl-1 = <&aud_clk_mosi_on>;
|
||||||
|
|
||||||
|
headset-codec {
|
||||||
|
sound-dai = <&rt5682s>;
|
||||||
|
};
|
||||||
|
|
||||||
|
playback-codecs {
|
||||||
|
sound-dai = <&it6505dptx>,
|
||||||
|
<&rt1019p>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
@ -34,7 +34,7 @@ Optional properties:
|
|||||||
- nuvoton,jack-eject-debounce: number from 0 to 7 that sets debounce time to 2^(n+2) ms
|
- nuvoton,jack-eject-debounce: number from 0 to 7 that sets debounce time to 2^(n+2) ms
|
||||||
|
|
||||||
- nuvoton,dmic-clk-threshold: the ADC threshold of DMIC clock.
|
- nuvoton,dmic-clk-threshold: the ADC threshold of DMIC clock.
|
||||||
|
- nuvoton,key_enable: Headset button detection switch.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
|
@ -110,6 +110,10 @@ patternProperties:
|
|||||||
type: object
|
type: object
|
||||||
$ref: nvidia,tegra186-asrc.yaml#
|
$ref: nvidia,tegra186-asrc.yaml#
|
||||||
|
|
||||||
|
'^processing-engine@[0-9a-f]+$':
|
||||||
|
type: object
|
||||||
|
$ref: nvidia,tegra210-ope.yaml#
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
- reg
|
- reg
|
||||||
|
@ -0,0 +1,47 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/sound/nvidia,tegra210-mbdrc.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Tegra210 MBDRC
|
||||||
|
|
||||||
|
description:
|
||||||
|
The Multi Band Dynamic Range Compressor (MBDRC) is part of Output
|
||||||
|
Processing Engine (OPE) which interfaces with Audio Hub (AHUB) via
|
||||||
|
Audio Client Interface (ACIF). MBDRC can be used as a traditional
|
||||||
|
single full band or a dual band or a multi band dynamic processor.
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Jon Hunter <jonathanh@nvidia.com>
|
||||||
|
- Mohan Kumar <mkumard@nvidia.com>
|
||||||
|
- Sameer Pujar <spujar@nvidia.com>
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
oneOf:
|
||||||
|
- const: nvidia,tegra210-mbdrc
|
||||||
|
- items:
|
||||||
|
- enum:
|
||||||
|
- nvidia,tegra234-mbdrc
|
||||||
|
- nvidia,tegra194-mbdrc
|
||||||
|
- nvidia,tegra186-mbdrc
|
||||||
|
- const: nvidia,tegra210-mbdrc
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
dynamic-range-compressor@702d8200 {
|
||||||
|
compatible = "nvidia,tegra210-mbdrc";
|
||||||
|
reg = <0x702d8200 0x200>;
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
@ -0,0 +1,87 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/sound/nvidia,tegra210-ope.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Tegra210 OPE
|
||||||
|
|
||||||
|
description:
|
||||||
|
The Output Processing Engine (OPE) is one of the AHUB client. It has
|
||||||
|
PEQ (Parametric Equalizer) and MBDRC (Multi Band Dynamic Range Compressor)
|
||||||
|
sub blocks for data processing.
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Jon Hunter <jonathanh@nvidia.com>
|
||||||
|
- Mohan Kumar <mkumard@nvidia.com>
|
||||||
|
- Sameer Pujar <spujar@nvidia.com>
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: name-prefix.yaml#
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
oneOf:
|
||||||
|
- const: nvidia,tegra210-ope
|
||||||
|
- items:
|
||||||
|
- enum:
|
||||||
|
- nvidia,tegra234-ope
|
||||||
|
- nvidia,tegra194-ope
|
||||||
|
- nvidia,tegra186-ope
|
||||||
|
- const: nvidia,tegra210-ope
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
"#address-cells":
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
"#size-cells":
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
ranges: true
|
||||||
|
|
||||||
|
sound-name-prefix:
|
||||||
|
pattern: "^OPE[1-9]$"
|
||||||
|
|
||||||
|
ports:
|
||||||
|
$ref: /schemas/graph.yaml#/properties/ports
|
||||||
|
properties:
|
||||||
|
port@0:
|
||||||
|
$ref: audio-graph-port.yaml#
|
||||||
|
unevaluatedProperties: false
|
||||||
|
description:
|
||||||
|
OPE ACIF (Audio Client Interface) input port. This is connected
|
||||||
|
to corresponding ACIF output port on AHUB (Audio Hub).
|
||||||
|
|
||||||
|
port@1:
|
||||||
|
$ref: audio-graph-port.yaml#
|
||||||
|
unevaluatedProperties: false
|
||||||
|
description:
|
||||||
|
OPE ACIF output port. This is connected to corresponding ACIF
|
||||||
|
input port on AHUB.
|
||||||
|
|
||||||
|
patternProperties:
|
||||||
|
'^equalizer@[0-9a-f]+$':
|
||||||
|
type: object
|
||||||
|
$ref: nvidia,tegra210-peq.yaml#
|
||||||
|
|
||||||
|
'^dynamic-range-compressor@[0-9a-f]+$':
|
||||||
|
type: object
|
||||||
|
$ref: nvidia,tegra210-mbdrc.yaml#
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
processing-engine@702d8000 {
|
||||||
|
compatible = "nvidia,tegra210-ope";
|
||||||
|
reg = <0x702d8000 0x100>;
|
||||||
|
sound-name-prefix = "OPE1";
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
@ -0,0 +1,48 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/sound/nvidia,tegra210-peq.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Tegra210 PEQ
|
||||||
|
|
||||||
|
description:
|
||||||
|
The Parametric Equalizer (PEQ) is a cascade of biquad filters with
|
||||||
|
each filter tuned based on certain parameters. It can be used to
|
||||||
|
equalize the irregularities in the speaker frequency response.
|
||||||
|
PEQ sits inside Output Processing Engine (OPE) which interfaces
|
||||||
|
with Audio Hub (AHUB) via Audio Client Interface (ACIF).
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Jon Hunter <jonathanh@nvidia.com>
|
||||||
|
- Mohan Kumar <mkumard@nvidia.com>
|
||||||
|
- Sameer Pujar <spujar@nvidia.com>
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
oneOf:
|
||||||
|
- const: nvidia,tegra210-peq
|
||||||
|
- items:
|
||||||
|
- enum:
|
||||||
|
- nvidia,tegra234-peq
|
||||||
|
- nvidia,tegra194-peq
|
||||||
|
- nvidia,tegra186-peq
|
||||||
|
- const: nvidia,tegra210-peq
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
equalizer@702d8100 {
|
||||||
|
compatible = "nvidia,tegra210-peq";
|
||||||
|
reg = <0x702d8100 0x100>;
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
@ -15,6 +15,7 @@ allOf:
|
|||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
enum:
|
enum:
|
||||||
|
- nxp,tfa9890
|
||||||
- nxp,tfa9895
|
- nxp,tfa9895
|
||||||
- nxp,tfa9897
|
- nxp,tfa9897
|
||||||
|
|
||||||
|
@ -1,91 +0,0 @@
|
|||||||
* 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 one of this
|
|
||||||
"qcom,sdm845-sndcard"
|
|
||||||
"qcom,db845c-sndcard"
|
|
||||||
"lenovo,yoga-c630-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.
|
|
||||||
|
|
||||||
- aux-devs
|
|
||||||
Usage: optional
|
|
||||||
Value type: <array of phandles>
|
|
||||||
Definition: A list of phandles for auxiliary devices (e.g. analog
|
|
||||||
amplifiers) that do not appear directly within the DAI
|
|
||||||
links. Should be connected to another audio component
|
|
||||||
using "audio-routing".
|
|
||||||
|
|
||||||
= 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>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
@ -16,8 +16,11 @@ description:
|
|||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
enum:
|
enum:
|
||||||
|
- lenovo,yoga-c630-sndcard
|
||||||
- qcom,apq8016-sbc-sndcard
|
- qcom,apq8016-sbc-sndcard
|
||||||
|
- qcom,db845c-sndcard
|
||||||
- qcom,msm8916-qdsp6-sndcard
|
- qcom,msm8916-qdsp6-sndcard
|
||||||
|
- qcom,sdm845-sndcard
|
||||||
- qcom,sm8250-sndcard
|
- qcom,sm8250-sndcard
|
||||||
- qcom,qrb5165-rb5-sndcard
|
- qcom,qrb5165-rb5-sndcard
|
||||||
|
|
||||||
|
@ -127,7 +127,7 @@ properties:
|
|||||||
|
|
||||||
gpio@42:
|
gpio@42:
|
||||||
type: object
|
type: object
|
||||||
$ref: ../gpio/qcom,wcd934x-gpio.yaml#
|
$ref: /schemas/gpio/qcom,wcd934x-gpio.yaml#
|
||||||
|
|
||||||
patternProperties:
|
patternProperties:
|
||||||
"^.*@[0-9a-f]+$":
|
"^.*@[0-9a-f]+$":
|
||||||
|
74
Documentation/devicetree/bindings/sound/qcom,wsa883x.yaml
Normal file
74
Documentation/devicetree/bindings/sound/qcom,wsa883x.yaml
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/sound/qcom,wsa883x.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Bindings for The Qualcomm WSA8830/WSA8832/WSA8835
|
||||||
|
smart speaker amplifier
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
WSA883X is the Qualcomm Aqstic smart speaker amplifier
|
||||||
|
Their primary operating mode uses a SoundWire digital audio
|
||||||
|
interface. This binding is for SoundWire interface.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: sdw10217020200
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
powerdown-gpios:
|
||||||
|
description: GPIO spec for Powerdown/Shutdown line to use
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
vdd-supply:
|
||||||
|
description: VDD Supply for the Codec
|
||||||
|
|
||||||
|
'#thermal-sensor-cells':
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
'#sound-dai-cells':
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- vdd-supply
|
||||||
|
- powerdown-gpios
|
||||||
|
- "#thermal-sensor-cells"
|
||||||
|
- "#sound-dai-cells"
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
soundwire-controller@3250000 {
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
reg = <0x3250000 0x2000>;
|
||||||
|
|
||||||
|
speaker@0,1 {
|
||||||
|
compatible = "sdw10217020200";
|
||||||
|
reg = <0 1>;
|
||||||
|
powerdown-gpios = <&tlmm 1 0>;
|
||||||
|
vdd-supply = <&vreg_s10b_1p8>;
|
||||||
|
#thermal-sensor-cells = <0>;
|
||||||
|
#sound-dai-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
speaker@0,2 {
|
||||||
|
compatible = "sdw10217020200";
|
||||||
|
reg = <0 2>;
|
||||||
|
powerdown-gpios = <&tlmm 89 0>;
|
||||||
|
vdd-supply = <&vreg_s10b_1p8>;
|
||||||
|
#thermal-sensor-cells = <0>;
|
||||||
|
#sound-dai-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
@ -61,6 +61,13 @@ properties:
|
|||||||
- const: tx
|
- const: tx
|
||||||
- const: rx
|
- const: rx
|
||||||
|
|
||||||
|
pinctrl-names:
|
||||||
|
oneOf:
|
||||||
|
- const: default
|
||||||
|
- items:
|
||||||
|
- const: bclk_on
|
||||||
|
- const: bclk_off
|
||||||
|
|
||||||
power-domains:
|
power-domains:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
|
@ -47,6 +47,7 @@ properties:
|
|||||||
description: The bias voltage to be used in mVolts. The voltage can take
|
description: The bias voltage to be used in mVolts. The voltage can take
|
||||||
values from 1.25V to 3V by 250mV steps. If this node is not mentioned
|
values from 1.25V to 3V by 250mV steps. If this node is not mentioned
|
||||||
or the value is unknown, then the value is set to 1.25V.
|
or the value is unknown, then the value is set to 1.25V.
|
||||||
|
$ref: "/schemas/types.yaml#/definitions/uint32"
|
||||||
enum: [ 1250, 1500, 1750, 2000, 2250, 2500, 2750, 3000 ]
|
enum: [ 1250, 1500, 1750, 2000, 2250, 2500, 2750, 3000 ]
|
||||||
|
|
||||||
lrclk-strength:
|
lrclk-strength:
|
||||||
|
@ -0,0 +1,94 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/sound/snps,designware-i2s.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: DesignWare I2S controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Jose Abreu <joabreu@synopsys.com>
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
oneOf:
|
||||||
|
- items:
|
||||||
|
- const: canaan,k210-i2s
|
||||||
|
- const: snps,designware-i2s
|
||||||
|
- enum:
|
||||||
|
- snps,designware-i2s
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
description: |
|
||||||
|
The interrupt line number for the I2S controller. Add this
|
||||||
|
parameter if the I2S controller that you are using does not
|
||||||
|
support DMA.
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
description: Sampling rate reference clock
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
const: i2sclk
|
||||||
|
|
||||||
|
resets:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
dmas:
|
||||||
|
items:
|
||||||
|
- description: TX DMA Channel
|
||||||
|
- description: RX DMA Channel
|
||||||
|
minItems: 1
|
||||||
|
|
||||||
|
dma-names:
|
||||||
|
items:
|
||||||
|
- const: tx
|
||||||
|
- const: rx
|
||||||
|
minItems: 1
|
||||||
|
|
||||||
|
if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
const: canaan,k210-i2s
|
||||||
|
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
"#sound-dai-cells":
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
else:
|
||||||
|
properties:
|
||||||
|
"#sound-dai-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
|
||||||
|
oneOf:
|
||||||
|
- required:
|
||||||
|
- dmas
|
||||||
|
- dma-names
|
||||||
|
- required:
|
||||||
|
- interrupts
|
||||||
|
|
||||||
|
unevaluatedProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
soc_i2s: i2s@7ff90000 {
|
||||||
|
compatible = "snps,designware-i2s";
|
||||||
|
reg = <0x7ff90000 0x1000>;
|
||||||
|
clocks = <&scpi_i2sclk 0>;
|
||||||
|
clock-names = "i2sclk";
|
||||||
|
#sound-dai-cells = <0>;
|
||||||
|
dmas = <&dma0 5>;
|
||||||
|
dma-names = "tx";
|
||||||
|
};
|
@ -52,10 +52,6 @@ properties:
|
|||||||
DCVDD-supply:
|
DCVDD-supply:
|
||||||
description: Digital core supply regulator for the DCVDD pin.
|
description: Digital core supply regulator for the DCVDD pin.
|
||||||
|
|
||||||
spi-max-frequency: true
|
|
||||||
|
|
||||||
additionalProperties: false
|
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- reg
|
- reg
|
||||||
- compatible
|
- compatible
|
||||||
@ -64,6 +60,11 @@ required:
|
|||||||
- DBVDD-supply
|
- DBVDD-supply
|
||||||
- DCVDD-supply
|
- DCVDD-supply
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/spi/spi-peripheral-props.yaml#
|
||||||
|
|
||||||
|
unevaluatedProperties: false
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
- |
|
- |
|
||||||
spi {
|
spi {
|
||||||
|
@ -116,7 +116,7 @@ On-line docs
|
|||||||
* Title: **Writing an ALSA Driver**
|
* Title: **Writing an ALSA Driver**
|
||||||
|
|
||||||
:Author: Takashi Iwai <tiwai@suse.de>
|
:Author: Takashi Iwai <tiwai@suse.de>
|
||||||
:URL: http://www.alsa-project.org/~iwai/writing-an-alsa-driver/index.html
|
:URL: https://www.kernel.org/doc/html/latest/sound/kernel-api/writing-an-alsa-driver.html
|
||||||
:Date: 2005
|
:Date: 2005
|
||||||
:Keywords: ALSA, sound, soundcard, driver, lowlevel, hardware.
|
:Keywords: ALSA, sound, soundcard, driver, lowlevel, hardware.
|
||||||
:Description: Advanced Linux Sound Architecture for developers,
|
:Description: Advanced Linux Sound Architecture for developers,
|
||||||
|
@ -132,7 +132,7 @@ The codec driver also supports the following ALSA PCM operations:-
|
|||||||
};
|
};
|
||||||
|
|
||||||
Please refer to the ALSA driver PCM documentation for details.
|
Please refer to the ALSA driver PCM documentation for details.
|
||||||
http://www.alsa-project.org/~iwai/writing-an-alsa-driver/
|
https://www.kernel.org/doc/html/latest/sound/kernel-api/writing-an-alsa-driver.html
|
||||||
|
|
||||||
|
|
||||||
DAPM description
|
DAPM description
|
||||||
|
@ -46,7 +46,7 @@ snd_soc_component_driver:-
|
|||||||
};
|
};
|
||||||
|
|
||||||
Please refer to the ALSA driver documentation for details of audio DMA.
|
Please refer to the ALSA driver documentation for details of audio DMA.
|
||||||
http://www.alsa-project.org/~iwai/writing-an-alsa-driver/
|
https://www.kernel.org/doc/html/latest/sound/kernel-api/writing-an-alsa-driver.html
|
||||||
|
|
||||||
An example DMA driver is soc/pxa/pxa2xx-pcm.c
|
An example DMA driver is soc/pxa/pxa2xx-pcm.c
|
||||||
|
|
||||||
|
@ -4912,6 +4912,7 @@ S: Maintained
|
|||||||
F: Documentation/devicetree/bindings/sound/cirrus,cs*
|
F: Documentation/devicetree/bindings/sound/cirrus,cs*
|
||||||
F: include/dt-bindings/sound/cs*
|
F: include/dt-bindings/sound/cs*
|
||||||
F: sound/pci/hda/cs*
|
F: sound/pci/hda/cs*
|
||||||
|
F: sound/pci/hda/hda_cs_dsp_ctl.*
|
||||||
F: sound/soc/codecs/cs*
|
F: sound/soc/codecs/cs*
|
||||||
|
|
||||||
CIRRUS LOGIC DSP FIRMWARE DRIVER
|
CIRRUS LOGIC DSP FIRMWARE DRIVER
|
||||||
@ -16579,6 +16580,9 @@ M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
|||||||
M: Banajit Goswami <bgoswami@quicinc.com>
|
M: Banajit Goswami <bgoswami@quicinc.com>
|
||||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
|
F: include/dt-bindings/sound/qcom,wcd9335.h
|
||||||
|
F: sound/soc/codecs/lpass-rx-macro.*
|
||||||
|
F: sound/soc/codecs/lpass-tx-macro.*
|
||||||
F: sound/soc/codecs/lpass-va-macro.c
|
F: sound/soc/codecs/lpass-va-macro.c
|
||||||
F: sound/soc/codecs/lpass-wsa-macro.*
|
F: sound/soc/codecs/lpass-wsa-macro.*
|
||||||
F: sound/soc/codecs/msm8916-wcd-analog.c
|
F: sound/soc/codecs/msm8916-wcd-analog.c
|
||||||
@ -16586,7 +16590,9 @@ F: sound/soc/codecs/msm8916-wcd-digital.c
|
|||||||
F: sound/soc/codecs/wcd9335.*
|
F: sound/soc/codecs/wcd9335.*
|
||||||
F: sound/soc/codecs/wcd934x.c
|
F: sound/soc/codecs/wcd934x.c
|
||||||
F: sound/soc/codecs/wcd-clsh-v2.*
|
F: sound/soc/codecs/wcd-clsh-v2.*
|
||||||
|
F: sound/soc/codecs/wcd-mbhc-v2.*
|
||||||
F: sound/soc/codecs/wsa881x.c
|
F: sound/soc/codecs/wsa881x.c
|
||||||
|
F: sound/soc/codecs/wsa883x.c
|
||||||
F: sound/soc/qcom/
|
F: sound/soc/qcom/
|
||||||
|
|
||||||
QCOM EMBEDDED USB DEBUGGER (EUD)
|
QCOM EMBEDDED USB DEBUGGER (EUD)
|
||||||
|
@ -1722,6 +1722,7 @@ static bool acpi_device_enumeration_by_parent(struct acpi_device *device)
|
|||||||
{"INT3515", },
|
{"INT3515", },
|
||||||
/* Non-conforming _HID for Cirrus Logic already released */
|
/* Non-conforming _HID for Cirrus Logic already released */
|
||||||
{"CLSA0100", },
|
{"CLSA0100", },
|
||||||
|
{"CLSA0101", },
|
||||||
/*
|
/*
|
||||||
* Some ACPI devs contain SerialBus resources even though they are not
|
* Some ACPI devs contain SerialBus resources even though they are not
|
||||||
* attached to a serial bus at all.
|
* attached to a serial bus at all.
|
||||||
|
@ -291,6 +291,44 @@ int acpi_get_local_address(acpi_handle handle, u32 *addr)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(acpi_get_local_address);
|
EXPORT_SYMBOL(acpi_get_local_address);
|
||||||
|
|
||||||
|
#define ACPI_MAX_SUB_BUF_SIZE 9
|
||||||
|
|
||||||
|
const char *acpi_get_subsystem_id(acpi_handle handle)
|
||||||
|
{
|
||||||
|
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||||
|
union acpi_object *obj;
|
||||||
|
acpi_status status;
|
||||||
|
const char *sub;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
status = acpi_evaluate_object(handle, METHOD_NAME__SUB, NULL, &buffer);
|
||||||
|
if (ACPI_FAILURE(status)) {
|
||||||
|
acpi_handle_debug(handle, "Reading ACPI _SUB failed: %#x\n", status);
|
||||||
|
return ERR_PTR(-ENODATA);
|
||||||
|
}
|
||||||
|
|
||||||
|
obj = buffer.pointer;
|
||||||
|
if (obj->type == ACPI_TYPE_STRING) {
|
||||||
|
len = strlen(obj->string.pointer);
|
||||||
|
if (len < ACPI_MAX_SUB_BUF_SIZE && len > 0) {
|
||||||
|
sub = kstrdup(obj->string.pointer, GFP_KERNEL);
|
||||||
|
if (!sub)
|
||||||
|
sub = ERR_PTR(-ENOMEM);
|
||||||
|
} else {
|
||||||
|
acpi_handle_err(handle, "ACPI _SUB Length %zu is Invalid\n", len);
|
||||||
|
sub = ERR_PTR(-ENODATA);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
acpi_handle_warn(handle, "Warning ACPI _SUB did not return a string\n");
|
||||||
|
sub = ERR_PTR(-ENODATA);
|
||||||
|
}
|
||||||
|
|
||||||
|
acpi_os_free(buffer.pointer);
|
||||||
|
|
||||||
|
return sub;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(acpi_get_subsystem_id);
|
||||||
|
|
||||||
acpi_status
|
acpi_status
|
||||||
acpi_evaluate_reference(acpi_handle handle,
|
acpi_evaluate_reference(acpi_handle handle,
|
||||||
acpi_string pathname,
|
acpi_string pathname,
|
||||||
|
@ -2725,6 +2725,9 @@ void cs_dsp_stop(struct cs_dsp *dsp)
|
|||||||
|
|
||||||
mutex_lock(&dsp->pwr_lock);
|
mutex_lock(&dsp->pwr_lock);
|
||||||
|
|
||||||
|
if (dsp->client_ops->pre_stop)
|
||||||
|
dsp->client_ops->pre_stop(dsp);
|
||||||
|
|
||||||
dsp->running = false;
|
dsp->running = false;
|
||||||
|
|
||||||
if (dsp->ops->stop_core)
|
if (dsp->ops->stop_core)
|
||||||
@ -3177,6 +3180,110 @@ static const struct cs_dsp_ops cs_dsp_halo_ops = {
|
|||||||
.stop_core = cs_dsp_halo_stop_core,
|
.stop_core = cs_dsp_halo_stop_core,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cs_dsp_chunk_write() - Format data to a DSP memory chunk
|
||||||
|
* @ch: Pointer to the chunk structure
|
||||||
|
* @nbits: Number of bits to write
|
||||||
|
* @val: Value to write
|
||||||
|
*
|
||||||
|
* This function sequentially writes values into the format required for DSP
|
||||||
|
* memory, it handles both inserting of the padding bytes and converting to
|
||||||
|
* big endian. Note that data is only committed to the chunk when a whole DSP
|
||||||
|
* words worth of data is available.
|
||||||
|
*
|
||||||
|
* Return: Zero for success, a negative number on error.
|
||||||
|
*/
|
||||||
|
int cs_dsp_chunk_write(struct cs_dsp_chunk *ch, int nbits, u32 val)
|
||||||
|
{
|
||||||
|
int nwrite, i;
|
||||||
|
|
||||||
|
nwrite = min(CS_DSP_DATA_WORD_BITS - ch->cachebits, nbits);
|
||||||
|
|
||||||
|
ch->cache <<= nwrite;
|
||||||
|
ch->cache |= val >> (nbits - nwrite);
|
||||||
|
ch->cachebits += nwrite;
|
||||||
|
nbits -= nwrite;
|
||||||
|
|
||||||
|
if (ch->cachebits == CS_DSP_DATA_WORD_BITS) {
|
||||||
|
if (cs_dsp_chunk_end(ch))
|
||||||
|
return -ENOSPC;
|
||||||
|
|
||||||
|
ch->cache &= 0xFFFFFF;
|
||||||
|
for (i = 0; i < sizeof(ch->cache); i++, ch->cache <<= BITS_PER_BYTE)
|
||||||
|
*ch->data++ = (ch->cache & 0xFF000000) >> CS_DSP_DATA_WORD_BITS;
|
||||||
|
|
||||||
|
ch->bytes += sizeof(ch->cache);
|
||||||
|
ch->cachebits = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nbits)
|
||||||
|
return cs_dsp_chunk_write(ch, nbits, val);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(cs_dsp_chunk_write);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cs_dsp_chunk_flush() - Pad remaining data with zero and commit to chunk
|
||||||
|
* @ch: Pointer to the chunk structure
|
||||||
|
*
|
||||||
|
* As cs_dsp_chunk_write only writes data when a whole DSP word is ready to
|
||||||
|
* be written out it is possible that some data will remain in the cache, this
|
||||||
|
* function will pad that data with zeros upto a whole DSP word and write out.
|
||||||
|
*
|
||||||
|
* Return: Zero for success, a negative number on error.
|
||||||
|
*/
|
||||||
|
int cs_dsp_chunk_flush(struct cs_dsp_chunk *ch)
|
||||||
|
{
|
||||||
|
if (!ch->cachebits)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return cs_dsp_chunk_write(ch, CS_DSP_DATA_WORD_BITS - ch->cachebits, 0);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(cs_dsp_chunk_flush);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cs_dsp_chunk_read() - Parse data from a DSP memory chunk
|
||||||
|
* @ch: Pointer to the chunk structure
|
||||||
|
* @nbits: Number of bits to read
|
||||||
|
*
|
||||||
|
* This function sequentially reads values from a DSP memory formatted buffer,
|
||||||
|
* it handles both removing of the padding bytes and converting from big endian.
|
||||||
|
*
|
||||||
|
* Return: A negative number is returned on error, otherwise the read value.
|
||||||
|
*/
|
||||||
|
int cs_dsp_chunk_read(struct cs_dsp_chunk *ch, int nbits)
|
||||||
|
{
|
||||||
|
int nread, i;
|
||||||
|
u32 result;
|
||||||
|
|
||||||
|
if (!ch->cachebits) {
|
||||||
|
if (cs_dsp_chunk_end(ch))
|
||||||
|
return -ENOSPC;
|
||||||
|
|
||||||
|
ch->cache = 0;
|
||||||
|
ch->cachebits = CS_DSP_DATA_WORD_BITS;
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof(ch->cache); i++, ch->cache <<= BITS_PER_BYTE)
|
||||||
|
ch->cache |= *ch->data++;
|
||||||
|
|
||||||
|
ch->bytes += sizeof(ch->cache);
|
||||||
|
}
|
||||||
|
|
||||||
|
nread = min(ch->cachebits, nbits);
|
||||||
|
nbits -= nread;
|
||||||
|
|
||||||
|
result = ch->cache >> ((sizeof(ch->cache) * BITS_PER_BYTE) - nread);
|
||||||
|
ch->cache <<= nread;
|
||||||
|
ch->cachebits -= nread;
|
||||||
|
|
||||||
|
if (nbits)
|
||||||
|
result = (result << nbits) | cs_dsp_chunk_read(ch, nbits);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(cs_dsp_chunk_read);
|
||||||
|
|
||||||
MODULE_DESCRIPTION("Cirrus Logic DSP Support");
|
MODULE_DESCRIPTION("Cirrus Logic DSP Support");
|
||||||
MODULE_AUTHOR("Simon Trimmer <simont@opensource.cirrus.com>");
|
MODULE_AUTHOR("Simon Trimmer <simont@opensource.cirrus.com>");
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
|
@ -12,6 +12,8 @@
|
|||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
|
||||||
|
static const char * const adsp_mbox_ch_names[MTK_ADSP_MBOX_NUM] = { "rx", "tx" };
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mtk_adsp_ipc_send - send ipc cmd to MTK ADSP
|
* mtk_adsp_ipc_send - send ipc cmd to MTK ADSP
|
||||||
*
|
*
|
||||||
@ -72,7 +74,6 @@ static int mtk_adsp_ipc_probe(struct platform_device *pdev)
|
|||||||
struct mtk_adsp_ipc *adsp_ipc;
|
struct mtk_adsp_ipc *adsp_ipc;
|
||||||
struct mtk_adsp_chan *adsp_chan;
|
struct mtk_adsp_chan *adsp_chan;
|
||||||
struct mbox_client *cl;
|
struct mbox_client *cl;
|
||||||
char *chan_name;
|
|
||||||
int ret;
|
int ret;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
@ -83,12 +84,6 @@ static int mtk_adsp_ipc_probe(struct platform_device *pdev)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
for (i = 0; i < MTK_ADSP_MBOX_NUM; i++) {
|
for (i = 0; i < MTK_ADSP_MBOX_NUM; i++) {
|
||||||
chan_name = kasprintf(GFP_KERNEL, "mbox%d", i);
|
|
||||||
if (!chan_name) {
|
|
||||||
ret = -ENOMEM;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
adsp_chan = &adsp_ipc->chans[i];
|
adsp_chan = &adsp_ipc->chans[i];
|
||||||
cl = &adsp_chan->cl;
|
cl = &adsp_chan->cl;
|
||||||
cl->dev = dev->parent;
|
cl->dev = dev->parent;
|
||||||
@ -99,17 +94,20 @@ static int mtk_adsp_ipc_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
adsp_chan->ipc = adsp_ipc;
|
adsp_chan->ipc = adsp_ipc;
|
||||||
adsp_chan->idx = i;
|
adsp_chan->idx = i;
|
||||||
adsp_chan->ch = mbox_request_channel_byname(cl, chan_name);
|
adsp_chan->ch = mbox_request_channel_byname(cl, adsp_mbox_ch_names[i]);
|
||||||
if (IS_ERR(adsp_chan->ch)) {
|
if (IS_ERR(adsp_chan->ch)) {
|
||||||
ret = PTR_ERR(adsp_chan->ch);
|
ret = PTR_ERR(adsp_chan->ch);
|
||||||
if (ret != -EPROBE_DEFER)
|
if (ret != -EPROBE_DEFER)
|
||||||
dev_err(dev, "Failed to request mbox chan %d ret %d\n",
|
dev_err(dev, "Failed to request mbox chan %s ret %d\n",
|
||||||
i, ret);
|
adsp_mbox_ch_names[i], ret);
|
||||||
goto out_free;
|
|
||||||
}
|
|
||||||
|
|
||||||
dev_dbg(dev, "request mbox chan %s\n", chan_name);
|
for (j = 0; j < i; j++) {
|
||||||
kfree(chan_name);
|
adsp_chan = &adsp_ipc->chans[j];
|
||||||
|
mbox_free_channel(adsp_chan->ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
adsp_ipc->dev = dev;
|
adsp_ipc->dev = dev;
|
||||||
@ -117,16 +115,6 @@ static int mtk_adsp_ipc_probe(struct platform_device *pdev)
|
|||||||
dev_dbg(dev, "MTK ADSP IPC initialized\n");
|
dev_dbg(dev, "MTK ADSP IPC initialized\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_free:
|
|
||||||
kfree(chan_name);
|
|
||||||
out:
|
|
||||||
for (j = 0; j < i; j++) {
|
|
||||||
adsp_chan = &adsp_ipc->chans[j];
|
|
||||||
mbox_free_channel(adsp_chan->ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mtk_adsp_ipc_remove(struct platform_device *pdev)
|
static int mtk_adsp_ipc_remove(struct platform_device *pdev)
|
||||||
|
@ -550,8 +550,9 @@ static int sii902x_audio_hw_params(struct device *dev, void *data,
|
|||||||
unsigned long mclk_rate;
|
unsigned long mclk_rate;
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
|
||||||
if (daifmt->bit_clk_master || daifmt->frame_clk_master) {
|
if (daifmt->bit_clk_provider || daifmt->frame_clk_provider) {
|
||||||
dev_dbg(dev, "%s: I2S master mode not supported\n", __func__);
|
dev_dbg(dev, "%s: I2S clock provider mode not supported\n",
|
||||||
|
__func__);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ static int dw_hdmi_i2s_hw_params(struct device *dev, void *data,
|
|||||||
u8 inputclkfs = 0;
|
u8 inputclkfs = 0;
|
||||||
|
|
||||||
/* it cares I2S only */
|
/* it cares I2S only */
|
||||||
if (fmt->bit_clk_master | fmt->frame_clk_master) {
|
if (fmt->bit_clk_provider | fmt->frame_clk_provider) {
|
||||||
dev_err(dev, "unsupported clock settings\n");
|
dev_err(dev, "unsupported clock settings\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -1594,12 +1594,12 @@ static int hdmi_audio_hw_params(struct device *dev, void *data,
|
|||||||
struct hdmi_context *hdata = dev_get_drvdata(dev);
|
struct hdmi_context *hdata = dev_get_drvdata(dev);
|
||||||
|
|
||||||
if (daifmt->fmt != HDMI_I2S || daifmt->bit_clk_inv ||
|
if (daifmt->fmt != HDMI_I2S || daifmt->bit_clk_inv ||
|
||||||
daifmt->frame_clk_inv || daifmt->bit_clk_master ||
|
daifmt->frame_clk_inv || daifmt->bit_clk_provider ||
|
||||||
daifmt->frame_clk_master) {
|
daifmt->frame_clk_provider) {
|
||||||
dev_err(dev, "%s: Bad flags %d %d %d %d\n", __func__,
|
dev_err(dev, "%s: Bad flags %d %d %d %d\n", __func__,
|
||||||
daifmt->bit_clk_inv, daifmt->frame_clk_inv,
|
daifmt->bit_clk_inv, daifmt->frame_clk_inv,
|
||||||
daifmt->bit_clk_master,
|
daifmt->bit_clk_provider,
|
||||||
daifmt->frame_clk_master);
|
daifmt->frame_clk_provider);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1096,11 +1096,11 @@ static int tda998x_audio_hw_params(struct device *dev, void *data,
|
|||||||
|
|
||||||
if (!spdif &&
|
if (!spdif &&
|
||||||
(daifmt->bit_clk_inv || daifmt->frame_clk_inv ||
|
(daifmt->bit_clk_inv || daifmt->frame_clk_inv ||
|
||||||
daifmt->bit_clk_master || daifmt->frame_clk_master)) {
|
daifmt->bit_clk_provider || daifmt->frame_clk_provider)) {
|
||||||
dev_err(dev, "%s: Bad flags %d %d %d %d\n", __func__,
|
dev_err(dev, "%s: Bad flags %d %d %d %d\n", __func__,
|
||||||
daifmt->bit_clk_inv, daifmt->frame_clk_inv,
|
daifmt->bit_clk_inv, daifmt->frame_clk_inv,
|
||||||
daifmt->bit_clk_master,
|
daifmt->bit_clk_provider,
|
||||||
daifmt->frame_clk_master);
|
daifmt->frame_clk_provider);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1176,12 +1176,12 @@ static int hdmi_audio_hw_params(struct device *dev,
|
|||||||
DRM_DEBUG_DRIVER("\n");
|
DRM_DEBUG_DRIVER("\n");
|
||||||
|
|
||||||
if ((daifmt->fmt != HDMI_I2S) || daifmt->bit_clk_inv ||
|
if ((daifmt->fmt != HDMI_I2S) || daifmt->bit_clk_inv ||
|
||||||
daifmt->frame_clk_inv || daifmt->bit_clk_master ||
|
daifmt->frame_clk_inv || daifmt->bit_clk_provider ||
|
||||||
daifmt->frame_clk_master) {
|
daifmt->frame_clk_provider) {
|
||||||
dev_err(dev, "%s: Bad flags %d %d %d %d\n", __func__,
|
dev_err(dev, "%s: Bad flags %d %d %d %d\n", __func__,
|
||||||
daifmt->bit_clk_inv, daifmt->frame_clk_inv,
|
daifmt->bit_clk_inv, daifmt->frame_clk_inv,
|
||||||
daifmt->bit_clk_master,
|
daifmt->bit_clk_provider,
|
||||||
daifmt->frame_clk_master);
|
daifmt->frame_clk_provider);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2003,6 +2003,7 @@ static int vc4_hdmi_audio_prepare(struct device *dev, void *data,
|
|||||||
|
|
||||||
static const struct snd_soc_component_driver vc4_hdmi_audio_cpu_dai_comp = {
|
static const struct snd_soc_component_driver vc4_hdmi_audio_cpu_dai_comp = {
|
||||||
.name = "vc4-hdmi-cpu-dai-component",
|
.name = "vc4-hdmi-cpu-dai-component",
|
||||||
|
.legacy_dai_naming = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int vc4_hdmi_audio_cpu_dai_probe(struct snd_soc_dai *dai)
|
static int vc4_hdmi_audio_cpu_dai_probe(struct snd_soc_dai *dai)
|
||||||
|
@ -2517,7 +2517,6 @@ static struct snd_soc_component_driver tda1997x_codec_driver = {
|
|||||||
.idle_bias_on = 1,
|
.idle_bias_on = 1,
|
||||||
.use_pmdown_time = 1,
|
.use_pmdown_time = 1,
|
||||||
.endianness = 1,
|
.endianness = 1,
|
||||||
.non_legacy_dai_naming = 1,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int tda1997x_probe(struct i2c_client *client,
|
static int tda1997x_probe(struct i2c_client *client,
|
||||||
|
@ -1004,9 +1004,18 @@ static int intel_trigger(struct snd_pcm_substream *substream, int cmd, struct sn
|
|||||||
{
|
{
|
||||||
struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
|
struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
|
||||||
struct sdw_intel *sdw = cdns_to_intel(cdns);
|
struct sdw_intel *sdw = cdns_to_intel(cdns);
|
||||||
|
struct sdw_intel_link_res *res = sdw->link_res;
|
||||||
struct sdw_cdns_dma_data *dma;
|
struct sdw_cdns_dma_data *dma;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The .trigger callback is used to send required IPC to audio
|
||||||
|
* firmware. The .free_stream callback will still be called
|
||||||
|
* by intel_free_stream() in the TRIGGER_SUSPEND case.
|
||||||
|
*/
|
||||||
|
if (res->ops && res->ops->trigger)
|
||||||
|
res->ops->trigger(dai, cmd, substream->stream);
|
||||||
|
|
||||||
dma = snd_soc_dai_get_dma_data(dai, substream);
|
dma = snd_soc_dai_get_dma_data(dai, substream);
|
||||||
if (!dma) {
|
if (!dma) {
|
||||||
dev_err(dai->dev, "failed to get dma data in %s\n",
|
dev_err(dai->dev, "failed to get dma data in %s\n",
|
||||||
@ -1114,9 +1123,10 @@ static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const struct snd_soc_component_driver dai_component = {
|
static const struct snd_soc_component_driver dai_component = {
|
||||||
.name = "soundwire",
|
.name = "soundwire",
|
||||||
.probe = intel_component_probe,
|
.probe = intel_component_probe,
|
||||||
.suspend = intel_component_dais_suspend
|
.suspend = intel_component_dais_suspend,
|
||||||
|
.legacy_dai_naming = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int intel_create_dai(struct sdw_cdns *cdns,
|
static int intel_create_dai(struct sdw_cdns *cdns,
|
||||||
|
15
include/dt-bindings/sound/qcom,wcd9335.h
Normal file
15
include/dt-bindings/sound/qcom,wcd9335.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||||
|
|
||||||
|
#ifndef __DT_SOUND_QCOM_WCD9335_H
|
||||||
|
#define __DT_SOUND_QCOM_WCD9335_H
|
||||||
|
|
||||||
|
#define AIF1_PB 0
|
||||||
|
#define AIF1_CAP 1
|
||||||
|
#define AIF2_PB 2
|
||||||
|
#define AIF2_CAP 3
|
||||||
|
#define AIF3_PB 4
|
||||||
|
#define AIF3_CAP 5
|
||||||
|
#define AIF4_PB 6
|
||||||
|
#define NUM_CODEC_DAIS 7
|
||||||
|
|
||||||
|
#endif
|
@ -764,6 +764,7 @@ static inline u64 acpi_arch_get_root_pointer(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
int acpi_get_local_address(acpi_handle handle, u32 *addr);
|
int acpi_get_local_address(acpi_handle handle, u32 *addr);
|
||||||
|
const char *acpi_get_subsystem_id(acpi_handle handle);
|
||||||
|
|
||||||
#else /* !CONFIG_ACPI */
|
#else /* !CONFIG_ACPI */
|
||||||
|
|
||||||
@ -1025,6 +1026,11 @@ static inline int acpi_get_local_address(acpi_handle handle, u32 *addr)
|
|||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline const char *acpi_get_subsystem_id(acpi_handle handle)
|
||||||
|
{
|
||||||
|
return ERR_PTR(-ENODEV);
|
||||||
|
}
|
||||||
|
|
||||||
static inline int acpi_register_wakeup_handler(int wake_irq,
|
static inline int acpi_register_wakeup_handler(int wake_irq,
|
||||||
bool (*wakeup)(void *context), void *context)
|
bool (*wakeup)(void *context), void *context)
|
||||||
{
|
{
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#ifndef __CS_DSP_H
|
#ifndef __CS_DSP_H
|
||||||
#define __CS_DSP_H
|
#define __CS_DSP_H
|
||||||
|
|
||||||
|
#include <linux/bits.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/firmware.h>
|
#include <linux/firmware.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
@ -34,6 +35,7 @@
|
|||||||
#define CS_ADSP2_REGION_ALL (CS_ADSP2_REGION_0 | CS_ADSP2_REGION_1_9)
|
#define CS_ADSP2_REGION_ALL (CS_ADSP2_REGION_0 | CS_ADSP2_REGION_1_9)
|
||||||
|
|
||||||
#define CS_DSP_DATA_WORD_SIZE 3
|
#define CS_DSP_DATA_WORD_SIZE 3
|
||||||
|
#define CS_DSP_DATA_WORD_BITS (3 * BITS_PER_BYTE)
|
||||||
|
|
||||||
#define CS_DSP_ACKED_CTL_TIMEOUT_MS 100
|
#define CS_DSP_ACKED_CTL_TIMEOUT_MS 100
|
||||||
#define CS_DSP_ACKED_CTL_N_QUICKPOLLS 10
|
#define CS_DSP_ACKED_CTL_N_QUICKPOLLS 10
|
||||||
@ -189,7 +191,8 @@ struct cs_dsp {
|
|||||||
* @control_remove: Called under the pwr_lock when a control is destroyed
|
* @control_remove: Called under the pwr_lock when a control is destroyed
|
||||||
* @pre_run: Called under the pwr_lock by cs_dsp_run() before the core is started
|
* @pre_run: Called under the pwr_lock by cs_dsp_run() before the core is started
|
||||||
* @post_run: Called under the pwr_lock by cs_dsp_run() after the core is started
|
* @post_run: Called under the pwr_lock by cs_dsp_run() after the core is started
|
||||||
* @post_stop: Called under the pwr_lock by cs_dsp_stop()
|
* @pre_stop: Called under the pwr_lock by cs_dsp_stop() before the core is stopped
|
||||||
|
* @post_stop: Called under the pwr_lock by cs_dsp_stop() after the core is stopped
|
||||||
* @watchdog_expired: Called when a watchdog expiry is detected
|
* @watchdog_expired: Called when a watchdog expiry is detected
|
||||||
*
|
*
|
||||||
* These callbacks give the cs_dsp client an opportunity to respond to events
|
* These callbacks give the cs_dsp client an opportunity to respond to events
|
||||||
@ -200,6 +203,7 @@ struct cs_dsp_client_ops {
|
|||||||
void (*control_remove)(struct cs_dsp_coeff_ctl *ctl);
|
void (*control_remove)(struct cs_dsp_coeff_ctl *ctl);
|
||||||
int (*pre_run)(struct cs_dsp *dsp);
|
int (*pre_run)(struct cs_dsp *dsp);
|
||||||
int (*post_run)(struct cs_dsp *dsp);
|
int (*post_run)(struct cs_dsp *dsp);
|
||||||
|
void (*pre_stop)(struct cs_dsp *dsp);
|
||||||
void (*post_stop)(struct cs_dsp *dsp);
|
void (*post_stop)(struct cs_dsp *dsp);
|
||||||
void (*watchdog_expired)(struct cs_dsp *dsp);
|
void (*watchdog_expired)(struct cs_dsp *dsp);
|
||||||
};
|
};
|
||||||
@ -250,4 +254,75 @@ struct cs_dsp_alg_region *cs_dsp_find_alg_region(struct cs_dsp *dsp,
|
|||||||
|
|
||||||
const char *cs_dsp_mem_region_name(unsigned int type);
|
const char *cs_dsp_mem_region_name(unsigned int type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct cs_dsp_chunk - Describes a buffer holding data formatted for the DSP
|
||||||
|
* @data: Pointer to underlying buffer memory
|
||||||
|
* @max: Pointer to end of the buffer memory
|
||||||
|
* @bytes: Number of bytes read/written into the memory chunk
|
||||||
|
* @cache: Temporary holding data as it is formatted
|
||||||
|
* @cachebits: Number of bits of data currently in cache
|
||||||
|
*/
|
||||||
|
struct cs_dsp_chunk {
|
||||||
|
u8 *data;
|
||||||
|
u8 *max;
|
||||||
|
int bytes;
|
||||||
|
|
||||||
|
u32 cache;
|
||||||
|
int cachebits;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cs_dsp_chunk() - Create a DSP memory chunk
|
||||||
|
* @data: Pointer to the buffer that will be used to store data
|
||||||
|
* @size: Size of the buffer in bytes
|
||||||
|
*
|
||||||
|
* Return: A cs_dsp_chunk structure
|
||||||
|
*/
|
||||||
|
static inline struct cs_dsp_chunk cs_dsp_chunk(void *data, int size)
|
||||||
|
{
|
||||||
|
struct cs_dsp_chunk ch = {
|
||||||
|
.data = data,
|
||||||
|
.max = data + size,
|
||||||
|
};
|
||||||
|
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cs_dsp_chunk_end() - Check if a DSP memory chunk is full
|
||||||
|
* @ch: Pointer to the chunk structure
|
||||||
|
*
|
||||||
|
* Return: True if the whole buffer has been read/written
|
||||||
|
*/
|
||||||
|
static inline bool cs_dsp_chunk_end(struct cs_dsp_chunk *ch)
|
||||||
|
{
|
||||||
|
return ch->data == ch->max;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cs_dsp_chunk_bytes() - Number of bytes written/read from a DSP memory chunk
|
||||||
|
* @ch: Pointer to the chunk structure
|
||||||
|
*
|
||||||
|
* Return: Number of bytes read/written to the buffer
|
||||||
|
*/
|
||||||
|
static inline int cs_dsp_chunk_bytes(struct cs_dsp_chunk *ch)
|
||||||
|
{
|
||||||
|
return ch->bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cs_dsp_chunk_valid_addr() - Check if an address is in a DSP memory chunk
|
||||||
|
* @ch: Pointer to the chunk structure
|
||||||
|
*
|
||||||
|
* Return: True if the given address is within the buffer
|
||||||
|
*/
|
||||||
|
static inline bool cs_dsp_chunk_valid_addr(struct cs_dsp_chunk *ch, void *addr)
|
||||||
|
{
|
||||||
|
return (u8 *)addr >= ch->data && (u8 *)addr < ch->max;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cs_dsp_chunk_write(struct cs_dsp_chunk *ch, int nbits, u32 val);
|
||||||
|
int cs_dsp_chunk_flush(struct cs_dsp_chunk *ch);
|
||||||
|
int cs_dsp_chunk_read(struct cs_dsp_chunk *ch, int nbits);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
|
|
||||||
#define SDW_SHIM_BASE 0x2C000
|
#define SDW_SHIM_BASE 0x2C000
|
||||||
#define SDW_ALH_BASE 0x2C800
|
#define SDW_ALH_BASE 0x2C800
|
||||||
|
#define SDW_SHIM_BASE_ACE 0x38000
|
||||||
|
#define SDW_ALH_BASE_ACE 0x24000
|
||||||
#define SDW_LINK_BASE 0x30000
|
#define SDW_LINK_BASE 0x30000
|
||||||
#define SDW_LINK_SIZE 0x10000
|
#define SDW_LINK_SIZE 0x10000
|
||||||
|
|
||||||
@ -119,6 +121,7 @@ struct sdw_intel_ops {
|
|||||||
struct sdw_intel_stream_params_data *params_data);
|
struct sdw_intel_stream_params_data *params_data);
|
||||||
int (*free_stream)(struct device *dev,
|
int (*free_stream)(struct device *dev,
|
||||||
struct sdw_intel_stream_free_data *free_data);
|
struct sdw_intel_stream_free_data *free_data);
|
||||||
|
int (*trigger)(struct snd_soc_dai *dai, int cmd, int stream);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -23,7 +23,7 @@ typedef int (snd_kcontrol_tlv_rw_t)(struct snd_kcontrol *kcontrol,
|
|||||||
unsigned int __user *tlv);
|
unsigned int __user *tlv);
|
||||||
|
|
||||||
/* internal flag for skipping validations */
|
/* internal flag for skipping validations */
|
||||||
#ifdef CONFIG_SND_CTL_VALIDATION
|
#ifdef CONFIG_SND_CTL_DEBUG
|
||||||
#define SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK (1 << 24)
|
#define SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK (1 << 24)
|
||||||
#define snd_ctl_skip_validation(info) \
|
#define snd_ctl_skip_validation(info) \
|
||||||
((info)->access & SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK)
|
((info)->access & SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK)
|
||||||
@ -109,7 +109,7 @@ struct snd_ctl_file {
|
|||||||
int preferred_subdevice[SND_CTL_SUBDEV_ITEMS];
|
int preferred_subdevice[SND_CTL_SUBDEV_ITEMS];
|
||||||
wait_queue_head_t change_sleep;
|
wait_queue_head_t change_sleep;
|
||||||
spinlock_t read_lock;
|
spinlock_t read_lock;
|
||||||
struct fasync_struct *fasync;
|
struct snd_fasync *fasync;
|
||||||
int subscribed; /* read interface is activated */
|
int subscribed; /* read interface is activated */
|
||||||
struct list_head events; /* waiting events for read */
|
struct list_head events; /* waiting events for read */
|
||||||
};
|
};
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include <linux/pm.h> /* pm_message_t */
|
#include <linux/pm.h> /* pm_message_t */
|
||||||
#include <linux/stringify.h>
|
#include <linux/stringify.h>
|
||||||
#include <linux/printk.h>
|
#include <linux/printk.h>
|
||||||
|
#include <linux/xarray.h>
|
||||||
|
|
||||||
/* number of supported soundcards */
|
/* number of supported soundcards */
|
||||||
#ifdef CONFIG_SND_DYNAMIC_MINORS
|
#ifdef CONFIG_SND_DYNAMIC_MINORS
|
||||||
@ -103,6 +104,11 @@ struct snd_card {
|
|||||||
size_t user_ctl_alloc_size; // current memory allocation by user controls.
|
size_t user_ctl_alloc_size; // current memory allocation by user controls.
|
||||||
struct list_head controls; /* all controls for this card */
|
struct list_head controls; /* all controls for this card */
|
||||||
struct list_head ctl_files; /* active control files */
|
struct list_head ctl_files; /* active control files */
|
||||||
|
#ifdef CONFIG_SND_CTL_FAST_LOOKUP
|
||||||
|
struct xarray ctl_numids; /* hash table for numids */
|
||||||
|
struct xarray ctl_hash; /* hash table for ctl id matching */
|
||||||
|
bool ctl_hash_collision; /* ctl_hash collision seen? */
|
||||||
|
#endif
|
||||||
|
|
||||||
struct snd_info_entry *proc_root; /* root for soundcard specific files */
|
struct snd_info_entry *proc_root; /* root for soundcard specific files */
|
||||||
struct proc_dir_entry *proc_root_link; /* number link to real id */
|
struct proc_dir_entry *proc_root_link; /* number link to real id */
|
||||||
@ -501,4 +507,12 @@ snd_pci_quirk_lookup_id(u16 vendor, u16 device,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* async signal helpers */
|
||||||
|
struct snd_fasync;
|
||||||
|
|
||||||
|
int snd_fasync_helper(int fd, struct file *file, int on,
|
||||||
|
struct snd_fasync **fasyncp);
|
||||||
|
void snd_kill_fasync(struct snd_fasync *fasync, int signal, int poll);
|
||||||
|
void snd_fasync_free(struct snd_fasync *fasync);
|
||||||
|
|
||||||
#endif /* __SOUND_CORE_H */
|
#endif /* __SOUND_CORE_H */
|
||||||
|
@ -665,6 +665,10 @@
|
|||||||
#define CS35L41_BST_EN_DEFAULT 0x2
|
#define CS35L41_BST_EN_DEFAULT 0x2
|
||||||
#define CS35L41_AMP_EN_SHIFT 0
|
#define CS35L41_AMP_EN_SHIFT 0
|
||||||
#define CS35L41_AMP_EN_MASK 1
|
#define CS35L41_AMP_EN_MASK 1
|
||||||
|
#define CS35L41_VMON_EN_MASK 0x1000
|
||||||
|
#define CS35L41_VMON_EN_SHIFT 12
|
||||||
|
#define CS35L41_IMON_EN_MASK 0x2000
|
||||||
|
#define CS35L41_IMON_EN_SHIFT 13
|
||||||
|
|
||||||
#define CS35L41_PDN_DONE_MASK 0x00800000
|
#define CS35L41_PDN_DONE_MASK 0x00800000
|
||||||
#define CS35L41_PDN_DONE_SHIFT 23
|
#define CS35L41_PDN_DONE_SHIFT 23
|
||||||
@ -881,6 +885,9 @@ void cs35l41_configure_cs_dsp(struct device *dev, struct regmap *reg, struct cs_
|
|||||||
int cs35l41_set_cspl_mbox_cmd(struct device *dev, struct regmap *regmap,
|
int cs35l41_set_cspl_mbox_cmd(struct device *dev, struct regmap *regmap,
|
||||||
enum cs35l41_cspl_mbox_cmd cmd);
|
enum cs35l41_cspl_mbox_cmd cmd);
|
||||||
int cs35l41_write_fs_errata(struct device *dev, struct regmap *regmap);
|
int cs35l41_write_fs_errata(struct device *dev, struct regmap *regmap);
|
||||||
|
int cs35l41_enter_hibernate(struct device *dev, struct regmap *regmap,
|
||||||
|
enum cs35l41_boost_type b_type);
|
||||||
|
int cs35l41_exit_hibernate(struct device *dev, struct regmap *regmap);
|
||||||
int cs35l41_init_boost(struct device *dev, struct regmap *regmap,
|
int cs35l41_init_boost(struct device *dev, struct regmap *regmap,
|
||||||
struct cs35l41_hw_cfg *hw_cfg);
|
struct cs35l41_hw_cfg *hw_cfg);
|
||||||
bool cs35l41_safe_reset(struct regmap *regmap, enum cs35l41_boost_type b_type);
|
bool cs35l41_safe_reset(struct regmap *regmap, enum cs35l41_boost_type b_type);
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
* snd_pcm_substream_to_dma_direction - Get dma_transfer_direction for a PCM
|
* snd_pcm_substream_to_dma_direction - Get dma_transfer_direction for a PCM
|
||||||
* substream
|
* substream
|
||||||
* @substream: PCM substream
|
* @substream: PCM substream
|
||||||
|
*
|
||||||
|
* Return: DMA transfer direction
|
||||||
*/
|
*/
|
||||||
static inline enum dma_transfer_direction
|
static inline enum dma_transfer_direction
|
||||||
snd_pcm_substream_to_dma_direction(const struct snd_pcm_substream *substream)
|
snd_pcm_substream_to_dma_direction(const struct snd_pcm_substream *substream)
|
||||||
|
@ -231,7 +231,6 @@ struct hda_codec {
|
|||||||
/* misc flags */
|
/* misc flags */
|
||||||
unsigned int configured:1; /* codec was configured */
|
unsigned int configured:1; /* codec was configured */
|
||||||
unsigned int in_freeing:1; /* being released */
|
unsigned int in_freeing:1; /* being released */
|
||||||
unsigned int registered:1; /* codec was registered */
|
|
||||||
unsigned int display_power_control:1; /* needs display power */
|
unsigned int display_power_control:1; /* needs display power */
|
||||||
unsigned int spdif_status_reset :1; /* needs to toggle SPDIF for each
|
unsigned int spdif_status_reset :1; /* needs to toggle SPDIF for each
|
||||||
* status change
|
* status change
|
||||||
|
@ -93,6 +93,7 @@ struct hdac_device {
|
|||||||
bool lazy_cache:1; /* don't wake up for writes */
|
bool lazy_cache:1; /* don't wake up for writes */
|
||||||
bool caps_overwriting:1; /* caps overwrite being in process */
|
bool caps_overwriting:1; /* caps overwrite being in process */
|
||||||
bool cache_coef:1; /* cache COEF read/write too */
|
bool cache_coef:1; /* cache COEF read/write too */
|
||||||
|
unsigned int registered:1; /* codec was registered */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* device/driver type used for matching */
|
/* device/driver type used for matching */
|
||||||
|
@ -32,8 +32,8 @@ struct hdmi_codec_daifmt {
|
|||||||
} fmt;
|
} fmt;
|
||||||
unsigned int bit_clk_inv:1;
|
unsigned int bit_clk_inv:1;
|
||||||
unsigned int frame_clk_inv:1;
|
unsigned int frame_clk_inv:1;
|
||||||
unsigned int bit_clk_master:1;
|
unsigned int bit_clk_provider:1;
|
||||||
unsigned int frame_clk_master:1;
|
unsigned int frame_clk_provider:1;
|
||||||
/* bit_fmt could be standard PCM format or
|
/* bit_fmt could be standard PCM format or
|
||||||
* IEC958 encoded format. ALSA IEC958 plugin will pass
|
* IEC958 encoded format. ALSA IEC958 plugin will pass
|
||||||
* IEC958_SUBFRAME format to the underneath driver.
|
* IEC958_SUBFRAME format to the underneath driver.
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
#ifndef MADERA_CODEC_PDATA_H
|
#ifndef MADERA_CODEC_PDATA_H
|
||||||
#define MADERA_CODEC_PDATA_H
|
#define MADERA_CODEC_PDATA_H
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
#define MADERA_MAX_INPUT 6
|
#define MADERA_MAX_INPUT 6
|
||||||
#define MADERA_MAX_MUXED_CHANNELS 4
|
#define MADERA_MAX_MUXED_CHANNELS 4
|
||||||
|
@ -399,7 +399,7 @@ struct snd_pcm_runtime {
|
|||||||
snd_pcm_uframes_t twake; /* do transfer (!poll) wakeup if non-zero */
|
snd_pcm_uframes_t twake; /* do transfer (!poll) wakeup if non-zero */
|
||||||
wait_queue_head_t sleep; /* poll sleep */
|
wait_queue_head_t sleep; /* poll sleep */
|
||||||
wait_queue_head_t tsleep; /* transfer sleep */
|
wait_queue_head_t tsleep; /* transfer sleep */
|
||||||
struct fasync_struct *fasync;
|
struct snd_fasync *fasync;
|
||||||
bool stop_operating; /* sync_stop will be called */
|
bool stop_operating; /* sync_stop will be called */
|
||||||
struct mutex buffer_mutex; /* protect for buffer changes */
|
struct mutex buffer_mutex; /* protect for buffer changes */
|
||||||
atomic_t buffer_accessing; /* >0: in r/w operation, <0: blocked */
|
atomic_t buffer_accessing; /* >0: in r/w operation, <0: blocked */
|
||||||
@ -607,7 +607,7 @@ snd_pcm_debug_name(struct snd_pcm_substream *substream, char *buf, size_t size)
|
|||||||
* snd_pcm_stream_linked - Check whether the substream is linked with others
|
* snd_pcm_stream_linked - Check whether the substream is linked with others
|
||||||
* @substream: substream to check
|
* @substream: substream to check
|
||||||
*
|
*
|
||||||
* Returns true if the given substream is being linked with others.
|
* Return: true if the given substream is being linked with others
|
||||||
*/
|
*/
|
||||||
static inline int snd_pcm_stream_linked(struct snd_pcm_substream *substream)
|
static inline int snd_pcm_stream_linked(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
@ -673,7 +673,7 @@ void snd_pcm_stream_unlock_irqrestore(struct snd_pcm_substream *substream,
|
|||||||
* snd_pcm_running - Check whether the substream is in a running state
|
* snd_pcm_running - Check whether the substream is in a running state
|
||||||
* @substream: substream to check
|
* @substream: substream to check
|
||||||
*
|
*
|
||||||
* Returns true if the given substream is in the state RUNNING, or in the
|
* Return: true if the given substream is in the state RUNNING, or in the
|
||||||
* state DRAINING for playback.
|
* state DRAINING for playback.
|
||||||
*/
|
*/
|
||||||
static inline int snd_pcm_running(struct snd_pcm_substream *substream)
|
static inline int snd_pcm_running(struct snd_pcm_substream *substream)
|
||||||
@ -687,6 +687,8 @@ static inline int snd_pcm_running(struct snd_pcm_substream *substream)
|
|||||||
* bytes_to_samples - Unit conversion of the size from bytes to samples
|
* bytes_to_samples - Unit conversion of the size from bytes to samples
|
||||||
* @runtime: PCM runtime instance
|
* @runtime: PCM runtime instance
|
||||||
* @size: size in bytes
|
* @size: size in bytes
|
||||||
|
*
|
||||||
|
* Return: the size in samples
|
||||||
*/
|
*/
|
||||||
static inline ssize_t bytes_to_samples(struct snd_pcm_runtime *runtime, ssize_t size)
|
static inline ssize_t bytes_to_samples(struct snd_pcm_runtime *runtime, ssize_t size)
|
||||||
{
|
{
|
||||||
@ -697,6 +699,8 @@ static inline ssize_t bytes_to_samples(struct snd_pcm_runtime *runtime, ssize_t
|
|||||||
* bytes_to_frames - Unit conversion of the size from bytes to frames
|
* bytes_to_frames - Unit conversion of the size from bytes to frames
|
||||||
* @runtime: PCM runtime instance
|
* @runtime: PCM runtime instance
|
||||||
* @size: size in bytes
|
* @size: size in bytes
|
||||||
|
*
|
||||||
|
* Return: the size in frames
|
||||||
*/
|
*/
|
||||||
static inline snd_pcm_sframes_t bytes_to_frames(struct snd_pcm_runtime *runtime, ssize_t size)
|
static inline snd_pcm_sframes_t bytes_to_frames(struct snd_pcm_runtime *runtime, ssize_t size)
|
||||||
{
|
{
|
||||||
@ -707,6 +711,8 @@ static inline snd_pcm_sframes_t bytes_to_frames(struct snd_pcm_runtime *runtime,
|
|||||||
* samples_to_bytes - Unit conversion of the size from samples to bytes
|
* samples_to_bytes - Unit conversion of the size from samples to bytes
|
||||||
* @runtime: PCM runtime instance
|
* @runtime: PCM runtime instance
|
||||||
* @size: size in samples
|
* @size: size in samples
|
||||||
|
*
|
||||||
|
* Return: the byte size
|
||||||
*/
|
*/
|
||||||
static inline ssize_t samples_to_bytes(struct snd_pcm_runtime *runtime, ssize_t size)
|
static inline ssize_t samples_to_bytes(struct snd_pcm_runtime *runtime, ssize_t size)
|
||||||
{
|
{
|
||||||
@ -717,6 +723,8 @@ static inline ssize_t samples_to_bytes(struct snd_pcm_runtime *runtime, ssize_t
|
|||||||
* frames_to_bytes - Unit conversion of the size from frames to bytes
|
* frames_to_bytes - Unit conversion of the size from frames to bytes
|
||||||
* @runtime: PCM runtime instance
|
* @runtime: PCM runtime instance
|
||||||
* @size: size in frames
|
* @size: size in frames
|
||||||
|
*
|
||||||
|
* Return: the byte size
|
||||||
*/
|
*/
|
||||||
static inline ssize_t frames_to_bytes(struct snd_pcm_runtime *runtime, snd_pcm_sframes_t size)
|
static inline ssize_t frames_to_bytes(struct snd_pcm_runtime *runtime, snd_pcm_sframes_t size)
|
||||||
{
|
{
|
||||||
@ -727,6 +735,8 @@ static inline ssize_t frames_to_bytes(struct snd_pcm_runtime *runtime, snd_pcm_s
|
|||||||
* frame_aligned - Check whether the byte size is aligned to frames
|
* frame_aligned - Check whether the byte size is aligned to frames
|
||||||
* @runtime: PCM runtime instance
|
* @runtime: PCM runtime instance
|
||||||
* @bytes: size in bytes
|
* @bytes: size in bytes
|
||||||
|
*
|
||||||
|
* Return: true if aligned, or false if not
|
||||||
*/
|
*/
|
||||||
static inline int frame_aligned(struct snd_pcm_runtime *runtime, ssize_t bytes)
|
static inline int frame_aligned(struct snd_pcm_runtime *runtime, ssize_t bytes)
|
||||||
{
|
{
|
||||||
@ -736,6 +746,8 @@ static inline int frame_aligned(struct snd_pcm_runtime *runtime, ssize_t bytes)
|
|||||||
/**
|
/**
|
||||||
* snd_pcm_lib_buffer_bytes - Get the buffer size of the current PCM in bytes
|
* snd_pcm_lib_buffer_bytes - Get the buffer size of the current PCM in bytes
|
||||||
* @substream: PCM substream
|
* @substream: PCM substream
|
||||||
|
*
|
||||||
|
* Return: buffer byte size
|
||||||
*/
|
*/
|
||||||
static inline size_t snd_pcm_lib_buffer_bytes(struct snd_pcm_substream *substream)
|
static inline size_t snd_pcm_lib_buffer_bytes(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
@ -746,6 +758,8 @@ static inline size_t snd_pcm_lib_buffer_bytes(struct snd_pcm_substream *substrea
|
|||||||
/**
|
/**
|
||||||
* snd_pcm_lib_period_bytes - Get the period size of the current PCM in bytes
|
* snd_pcm_lib_period_bytes - Get the period size of the current PCM in bytes
|
||||||
* @substream: PCM substream
|
* @substream: PCM substream
|
||||||
|
*
|
||||||
|
* Return: period byte size
|
||||||
*/
|
*/
|
||||||
static inline size_t snd_pcm_lib_period_bytes(struct snd_pcm_substream *substream)
|
static inline size_t snd_pcm_lib_period_bytes(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
@ -758,6 +772,8 @@ static inline size_t snd_pcm_lib_period_bytes(struct snd_pcm_substream *substrea
|
|||||||
* @runtime: PCM runtime instance
|
* @runtime: PCM runtime instance
|
||||||
*
|
*
|
||||||
* Result is between 0 ... (boundary - 1)
|
* Result is between 0 ... (boundary - 1)
|
||||||
|
*
|
||||||
|
* Return: available frame size
|
||||||
*/
|
*/
|
||||||
static inline snd_pcm_uframes_t snd_pcm_playback_avail(struct snd_pcm_runtime *runtime)
|
static inline snd_pcm_uframes_t snd_pcm_playback_avail(struct snd_pcm_runtime *runtime)
|
||||||
{
|
{
|
||||||
@ -774,6 +790,8 @@ static inline snd_pcm_uframes_t snd_pcm_playback_avail(struct snd_pcm_runtime *r
|
|||||||
* @runtime: PCM runtime instance
|
* @runtime: PCM runtime instance
|
||||||
*
|
*
|
||||||
* Result is between 0 ... (boundary - 1)
|
* Result is between 0 ... (boundary - 1)
|
||||||
|
*
|
||||||
|
* Return: available frame size
|
||||||
*/
|
*/
|
||||||
static inline snd_pcm_uframes_t snd_pcm_capture_avail(struct snd_pcm_runtime *runtime)
|
static inline snd_pcm_uframes_t snd_pcm_capture_avail(struct snd_pcm_runtime *runtime)
|
||||||
{
|
{
|
||||||
@ -786,6 +804,8 @@ static inline snd_pcm_uframes_t snd_pcm_capture_avail(struct snd_pcm_runtime *ru
|
|||||||
/**
|
/**
|
||||||
* snd_pcm_playback_hw_avail - Get the queued space for playback
|
* snd_pcm_playback_hw_avail - Get the queued space for playback
|
||||||
* @runtime: PCM runtime instance
|
* @runtime: PCM runtime instance
|
||||||
|
*
|
||||||
|
* Return: available frame size
|
||||||
*/
|
*/
|
||||||
static inline snd_pcm_sframes_t snd_pcm_playback_hw_avail(struct snd_pcm_runtime *runtime)
|
static inline snd_pcm_sframes_t snd_pcm_playback_hw_avail(struct snd_pcm_runtime *runtime)
|
||||||
{
|
{
|
||||||
@ -795,6 +815,8 @@ static inline snd_pcm_sframes_t snd_pcm_playback_hw_avail(struct snd_pcm_runtime
|
|||||||
/**
|
/**
|
||||||
* snd_pcm_capture_hw_avail - Get the free space for capture
|
* snd_pcm_capture_hw_avail - Get the free space for capture
|
||||||
* @runtime: PCM runtime instance
|
* @runtime: PCM runtime instance
|
||||||
|
*
|
||||||
|
* Return: available frame size
|
||||||
*/
|
*/
|
||||||
static inline snd_pcm_sframes_t snd_pcm_capture_hw_avail(struct snd_pcm_runtime *runtime)
|
static inline snd_pcm_sframes_t snd_pcm_capture_hw_avail(struct snd_pcm_runtime *runtime)
|
||||||
{
|
{
|
||||||
@ -934,6 +956,8 @@ static inline const struct snd_interval *hw_param_interval_c(const struct snd_pc
|
|||||||
/**
|
/**
|
||||||
* params_channels - Get the number of channels from the hw params
|
* params_channels - Get the number of channels from the hw params
|
||||||
* @p: hw params
|
* @p: hw params
|
||||||
|
*
|
||||||
|
* Return: the number of channels
|
||||||
*/
|
*/
|
||||||
static inline unsigned int params_channels(const struct snd_pcm_hw_params *p)
|
static inline unsigned int params_channels(const struct snd_pcm_hw_params *p)
|
||||||
{
|
{
|
||||||
@ -943,6 +967,8 @@ static inline unsigned int params_channels(const struct snd_pcm_hw_params *p)
|
|||||||
/**
|
/**
|
||||||
* params_rate - Get the sample rate from the hw params
|
* params_rate - Get the sample rate from the hw params
|
||||||
* @p: hw params
|
* @p: hw params
|
||||||
|
*
|
||||||
|
* Return: the sample rate
|
||||||
*/
|
*/
|
||||||
static inline unsigned int params_rate(const struct snd_pcm_hw_params *p)
|
static inline unsigned int params_rate(const struct snd_pcm_hw_params *p)
|
||||||
{
|
{
|
||||||
@ -952,6 +978,8 @@ static inline unsigned int params_rate(const struct snd_pcm_hw_params *p)
|
|||||||
/**
|
/**
|
||||||
* params_period_size - Get the period size (in frames) from the hw params
|
* params_period_size - Get the period size (in frames) from the hw params
|
||||||
* @p: hw params
|
* @p: hw params
|
||||||
|
*
|
||||||
|
* Return: the period size in frames
|
||||||
*/
|
*/
|
||||||
static inline unsigned int params_period_size(const struct snd_pcm_hw_params *p)
|
static inline unsigned int params_period_size(const struct snd_pcm_hw_params *p)
|
||||||
{
|
{
|
||||||
@ -961,6 +989,8 @@ static inline unsigned int params_period_size(const struct snd_pcm_hw_params *p)
|
|||||||
/**
|
/**
|
||||||
* params_periods - Get the number of periods from the hw params
|
* params_periods - Get the number of periods from the hw params
|
||||||
* @p: hw params
|
* @p: hw params
|
||||||
|
*
|
||||||
|
* Return: the number of periods
|
||||||
*/
|
*/
|
||||||
static inline unsigned int params_periods(const struct snd_pcm_hw_params *p)
|
static inline unsigned int params_periods(const struct snd_pcm_hw_params *p)
|
||||||
{
|
{
|
||||||
@ -970,6 +1000,8 @@ static inline unsigned int params_periods(const struct snd_pcm_hw_params *p)
|
|||||||
/**
|
/**
|
||||||
* params_buffer_size - Get the buffer size (in frames) from the hw params
|
* params_buffer_size - Get the buffer size (in frames) from the hw params
|
||||||
* @p: hw params
|
* @p: hw params
|
||||||
|
*
|
||||||
|
* Return: the buffer size in frames
|
||||||
*/
|
*/
|
||||||
static inline unsigned int params_buffer_size(const struct snd_pcm_hw_params *p)
|
static inline unsigned int params_buffer_size(const struct snd_pcm_hw_params *p)
|
||||||
{
|
{
|
||||||
@ -979,6 +1011,8 @@ static inline unsigned int params_buffer_size(const struct snd_pcm_hw_params *p)
|
|||||||
/**
|
/**
|
||||||
* params_buffer_bytes - Get the buffer size (in bytes) from the hw params
|
* params_buffer_bytes - Get the buffer size (in bytes) from the hw params
|
||||||
* @p: hw params
|
* @p: hw params
|
||||||
|
*
|
||||||
|
* Return: the buffer size in bytes
|
||||||
*/
|
*/
|
||||||
static inline unsigned int params_buffer_bytes(const struct snd_pcm_hw_params *p)
|
static inline unsigned int params_buffer_bytes(const struct snd_pcm_hw_params *p)
|
||||||
{
|
{
|
||||||
@ -1241,6 +1275,8 @@ int snd_pcm_set_managed_buffer_all(struct snd_pcm *pcm, int type,
|
|||||||
* only the given sized buffer and doesn't allow re-allocation nor dynamic
|
* only the given sized buffer and doesn't allow re-allocation nor dynamic
|
||||||
* allocation of a larger buffer unlike the standard one.
|
* allocation of a larger buffer unlike the standard one.
|
||||||
* The function may return -ENOMEM error, hence the caller must check it.
|
* The function may return -ENOMEM error, hence the caller must check it.
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
static inline int __must_check
|
static inline int __must_check
|
||||||
snd_pcm_set_fixed_buffer(struct snd_pcm_substream *substream, int type,
|
snd_pcm_set_fixed_buffer(struct snd_pcm_substream *substream, int type,
|
||||||
@ -1259,6 +1295,8 @@ snd_pcm_set_fixed_buffer(struct snd_pcm_substream *substream, int type,
|
|||||||
* Apply the set up of the fixed buffer via snd_pcm_set_fixed_buffer() for
|
* Apply the set up of the fixed buffer via snd_pcm_set_fixed_buffer() for
|
||||||
* all substream. If any of allocation fails, it returns -ENOMEM, hence the
|
* all substream. If any of allocation fails, it returns -ENOMEM, hence the
|
||||||
* caller must check the return value.
|
* caller must check the return value.
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
static inline int __must_check
|
static inline int __must_check
|
||||||
snd_pcm_set_fixed_buffer_all(struct snd_pcm *pcm, int type,
|
snd_pcm_set_fixed_buffer_all(struct snd_pcm *pcm, int type,
|
||||||
@ -1315,6 +1353,8 @@ static inline int snd_pcm_lib_alloc_vmalloc_32_buffer
|
|||||||
* snd_pcm_sgbuf_get_addr - Get the DMA address at the corresponding offset
|
* snd_pcm_sgbuf_get_addr - Get the DMA address at the corresponding offset
|
||||||
* @substream: PCM substream
|
* @substream: PCM substream
|
||||||
* @ofs: byte offset
|
* @ofs: byte offset
|
||||||
|
*
|
||||||
|
* Return: DMA address
|
||||||
*/
|
*/
|
||||||
static inline dma_addr_t
|
static inline dma_addr_t
|
||||||
snd_pcm_sgbuf_get_addr(struct snd_pcm_substream *substream, unsigned int ofs)
|
snd_pcm_sgbuf_get_addr(struct snd_pcm_substream *substream, unsigned int ofs)
|
||||||
@ -1328,6 +1368,8 @@ snd_pcm_sgbuf_get_addr(struct snd_pcm_substream *substream, unsigned int ofs)
|
|||||||
* @substream: PCM substream
|
* @substream: PCM substream
|
||||||
* @ofs: byte offset
|
* @ofs: byte offset
|
||||||
* @size: byte size to examine
|
* @size: byte size to examine
|
||||||
|
*
|
||||||
|
* Return: chunk size
|
||||||
*/
|
*/
|
||||||
static inline unsigned int
|
static inline unsigned int
|
||||||
snd_pcm_sgbuf_get_chunk_size(struct snd_pcm_substream *substream,
|
snd_pcm_sgbuf_get_chunk_size(struct snd_pcm_substream *substream,
|
||||||
@ -1392,6 +1434,20 @@ static inline void snd_pcm_limit_isa_dma_size(int dma, size_t *max)
|
|||||||
|
|
||||||
const char *snd_pcm_format_name(snd_pcm_format_t format);
|
const char *snd_pcm_format_name(snd_pcm_format_t format);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* snd_pcm_direction_name - Get a string naming the direction of a stream
|
||||||
|
* @direction: Stream's direction, one of SNDRV_PCM_STREAM_XXX
|
||||||
|
*
|
||||||
|
* Returns a string naming the direction of the stream.
|
||||||
|
*/
|
||||||
|
static inline const char *snd_pcm_direction_name(int direction)
|
||||||
|
{
|
||||||
|
if (direction == SNDRV_PCM_STREAM_PLAYBACK)
|
||||||
|
return "Playback";
|
||||||
|
else
|
||||||
|
return "Capture";
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* snd_pcm_stream_str - Get a string naming the direction of a stream
|
* snd_pcm_stream_str - Get a string naming the direction of a stream
|
||||||
* @substream: the pcm substream instance
|
* @substream: the pcm substream instance
|
||||||
@ -1400,10 +1456,7 @@ const char *snd_pcm_format_name(snd_pcm_format_t format);
|
|||||||
*/
|
*/
|
||||||
static inline const char *snd_pcm_stream_str(struct snd_pcm_substream *substream)
|
static inline const char *snd_pcm_stream_str(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
return snd_pcm_direction_name(substream->stream);
|
||||||
return "Playback";
|
|
||||||
else
|
|
||||||
return "Capture";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1430,6 +1483,8 @@ struct snd_pcm_chmap {
|
|||||||
* snd_pcm_chmap_substream - get the PCM substream assigned to the given chmap info
|
* snd_pcm_chmap_substream - get the PCM substream assigned to the given chmap info
|
||||||
* @info: chmap information
|
* @info: chmap information
|
||||||
* @idx: the substream number index
|
* @idx: the substream number index
|
||||||
|
*
|
||||||
|
* Return: the matched PCM substream, or NULL if not found
|
||||||
*/
|
*/
|
||||||
static inline struct snd_pcm_substream *
|
static inline struct snd_pcm_substream *
|
||||||
snd_pcm_chmap_substream(struct snd_pcm_chmap *info, unsigned int idx)
|
snd_pcm_chmap_substream(struct snd_pcm_chmap *info, unsigned int idx)
|
||||||
@ -1460,6 +1515,8 @@ int snd_pcm_add_chmap_ctls(struct snd_pcm *pcm, int stream,
|
|||||||
/**
|
/**
|
||||||
* pcm_format_to_bits - Strong-typed conversion of pcm_format to bitwise
|
* pcm_format_to_bits - Strong-typed conversion of pcm_format to bitwise
|
||||||
* @pcm_format: PCM format
|
* @pcm_format: PCM format
|
||||||
|
*
|
||||||
|
* Return: 64bit mask corresponding to the given PCM format
|
||||||
*/
|
*/
|
||||||
static inline u64 pcm_format_to_bits(snd_pcm_format_t pcm_format)
|
static inline u64 pcm_format_to_bits(snd_pcm_format_t pcm_format)
|
||||||
{
|
{
|
||||||
|
@ -63,7 +63,6 @@ struct snd_rawmidi_runtime {
|
|||||||
size_t xruns; /* over/underruns counter */
|
size_t xruns; /* over/underruns counter */
|
||||||
int buffer_ref; /* buffer reference count */
|
int buffer_ref; /* buffer reference count */
|
||||||
/* misc */
|
/* misc */
|
||||||
spinlock_t lock;
|
|
||||||
wait_queue_head_t sleep;
|
wait_queue_head_t sleep;
|
||||||
/* event handler (new bytes, input only) */
|
/* event handler (new bytes, input only) */
|
||||||
void (*event)(struct snd_rawmidi_substream *substream);
|
void (*event)(struct snd_rawmidi_substream *substream);
|
||||||
@ -85,6 +84,7 @@ struct snd_rawmidi_substream {
|
|||||||
unsigned int clock_type; /* clock source to use for input framing */
|
unsigned int clock_type; /* clock source to use for input framing */
|
||||||
int use_count; /* use counter (for output) */
|
int use_count; /* use counter (for output) */
|
||||||
size_t bytes;
|
size_t bytes;
|
||||||
|
spinlock_t lock;
|
||||||
struct snd_rawmidi *rmidi;
|
struct snd_rawmidi *rmidi;
|
||||||
struct snd_rawmidi_str *pstr;
|
struct snd_rawmidi_str *pstr;
|
||||||
char name[32];
|
char name[32];
|
||||||
@ -156,10 +156,6 @@ int snd_rawmidi_transmit_peek(struct snd_rawmidi_substream *substream,
|
|||||||
int snd_rawmidi_transmit_ack(struct snd_rawmidi_substream *substream, int count);
|
int snd_rawmidi_transmit_ack(struct snd_rawmidi_substream *substream, int count);
|
||||||
int snd_rawmidi_transmit(struct snd_rawmidi_substream *substream,
|
int snd_rawmidi_transmit(struct snd_rawmidi_substream *substream,
|
||||||
unsigned char *buffer, int count);
|
unsigned char *buffer, int count);
|
||||||
int __snd_rawmidi_transmit_peek(struct snd_rawmidi_substream *substream,
|
|
||||||
unsigned char *buffer, int count);
|
|
||||||
int __snd_rawmidi_transmit_ack(struct snd_rawmidi_substream *substream,
|
|
||||||
int count);
|
|
||||||
int snd_rawmidi_proceed(struct snd_rawmidi_substream *substream);
|
int snd_rawmidi_proceed(struct snd_rawmidi_substream *substream);
|
||||||
|
|
||||||
/* main midi functions */
|
/* main midi functions */
|
||||||
|
@ -51,7 +51,6 @@ struct prop_nums {
|
|||||||
int cpus;
|
int cpus;
|
||||||
int codecs;
|
int codecs;
|
||||||
int platforms;
|
int platforms;
|
||||||
int c2c;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct asoc_simple_priv {
|
struct asoc_simple_priv {
|
||||||
@ -64,7 +63,6 @@ struct asoc_simple_priv {
|
|||||||
struct snd_soc_dai_link_component *platforms;
|
struct snd_soc_dai_link_component *platforms;
|
||||||
struct asoc_simple_data adata;
|
struct asoc_simple_data adata;
|
||||||
struct snd_soc_codec_conf *codec_conf;
|
struct snd_soc_codec_conf *codec_conf;
|
||||||
struct snd_soc_pcm_stream *c2c_conf;
|
|
||||||
struct prop_nums num;
|
struct prop_nums num;
|
||||||
unsigned int mclk_fs;
|
unsigned int mclk_fs;
|
||||||
} *dai_props;
|
} *dai_props;
|
||||||
@ -75,7 +73,6 @@ struct asoc_simple_priv {
|
|||||||
struct snd_soc_dai_link_component *dlcs;
|
struct snd_soc_dai_link_component *dlcs;
|
||||||
struct snd_soc_dai_link_component dummy;
|
struct snd_soc_dai_link_component dummy;
|
||||||
struct snd_soc_codec_conf *codec_conf;
|
struct snd_soc_codec_conf *codec_conf;
|
||||||
struct snd_soc_pcm_stream *c2c_conf;
|
|
||||||
struct gpio_desc *pa_gpio;
|
struct gpio_desc *pa_gpio;
|
||||||
const struct snd_soc_ops *ops;
|
const struct snd_soc_ops *ops;
|
||||||
unsigned int dpcm_selectable:1;
|
unsigned int dpcm_selectable:1;
|
||||||
@ -173,7 +170,7 @@ void asoc_simple_canonicalize_platform(struct snd_soc_dai_link_component *platfo
|
|||||||
void asoc_simple_canonicalize_cpu(struct snd_soc_dai_link_component *cpus,
|
void asoc_simple_canonicalize_cpu(struct snd_soc_dai_link_component *cpus,
|
||||||
int is_single_links);
|
int is_single_links);
|
||||||
|
|
||||||
int asoc_simple_clean_reference(struct snd_soc_card *card);
|
void asoc_simple_clean_reference(struct snd_soc_card *card);
|
||||||
|
|
||||||
void asoc_simple_convert_fixup(struct asoc_simple_data *data,
|
void asoc_simple_convert_fixup(struct asoc_simple_data *data,
|
||||||
struct snd_pcm_hw_params *params);
|
struct snd_pcm_hw_params *params);
|
||||||
|
@ -30,6 +30,7 @@ extern struct snd_soc_acpi_mach snd_soc_acpi_intel_tgl_machines[];
|
|||||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_ehl_machines[];
|
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_ehl_machines[];
|
||||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_jsl_machines[];
|
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_jsl_machines[];
|
||||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_adl_machines[];
|
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_adl_machines[];
|
||||||
|
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_mtl_machines[];
|
||||||
|
|
||||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_cnl_sdw_machines[];
|
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_cnl_sdw_machines[];
|
||||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_cfl_sdw_machines[];
|
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_cfl_sdw_machines[];
|
||||||
@ -37,6 +38,7 @@ extern struct snd_soc_acpi_mach snd_soc_acpi_intel_cml_sdw_machines[];
|
|||||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_icl_sdw_machines[];
|
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_icl_sdw_machines[];
|
||||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_tgl_sdw_machines[];
|
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_tgl_sdw_machines[];
|
||||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_adl_sdw_machines[];
|
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_adl_sdw_machines[];
|
||||||
|
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_mtl_sdw_machines[];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* generic table used for HDA codec-based platforms, possibly with
|
* generic table used for HDA codec-based platforms, possibly with
|
||||||
|
@ -29,6 +29,7 @@ int snd_soc_card_resume_post(struct snd_soc_card *card);
|
|||||||
|
|
||||||
int snd_soc_card_probe(struct snd_soc_card *card);
|
int snd_soc_card_probe(struct snd_soc_card *card);
|
||||||
int snd_soc_card_late_probe(struct snd_soc_card *card);
|
int snd_soc_card_late_probe(struct snd_soc_card *card);
|
||||||
|
void snd_soc_card_fixup_controls(struct snd_soc_card *card);
|
||||||
int snd_soc_card_remove(struct snd_soc_card *card);
|
int snd_soc_card_remove(struct snd_soc_card *card);
|
||||||
|
|
||||||
int snd_soc_card_set_bias_level(struct snd_soc_card *card,
|
int snd_soc_card_set_bias_level(struct snd_soc_card *card,
|
||||||
|
@ -179,7 +179,7 @@ struct snd_soc_component_driver {
|
|||||||
* analogue).
|
* analogue).
|
||||||
*/
|
*/
|
||||||
unsigned int endianness:1;
|
unsigned int endianness:1;
|
||||||
unsigned int non_legacy_dai_naming:1;
|
unsigned int legacy_dai_naming:1;
|
||||||
|
|
||||||
/* this component uses topology and ignore machine driver FEs */
|
/* this component uses topology and ignore machine driver FEs */
|
||||||
const char *ignore_machine;
|
const char *ignore_machine;
|
||||||
@ -348,11 +348,6 @@ static inline int snd_soc_component_cache_sync(
|
|||||||
return regcache_sync(component->regmap);
|
return regcache_sync(component->regmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int snd_soc_component_is_codec(struct snd_soc_component *component)
|
|
||||||
{
|
|
||||||
return component->driver->non_legacy_dai_naming;
|
|
||||||
}
|
|
||||||
|
|
||||||
void snd_soc_component_set_aux(struct snd_soc_component *component,
|
void snd_soc_component_set_aux(struct snd_soc_component *component,
|
||||||
struct snd_soc_aux_dev *aux);
|
struct snd_soc_aux_dev *aux);
|
||||||
int snd_soc_component_init(struct snd_soc_component *component);
|
int snd_soc_component_init(struct snd_soc_component *component);
|
||||||
|
@ -124,6 +124,12 @@ struct snd_compr_stream;
|
|||||||
#define SND_SOC_DAIFMT_CBM_CFS SND_SOC_DAIFMT_CBP_CFC
|
#define SND_SOC_DAIFMT_CBM_CFS SND_SOC_DAIFMT_CBP_CFC
|
||||||
#define SND_SOC_DAIFMT_CBS_CFS SND_SOC_DAIFMT_CBC_CFC
|
#define SND_SOC_DAIFMT_CBS_CFS SND_SOC_DAIFMT_CBC_CFC
|
||||||
|
|
||||||
|
/* when passed to set_fmt directly indicate if the device is provider or consumer */
|
||||||
|
#define SND_SOC_DAIFMT_BP_FP SND_SOC_DAIFMT_CBP_CFP
|
||||||
|
#define SND_SOC_DAIFMT_BC_FP SND_SOC_DAIFMT_CBC_CFP
|
||||||
|
#define SND_SOC_DAIFMT_BP_FC SND_SOC_DAIFMT_CBP_CFC
|
||||||
|
#define SND_SOC_DAIFMT_BC_FC SND_SOC_DAIFMT_CBC_CFC
|
||||||
|
|
||||||
/* Describes the possible PCM format */
|
/* Describes the possible PCM format */
|
||||||
#define SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_SHIFT 48
|
#define SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_SHIFT 48
|
||||||
#define SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_MASK (0xFFFFULL << SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_SHIFT)
|
#define SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_MASK (0xFFFFULL << SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_SHIFT)
|
||||||
|
@ -136,6 +136,18 @@
|
|||||||
.put = snd_soc_put_volsw, \
|
.put = snd_soc_put_volsw, \
|
||||||
.private_value = SOC_DOUBLE_VALUE(reg, shift_left, shift_right, \
|
.private_value = SOC_DOUBLE_VALUE(reg, shift_left, shift_right, \
|
||||||
max, invert, 0) }
|
max, invert, 0) }
|
||||||
|
#define SOC_DOUBLE_SX_TLV(xname, xreg, shift_left, shift_right, xmin, xmax, tlv_array) \
|
||||||
|
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
|
||||||
|
.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
|
||||||
|
SNDRV_CTL_ELEM_ACCESS_READWRITE, \
|
||||||
|
.tlv.p = (tlv_array), \
|
||||||
|
.info = snd_soc_info_volsw_sx, \
|
||||||
|
.get = snd_soc_get_volsw_sx, \
|
||||||
|
.put = snd_soc_put_volsw_sx, \
|
||||||
|
.private_value = (unsigned long)&(struct soc_mixer_control) \
|
||||||
|
{.reg = xreg, .rreg = xreg, \
|
||||||
|
.shift = shift_left, .rshift = shift_right, \
|
||||||
|
.max = xmax, .min = xmin} }
|
||||||
#define SOC_DOUBLE_R_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert, tlv_array) \
|
#define SOC_DOUBLE_R_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert, tlv_array) \
|
||||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
|
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
|
||||||
.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
|
.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
|
||||||
@ -414,7 +426,7 @@ enum snd_soc_pcm_subclass {
|
|||||||
};
|
};
|
||||||
|
|
||||||
int snd_soc_register_card(struct snd_soc_card *card);
|
int snd_soc_register_card(struct snd_soc_card *card);
|
||||||
int snd_soc_unregister_card(struct snd_soc_card *card);
|
void snd_soc_unregister_card(struct snd_soc_card *card);
|
||||||
int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card);
|
int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card);
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_PM_SLEEP
|
||||||
int snd_soc_suspend(struct device *dev);
|
int snd_soc_suspend(struct device *dev);
|
||||||
@ -914,6 +926,7 @@ struct snd_soc_card {
|
|||||||
|
|
||||||
int (*probe)(struct snd_soc_card *card);
|
int (*probe)(struct snd_soc_card *card);
|
||||||
int (*late_probe)(struct snd_soc_card *card);
|
int (*late_probe)(struct snd_soc_card *card);
|
||||||
|
void (*fixup_controls)(struct snd_soc_card *card);
|
||||||
int (*remove)(struct snd_soc_card *card);
|
int (*remove)(struct snd_soc_card *card);
|
||||||
|
|
||||||
/* the pre and post PM functions are used to do any PM work before and
|
/* the pre and post PM functions are used to do any PM work before and
|
||||||
|
@ -138,6 +138,7 @@ struct sof_dev_desc {
|
|||||||
|
|
||||||
struct snd_sof_dsp_ops *ops;
|
struct snd_sof_dsp_ops *ops;
|
||||||
int (*ops_init)(struct snd_sof_dev *sdev);
|
int (*ops_init)(struct snd_sof_dev *sdev);
|
||||||
|
void (*ops_free)(struct snd_sof_dev *sdev);
|
||||||
};
|
};
|
||||||
|
|
||||||
int sof_dai_get_mclk(struct snd_soc_pcm_runtime *rtd);
|
int sof_dai_get_mclk(struct snd_soc_pcm_runtime *rtd);
|
||||||
|
@ -18,4 +18,11 @@ struct sof_ipc_dai_acp_params {
|
|||||||
uint32_t fsync_rate; /* FSYNC frequency in Hz */
|
uint32_t fsync_rate; /* FSYNC frequency in Hz */
|
||||||
uint32_t tdm_slots;
|
uint32_t tdm_slots;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
/* ACPDMIC Configuration Request - SOF_IPC_DAI_AMD_CONFIG */
|
||||||
|
struct sof_ipc_dai_acpdmic_params {
|
||||||
|
uint32_t pdm_rate;
|
||||||
|
uint32_t pdm_ch;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -52,6 +52,8 @@
|
|||||||
#define SOF_DAI_INTEL_SSP_CLKCTRL_MCLK_ES BIT(6)
|
#define SOF_DAI_INTEL_SSP_CLKCTRL_MCLK_ES BIT(6)
|
||||||
/* bclk early start */
|
/* bclk early start */
|
||||||
#define SOF_DAI_INTEL_SSP_CLKCTRL_BCLK_ES BIT(7)
|
#define SOF_DAI_INTEL_SSP_CLKCTRL_BCLK_ES BIT(7)
|
||||||
|
/* mclk always on */
|
||||||
|
#define SOF_DAI_INTEL_SSP_CLKCTRL_MCLK_AON BIT(8)
|
||||||
|
|
||||||
/* DMIC max. four controllers for eight microphone channels */
|
/* DMIC max. four controllers for eight microphone channels */
|
||||||
#define SOF_DAI_INTEL_DMIC_NUM_CTRL 4
|
#define SOF_DAI_INTEL_DMIC_NUM_CTRL 4
|
||||||
|
@ -111,7 +111,7 @@ struct sof_ipc_dai_config {
|
|||||||
struct sof_ipc_dai_sai_params sai;
|
struct sof_ipc_dai_sai_params sai;
|
||||||
struct sof_ipc_dai_acp_params acpbt;
|
struct sof_ipc_dai_acp_params acpbt;
|
||||||
struct sof_ipc_dai_acp_params acpsp;
|
struct sof_ipc_dai_acp_params acpsp;
|
||||||
struct sof_ipc_dai_acp_params acpdmic;
|
struct sof_ipc_dai_acpdmic_params acpdmic;
|
||||||
struct sof_ipc_dai_mtk_afe_params afe;
|
struct sof_ipc_dai_mtk_afe_params afe;
|
||||||
};
|
};
|
||||||
} __packed;
|
} __packed;
|
||||||
|
@ -385,6 +385,14 @@ struct sof_ipc4_fw_version {
|
|||||||
uint16_t build;
|
uint16_t build;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
/* Payload data for SOF_IPC4_MOD_SET_DX */
|
||||||
|
struct sof_ipc4_dx_state_info {
|
||||||
|
/* core(s) to apply the change */
|
||||||
|
uint32_t core_mask;
|
||||||
|
/* core state: 0: put core_id to D3; 1: put core_id to D0 */
|
||||||
|
uint32_t dx_mask;
|
||||||
|
} __packed __aligned(4);
|
||||||
|
|
||||||
/* Reply messages */
|
/* Reply messages */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -86,9 +86,11 @@ struct sof_ipc_stream_params {
|
|||||||
uint32_t host_period_bytes;
|
uint32_t host_period_bytes;
|
||||||
uint16_t no_stream_position; /**< 1 means don't send stream position */
|
uint16_t no_stream_position; /**< 1 means don't send stream position */
|
||||||
uint8_t cont_update_posn; /**< 1 means continuous update stream position */
|
uint8_t cont_update_posn; /**< 1 means continuous update stream position */
|
||||||
|
uint8_t reserved0;
|
||||||
uint8_t reserved[5];
|
int16_t ext_data_length; /**< 0, means no extended data */
|
||||||
|
uint8_t reserved[2];
|
||||||
uint16_t chmap[SOF_IPC_MAX_CHANNELS]; /**< channel map - SOF_CHMAP_ */
|
uint16_t chmap[SOF_IPC_MAX_CHANNELS]; /**< channel map - SOF_CHMAP_ */
|
||||||
|
uint8_t ext_data[]; /**< extended data */
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
/* PCM params info - SOF_IPC_STREAM_PCM_PARAMS */
|
/* PCM params info - SOF_IPC_STREAM_PCM_PARAMS */
|
||||||
|
@ -123,7 +123,7 @@ struct snd_compr_codec_caps {
|
|||||||
} __attribute__((packed, aligned(4)));
|
} __attribute__((packed, aligned(4)));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* enum sndrv_compress_encoder
|
* enum sndrv_compress_encoder - encoder metadata key
|
||||||
* @SNDRV_COMPRESS_ENCODER_PADDING: no of samples appended by the encoder at the
|
* @SNDRV_COMPRESS_ENCODER_PADDING: no of samples appended by the encoder at the
|
||||||
* end of the track
|
* end of the track
|
||||||
* @SNDRV_COMPRESS_ENCODER_DELAY: no of samples inserted by the encoder at the
|
* @SNDRV_COMPRESS_ENCODER_DELAY: no of samples inserted by the encoder at the
|
||||||
|
@ -250,7 +250,7 @@ struct snd_enc_wma {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct snd_enc_vorbis
|
* struct snd_enc_vorbis - Vorbis encoder parameters
|
||||||
* @quality: Sets encoding quality to n, between -1 (low) and 10 (high).
|
* @quality: Sets encoding quality to n, between -1 (low) and 10 (high).
|
||||||
* In the default mode of operation, the quality level is 3.
|
* In the default mode of operation, the quality level is 3.
|
||||||
* Normal quality range is 0 - 10.
|
* Normal quality range is 0 - 10.
|
||||||
@ -279,7 +279,7 @@ struct snd_enc_vorbis {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct snd_enc_real
|
* struct snd_enc_real - RealAudio encoder parameters
|
||||||
* @quant_bits: number of coupling quantization bits in the stream
|
* @quant_bits: number of coupling quantization bits in the stream
|
||||||
* @start_region: coupling start region in the stream
|
* @start_region: coupling start region in the stream
|
||||||
* @num_regions: number of regions value
|
* @num_regions: number of regions value
|
||||||
@ -294,7 +294,7 @@ struct snd_enc_real {
|
|||||||
} __attribute__((packed, aligned(4)));
|
} __attribute__((packed, aligned(4)));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct snd_enc_flac
|
* struct snd_enc_flac - FLAC encoder parameters
|
||||||
* @num: serial number, valid only for OGG formats
|
* @num: serial number, valid only for OGG formats
|
||||||
* needs to be set by application
|
* needs to be set by application
|
||||||
* @gain: Add replay gain tags
|
* @gain: Add replay gain tags
|
||||||
|
@ -24,9 +24,11 @@
|
|||||||
#ifndef __INCLUDE_UAPI_SOUND_SOF_ABI_H__
|
#ifndef __INCLUDE_UAPI_SOUND_SOF_ABI_H__
|
||||||
#define __INCLUDE_UAPI_SOUND_SOF_ABI_H__
|
#define __INCLUDE_UAPI_SOUND_SOF_ABI_H__
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
/* SOF ABI version major, minor and patch numbers */
|
/* SOF ABI version major, minor and patch numbers */
|
||||||
#define SOF_ABI_MAJOR 3
|
#define SOF_ABI_MAJOR 3
|
||||||
#define SOF_ABI_MINOR 21
|
#define SOF_ABI_MINOR 23
|
||||||
#define SOF_ABI_PATCH 0
|
#define SOF_ABI_PATCH 0
|
||||||
|
|
||||||
/* SOF ABI version number. Format within 32bit word is MMmmmppp */
|
/* SOF ABI version number. Format within 32bit word is MMmmmppp */
|
||||||
|
@ -26,4 +26,34 @@ struct sof_abi_hdr {
|
|||||||
__u32 data[]; /**< Component data - opaque to core */
|
__u32 data[]; /**< Component data - opaque to core */
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
#define SOF_MANIFEST_DATA_TYPE_NHLT 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct sof_manifest_tlv - SOF manifest TLV data
|
||||||
|
* @type: type of data
|
||||||
|
* @size: data size (not including the size of this struct)
|
||||||
|
* @data: payload data
|
||||||
|
*/
|
||||||
|
struct sof_manifest_tlv {
|
||||||
|
__le32 type;
|
||||||
|
__le32 size;
|
||||||
|
__u8 data[];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct sof_manifest - SOF topology manifest
|
||||||
|
* @abi_major: Major ABI version
|
||||||
|
* @abi_minor: Minor ABI version
|
||||||
|
* @abi_patch: ABI patch
|
||||||
|
* @count: count of tlv items
|
||||||
|
* @items: consecutive variable size tlv items
|
||||||
|
*/
|
||||||
|
struct sof_manifest {
|
||||||
|
__le16 abi_major;
|
||||||
|
__le16 abi_minor;
|
||||||
|
__le16 abi_patch;
|
||||||
|
__le16 count;
|
||||||
|
struct sof_manifest_tlv items[];
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -52,11 +52,17 @@
|
|||||||
#define SOF_TKN_SCHED_FRAMES 204
|
#define SOF_TKN_SCHED_FRAMES 204
|
||||||
#define SOF_TKN_SCHED_TIME_DOMAIN 205
|
#define SOF_TKN_SCHED_TIME_DOMAIN 205
|
||||||
#define SOF_TKN_SCHED_DYNAMIC_PIPELINE 206
|
#define SOF_TKN_SCHED_DYNAMIC_PIPELINE 206
|
||||||
|
#define SOF_TKN_SCHED_LP_MODE 207
|
||||||
|
#define SOF_TKN_SCHED_MEM_USAGE 208
|
||||||
|
|
||||||
/* volume */
|
/* volume */
|
||||||
#define SOF_TKN_VOLUME_RAMP_STEP_TYPE 250
|
#define SOF_TKN_VOLUME_RAMP_STEP_TYPE 250
|
||||||
#define SOF_TKN_VOLUME_RAMP_STEP_MS 251
|
#define SOF_TKN_VOLUME_RAMP_STEP_MS 251
|
||||||
|
|
||||||
|
#define SOF_TKN_GAIN_RAMP_TYPE 260
|
||||||
|
#define SOF_TKN_GAIN_RAMP_DURATION 261
|
||||||
|
#define SOF_TKN_GAIN_VAL 262
|
||||||
|
|
||||||
/* SRC */
|
/* SRC */
|
||||||
#define SOF_TKN_SRC_RATE_IN 300
|
#define SOF_TKN_SRC_RATE_IN 300
|
||||||
#define SOF_TKN_SRC_RATE_OUT 301
|
#define SOF_TKN_SRC_RATE_OUT 301
|
||||||
@ -79,6 +85,9 @@
|
|||||||
*/
|
*/
|
||||||
#define SOF_TKN_COMP_CORE_ID 404
|
#define SOF_TKN_COMP_CORE_ID 404
|
||||||
#define SOF_TKN_COMP_UUID 405
|
#define SOF_TKN_COMP_UUID 405
|
||||||
|
#define SOF_TKN_COMP_CPC 406
|
||||||
|
#define SOF_TKN_COMP_IS_PAGES 409
|
||||||
|
#define SOF_TKN_COMP_NUM_AUDIO_FORMATS 410
|
||||||
|
|
||||||
/* SSP */
|
/* SSP */
|
||||||
#define SOF_TKN_INTEL_SSP_CLKS_CONTROL 500
|
#define SOF_TKN_INTEL_SSP_CLKS_CONTROL 500
|
||||||
@ -145,4 +154,39 @@
|
|||||||
#define SOF_TKN_MEDIATEK_AFE_CH 1601
|
#define SOF_TKN_MEDIATEK_AFE_CH 1601
|
||||||
#define SOF_TKN_MEDIATEK_AFE_FORMAT 1602
|
#define SOF_TKN_MEDIATEK_AFE_FORMAT 1602
|
||||||
|
|
||||||
|
/* MIXER */
|
||||||
|
#define SOF_TKN_MIXER_TYPE 1700
|
||||||
|
|
||||||
|
/* ACPDMIC */
|
||||||
|
#define SOF_TKN_AMD_ACPDMIC_RATE 1800
|
||||||
|
#define SOF_TKN_AMD_ACPDMIC_CH 1801
|
||||||
|
|
||||||
|
/* CAVS AUDIO FORMAT */
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_RATE 1900
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_BIT_DEPTH 1901
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_VALID_BIT 1902
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_CHANNELS 1903
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_CH_MAP 1904
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_CH_CFG 1905
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_INTERLEAVING_STYLE 1906
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_FMT_CFG 1907
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_SAMPLE_TYPE 1908
|
||||||
|
/* intentional token numbering discontinuity, reserved for future use */
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_RATE 1930
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_BIT_DEPTH 1931
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_VALID_BIT 1932
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_CHANNELS 1933
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_CH_MAP 1934
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_CH_CFG 1935
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_INTERLEAVING_STYLE 1936
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_FMT_CFG 1937
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_SAMPLE_TYPE 1938
|
||||||
|
/* intentional token numbering discontinuity, reserved for future use */
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_IBS 1970
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_OBS 1971
|
||||||
|
#define SOF_TKN_CAVS_AUDIO_FORMAT_DMA_BUFFER_SIZE 1972
|
||||||
|
|
||||||
|
/* COPIER */
|
||||||
|
#define SOF_TKN_INTEL_COPIER_NODE_TYPE 1980
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -460,7 +460,7 @@ static ssize_t vendor_id_show(struct device *dev,
|
|||||||
{
|
{
|
||||||
struct ac97_codec_device *codec = to_ac97_device(dev);
|
struct ac97_codec_device *codec = to_ac97_device(dev);
|
||||||
|
|
||||||
return sprintf(buf, "%08x", codec->vendor_id);
|
return sysfs_emit(buf, "%08x", codec->vendor_id);
|
||||||
}
|
}
|
||||||
DEVICE_ATTR_RO(vendor_id);
|
DEVICE_ATTR_RO(vendor_id);
|
||||||
|
|
||||||
|
@ -10,19 +10,13 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
|
|||||||
{
|
{
|
||||||
struct soundbus_dev *sdev = to_soundbus_device(dev);
|
struct soundbus_dev *sdev = to_soundbus_device(dev);
|
||||||
struct platform_device *of = &sdev->ofdev;
|
struct platform_device *of = &sdev->ofdev;
|
||||||
int length;
|
|
||||||
|
|
||||||
if (*sdev->modalias) {
|
if (*sdev->modalias)
|
||||||
strscpy(buf, sdev->modalias, sizeof(sdev->modalias) + 1);
|
return sysfs_emit(buf, "%s\n", sdev->modalias);
|
||||||
strcat(buf, "\n");
|
else
|
||||||
length = strlen(buf);
|
return sysfs_emit(buf, "of:N%pOFn%c%s\n",
|
||||||
} else {
|
of->dev.of_node, 'T',
|
||||||
length = sprintf(buf, "of:N%pOFn%c%s\n",
|
of_node_get_device_type(of->dev.of_node));
|
||||||
of->dev.of_node, 'T',
|
|
||||||
of_node_get_device_type(of->dev.of_node));
|
|
||||||
}
|
|
||||||
|
|
||||||
return length;
|
|
||||||
}
|
}
|
||||||
static DEVICE_ATTR_RO(modalias);
|
static DEVICE_ATTR_RO(modalias);
|
||||||
|
|
||||||
@ -32,7 +26,7 @@ static ssize_t name_show(struct device *dev,
|
|||||||
struct soundbus_dev *sdev = to_soundbus_device(dev);
|
struct soundbus_dev *sdev = to_soundbus_device(dev);
|
||||||
struct platform_device *of = &sdev->ofdev;
|
struct platform_device *of = &sdev->ofdev;
|
||||||
|
|
||||||
return sprintf(buf, "%pOFn\n", of->dev.of_node);
|
return sysfs_emit(buf, "%pOFn\n", of->dev.of_node);
|
||||||
}
|
}
|
||||||
static DEVICE_ATTR_RO(name);
|
static DEVICE_ATTR_RO(name);
|
||||||
|
|
||||||
@ -42,7 +36,7 @@ static ssize_t type_show(struct device *dev,
|
|||||||
struct soundbus_dev *sdev = to_soundbus_device(dev);
|
struct soundbus_dev *sdev = to_soundbus_device(dev);
|
||||||
struct platform_device *of = &sdev->ofdev;
|
struct platform_device *of = &sdev->ofdev;
|
||||||
|
|
||||||
return sprintf(buf, "%s\n", of_node_get_device_type(of->dev.of_node));
|
return sysfs_emit(buf, "%s\n", of_node_get_device_type(of->dev.of_node));
|
||||||
}
|
}
|
||||||
static DEVICE_ATTR_RO(type);
|
static DEVICE_ATTR_RO(type);
|
||||||
|
|
||||||
|
@ -154,6 +154,16 @@ config SND_VERBOSE_PRINTK
|
|||||||
|
|
||||||
You don't need this unless you're debugging ALSA.
|
You don't need this unless you're debugging ALSA.
|
||||||
|
|
||||||
|
config SND_CTL_FAST_LOOKUP
|
||||||
|
bool "Fast lookup of control elements" if EXPERT
|
||||||
|
default y
|
||||||
|
select XARRAY_MULTI
|
||||||
|
help
|
||||||
|
This option enables the faster lookup of control elements.
|
||||||
|
It will consume more memory because of the additional Xarray.
|
||||||
|
If you want to choose the memory footprint over the performance
|
||||||
|
inevitably, turn this off.
|
||||||
|
|
||||||
config SND_DEBUG
|
config SND_DEBUG
|
||||||
bool "Debug"
|
bool "Debug"
|
||||||
help
|
help
|
||||||
@ -178,14 +188,29 @@ config SND_PCM_XRUN_DEBUG
|
|||||||
sound clicking when system is loaded, it may help to determine
|
sound clicking when system is loaded, it may help to determine
|
||||||
the process or driver which causes the scheduling gaps.
|
the process or driver which causes the scheduling gaps.
|
||||||
|
|
||||||
config SND_CTL_VALIDATION
|
config SND_CTL_INPUT_VALIDATION
|
||||||
bool "Perform sanity-checks for each control element access"
|
bool "Validate input data to control API"
|
||||||
|
help
|
||||||
|
Say Y to enable the additional validation for the input data to
|
||||||
|
each control element, including the value range checks.
|
||||||
|
An error is returned from ALSA core for invalid inputs without
|
||||||
|
passing to the driver. This is a kind of hardening for drivers
|
||||||
|
that have no proper error checks, at the cost of a slight
|
||||||
|
performance overhead.
|
||||||
|
|
||||||
|
config SND_CTL_DEBUG
|
||||||
|
bool "Enable debugging feature for control API"
|
||||||
depends on SND_DEBUG
|
depends on SND_DEBUG
|
||||||
help
|
help
|
||||||
Say Y to enable the additional validation of each control element
|
Say Y to enable the debugging feature for ALSA control API.
|
||||||
access, including sanity-checks like whether the values returned
|
It performs the additional sanity-checks for each control element
|
||||||
from the driver are in the proper ranges or the check of the invalid
|
read access, such as whether the values returned from the driver
|
||||||
access at out-of-array areas.
|
are in the proper ranges or the check of the invalid access at
|
||||||
|
out-of-array areas. The error is printed when the driver gives
|
||||||
|
such unexpected values.
|
||||||
|
When you develop a driver that deals with control elements, it's
|
||||||
|
strongly recommended to try this one once and verify whether you see
|
||||||
|
any relevant errors or not.
|
||||||
|
|
||||||
config SND_JACK_INJECTION_DEBUG
|
config SND_JACK_INJECTION_DEBUG
|
||||||
bool "Sound jack injection interface via debugfs"
|
bool "Sound jack injection interface via debugfs"
|
||||||
|
@ -810,7 +810,7 @@ static void error_delayed_work(struct work_struct *work)
|
|||||||
mutex_unlock(&stream->device->lock);
|
mutex_unlock(&stream->device->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* snd_compr_stop_error: Report a fatal error on a stream
|
* snd_compr_stop_error: Report a fatal error on a stream
|
||||||
* @stream: pointer to stream
|
* @stream: pointer to stream
|
||||||
* @state: state to transition the stream to
|
* @state: state to transition the stream to
|
||||||
@ -818,6 +818,8 @@ static void error_delayed_work(struct work_struct *work)
|
|||||||
* Stop the stream and set its state.
|
* Stop the stream and set its state.
|
||||||
*
|
*
|
||||||
* Should be called with compressed device lock held.
|
* Should be called with compressed device lock held.
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_compr_stop_error(struct snd_compr_stream *stream,
|
int snd_compr_stop_error(struct snd_compr_stream *stream,
|
||||||
snd_pcm_state_t state)
|
snd_pcm_state_t state)
|
||||||
@ -1157,12 +1159,15 @@ static int snd_compress_dev_free(struct snd_device *device)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* snd_compress_new: create new compress device
|
* snd_compress_new: create new compress device
|
||||||
* @card: sound card pointer
|
* @card: sound card pointer
|
||||||
* @device: device number
|
* @device: device number
|
||||||
* @dirn: device direction, should be of type enum snd_compr_direction
|
* @dirn: device direction, should be of type enum snd_compr_direction
|
||||||
|
* @id: ID string
|
||||||
* @compr: compress device pointer
|
* @compr: compress device pointer
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_compress_new(struct snd_card *card, int device,
|
int snd_compress_new(struct snd_card *card, int device,
|
||||||
int dirn, const char *id, struct snd_compr *compr)
|
int dirn, const char *id, struct snd_compr *compr)
|
||||||
|
@ -127,6 +127,7 @@ static int snd_ctl_release(struct inode *inode, struct file *file)
|
|||||||
if (control->vd[idx].owner == ctl)
|
if (control->vd[idx].owner == ctl)
|
||||||
control->vd[idx].owner = NULL;
|
control->vd[idx].owner = NULL;
|
||||||
up_write(&card->controls_rwsem);
|
up_write(&card->controls_rwsem);
|
||||||
|
snd_fasync_free(ctl->fasync);
|
||||||
snd_ctl_empty_read_queue(ctl);
|
snd_ctl_empty_read_queue(ctl);
|
||||||
put_pid(ctl->pid);
|
put_pid(ctl->pid);
|
||||||
kfree(ctl);
|
kfree(ctl);
|
||||||
@ -181,7 +182,7 @@ void snd_ctl_notify(struct snd_card *card, unsigned int mask,
|
|||||||
_found:
|
_found:
|
||||||
wake_up(&ctl->change_sleep);
|
wake_up(&ctl->change_sleep);
|
||||||
spin_unlock(&ctl->read_lock);
|
spin_unlock(&ctl->read_lock);
|
||||||
kill_fasync(&ctl->fasync, SIGIO, POLL_IN);
|
snd_kill_fasync(ctl->fasync, SIGIO, POLL_IN);
|
||||||
}
|
}
|
||||||
read_unlock_irqrestore(&card->ctl_files_rwlock, flags);
|
read_unlock_irqrestore(&card->ctl_files_rwlock, flags);
|
||||||
}
|
}
|
||||||
@ -364,6 +365,93 @@ static int snd_ctl_find_hole(struct snd_card *card, unsigned int count)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check whether the given id is contained in the given kctl */
|
||||||
|
static bool elem_id_matches(const struct snd_kcontrol *kctl,
|
||||||
|
const struct snd_ctl_elem_id *id)
|
||||||
|
{
|
||||||
|
return kctl->id.iface == id->iface &&
|
||||||
|
kctl->id.device == id->device &&
|
||||||
|
kctl->id.subdevice == id->subdevice &&
|
||||||
|
!strncmp(kctl->id.name, id->name, sizeof(kctl->id.name)) &&
|
||||||
|
kctl->id.index <= id->index &&
|
||||||
|
kctl->id.index + kctl->count > id->index;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SND_CTL_FAST_LOOKUP
|
||||||
|
/* Compute a hash key for the corresponding ctl id
|
||||||
|
* It's for the name lookup, hence the numid is excluded.
|
||||||
|
* The hash key is bound in LONG_MAX to be used for Xarray key.
|
||||||
|
*/
|
||||||
|
#define MULTIPLIER 37
|
||||||
|
static unsigned long get_ctl_id_hash(const struct snd_ctl_elem_id *id)
|
||||||
|
{
|
||||||
|
unsigned long h;
|
||||||
|
const unsigned char *p;
|
||||||
|
|
||||||
|
h = id->iface;
|
||||||
|
h = MULTIPLIER * h + id->device;
|
||||||
|
h = MULTIPLIER * h + id->subdevice;
|
||||||
|
for (p = id->name; *p; p++)
|
||||||
|
h = MULTIPLIER * h + *p;
|
||||||
|
h = MULTIPLIER * h + id->index;
|
||||||
|
h &= LONG_MAX;
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add hash entries to numid and ctl xarray tables */
|
||||||
|
static void add_hash_entries(struct snd_card *card,
|
||||||
|
struct snd_kcontrol *kcontrol)
|
||||||
|
{
|
||||||
|
struct snd_ctl_elem_id id = kcontrol->id;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
xa_store_range(&card->ctl_numids, kcontrol->id.numid,
|
||||||
|
kcontrol->id.numid + kcontrol->count - 1,
|
||||||
|
kcontrol, GFP_KERNEL);
|
||||||
|
|
||||||
|
for (i = 0; i < kcontrol->count; i++) {
|
||||||
|
id.index = kcontrol->id.index + i;
|
||||||
|
if (xa_insert(&card->ctl_hash, get_ctl_id_hash(&id),
|
||||||
|
kcontrol, GFP_KERNEL)) {
|
||||||
|
/* skip hash for this entry, noting we had collision */
|
||||||
|
card->ctl_hash_collision = true;
|
||||||
|
dev_dbg(card->dev, "ctl_hash collision %d:%s:%d\n",
|
||||||
|
id.iface, id.name, id.index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* remove hash entries that have been added */
|
||||||
|
static void remove_hash_entries(struct snd_card *card,
|
||||||
|
struct snd_kcontrol *kcontrol)
|
||||||
|
{
|
||||||
|
struct snd_ctl_elem_id id = kcontrol->id;
|
||||||
|
struct snd_kcontrol *matched;
|
||||||
|
unsigned long h;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < kcontrol->count; i++) {
|
||||||
|
xa_erase(&card->ctl_numids, id.numid);
|
||||||
|
h = get_ctl_id_hash(&id);
|
||||||
|
matched = xa_load(&card->ctl_hash, h);
|
||||||
|
if (matched && (matched == kcontrol ||
|
||||||
|
elem_id_matches(matched, &id)))
|
||||||
|
xa_erase(&card->ctl_hash, h);
|
||||||
|
id.index++;
|
||||||
|
id.numid++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else /* CONFIG_SND_CTL_FAST_LOOKUP */
|
||||||
|
static inline void add_hash_entries(struct snd_card *card,
|
||||||
|
struct snd_kcontrol *kcontrol)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
static inline void remove_hash_entries(struct snd_card *card,
|
||||||
|
struct snd_kcontrol *kcontrol)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_SND_CTL_FAST_LOOKUP */
|
||||||
|
|
||||||
enum snd_ctl_add_mode {
|
enum snd_ctl_add_mode {
|
||||||
CTL_ADD_EXCLUSIVE, CTL_REPLACE, CTL_ADD_ON_REPLACE,
|
CTL_ADD_EXCLUSIVE, CTL_REPLACE, CTL_ADD_ON_REPLACE,
|
||||||
};
|
};
|
||||||
@ -408,6 +496,8 @@ static int __snd_ctl_add_replace(struct snd_card *card,
|
|||||||
kcontrol->id.numid = card->last_numid + 1;
|
kcontrol->id.numid = card->last_numid + 1;
|
||||||
card->last_numid += kcontrol->count;
|
card->last_numid += kcontrol->count;
|
||||||
|
|
||||||
|
add_hash_entries(card, kcontrol);
|
||||||
|
|
||||||
for (idx = 0; idx < kcontrol->count; idx++)
|
for (idx = 0; idx < kcontrol->count; idx++)
|
||||||
snd_ctl_notify_one(card, SNDRV_CTL_EVENT_MASK_ADD, kcontrol, idx);
|
snd_ctl_notify_one(card, SNDRV_CTL_EVENT_MASK_ADD, kcontrol, idx);
|
||||||
|
|
||||||
@ -479,6 +569,26 @@ int snd_ctl_replace(struct snd_card *card, struct snd_kcontrol *kcontrol,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(snd_ctl_replace);
|
EXPORT_SYMBOL(snd_ctl_replace);
|
||||||
|
|
||||||
|
static int __snd_ctl_remove(struct snd_card *card,
|
||||||
|
struct snd_kcontrol *kcontrol,
|
||||||
|
bool remove_hash)
|
||||||
|
{
|
||||||
|
unsigned int idx;
|
||||||
|
|
||||||
|
if (snd_BUG_ON(!card || !kcontrol))
|
||||||
|
return -EINVAL;
|
||||||
|
list_del(&kcontrol->list);
|
||||||
|
|
||||||
|
if (remove_hash)
|
||||||
|
remove_hash_entries(card, kcontrol);
|
||||||
|
|
||||||
|
card->controls_count -= kcontrol->count;
|
||||||
|
for (idx = 0; idx < kcontrol->count; idx++)
|
||||||
|
snd_ctl_notify_one(card, SNDRV_CTL_EVENT_MASK_REMOVE, kcontrol, idx);
|
||||||
|
snd_ctl_free_one(kcontrol);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* snd_ctl_remove - remove the control from the card and release it
|
* snd_ctl_remove - remove the control from the card and release it
|
||||||
* @card: the card instance
|
* @card: the card instance
|
||||||
@ -492,16 +602,7 @@ EXPORT_SYMBOL(snd_ctl_replace);
|
|||||||
*/
|
*/
|
||||||
int snd_ctl_remove(struct snd_card *card, struct snd_kcontrol *kcontrol)
|
int snd_ctl_remove(struct snd_card *card, struct snd_kcontrol *kcontrol)
|
||||||
{
|
{
|
||||||
unsigned int idx;
|
return __snd_ctl_remove(card, kcontrol, true);
|
||||||
|
|
||||||
if (snd_BUG_ON(!card || !kcontrol))
|
|
||||||
return -EINVAL;
|
|
||||||
list_del(&kcontrol->list);
|
|
||||||
card->controls_count -= kcontrol->count;
|
|
||||||
for (idx = 0; idx < kcontrol->count; idx++)
|
|
||||||
snd_ctl_notify_one(card, SNDRV_CTL_EVENT_MASK_REMOVE, kcontrol, idx);
|
|
||||||
snd_ctl_free_one(kcontrol);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(snd_ctl_remove);
|
EXPORT_SYMBOL(snd_ctl_remove);
|
||||||
|
|
||||||
@ -642,14 +743,30 @@ int snd_ctl_rename_id(struct snd_card *card, struct snd_ctl_elem_id *src_id,
|
|||||||
up_write(&card->controls_rwsem);
|
up_write(&card->controls_rwsem);
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
remove_hash_entries(card, kctl);
|
||||||
kctl->id = *dst_id;
|
kctl->id = *dst_id;
|
||||||
kctl->id.numid = card->last_numid + 1;
|
kctl->id.numid = card->last_numid + 1;
|
||||||
card->last_numid += kctl->count;
|
card->last_numid += kctl->count;
|
||||||
|
add_hash_entries(card, kctl);
|
||||||
up_write(&card->controls_rwsem);
|
up_write(&card->controls_rwsem);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(snd_ctl_rename_id);
|
EXPORT_SYMBOL(snd_ctl_rename_id);
|
||||||
|
|
||||||
|
#ifndef CONFIG_SND_CTL_FAST_LOOKUP
|
||||||
|
static struct snd_kcontrol *
|
||||||
|
snd_ctl_find_numid_slow(struct snd_card *card, unsigned int numid)
|
||||||
|
{
|
||||||
|
struct snd_kcontrol *kctl;
|
||||||
|
|
||||||
|
list_for_each_entry(kctl, &card->controls, list) {
|
||||||
|
if (kctl->id.numid <= numid && kctl->id.numid + kctl->count > numid)
|
||||||
|
return kctl;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif /* !CONFIG_SND_CTL_FAST_LOOKUP */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* snd_ctl_find_numid - find the control instance with the given number-id
|
* snd_ctl_find_numid - find the control instance with the given number-id
|
||||||
* @card: the card instance
|
* @card: the card instance
|
||||||
@ -665,15 +782,13 @@ EXPORT_SYMBOL(snd_ctl_rename_id);
|
|||||||
*/
|
*/
|
||||||
struct snd_kcontrol *snd_ctl_find_numid(struct snd_card *card, unsigned int numid)
|
struct snd_kcontrol *snd_ctl_find_numid(struct snd_card *card, unsigned int numid)
|
||||||
{
|
{
|
||||||
struct snd_kcontrol *kctl;
|
|
||||||
|
|
||||||
if (snd_BUG_ON(!card || !numid))
|
if (snd_BUG_ON(!card || !numid))
|
||||||
return NULL;
|
return NULL;
|
||||||
list_for_each_entry(kctl, &card->controls, list) {
|
#ifdef CONFIG_SND_CTL_FAST_LOOKUP
|
||||||
if (kctl->id.numid <= numid && kctl->id.numid + kctl->count > numid)
|
return xa_load(&card->ctl_numids, numid);
|
||||||
return kctl;
|
#else
|
||||||
}
|
return snd_ctl_find_numid_slow(card, numid);
|
||||||
return NULL;
|
#endif
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(snd_ctl_find_numid);
|
EXPORT_SYMBOL(snd_ctl_find_numid);
|
||||||
|
|
||||||
@ -699,21 +814,18 @@ struct snd_kcontrol *snd_ctl_find_id(struct snd_card *card,
|
|||||||
return NULL;
|
return NULL;
|
||||||
if (id->numid != 0)
|
if (id->numid != 0)
|
||||||
return snd_ctl_find_numid(card, id->numid);
|
return snd_ctl_find_numid(card, id->numid);
|
||||||
list_for_each_entry(kctl, &card->controls, list) {
|
#ifdef CONFIG_SND_CTL_FAST_LOOKUP
|
||||||
if (kctl->id.iface != id->iface)
|
kctl = xa_load(&card->ctl_hash, get_ctl_id_hash(id));
|
||||||
continue;
|
if (kctl && elem_id_matches(kctl, id))
|
||||||
if (kctl->id.device != id->device)
|
|
||||||
continue;
|
|
||||||
if (kctl->id.subdevice != id->subdevice)
|
|
||||||
continue;
|
|
||||||
if (strncmp(kctl->id.name, id->name, sizeof(kctl->id.name)))
|
|
||||||
continue;
|
|
||||||
if (kctl->id.index > id->index)
|
|
||||||
continue;
|
|
||||||
if (kctl->id.index + kctl->count <= id->index)
|
|
||||||
continue;
|
|
||||||
return kctl;
|
return kctl;
|
||||||
}
|
if (!card->ctl_hash_collision)
|
||||||
|
return NULL; /* we can rely on only hash table */
|
||||||
|
#endif
|
||||||
|
/* no matching in hash table - try all as the last resort */
|
||||||
|
list_for_each_entry(kctl, &card->controls, list)
|
||||||
|
if (elem_id_matches(kctl, id))
|
||||||
|
return kctl;
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(snd_ctl_find_id);
|
EXPORT_SYMBOL(snd_ctl_find_id);
|
||||||
@ -855,7 +967,6 @@ static const unsigned int value_sizes[] = {
|
|||||||
[SNDRV_CTL_ELEM_TYPE_INTEGER64] = sizeof(long long),
|
[SNDRV_CTL_ELEM_TYPE_INTEGER64] = sizeof(long long),
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_SND_CTL_VALIDATION
|
|
||||||
/* fill the remaining snd_ctl_elem_value data with the given pattern */
|
/* fill the remaining snd_ctl_elem_value data with the given pattern */
|
||||||
static void fill_remaining_elem_value(struct snd_ctl_elem_value *control,
|
static void fill_remaining_elem_value(struct snd_ctl_elem_value *control,
|
||||||
struct snd_ctl_elem_info *info,
|
struct snd_ctl_elem_info *info,
|
||||||
@ -872,7 +983,7 @@ static void fill_remaining_elem_value(struct snd_ctl_elem_value *control,
|
|||||||
static int sanity_check_int_value(struct snd_card *card,
|
static int sanity_check_int_value(struct snd_card *card,
|
||||||
const struct snd_ctl_elem_value *control,
|
const struct snd_ctl_elem_value *control,
|
||||||
const struct snd_ctl_elem_info *info,
|
const struct snd_ctl_elem_info *info,
|
||||||
int i)
|
int i, bool print_error)
|
||||||
{
|
{
|
||||||
long long lval, lmin, lmax, lstep;
|
long long lval, lmin, lmax, lstep;
|
||||||
u64 rem;
|
u64 rem;
|
||||||
@ -906,21 +1017,23 @@ static int sanity_check_int_value(struct snd_card *card,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (lval < lmin || lval > lmax) {
|
if (lval < lmin || lval > lmax) {
|
||||||
dev_err(card->dev,
|
if (print_error)
|
||||||
"control %i:%i:%i:%s:%i: value out of range %lld (%lld/%lld) at count %i\n",
|
dev_err(card->dev,
|
||||||
control->id.iface, control->id.device,
|
"control %i:%i:%i:%s:%i: value out of range %lld (%lld/%lld) at count %i\n",
|
||||||
control->id.subdevice, control->id.name,
|
control->id.iface, control->id.device,
|
||||||
control->id.index, lval, lmin, lmax, i);
|
control->id.subdevice, control->id.name,
|
||||||
|
control->id.index, lval, lmin, lmax, i);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (lstep) {
|
if (lstep) {
|
||||||
div64_u64_rem(lval, lstep, &rem);
|
div64_u64_rem(lval, lstep, &rem);
|
||||||
if (rem) {
|
if (rem) {
|
||||||
dev_err(card->dev,
|
if (print_error)
|
||||||
"control %i:%i:%i:%s:%i: unaligned value %lld (step %lld) at count %i\n",
|
dev_err(card->dev,
|
||||||
control->id.iface, control->id.device,
|
"control %i:%i:%i:%s:%i: unaligned value %lld (step %lld) at count %i\n",
|
||||||
control->id.subdevice, control->id.name,
|
control->id.iface, control->id.device,
|
||||||
control->id.index, lval, lstep, i);
|
control->id.subdevice, control->id.name,
|
||||||
|
control->id.index, lval, lstep, i);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -928,6 +1041,33 @@ static int sanity_check_int_value(struct snd_card *card,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check whether the all input values are valid for the given elem value */
|
||||||
|
static int sanity_check_input_values(struct snd_card *card,
|
||||||
|
const struct snd_ctl_elem_value *control,
|
||||||
|
const struct snd_ctl_elem_info *info,
|
||||||
|
bool print_error)
|
||||||
|
{
|
||||||
|
int i, ret;
|
||||||
|
|
||||||
|
switch (info->type) {
|
||||||
|
case SNDRV_CTL_ELEM_TYPE_BOOLEAN:
|
||||||
|
case SNDRV_CTL_ELEM_TYPE_INTEGER:
|
||||||
|
case SNDRV_CTL_ELEM_TYPE_INTEGER64:
|
||||||
|
case SNDRV_CTL_ELEM_TYPE_ENUMERATED:
|
||||||
|
for (i = 0; i < info->count; i++) {
|
||||||
|
ret = sanity_check_int_value(card, control, info, i,
|
||||||
|
print_error);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* perform sanity checks to the given snd_ctl_elem_value object */
|
/* perform sanity checks to the given snd_ctl_elem_value object */
|
||||||
static int sanity_check_elem_value(struct snd_card *card,
|
static int sanity_check_elem_value(struct snd_card *card,
|
||||||
const struct snd_ctl_elem_value *control,
|
const struct snd_ctl_elem_value *control,
|
||||||
@ -935,23 +1075,12 @@ static int sanity_check_elem_value(struct snd_card *card,
|
|||||||
u32 pattern)
|
u32 pattern)
|
||||||
{
|
{
|
||||||
size_t offset;
|
size_t offset;
|
||||||
int i, ret = 0;
|
int ret;
|
||||||
u32 *p;
|
u32 *p;
|
||||||
|
|
||||||
switch (info->type) {
|
ret = sanity_check_input_values(card, control, info, true);
|
||||||
case SNDRV_CTL_ELEM_TYPE_BOOLEAN:
|
if (ret < 0)
|
||||||
case SNDRV_CTL_ELEM_TYPE_INTEGER:
|
return ret;
|
||||||
case SNDRV_CTL_ELEM_TYPE_INTEGER64:
|
|
||||||
case SNDRV_CTL_ELEM_TYPE_ENUMERATED:
|
|
||||||
for (i = 0; i < info->count; i++) {
|
|
||||||
ret = sanity_check_int_value(card, control, info, i);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check whether the remaining area kept untouched */
|
/* check whether the remaining area kept untouched */
|
||||||
offset = value_sizes[info->type] * info->count;
|
offset = value_sizes[info->type] * info->count;
|
||||||
@ -967,21 +1096,6 @@ static int sanity_check_elem_value(struct snd_card *card,
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
static inline void fill_remaining_elem_value(struct snd_ctl_elem_value *control,
|
|
||||||
struct snd_ctl_elem_info *info,
|
|
||||||
u32 pattern)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int sanity_check_elem_value(struct snd_card *card,
|
|
||||||
struct snd_ctl_elem_value *control,
|
|
||||||
struct snd_ctl_elem_info *info,
|
|
||||||
u32 pattern)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int __snd_ctl_elem_info(struct snd_card *card,
|
static int __snd_ctl_elem_info(struct snd_card *card,
|
||||||
struct snd_kcontrol *kctl,
|
struct snd_kcontrol *kctl,
|
||||||
@ -1077,7 +1191,7 @@ static int snd_ctl_elem_read(struct snd_card *card,
|
|||||||
|
|
||||||
snd_ctl_build_ioff(&control->id, kctl, index_offset);
|
snd_ctl_build_ioff(&control->id, kctl, index_offset);
|
||||||
|
|
||||||
#ifdef CONFIG_SND_CTL_VALIDATION
|
#ifdef CONFIG_SND_CTL_DEBUG
|
||||||
/* info is needed only for validation */
|
/* info is needed only for validation */
|
||||||
memset(&info, 0, sizeof(info));
|
memset(&info, 0, sizeof(info));
|
||||||
info.id = control->id;
|
info.id = control->id;
|
||||||
@ -1154,6 +1268,17 @@ static int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file,
|
|||||||
|
|
||||||
snd_ctl_build_ioff(&control->id, kctl, index_offset);
|
snd_ctl_build_ioff(&control->id, kctl, index_offset);
|
||||||
result = snd_power_ref_and_wait(card);
|
result = snd_power_ref_and_wait(card);
|
||||||
|
/* validate input values */
|
||||||
|
if (IS_ENABLED(CONFIG_SND_CTL_INPUT_VALIDATION) && !result) {
|
||||||
|
struct snd_ctl_elem_info info;
|
||||||
|
|
||||||
|
memset(&info, 0, sizeof(info));
|
||||||
|
info.id = control->id;
|
||||||
|
result = __snd_ctl_elem_info(card, kctl, &info, NULL);
|
||||||
|
if (!result)
|
||||||
|
result = sanity_check_input_values(card, control, &info,
|
||||||
|
false);
|
||||||
|
}
|
||||||
if (!result)
|
if (!result)
|
||||||
result = kctl->put(kctl, control);
|
result = kctl->put(kctl, control);
|
||||||
snd_power_unref(card);
|
snd_power_unref(card);
|
||||||
@ -1930,6 +2055,8 @@ static int _snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn, struct list_head *
|
|||||||
* @fcn: ioctl callback function
|
* @fcn: ioctl callback function
|
||||||
*
|
*
|
||||||
* called from each device manager like pcm.c, hwdep.c, etc.
|
* called from each device manager like pcm.c, hwdep.c, etc.
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn)
|
int snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn)
|
||||||
{
|
{
|
||||||
@ -1942,6 +2069,8 @@ EXPORT_SYMBOL(snd_ctl_register_ioctl);
|
|||||||
* snd_ctl_register_ioctl_compat - register the device-specific 32bit compat
|
* snd_ctl_register_ioctl_compat - register the device-specific 32bit compat
|
||||||
* control-ioctls
|
* control-ioctls
|
||||||
* @fcn: ioctl callback function
|
* @fcn: ioctl callback function
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_ctl_register_ioctl_compat(snd_kctl_ioctl_func_t fcn)
|
int snd_ctl_register_ioctl_compat(snd_kctl_ioctl_func_t fcn)
|
||||||
{
|
{
|
||||||
@ -1977,6 +2106,8 @@ static int _snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn,
|
|||||||
/**
|
/**
|
||||||
* snd_ctl_unregister_ioctl - de-register the device-specific control-ioctls
|
* snd_ctl_unregister_ioctl - de-register the device-specific control-ioctls
|
||||||
* @fcn: ioctl callback function to unregister
|
* @fcn: ioctl callback function to unregister
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn)
|
int snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn)
|
||||||
{
|
{
|
||||||
@ -1989,6 +2120,8 @@ EXPORT_SYMBOL(snd_ctl_unregister_ioctl);
|
|||||||
* snd_ctl_unregister_ioctl_compat - de-register the device-specific compat
|
* snd_ctl_unregister_ioctl_compat - de-register the device-specific compat
|
||||||
* 32bit control-ioctls
|
* 32bit control-ioctls
|
||||||
* @fcn: ioctl callback function to unregister
|
* @fcn: ioctl callback function to unregister
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_ctl_unregister_ioctl_compat(snd_kctl_ioctl_func_t fcn)
|
int snd_ctl_unregister_ioctl_compat(snd_kctl_ioctl_func_t fcn)
|
||||||
{
|
{
|
||||||
@ -2002,7 +2135,7 @@ static int snd_ctl_fasync(int fd, struct file * file, int on)
|
|||||||
struct snd_ctl_file *ctl;
|
struct snd_ctl_file *ctl;
|
||||||
|
|
||||||
ctl = file->private_data;
|
ctl = file->private_data;
|
||||||
return fasync_helper(fd, file, on, &ctl->fasync);
|
return snd_fasync_helper(fd, file, on, &ctl->fasync);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return the preferred subdevice number if already assigned;
|
/* return the preferred subdevice number if already assigned;
|
||||||
@ -2044,7 +2177,7 @@ EXPORT_SYMBOL_GPL(snd_ctl_get_preferred_subdevice);
|
|||||||
* snd_ctl_request_layer - request to use the layer
|
* snd_ctl_request_layer - request to use the layer
|
||||||
* @module_name: Name of the kernel module (NULL == build-in)
|
* @module_name: Name of the kernel module (NULL == build-in)
|
||||||
*
|
*
|
||||||
* Return an error code when the module cannot be loaded.
|
* Return: zero if successful, or an error code when the module cannot be loaded
|
||||||
*/
|
*/
|
||||||
int snd_ctl_request_layer(const char *module_name)
|
int snd_ctl_request_layer(const char *module_name)
|
||||||
{
|
{
|
||||||
@ -2170,7 +2303,7 @@ static int snd_ctl_dev_disconnect(struct snd_device *device)
|
|||||||
read_lock_irqsave(&card->ctl_files_rwlock, flags);
|
read_lock_irqsave(&card->ctl_files_rwlock, flags);
|
||||||
list_for_each_entry(ctl, &card->ctl_files, list) {
|
list_for_each_entry(ctl, &card->ctl_files, list) {
|
||||||
wake_up(&ctl->change_sleep);
|
wake_up(&ctl->change_sleep);
|
||||||
kill_fasync(&ctl->fasync, SIGIO, POLL_ERR);
|
snd_kill_fasync(ctl->fasync, SIGIO, POLL_ERR);
|
||||||
}
|
}
|
||||||
read_unlock_irqrestore(&card->ctl_files_rwlock, flags);
|
read_unlock_irqrestore(&card->ctl_files_rwlock, flags);
|
||||||
|
|
||||||
@ -2195,8 +2328,13 @@ static int snd_ctl_dev_free(struct snd_device *device)
|
|||||||
down_write(&card->controls_rwsem);
|
down_write(&card->controls_rwsem);
|
||||||
while (!list_empty(&card->controls)) {
|
while (!list_empty(&card->controls)) {
|
||||||
control = snd_kcontrol(card->controls.next);
|
control = snd_kcontrol(card->controls.next);
|
||||||
snd_ctl_remove(card, control);
|
__snd_ctl_remove(card, control, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SND_CTL_FAST_LOOKUP
|
||||||
|
xa_destroy(&card->ctl_numids);
|
||||||
|
xa_destroy(&card->ctl_hash);
|
||||||
|
#endif
|
||||||
up_write(&card->controls_rwsem);
|
up_write(&card->controls_rwsem);
|
||||||
put_device(&card->ctl_dev);
|
put_device(&card->ctl_dev);
|
||||||
return 0;
|
return 0;
|
||||||
@ -2241,6 +2379,8 @@ int snd_ctl_create(struct snd_card *card)
|
|||||||
*
|
*
|
||||||
* This is a function that can be used as info callback for a standard
|
* This is a function that can be used as info callback for a standard
|
||||||
* boolean control with a single mono channel.
|
* boolean control with a single mono channel.
|
||||||
|
*
|
||||||
|
* Return: Zero (always successful)
|
||||||
*/
|
*/
|
||||||
int snd_ctl_boolean_mono_info(struct snd_kcontrol *kcontrol,
|
int snd_ctl_boolean_mono_info(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_ctl_elem_info *uinfo)
|
struct snd_ctl_elem_info *uinfo)
|
||||||
@ -2261,6 +2401,8 @@ EXPORT_SYMBOL(snd_ctl_boolean_mono_info);
|
|||||||
*
|
*
|
||||||
* This is a function that can be used as info callback for a standard
|
* This is a function that can be used as info callback for a standard
|
||||||
* boolean control with stereo two channels.
|
* boolean control with stereo two channels.
|
||||||
|
*
|
||||||
|
* Return: Zero (always successful)
|
||||||
*/
|
*/
|
||||||
int snd_ctl_boolean_stereo_info(struct snd_kcontrol *kcontrol,
|
int snd_ctl_boolean_stereo_info(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_ctl_elem_info *uinfo)
|
struct snd_ctl_elem_info *uinfo)
|
||||||
@ -2284,7 +2426,7 @@ EXPORT_SYMBOL(snd_ctl_boolean_stereo_info);
|
|||||||
* If the control's accessibility is not the default (readable and writable),
|
* If the control's accessibility is not the default (readable and writable),
|
||||||
* the caller has to fill @info->access.
|
* the caller has to fill @info->access.
|
||||||
*
|
*
|
||||||
* Return: Zero.
|
* Return: Zero (always successful)
|
||||||
*/
|
*/
|
||||||
int snd_ctl_enum_info(struct snd_ctl_elem_info *info, unsigned int channels,
|
int snd_ctl_enum_info(struct snd_ctl_elem_info *info, unsigned int channels,
|
||||||
unsigned int items, const char *const names[])
|
unsigned int items, const char *const names[])
|
||||||
|
@ -405,7 +405,7 @@ static ssize_t mode_show(struct device *dev,
|
|||||||
case MODE_ON: str = "on"; break;
|
case MODE_ON: str = "on"; break;
|
||||||
case MODE_OFF: str = "off"; break;
|
case MODE_OFF: str = "off"; break;
|
||||||
}
|
}
|
||||||
return sprintf(buf, "%s\n", str);
|
return sysfs_emit(buf, "%s\n", str);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t mode_store(struct device *dev,
|
static ssize_t mode_store(struct device *dev,
|
||||||
@ -443,7 +443,7 @@ static ssize_t brightness_show(struct device *dev,
|
|||||||
{
|
{
|
||||||
struct snd_ctl_led *led = container_of(dev, struct snd_ctl_led, dev);
|
struct snd_ctl_led *led = container_of(dev, struct snd_ctl_led, dev);
|
||||||
|
|
||||||
return sprintf(buf, "%u\n", ledtrig_audio_get(led->trigger_type));
|
return sysfs_emit(buf, "%u\n", ledtrig_audio_get(led->trigger_type));
|
||||||
}
|
}
|
||||||
|
|
||||||
static DEVICE_ATTR_RW(mode);
|
static DEVICE_ATTR_RW(mode);
|
||||||
@ -618,8 +618,7 @@ static ssize_t list_show(struct device *dev,
|
|||||||
struct snd_ctl_led_card *led_card = container_of(dev, struct snd_ctl_led_card, dev);
|
struct snd_ctl_led_card *led_card = container_of(dev, struct snd_ctl_led_card, dev);
|
||||||
struct snd_card *card;
|
struct snd_card *card;
|
||||||
struct snd_ctl_led_ctl *lctl;
|
struct snd_ctl_led_ctl *lctl;
|
||||||
char *buf2 = buf;
|
size_t l = 0;
|
||||||
size_t l;
|
|
||||||
|
|
||||||
card = snd_card_ref(led_card->number);
|
card = snd_card_ref(led_card->number);
|
||||||
if (!card)
|
if (!card)
|
||||||
@ -627,23 +626,19 @@ static ssize_t list_show(struct device *dev,
|
|||||||
down_read(&card->controls_rwsem);
|
down_read(&card->controls_rwsem);
|
||||||
mutex_lock(&snd_ctl_led_mutex);
|
mutex_lock(&snd_ctl_led_mutex);
|
||||||
if (snd_ctl_led_card_valid[led_card->number]) {
|
if (snd_ctl_led_card_valid[led_card->number]) {
|
||||||
list_for_each_entry(lctl, &led_card->led->controls, list)
|
list_for_each_entry(lctl, &led_card->led->controls, list) {
|
||||||
if (lctl->card == card) {
|
if (lctl->card != card)
|
||||||
if (buf2 - buf > PAGE_SIZE - 16)
|
continue;
|
||||||
break;
|
if (l)
|
||||||
if (buf2 != buf)
|
l += sysfs_emit_at(buf, l, " ");
|
||||||
*buf2++ = ' ';
|
l += sysfs_emit_at(buf, l, "%u",
|
||||||
l = scnprintf(buf2, 15, "%u",
|
lctl->kctl->id.numid + lctl->index_offset);
|
||||||
lctl->kctl->id.numid +
|
}
|
||||||
lctl->index_offset);
|
|
||||||
buf2[l] = '\0';
|
|
||||||
buf2 += l + 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
mutex_unlock(&snd_ctl_led_mutex);
|
mutex_unlock(&snd_ctl_led_mutex);
|
||||||
up_read(&card->controls_rwsem);
|
up_read(&card->controls_rwsem);
|
||||||
snd_card_unref(card);
|
snd_card_unref(card);
|
||||||
return buf2 - buf;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DEVICE_ATTR_WO(attach);
|
static DEVICE_ATTR_WO(attach);
|
||||||
|
@ -247,6 +247,8 @@ void snd_device_free_all(struct snd_card *card)
|
|||||||
* device, either @SNDRV_DEV_BUILD, @SNDRV_DEV_REGISTERED or
|
* device, either @SNDRV_DEV_BUILD, @SNDRV_DEV_REGISTERED or
|
||||||
* @SNDRV_DEV_DISCONNECTED is returned.
|
* @SNDRV_DEV_DISCONNECTED is returned.
|
||||||
* Or for a non-existing device, -1 is returned as an error.
|
* Or for a non-existing device, -1 is returned as an error.
|
||||||
|
*
|
||||||
|
* Return: the current state, or -1 if not found
|
||||||
*/
|
*/
|
||||||
int snd_device_get_state(struct snd_card *card, void *device_data)
|
int snd_device_get_state(struct snd_card *card, void *device_data)
|
||||||
{
|
{
|
||||||
|
@ -868,6 +868,8 @@ EXPORT_SYMBOL(snd_info_register);
|
|||||||
*
|
*
|
||||||
* This proc file entry will be registered via snd_card_register() call, and
|
* This proc file entry will be registered via snd_card_register() call, and
|
||||||
* it will be removed automatically at the card removal, too.
|
* it will be removed automatically at the card removal, too.
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_card_rw_proc_new(struct snd_card *card, const char *name,
|
int snd_card_rw_proc_new(struct snd_card *card, const char *name,
|
||||||
void *private_data,
|
void *private_data,
|
||||||
|
@ -215,6 +215,8 @@ static void __snd_card_release(struct device *dev, void *data)
|
|||||||
* via snd_card_free() call in the error; otherwise it may lead to UAF due to
|
* via snd_card_free() call in the error; otherwise it may lead to UAF due to
|
||||||
* devres call orders. You can use snd_card_free_on_error() helper for
|
* devres call orders. You can use snd_card_free_on_error() helper for
|
||||||
* handling it more easily.
|
* handling it more easily.
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_devm_card_new(struct device *parent, int idx, const char *xid,
|
int snd_devm_card_new(struct device *parent, int idx, const char *xid,
|
||||||
struct module *module, size_t extra_size,
|
struct module *module, size_t extra_size,
|
||||||
@ -249,6 +251,8 @@ EXPORT_SYMBOL_GPL(snd_devm_card_new);
|
|||||||
* This function handles the explicit snd_card_free() call at the error from
|
* This function handles the explicit snd_card_free() call at the error from
|
||||||
* the probe callback. It's just a small helper for simplifying the error
|
* the probe callback. It's just a small helper for simplifying the error
|
||||||
* handling with the managed devices.
|
* handling with the managed devices.
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_card_free_on_error(struct device *dev, int ret)
|
int snd_card_free_on_error(struct device *dev, int ret)
|
||||||
{
|
{
|
||||||
@ -310,6 +314,10 @@ static int snd_card_init(struct snd_card *card, struct device *parent,
|
|||||||
rwlock_init(&card->ctl_files_rwlock);
|
rwlock_init(&card->ctl_files_rwlock);
|
||||||
INIT_LIST_HEAD(&card->controls);
|
INIT_LIST_HEAD(&card->controls);
|
||||||
INIT_LIST_HEAD(&card->ctl_files);
|
INIT_LIST_HEAD(&card->ctl_files);
|
||||||
|
#ifdef CONFIG_SND_CTL_FAST_LOOKUP
|
||||||
|
xa_init(&card->ctl_numids);
|
||||||
|
xa_init(&card->ctl_hash);
|
||||||
|
#endif
|
||||||
spin_lock_init(&card->files_lock);
|
spin_lock_init(&card->files_lock);
|
||||||
INIT_LIST_HEAD(&card->files_list);
|
INIT_LIST_HEAD(&card->files_list);
|
||||||
mutex_init(&card->memory_mutex);
|
mutex_init(&card->memory_mutex);
|
||||||
@ -366,6 +374,8 @@ static int snd_card_init(struct snd_card *card, struct device *parent,
|
|||||||
*
|
*
|
||||||
* Returns a card object corresponding to the given index or NULL if not found.
|
* Returns a card object corresponding to the given index or NULL if not found.
|
||||||
* Release the object via snd_card_unref().
|
* Release the object via snd_card_unref().
|
||||||
|
*
|
||||||
|
* Return: a card object or NULL
|
||||||
*/
|
*/
|
||||||
struct snd_card *snd_card_ref(int idx)
|
struct snd_card *snd_card_ref(int idx)
|
||||||
{
|
{
|
||||||
@ -604,6 +614,8 @@ static int snd_card_do_free(struct snd_card *card)
|
|||||||
* resource immediately, but tries to disconnect at first. When the card
|
* resource immediately, but tries to disconnect at first. When the card
|
||||||
* is still in use, the function returns before freeing the resources.
|
* is still in use, the function returns before freeing the resources.
|
||||||
* The card resources will be freed when the refcount gets to zero.
|
* The card resources will be freed when the refcount gets to zero.
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_card_free_when_closed(struct snd_card *card)
|
int snd_card_free_when_closed(struct snd_card *card)
|
||||||
{
|
{
|
||||||
@ -772,7 +784,7 @@ static ssize_t id_show(struct device *dev,
|
|||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
struct snd_card *card = container_of(dev, struct snd_card, card_dev);
|
struct snd_card *card = container_of(dev, struct snd_card, card_dev);
|
||||||
return scnprintf(buf, PAGE_SIZE, "%s\n", card->id);
|
return sysfs_emit(buf, "%s\n", card->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t id_store(struct device *dev, struct device_attribute *attr,
|
static ssize_t id_store(struct device *dev, struct device_attribute *attr,
|
||||||
@ -810,7 +822,7 @@ static ssize_t number_show(struct device *dev,
|
|||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
struct snd_card *card = container_of(dev, struct snd_card, card_dev);
|
struct snd_card *card = container_of(dev, struct snd_card, card_dev);
|
||||||
return scnprintf(buf, PAGE_SIZE, "%i\n", card->number);
|
return sysfs_emit(buf, "%i\n", card->number);
|
||||||
}
|
}
|
||||||
|
|
||||||
static DEVICE_ATTR_RO(number);
|
static DEVICE_ATTR_RO(number);
|
||||||
@ -829,6 +841,8 @@ static const struct attribute_group card_dev_attr_group = {
|
|||||||
* snd_card_add_dev_attr - Append a new sysfs attribute group to card
|
* snd_card_add_dev_attr - Append a new sysfs attribute group to card
|
||||||
* @card: card instance
|
* @card: card instance
|
||||||
* @group: attribute group to append
|
* @group: attribute group to append
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_card_add_dev_attr(struct snd_card *card,
|
int snd_card_add_dev_attr(struct snd_card *card,
|
||||||
const struct attribute_group *group)
|
const struct attribute_group *group)
|
||||||
|
@ -116,8 +116,9 @@ static void __snd_release_dma(struct device *dev, void *data)
|
|||||||
* @dma: the dma number
|
* @dma: the dma number
|
||||||
* @name: the name string of the requester
|
* @name: the name string of the requester
|
||||||
*
|
*
|
||||||
* Returns zero on success, or a negative error code.
|
|
||||||
* The requested DMA will be automatically released at unbinding via devres.
|
* The requested DMA will be automatically released at unbinding via devres.
|
||||||
|
*
|
||||||
|
* Return: zero on success, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_devm_request_dma(struct device *dev, int dma, const char *name)
|
int snd_devm_request_dma(struct device *dev, int dma, const char *name)
|
||||||
{
|
{
|
||||||
|
@ -147,7 +147,7 @@ static void __snd_release_pages(struct device *dev, void *res)
|
|||||||
* hence it can't work with SNDRV_DMA_TYPE_CONTINUOUS or
|
* hence it can't work with SNDRV_DMA_TYPE_CONTINUOUS or
|
||||||
* SNDRV_DMA_TYPE_VMALLOC type.
|
* SNDRV_DMA_TYPE_VMALLOC type.
|
||||||
*
|
*
|
||||||
* The function returns the snd_dma_buffer object at success, or NULL if failed.
|
* Return: the snd_dma_buffer object at success, or NULL if failed
|
||||||
*/
|
*/
|
||||||
struct snd_dma_buffer *
|
struct snd_dma_buffer *
|
||||||
snd_devm_alloc_dir_pages(struct device *dev, int type,
|
snd_devm_alloc_dir_pages(struct device *dev, int type,
|
||||||
@ -179,6 +179,8 @@ EXPORT_SYMBOL_GPL(snd_devm_alloc_dir_pages);
|
|||||||
* snd_dma_buffer_mmap - perform mmap of the given DMA buffer
|
* snd_dma_buffer_mmap - perform mmap of the given DMA buffer
|
||||||
* @dmab: buffer allocation information
|
* @dmab: buffer allocation information
|
||||||
* @area: VM area information
|
* @area: VM area information
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_dma_buffer_mmap(struct snd_dma_buffer *dmab,
|
int snd_dma_buffer_mmap(struct snd_dma_buffer *dmab,
|
||||||
struct vm_area_struct *area)
|
struct vm_area_struct *area)
|
||||||
@ -219,6 +221,8 @@ EXPORT_SYMBOL_GPL(snd_dma_buffer_sync);
|
|||||||
* snd_sgbuf_get_addr - return the physical address at the corresponding offset
|
* snd_sgbuf_get_addr - return the physical address at the corresponding offset
|
||||||
* @dmab: buffer allocation information
|
* @dmab: buffer allocation information
|
||||||
* @offset: offset in the ring buffer
|
* @offset: offset in the ring buffer
|
||||||
|
*
|
||||||
|
* Return: the physical address
|
||||||
*/
|
*/
|
||||||
dma_addr_t snd_sgbuf_get_addr(struct snd_dma_buffer *dmab, size_t offset)
|
dma_addr_t snd_sgbuf_get_addr(struct snd_dma_buffer *dmab, size_t offset)
|
||||||
{
|
{
|
||||||
@ -235,6 +239,8 @@ EXPORT_SYMBOL(snd_sgbuf_get_addr);
|
|||||||
* snd_sgbuf_get_page - return the physical page at the corresponding offset
|
* snd_sgbuf_get_page - return the physical page at the corresponding offset
|
||||||
* @dmab: buffer allocation information
|
* @dmab: buffer allocation information
|
||||||
* @offset: offset in the ring buffer
|
* @offset: offset in the ring buffer
|
||||||
|
*
|
||||||
|
* Return: the page pointer
|
||||||
*/
|
*/
|
||||||
struct page *snd_sgbuf_get_page(struct snd_dma_buffer *dmab, size_t offset)
|
struct page *snd_sgbuf_get_page(struct snd_dma_buffer *dmab, size_t offset)
|
||||||
{
|
{
|
||||||
@ -253,6 +259,8 @@ EXPORT_SYMBOL(snd_sgbuf_get_page);
|
|||||||
* @dmab: buffer allocation information
|
* @dmab: buffer allocation information
|
||||||
* @ofs: offset in the ring buffer
|
* @ofs: offset in the ring buffer
|
||||||
* @size: the requested size
|
* @size: the requested size
|
||||||
|
*
|
||||||
|
* Return: the chunk size
|
||||||
*/
|
*/
|
||||||
unsigned int snd_sgbuf_get_chunk_size(struct snd_dma_buffer *dmab,
|
unsigned int snd_sgbuf_get_chunk_size(struct snd_dma_buffer *dmab,
|
||||||
unsigned int ofs, unsigned int size)
|
unsigned int ofs, unsigned int size)
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
|
#include <linux/fs.h>
|
||||||
#include <sound/core.h>
|
#include <sound/core.h>
|
||||||
|
|
||||||
#ifdef CONFIG_SND_DEBUG
|
#ifdef CONFIG_SND_DEBUG
|
||||||
@ -145,3 +146,96 @@ snd_pci_quirk_lookup(struct pci_dev *pci, const struct snd_pci_quirk *list)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(snd_pci_quirk_lookup);
|
EXPORT_SYMBOL(snd_pci_quirk_lookup);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Deferred async signal helpers
|
||||||
|
*
|
||||||
|
* Below are a few helper functions to wrap the async signal handling
|
||||||
|
* in the deferred work. The main purpose is to avoid the messy deadlock
|
||||||
|
* around tasklist_lock and co at the kill_fasync() invocation.
|
||||||
|
* fasync_helper() and kill_fasync() are replaced with snd_fasync_helper()
|
||||||
|
* and snd_kill_fasync(), respectively. In addition, snd_fasync_free() has
|
||||||
|
* to be called at releasing the relevant file object.
|
||||||
|
*/
|
||||||
|
struct snd_fasync {
|
||||||
|
struct fasync_struct *fasync;
|
||||||
|
int signal;
|
||||||
|
int poll;
|
||||||
|
int on;
|
||||||
|
struct list_head list;
|
||||||
|
};
|
||||||
|
|
||||||
|
static DEFINE_SPINLOCK(snd_fasync_lock);
|
||||||
|
static LIST_HEAD(snd_fasync_list);
|
||||||
|
|
||||||
|
static void snd_fasync_work_fn(struct work_struct *work)
|
||||||
|
{
|
||||||
|
struct snd_fasync *fasync;
|
||||||
|
|
||||||
|
spin_lock_irq(&snd_fasync_lock);
|
||||||
|
while (!list_empty(&snd_fasync_list)) {
|
||||||
|
fasync = list_first_entry(&snd_fasync_list, struct snd_fasync, list);
|
||||||
|
list_del_init(&fasync->list);
|
||||||
|
spin_unlock_irq(&snd_fasync_lock);
|
||||||
|
if (fasync->on)
|
||||||
|
kill_fasync(&fasync->fasync, fasync->signal, fasync->poll);
|
||||||
|
spin_lock_irq(&snd_fasync_lock);
|
||||||
|
}
|
||||||
|
spin_unlock_irq(&snd_fasync_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
static DECLARE_WORK(snd_fasync_work, snd_fasync_work_fn);
|
||||||
|
|
||||||
|
int snd_fasync_helper(int fd, struct file *file, int on,
|
||||||
|
struct snd_fasync **fasyncp)
|
||||||
|
{
|
||||||
|
struct snd_fasync *fasync = NULL;
|
||||||
|
|
||||||
|
if (on) {
|
||||||
|
fasync = kzalloc(sizeof(*fasync), GFP_KERNEL);
|
||||||
|
if (!fasync)
|
||||||
|
return -ENOMEM;
|
||||||
|
INIT_LIST_HEAD(&fasync->list);
|
||||||
|
}
|
||||||
|
|
||||||
|
spin_lock_irq(&snd_fasync_lock);
|
||||||
|
if (*fasyncp) {
|
||||||
|
kfree(fasync);
|
||||||
|
fasync = *fasyncp;
|
||||||
|
} else {
|
||||||
|
if (!fasync) {
|
||||||
|
spin_unlock_irq(&snd_fasync_lock);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*fasyncp = fasync;
|
||||||
|
}
|
||||||
|
fasync->on = on;
|
||||||
|
spin_unlock_irq(&snd_fasync_lock);
|
||||||
|
return fasync_helper(fd, file, on, &fasync->fasync);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(snd_fasync_helper);
|
||||||
|
|
||||||
|
void snd_kill_fasync(struct snd_fasync *fasync, int signal, int poll)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (!fasync || !fasync->on)
|
||||||
|
return;
|
||||||
|
spin_lock_irqsave(&snd_fasync_lock, flags);
|
||||||
|
fasync->signal = signal;
|
||||||
|
fasync->poll = poll;
|
||||||
|
list_move(&fasync->list, &snd_fasync_list);
|
||||||
|
schedule_work(&snd_fasync_work);
|
||||||
|
spin_unlock_irqrestore(&snd_fasync_lock, flags);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(snd_kill_fasync);
|
||||||
|
|
||||||
|
void snd_fasync_free(struct snd_fasync *fasync)
|
||||||
|
{
|
||||||
|
if (!fasync)
|
||||||
|
return;
|
||||||
|
fasync->on = 0;
|
||||||
|
flush_work(&snd_fasync_work);
|
||||||
|
kfree(fasync);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(snd_fasync_free);
|
||||||
|
@ -216,6 +216,8 @@ static const char * const snd_pcm_format_names[] = {
|
|||||||
/**
|
/**
|
||||||
* snd_pcm_format_name - Return a name string for the given PCM format
|
* snd_pcm_format_name - Return a name string for the given PCM format
|
||||||
* @format: PCM format
|
* @format: PCM format
|
||||||
|
*
|
||||||
|
* Return: the format name string
|
||||||
*/
|
*/
|
||||||
const char *snd_pcm_format_name(snd_pcm_format_t format)
|
const char *snd_pcm_format_name(snd_pcm_format_t format)
|
||||||
{
|
{
|
||||||
@ -1005,6 +1007,7 @@ void snd_pcm_detach_substream(struct snd_pcm_substream *substream)
|
|||||||
substream->runtime = NULL;
|
substream->runtime = NULL;
|
||||||
}
|
}
|
||||||
mutex_destroy(&runtime->buffer_mutex);
|
mutex_destroy(&runtime->buffer_mutex);
|
||||||
|
snd_fasync_free(runtime->fasync);
|
||||||
kfree(runtime);
|
kfree(runtime);
|
||||||
put_pid(substream->pid);
|
put_pid(substream->pid);
|
||||||
substream->pid = NULL;
|
substream->pid = NULL;
|
||||||
@ -1028,7 +1031,7 @@ static ssize_t pcm_class_show(struct device *dev,
|
|||||||
str = "none";
|
str = "none";
|
||||||
else
|
else
|
||||||
str = strs[pcm->dev_class];
|
str = strs[pcm->dev_class];
|
||||||
return sprintf(buf, "%s\n", str);
|
return sysfs_emit(buf, "%s\n", str);
|
||||||
}
|
}
|
||||||
|
|
||||||
static DEVICE_ATTR_RO(pcm_class);
|
static DEVICE_ATTR_RO(pcm_class);
|
||||||
@ -1138,6 +1141,8 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
|
|||||||
* This adds the given notifier to the global list so that the callback is
|
* This adds the given notifier to the global list so that the callback is
|
||||||
* called for each registered PCM devices. This exists only for PCM OSS
|
* called for each registered PCM devices. This exists only for PCM OSS
|
||||||
* emulation, so far.
|
* emulation, so far.
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree)
|
int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree)
|
||||||
{
|
{
|
||||||
|
@ -48,6 +48,8 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_get_chan);
|
|||||||
*
|
*
|
||||||
* This function can be used to initialize a dma_slave_config from a substream
|
* This function can be used to initialize a dma_slave_config from a substream
|
||||||
* and hw_params in a dmaengine based PCM driver implementation.
|
* and hw_params in a dmaengine based PCM driver implementation.
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_hwparams_to_dma_slave_config(const struct snd_pcm_substream *substream,
|
int snd_hwparams_to_dma_slave_config(const struct snd_pcm_substream *substream,
|
||||||
const struct snd_pcm_hw_params *params,
|
const struct snd_pcm_hw_params *params,
|
||||||
@ -175,10 +177,10 @@ static int dmaengine_pcm_prepare_and_submit(struct snd_pcm_substream *substream)
|
|||||||
* @substream: PCM substream
|
* @substream: PCM substream
|
||||||
* @cmd: Trigger command
|
* @cmd: Trigger command
|
||||||
*
|
*
|
||||||
* Returns 0 on success, a negative error code otherwise.
|
|
||||||
*
|
|
||||||
* This function can be used as the PCM trigger callback for dmaengine based PCM
|
* This function can be used as the PCM trigger callback for dmaengine based PCM
|
||||||
* driver implementations.
|
* driver implementations.
|
||||||
|
*
|
||||||
|
* Return: 0 on success, a negative error code otherwise
|
||||||
*/
|
*/
|
||||||
int snd_dmaengine_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
int snd_dmaengine_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
||||||
{
|
{
|
||||||
@ -223,6 +225,8 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_trigger);
|
|||||||
*
|
*
|
||||||
* This function is deprecated and should not be used by new drivers, as its
|
* This function is deprecated and should not be used by new drivers, as its
|
||||||
* results may be unreliable.
|
* results may be unreliable.
|
||||||
|
*
|
||||||
|
* Return: PCM position in frames
|
||||||
*/
|
*/
|
||||||
snd_pcm_uframes_t snd_dmaengine_pcm_pointer_no_residue(struct snd_pcm_substream *substream)
|
snd_pcm_uframes_t snd_dmaengine_pcm_pointer_no_residue(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
@ -237,6 +241,8 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_pointer_no_residue);
|
|||||||
*
|
*
|
||||||
* This function can be used as the PCM pointer callback for dmaengine based PCM
|
* This function can be used as the PCM pointer callback for dmaengine based PCM
|
||||||
* driver implementations.
|
* driver implementations.
|
||||||
|
*
|
||||||
|
* Return: PCM position in frames
|
||||||
*/
|
*/
|
||||||
snd_pcm_uframes_t snd_dmaengine_pcm_pointer(struct snd_pcm_substream *substream)
|
snd_pcm_uframes_t snd_dmaengine_pcm_pointer(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
@ -266,9 +272,9 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_pointer);
|
|||||||
* @filter_fn: Filter function used to request the DMA channel
|
* @filter_fn: Filter function used to request the DMA channel
|
||||||
* @filter_data: Data passed to the DMA filter function
|
* @filter_data: Data passed to the DMA filter function
|
||||||
*
|
*
|
||||||
* Returns NULL or the requested DMA channel.
|
|
||||||
*
|
|
||||||
* This function request a DMA channel for usage with dmaengine PCM.
|
* This function request a DMA channel for usage with dmaengine PCM.
|
||||||
|
*
|
||||||
|
* Return: NULL or the requested DMA channel
|
||||||
*/
|
*/
|
||||||
struct dma_chan *snd_dmaengine_pcm_request_channel(dma_filter_fn filter_fn,
|
struct dma_chan *snd_dmaengine_pcm_request_channel(dma_filter_fn filter_fn,
|
||||||
void *filter_data)
|
void *filter_data)
|
||||||
@ -288,11 +294,11 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_request_channel);
|
|||||||
* @substream: PCM substream
|
* @substream: PCM substream
|
||||||
* @chan: DMA channel to use for data transfers
|
* @chan: DMA channel to use for data transfers
|
||||||
*
|
*
|
||||||
* Returns 0 on success, a negative error code otherwise.
|
|
||||||
*
|
|
||||||
* The function should usually be called from the pcm open callback. Note that
|
* The function should usually be called from the pcm open callback. Note that
|
||||||
* this function will use private_data field of the substream's runtime. So it
|
* this function will use private_data field of the substream's runtime. So it
|
||||||
* is not available to your pcm driver implementation.
|
* is not available to your pcm driver implementation.
|
||||||
|
*
|
||||||
|
* Return: 0 on success, a negative error code otherwise
|
||||||
*/
|
*/
|
||||||
int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
|
int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
|
||||||
struct dma_chan *chan)
|
struct dma_chan *chan)
|
||||||
@ -326,12 +332,12 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_open);
|
|||||||
* @filter_fn: Filter function used to request the DMA channel
|
* @filter_fn: Filter function used to request the DMA channel
|
||||||
* @filter_data: Data passed to the DMA filter function
|
* @filter_data: Data passed to the DMA filter function
|
||||||
*
|
*
|
||||||
* Returns 0 on success, a negative error code otherwise.
|
|
||||||
*
|
|
||||||
* This function will request a DMA channel using the passed filter function and
|
* This function will request a DMA channel using the passed filter function and
|
||||||
* data. The function should usually be called from the pcm open callback. Note
|
* data. The function should usually be called from the pcm open callback. Note
|
||||||
* that this function will use private_data field of the substream's runtime. So
|
* that this function will use private_data field of the substream's runtime. So
|
||||||
* it is not available to your pcm driver implementation.
|
* it is not available to your pcm driver implementation.
|
||||||
|
*
|
||||||
|
* Return: 0 on success, a negative error code otherwise
|
||||||
*/
|
*/
|
||||||
int snd_dmaengine_pcm_open_request_chan(struct snd_pcm_substream *substream,
|
int snd_dmaengine_pcm_open_request_chan(struct snd_pcm_substream *substream,
|
||||||
dma_filter_fn filter_fn, void *filter_data)
|
dma_filter_fn filter_fn, void *filter_data)
|
||||||
@ -344,6 +350,8 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_open_request_chan);
|
|||||||
/**
|
/**
|
||||||
* snd_dmaengine_pcm_close - Close a dmaengine based PCM substream
|
* snd_dmaengine_pcm_close - Close a dmaengine based PCM substream
|
||||||
* @substream: PCM substream
|
* @substream: PCM substream
|
||||||
|
*
|
||||||
|
* Return: 0 on success, a negative error code otherwise
|
||||||
*/
|
*/
|
||||||
int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream)
|
int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
@ -362,6 +370,8 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_close);
|
|||||||
* @substream: PCM substream
|
* @substream: PCM substream
|
||||||
*
|
*
|
||||||
* Releases the DMA channel associated with the PCM substream.
|
* Releases the DMA channel associated with the PCM substream.
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_dmaengine_pcm_close_release_chan(struct snd_pcm_substream *substream)
|
int snd_dmaengine_pcm_close_release_chan(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
@ -382,10 +392,10 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_close_release_chan);
|
|||||||
* @hw: PCM hw params
|
* @hw: PCM hw params
|
||||||
* @chan: DMA channel to use for data transfers
|
* @chan: DMA channel to use for data transfers
|
||||||
*
|
*
|
||||||
* Returns 0 on success, a negative error code otherwise.
|
|
||||||
*
|
|
||||||
* This function will query DMA capability, then refine the pcm hardware
|
* This function will query DMA capability, then refine the pcm hardware
|
||||||
* parameters.
|
* parameters.
|
||||||
|
*
|
||||||
|
* Return: 0 on success, a negative error code otherwise
|
||||||
*/
|
*/
|
||||||
int snd_dmaengine_pcm_refine_runtime_hwparams(
|
int snd_dmaengine_pcm_refine_runtime_hwparams(
|
||||||
struct snd_pcm_substream *substream,
|
struct snd_pcm_substream *substream,
|
||||||
|
@ -1822,7 +1822,7 @@ void snd_pcm_period_elapsed_under_stream_lock(struct snd_pcm_substream *substrea
|
|||||||
snd_timer_interrupt(substream->timer, 1);
|
snd_timer_interrupt(substream->timer, 1);
|
||||||
#endif
|
#endif
|
||||||
_end:
|
_end:
|
||||||
kill_fasync(&runtime->fasync, SIGIO, POLL_IN);
|
snd_kill_fasync(runtime->fasync, SIGIO, POLL_IN);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(snd_pcm_period_elapsed_under_stream_lock);
|
EXPORT_SYMBOL(snd_pcm_period_elapsed_under_stream_lock);
|
||||||
|
|
||||||
|
@ -350,6 +350,8 @@ EXPORT_SYMBOL(snd_pcm_lib_preallocate_pages_for_all);
|
|||||||
* SNDRV_DMA_TYPE_VMALLOC type.
|
* SNDRV_DMA_TYPE_VMALLOC type.
|
||||||
*
|
*
|
||||||
* Upon successful buffer allocation and setup, the function returns 0.
|
* Upon successful buffer allocation and setup, the function returns 0.
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_pcm_set_managed_buffer(struct snd_pcm_substream *substream, int type,
|
int snd_pcm_set_managed_buffer(struct snd_pcm_substream *substream, int type,
|
||||||
struct device *data, size_t size, size_t max)
|
struct device *data, size_t size, size_t max)
|
||||||
@ -369,6 +371,8 @@ EXPORT_SYMBOL(snd_pcm_set_managed_buffer);
|
|||||||
*
|
*
|
||||||
* Do pre-allocation to all substreams of the given pcm for the specified DMA
|
* Do pre-allocation to all substreams of the given pcm for the specified DMA
|
||||||
* type and size, and set the managed_buffer_alloc flag to each substream.
|
* type and size, and set the managed_buffer_alloc flag to each substream.
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_pcm_set_managed_buffer_all(struct snd_pcm *pcm, int type,
|
int snd_pcm_set_managed_buffer_all(struct snd_pcm *pcm, int type,
|
||||||
struct device *data,
|
struct device *data,
|
||||||
|
@ -3412,6 +3412,8 @@ static long snd_pcm_ioctl(struct file *file, unsigned int cmd,
|
|||||||
* The function is provided primarily for OSS layer and USB gadget drivers,
|
* The function is provided primarily for OSS layer and USB gadget drivers,
|
||||||
* and it allows only the limited set of ioctls (hw_params, sw_params,
|
* and it allows only the limited set of ioctls (hw_params, sw_params,
|
||||||
* prepare, start, drain, drop, forward).
|
* prepare, start, drain, drop, forward).
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream,
|
int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream,
|
||||||
unsigned int cmd, void *arg)
|
unsigned int cmd, void *arg)
|
||||||
@ -3810,6 +3812,8 @@ static const struct vm_operations_struct snd_pcm_vm_ops_data_fault = {
|
|||||||
*
|
*
|
||||||
* This is the default mmap handler for PCM data. When mmap pcm_ops is NULL,
|
* This is the default mmap handler for PCM data. When mmap pcm_ops is NULL,
|
||||||
* this function is invoked implicitly.
|
* this function is invoked implicitly.
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_pcm_lib_default_mmap(struct snd_pcm_substream *substream,
|
int snd_pcm_lib_default_mmap(struct snd_pcm_substream *substream,
|
||||||
struct vm_area_struct *area)
|
struct vm_area_struct *area)
|
||||||
@ -3836,6 +3840,8 @@ EXPORT_SYMBOL_GPL(snd_pcm_lib_default_mmap);
|
|||||||
* When your hardware uses the iomapped pages as the hardware buffer and
|
* When your hardware uses the iomapped pages as the hardware buffer and
|
||||||
* wants to mmap it, pass this function as mmap pcm_ops. Note that this
|
* wants to mmap it, pass this function as mmap pcm_ops. Note that this
|
||||||
* is supposed to work only on limited architectures.
|
* is supposed to work only on limited architectures.
|
||||||
|
*
|
||||||
|
* Return: zero if successful, or a negative error code
|
||||||
*/
|
*/
|
||||||
int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream,
|
int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream,
|
||||||
struct vm_area_struct *area)
|
struct vm_area_struct *area)
|
||||||
@ -3945,7 +3951,7 @@ static int snd_pcm_fasync(int fd, struct file * file, int on)
|
|||||||
runtime = substream->runtime;
|
runtime = substream->runtime;
|
||||||
if (runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED)
|
if (runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED)
|
||||||
return -EBADFD;
|
return -EBADFD;
|
||||||
return fasync_helper(fd, file, on, &runtime->fasync);
|
return snd_fasync_helper(fd, file, on, &runtime->fasync);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user