Merge remote-tracking branch 'asoc/for-5.9' into asoc-next
This commit is contained in:
Коммит
84569f329f
|
@ -1,9 +1,9 @@
|
|||
Analog Devices ADAU1977/ADAU1978/ADAU1979
|
||||
|
||||
Datasheets:
|
||||
http://www.analog.com/media/en/technical-documentation/data-sheets/ADAU1977.pdf
|
||||
http://www.analog.com/media/en/technical-documentation/data-sheets/ADAU1978.pdf
|
||||
http://www.analog.com/media/en/technical-documentation/data-sheets/ADAU1979.pdf
|
||||
https://www.analog.com/media/en/technical-documentation/data-sheets/ADAU1977.pdf
|
||||
https://www.analog.com/media/en/technical-documentation/data-sheets/ADAU1978.pdf
|
||||
https://www.analog.com/media/en/technical-documentation/data-sheets/ADAU1979.pdf
|
||||
|
||||
This driver supports both the I2C and SPI bus.
|
||||
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
AK4613 I2C transmitter
|
||||
|
||||
This device supports I2C mode only.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : "asahi-kasei,ak4613"
|
||||
- reg : The chip select number on the I2C bus
|
||||
|
||||
Optional properties:
|
||||
- asahi-kasei,in1-single-end : Boolean. Indicate input / output pins are single-ended.
|
||||
- asahi-kasei,in2-single-end rather than differential.
|
||||
- asahi-kasei,out1-single-end
|
||||
- asahi-kasei,out2-single-end
|
||||
- asahi-kasei,out3-single-end
|
||||
- asahi-kasei,out4-single-end
|
||||
- asahi-kasei,out5-single-end
|
||||
- asahi-kasei,out6-single-end
|
||||
|
||||
Example:
|
||||
|
||||
&i2c {
|
||||
ak4613: ak4613@10 {
|
||||
compatible = "asahi-kasei,ak4613";
|
||||
reg = <0x10>;
|
||||
};
|
||||
};
|
|
@ -0,0 +1,49 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/ak4613.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: AK4613 I2C transmitter Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: asahi-kasei,ak4613
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
"#sound-dai-cells":
|
||||
const: 0
|
||||
|
||||
patternProperties:
|
||||
"^asahi-kasei,in[1-2]-single-end$":
|
||||
description: Input Pin 1 - 2.
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
|
||||
"^asahi-kasei,out[1-6]-single-end$":
|
||||
description: Output Pin 1 - 6.
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
ak4613: codec@10 {
|
||||
compatible = "asahi-kasei,ak4613";
|
||||
reg = <0x10>;
|
||||
};
|
||||
};
|
|
@ -1,37 +0,0 @@
|
|||
AK4642 I2C transmitter
|
||||
|
||||
This device supports I2C mode only.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : "asahi-kasei,ak4642" or "asahi-kasei,ak4643" or "asahi-kasei,ak4648"
|
||||
- reg : The chip select number on the I2C bus
|
||||
|
||||
Optional properties:
|
||||
|
||||
- #clock-cells : common clock binding; shall be set to 0
|
||||
- clocks : common clock binding; MCKI clock
|
||||
- clock-frequency : common clock binding; frequency of MCKO
|
||||
- clock-output-names : common clock binding; MCKO clock name
|
||||
|
||||
Example 1:
|
||||
|
||||
&i2c {
|
||||
ak4648: ak4648@12 {
|
||||
compatible = "asahi-kasei,ak4642";
|
||||
reg = <0x12>;
|
||||
};
|
||||
};
|
||||
|
||||
Example 2:
|
||||
|
||||
&i2c {
|
||||
ak4643: codec@12 {
|
||||
compatible = "asahi-kasei,ak4643";
|
||||
reg = <0x12>;
|
||||
#clock-cells = <0>;
|
||||
clocks = <&audio_clock>;
|
||||
clock-frequency = <12288000>;
|
||||
clock-output-names = "ak4643_mcko";
|
||||
};
|
||||
};
|
|
@ -0,0 +1,58 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/ak4642.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: AK4642 I2C transmitter Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- asahi-kasei,ak4642
|
||||
- asahi-kasei,ak4643
|
||||
- asahi-kasei,ak4648
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
"#clock-cells":
|
||||
const: 0
|
||||
"#sound-dai-cells":
|
||||
const: 0
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
clock-frequency:
|
||||
description: common clock binding; frequency of MCKO
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
clock-output-names:
|
||||
description: common clock name
|
||||
$ref: /schemas/types.yaml#/definitions/string
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
ak4643: codec@12 {
|
||||
compatible = "asahi-kasei,ak4643";
|
||||
#sound-dai-cells = <0>;
|
||||
reg = <0x12>;
|
||||
#clock-cells = <0>;
|
||||
clocks = <&audio_clock>;
|
||||
clock-frequency = <12288000>;
|
||||
clock-output-names = "ak4643_mcko";
|
||||
};
|
||||
};
|
|
@ -1,23 +0,0 @@
|
|||
Everest ES8316 audio CODEC
|
||||
|
||||
This device supports both I2C and SPI.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : should be "everest,es8316"
|
||||
- reg : the I2C address of the device for I2C
|
||||
|
||||
Optional properties:
|
||||
|
||||
- clocks : a list of phandle, should contain entries for clock-names
|
||||
- clock-names : should include as follows:
|
||||
"mclk" : master clock (MCLK) of the device
|
||||
|
||||
Example:
|
||||
|
||||
es8316: codec@11 {
|
||||
compatible = "everest,es8316";
|
||||
reg = <0x11>;
|
||||
clocks = <&clks 10>;
|
||||
clock-names = "mclk";
|
||||
};
|
|
@ -0,0 +1,50 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/everest,es8316.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Everest ES8316 audio CODEC
|
||||
|
||||
maintainers:
|
||||
- Daniel Drake <drake@endlessm.com>
|
||||
- Katsuhiro Suzuki <katsuhiro@katsuster.net>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: everest,es8316
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: clock for master clock (MCLK)
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: mclk
|
||||
|
||||
"#sound-dai-cells":
|
||||
const: 0
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- "#sound-dai-cells"
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
es8316: codec@11 {
|
||||
compatible = "everest,es8316";
|
||||
reg = <0x11>;
|
||||
clocks = <&clks 10>;
|
||||
clock-names = "mclk";
|
||||
#sound-dai-cells = <0>;
|
||||
};
|
||||
};
|
|
@ -6,7 +6,11 @@ a fibre cable.
|
|||
|
||||
Required properties:
|
||||
|
||||
- compatible : Compatible list, must contain "fsl,imx35-spdif".
|
||||
- compatible : Compatible list, should contain one of the following
|
||||
compatibles:
|
||||
"fsl,imx35-spdif",
|
||||
"fsl,vf610-spdif",
|
||||
"fsl,imx6sx-spdif",
|
||||
|
||||
- reg : Offset and length of the register set for the device.
|
||||
|
||||
|
|
|
@ -34,6 +34,10 @@ The compatible list for this generic sound card currently:
|
|||
|
||||
"fsl,imx-audio-wm8960"
|
||||
|
||||
"fsl,imx-audio-mqs"
|
||||
|
||||
"fsl,imx-audio-wm8524"
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : Contains one of entries in the compatible list.
|
||||
|
@ -44,6 +48,11 @@ Required properties:
|
|||
|
||||
- audio-codec : The phandle of an audio codec
|
||||
|
||||
Optional properties:
|
||||
|
||||
- audio-asrc : The phandle of ASRC. It can be absent if there's no
|
||||
need to add ASRC support via DPCM.
|
||||
|
||||
- audio-routing : A list of the connections between audio components.
|
||||
Each entry is a pair of strings, the first being the
|
||||
connection's sink, the second being the connection's
|
||||
|
@ -60,10 +69,13 @@ Required properties:
|
|||
coexisting in order to support the old bindings
|
||||
of wm8962 and sgtl5000.
|
||||
|
||||
Optional properties:
|
||||
|
||||
- audio-asrc : The phandle of ASRC. It can be absent if there's no
|
||||
need to add ASRC support via DPCM.
|
||||
- hp-det-gpio : The GPIO that detect headphones are plugged in
|
||||
- mic-det-gpio : The GPIO that detect microphones are plugged in
|
||||
- bitclock-master : Indicates dai-link bit clock master; for details see simple-card.yaml.
|
||||
- frame-master : Indicates dai-link frame master; for details see simple-card.yaml.
|
||||
- dai-format : audio format, for details see simple-card.yaml.
|
||||
- frame-inversion : dai-link uses frame clock inversion, for details see simple-card.yaml.
|
||||
- bitclock-inversion : dai-link uses bit clock inversion, for details see simple-card.yaml.
|
||||
|
||||
Optional unless SSI is selected as a CPU DAI:
|
||||
|
||||
|
|
|
@ -0,0 +1,70 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
# Copyright 2020 Intel Corporation
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/intel,keembay-i2s.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Intel KeemBay I2S Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Sia, Jee Heng <jee.heng.sia@intel.com>
|
||||
|
||||
description: |
|
||||
Intel KeemBay I2S
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- intel,keembay-i2s
|
||||
|
||||
"#sound-dai-cells":
|
||||
const: 0
|
||||
|
||||
reg:
|
||||
items:
|
||||
- description: I2S registers
|
||||
- description: I2S gen configuration
|
||||
|
||||
reg-names:
|
||||
items:
|
||||
- const: i2s-regs
|
||||
- const: i2s_gen_cfg
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Bus Clock
|
||||
- description: Module Clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: osc
|
||||
- const: apb_clk
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- "#sound-dai-cells"
|
||||
- reg
|
||||
- clocks
|
||||
- clock-names
|
||||
- interrupts
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#define KEEM_BAY_PSS_AUX_I2S3
|
||||
#define KEEM_BAY_PSS_I2S3
|
||||
i2s3: i2s@20140000 {
|
||||
compatible = "intel,keembay-i2s";
|
||||
#sound-dai-cells = <0>;
|
||||
reg = <0x20140000 0x200>, /* I2S registers */
|
||||
<0x202a00a4 0x4>; /* I2S gen configuration */
|
||||
reg-names = "i2s-regs", "i2s_gen_cfg";
|
||||
interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-names = "osc", "apb_clk";
|
||||
clocks = <&scmi_clk KEEM_BAY_PSS_AUX_I2S3>, <&scmi_clk KEEM_BAY_PSS_I2S3>;
|
||||
};
|
|
@ -1,9 +1,10 @@
|
|||
Maxim MAX98357A audio DAC
|
||||
Maxim MAX98357A/MAX98360A audio DAC
|
||||
|
||||
This node models the Maxim MAX98357A DAC.
|
||||
This node models the Maxim MAX98357A/MAX98360A DAC.
|
||||
|
||||
Required properties:
|
||||
- compatible : "maxim,max98357a"
|
||||
- compatible : "maxim,max98357a" for MAX98357A.
|
||||
"maxim,max98360a" for MAX98360A.
|
||||
|
||||
Optional properties:
|
||||
- sdmode-gpios : GPIO specifier for the chip's SD_MODE pin.
|
||||
|
@ -20,3 +21,8 @@ max98357a {
|
|||
compatible = "maxim,max98357a";
|
||||
sdmode-gpios = <&qcom_pinmux 25 0>;
|
||||
};
|
||||
|
||||
max98360a {
|
||||
compatible = "maxim,max98360a";
|
||||
sdmode-gpios = <&qcom_pinmux 25 0>;
|
||||
};
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/maxim,max98390.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Maxim Integrated MAX98390 Speaker Amplifier with Integrated Dynamic Speaker Management
|
||||
|
||||
maintainers:
|
||||
- Steve Lee <steves.lee@maximintegrated.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: maxim,max98390
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
description: I2C address of the device.
|
||||
|
||||
maxim,temperature_calib:
|
||||
allOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: The calculated temperature data was measured while doing the calibration.
|
||||
minimum: 0
|
||||
maximum: 65535
|
||||
|
||||
maxim,r0_calib:
|
||||
allOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: This is r0 calibration data which was measured in factory mode.
|
||||
minimum: 1
|
||||
maximum: 8388607
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
max98390: amplifier@38 {
|
||||
compatible = "maxim,max98390";
|
||||
reg = <0x38>;
|
||||
maxim,temperature_calib = <1024>;
|
||||
maxim,r0_calib = <100232>;
|
||||
};
|
||||
};
|
|
@ -10,9 +10,15 @@ Required properties:
|
|||
- compatible : "mediatek,mt6358-sound".
|
||||
- Avdd-supply : power source of AVDD
|
||||
|
||||
Optional properties:
|
||||
- mediatek,dmic-mode : Indicates how many data pins are used to transmit two
|
||||
channels of PDM signal. 0 means two wires, 1 means one wire. Default
|
||||
value is 0.
|
||||
|
||||
Example:
|
||||
|
||||
mt6358_snd {
|
||||
compatible = "mediatek,mt6358-sound";
|
||||
Avdd-supply = <&mt6358_vaud28_reg>;
|
||||
mediatek,dmic-mode = <0>;
|
||||
};
|
||||
|
|
|
@ -1,15 +1,20 @@
|
|||
MT8183 with MT6358, DA7219 and MAX98357 CODECS
|
||||
MT8183 with MT6358, DA7219, MAX98357, and RT1015 CODECS
|
||||
|
||||
Required properties:
|
||||
- compatible : "mediatek,mt8183_da7219_max98357"
|
||||
- compatible : "mediatek,mt8183_da7219_max98357" for MAX98357A codec
|
||||
"mediatek,mt8183_da7219_rt1015" for RT1015 codec
|
||||
- mediatek,headset-codec: the phandles of da7219 codecs
|
||||
- mediatek,platform: the phandle of MT8183 ASoC platform
|
||||
|
||||
Optional properties:
|
||||
- mediatek,hdmi-codec: the phandles of HDMI codec
|
||||
|
||||
Example:
|
||||
|
||||
sound {
|
||||
compatible = "mediatek,mt8183_da7219_max98357";
|
||||
mediatek,headset-codec = <&da7219>;
|
||||
mediatek,hdmi-codec = <&it6505dptx>;
|
||||
mediatek,platform = <&afe>;
|
||||
};
|
||||
|
||||
|
|
|
@ -1,13 +1,16 @@
|
|||
MT8183 with MT6358, TS3A227 and MAX98357 CODECS
|
||||
MT8183 with MT6358, TS3A227, MAX98357, and RT1015 CODECS
|
||||
|
||||
Required properties:
|
||||
- compatible : "mediatek,mt8183_mt6358_ts3a227_max98357"
|
||||
- compatible : "mediatek,mt8183_mt6358_ts3a227_max98357" for MAX98357A codec
|
||||
"mediatek,mt8183_mt6358_ts3a227_max98357b" for MAX98357B codec
|
||||
"mediatek,mt8183_mt6358_ts3a227_rt1015" for RT1015 codec
|
||||
- mediatek,platform: the phandle of MT8183 ASoC platform
|
||||
|
||||
Optional properties:
|
||||
- mediatek,headset-codec: the phandles of ts3a227 codecs
|
||||
- mediatek,ec-codec: the phandle of EC codecs.
|
||||
See google,cros-ec-codec.txt for more details.
|
||||
- mediatek,hdmi-codec: the phandles of HDMI codec
|
||||
|
||||
Example:
|
||||
|
||||
|
@ -15,6 +18,7 @@ Example:
|
|||
compatible = "mediatek,mt8183_mt6358_ts3a227_max98357";
|
||||
mediatek,headset-codec = <&ts3a227>;
|
||||
mediatek,ec-codec = <&ec_codec>;
|
||||
mediatek,hdmi-codec = <&it6505dptx>;
|
||||
mediatek,platform = <&afe>;
|
||||
};
|
||||
|
||||
|
|
|
@ -0,0 +1,83 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/nvidia,tegra186-dspk.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Tegra186 DSPK Controller Device Tree Bindings
|
||||
|
||||
description: |
|
||||
The Digital Speaker Controller (DSPK) can be viewed as a Pulse
|
||||
Density Modulation (PDM) transmitter that up-samples the input to
|
||||
the desired sampling rate by interpolation and then converts the
|
||||
over sampled Pulse Code Modulation (PCM) input to the desired 1-bit
|
||||
output via Delta Sigma Modulation (DSM).
|
||||
|
||||
maintainers:
|
||||
- Jon Hunter <jonathanh@nvidia.com>
|
||||
- Sameer Pujar <spujar@nvidia.com>
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
pattern: "^dspk@[0-9a-f]*$"
|
||||
|
||||
compatible:
|
||||
oneOf:
|
||||
- const: nvidia,tegra186-dspk
|
||||
- items:
|
||||
- const: nvidia,tegra194-dspk
|
||||
- const: nvidia,tegra186-dspk
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
const: dspk
|
||||
|
||||
assigned-clocks:
|
||||
maxItems: 1
|
||||
|
||||
assigned-clock-parents:
|
||||
maxItems: 1
|
||||
|
||||
assigned-clock-rates:
|
||||
maxItems: 1
|
||||
|
||||
sound-name-prefix:
|
||||
pattern: "^DSPK[1-9]$"
|
||||
allOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/string
|
||||
description:
|
||||
Used as prefix for sink/source names of the component. Must be a
|
||||
unique string among multiple instances of the same component.
|
||||
The name can be "DSPK1" or "DSPKx", where x depends on the maximum
|
||||
available instances on a Tegra SoC.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- clock-names
|
||||
- assigned-clocks
|
||||
- assigned-clock-parents
|
||||
- sound-name-prefix
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include<dt-bindings/clock/tegra186-clock.h>
|
||||
|
||||
dspk@2905000 {
|
||||
compatible = "nvidia,tegra186-dspk";
|
||||
reg = <0x2905000 0x100>;
|
||||
clocks = <&bpmp TEGRA186_CLK_DSPK1>;
|
||||
clock-names = "dspk";
|
||||
assigned-clocks = <&bpmp TEGRA186_CLK_DSPK1>;
|
||||
assigned-clock-parents = <&bpmp TEGRA186_CLK_PLL_A_OUT0>;
|
||||
assigned-clock-rates = <12288000>;
|
||||
sound-name-prefix = "DSPK1";
|
||||
};
|
||||
|
||||
...
|
|
@ -0,0 +1,111 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/nvidia,tegra210-admaif.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Tegra210 ADMAIF Device Tree Bindings
|
||||
|
||||
description: |
|
||||
ADMAIF is the interface between ADMA and AHUB. Each ADMA channel
|
||||
that sends/receives data to/from AHUB must interface through an
|
||||
ADMAIF channel. ADMA channel sending data to AHUB pairs with ADMAIF
|
||||
Tx channel and ADMA channel receiving data from AHUB pairs with
|
||||
ADMAIF Rx channel.
|
||||
|
||||
maintainers:
|
||||
- Jon Hunter <jonathanh@nvidia.com>
|
||||
- Sameer Pujar <spujar@nvidia.com>
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
pattern: "^admaif@[0-9a-f]*$"
|
||||
|
||||
compatible:
|
||||
oneOf:
|
||||
- enum:
|
||||
- nvidia,tegra210-admaif
|
||||
- nvidia,tegra186-admaif
|
||||
- items:
|
||||
- const: nvidia,tegra194-admaif
|
||||
- const: nvidia,tegra186-admaif
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
dmas: true
|
||||
|
||||
dma-names: true
|
||||
|
||||
if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: nvidia,tegra210-admaif
|
||||
|
||||
then:
|
||||
properties:
|
||||
dmas:
|
||||
description:
|
||||
DMA channel specifiers, equally divided for Tx and Rx.
|
||||
minItems: 1
|
||||
maxItems: 20
|
||||
dma-names:
|
||||
items:
|
||||
pattern: "^[rt]x(10|[1-9])$"
|
||||
description:
|
||||
Should be "rx1", "rx2" ... "rx10" for DMA Rx channel
|
||||
Should be "tx1", "tx2" ... "tx10" for DMA Tx channel
|
||||
minItems: 1
|
||||
maxItems: 20
|
||||
|
||||
else:
|
||||
properties:
|
||||
dmas:
|
||||
description:
|
||||
DMA channel specifiers, equally divided for Tx and Rx.
|
||||
minItems: 1
|
||||
maxItems: 40
|
||||
dma-names:
|
||||
items:
|
||||
pattern: "^[rt]x(1[0-9]|[1-9]|20)$"
|
||||
description:
|
||||
Should be "rx1", "rx2" ... "rx20" for DMA Rx channel
|
||||
Should be "tx1", "tx2" ... "tx20" for DMA Tx channel
|
||||
minItems: 1
|
||||
maxItems: 40
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- dmas
|
||||
- dma-names
|
||||
|
||||
examples:
|
||||
- |
|
||||
admaif@702d0000 {
|
||||
compatible = "nvidia,tegra210-admaif";
|
||||
reg = <0x702d0000 0x800>;
|
||||
dmas = <&adma 1>, <&adma 1>,
|
||||
<&adma 2>, <&adma 2>,
|
||||
<&adma 3>, <&adma 3>,
|
||||
<&adma 4>, <&adma 4>,
|
||||
<&adma 5>, <&adma 5>,
|
||||
<&adma 6>, <&adma 6>,
|
||||
<&adma 7>, <&adma 7>,
|
||||
<&adma 8>, <&adma 8>,
|
||||
<&adma 9>, <&adma 9>,
|
||||
<&adma 10>, <&adma 10>;
|
||||
dma-names = "rx1", "tx1",
|
||||
"rx2", "tx2",
|
||||
"rx3", "tx3",
|
||||
"rx4", "tx4",
|
||||
"rx5", "tx5",
|
||||
"rx6", "tx6",
|
||||
"rx7", "tx7",
|
||||
"rx8", "tx8",
|
||||
"rx9", "tx9",
|
||||
"rx10", "tx10";
|
||||
};
|
||||
|
||||
...
|
|
@ -0,0 +1,136 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/nvidia,tegra210-ahub.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Tegra210 AHUB Device Tree Bindings
|
||||
|
||||
description: |
|
||||
The Audio Hub (AHUB) comprises a collection of hardware accelerators
|
||||
for audio pre-processing, post-processing and a programmable full
|
||||
crossbar for routing audio data across these accelerators. It has
|
||||
external interfaces such as I2S, DMIC, DSPK. It interfaces with ADMA
|
||||
engine through ADMAIF.
|
||||
|
||||
maintainers:
|
||||
- Jon Hunter <jonathanh@nvidia.com>
|
||||
- Sameer Pujar <spujar@nvidia.com>
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
pattern: "^ahub@[0-9a-f]*$"
|
||||
|
||||
compatible:
|
||||
oneOf:
|
||||
- enum:
|
||||
- nvidia,tegra210-ahub
|
||||
- nvidia,tegra186-ahub
|
||||
- items:
|
||||
- const: nvidia,tegra194-ahub
|
||||
- const: nvidia,tegra186-ahub
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
const: ahub
|
||||
|
||||
assigned-clocks:
|
||||
maxItems: 1
|
||||
|
||||
assigned-clock-parents:
|
||||
maxItems: 1
|
||||
|
||||
assigned-clock-rates:
|
||||
maxItems: 1
|
||||
|
||||
"#address-cells":
|
||||
const: 1
|
||||
|
||||
"#size-cells":
|
||||
const: 1
|
||||
|
||||
ranges: true
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- clock-names
|
||||
- assigned-clocks
|
||||
- assigned-clock-parents
|
||||
- "#address-cells"
|
||||
- "#size-cells"
|
||||
- ranges
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include<dt-bindings/clock/tegra210-car.h>
|
||||
|
||||
ahub@702d0800 {
|
||||
compatible = "nvidia,tegra210-ahub";
|
||||
reg = <0x702d0800 0x800>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_D_AUDIO>;
|
||||
clock-names = "ahub";
|
||||
assigned-clocks = <&tegra_car TEGRA210_CLK_D_AUDIO>;
|
||||
assigned-clock-parents = <&tegra_car TEGRA210_CLK_PLL_A_OUT0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0x702d0000 0x702d0000 0x0000e400>;
|
||||
|
||||
// All AHUB child nodes below
|
||||
admaif@702d0000 {
|
||||
compatible = "nvidia,tegra210-admaif";
|
||||
reg = <0x702d0000 0x800>;
|
||||
dmas = <&adma 1>, <&adma 1>,
|
||||
<&adma 2>, <&adma 2>,
|
||||
<&adma 3>, <&adma 3>,
|
||||
<&adma 4>, <&adma 4>,
|
||||
<&adma 5>, <&adma 5>,
|
||||
<&adma 6>, <&adma 6>,
|
||||
<&adma 7>, <&adma 7>,
|
||||
<&adma 8>, <&adma 8>,
|
||||
<&adma 9>, <&adma 9>,
|
||||
<&adma 10>, <&adma 10>;
|
||||
dma-names = "rx1", "tx1",
|
||||
"rx2", "tx2",
|
||||
"rx3", "tx3",
|
||||
"rx4", "tx4",
|
||||
"rx5", "tx5",
|
||||
"rx6", "tx6",
|
||||
"rx7", "tx7",
|
||||
"rx8", "tx8",
|
||||
"rx9", "tx9",
|
||||
"rx10", "tx10";
|
||||
};
|
||||
|
||||
i2s@702d1000 {
|
||||
compatible = "nvidia,tegra210-i2s";
|
||||
reg = <0x702d1000 0x100>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_I2S0>;
|
||||
clock-names = "i2s";
|
||||
assigned-clocks = <&tegra_car TEGRA210_CLK_I2S0>;
|
||||
assigned-clock-parents = <&tegra_car TEGRA210_CLK_PLL_A_OUT0>;
|
||||
assigned-clock-rates = <1536000>;
|
||||
sound-name-prefix = "I2S1";
|
||||
};
|
||||
|
||||
dmic@702d4000 {
|
||||
compatible = "nvidia,tegra210-dmic";
|
||||
reg = <0x702d4000 0x100>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_DMIC1>;
|
||||
clock-names = "dmic";
|
||||
assigned-clocks = <&tegra_car TEGRA210_CLK_DMIC1>;
|
||||
assigned-clock-parents = <&tegra_car TEGRA210_CLK_PLL_A_OUT0>;
|
||||
assigned-clock-rates = <3072000>;
|
||||
sound-name-prefix = "DMIC1";
|
||||
};
|
||||
|
||||
// More child nodes to follow
|
||||
};
|
||||
|
||||
...
|
|
@ -0,0 +1,83 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/nvidia,tegra210-dmic.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Tegra210 DMIC Controller Device Tree Bindings
|
||||
|
||||
description: |
|
||||
The Digital MIC (DMIC) Controller is used to interface with Pulse
|
||||
Density Modulation (PDM) input devices. It converts PDM signals to
|
||||
Pulse Coded Modulation (PCM) signals. DMIC can be viewed as a PDM
|
||||
receiver.
|
||||
|
||||
maintainers:
|
||||
- Jon Hunter <jonathanh@nvidia.com>
|
||||
- Sameer Pujar <spujar@nvidia.com>
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
pattern: "^dmic@[0-9a-f]*$"
|
||||
|
||||
compatible:
|
||||
oneOf:
|
||||
- const: nvidia,tegra210-dmic
|
||||
- items:
|
||||
- enum:
|
||||
- nvidia,tegra194-dmic
|
||||
- nvidia,tegra186-dmic
|
||||
- const: nvidia,tegra210-dmic
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
const: dmic
|
||||
|
||||
assigned-clocks:
|
||||
maxItems: 1
|
||||
|
||||
assigned-clock-parents:
|
||||
maxItems: 1
|
||||
|
||||
assigned-clock-rates:
|
||||
maxItems: 1
|
||||
|
||||
sound-name-prefix:
|
||||
pattern: "^DMIC[1-9]$"
|
||||
allOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/string
|
||||
description:
|
||||
used as prefix for sink/source names of the component. Must be a
|
||||
unique string among multiple instances of the same component.
|
||||
The name can be "DMIC1" or "DMIC2" ... "DMICx", where x depends
|
||||
on the maximum available instances on a Tegra SoC.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- clock-names
|
||||
- assigned-clocks
|
||||
- assigned-clock-parents
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include<dt-bindings/clock/tegra210-car.h>
|
||||
|
||||
dmic@702d4000 {
|
||||
compatible = "nvidia,tegra210-dmic";
|
||||
reg = <0x702d4000 0x100>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_DMIC1>;
|
||||
clock-names = "dmic";
|
||||
assigned-clocks = <&tegra_car TEGRA210_CLK_DMIC1>;
|
||||
assigned-clock-parents = <&tegra_car TEGRA210_CLK_PLL_A_OUT0>;
|
||||
assigned-clock-rates = <3072000>;
|
||||
sound-name-prefix = "DMIC1";
|
||||
};
|
||||
|
||||
...
|
|
@ -0,0 +1,101 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/nvidia,tegra210-i2s.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Tegra210 I2S Controller Device Tree Bindings
|
||||
|
||||
description: |
|
||||
The Inter-IC Sound (I2S) controller implements full-duplex,
|
||||
bi-directional and single direction point-to-point serial
|
||||
interfaces. It can interface with I2S compatible devices.
|
||||
I2S controller can operate both in master and slave mode.
|
||||
|
||||
maintainers:
|
||||
- Jon Hunter <jonathanh@nvidia.com>
|
||||
- Sameer Pujar <spujar@nvidia.com>
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
pattern: "^i2s@[0-9a-f]*$"
|
||||
|
||||
compatible:
|
||||
oneOf:
|
||||
- const: nvidia,tegra210-i2s
|
||||
- items:
|
||||
- enum:
|
||||
- nvidia,tegra194-i2s
|
||||
- nvidia,tegra186-i2s
|
||||
- const: nvidia,tegra210-i2s
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
items:
|
||||
- description: I2S bit clock
|
||||
- description:
|
||||
Sync input clock, which can act as clock source to other I/O
|
||||
modules in AHUB. The Tegra I2S driver sets this clock rate as
|
||||
per bit clock rate. I/O module which wants to use this clock
|
||||
as source, can mention this clock as parent in the DT bindings.
|
||||
This is an optional clock entry, since it is only required when
|
||||
some other I/O wants to reference from a particular I2Sx
|
||||
instance.
|
||||
|
||||
clock-names:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
items:
|
||||
- const: i2s
|
||||
- const: sync_input
|
||||
|
||||
assigned-clocks:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
|
||||
assigned-clock-parents:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
|
||||
assigned-clock-rates:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
|
||||
sound-name-prefix:
|
||||
pattern: "^I2S[1-9]$"
|
||||
allOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/string
|
||||
description:
|
||||
Used as prefix for sink/source names of the component. Must be a
|
||||
unique string among multiple instances of the same component.
|
||||
The name can be "I2S1" or "I2S2" ... "I2Sx", where x depends
|
||||
on the maximum available instances on a Tegra SoC.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- clock-names
|
||||
- assigned-clocks
|
||||
- assigned-clock-parents
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include<dt-bindings/clock/tegra210-car.h>
|
||||
|
||||
i2s@702d1000 {
|
||||
compatible = "nvidia,tegra210-i2s";
|
||||
reg = <0x702d1000 0x100>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_I2S0>;
|
||||
clock-names = "i2s";
|
||||
assigned-clocks = <&tegra_car TEGRA210_CLK_I2S0>;
|
||||
assigned-clock-parents = <&tegra_car TEGRA210_CLK_PLL_A_OUT0>;
|
||||
assigned-clock-rates = <1536000>;
|
||||
sound-name-prefix = "I2S1";
|
||||
};
|
||||
|
||||
...
|
|
@ -39,9 +39,9 @@ configuration of each dai. Must contain the following properties.
|
|||
Usage: Required for Compress offload dais
|
||||
Value type: <u32>
|
||||
Definition: Specifies the direction of the dai stream
|
||||
0 for both tx and rx
|
||||
1 for only tx (Capture/Encode)
|
||||
2 for only rx (Playback/Decode)
|
||||
Q6ASM_DAI_TX_RX (0) for both tx and rx
|
||||
Q6ASM_DAI_TX (1) for only tx (Capture/Encode)
|
||||
Q6ASM_DAI_RX (2) for only rx (Playback/Decode)
|
||||
|
||||
- is-compress-dai:
|
||||
Usage: Required for Compress offload dais
|
||||
|
@ -50,6 +50,7 @@ configuration of each dai. Must contain the following properties.
|
|||
|
||||
|
||||
= EXAMPLE
|
||||
#include <dt-bindings/sound/qcom,q6asm.h>
|
||||
|
||||
apr-service@7 {
|
||||
compatible = "qcom,q6asm";
|
||||
|
@ -62,7 +63,7 @@ apr-service@7 {
|
|||
|
||||
dai@0 {
|
||||
reg = <0>;
|
||||
direction = <2>;
|
||||
direction = <Q6ASM_DAI_RX>;
|
||||
is-compress-dai;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -43,30 +43,19 @@ properties:
|
|||
'#sound-dai-cells':
|
||||
const: 1
|
||||
|
||||
fsia,spdif-connection:
|
||||
patternProperties:
|
||||
"^fsi(a|b),spdif-connection$":
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
description: FSI is connected by S/PDIF
|
||||
|
||||
fsia,stream-mode-support:
|
||||
"^fsi(a|b),stream-mode-support$":
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
description: FSI supports 16bit stream mode
|
||||
|
||||
fsia,use-internal-clock:
|
||||
"^fsi(a|b),use-internal-clock$":
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
description: FSI uses internal clock when master mode
|
||||
|
||||
fsib,spdif-connection:
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
description: same as fsia
|
||||
|
||||
fsib,stream-mode-support:
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
description: same as fsia
|
||||
|
||||
fsib,use-internal-clock:
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
description: same as fsia
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
|
|
@ -271,6 +271,7 @@ Required properties:
|
|||
- "renesas,rcar_sound-r8a774a1" (RZ/G2M)
|
||||
- "renesas,rcar_sound-r8a774b1" (RZ/G2N)
|
||||
- "renesas,rcar_sound-r8a774c0" (RZ/G2E)
|
||||
- "renesas,rcar_sound-r8a774e1" (RZ/G2H)
|
||||
- "renesas,rcar_sound-r8a7778" (R-Car M1A)
|
||||
- "renesas,rcar_sound-r8a7779" (R-Car H1)
|
||||
- "renesas,rcar_sound-r8a7790" (R-Car H2)
|
||||
|
|
|
@ -1,28 +0,0 @@
|
|||
* Rockchip Rk3328 internal codec
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: "rockchip,rk3328-codec"
|
||||
- reg: physical base address of the controller and length of memory mapped
|
||||
region.
|
||||
- rockchip,grf: the phandle of the syscon node for GRF register.
|
||||
- clocks: a list of phandle + clock-specifer pairs, one for each entry in clock-names.
|
||||
- clock-names: should be "pclk".
|
||||
- spk-depop-time-ms: speak depop time msec.
|
||||
|
||||
Optional properties:
|
||||
|
||||
- mute-gpios: GPIO specifier for external line driver control (typically the
|
||||
dedicated GPIO_MUTE pin)
|
||||
|
||||
Example for rk3328 internal codec:
|
||||
|
||||
codec: codec@ff410000 {
|
||||
compatible = "rockchip,rk3328-codec";
|
||||
reg = <0x0 0xff410000 0x0 0x1000>;
|
||||
rockchip,grf = <&grf>;
|
||||
clocks = <&cru PCLK_ACODEC>;
|
||||
clock-names = "pclk";
|
||||
mute-gpios = <&grf_gpio 0 GPIO_ACTIVE_LOW>;
|
||||
spk-depop-time-ms = 100;
|
||||
};
|
|
@ -0,0 +1,69 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/rockchip,rk3328-codec.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Rockchip rk3328 internal codec
|
||||
|
||||
maintainers:
|
||||
- Heiko Stuebner <heiko@sntech.de>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: rockchip,rk3328-codec
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: clock for audio codec
|
||||
- description: clock for I2S master clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: pclk
|
||||
- const: mclk
|
||||
|
||||
rockchip,grf:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
description:
|
||||
The phandle of the syscon node for the GRF register.
|
||||
|
||||
spk-depop-time-ms:
|
||||
default: 200
|
||||
description:
|
||||
Speaker depop time in msec.
|
||||
|
||||
mute-gpios:
|
||||
maxItems: 1
|
||||
description:
|
||||
GPIO specifier for external line driver control (typically the
|
||||
dedicated GPIO_MUTE pin)
|
||||
|
||||
"#sound-dai-cells":
|
||||
const: 0
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- clock-names
|
||||
- rockchip,grf
|
||||
- "#sound-dai-cells"
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/clock/rk3328-cru.h>
|
||||
codec: codec@ff410000 {
|
||||
compatible = "rockchip,rk3328-codec";
|
||||
reg = <0xff410000 0x1000>;
|
||||
clocks = <&cru PCLK_ACODECPHY>, <&cru SCLK_I2S1>;
|
||||
clock-names = "pclk", "mclk";
|
||||
rockchip,grf = <&grf>;
|
||||
mute-gpios = <&grf_gpio 0 GPIO_ACTIVE_LOW>;
|
||||
spk-depop-time-ms = <100>;
|
||||
#sound-dai-cells = <0>;
|
||||
};
|
|
@ -1,29 +0,0 @@
|
|||
ROHM BD28623MUV Class D speaker amplifier for digital input
|
||||
|
||||
This codec does not have any control buses such as I2C, it detect format and
|
||||
rate of I2S signal automatically. It has two signals that can be connected
|
||||
to GPIOs: reset and mute.
|
||||
|
||||
Required properties:
|
||||
- compatible : should be "rohm,bd28623"
|
||||
- #sound-dai-cells: should be 0.
|
||||
- VCCA-supply : regulator phandle for the VCCA supply
|
||||
- VCCP1-supply : regulator phandle for the VCCP1 supply
|
||||
- VCCP2-supply : regulator phandle for the VCCP2 supply
|
||||
|
||||
Optional properties:
|
||||
- reset-gpios : GPIO specifier for the active low reset line
|
||||
- mute-gpios : GPIO specifier for the active low mute line
|
||||
|
||||
Example:
|
||||
|
||||
codec {
|
||||
compatible = "rohm,bd28623";
|
||||
#sound-dai-cells = <0>;
|
||||
|
||||
VCCA-supply = <&vcc_reg>;
|
||||
VCCP1-supply = <&vcc_reg>;
|
||||
VCCP2-supply = <&vcc_reg>;
|
||||
reset-gpios = <&gpio 0 GPIO_ACTIVE_LOW>;
|
||||
mute-gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
|
||||
};
|
|
@ -0,0 +1,67 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/rohm,bd28623.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: ROHM BD28623MUV Class D speaker amplifier for digital input
|
||||
|
||||
description:
|
||||
This codec does not have any control buses such as I2C, it detect
|
||||
format and rate of I2S signal automatically. It has two signals
|
||||
that can be connected to GPIOs reset and mute.
|
||||
|
||||
maintainers:
|
||||
- Katsuhiro Suzuki <katsuhiro@katsuster.net>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: rohm,bd28623
|
||||
|
||||
"#sound-dai-cells":
|
||||
const: 0
|
||||
|
||||
VCCA-supply:
|
||||
description:
|
||||
regulator phandle for the VCCA (for analog) power supply
|
||||
|
||||
VCCP1-supply:
|
||||
description:
|
||||
regulator phandle for the VCCP1 (for ch1) power supply
|
||||
|
||||
VCCP2-supply:
|
||||
description:
|
||||
regulator phandle for the VCCP2 (for ch2) power supply
|
||||
|
||||
reset-gpios:
|
||||
maxItems: 1
|
||||
description:
|
||||
GPIO specifier for the active low reset line
|
||||
|
||||
mute-gpios:
|
||||
maxItems: 1
|
||||
description:
|
||||
GPIO specifier for the active low mute line
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- VCCA-supply
|
||||
- VCCP1-supply
|
||||
- VCCP2-supply
|
||||
- "#sound-dai-cells"
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
codec {
|
||||
compatible = "rohm,bd28623";
|
||||
#sound-dai-cells = <0>;
|
||||
|
||||
VCCA-supply = <&vcc_reg>;
|
||||
VCCP1-supply = <&vcc_reg>;
|
||||
VCCP2-supply = <&vcc_reg>;
|
||||
reset-gpios = <&gpio 0 GPIO_ACTIVE_LOW>;
|
||||
mute-gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
|
||||
};
|
|
@ -0,0 +1,147 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/samsung,aries-wm8994.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Samsung Aries audio complex with WM8994 codec
|
||||
|
||||
maintainers:
|
||||
- Jonathan Bakker <xc-racer2@live.ca>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- const: samsung,aries-wm8994
|
||||
description: With FM radio and modem master
|
||||
|
||||
- const: samsung,fascinate4g-wm8994
|
||||
description: Without FM radio and modem slave
|
||||
|
||||
model:
|
||||
$ref: /schemas/types.yaml#/definitions/string
|
||||
description: The user-visible name of this sound complex.
|
||||
|
||||
cpu:
|
||||
type: object
|
||||
properties:
|
||||
sound-dai:
|
||||
minItems: 2
|
||||
maxItems: 2
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
description: |
|
||||
phandles to the I2S controller and bluetooth codec,
|
||||
in that order
|
||||
|
||||
codec:
|
||||
type: object
|
||||
properties:
|
||||
sound-dai:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
description: phandle to the WM8994 CODEC
|
||||
|
||||
samsung,audio-routing:
|
||||
$ref: /schemas/types.yaml#/definitions/non-unique-string-array
|
||||
description: |
|
||||
List of the connections between audio
|
||||
components; each entry is a pair of strings, the first being the
|
||||
connection's sink, the second being the connection's source;
|
||||
valid names for sources and sinks are the WM8994's pins (as
|
||||
documented in its binding), and the jacks on the board -
|
||||
For samsung,aries-wm8994: HP, SPK, RCV, LINE, Main Mic, Headset Mic,
|
||||
or FM In
|
||||
For samsung,fascinate4g-wm8994: HP, SPK, RCV, LINE, Main Mic,
|
||||
or HeadsetMic
|
||||
|
||||
extcon:
|
||||
description: Extcon phandle for dock detection
|
||||
|
||||
main-micbias-supply:
|
||||
description: Supply for the micbias on the main mic
|
||||
|
||||
headset-micbias-supply:
|
||||
description: Supply for the micbias on the headset mic
|
||||
|
||||
earpath-sel-gpios:
|
||||
description: GPIO for switching between tv-out and mic paths
|
||||
|
||||
headset-detect-gpios:
|
||||
description: GPIO for detection of headset insertion
|
||||
|
||||
headset-key-gpios:
|
||||
description: GPIO for detection of headset key press
|
||||
|
||||
io-channels:
|
||||
maxItems: 1
|
||||
description: IO channel to read micbias voltage for headset detection
|
||||
|
||||
io-channel-names:
|
||||
const: headset-detect
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- model
|
||||
- cpu
|
||||
- codec
|
||||
- samsung,audio-routing
|
||||
- extcon
|
||||
- main-micbias-supply
|
||||
- headset-micbias-supply
|
||||
- earpath-sel-gpios
|
||||
- headset-detect-gpios
|
||||
- headset-key-gpios
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
sound {
|
||||
compatible = "samsung,fascinate4g-wm8994";
|
||||
|
||||
model = "Fascinate4G";
|
||||
|
||||
extcon = <&fsa9480>;
|
||||
|
||||
main-micbias-supply = <&main_micbias_reg>;
|
||||
headset-micbias-supply = <&headset_micbias_reg>;
|
||||
|
||||
earpath-sel-gpios = <&gpj2 6 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
io-channels = <&adc 3>;
|
||||
io-channel-names = "headset-detect";
|
||||
headset-detect-gpios = <&gph0 6 GPIO_ACTIVE_HIGH>;
|
||||
headset-key-gpios = <&gph3 6 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
samsung,audio-routing =
|
||||
"HP", "HPOUT1L",
|
||||
"HP", "HPOUT1R",
|
||||
|
||||
"SPK", "SPKOUTLN",
|
||||
"SPK", "SPKOUTLP",
|
||||
|
||||
"RCV", "HPOUT2N",
|
||||
"RCV", "HPOUT2P",
|
||||
|
||||
"LINE", "LINEOUT2N",
|
||||
"LINE", "LINEOUT2P",
|
||||
|
||||
"IN1LP", "Main Mic",
|
||||
"IN1LN", "Main Mic",
|
||||
|
||||
"IN1RP", "Headset Mic",
|
||||
"IN1RN", "Headset Mic";
|
||||
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&headset_det &earpath_sel>;
|
||||
|
||||
cpu {
|
||||
sound-dai = <&i2s0>, <&bt_codec>;
|
||||
};
|
||||
|
||||
codec {
|
||||
sound-dai = <&wm8994>;
|
||||
};
|
||||
};
|
||||
|
|
@ -0,0 +1,108 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/samsung,midas-audio.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Samsung Midas audio complex with WM1811 codec
|
||||
|
||||
maintainers:
|
||||
- Sylwester Nawrocki <s.nawrocki@samsung.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: samsung,midas-audio
|
||||
|
||||
model:
|
||||
$ref: /schemas/types.yaml#/definitions/string
|
||||
description: The user-visible name of this sound complex.
|
||||
|
||||
cpu:
|
||||
type: object
|
||||
properties:
|
||||
sound-dai:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
description: phandle to the I2S controller
|
||||
required:
|
||||
- sound-dai
|
||||
|
||||
codec:
|
||||
type: object
|
||||
properties:
|
||||
sound-dai:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
description: phandle to the WM1811 CODEC
|
||||
required:
|
||||
- sound-dai
|
||||
|
||||
samsung,audio-routing:
|
||||
$ref: /schemas/types.yaml#/definitions/non-unique-string-array
|
||||
description: |
|
||||
List of the connections between audio components; each entry is
|
||||
a pair of strings, the first being the connection's sink, the second
|
||||
being the connection's source; valid names for sources and sinks are
|
||||
the WM1811's pins (as documented in its binding), and the jacks
|
||||
on the board: HP, SPK, Main Mic, Sub Mic, Headset Mic.
|
||||
|
||||
mic-bias-supply:
|
||||
description: Supply for the micbias on the Main microphone
|
||||
|
||||
submic-bias-supply:
|
||||
description: Supply for the micbias on the Sub microphone
|
||||
|
||||
fm-sel-gpios:
|
||||
description: GPIO pin for FM selection
|
||||
|
||||
lineout-sel-gpios:
|
||||
description: GPIO pin for line out selection
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- model
|
||||
- cpu
|
||||
- codec
|
||||
- samsung,audio-routing
|
||||
- mic-bias-supply
|
||||
- submic-bias-supply
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
sound {
|
||||
compatible = "samsung,midas-audio";
|
||||
model = "Midas";
|
||||
|
||||
fm-sel-gpios = <&gpaa0 3 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
mic-bias-supply = <&mic_bias_reg>;
|
||||
submic-bias-supply = <&submic_bias_reg>;
|
||||
|
||||
samsung,audio-routing =
|
||||
"HP", "HPOUT1L",
|
||||
"HP", "HPOUT1R",
|
||||
|
||||
"SPK", "SPKOUTLN",
|
||||
"SPK", "SPKOUTLP",
|
||||
"SPK", "SPKOUTRN",
|
||||
"SPK", "SPKOUTRP",
|
||||
|
||||
"RCV", "HPOUT2N",
|
||||
"RCV", "HPOUT2P",
|
||||
|
||||
"IN1LP", "Main Mic",
|
||||
"IN1LN", "Main Mic",
|
||||
"IN1RP", "Sub Mic",
|
||||
"IN1LP", "Sub Mic";
|
||||
|
||||
cpu {
|
||||
sound-dai = <&i2s0>;
|
||||
};
|
||||
|
||||
codec {
|
||||
sound-dai = <&wm1811>;
|
||||
};
|
||||
|
||||
};
|
|
@ -1,60 +0,0 @@
|
|||
* Freescale SGTL5000 Stereo Codec
|
||||
|
||||
Required properties:
|
||||
- compatible : "fsl,sgtl5000".
|
||||
|
||||
- reg : the I2C address of the device
|
||||
|
||||
- #sound-dai-cells: must be equal to 0
|
||||
|
||||
- clocks : the clock provider of SYS_MCLK
|
||||
|
||||
- VDDA-supply : the regulator provider of VDDA
|
||||
|
||||
- VDDIO-supply: the regulator provider of VDDIO
|
||||
|
||||
Optional properties:
|
||||
|
||||
- VDDD-supply : the regulator provider of VDDD
|
||||
|
||||
- micbias-resistor-k-ohms : the bias resistor to be used in kOhms
|
||||
The resistor can take values of 2k, 4k or 8k.
|
||||
If set to 0 it will be off.
|
||||
If this node is not mentioned or if the value is unknown, then
|
||||
micbias resistor is set to 4K.
|
||||
|
||||
- micbias-voltage-m-volts : 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 or the value is unknown, then
|
||||
the value is set to 1.25V.
|
||||
|
||||
- lrclk-strength: the LRCLK pad strength. Possible values are:
|
||||
0, 1, 2 and 3 as per the table below:
|
||||
|
||||
VDDIO 1.8V 2.5V 3.3V
|
||||
0 = Disable
|
||||
1 = 1.66 mA 2.87 mA 4.02 mA
|
||||
2 = 3.33 mA 5.74 mA 8.03 mA
|
||||
3 = 4.99 mA 8.61 mA 12.05 mA
|
||||
|
||||
- sclk-strength: the SCLK pad strength. Possible values are:
|
||||
0, 1, 2 and 3 as per the table below:
|
||||
|
||||
VDDIO 1.8V 2.5V 3.3V
|
||||
0 = Disable
|
||||
1 = 1.66 mA 2.87 mA 4.02 mA
|
||||
2 = 3.33 mA 5.74 mA 8.03 mA
|
||||
3 = 4.99 mA 8.61 mA 12.05 mA
|
||||
|
||||
Example:
|
||||
|
||||
sgtl5000: codec@a {
|
||||
compatible = "fsl,sgtl5000";
|
||||
reg = <0x0a>;
|
||||
#sound-dai-cells = <0>;
|
||||
clocks = <&clks 150>;
|
||||
micbias-resistor-k-ohms = <2>;
|
||||
micbias-voltage-m-volts = <2250>;
|
||||
VDDA-supply = <®_3p3v>;
|
||||
VDDIO-supply = <®_3p3v>;
|
||||
};
|
|
@ -0,0 +1,103 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/sgtl5000.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Freescale SGTL5000 Stereo Codec
|
||||
|
||||
maintainers:
|
||||
- Fabio Estevam <festevam@gmail.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: fsl,sgtl5000
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
"#sound-dai-cells":
|
||||
const: 0
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: the clock provider of SYS_MCLK
|
||||
|
||||
VDDA-supply:
|
||||
description: the regulator provider of VDDA
|
||||
|
||||
VDDIO-supply:
|
||||
description: the regulator provider of VDDIO
|
||||
|
||||
VDDD-supply:
|
||||
description: the regulator provider of VDDD
|
||||
|
||||
micbias-resistor-k-ohms:
|
||||
description: The bias resistor to be used in kOhms. The resistor can take
|
||||
values of 2k, 4k or 8k. If set to 0 it will be off. If this node is not
|
||||
mentioned or if the value is unknown, then micbias resistor is set to
|
||||
4k.
|
||||
$ref: "/schemas/types.yaml#/definitions/uint32"
|
||||
enum: [ 0, 2, 4, 8 ]
|
||||
|
||||
micbias-voltage-m-volts:
|
||||
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
|
||||
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 ]
|
||||
|
||||
lrclk-strength:
|
||||
description: |
|
||||
The LRCLK pad strength. Possible values are: 0, 1, 2 and 3 as per the
|
||||
table below:
|
||||
|
||||
VDDIO 1.8V 2.5V 3.3V
|
||||
0 = Disable
|
||||
1 = 1.66 mA 2.87 mA 4.02 mA
|
||||
2 = 3.33 mA 5.74 mA 8.03 mA
|
||||
3 = 4.99 mA 8.61 mA 12.05 mA
|
||||
$ref: "/schemas/types.yaml#/definitions/uint32"
|
||||
enum: [ 0, 1, 2, 3 ]
|
||||
|
||||
sclk-strength:
|
||||
description: |
|
||||
The SCLK pad strength. Possible values are: 0, 1, 2 and 3 as per the
|
||||
table below:
|
||||
|
||||
VDDIO 1.8V 2.5V 3.3V
|
||||
0 = Disable
|
||||
1 = 1.66 mA 2.87 mA 4.02 mA
|
||||
2 = 3.33 mA 5.74 mA 8.03 mA
|
||||
3 = 4.99 mA 8.61 mA 12.05 mA
|
||||
$ref: "/schemas/types.yaml#/definitions/uint32"
|
||||
enum: [ 0, 1, 2, 3 ]
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- "#sound-dai-cells"
|
||||
- clocks
|
||||
- VDDA-supply
|
||||
- VDDIO-supply
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
codec@a {
|
||||
compatible = "fsl,sgtl5000";
|
||||
reg = <0x0a>;
|
||||
#sound-dai-cells = <0>;
|
||||
clocks = <&clks 150>;
|
||||
micbias-resistor-k-ohms = <2>;
|
||||
micbias-voltage-m-volts = <2250>;
|
||||
VDDA-supply = <®_3p3v>;
|
||||
VDDIO-supply = <®_3p3v>;
|
||||
};
|
||||
};
|
||||
...
|
|
@ -0,0 +1,81 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/socionext,uniphier-aio.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: UniPhier AIO audio system
|
||||
|
||||
maintainers:
|
||||
- <alsa-devel@alsa-project.org>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- socionext,uniphier-ld11-aio
|
||||
- socionext,uniphier-ld20-aio
|
||||
- socionext,uniphier-pxs2-aio
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
const: aio
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
reset-names:
|
||||
const: aio
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
socionext,syscon:
|
||||
description: |
|
||||
Specifies a phandle to soc-glue, which is used for changing mode of S/PDIF
|
||||
signal pin to output from Hi-Z. This property is optional if you use I2S
|
||||
signal pins only.
|
||||
$ref: "/schemas/types.yaml#/definitions/phandle"
|
||||
|
||||
"#sound-dai-cells":
|
||||
const: 1
|
||||
|
||||
patternProperties:
|
||||
"^port@[0-9]$":
|
||||
type: object
|
||||
properties:
|
||||
endpoint: true
|
||||
required:
|
||||
- endpoint
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clock-names
|
||||
- clocks
|
||||
- reset-names
|
||||
- resets
|
||||
- "#sound-dai-cells"
|
||||
|
||||
examples:
|
||||
- |
|
||||
audio@56000000 {
|
||||
compatible = "socionext,uniphier-ld20-aio";
|
||||
reg = <0x56000000 0x80000>;
|
||||
interrupts = <0 144 4>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_aout>;
|
||||
clock-names = "aio";
|
||||
clocks = <&sys_clk 40>;
|
||||
reset-names = "aio";
|
||||
resets = <&sys_rst 40>;
|
||||
#sound-dai-cells = <1>;
|
||||
socionext,syscon = <&soc_glue>;
|
||||
};
|
|
@ -0,0 +1,70 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/socionext,uniphier-evea.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: UniPhier EVEA SoC-internal sound codec
|
||||
|
||||
maintainers:
|
||||
- <alsa-devel@alsa-project.org>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: socionext,uniphier-evea
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: evea
|
||||
- const: exiv
|
||||
|
||||
clocks:
|
||||
minItems: 2
|
||||
maxItems: 2
|
||||
|
||||
reset-names:
|
||||
items:
|
||||
- const: evea
|
||||
- const: exiv
|
||||
- const: adamv
|
||||
|
||||
resets:
|
||||
minItems: 3
|
||||
maxItems: 3
|
||||
|
||||
"#sound-dai-cells":
|
||||
const: 1
|
||||
|
||||
patternProperties:
|
||||
"^port@[0-9]$":
|
||||
type: object
|
||||
properties:
|
||||
endpoint: true
|
||||
required:
|
||||
- endpoint
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clock-names
|
||||
- clocks
|
||||
- reset-names
|
||||
- resets
|
||||
- "#sound-dai-cells"
|
||||
|
||||
examples:
|
||||
- |
|
||||
codec@57900000 {
|
||||
compatible = "socionext,uniphier-evea";
|
||||
reg = <0x57900000 0x1000>;
|
||||
clock-names = "evea", "exiv";
|
||||
clocks = <&sys_clk 41>, <&sys_clk 42>;
|
||||
reset-names = "evea", "exiv", "adamv";
|
||||
resets = <&sys_rst 41>, <&sys_rst 42>, <&adamv_rst 0>;
|
||||
#sound-dai-cells = <1>;
|
||||
};
|
|
@ -33,4 +33,4 @@ tas2552: tas2552@41 {
|
|||
};
|
||||
|
||||
For more product information please see the link below:
|
||||
http://www.ti.com/product/TAS2552
|
||||
https://www.ti.com/product/TAS2552
|
||||
|
|
|
@ -11,12 +11,14 @@ Required properties:
|
|||
- compatible: - Should contain "ti,tas2562", "ti,tas2563".
|
||||
- reg: - The i2c address. Should be 0x4c, 0x4d, 0x4e or 0x4f.
|
||||
- ti,imon-slot-no:- TDM TX current sense time slot.
|
||||
- ti,vmon-slot-no:- TDM TX voltage sense time slot. This slot must always be
|
||||
greater then ti,imon-slot-no.
|
||||
|
||||
Optional properties:
|
||||
- interrupt-parent: phandle to the interrupt controller which provides
|
||||
the interrupt.
|
||||
- interrupts: (GPIO) interrupt to which the chip is connected.
|
||||
- shut-down: GPIO used to control the state of the device.
|
||||
- shut-down-gpio: GPIO used to control the state of the device.
|
||||
|
||||
Examples:
|
||||
tas2562@4c {
|
||||
|
@ -28,7 +30,8 @@ tas2562@4c {
|
|||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <14>;
|
||||
|
||||
shut-down = <&gpio1 15 0>;
|
||||
shut-down-gpio = <&gpio1 15 0>;
|
||||
ti,imon-slot-no = <0>;
|
||||
ti,vmon-slot-no = <1>;
|
||||
};
|
||||
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
# Copyright (C) 2019 Texas Instruments Incorporated
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/sound/tas2562.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
|
||||
title: Texas Instruments TAS2562 Smart PA
|
||||
|
||||
maintainers:
|
||||
- Dan Murphy <dmurphy@ti.com>
|
||||
|
||||
description: |
|
||||
The TAS2562 is a mono, digital input Class-D audio amplifier optimized for
|
||||
efficiently driving high peak power into small loudspeakers.
|
||||
Integrated speaker voltage and current sense provides for
|
||||
real time monitoring of loudspeaker behavior.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- ti,tas2562
|
||||
- ti,tas2563
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
description: |
|
||||
I2C address of the device can be one of these 0x4c, 0x4d, 0x4e or 0x4f
|
||||
|
||||
shut-down-gpios:
|
||||
description: GPIO used to control the state of the device.
|
||||
deprecated: true
|
||||
|
||||
shutdown-gpios:
|
||||
description: GPIO used to control the state of the device.
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
ti,imon-slot-no:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: TDM TX current sense time slot.
|
||||
|
||||
'#sound-dai-cells':
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
i2c0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
codec: codec@4c {
|
||||
compatible = "ti,tas2562";
|
||||
reg = <0x4c>;
|
||||
#sound-dai-cells = <1>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <14>;
|
||||
shutdown-gpios = <&gpio1 15 0>;
|
||||
ti,imon-slot-no = <0>;
|
||||
};
|
||||
};
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
Texas Instruments TAS2770 Smart PA
|
||||
|
||||
The TAS2770 is a mono, digital input Class-D audio amplifier optimized for
|
||||
efficiently driving high peak power into small loudspeakers.
|
||||
Integrated speaker voltage and current sense provides for
|
||||
real time monitoring of loudspeaker behavior.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: - Should contain "ti,tas2770".
|
||||
- reg: - The i2c address. Should contain <0x4c>, <0x4d>,<0x4e>, or <0x4f>.
|
||||
- #address-cells - Should be <1>.
|
||||
- #size-cells - Should be <0>.
|
||||
- ti,asi-format: - Sets TDM RX capture edge. 0->Rising; 1->Falling.
|
||||
- ti,imon-slot-no:- TDM TX current sense time slot.
|
||||
- ti,vmon-slot-no:- TDM TX voltage sense time slot.
|
||||
|
||||
Optional properties:
|
||||
|
||||
- interrupt-parent: the phandle to the interrupt controller which provides
|
||||
the interrupt.
|
||||
- interrupts: interrupt specification for data-ready.
|
||||
|
||||
Examples:
|
||||
|
||||
tas2770@4c {
|
||||
compatible = "ti,tas2770";
|
||||
reg = <0x4c>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
interrupt-parent = <&msm_gpio>;
|
||||
interrupts = <97 0>;
|
||||
ti,asi-format = <0>;
|
||||
ti,imon-slot-no = <0>;
|
||||
ti,vmon-slot-no = <2>;
|
||||
};
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
# Copyright (C) 2019-20 Texas Instruments Incorporated
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/sound/tas2770.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
|
||||
title: Texas Instruments TAS2770 Smart PA
|
||||
|
||||
maintainers:
|
||||
- Shi Fu <shifu0704@thundersoft.com>
|
||||
|
||||
description: |
|
||||
The TAS2770 is a mono, digital input Class-D audio amplifier optimized for
|
||||
efficiently driving high peak power into small loudspeakers.
|
||||
Integrated speaker voltage and current sense provides for
|
||||
real time monitoring of loudspeaker behavior.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- ti,tas2770
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
description: |
|
||||
I2C address of the device can be one of these 0x4c, 0x4d, 0x4e or 0x4f
|
||||
|
||||
reset-gpio:
|
||||
description: GPIO used to reset the device.
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
ti,imon-slot-no:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: TDM TX current sense time slot.
|
||||
|
||||
ti,vmon-slot-no:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: TDM TX voltage sense time slot.
|
||||
|
||||
ti,asi-format:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: Sets TDM RX capture edge.
|
||||
enum:
|
||||
- 0 # Rising edge
|
||||
- 1 # Falling edge
|
||||
|
||||
'#sound-dai-cells':
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
i2c0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
codec: codec@4c {
|
||||
compatible = "ti,tas2770";
|
||||
reg = <0x4c>;
|
||||
#sound-dai-cells = <1>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <14>;
|
||||
reset-gpio = <&gpio1 15 0>;
|
||||
ti,imon-slot-no = <0>;
|
||||
ti,vmon-slot-no = <2>;
|
||||
};
|
||||
};
|
||||
|
|
@ -4,9 +4,9 @@ The TAS5720 serial control bus communicates through the I2C protocol only. The
|
|||
serial bus is also used for periodic codec fault checking/reporting during
|
||||
audio playback. For more product information please see the links below:
|
||||
|
||||
http://www.ti.com/product/TAS5720L
|
||||
http://www.ti.com/product/TAS5720M
|
||||
http://www.ti.com/product/TAS5722L
|
||||
https://www.ti.com/product/TAS5720L
|
||||
https://www.ti.com/product/TAS5720M
|
||||
https://www.ti.com/product/TAS5722L
|
||||
|
||||
Required properties:
|
||||
|
||||
|
|
|
@ -0,0 +1,95 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/ti,j721e-cpb-audio.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Texas Instruments J721e Common Processor Board Audio Support
|
||||
|
||||
maintainers:
|
||||
- Peter Ujfalusi <peter.ujfalusi@ti.com>
|
||||
|
||||
description: |
|
||||
The audio support on the board is using pcm3168a codec connected to McASP10
|
||||
serializers in parallel setup.
|
||||
The pcm3168a SCKI clock is sourced from j721e AUDIO_REFCLK2 pin.
|
||||
In order to support 48KHz and 44.1KHz family of sampling rates the parent
|
||||
clock for AUDIO_REFCLK2 needs to be changed between PLL4 (for 48KHz) and
|
||||
PLL15 (for 44.1KHz). The same PLLs are used for McASP10's AUXCLK clock via
|
||||
different HSDIVIDER.
|
||||
|
||||
Clocking setup for 48KHz family:
|
||||
PLL4 ---> PLL4_HSDIV0 ---> MCASP10_AUXCLK ---> McASP10.auxclk
|
||||
|-> PLL4_HSDIV2 ---> AUDIO_REFCLK2 ---> pcm3168a.SCKI
|
||||
|
||||
Clocking setup for 44.1KHz family:
|
||||
PLL15 ---> PLL15_HSDIV0 ---> MCASP10_AUXCLK ---> McASP10.auxclk
|
||||
|-> PLL15_HSDIV2 ---> AUDIO_REFCLK2 ---> pcm3168a.SCKI
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- const: ti,j721e-cpb-audio
|
||||
|
||||
model:
|
||||
$ref: /schemas/types.yaml#/definitions/string
|
||||
description: User specified audio sound card name
|
||||
|
||||
ti,cpb-mcasp:
|
||||
description: phandle to McASP used on CPB
|
||||
allOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/phandle
|
||||
|
||||
ti,cpb-codec:
|
||||
description: phandle to the pcm3168a codec used on the CPB
|
||||
allOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/phandle
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: AUXCLK clock for McASP used by CPB audio
|
||||
- description: Parent for CPB_McASP auxclk (for 48KHz)
|
||||
- description: Parent for CPB_McASP auxclk (for 44.1KHz)
|
||||
- description: SCKI clock for the pcm3168a codec on CPB
|
||||
- description: Parent for CPB_SCKI clock (for 48KHz)
|
||||
- description: Parent for CPB_SCKI clock (for 44.1KHz)
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: cpb-mcasp-auxclk
|
||||
- const: cpb-mcasp-auxclk-48000
|
||||
- const: cpb-mcasp-auxclk-44100
|
||||
- const: cpb-codec-scki
|
||||
- const: cpb-codec-scki-48000
|
||||
- const: cpb-codec-scki-44100
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- model
|
||||
- ti,cpb-mcasp
|
||||
- ti,cpb-codec
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |+
|
||||
sound {
|
||||
compatible = "ti,j721e-cpb-audio";
|
||||
model = "j721e-cpb";
|
||||
|
||||
status = "okay";
|
||||
|
||||
ti,cpb-mcasp = <&mcasp10>;
|
||||
ti,cpb-codec = <&pcm3168a_1>;
|
||||
|
||||
clocks = <&k3_clks 184 1>,
|
||||
<&k3_clks 184 2>, <&k3_clks 184 4>,
|
||||
<&k3_clks 157 371>,
|
||||
<&k3_clks 157 400>, <&k3_clks 157 401>;
|
||||
clock-names = "cpb-mcasp-auxclk",
|
||||
"cpb-mcasp-auxclk-48000", "cpb-mcasp-auxclk-44100",
|
||||
"cpb-codec-scki",
|
||||
"cpb-codec-scki-48000", "cpb-codec-scki-44100";
|
||||
};
|
|
@ -0,0 +1,150 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/ti,j721e-cpb-ivi-audio.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Texas Instruments J721e Common Processor Board Audio Support
|
||||
|
||||
maintainers:
|
||||
- Peter Ujfalusi <peter.ujfalusi@ti.com>
|
||||
|
||||
description: |
|
||||
The Infotainment board plugs into the Common Processor Board, the support of the
|
||||
extension board is extending the CPB audio support, decribed in:
|
||||
sound/ti,j721e-cpb-audio.txt
|
||||
|
||||
The audio support on the Infotainment Expansion Board consists of McASP0
|
||||
connected to two pcm3168a codecs with dedicated set of serializers to each.
|
||||
The SCKI for pcm3168a is sourced from j721e AUDIO_REFCLK0 pin.
|
||||
|
||||
In order to support 48KHz and 44.1KHz family of sampling rates the parent clock
|
||||
for AUDIO_REFCLK0 needs to be changed between PLL4 (for 48KHz) and PLL15 (for
|
||||
44.1KHz). The same PLLs are used for McASP0's AUXCLK clock via different
|
||||
HSDIVIDER.
|
||||
|
||||
Note: the same PLL4 and PLL15 is used by the audio support on the CPB!
|
||||
|
||||
Clocking setup for 48KHz family:
|
||||
PLL4 ---> PLL4_HSDIV0 ---> MCASP10_AUXCLK ---> McASP10.auxclk
|
||||
| |-> MCASP0_AUXCLK ---> McASP0.auxclk
|
||||
|
|
||||
|-> PLL4_HSDIV2 ---> AUDIO_REFCLK2 ---> pcm3168a.SCKI
|
||||
|-> AUDIO_REFCLK0 ---> pcm3168a_a/b.SCKI
|
||||
|
||||
Clocking setup for 44.1KHz family:
|
||||
PLL15 ---> PLL15_HSDIV0 ---> MCASP10_AUXCLK ---> McASP10.auxclk
|
||||
| |-> MCASP0_AUXCLK ---> McASP0.auxclk
|
||||
|
|
||||
|-> PLL15_HSDIV2 ---> AUDIO_REFCLK2 ---> pcm3168a.SCKI
|
||||
|-> AUDIO_REFCLK0 ---> pcm3168a_a/b.SCKI
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- const: ti,j721e-cpb-ivi-audio
|
||||
|
||||
model:
|
||||
$ref: /schemas/types.yaml#/definitions/string
|
||||
description: User specified audio sound card name
|
||||
|
||||
ti,cpb-mcasp:
|
||||
description: phandle to McASP used on CPB
|
||||
allOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/phandle
|
||||
|
||||
ti,cpb-codec:
|
||||
description: phandle to the pcm3168a codec used on the CPB
|
||||
allOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/phandle
|
||||
|
||||
ti,ivi-mcasp:
|
||||
description: phandle to McASP used on IVI
|
||||
allOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/phandle
|
||||
|
||||
ti,ivi-codec-a:
|
||||
description: phandle to the pcm3168a-A codec on the expansion board
|
||||
allOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/phandle
|
||||
|
||||
ti,ivi-codec-b:
|
||||
description: phandle to the pcm3168a-B codec on the expansion board
|
||||
allOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/phandle
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: AUXCLK clock for McASP used by CPB audio
|
||||
- description: Parent for CPB_McASP auxclk (for 48KHz)
|
||||
- description: Parent for CPB_McASP auxclk (for 44.1KHz)
|
||||
- description: SCKI clock for the pcm3168a codec on CPB
|
||||
- description: Parent for CPB_SCKI clock (for 48KHz)
|
||||
- description: Parent for CPB_SCKI clock (for 44.1KHz)
|
||||
- description: AUXCLK clock for McASP used by IVI audio
|
||||
- description: Parent for IVI_McASP auxclk (for 48KHz)
|
||||
- description: Parent for IVI_McASP auxclk (for 44.1KHz)
|
||||
- description: SCKI clock for the pcm3168a codec on IVI
|
||||
- description: Parent for IVI_SCKI clock (for 48KHz)
|
||||
- description: Parent for IVI_SCKI clock (for 44.1KHz)
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: cpb-mcasp-auxclk
|
||||
- const: cpb-mcasp-auxclk-48000
|
||||
- const: cpb-mcasp-auxclk-44100
|
||||
- const: cpb-codec-scki
|
||||
- const: cpb-codec-scki-48000
|
||||
- const: cpb-codec-scki-44100
|
||||
- const: ivi-mcasp-auxclk
|
||||
- const: ivi-mcasp-auxclk-48000
|
||||
- const: ivi-mcasp-auxclk-44100
|
||||
- const: ivi-codec-scki
|
||||
- const: ivi-codec-scki-48000
|
||||
- const: ivi-codec-scki-44100
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- model
|
||||
- ti,cpb-mcasp
|
||||
- ti,cpb-codec
|
||||
- ti,ivi-mcasp
|
||||
- ti,ivi-codec-a
|
||||
- ti,ivi-codec-b
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |+
|
||||
sound {
|
||||
compatible = "ti,j721e-cpb-ivi-audio";
|
||||
model = "j721e-cpb-ivi";
|
||||
|
||||
status = "okay";
|
||||
|
||||
ti,cpb-mcasp = <&mcasp10>;
|
||||
ti,cpb-codec = <&pcm3168a_1>;
|
||||
|
||||
ti,ivi-mcasp = <&mcasp0>;
|
||||
ti,ivi-codec-a = <&pcm3168a_a>;
|
||||
ti,ivi-codec-b = <&pcm3168a_b>;
|
||||
|
||||
clocks = <&k3_clks 184 1>,
|
||||
<&k3_clks 184 2>, <&k3_clks 184 4>,
|
||||
<&k3_clks 157 371>,
|
||||
<&k3_clks 157 400>, <&k3_clks 157 401>,
|
||||
<&k3_clks 174 1>,
|
||||
<&k3_clks 174 2>, <&k3_clks 174 4>,
|
||||
<&k3_clks 157 301>,
|
||||
<&k3_clks 157 330>, <&k3_clks 157 331>;
|
||||
clock-names = "cpb-mcasp-auxclk",
|
||||
"cpb-mcasp-auxclk-48000", "cpb-mcasp-auxclk-44100",
|
||||
"cpb-codec-scki",
|
||||
"cpb-codec-scki-48000", "cpb-codec-scki-44100",
|
||||
"ivi-mcasp-auxclk",
|
||||
"ivi-mcasp-auxclk-48000", "ivi-mcasp-auxclk-44100",
|
||||
"ivi-codec-scki",
|
||||
"ivi-codec-scki-48000", "ivi-codec-scki-44100";
|
||||
};
|
|
@ -19,4 +19,4 @@ tas6424: tas6424@6a {
|
|||
};
|
||||
|
||||
For more product information please see the link below:
|
||||
http://www.ti.com/product/TAS6424-Q1
|
||||
https://www.ti.com/product/TAS6424-Q1
|
||||
|
|
|
@ -18,9 +18,9 @@ description: |
|
|||
microphone bias or supply voltage generation.
|
||||
|
||||
Specifications can be found at:
|
||||
http://www.ti.com/lit/ds/symlink/tlv320adc3140.pdf
|
||||
http://www.ti.com/lit/ds/symlink/tlv320adc5140.pdf
|
||||
http://www.ti.com/lit/ds/symlink/tlv320adc6140.pdf
|
||||
https://www.ti.com/lit/ds/symlink/tlv320adc3140.pdf
|
||||
https://www.ti.com/lit/ds/symlink/tlv320adc5140.pdf
|
||||
https://www.ti.com/lit/ds/symlink/tlv320adc6140.pdf
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
@ -108,6 +108,32 @@ properties:
|
|||
maximum: 7
|
||||
default: [0, 0, 0, 0]
|
||||
|
||||
patternProperties:
|
||||
'^ti,gpo-config-[1-4]$':
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
description: |
|
||||
Defines the configuration and output driver for the general purpose
|
||||
output pins (GPO). These values are pairs, the first value is for the
|
||||
configuration type and the second value is for the output drive type.
|
||||
The array is defined as <GPO_CFG GPO_DRV>
|
||||
|
||||
GPO output configuration can be one of the following:
|
||||
|
||||
0 - (default) disabled
|
||||
1 - GPOX is configured as a general-purpose output (GPO)
|
||||
2 - GPOX is configured as a device interrupt output (IRQ)
|
||||
3 - GPOX is configured as a secondary ASI output (SDOUT2)
|
||||
4 - GPOX is configured as a PDM clock output (PDMCLK)
|
||||
|
||||
GPO output drive configuration for the GPO pins can be one of the following:
|
||||
|
||||
0d - (default) Hi-Z output
|
||||
1d - Drive active low and active high
|
||||
2d - Drive active low and weak high
|
||||
3d - Drive active low and Hi-Z
|
||||
4d - Drive weak low and active high
|
||||
5d - Drive Hi-Z and active high
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
@ -124,6 +150,8 @@ examples:
|
|||
ti,mic-bias-source = <6>;
|
||||
ti,pdm-edge-select = <0 1 0 1>;
|
||||
ti,gpi-config = <4 5 6 7>;
|
||||
ti,gpo-config-1 = <0 0>;
|
||||
ti,gpo-config-2 = <0 0>;
|
||||
reset-gpios = <&gpio0 14 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1,45 +0,0 @@
|
|||
Socionext UniPhier SoC audio driver
|
||||
|
||||
The Socionext UniPhier audio subsystem consists of I2S and S/PDIF blocks in
|
||||
the same register space.
|
||||
|
||||
Required properties:
|
||||
- compatible : should be one of the following:
|
||||
"socionext,uniphier-ld11-aio"
|
||||
"socionext,uniphier-ld20-aio"
|
||||
"socionext,uniphier-pxs2-aio"
|
||||
- reg : offset and length of the register set for the device.
|
||||
- interrupts : should contain I2S or S/PDIF interrupt.
|
||||
- pinctrl-names : should be "default".
|
||||
- pinctrl-0 : defined I2S signal pins for an external codec chip.
|
||||
- clock-names : should include following entries:
|
||||
"aio"
|
||||
- clocks : a list of phandle, should contain an entry for each
|
||||
entry in clock-names.
|
||||
- reset-names : should include following entries:
|
||||
"aio"
|
||||
- resets : a list of phandle, should contain an entry for each
|
||||
entry in reset-names.
|
||||
- #sound-dai-cells: should be 1.
|
||||
|
||||
Optional properties:
|
||||
- socionext,syscon: a phandle, should contain soc-glue.
|
||||
The soc-glue is used for changing mode of S/PDIF signal pin
|
||||
to Output from Hi-Z. This property is optional if you use
|
||||
I2S signal pins only.
|
||||
|
||||
Example:
|
||||
audio {
|
||||
compatible = "socionext,uniphier-ld20-aio";
|
||||
reg = <0x56000000 0x80000>;
|
||||
interrupts = <0 144 4>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_aout>;
|
||||
clock-names = "aio";
|
||||
clocks = <&sys_clk 40>;
|
||||
reset-names = "aio";
|
||||
resets = <&sys_rst 40>;
|
||||
#sound-dai-cells = <1>;
|
||||
|
||||
socionext,syscon = <&sg>;
|
||||
};
|
|
@ -1,26 +0,0 @@
|
|||
Socionext EVEA - UniPhier SoC internal codec driver
|
||||
|
||||
Required properties:
|
||||
- compatible : should be "socionext,uniphier-evea".
|
||||
- reg : offset and length of the register set for the device.
|
||||
- clock-names : should include following entries:
|
||||
"evea", "exiv"
|
||||
- clocks : a list of phandle, should contain an entry for each
|
||||
entries in clock-names.
|
||||
- reset-names : should include following entries:
|
||||
"evea", "exiv", "adamv"
|
||||
- resets : a list of phandle, should contain reset entries of
|
||||
reset-names.
|
||||
- #sound-dai-cells: should be 1.
|
||||
|
||||
Example:
|
||||
|
||||
codec {
|
||||
compatible = "socionext,uniphier-evea";
|
||||
reg = <0x57900000 0x1000>;
|
||||
clock-names = "evea", "exiv";
|
||||
clocks = <&sys_clk 41>, <&sys_clk 42>;
|
||||
reset-names = "evea", "exiv", "adamv";
|
||||
resets = <&sys_rst 41>, <&sys_rst 42>, <&adamv_rst 0>;
|
||||
#sound-dai-cells = <1>;
|
||||
};
|
|
@ -21,6 +21,17 @@ Optional properties:
|
|||
enabled and disabled together with HP_L and HP_R pins in response to jack
|
||||
detect events.
|
||||
|
||||
- wlf,hp-cfg: A list of headphone jack detect configuration register values.
|
||||
The list must be 3 entries long.
|
||||
hp-cfg[0]: HPSEL[1:0] of R48 (Additional Control 4).
|
||||
hp-cfg[1]: {HPSWEN:HPSWPOL} of R24 (Additional Control 2).
|
||||
hp-cfg[2]: {TOCLKSEL:TOEN} of R23 (Additional Control 1).
|
||||
|
||||
- wlf,gpio-cfg: A list of GPIO configuration register values.
|
||||
The list must be 2 entries long.
|
||||
gpio-cfg[0]: ALRCGPIO of R9 (Audio interface)
|
||||
gpio-cfg[1]: {GPIOPOL:GPIOSEL[2:0]} of R48 (Additional Control 4).
|
||||
|
||||
Example:
|
||||
|
||||
wm8960: codec@1a {
|
||||
|
|
|
@ -68,6 +68,29 @@ Optional properties:
|
|||
- wlf,csnaddr-pd : If present enable the internal pull-down resistor on
|
||||
the CS/ADDR pin.
|
||||
|
||||
Pins on the device (for linking into audio routes):
|
||||
|
||||
* IN1LN
|
||||
* IN1LP
|
||||
* IN2LN
|
||||
* IN2LP:VXRN
|
||||
* IN1RN
|
||||
* IN1RP
|
||||
* IN2RN
|
||||
* IN2RP:VXRP
|
||||
* SPKOUTLP
|
||||
* SPKOUTLN
|
||||
* SPKOUTRP
|
||||
* SPKOUTRN
|
||||
* HPOUT1L
|
||||
* HPOUT1R
|
||||
* HPOUT2P
|
||||
* HPOUT2N
|
||||
* LINEOUT1P
|
||||
* LINEOUT1N
|
||||
* LINEOUT2P
|
||||
* LINEOUT2N
|
||||
|
||||
Example:
|
||||
|
||||
wm8994: codec@1a {
|
||||
|
|
|
@ -80,8 +80,6 @@ properties:
|
|||
- fsl,mpl3115
|
||||
# MPR121: Proximity Capacitive Touch Sensor Controller
|
||||
- fsl,mpr121
|
||||
# SGTL5000: Ultra Low-Power Audio Codec
|
||||
- fsl,sgtl5000
|
||||
# G751: Digital Temperature Sensor and Thermal Watchdog with Two-Wire Interface
|
||||
- gmt,g751
|
||||
# Infineon IR38064 Voltage Regulator
|
||||
|
|
|
@ -20,7 +20,7 @@ patternProperties:
|
|||
"^(keypad|m25p|max8952|max8997|max8998|mpmc),.*": true
|
||||
"^(pinctrl-single|#pinctrl-single|PowerPC),.*": true
|
||||
"^(pl022|pxa-mmc|rcar_sound|rotary-encoder|s5m8767|sdhci),.*": true
|
||||
"^(simple-audio-card|simple-graph-card|st-plgpio|st-spics|ts),.*": true
|
||||
"^(simple-audio-card|st-plgpio|st-spics|ts),.*": true
|
||||
|
||||
# Keep list in alphabetical order.
|
||||
"^abilis,.*":
|
||||
|
|
|
@ -99,7 +99,7 @@ ASoC Core API
|
|||
.. kernel-doc:: include/sound/soc.h
|
||||
.. kernel-doc:: sound/soc/soc-core.c
|
||||
.. kernel-doc:: sound/soc/soc-devres.c
|
||||
.. kernel-doc:: sound/soc/soc-io.c
|
||||
.. kernel-doc:: sound/soc/soc-component.c
|
||||
.. kernel-doc:: sound/soc/soc-pcm.c
|
||||
.. kernel-doc:: sound/soc/soc-ops.c
|
||||
.. kernel-doc:: sound/soc/soc-compress.c
|
||||
|
|
|
@ -17,7 +17,7 @@ frame (FRAME) (usually 48kHz) is always driven by the controller. Each AC97
|
|||
frame is 21uS long and is divided into 13 time slots.
|
||||
|
||||
The AC97 specification can be found at :
|
||||
http://www.intel.com/p/en_US/business/design
|
||||
https://www.intel.com/p/en_US/business/design
|
||||
|
||||
|
||||
I2S
|
||||
|
|
|
@ -140,13 +140,13 @@
|
|||
compatible = "audio-graph-card";
|
||||
label = "Droid 4 Audio";
|
||||
|
||||
simple-graph-card,widgets =
|
||||
widgets =
|
||||
"Speaker", "Earpiece",
|
||||
"Speaker", "Loudspeaker",
|
||||
"Headphone", "Headphone Jack",
|
||||
"Microphone", "Internal Mic";
|
||||
|
||||
simple-graph-card,routing =
|
||||
routing =
|
||||
"Earpiece", "EP",
|
||||
"Loudspeaker", "SPKR",
|
||||
"Headphone Jack", "HSL",
|
||||
|
|
|
@ -672,8 +672,8 @@ static void sii902x_audio_shutdown(struct device *dev, void *data)
|
|||
clk_disable_unprepare(sii902x->audio.mclk);
|
||||
}
|
||||
|
||||
static int sii902x_audio_digital_mute(struct device *dev,
|
||||
void *data, bool enable)
|
||||
static int sii902x_audio_mute(struct device *dev, void *data,
|
||||
bool enable, int direction)
|
||||
{
|
||||
struct sii902x *sii902x = dev_get_drvdata(dev);
|
||||
|
||||
|
@ -724,9 +724,10 @@ static int sii902x_audio_get_dai_id(struct snd_soc_component *component,
|
|||
static const struct hdmi_codec_ops sii902x_audio_codec_ops = {
|
||||
.hw_params = sii902x_audio_hw_params,
|
||||
.audio_shutdown = sii902x_audio_shutdown,
|
||||
.digital_mute = sii902x_audio_digital_mute,
|
||||
.mute_stream = sii902x_audio_mute,
|
||||
.get_eld = sii902x_audio_get_eld,
|
||||
.get_dai_id = sii902x_audio_get_dai_id,
|
||||
.no_capture_mute = 1,
|
||||
};
|
||||
|
||||
static int sii902x_audio_codec_init(struct sii902x *sii902x,
|
||||
|
|
|
@ -1604,7 +1604,8 @@ static int hdmi_audio_hw_params(struct device *dev, void *data,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int hdmi_audio_digital_mute(struct device *dev, void *data, bool mute)
|
||||
static int hdmi_audio_mute(struct device *dev, void *data,
|
||||
bool mute, int direction)
|
||||
{
|
||||
struct hdmi_context *hdata = dev_get_drvdata(dev);
|
||||
|
||||
|
@ -1634,8 +1635,9 @@ static int hdmi_audio_get_eld(struct device *dev, void *data, uint8_t *buf,
|
|||
static const struct hdmi_codec_ops audio_codec_ops = {
|
||||
.hw_params = hdmi_audio_hw_params,
|
||||
.audio_shutdown = hdmi_audio_shutdown,
|
||||
.digital_mute = hdmi_audio_digital_mute,
|
||||
.mute_stream = hdmi_audio_mute,
|
||||
.get_eld = hdmi_audio_get_eld,
|
||||
.no_capture_mute = 1,
|
||||
};
|
||||
|
||||
static int hdmi_register_audio_device(struct hdmi_context *hdata)
|
||||
|
|
|
@ -1133,8 +1133,8 @@ static void tda998x_audio_shutdown(struct device *dev, void *data)
|
|||
mutex_unlock(&priv->audio_mutex);
|
||||
}
|
||||
|
||||
static int tda998x_audio_digital_mute(struct device *dev, void *data,
|
||||
bool enable)
|
||||
static int tda998x_audio_mute_stream(struct device *dev, void *data,
|
||||
bool enable, int direction)
|
||||
{
|
||||
struct tda998x_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
|
@ -1162,8 +1162,9 @@ static int tda998x_audio_get_eld(struct device *dev, void *data,
|
|||
static const struct hdmi_codec_ops audio_codec_ops = {
|
||||
.hw_params = tda998x_audio_hw_params,
|
||||
.audio_shutdown = tda998x_audio_shutdown,
|
||||
.digital_mute = tda998x_audio_digital_mute,
|
||||
.mute_stream = tda998x_audio_mute_stream,
|
||||
.get_eld = tda998x_audio_get_eld,
|
||||
.no_capture_mute = 1,
|
||||
};
|
||||
|
||||
static int tda998x_audio_codec_init(struct tda998x_priv *priv,
|
||||
|
|
|
@ -1643,7 +1643,8 @@ static void mtk_hdmi_audio_shutdown(struct device *dev, void *data)
|
|||
}
|
||||
|
||||
static int
|
||||
mtk_hdmi_audio_digital_mute(struct device *dev, void *data, bool enable)
|
||||
mtk_hdmi_audio_mute(struct device *dev, void *data,
|
||||
bool enable, int direction)
|
||||
{
|
||||
struct mtk_hdmi *hdmi = dev_get_drvdata(dev);
|
||||
|
||||
|
@ -1684,9 +1685,10 @@ static const struct hdmi_codec_ops mtk_hdmi_audio_codec_ops = {
|
|||
.hw_params = mtk_hdmi_audio_hw_params,
|
||||
.audio_startup = mtk_hdmi_audio_startup,
|
||||
.audio_shutdown = mtk_hdmi_audio_shutdown,
|
||||
.digital_mute = mtk_hdmi_audio_digital_mute,
|
||||
.mute_stream = mtk_hdmi_audio_mute,
|
||||
.get_eld = mtk_hdmi_audio_get_eld,
|
||||
.hook_plugged_cb = mtk_hdmi_audio_hook_plugged_cb,
|
||||
.no_capture_mute = 1,
|
||||
};
|
||||
|
||||
static int mtk_hdmi_register_audio_driver(struct device *dev)
|
||||
|
|
|
@ -817,8 +817,8 @@ out:
|
|||
mutex_unlock(&dp->lock);
|
||||
}
|
||||
|
||||
static int cdn_dp_audio_digital_mute(struct device *dev, void *data,
|
||||
bool enable)
|
||||
static int cdn_dp_audio_mute_stream(struct device *dev, void *data,
|
||||
bool enable, int direction)
|
||||
{
|
||||
struct cdn_dp_device *dp = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
@ -849,8 +849,9 @@ static int cdn_dp_audio_get_eld(struct device *dev, void *data,
|
|||
static const struct hdmi_codec_ops audio_codec_ops = {
|
||||
.hw_params = cdn_dp_audio_hw_params,
|
||||
.audio_shutdown = cdn_dp_audio_shutdown,
|
||||
.digital_mute = cdn_dp_audio_digital_mute,
|
||||
.mute_stream = cdn_dp_audio_mute_stream,
|
||||
.get_eld = cdn_dp_audio_get_eld,
|
||||
.no_capture_mute = 1,
|
||||
};
|
||||
|
||||
static int cdn_dp_audio_codec_init(struct cdn_dp_device *dp,
|
||||
|
|
|
@ -1191,7 +1191,8 @@ static int hdmi_audio_hw_params(struct device *dev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int hdmi_audio_digital_mute(struct device *dev, void *data, bool enable)
|
||||
static int hdmi_audio_mute(struct device *dev, void *data,
|
||||
bool enable, int direction)
|
||||
{
|
||||
struct sti_hdmi *hdmi = dev_get_drvdata(dev);
|
||||
|
||||
|
@ -1219,8 +1220,9 @@ static int hdmi_audio_get_eld(struct device *dev, void *data, uint8_t *buf, size
|
|||
static const struct hdmi_codec_ops audio_codec_ops = {
|
||||
.hw_params = hdmi_audio_hw_params,
|
||||
.audio_shutdown = hdmi_audio_shutdown,
|
||||
.digital_mute = hdmi_audio_digital_mute,
|
||||
.mute_stream = hdmi_audio_mute,
|
||||
.get_eld = hdmi_audio_get_eld,
|
||||
.no_capture_mute = 1,
|
||||
};
|
||||
|
||||
static int sti_hdmi_register_audio_driver(struct device *dev,
|
||||
|
|
|
@ -439,8 +439,8 @@ static int zx_hdmi_audio_hw_params(struct device *dev,
|
|||
return zx_hdmi_infoframe_trans(hdmi, &frame, FSEL_AUDIO);
|
||||
}
|
||||
|
||||
static int zx_hdmi_audio_digital_mute(struct device *dev, void *data,
|
||||
bool enable)
|
||||
static int zx_hdmi_audio_mute(struct device *dev, void *data,
|
||||
bool enable, int direction)
|
||||
{
|
||||
struct zx_hdmi *hdmi = dev_get_drvdata(dev);
|
||||
|
||||
|
@ -468,8 +468,9 @@ static const struct hdmi_codec_ops zx_hdmi_codec_ops = {
|
|||
.audio_startup = zx_hdmi_audio_startup,
|
||||
.hw_params = zx_hdmi_audio_hw_params,
|
||||
.audio_shutdown = zx_hdmi_audio_shutdown,
|
||||
.digital_mute = zx_hdmi_audio_digital_mute,
|
||||
.mute_stream = zx_hdmi_audio_mute,
|
||||
.get_eld = zx_hdmi_audio_get_eld,
|
||||
.no_capture_mute = 1,
|
||||
};
|
||||
|
||||
static struct hdmi_codec_pdata zx_hdmi_codec_pdata = {
|
||||
|
|
|
@ -19,4 +19,8 @@
|
|||
#define MSM_FRONTEND_DAI_MULTIMEDIA15 14
|
||||
#define MSM_FRONTEND_DAI_MULTIMEDIA16 15
|
||||
|
||||
#define Q6ASM_DAI_TX_RX 0
|
||||
#define Q6ASM_DAI_TX 1
|
||||
#define Q6ASM_DAI_RX 2
|
||||
|
||||
#endif /* __DT_BINDINGS_Q6_ASM_H__ */
|
||||
|
|
|
@ -415,6 +415,8 @@ __printf(2, 3)
|
|||
struct hda_pcm *snd_hda_codec_pcm_new(struct hda_codec *codec,
|
||||
const char *fmt, ...);
|
||||
|
||||
void snd_hda_codec_cleanup_for_unbind(struct hda_codec *codec);
|
||||
|
||||
static inline void snd_hda_codec_pcm_get(struct hda_pcm *pcm)
|
||||
{
|
||||
kref_get(&pcm->kref);
|
||||
|
|
|
@ -76,7 +76,8 @@ struct hdmi_codec_ops {
|
|||
* Mute/unmute HDMI audio stream.
|
||||
* Optional
|
||||
*/
|
||||
int (*digital_mute)(struct device *dev, void *data, bool enable);
|
||||
int (*mute_stream)(struct device *dev, void *data,
|
||||
bool enable, int direction);
|
||||
|
||||
/*
|
||||
* Provides EDID-Like-Data from connected HDMI device.
|
||||
|
@ -99,6 +100,9 @@ struct hdmi_codec_ops {
|
|||
int (*hook_plugged_cb)(struct device *dev, void *data,
|
||||
hdmi_codec_plugged_cb fn,
|
||||
struct device *codec_dev);
|
||||
|
||||
/* bit field */
|
||||
unsigned int no_capture_mute:1;
|
||||
};
|
||||
|
||||
/* HDMI codec initalization data */
|
||||
|
|
|
@ -1,26 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* linux/sound/rt5670.h -- Platform data for RT5670
|
||||
*
|
||||
* Copyright 2014 Realtek Microelectronics
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_SND_RT5670_H
|
||||
#define __LINUX_SND_RT5670_H
|
||||
|
||||
struct rt5670_platform_data {
|
||||
int jd_mode;
|
||||
bool in2_diff;
|
||||
bool dev_gpio;
|
||||
bool gpio1_is_ext_spk_en;
|
||||
|
||||
bool dmic_en;
|
||||
unsigned int dmic1_data_pin;
|
||||
/* 0 = GPIO6; 1 = IN2P; 3 = GPIO7*/
|
||||
unsigned int dmic2_data_pin;
|
||||
/* 0 = GPIO8; 1 = IN3N; */
|
||||
unsigned int dmic3_data_pin;
|
||||
/* 0 = GPIO9; 1 = GPIO10; 2 = GPIO5*/
|
||||
};
|
||||
|
||||
#endif
|
|
@ -12,9 +12,9 @@
|
|||
#include <sound/soc.h>
|
||||
|
||||
#define asoc_simple_init_hp(card, sjack, prefix) \
|
||||
asoc_simple_init_jack(card, sjack, 1, prefix)
|
||||
asoc_simple_init_jack(card, sjack, 1, prefix, NULL)
|
||||
#define asoc_simple_init_mic(card, sjack, prefix) \
|
||||
asoc_simple_init_jack(card, sjack, 0, prefix)
|
||||
asoc_simple_init_jack(card, sjack, 0, prefix, NULL)
|
||||
|
||||
struct asoc_simple_dai {
|
||||
const char *name;
|
||||
|
@ -131,7 +131,7 @@ int asoc_simple_parse_pin_switches(struct snd_soc_card *card,
|
|||
|
||||
int asoc_simple_init_jack(struct snd_soc_card *card,
|
||||
struct asoc_simple_jack *sjack,
|
||||
int is_hp, char *prefix);
|
||||
int is_hp, char *prefix, char *pin);
|
||||
int asoc_simple_init_priv(struct asoc_simple_priv *priv,
|
||||
struct link_info *li);
|
||||
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
*
|
||||
* soc-component.h
|
||||
*
|
||||
* Copyright (c) 2019 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
* Copyright (C) 2019 Renesas Electronics Corp.
|
||||
* Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
*/
|
||||
#ifndef __SOC_COMPONENT_H
|
||||
#define __SOC_COMPONENT_H
|
||||
|
@ -324,10 +325,12 @@ static inline int snd_soc_component_cache_sync(
|
|||
return regcache_sync(component->regmap);
|
||||
}
|
||||
|
||||
void snd_soc_component_set_aux(struct snd_soc_component *component,
|
||||
struct snd_soc_aux_dev *aux);
|
||||
int snd_soc_component_init(struct snd_soc_component *component);
|
||||
|
||||
/* component IO */
|
||||
int snd_soc_component_read(struct snd_soc_component *component,
|
||||
unsigned int reg, unsigned int *val);
|
||||
unsigned int snd_soc_component_read32(struct snd_soc_component *component,
|
||||
unsigned int snd_soc_component_read(struct snd_soc_component *component,
|
||||
unsigned int reg);
|
||||
int snd_soc_component_write(struct snd_soc_component *component,
|
||||
unsigned int reg, unsigned int val);
|
||||
|
@ -359,6 +362,7 @@ int snd_soc_component_stream_event(struct snd_soc_component *component,
|
|||
int snd_soc_component_set_bias_level(struct snd_soc_component *component,
|
||||
enum snd_soc_bias_level level);
|
||||
|
||||
void snd_soc_component_setup_regmap(struct snd_soc_component *component);
|
||||
#ifdef CONFIG_REGMAP
|
||||
void snd_soc_component_init_regmap(struct snd_soc_component *component,
|
||||
struct regmap *regmap);
|
||||
|
@ -421,16 +425,6 @@ int snd_soc_component_open(struct snd_soc_component *component,
|
|||
struct snd_pcm_substream *substream);
|
||||
int snd_soc_component_close(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream);
|
||||
int snd_soc_component_prepare(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream);
|
||||
int snd_soc_component_hw_params(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params);
|
||||
int snd_soc_component_hw_free(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream);
|
||||
int snd_soc_component_trigger(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream,
|
||||
int cmd);
|
||||
void snd_soc_component_suspend(struct snd_soc_component *component);
|
||||
void snd_soc_component_resume(struct snd_soc_component *component);
|
||||
int snd_soc_component_is_suspended(struct snd_soc_component *component);
|
||||
|
@ -455,5 +449,13 @@ int snd_soc_pcm_component_mmap(struct snd_pcm_substream *substream,
|
|||
struct vm_area_struct *vma);
|
||||
int snd_soc_pcm_component_new(struct snd_soc_pcm_runtime *rtd);
|
||||
void snd_soc_pcm_component_free(struct snd_soc_pcm_runtime *rtd);
|
||||
int snd_soc_pcm_component_prepare(struct snd_pcm_substream *substream);
|
||||
int snd_soc_pcm_component_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params,
|
||||
struct snd_soc_component **last);
|
||||
void snd_soc_pcm_component_hw_free(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_component *last);
|
||||
int snd_soc_pcm_component_trigger(struct snd_pcm_substream *substream,
|
||||
int cmd);
|
||||
|
||||
#endif /* __SOC_COMPONENT_H */
|
||||
|
|
|
@ -39,7 +39,7 @@ struct snd_compr_stream;
|
|||
/*
|
||||
* DAI Clock gating.
|
||||
*
|
||||
* DAI bit clocks can be be gated (disabled) when the DAI is not
|
||||
* DAI bit clocks can be gated (disabled) when the DAI is not
|
||||
* sending or receiving PCM data in a frame. This can be used to save power.
|
||||
*/
|
||||
#define SND_SOC_DAIFMT_CONT (1 << 4) /* continuous clock */
|
||||
|
@ -76,12 +76,12 @@ struct snd_compr_stream;
|
|||
*
|
||||
* This is wrt the codec, the inverse is true for the interface
|
||||
* i.e. if the codec is clk and FRM master then the interface is
|
||||
* clk and frame slave.
|
||||
* clk and frame secondary.
|
||||
*/
|
||||
#define SND_SOC_DAIFMT_CBM_CFM (1 << 12) /* codec clk & FRM master */
|
||||
#define SND_SOC_DAIFMT_CBS_CFM (2 << 12) /* codec clk slave & FRM master */
|
||||
#define SND_SOC_DAIFMT_CBM_CFS (3 << 12) /* codec clk master & frame slave */
|
||||
#define SND_SOC_DAIFMT_CBS_CFS (4 << 12) /* codec clk & FRM slave */
|
||||
#define SND_SOC_DAIFMT_CBS_CFM (2 << 12) /* codec clk secondary & FRM master */
|
||||
#define SND_SOC_DAIFMT_CBM_CFS (3 << 12) /* codec clk master & frame secondary */
|
||||
#define SND_SOC_DAIFMT_CBS_CFS (4 << 12) /* codec clk & FRM secondary */
|
||||
|
||||
#define SND_SOC_DAIFMT_FORMAT_MASK 0x000f
|
||||
#define SND_SOC_DAIFMT_CLOCK_MASK 0x00f0
|
||||
|
@ -247,7 +247,6 @@ struct snd_soc_dai_ops {
|
|||
* DAI digital mute - optional.
|
||||
* Called by soc-core to minimise any pops.
|
||||
*/
|
||||
int (*digital_mute)(struct snd_soc_dai *dai, int mute);
|
||||
int (*mute_stream)(struct snd_soc_dai *dai, int mute, int stream);
|
||||
|
||||
/*
|
||||
|
@ -281,6 +280,9 @@ struct snd_soc_dai_ops {
|
|||
*/
|
||||
snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *,
|
||||
struct snd_soc_dai *);
|
||||
|
||||
/* bit field */
|
||||
unsigned int no_capture_mute:1;
|
||||
};
|
||||
|
||||
struct snd_soc_cdai_ops {
|
||||
|
|
|
@ -16,6 +16,8 @@
|
|||
#include <sound/asoc.h>
|
||||
|
||||
struct device;
|
||||
struct snd_soc_pcm_runtime;
|
||||
struct soc_enum;
|
||||
|
||||
/* widget has no PM register bit */
|
||||
#define SND_SOC_NOPM -1
|
||||
|
@ -376,6 +378,24 @@ struct snd_soc_dapm_widget_list;
|
|||
struct snd_soc_dapm_update;
|
||||
enum snd_soc_dapm_direction;
|
||||
|
||||
/*
|
||||
* Bias levels
|
||||
*
|
||||
* @ON: Bias is fully on for audio playback and capture operations.
|
||||
* @PREPARE: Prepare for audio operations. Called before DAPM switching for
|
||||
* stream start and stop operations.
|
||||
* @STANDBY: Low power standby state when no playback/capture operations are
|
||||
* in progress. NOTE: The transition time between STANDBY and ON
|
||||
* should be as fast as possible and no longer than 10ms.
|
||||
* @OFF: Power Off. No restrictions on transition times.
|
||||
*/
|
||||
enum snd_soc_bias_level {
|
||||
SND_SOC_BIAS_OFF = 0,
|
||||
SND_SOC_BIAS_STANDBY = 1,
|
||||
SND_SOC_BIAS_PREPARE = 2,
|
||||
SND_SOC_BIAS_ON = 3,
|
||||
};
|
||||
|
||||
int dapm_regulator_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event);
|
||||
int dapm_clock_event(struct snd_soc_dapm_widget *w,
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#define __SOC_LINK_H
|
||||
|
||||
int snd_soc_link_init(struct snd_soc_pcm_runtime *rtd);
|
||||
void snd_soc_link_exit(struct snd_soc_pcm_runtime *rtd);
|
||||
int snd_soc_link_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_pcm_hw_params *params);
|
||||
|
||||
|
|
|
@ -368,24 +368,6 @@
|
|||
#define SOC_ENUM_SINGLE_VIRT_DECL(name, xtexts) \
|
||||
const struct soc_enum name = SOC_ENUM_SINGLE_VIRT(ARRAY_SIZE(xtexts), xtexts)
|
||||
|
||||
/*
|
||||
* Bias levels
|
||||
*
|
||||
* @ON: Bias is fully on for audio playback and capture operations.
|
||||
* @PREPARE: Prepare for audio operations. Called before DAPM switching for
|
||||
* stream start and stop operations.
|
||||
* @STANDBY: Low power standby state when no playback/capture operations are
|
||||
* in progress. NOTE: The transition time between STANDBY and ON
|
||||
* should be as fast as possible and no longer than 10ms.
|
||||
* @OFF: Power Off. No restrictions on transition times.
|
||||
*/
|
||||
enum snd_soc_bias_level {
|
||||
SND_SOC_BIAS_OFF = 0,
|
||||
SND_SOC_BIAS_STANDBY = 1,
|
||||
SND_SOC_BIAS_PREPARE = 2,
|
||||
SND_SOC_BIAS_ON = 3,
|
||||
};
|
||||
|
||||
struct device_node;
|
||||
struct snd_jack;
|
||||
struct snd_soc_card;
|
||||
|
@ -432,11 +414,12 @@ static inline int snd_soc_resume(struct device *dev)
|
|||
}
|
||||
#endif
|
||||
int snd_soc_poweroff(struct device *dev);
|
||||
int snd_soc_add_component(struct device *dev,
|
||||
struct snd_soc_component *component,
|
||||
const struct snd_soc_component_driver *component_driver,
|
||||
struct snd_soc_dai_driver *dai_drv,
|
||||
int num_dai);
|
||||
int snd_soc_component_initialize(struct snd_soc_component *component,
|
||||
const struct snd_soc_component_driver *driver,
|
||||
struct device *dev);
|
||||
int snd_soc_add_component(struct snd_soc_component *component,
|
||||
struct snd_soc_dai_driver *dai_drv,
|
||||
int num_dai);
|
||||
int snd_soc_register_component(struct device *dev,
|
||||
const struct snd_soc_component_driver *component_driver,
|
||||
struct snd_soc_dai_driver *dai_drv, int num_dai);
|
||||
|
@ -801,6 +784,9 @@ struct snd_soc_dai_link {
|
|||
/* codec/machine specific init - e.g. add machine controls */
|
||||
int (*init)(struct snd_soc_pcm_runtime *rtd);
|
||||
|
||||
/* codec/machine specific exit - dual of init() */
|
||||
void (*exit)(struct snd_soc_pcm_runtime *rtd);
|
||||
|
||||
/* optional hw_params re-writing for BE and FE sync */
|
||||
int (*be_hw_params_fixup)(struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_pcm_hw_params *params);
|
||||
|
@ -1183,6 +1169,8 @@ struct snd_soc_pcm_runtime {
|
|||
/* see soc_new_pcm_runtime() */
|
||||
#define asoc_rtd_to_cpu(rtd, n) (rtd)->dais[n]
|
||||
#define asoc_rtd_to_codec(rtd, n) (rtd)->dais[n + (rtd)->num_cpus]
|
||||
#define asoc_substream_to_rtd(substream) \
|
||||
(struct snd_soc_pcm_runtime *)snd_pcm_substream_chip(substream)
|
||||
|
||||
#define for_each_rtd_components(rtd, i, component) \
|
||||
for ((i) = 0, component = NULL; \
|
||||
|
|
|
@ -16,6 +16,23 @@ struct wm8960_data {
|
|||
bool capless; /* Headphone outputs configured in capless mode */
|
||||
|
||||
bool shared_lrclk; /* DAC and ADC LRCLKs are wired together */
|
||||
|
||||
/*
|
||||
* Setup for headphone detection
|
||||
*
|
||||
* hp_cfg[0]: HPSEL[1:0] of R48 (Additional Control 4)
|
||||
* hp_cfg[1]: {HPSWEN:HPSWPOL} of R24 (Additional Control 2).
|
||||
* hp_cfg[2]: {TOCLKSEL:TOEN} of R23 (Additional Control 1).
|
||||
*/
|
||||
u32 hp_cfg[3];
|
||||
|
||||
/*
|
||||
* Setup for gpio configuration
|
||||
*
|
||||
* gpio_cfg[0]: ALRCGPIO of R9 (Audio interface)
|
||||
* gpio_cfg[1]: {GPIOPOL:GPIOSEL[2:0]} of R48 (Additional Control 4).
|
||||
*/
|
||||
u32 gpio_cfg[2];
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -792,6 +792,7 @@ void snd_hda_codec_cleanup_for_unbind(struct hda_codec *codec)
|
|||
remove_conn_list(codec);
|
||||
snd_hdac_regmap_exit(&codec->core);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hda_codec_cleanup_for_unbind);
|
||||
|
||||
static unsigned int hda_set_power_state(struct hda_codec *codec,
|
||||
unsigned int power_state);
|
||||
|
@ -3178,7 +3179,7 @@ int snd_hda_codec_prepare(struct hda_codec *codec,
|
|||
EXPORT_SYMBOL_GPL(snd_hda_codec_prepare);
|
||||
|
||||
/**
|
||||
* snd_hda_codec_cleanup - Prepare a stream
|
||||
* snd_hda_codec_cleanup - Clean up stream resources
|
||||
* @codec: the HDA codec
|
||||
* @hinfo: PCM information
|
||||
* @substream: PCM substream
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
snd-soc-core-objs := soc-core.o soc-dapm.o soc-jack.o soc-utils.o soc-dai.o soc-component.o
|
||||
snd-soc-core-objs += soc-pcm.o soc-io.o soc-devres.o soc-ops.o soc-link.o soc-card.o
|
||||
snd-soc-core-objs += soc-pcm.o soc-devres.o soc-ops.o soc-link.o soc-card.o
|
||||
snd-soc-core-$(CONFIG_SND_SOC_COMPRESS) += soc-compress.o
|
||||
|
||||
ifneq ($(CONFIG_SND_SOC_TOPOLOGY),)
|
||||
|
|
|
@ -33,6 +33,7 @@ config SND_SOC_AMD_RV_RT5682_MACH
|
|||
select SND_SOC_MAX98357A
|
||||
select SND_SOC_CROS_EC_CODEC
|
||||
select I2C_CROS_EC_TUNNEL
|
||||
select SND_SOC_RT1015
|
||||
depends on SND_SOC_AMD_ACP3x && I2C && CROS_EC
|
||||
help
|
||||
This option enables machine driver for RT5682 and MAX9835.
|
||||
|
|
|
@ -99,7 +99,7 @@ static int cz_da7219_init(struct snd_soc_pcm_runtime *rtd)
|
|||
static int da7219_clk_enable(struct snd_pcm_substream *substream)
|
||||
{
|
||||
int ret = 0;
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
|
||||
/*
|
||||
* Set wclk to 48000 because the rate constraint of this driver is
|
||||
|
@ -146,7 +146,7 @@ static const struct snd_pcm_hw_constraint_list constraints_channels = {
|
|||
static int cz_da7219_play_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
|
@ -167,7 +167,7 @@ static int cz_da7219_play_startup(struct snd_pcm_substream *substream)
|
|||
static int cz_da7219_cap_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
|
@ -189,7 +189,7 @@ static int cz_da7219_cap_startup(struct snd_pcm_substream *substream)
|
|||
static int cz_max_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
|
@ -210,7 +210,7 @@ static int cz_max_startup(struct snd_pcm_substream *substream)
|
|||
static int cz_dmic0_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
|
@ -231,7 +231,7 @@ static int cz_dmic0_startup(struct snd_pcm_substream *substream)
|
|||
static int cz_dmic1_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
|
@ -450,11 +450,13 @@ static int cz_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
static const struct acpi_device_id cz_audio_acpi_match[] = {
|
||||
{ "AMD7219", 0 },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, cz_audio_acpi_match);
|
||||
#endif
|
||||
|
||||
static struct platform_driver cz_pcm_driver = {
|
||||
.driver = {
|
||||
|
|
|
@ -840,7 +840,7 @@ static int acp_dma_hw_params(struct snd_soc_component *component,
|
|||
u32 val = 0;
|
||||
struct snd_pcm_runtime *runtime;
|
||||
struct audio_substream_data *rtd;
|
||||
struct snd_soc_pcm_runtime *prtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *prtd = asoc_substream_to_rtd(substream);
|
||||
struct audio_drv_data *adata = dev_get_drvdata(component->dev);
|
||||
struct snd_soc_card *card = prtd->card;
|
||||
struct acp_platform_info *pinfo = snd_soc_card_get_drvdata(card);
|
||||
|
|
|
@ -47,7 +47,7 @@ static int cz_aif1_hw_params(struct snd_pcm_substream *substream,
|
|||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
int ret = 0;
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
|
||||
ret = snd_soc_dai_set_pll(codec_dai, 0, RT5645_PLL1_S_MCLK,
|
||||
|
@ -182,11 +182,13 @@ static int cz_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
static const struct acpi_device_id cz_audio_acpi_match[] = {
|
||||
{ "AMDI1002", 0 },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, cz_audio_acpi_match);
|
||||
#endif
|
||||
|
||||
static struct platform_driver cz_pcm_driver = {
|
||||
.driver = {
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
#include "raven/acp3x.h"
|
||||
#include "../codecs/rt5682.h"
|
||||
#include "../codecs/rt1015.h"
|
||||
|
||||
#define PCO_PLAT_CLK 48000000
|
||||
#define RT5682_PLL_FREQ (48000 * 512)
|
||||
|
@ -30,6 +31,13 @@ static struct snd_soc_jack pco_jack;
|
|||
static struct clk *rt5682_dai_wclk;
|
||||
static struct clk *rt5682_dai_bclk;
|
||||
static struct gpio_desc *dmic_sel;
|
||||
void *soc_is_rltk_max(struct device *dev);
|
||||
|
||||
enum {
|
||||
RT5682 = 0,
|
||||
MAX,
|
||||
EC,
|
||||
};
|
||||
|
||||
static int acp3x_5682_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
|
@ -105,7 +113,7 @@ static int acp3x_5682_init(struct snd_soc_pcm_runtime *rtd)
|
|||
static int rt5682_clk_enable(struct snd_pcm_substream *substream)
|
||||
{
|
||||
int ret = 0;
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
|
||||
/* RT5682 will support only 48K output with 48M mclk */
|
||||
clk_set_rate(rt5682_dai_wclk, 48000);
|
||||
|
@ -119,6 +127,34 @@ static int rt5682_clk_enable(struct snd_pcm_substream *substream)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int acp3x_1015_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_dai *codec_dai;
|
||||
int srate, i, ret;
|
||||
|
||||
ret = 0;
|
||||
srate = params_rate(params);
|
||||
|
||||
for_each_rtd_codec_dais(rtd, i, codec_dai) {
|
||||
if (strcmp(codec_dai->component->name, "rt1015-aif"))
|
||||
continue;
|
||||
ret = snd_soc_dai_set_bclk_ratio(codec_dai, 64);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = snd_soc_dai_set_pll(codec_dai, 0, RT1015_PLL_S_BCLK,
|
||||
64 * srate, 256 * srate);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = snd_soc_dai_set_sysclk(codec_dai, RT1015_SCLK_S_PLL,
|
||||
256 * srate, SND_SOC_CLOCK_IN);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void rt5682_clk_disable(void)
|
||||
{
|
||||
clk_disable_unprepare(rt5682_dai_wclk);
|
||||
|
@ -147,7 +183,7 @@ static const struct snd_pcm_hw_constraint_list constraints_channels = {
|
|||
static int acp3x_5682_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp3x_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
|
@ -165,7 +201,7 @@ static int acp3x_5682_startup(struct snd_pcm_substream *substream)
|
|||
static int acp3x_max_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp3x_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
|
@ -181,32 +217,34 @@ static int acp3x_max_startup(struct snd_pcm_substream *substream)
|
|||
|
||||
static int acp3x_ec_dmic0_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct acp3x_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
machine->cap_i2s_instance = I2S_BT_INSTANCE;
|
||||
snd_soc_dai_set_bclk_ratio(codec_dai, 64);
|
||||
if (dmic_sel)
|
||||
gpiod_set_value(dmic_sel, 0);
|
||||
|
||||
return rt5682_clk_enable(substream);
|
||||
}
|
||||
|
||||
static int acp3x_ec_dmic1_startup(struct snd_pcm_substream *substream)
|
||||
static int dmic_switch;
|
||||
|
||||
static int dmic_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct acp3x_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
ucontrol->value.integer.value[0] = dmic_switch;
|
||||
return 0;
|
||||
}
|
||||
|
||||
machine->cap_i2s_instance = I2S_BT_INSTANCE;
|
||||
snd_soc_dai_set_bclk_ratio(codec_dai, 64);
|
||||
if (dmic_sel)
|
||||
gpiod_set_value(dmic_sel, 1);
|
||||
|
||||
return rt5682_clk_enable(substream);
|
||||
static int dmic_set(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
if (dmic_sel) {
|
||||
dmic_switch = ucontrol->value.integer.value[0];
|
||||
gpiod_set_value(dmic_sel, dmic_switch);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rt5682_shutdown(struct snd_pcm_substream *substream)
|
||||
|
@ -222,6 +260,7 @@ static const struct snd_soc_ops acp3x_5682_ops = {
|
|||
static const struct snd_soc_ops acp3x_max_play_ops = {
|
||||
.startup = acp3x_max_startup,
|
||||
.shutdown = rt5682_shutdown,
|
||||
.hw_params = acp3x_1015_hw_params,
|
||||
};
|
||||
|
||||
static const struct snd_soc_ops acp3x_ec_cap0_ops = {
|
||||
|
@ -229,11 +268,6 @@ static const struct snd_soc_ops acp3x_ec_cap0_ops = {
|
|||
.shutdown = rt5682_shutdown,
|
||||
};
|
||||
|
||||
static const struct snd_soc_ops acp3x_ec_cap1_ops = {
|
||||
.startup = acp3x_ec_dmic1_startup,
|
||||
.shutdown = rt5682_shutdown,
|
||||
};
|
||||
|
||||
SND_SOC_DAILINK_DEF(acp3x_i2s,
|
||||
DAILINK_COMP_ARRAY(COMP_CPU("acp3x_i2s_playcap.0")));
|
||||
SND_SOC_DAILINK_DEF(acp3x_bt,
|
||||
|
@ -243,14 +277,28 @@ SND_SOC_DAILINK_DEF(rt5682,
|
|||
DAILINK_COMP_ARRAY(COMP_CODEC("i2c-10EC5682:00", "rt5682-aif1")));
|
||||
SND_SOC_DAILINK_DEF(max,
|
||||
DAILINK_COMP_ARRAY(COMP_CODEC("MX98357A:00", "HiFi")));
|
||||
SND_SOC_DAILINK_DEF(rt1015,
|
||||
DAILINK_COMP_ARRAY(COMP_CODEC("i2c-10EC1015:00", "rt1015-aif"),
|
||||
COMP_CODEC("i2c-10EC1015:01", "rt1015-aif")));
|
||||
SND_SOC_DAILINK_DEF(cros_ec,
|
||||
DAILINK_COMP_ARRAY(COMP_CODEC("GOOG0013:00", "EC Codec I2S RX")));
|
||||
|
||||
SND_SOC_DAILINK_DEF(platform,
|
||||
DAILINK_COMP_ARRAY(COMP_PLATFORM("acp3x_rv_i2s_dma.0")));
|
||||
|
||||
static struct snd_soc_dai_link acp3x_dai_5682_98357[] = {
|
||||
static struct snd_soc_codec_conf rt1015_conf[] = {
|
||||
{
|
||||
.dlc = COMP_CODEC_CONF("i2c-10EC1015:00"),
|
||||
.name_prefix = "Left",
|
||||
},
|
||||
{
|
||||
.dlc = COMP_CODEC_CONF("i2c-10EC1015:01"),
|
||||
.name_prefix = "Right",
|
||||
},
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_link acp3x_dai[] = {
|
||||
[RT5682] = {
|
||||
.name = "acp3x-5682-play",
|
||||
.stream_name = "Playback",
|
||||
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
|
||||
|
@ -261,16 +309,19 @@ static struct snd_soc_dai_link acp3x_dai_5682_98357[] = {
|
|||
.ops = &acp3x_5682_ops,
|
||||
SND_SOC_DAILINK_REG(acp3x_i2s, rt5682, platform),
|
||||
},
|
||||
{
|
||||
[MAX] = {
|
||||
.name = "acp3x-max98357-play",
|
||||
.stream_name = "HiFi Playback",
|
||||
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
|
||||
| SND_SOC_DAIFMT_CBM_CFM,
|
||||
| SND_SOC_DAIFMT_CBS_CFS,
|
||||
.dpcm_playback = 1,
|
||||
.ops = &acp3x_max_play_ops,
|
||||
SND_SOC_DAILINK_REG(acp3x_bt, max, platform),
|
||||
.cpus = acp3x_bt,
|
||||
.num_cpus = ARRAY_SIZE(acp3x_bt),
|
||||
.platforms = platform,
|
||||
.num_platforms = ARRAY_SIZE(platform),
|
||||
},
|
||||
{
|
||||
[EC] = {
|
||||
.name = "acp3x-ec-dmic0-capture",
|
||||
.stream_name = "Capture DMIC0",
|
||||
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
|
||||
|
@ -279,61 +330,136 @@ static struct snd_soc_dai_link acp3x_dai_5682_98357[] = {
|
|||
.ops = &acp3x_ec_cap0_ops,
|
||||
SND_SOC_DAILINK_REG(acp3x_bt, cros_ec, platform),
|
||||
},
|
||||
{
|
||||
.name = "acp3x-ec-dmic1-capture",
|
||||
.stream_name = "Capture DMIC1",
|
||||
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
|
||||
| SND_SOC_DAIFMT_CBS_CFS,
|
||||
.dpcm_capture = 1,
|
||||
.ops = &acp3x_ec_cap1_ops,
|
||||
SND_SOC_DAILINK_REG(acp3x_bt, cros_ec, platform),
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_widget acp3x_widgets[] = {
|
||||
static const char * const dmic_mux_text[] = {
|
||||
"Front Mic",
|
||||
"Rear Mic",
|
||||
};
|
||||
|
||||
static SOC_ENUM_SINGLE_DECL(
|
||||
acp3x_dmic_enum, SND_SOC_NOPM, 0, dmic_mux_text);
|
||||
|
||||
static const struct snd_kcontrol_new acp3x_dmic_mux_control =
|
||||
SOC_DAPM_ENUM_EXT("DMIC Select Mux", acp3x_dmic_enum,
|
||||
dmic_get, dmic_set);
|
||||
|
||||
static const struct snd_soc_dapm_widget acp3x_5682_widgets[] = {
|
||||
SND_SOC_DAPM_HP("Headphone Jack", NULL),
|
||||
SND_SOC_DAPM_SPK("Spk", NULL),
|
||||
SND_SOC_DAPM_MIC("Headset Mic", NULL),
|
||||
SND_SOC_DAPM_MUX("Dmic Mux", SND_SOC_NOPM, 0, 0,
|
||||
&acp3x_dmic_mux_control),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route acp3x_audio_route[] = {
|
||||
static const struct snd_soc_dapm_route acp3x_5682_audio_route[] = {
|
||||
{"Headphone Jack", NULL, "HPOL"},
|
||||
{"Headphone Jack", NULL, "HPOR"},
|
||||
{"IN1P", NULL, "Headset Mic"},
|
||||
{"Spk", NULL, "Speaker"},
|
||||
{"Dmic Mux", "Front Mic", "DMIC"},
|
||||
{"Dmic Mux", "Rear Mic", "DMIC"},
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new acp3x_mc_controls[] = {
|
||||
static const struct snd_kcontrol_new acp3x_5682_mc_controls[] = {
|
||||
SOC_DAPM_PIN_SWITCH("Headphone Jack"),
|
||||
SOC_DAPM_PIN_SWITCH("Spk"),
|
||||
SOC_DAPM_PIN_SWITCH("Headset Mic"),
|
||||
};
|
||||
|
||||
static struct snd_soc_card acp3x_card = {
|
||||
static struct snd_soc_card acp3x_5682 = {
|
||||
.name = "acp3xalc5682m98357",
|
||||
.owner = THIS_MODULE,
|
||||
.dai_link = acp3x_dai_5682_98357,
|
||||
.num_links = ARRAY_SIZE(acp3x_dai_5682_98357),
|
||||
.dapm_widgets = acp3x_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(acp3x_widgets),
|
||||
.dapm_routes = acp3x_audio_route,
|
||||
.num_dapm_routes = ARRAY_SIZE(acp3x_audio_route),
|
||||
.controls = acp3x_mc_controls,
|
||||
.num_controls = ARRAY_SIZE(acp3x_mc_controls),
|
||||
.dai_link = acp3x_dai,
|
||||
.num_links = ARRAY_SIZE(acp3x_dai),
|
||||
.dapm_widgets = acp3x_5682_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(acp3x_5682_widgets),
|
||||
.dapm_routes = acp3x_5682_audio_route,
|
||||
.num_dapm_routes = ARRAY_SIZE(acp3x_5682_audio_route),
|
||||
.controls = acp3x_5682_mc_controls,
|
||||
.num_controls = ARRAY_SIZE(acp3x_5682_mc_controls),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_widget acp3x_1015_widgets[] = {
|
||||
SND_SOC_DAPM_HP("Headphone Jack", NULL),
|
||||
SND_SOC_DAPM_MIC("Headset Mic", NULL),
|
||||
SND_SOC_DAPM_MUX("Dmic Mux", SND_SOC_NOPM, 0, 0,
|
||||
&acp3x_dmic_mux_control),
|
||||
SND_SOC_DAPM_SPK("Left Spk", NULL),
|
||||
SND_SOC_DAPM_SPK("Right Spk", NULL),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route acp3x_1015_route[] = {
|
||||
{"Headphone Jack", NULL, "HPOL"},
|
||||
{"Headphone Jack", NULL, "HPOR"},
|
||||
{"IN1P", NULL, "Headset Mic"},
|
||||
{"Dmic Mux", "Front Mic", "DMIC"},
|
||||
{"Dmic Mux", "Rear Mic", "DMIC"},
|
||||
{"Left Spk", NULL, "Left SPO"},
|
||||
{"Right Spk", NULL, "Right SPO"},
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new acp3x_mc_1015_controls[] = {
|
||||
SOC_DAPM_PIN_SWITCH("Headphone Jack"),
|
||||
SOC_DAPM_PIN_SWITCH("Headset Mic"),
|
||||
SOC_DAPM_PIN_SWITCH("Left Spk"),
|
||||
SOC_DAPM_PIN_SWITCH("Right Spk"),
|
||||
};
|
||||
|
||||
static struct snd_soc_card acp3x_1015 = {
|
||||
.name = "acp3xalc56821015",
|
||||
.owner = THIS_MODULE,
|
||||
.dai_link = acp3x_dai,
|
||||
.num_links = ARRAY_SIZE(acp3x_dai),
|
||||
.dapm_widgets = acp3x_1015_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(acp3x_1015_widgets),
|
||||
.dapm_routes = acp3x_1015_route,
|
||||
.num_dapm_routes = ARRAY_SIZE(acp3x_1015_route),
|
||||
.codec_conf = rt1015_conf,
|
||||
.num_configs = ARRAY_SIZE(rt1015_conf),
|
||||
.controls = acp3x_mc_1015_controls,
|
||||
.num_controls = ARRAY_SIZE(acp3x_mc_1015_controls),
|
||||
};
|
||||
|
||||
void *soc_is_rltk_max(struct device *dev)
|
||||
{
|
||||
const struct acpi_device_id *match;
|
||||
|
||||
match = acpi_match_device(dev->driver->acpi_match_table, dev);
|
||||
if (!match)
|
||||
return NULL;
|
||||
return (void *)match->driver_data;
|
||||
}
|
||||
|
||||
static void card_spk_dai_link_present(struct snd_soc_dai_link *links,
|
||||
const char *card_name)
|
||||
{
|
||||
if (!strcmp(card_name, "acp3xalc56821015")) {
|
||||
links[1].codecs = rt1015;
|
||||
links[1].num_codecs = ARRAY_SIZE(rt1015);
|
||||
} else {
|
||||
links[1].codecs = max;
|
||||
links[1].num_codecs = ARRAY_SIZE(max);
|
||||
}
|
||||
}
|
||||
|
||||
static int acp3x_probe(struct platform_device *pdev)
|
||||
{
|
||||
int ret;
|
||||
struct snd_soc_card *card;
|
||||
struct acp3x_platform_info *machine;
|
||||
struct device *dev = &pdev->dev;
|
||||
|
||||
card = (struct snd_soc_card *)soc_is_rltk_max(dev);
|
||||
if (!card)
|
||||
return -ENODEV;
|
||||
|
||||
machine = devm_kzalloc(&pdev->dev, sizeof(*machine), GFP_KERNEL);
|
||||
if (!machine)
|
||||
return -ENOMEM;
|
||||
|
||||
card = &acp3x_card;
|
||||
acp3x_card.dev = &pdev->dev;
|
||||
card_spk_dai_link_present(card->dai_link, card->name);
|
||||
card->dev = &pdev->dev;
|
||||
platform_set_drvdata(pdev, card);
|
||||
snd_soc_card_set_drvdata(card, machine);
|
||||
|
||||
|
@ -344,18 +470,19 @@ static int acp3x_probe(struct platform_device *pdev)
|
|||
return PTR_ERR(dmic_sel);
|
||||
}
|
||||
|
||||
ret = devm_snd_soc_register_card(&pdev->dev, &acp3x_card);
|
||||
ret = devm_snd_soc_register_card(&pdev->dev, card);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev,
|
||||
"devm_snd_soc_register_card(%s) failed: %d\n",
|
||||
acp3x_card.name, ret);
|
||||
card->name, ret);
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct acpi_device_id acp3x_audio_acpi_match[] = {
|
||||
{ "AMDI5682", 0 },
|
||||
{ "AMDI5682", (unsigned long)&acp3x_5682},
|
||||
{ "AMDI1015", (unsigned long)&acp3x_1015},
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, acp3x_audio_acpi_match);
|
||||
|
@ -372,5 +499,6 @@ static struct platform_driver acp3x_audio = {
|
|||
module_platform_driver(acp3x_audio);
|
||||
|
||||
MODULE_AUTHOR("akshu.agrawal@amd.com");
|
||||
MODULE_DESCRIPTION("ALC5682 & MAX98357 audio support");
|
||||
MODULE_AUTHOR("Vishnuvardhanrao.Ravulapati@amd.com");
|
||||
MODULE_DESCRIPTION("ALC5682 ALC1015 & MAX98357 audio support");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
@ -80,7 +80,7 @@ static int acp3x_i2s_hwparams(struct snd_pcm_substream *substream,
|
|||
u32 val;
|
||||
u32 reg_val, frmt_reg;
|
||||
|
||||
prtd = substream->private_data;
|
||||
prtd = asoc_substream_to_rtd(substream);
|
||||
rtd = substream->runtime->private_data;
|
||||
card = prtd->card;
|
||||
adata = snd_soc_dai_get_drvdata(dai);
|
||||
|
@ -149,22 +149,10 @@ static int acp3x_i2s_trigger(struct snd_pcm_substream *substream,
|
|||
int cmd, struct snd_soc_dai *dai)
|
||||
{
|
||||
struct i2s_stream_instance *rtd;
|
||||
struct snd_soc_pcm_runtime *prtd;
|
||||
struct snd_soc_card *card;
|
||||
struct acp3x_platform_info *pinfo;
|
||||
u32 ret, val, period_bytes, reg_val, ier_val, water_val;
|
||||
u32 buf_size, buf_reg;
|
||||
|
||||
prtd = substream->private_data;
|
||||
rtd = substream->runtime->private_data;
|
||||
card = prtd->card;
|
||||
pinfo = snd_soc_card_get_drvdata(card);
|
||||
if (pinfo) {
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
rtd->i2s_instance = pinfo->play_i2s_instance;
|
||||
else
|
||||
rtd->i2s_instance = pinfo->cap_i2s_instance;
|
||||
}
|
||||
period_bytes = frames_to_bytes(substream->runtime,
|
||||
substream->runtime->period_size);
|
||||
buf_size = frames_to_bytes(substream->runtime,
|
||||
|
|
|
@ -217,7 +217,7 @@ static int acp3x_dma_open(struct snd_soc_component *component,
|
|||
int ret;
|
||||
|
||||
runtime = substream->runtime;
|
||||
prtd = substream->private_data;
|
||||
prtd = asoc_substream_to_rtd(substream);
|
||||
component = snd_soc_rtdcom_lookup(prtd, DRV_NAME);
|
||||
adata = dev_get_drvdata(component->dev);
|
||||
i2s_data = kzalloc(sizeof(*i2s_data), GFP_KERNEL);
|
||||
|
@ -238,7 +238,7 @@ static int acp3x_dma_open(struct snd_soc_component *component,
|
|||
}
|
||||
|
||||
if (!adata->play_stream && !adata->capture_stream &&
|
||||
adata->i2ssp_play_stream && !adata->i2ssp_capture_stream)
|
||||
!adata->i2ssp_play_stream && !adata->i2ssp_capture_stream)
|
||||
rv_writel(1, adata->acp3x_base + mmACP_EXTERNAL_INTR_ENB);
|
||||
|
||||
i2s_data->acp3x_base = adata->acp3x_base;
|
||||
|
@ -258,7 +258,7 @@ static int acp3x_dma_hw_params(struct snd_soc_component *component,
|
|||
struct i2s_dev_data *adata;
|
||||
u64 size;
|
||||
|
||||
prtd = substream->private_data;
|
||||
prtd = asoc_substream_to_rtd(substream);
|
||||
card = prtd->card;
|
||||
pinfo = snd_soc_card_get_drvdata(card);
|
||||
adata = dev_get_drvdata(component->dev);
|
||||
|
@ -301,15 +301,11 @@ static int acp3x_dma_hw_params(struct snd_soc_component *component,
|
|||
static snd_pcm_uframes_t acp3x_dma_pointer(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *prtd;
|
||||
struct snd_soc_card *card;
|
||||
struct i2s_stream_instance *rtd;
|
||||
u32 pos;
|
||||
u32 buffersize;
|
||||
u64 bytescount;
|
||||
|
||||
prtd = substream->private_data;
|
||||
card = prtd->card;
|
||||
rtd = substream->runtime->private_data;
|
||||
|
||||
buffersize = frames_to_bytes(substream->runtime,
|
||||
|
@ -344,7 +340,7 @@ static int acp3x_dma_close(struct snd_soc_component *component,
|
|||
struct i2s_dev_data *adata;
|
||||
struct i2s_stream_instance *ins;
|
||||
|
||||
prtd = substream->private_data;
|
||||
prtd = asoc_substream_to_rtd(substream);
|
||||
component = snd_soc_rtdcom_lookup(prtd, DRV_NAME);
|
||||
adata = dev_get_drvdata(component->dev);
|
||||
ins = substream->runtime->private_data;
|
||||
|
|
|
@ -19,10 +19,12 @@ struct acp3x_dev_data {
|
|||
bool acp3x_audio_mode;
|
||||
struct resource *res;
|
||||
struct platform_device *pdev[ACP3x_DEVS];
|
||||
u32 pme_en;
|
||||
};
|
||||
|
||||
static int acp3x_power_on(void __iomem *acp3x_base)
|
||||
static int acp3x_power_on(struct acp3x_dev_data *adata)
|
||||
{
|
||||
void __iomem *acp3x_base = adata->acp3x_base;
|
||||
u32 val;
|
||||
int timeout;
|
||||
|
||||
|
@ -39,10 +41,10 @@ static int acp3x_power_on(void __iomem *acp3x_base)
|
|||
while (++timeout < 500) {
|
||||
val = rv_readl(acp3x_base + mmACP_PGFSM_STATUS);
|
||||
if (!val) {
|
||||
/* Set PME_EN as after ACP power On,
|
||||
* PME_EN gets cleared
|
||||
/* ACP power On clears PME_EN.
|
||||
* Restore the value to its prior state
|
||||
*/
|
||||
rv_writel(0x1, acp3x_base + mmACP_PME_EN);
|
||||
rv_writel(adata->pme_en, acp3x_base + mmACP_PME_EN);
|
||||
return 0;
|
||||
}
|
||||
udelay(1);
|
||||
|
@ -74,12 +76,13 @@ static int acp3x_reset(void __iomem *acp3x_base)
|
|||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
static int acp3x_init(void __iomem *acp3x_base)
|
||||
static int acp3x_init(struct acp3x_dev_data *adata)
|
||||
{
|
||||
void __iomem *acp3x_base = adata->acp3x_base;
|
||||
int ret;
|
||||
|
||||
/* power on */
|
||||
ret = acp3x_power_on(acp3x_base);
|
||||
ret = acp3x_power_on(adata);
|
||||
if (ret) {
|
||||
pr_err("ACP3x power on failed\n");
|
||||
return ret;
|
||||
|
@ -151,7 +154,9 @@ static int snd_acp3x_probe(struct pci_dev *pci,
|
|||
}
|
||||
pci_set_master(pci);
|
||||
pci_set_drvdata(pci, adata);
|
||||
ret = acp3x_init(adata->acp3x_base);
|
||||
/* Save ACP_PME_EN state */
|
||||
adata->pme_en = rv_readl(adata->acp3x_base + mmACP_PME_EN);
|
||||
ret = acp3x_init(adata);
|
||||
if (ret)
|
||||
goto disable_msi;
|
||||
|
||||
|
@ -274,7 +279,7 @@ static int snd_acp3x_resume(struct device *dev)
|
|||
struct acp3x_dev_data *adata;
|
||||
|
||||
adata = dev_get_drvdata(dev);
|
||||
ret = acp3x_init(adata->acp3x_base);
|
||||
ret = acp3x_init(adata);
|
||||
if (ret) {
|
||||
dev_err(dev, "ACP init failed\n");
|
||||
return ret;
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
//Copyright 2020 Advanced Micro Devices, Inc.
|
||||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/delay.h>
|
||||
|
@ -18,6 +19,16 @@ static int acp_power_gating;
|
|||
module_param(acp_power_gating, int, 0644);
|
||||
MODULE_PARM_DESC(acp_power_gating, "Enable acp power gating");
|
||||
|
||||
/**
|
||||
* dmic_acpi_check = -1 - Checks ACPI method to know DMIC hardware status runtime
|
||||
* = 0 - Skips the DMIC device creation and returns probe failure
|
||||
* = 1 - Assumes that platform has DMIC support and skips ACPI
|
||||
* method check
|
||||
*/
|
||||
static int dmic_acpi_check = ACP_DMIC_AUTO;
|
||||
module_param(dmic_acpi_check, bint, 0644);
|
||||
MODULE_PARM_DESC(dmic_acpi_check, "checks Dmic hardware runtime");
|
||||
|
||||
struct acp_dev_data {
|
||||
void __iomem *acp_base;
|
||||
struct resource *res;
|
||||
|
@ -157,6 +168,10 @@ static int snd_rn_acp_probe(struct pci_dev *pci,
|
|||
{
|
||||
struct acp_dev_data *adata;
|
||||
struct platform_device_info pdevinfo[ACP_DEVS];
|
||||
#if defined(CONFIG_ACPI)
|
||||
acpi_handle handle;
|
||||
acpi_integer dmic_status;
|
||||
#endif
|
||||
unsigned int irqflags;
|
||||
int ret, index;
|
||||
u32 addr;
|
||||
|
@ -201,6 +216,24 @@ static int snd_rn_acp_probe(struct pci_dev *pci,
|
|||
if (ret)
|
||||
goto disable_msi;
|
||||
|
||||
if (!dmic_acpi_check) {
|
||||
ret = -ENODEV;
|
||||
goto de_init;
|
||||
} else if (dmic_acpi_check == ACP_DMIC_AUTO) {
|
||||
#if defined(CONFIG_ACPI)
|
||||
handle = ACPI_HANDLE(&pci->dev);
|
||||
ret = acpi_evaluate_integer(handle, "_WOV", NULL, &dmic_status);
|
||||
if (ACPI_FAILURE(ret)) {
|
||||
ret = -EINVAL;
|
||||
goto de_init;
|
||||
}
|
||||
if (!dmic_status) {
|
||||
ret = -ENODEV;
|
||||
goto de_init;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
adata->res = devm_kzalloc(&pci->dev,
|
||||
sizeof(struct resource) * 2,
|
||||
GFP_KERNEL);
|
||||
|
|
|
@ -55,6 +55,8 @@
|
|||
|
||||
#define MAX_BUFFER (CAPTURE_MAX_PERIOD_SIZE * CAPTURE_MAX_NUM_PERIODS)
|
||||
#define MIN_BUFFER MAX_BUFFER
|
||||
#define ACP_DMIC_AUTO -1
|
||||
|
||||
struct pdm_dev_data {
|
||||
u32 pdm_irq;
|
||||
void __iomem *acp_base;
|
||||
|
|
|
@ -118,48 +118,30 @@ static const struct snd_pcm_hardware atmel_classd_hw = {
|
|||
static int atmel_classd_cpu_dai_startup(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *cpu_dai)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
int err;
|
||||
|
||||
regmap_write(dd->regmap, CLASSD_THR, 0x0);
|
||||
|
||||
return clk_prepare_enable(dd->pclk);
|
||||
err = clk_prepare_enable(dd->pclk);
|
||||
if (err)
|
||||
return err;
|
||||
err = clk_prepare_enable(dd->gclk);
|
||||
if (err) {
|
||||
clk_disable_unprepare(dd->pclk);
|
||||
return err;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void atmel_classd_cpu_dai_shutdown(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *cpu_dai)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
|
||||
clk_disable_unprepare(dd->pclk);
|
||||
}
|
||||
|
||||
static const struct snd_soc_dai_ops atmel_classd_cpu_dai_ops = {
|
||||
.startup = atmel_classd_cpu_dai_startup,
|
||||
.shutdown = atmel_classd_cpu_dai_shutdown,
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_driver atmel_classd_cpu_dai = {
|
||||
.playback = {
|
||||
.channels_min = 1,
|
||||
.channels_max = 2,
|
||||
.rates = ATMEL_CLASSD_RATES,
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_LE,},
|
||||
.ops = &atmel_classd_cpu_dai_ops,
|
||||
};
|
||||
|
||||
static const struct snd_soc_component_driver atmel_classd_cpu_dai_component = {
|
||||
.name = "atmel-classd",
|
||||
};
|
||||
|
||||
/* platform */
|
||||
static int
|
||||
atmel_classd_platform_configure_dma(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params,
|
||||
struct dma_slave_config *slave_config)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
|
||||
if (params_physical_width(params) != 16) {
|
||||
|
@ -306,31 +288,10 @@ static int atmel_classd_component_resume(struct snd_soc_component *component)
|
|||
return regcache_sync(dd->regmap);
|
||||
}
|
||||
|
||||
static struct snd_soc_component_driver soc_component_dev_classd = {
|
||||
.probe = atmel_classd_component_probe,
|
||||
.resume = atmel_classd_component_resume,
|
||||
.controls = atmel_classd_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(atmel_classd_snd_controls),
|
||||
.idle_bias_on = 1,
|
||||
.use_pmdown_time = 1,
|
||||
.endianness = 1,
|
||||
.non_legacy_dai_naming = 1,
|
||||
};
|
||||
|
||||
/* codec dai component */
|
||||
static int atmel_classd_codec_dai_startup(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *codec_dai)
|
||||
static int atmel_classd_cpu_dai_mute_stream(struct snd_soc_dai *cpu_dai,
|
||||
int mute, int direction)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
|
||||
return clk_prepare_enable(dd->gclk);
|
||||
}
|
||||
|
||||
static int atmel_classd_codec_dai_digital_mute(struct snd_soc_dai *codec_dai,
|
||||
int mute)
|
||||
{
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
struct snd_soc_component *component = cpu_dai->component;
|
||||
u32 mask, val;
|
||||
|
||||
mask = CLASSD_MR_LMUTE_MASK | CLASSD_MR_RMUTE_MASK;
|
||||
|
@ -373,13 +334,13 @@ static struct {
|
|||
};
|
||||
|
||||
static int
|
||||
atmel_classd_codec_dai_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params,
|
||||
struct snd_soc_dai *codec_dai)
|
||||
atmel_classd_cpu_dai_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params,
|
||||
struct snd_soc_dai *cpu_dai)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
struct snd_soc_component *component = cpu_dai->component;
|
||||
int fs;
|
||||
int i, best, best_val, cur_val, ret;
|
||||
u32 mask, val;
|
||||
|
@ -417,19 +378,19 @@ atmel_classd_codec_dai_hw_params(struct snd_pcm_substream *substream,
|
|||
}
|
||||
|
||||
static void
|
||||
atmel_classd_codec_dai_shutdown(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *codec_dai)
|
||||
atmel_classd_cpu_dai_shutdown(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *cpu_dai)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
|
||||
clk_disable_unprepare(dd->gclk);
|
||||
}
|
||||
|
||||
static int atmel_classd_codec_dai_prepare(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *codec_dai)
|
||||
static int atmel_classd_cpu_dai_prepare(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *cpu_dai)
|
||||
{
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
struct snd_soc_component *component = cpu_dai->component;
|
||||
|
||||
snd_soc_component_update_bits(component, CLASSD_MR,
|
||||
CLASSD_MR_LEN_MASK | CLASSD_MR_REN_MASK,
|
||||
|
@ -439,10 +400,10 @@ static int atmel_classd_codec_dai_prepare(struct snd_pcm_substream *substream,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int atmel_classd_codec_dai_trigger(struct snd_pcm_substream *substream,
|
||||
int cmd, struct snd_soc_dai *codec_dai)
|
||||
static int atmel_classd_cpu_dai_trigger(struct snd_pcm_substream *substream,
|
||||
int cmd, struct snd_soc_dai *cpu_dai)
|
||||
{
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
struct snd_soc_component *component = cpu_dai->component;
|
||||
u32 mask, val;
|
||||
|
||||
mask = CLASSD_MR_LEN_MASK | CLASSD_MR_REN_MASK;
|
||||
|
@ -468,19 +429,17 @@ static int atmel_classd_codec_dai_trigger(struct snd_pcm_substream *substream,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const struct snd_soc_dai_ops atmel_classd_codec_dai_ops = {
|
||||
.digital_mute = atmel_classd_codec_dai_digital_mute,
|
||||
.startup = atmel_classd_codec_dai_startup,
|
||||
.shutdown = atmel_classd_codec_dai_shutdown,
|
||||
.hw_params = atmel_classd_codec_dai_hw_params,
|
||||
.prepare = atmel_classd_codec_dai_prepare,
|
||||
.trigger = atmel_classd_codec_dai_trigger,
|
||||
static const struct snd_soc_dai_ops atmel_classd_cpu_dai_ops = {
|
||||
.startup = atmel_classd_cpu_dai_startup,
|
||||
.shutdown = atmel_classd_cpu_dai_shutdown,
|
||||
.mute_stream = atmel_classd_cpu_dai_mute_stream,
|
||||
.hw_params = atmel_classd_cpu_dai_hw_params,
|
||||
.prepare = atmel_classd_cpu_dai_prepare,
|
||||
.trigger = atmel_classd_cpu_dai_trigger,
|
||||
.no_capture_mute = 1,
|
||||
};
|
||||
|
||||
#define ATMEL_CLASSD_CODEC_DAI_NAME "atmel-classd-hifi"
|
||||
|
||||
static struct snd_soc_dai_driver atmel_classd_codec_dai = {
|
||||
.name = ATMEL_CLASSD_CODEC_DAI_NAME,
|
||||
static struct snd_soc_dai_driver atmel_classd_cpu_dai = {
|
||||
.playback = {
|
||||
.stream_name = "Playback",
|
||||
.channels_min = 1,
|
||||
|
@ -488,7 +447,18 @@ static struct snd_soc_dai_driver atmel_classd_codec_dai = {
|
|||
.rates = ATMEL_CLASSD_RATES,
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_LE,
|
||||
},
|
||||
.ops = &atmel_classd_codec_dai_ops,
|
||||
.ops = &atmel_classd_cpu_dai_ops,
|
||||
};
|
||||
|
||||
static const struct snd_soc_component_driver atmel_classd_cpu_dai_component = {
|
||||
.name = "atmel-classd",
|
||||
.probe = atmel_classd_component_probe,
|
||||
.resume = atmel_classd_component_resume,
|
||||
.controls = atmel_classd_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(atmel_classd_snd_controls),
|
||||
.idle_bias_on = 1,
|
||||
.use_pmdown_time = 1,
|
||||
.endianness = 1,
|
||||
};
|
||||
|
||||
/* ASoC sound card */
|
||||
|
@ -517,9 +487,9 @@ static int atmel_classd_asoc_card_init(struct device *dev,
|
|||
|
||||
dai_link->name = "CLASSD";
|
||||
dai_link->stream_name = "CLASSD PCM";
|
||||
dai_link->codecs->dai_name = ATMEL_CLASSD_CODEC_DAI_NAME;
|
||||
dai_link->codecs->dai_name = "snd-soc-dummy-dai";
|
||||
dai_link->cpus->dai_name = dev_name(dev);
|
||||
dai_link->codecs->name = dev_name(dev);
|
||||
dai_link->codecs->name = "snd-soc-dummy";
|
||||
dai_link->platforms->name = dev_name(dev);
|
||||
|
||||
card->dai_link = dai_link;
|
||||
|
@ -620,13 +590,6 @@ static int atmel_classd_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_snd_soc_register_component(dev, &soc_component_dev_classd,
|
||||
&atmel_classd_codec_dai, 1);
|
||||
if (ret) {
|
||||
dev_err(dev, "could not register component: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* register sound card */
|
||||
card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL);
|
||||
if (!card) {
|
||||
|
|
|
@ -44,7 +44,7 @@ static const struct snd_pcm_hardware atmel_pcm_dma_hardware = {
|
|||
.buffer_bytes_max = 512 * 1024,
|
||||
};
|
||||
|
||||
/**
|
||||
/*
|
||||
* atmel_pcm_dma_irq: SSC interrupt handler for DMAENGINE enabled SSC
|
||||
*
|
||||
* We use DMAENGINE to send/receive data to/from SSC so this ISR is only to
|
||||
|
@ -53,7 +53,7 @@ static const struct snd_pcm_hardware atmel_pcm_dma_hardware = {
|
|||
static void atmel_pcm_dma_irq(u32 ssc_sr,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct atmel_pcm_dma_params *prtd;
|
||||
|
||||
prtd = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
|
||||
|
@ -78,7 +78,7 @@ static void atmel_pcm_dma_irq(u32 ssc_sr,
|
|||
static int atmel_pcm_configure_dma(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params, struct dma_slave_config *slave_config)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct atmel_pcm_dma_params *prtd;
|
||||
struct ssc_device *ssc;
|
||||
int ret;
|
||||
|
|
|
@ -205,7 +205,7 @@ static int atmel_pcm_hw_params(struct snd_soc_component *component,
|
|||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct atmel_runtime_data *prtd = runtime->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
|
||||
/* this may get called several times by oss emulation
|
||||
* with different params */
|
||||
|
|
|
@ -104,7 +104,7 @@ static struct atmel_pdmic_pdata *atmel_pdmic_dt_init(struct device *dev)
|
|||
static int atmel_pdmic_cpu_dai_startup(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *cpu_dai)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct atmel_pdmic *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
int ret;
|
||||
|
||||
|
@ -132,7 +132,7 @@ static int atmel_pdmic_cpu_dai_startup(struct snd_pcm_substream *substream,
|
|||
static void atmel_pdmic_cpu_dai_shutdown(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *cpu_dai)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct atmel_pdmic *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
|
||||
/* Disable the overrun error interrupt */
|
||||
|
@ -145,35 +145,29 @@ static void atmel_pdmic_cpu_dai_shutdown(struct snd_pcm_substream *substream,
|
|||
static int atmel_pdmic_cpu_dai_prepare(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *cpu_dai)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct atmel_pdmic *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
struct snd_soc_component *component = cpu_dai->component;
|
||||
u32 val;
|
||||
int ret;
|
||||
|
||||
/* Clean the PDMIC Converted Data Register */
|
||||
return regmap_read(dd->regmap, PDMIC_CDR, &val);
|
||||
ret = regmap_read(dd->regmap, PDMIC_CDR, &val);
|
||||
if (ret < 0)
|
||||
return 0;
|
||||
|
||||
ret = snd_soc_component_update_bits(component, PDMIC_CR,
|
||||
PDMIC_CR_ENPDM_MASK,
|
||||
PDMIC_CR_ENPDM_DIS <<
|
||||
PDMIC_CR_ENPDM_SHIFT);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct snd_soc_dai_ops atmel_pdmic_cpu_dai_ops = {
|
||||
.startup = atmel_pdmic_cpu_dai_startup,
|
||||
.shutdown = atmel_pdmic_cpu_dai_shutdown,
|
||||
.prepare = atmel_pdmic_cpu_dai_prepare,
|
||||
};
|
||||
|
||||
#define ATMEL_PDMIC_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE)
|
||||
|
||||
static struct snd_soc_dai_driver atmel_pdmic_cpu_dai = {
|
||||
.capture = {
|
||||
.channels_min = 1,
|
||||
.channels_max = 1,
|
||||
.rates = SNDRV_PCM_RATE_KNOT,
|
||||
.formats = ATMEL_PDMIC_FORMATS,},
|
||||
.ops = &atmel_pdmic_cpu_dai_ops,
|
||||
};
|
||||
|
||||
static const struct snd_soc_component_driver atmel_pdmic_cpu_dai_component = {
|
||||
.name = "atmel-pdmic",
|
||||
};
|
||||
|
||||
/* platform */
|
||||
#define ATMEL_PDMIC_MAX_BUF_SIZE (64 * 1024)
|
||||
#define ATMEL_PDMIC_PREALLOC_BUF_SIZE ATMEL_PDMIC_MAX_BUF_SIZE
|
||||
|
@ -197,7 +191,7 @@ atmel_pdmic_platform_configure_dma(struct snd_pcm_substream *substream,
|
|||
struct snd_pcm_hw_params *params,
|
||||
struct dma_slave_config *slave_config)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct atmel_pdmic *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
int ret;
|
||||
|
||||
|
@ -290,10 +284,10 @@ static int pdmic_get_mic_volsw(struct snd_kcontrol *kcontrol,
|
|||
unsigned int dgain_val, scale_val;
|
||||
int i;
|
||||
|
||||
dgain_val = (snd_soc_component_read32(component, PDMIC_DSPR1) & PDMIC_DSPR1_DGAIN_MASK)
|
||||
dgain_val = (snd_soc_component_read(component, PDMIC_DSPR1) & PDMIC_DSPR1_DGAIN_MASK)
|
||||
>> PDMIC_DSPR1_DGAIN_SHIFT;
|
||||
|
||||
scale_val = (snd_soc_component_read32(component, PDMIC_DSPR0) & PDMIC_DSPR0_SCALE_MASK)
|
||||
scale_val = (snd_soc_component_read(component, PDMIC_DSPR0) & PDMIC_DSPR0_SCALE_MASK)
|
||||
>> PDMIC_DSPR0_SCALE_SHIFT;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mic_gain_table); i++) {
|
||||
|
@ -355,27 +349,16 @@ static int atmel_pdmic_component_probe(struct snd_soc_component *component)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct snd_soc_component_driver soc_component_dev_pdmic = {
|
||||
.probe = atmel_pdmic_component_probe,
|
||||
.controls = atmel_pdmic_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(atmel_pdmic_snd_controls),
|
||||
.idle_bias_on = 1,
|
||||
.use_pmdown_time = 1,
|
||||
.endianness = 1,
|
||||
.non_legacy_dai_naming = 1,
|
||||
};
|
||||
|
||||
/* codec dai component */
|
||||
#define PDMIC_MR_PRESCAL_MAX_VAL 127
|
||||
|
||||
static int
|
||||
atmel_pdmic_codec_dai_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params,
|
||||
struct snd_soc_dai *codec_dai)
|
||||
atmel_pdmic_cpu_dai_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params,
|
||||
struct snd_soc_dai *cpu_dai)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct atmel_pdmic *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
struct snd_soc_component *component = cpu_dai->component;
|
||||
unsigned int rate_min = substream->runtime->hw.rate_min;
|
||||
unsigned int rate_max = substream->runtime->hw.rate_max;
|
||||
int fs = params_rate(params);
|
||||
|
@ -445,21 +428,10 @@ atmel_pdmic_codec_dai_hw_params(struct snd_pcm_substream *substream,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int atmel_pdmic_codec_dai_prepare(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *codec_dai)
|
||||
static int atmel_pdmic_cpu_dai_trigger(struct snd_pcm_substream *substream,
|
||||
int cmd, struct snd_soc_dai *cpu_dai)
|
||||
{
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
|
||||
snd_soc_component_update_bits(component, PDMIC_CR, PDMIC_CR_ENPDM_MASK,
|
||||
PDMIC_CR_ENPDM_DIS << PDMIC_CR_ENPDM_SHIFT);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int atmel_pdmic_codec_dai_trigger(struct snd_pcm_substream *substream,
|
||||
int cmd, struct snd_soc_dai *codec_dai)
|
||||
{
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
struct snd_soc_component *component = cpu_dai->component;
|
||||
u32 val;
|
||||
|
||||
switch (cmd) {
|
||||
|
@ -482,16 +454,16 @@ static int atmel_pdmic_codec_dai_trigger(struct snd_pcm_substream *substream,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const struct snd_soc_dai_ops atmel_pdmic_codec_dai_ops = {
|
||||
.hw_params = atmel_pdmic_codec_dai_hw_params,
|
||||
.prepare = atmel_pdmic_codec_dai_prepare,
|
||||
.trigger = atmel_pdmic_codec_dai_trigger,
|
||||
static const struct snd_soc_dai_ops atmel_pdmic_cpu_dai_ops = {
|
||||
.startup = atmel_pdmic_cpu_dai_startup,
|
||||
.shutdown = atmel_pdmic_cpu_dai_shutdown,
|
||||
.prepare = atmel_pdmic_cpu_dai_prepare,
|
||||
.hw_params = atmel_pdmic_cpu_dai_hw_params,
|
||||
.trigger = atmel_pdmic_cpu_dai_trigger,
|
||||
};
|
||||
|
||||
#define ATMEL_PDMIC_CODEC_DAI_NAME "atmel-pdmic-hifi"
|
||||
|
||||
static struct snd_soc_dai_driver atmel_pdmic_codec_dai = {
|
||||
.name = ATMEL_PDMIC_CODEC_DAI_NAME,
|
||||
static struct snd_soc_dai_driver atmel_pdmic_cpu_dai = {
|
||||
.capture = {
|
||||
.stream_name = "Capture",
|
||||
.channels_min = 1,
|
||||
|
@ -499,7 +471,17 @@ static struct snd_soc_dai_driver atmel_pdmic_codec_dai = {
|
|||
.rates = SNDRV_PCM_RATE_KNOT,
|
||||
.formats = ATMEL_PDMIC_FORMATS,
|
||||
},
|
||||
.ops = &atmel_pdmic_codec_dai_ops,
|
||||
.ops = &atmel_pdmic_cpu_dai_ops,
|
||||
};
|
||||
|
||||
static const struct snd_soc_component_driver atmel_pdmic_cpu_dai_component = {
|
||||
.name = "atmel-pdmic",
|
||||
.probe = atmel_pdmic_component_probe,
|
||||
.controls = atmel_pdmic_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(atmel_pdmic_snd_controls),
|
||||
.idle_bias_on = 1,
|
||||
.use_pmdown_time = 1,
|
||||
.endianness = 1,
|
||||
};
|
||||
|
||||
/* ASoC sound card */
|
||||
|
@ -528,9 +510,9 @@ static int atmel_pdmic_asoc_card_init(struct device *dev,
|
|||
|
||||
dai_link->name = "PDMIC";
|
||||
dai_link->stream_name = "PDMIC PCM";
|
||||
dai_link->codecs->dai_name = ATMEL_PDMIC_CODEC_DAI_NAME;
|
||||
dai_link->codecs->dai_name = "snd-soc-dummy-dai";
|
||||
dai_link->cpus->dai_name = dev_name(dev);
|
||||
dai_link->codecs->name = dev_name(dev);
|
||||
dai_link->codecs->name = "snd-soc-dummy";
|
||||
dai_link->platforms->name = dev_name(dev);
|
||||
|
||||
card->dai_link = dai_link;
|
||||
|
@ -684,16 +666,6 @@ static int atmel_pdmic_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* register codec and codec dai */
|
||||
atmel_pdmic_codec_dai.capture.rate_min = rate_min;
|
||||
atmel_pdmic_codec_dai.capture.rate_max = rate_max;
|
||||
ret = devm_snd_soc_register_component(dev, &soc_component_dev_pdmic,
|
||||
&atmel_pdmic_codec_dai, 1);
|
||||
if (ret) {
|
||||
dev_err(dev, "could not register component: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* register sound card */
|
||||
card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL);
|
||||
if (!card) {
|
||||
|
|
|
@ -887,6 +887,7 @@ static int asoc_ssc_init(struct device *dev)
|
|||
|
||||
/**
|
||||
* atmel_ssc_set_audio - Allocate the specified SSC for audio use.
|
||||
* @ssc_id: SSD ID in [0, NUM_SSC_DEVICES[
|
||||
*/
|
||||
int atmel_ssc_set_audio(int ssc_id)
|
||||
{
|
||||
|
|
|
@ -26,7 +26,7 @@ static const struct snd_soc_dapm_widget atmel_asoc_wm8904_dapm_widgets[] = {
|
|||
static int atmel_asoc_wm8904_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
int ret;
|
||||
|
||||
|
|
|
@ -94,7 +94,7 @@ static struct snd_soc_card db1550_ac97_machine = {
|
|||
|
||||
static int db1200_i2s_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
|
||||
/* WM8731 has its own 12MHz crystal */
|
||||
|
|
|
@ -278,7 +278,7 @@ static int au1xpsc_pcm_open(struct snd_soc_component *component,
|
|||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct au1xpsc_audio_dmadata *pcd = to_dmadata(substream, component);
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
int stype = substream->stream, *dmaids;
|
||||
|
||||
dmaids = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
|
||||
|
|
|
@ -191,7 +191,7 @@ static int alchemy_pcm_open(struct snd_soc_component *component,
|
|||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct alchemy_pcm_ctx *ctx = ss_to_ctx(substream, component);
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
int *dmaids, s = substream->stream;
|
||||
char *name;
|
||||
|
||||
|
|
|
@ -841,9 +841,12 @@ static int bcm2835_i2s_probe(struct platform_device *pdev)
|
|||
dev->clk_prepared = false;
|
||||
dev->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(dev->clk)) {
|
||||
dev_err(&pdev->dev, "could not get clk: %ld\n",
|
||||
PTR_ERR(dev->clk));
|
||||
return PTR_ERR(dev->clk);
|
||||
ret = PTR_ERR(dev->clk);
|
||||
if (ret == -EPROBE_DEFER)
|
||||
dev_dbg(&pdev->dev, "could not get clk: %d\n", ret);
|
||||
else
|
||||
dev_err(&pdev->dev, "could not get clk: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Request ioarea */
|
||||
|
|
|
@ -45,7 +45,7 @@ static int bcm63xx_pcm_hw_params(struct snd_soc_component *component,
|
|||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
struct i2s_dma_desc *dma_desc;
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
|
||||
snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer);
|
||||
|
@ -64,7 +64,7 @@ static int bcm63xx_pcm_hw_free(struct snd_soc_component *component,
|
|||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct i2s_dma_desc *dma_desc;
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
|
||||
dma_desc = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
|
||||
kfree(dma_desc);
|
||||
|
@ -81,7 +81,7 @@ static int bcm63xx_pcm_trigger(struct snd_soc_component *component,
|
|||
struct bcm_i2s_priv *i2s_priv;
|
||||
struct regmap *regmap_i2s;
|
||||
|
||||
rtd = substream->private_data;
|
||||
rtd = asoc_substream_to_rtd(substream);
|
||||
i2s_priv = dev_get_drvdata(asoc_rtd_to_cpu(rtd, 0)->dev);
|
||||
regmap_i2s = i2s_priv->regmap_i2s;
|
||||
|
||||
|
@ -148,7 +148,7 @@ static int bcm63xx_pcm_prepare(struct snd_soc_component *component,
|
|||
struct i2s_dma_desc *dma_desc;
|
||||
struct regmap *regmap_i2s;
|
||||
struct bcm_i2s_priv *i2s_priv;
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
uint32_t regaddr_desclen, regaddr_descaddr;
|
||||
|
||||
|
@ -267,7 +267,7 @@ static irqreturn_t i2s_dma_isr(int irq, void *bcm_i2s_priv)
|
|||
if (int_status & I2S_RX_DESC_OFF_INTR_EN_MSK) {
|
||||
substream = i2s_priv->capture_substream;
|
||||
runtime = substream->runtime;
|
||||
rtd = substream->private_data;
|
||||
rtd = asoc_substream_to_rtd(substream);
|
||||
prtd = runtime->private_data;
|
||||
dma_desc = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
|
||||
|
||||
|
@ -315,7 +315,7 @@ static irqreturn_t i2s_dma_isr(int irq, void *bcm_i2s_priv)
|
|||
if (int_status & I2S_TX_DESC_OFF_INTR_EN_MSK) {
|
||||
substream = i2s_priv->play_substream;
|
||||
runtime = substream->runtime;
|
||||
rtd = substream->private_data;
|
||||
rtd = asoc_substream_to_rtd(substream);
|
||||
prtd = runtime->private_data;
|
||||
dma_desc = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
|
||||
|
||||
|
|
|
@ -207,7 +207,7 @@ static u64 cygnus_dma_dmamask = DMA_BIT_MASK(32);
|
|||
static struct cygnus_aio_port *cygnus_dai_get_dma_data(
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *soc_runtime = asoc_substream_to_rtd(substream);
|
||||
|
||||
return snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(soc_runtime, 0), substream);
|
||||
}
|
||||
|
@ -353,7 +353,7 @@ static void enable_intr(struct snd_pcm_substream *substream)
|
|||
|
||||
static void disable_intr(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct cygnus_aio_port *aio;
|
||||
u32 set_mask;
|
||||
|
||||
|
@ -581,7 +581,7 @@ static irqreturn_t cygnus_dma_irq(int irq, void *data)
|
|||
static int cygnus_pcm_open(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct cygnus_aio_port *aio;
|
||||
int ret;
|
||||
|
@ -618,7 +618,7 @@ static int cygnus_pcm_open(struct snd_soc_component *component,
|
|||
static int cygnus_pcm_close(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct cygnus_aio_port *aio;
|
||||
|
||||
aio = cygnus_dai_get_dma_data(substream);
|
||||
|
@ -640,7 +640,7 @@ static int cygnus_pcm_hw_params(struct snd_soc_component *component,
|
|||
struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct cygnus_aio_port *aio;
|
||||
|
||||
|
@ -656,7 +656,7 @@ static int cygnus_pcm_hw_params(struct snd_soc_component *component,
|
|||
static int cygnus_pcm_hw_free(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct cygnus_aio_port *aio;
|
||||
|
||||
aio = cygnus_dai_get_dma_data(substream);
|
||||
|
@ -669,7 +669,7 @@ static int cygnus_pcm_hw_free(struct snd_soc_component *component,
|
|||
static int cygnus_pcm_prepare(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct cygnus_aio_port *aio;
|
||||
unsigned long bufsize, periodsize;
|
||||
|
@ -733,7 +733,7 @@ static snd_pcm_uframes_t cygnus_pcm_pointer(struct snd_soc_component *component,
|
|||
static int cygnus_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream)
|
||||
{
|
||||
struct snd_pcm_substream *substream = pcm->streams[stream].substream;
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_dma_buffer *buf = &substream->dma_buffer;
|
||||
size_t size;
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
static int edb93xx_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
|
||||
int err;
|
||||
|
|
|
@ -285,7 +285,7 @@ static int ep93xx_ac97_trigger(struct snd_pcm_substream *substream,
|
|||
/*
|
||||
* As per Cirrus EP93xx errata described below:
|
||||
*
|
||||
* http://www.cirrus.com/en/pubs/errata/ER667E2B.pdf
|
||||
* https://www.cirrus.com/en/pubs/errata/ER667E2B.pdf
|
||||
*
|
||||
* we will wait for the TX FIFO to be empty before
|
||||
* clearing the TEN bit.
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
static int snappercl15_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
|
||||
int err;
|
||||
|
|
|
@ -274,10 +274,10 @@ static int snd_soc_get_volsw_2r_st(struct snd_kcontrol *kcontrol,
|
|||
unsigned int reg2 = mc->rreg;
|
||||
int val[2], val2[2], i;
|
||||
|
||||
val[0] = snd_soc_component_read32(component, reg) & 0x3f;
|
||||
val[1] = (snd_soc_component_read32(component, PM860X_SIDETONE_SHIFT) >> 4) & 0xf;
|
||||
val2[0] = snd_soc_component_read32(component, reg2) & 0x3f;
|
||||
val2[1] = (snd_soc_component_read32(component, PM860X_SIDETONE_SHIFT)) & 0xf;
|
||||
val[0] = snd_soc_component_read(component, reg) & 0x3f;
|
||||
val[1] = (snd_soc_component_read(component, PM860X_SIDETONE_SHIFT) >> 4) & 0xf;
|
||||
val2[0] = snd_soc_component_read(component, reg2) & 0x3f;
|
||||
val2[1] = (snd_soc_component_read(component, PM860X_SIDETONE_SHIFT)) & 0xf;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(st_table); i++) {
|
||||
if ((st_table[i].m == val[0]) && (st_table[i].n == val[1]))
|
||||
|
@ -333,8 +333,8 @@ static int snd_soc_get_volsw_2r_out(struct snd_kcontrol *kcontrol,
|
|||
int max = mc->max, val, val2;
|
||||
unsigned int mask = (1 << fls(max)) - 1;
|
||||
|
||||
val = snd_soc_component_read32(component, reg) >> shift;
|
||||
val2 = snd_soc_component_read32(component, reg2) >> shift;
|
||||
val = snd_soc_component_read(component, reg) >> shift;
|
||||
val2 = snd_soc_component_read(component, reg2) >> shift;
|
||||
ucontrol->value.integer.value[0] = (max - val) & mask;
|
||||
ucontrol->value.integer.value[1] = (max - val2) & mask;
|
||||
|
||||
|
@ -426,7 +426,7 @@ static int pm860x_dac_event(struct snd_soc_dapm_widget *w,
|
|||
snd_soc_component_update_bits(component, PM860X_EAR_CTRL_2,
|
||||
RSYNC_CHANGE, RSYNC_CHANGE);
|
||||
/* update dac */
|
||||
data = snd_soc_component_read32(component, PM860X_DAC_EN_2);
|
||||
data = snd_soc_component_read(component, PM860X_DAC_EN_2);
|
||||
data &= ~dac;
|
||||
if (!(data & (DAC_LEFT | DAC_RIGHT)))
|
||||
data &= ~MODULATOR;
|
||||
|
@ -902,7 +902,7 @@ static const struct snd_soc_dapm_route pm860x_dapm_routes[] = {
|
|||
* Use MUTE_LEFT & MUTE_RIGHT to implement digital mute.
|
||||
* These bits can also be used to mute.
|
||||
*/
|
||||
static int pm860x_digital_mute(struct snd_soc_dai *codec_dai, int mute)
|
||||
static int pm860x_mute_stream(struct snd_soc_dai *codec_dai, int mute, int direction)
|
||||
{
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
int data = 0, mask = MUTE_LEFT | MUTE_RIGHT;
|
||||
|
@ -1136,17 +1136,19 @@ static int pm860x_set_bias_level(struct snd_soc_component *component,
|
|||
}
|
||||
|
||||
static const struct snd_soc_dai_ops pm860x_pcm_dai_ops = {
|
||||
.digital_mute = pm860x_digital_mute,
|
||||
.mute_stream = pm860x_mute_stream,
|
||||
.hw_params = pm860x_pcm_hw_params,
|
||||
.set_fmt = pm860x_pcm_set_dai_fmt,
|
||||
.set_sysclk = pm860x_set_dai_sysclk,
|
||||
.no_capture_mute = 1,
|
||||
};
|
||||
|
||||
static const struct snd_soc_dai_ops pm860x_i2s_dai_ops = {
|
||||
.digital_mute = pm860x_digital_mute,
|
||||
.mute_stream = pm860x_mute_stream,
|
||||
.hw_params = pm860x_i2s_hw_params,
|
||||
.set_fmt = pm860x_i2s_set_dai_fmt,
|
||||
.set_sysclk = pm860x_set_dai_sysclk,
|
||||
.no_capture_mute = 1,
|
||||
};
|
||||
|
||||
#define PM860X_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | \
|
||||
|
|
|
@ -115,7 +115,8 @@ config SND_SOC_ALL_CODECS
|
|||
imply SND_SOC_MAX98925
|
||||
imply SND_SOC_MAX98926
|
||||
imply SND_SOC_MAX98927
|
||||
imply SND_SOC_MAX98373
|
||||
imply SND_SOC_MAX98373_I2C
|
||||
imply SND_SOC_MAX98373_SDW
|
||||
imply SND_SOC_MAX98390
|
||||
imply SND_SOC_MAX9850
|
||||
imply SND_SOC_MAX9860
|
||||
|
@ -868,8 +869,25 @@ config SND_SOC_MAX98927
|
|||
depends on I2C
|
||||
|
||||
config SND_SOC_MAX98373
|
||||
tristate
|
||||
|
||||
config SND_SOC_MAX98373_I2C
|
||||
tristate "Maxim Integrated MAX98373 Speaker Amplifier"
|
||||
depends on I2C
|
||||
select SND_SOC_MAX98373
|
||||
|
||||
config SND_SOC_MAX98373_SDW
|
||||
tristate "Maxim Integrated MAX98373 Speaker Amplifier - SDW"
|
||||
depends on SOUNDWIRE
|
||||
select SND_SOC_MAX98373
|
||||
select REGMAP_SOUNDWIRE
|
||||
help
|
||||
Enable support for Maxim Integrated MAX98373 Soundwire
|
||||
amplifier. MAX98373 supports either the MIPI SoundWire
|
||||
compatible interface for audio and control data, or
|
||||
the PCM interface for audio data and a standard I2C
|
||||
interface for control data. Select this if MAX98373 is
|
||||
connected via soundwire.
|
||||
|
||||
config SND_SOC_MAX98390
|
||||
tristate "Maxim Integrated MAX98390 Speaker Amplifier"
|
||||
|
|
|
@ -115,6 +115,8 @@ snd-soc-max98925-objs := max98925.o
|
|||
snd-soc-max98926-objs := max98926.o
|
||||
snd-soc-max98927-objs := max98927.o
|
||||
snd-soc-max98373-objs := max98373.o
|
||||
snd-soc-max98373-i2c-objs := max98373-i2c.o
|
||||
snd-soc-max98373-sdw-objs := max98373-sdw.o
|
||||
snd-soc-max98390-objs := max98390.o
|
||||
snd-soc-max9850-objs := max9850.o
|
||||
snd-soc-max9860-objs := max9860.o
|
||||
|
@ -418,6 +420,8 @@ obj-$(CONFIG_SND_SOC_MAX98925) += snd-soc-max98925.o
|
|||
obj-$(CONFIG_SND_SOC_MAX98926) += snd-soc-max98926.o
|
||||
obj-$(CONFIG_SND_SOC_MAX98927) += snd-soc-max98927.o
|
||||
obj-$(CONFIG_SND_SOC_MAX98373) += snd-soc-max98373.o
|
||||
obj-$(CONFIG_SND_SOC_MAX98373_I2C) += snd-soc-max98373-i2c.o
|
||||
obj-$(CONFIG_SND_SOC_MAX98373_SDW) += snd-soc-max98373-sdw.o
|
||||
obj-$(CONFIG_SND_SOC_MAX98390) += snd-soc-max98390.o
|
||||
obj-$(CONFIG_SND_SOC_MAX9850) += snd-soc-max9850.o
|
||||
obj-$(CONFIG_SND_SOC_MAX9860) += snd-soc-max9860.o
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче