mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
ASoC: Updates for v6.7
This is quite a large set of changes but mostly due to API cleanups and in driver specific ways rather than due to anything subsystem wide. Highlights include: - Standardisation of API prefixes on snd_soc_, removing asoc_. - GPIO API usage improvements. - Support for HDA patches. - Lots of work on SOF, including crash dump support. - Support for AMD platforms with es83xx, Awinc AT87390, many Intel platforms, many Mediatek platforms, Qualcomm SM6115, Richtek RTQ9128 and Texas Instruments TAS575x. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAmUy6X8ACgkQJNaLcl1U h9Cv7Qf+PO4ucl/rFITWAp2Ta9fw7Z5J6UCiXiR54TPgAiLJrpKSi3rbYTXjO90Y 1NNOdoMKr109zdOpdSZI7EX0GgWQbGbdB40nxESdTcojAloRH0jt4RaF7G7B7+86 b8PGlVPLLV/4zFf9f2gpEKPcKhRRRKYOBIEB+amfjWpdXVrqPD3zS/S16Q3Hn4Gy Fx9b9X/lVDG9uqJomHpunEdViZjkm5CCNzdyAhHH99afiqSe//pevx6/FpzAHyng AZgE9Yfq4Xw4pdzDdGVfYC+L1GZiHIDRzsusz6aPA5nrMhSn0ru8PMGtmQQTzyhb PLYw0OW8cWymfqwal8wrNGJfSZ8IGA== =lN5P -----END PGP SIGNATURE----- Merge tag 'asoc-v6.7' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-next ASoC: Updates for v6.7 This is quite a large set of changes but mostly due to API cleanups and in driver specific ways rather than due to anything subsystem wide. Highlights include: - Standardisation of API prefixes on snd_soc_, removing asoc_. - GPIO API usage improvements. - Support for HDA patches. - Lots of work on SOF, including crash dump support. - Support for AMD platforms with es83xx, Awinc AT87390, many Intel platforms, many Mediatek platforms, Qualcomm SM6115, Richtek RTQ9128 and Texas Instruments TAS575x. [ the merge conflicts around SOF Intel HD-audio and CS35L41 subcodec drivers are resolved here -- tiwai ]
This commit is contained in:
commit
39cd06e3f7
@ -13,19 +13,17 @@ select: false
|
||||
|
||||
definitions:
|
||||
port-base:
|
||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||
allOf:
|
||||
- $ref: /schemas/graph.yaml#/$defs/port-base
|
||||
- $ref: /schemas/sound/dai-params.yaml#
|
||||
properties:
|
||||
convert-rate:
|
||||
$ref: /schemas/sound/dai-params.yaml#/$defs/dai-sample-rate
|
||||
convert-channels:
|
||||
$ref: /schemas/sound/dai-params.yaml#/$defs/dai-channels
|
||||
convert-sample-format:
|
||||
$ref: /schemas/sound/dai-params.yaml#/$defs/dai-sample-format
|
||||
mclk-fs:
|
||||
$ref: simple-card.yaml#/definitions/mclk-fs
|
||||
|
||||
endpoint-base:
|
||||
$ref: /schemas/graph.yaml#/$defs/endpoint-base
|
||||
allOf:
|
||||
- $ref: /schemas/graph.yaml#/$defs/endpoint-base
|
||||
- $ref: /schemas/sound/dai-params.yaml#
|
||||
properties:
|
||||
mclk-fs:
|
||||
$ref: simple-card.yaml#/definitions/mclk-fs
|
||||
@ -68,12 +66,6 @@ definitions:
|
||||
- pdm
|
||||
- msb
|
||||
- lsb
|
||||
convert-rate:
|
||||
$ref: /schemas/sound/dai-params.yaml#/$defs/dai-sample-rate
|
||||
convert-channels:
|
||||
$ref: /schemas/sound/dai-params.yaml#/$defs/dai-channels
|
||||
convert-sample-format:
|
||||
$ref: /schemas/sound/dai-params.yaml#/$defs/dai-sample-format
|
||||
|
||||
dai-tdm-slot-num:
|
||||
description: Number of slots in use.
|
||||
|
@ -9,6 +9,9 @@ title: Audio Graph
|
||||
maintainers:
|
||||
- Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/sound/dai-params.yaml#
|
||||
|
||||
properties:
|
||||
dais:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
@ -30,12 +33,6 @@ properties:
|
||||
widget ("Microphone", "Line", "Headphone", "Speaker"), the
|
||||
second being the machine specific name for the widget.
|
||||
$ref: /schemas/types.yaml#/definitions/non-unique-string-array
|
||||
convert-rate:
|
||||
$ref: /schemas/sound/dai-params.yaml#/$defs/dai-sample-rate
|
||||
convert-channels:
|
||||
$ref: /schemas/sound/dai-params.yaml#/$defs/dai-channels
|
||||
convert-sample-format:
|
||||
$ref: /schemas/sound/dai-params.yaml#/$defs/dai-sample-format
|
||||
|
||||
pa-gpios:
|
||||
maxItems: 1
|
||||
|
58
Documentation/devicetree/bindings/sound/awinic,aw87390.yaml
Normal file
58
Documentation/devicetree/bindings/sound/awinic,aw87390.yaml
Normal file
@ -0,0 +1,58 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/awinic,aw87390.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Awinic Aw87390 Audio Amplifier
|
||||
|
||||
maintainers:
|
||||
- Weidong Wang <wangweidong.a@awinic.com>
|
||||
|
||||
description:
|
||||
The awinic aw87390 is specifically designed to improve
|
||||
the musical output dynamic range, enhance the overall
|
||||
sound quallity, which is a new high efficiency, low
|
||||
noise, constant large volume, 6th Smart K audio amplifier.
|
||||
|
||||
allOf:
|
||||
- $ref: dai-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: awinic,aw87390
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
"#sound-dai-cells":
|
||||
const: 0
|
||||
|
||||
awinic,audio-channel:
|
||||
description:
|
||||
It is used to distinguish multiple PA devices, so that different
|
||||
configurations can be loaded to different PA devices
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
minimum: 0
|
||||
maximum: 7
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- "#sound-dai-cells"
|
||||
- awinic,audio-channel
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
audio-codec@58 {
|
||||
compatible = "awinic,aw87390";
|
||||
reg = <0x58>;
|
||||
#sound-dai-cells = <0>;
|
||||
awinic,audio-channel = <0>;
|
||||
};
|
||||
};
|
@ -14,9 +14,6 @@ description:
|
||||
digital Smart K audio amplifier with an integrated 10.25V
|
||||
smart boost convert.
|
||||
|
||||
allOf:
|
||||
- $ref: dai-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
@ -32,11 +29,36 @@ properties:
|
||||
reset-gpios:
|
||||
maxItems: 1
|
||||
|
||||
awinic,audio-channel:
|
||||
description:
|
||||
It is used to distinguish multiple PA devices, so that different
|
||||
configurations can be loaded to different PA devices
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
minimum: 0
|
||||
maximum: 7
|
||||
|
||||
awinic,sync-flag:
|
||||
description:
|
||||
Flag bit used to keep the phase synchronized in the case of multiple PA
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- '#sound-dai-cells'
|
||||
- reset-gpios
|
||||
- awinic,audio-channel
|
||||
|
||||
allOf:
|
||||
- $ref: dai-common.yaml#
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- awinic,aw88261
|
||||
then:
|
||||
properties:
|
||||
reset-gpios: false
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
@ -51,5 +73,7 @@ examples:
|
||||
reg = <0x34>;
|
||||
#sound-dai-cells = <0>;
|
||||
reset-gpios = <&gpio 10 GPIO_ACTIVE_LOW>;
|
||||
awinic,audio-channel = <0>;
|
||||
awinic,sync-flag;
|
||||
};
|
||||
};
|
||||
|
@ -83,7 +83,7 @@ properties:
|
||||
Current at which the headset micbias sense clamp will engage, 0 to
|
||||
disable.
|
||||
enum: [ 0, 14, 24, 43, 52, 61, 71, 90, 99 ]
|
||||
default: 0
|
||||
default: 14
|
||||
|
||||
cirrus,bias-ramp-ms:
|
||||
description:
|
||||
@ -97,7 +97,7 @@ properties:
|
||||
Time in microseconds the type detection will run for. Long values will
|
||||
cause more audible effects, but give more accurate detection.
|
||||
enum: [ 20, 100, 1000, 10000, 50000, 75000, 100000, 200000 ]
|
||||
default: 10000
|
||||
default: 1000
|
||||
|
||||
cirrus,button-automute:
|
||||
type: boolean
|
||||
|
@ -11,15 +11,14 @@ maintainers:
|
||||
|
||||
select: false
|
||||
|
||||
$defs:
|
||||
|
||||
dai-channels:
|
||||
properties:
|
||||
convert-channels:
|
||||
description: Number of audio channels used by DAI
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
minimum: 1
|
||||
maximum: 32
|
||||
|
||||
dai-sample-format:
|
||||
convert-sample-format:
|
||||
description: Audio sample format used by DAI
|
||||
$ref: /schemas/types.yaml#/definitions/string
|
||||
enum:
|
||||
@ -29,12 +28,10 @@ $defs:
|
||||
- s24_3le
|
||||
- s32_le
|
||||
|
||||
dai-sample-rate:
|
||||
convert-rate:
|
||||
description: Audio sample rate used by DAI
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
minimum: 8000
|
||||
maximum: 192000
|
||||
|
||||
properties: {}
|
||||
|
||||
additionalProperties: true
|
||||
|
@ -89,6 +89,7 @@ properties:
|
||||
|
||||
da7219_aad:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
description:
|
||||
Configuration of advanced accessory detection.
|
||||
properties:
|
||||
|
@ -33,6 +33,7 @@ patternProperties:
|
||||
description:
|
||||
A DAI managed by this controller
|
||||
type: object
|
||||
additionalProperties: false
|
||||
|
||||
properties:
|
||||
reg:
|
||||
|
@ -17,6 +17,7 @@ properties:
|
||||
enum:
|
||||
- mediatek,mt8188-mt6359-evb
|
||||
- mediatek,mt8188-nau8825
|
||||
- mediatek,mt8188-rt5682s
|
||||
|
||||
audio-routing:
|
||||
description:
|
||||
|
@ -17,6 +17,7 @@ properties:
|
||||
enum:
|
||||
- mediatek,mt8186-mt6366-rt1019-rt5682s-sound
|
||||
- mediatek,mt8186-mt6366-rt5682s-max98360-sound
|
||||
- mediatek,mt8186-mt6366-rt5650-sound
|
||||
|
||||
mediatek,platform:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
|
44
Documentation/devicetree/bindings/sound/nxp,tfa9879.yaml
Normal file
44
Documentation/devicetree/bindings/sound/nxp,tfa9879.yaml
Normal file
@ -0,0 +1,44 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/nxp,tfa9879.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: NXP TFA9879 class-D audio amplifier
|
||||
|
||||
maintainers:
|
||||
- Peter Rosin <peda@axentia.se>
|
||||
|
||||
allOf:
|
||||
- $ref: dai-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: nxp,tfa9879
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
"#sound-dai-cells":
|
||||
const: 0
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- '#sound-dai-cells'
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c1 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
amplifier@6c {
|
||||
compatible = "nxp,tfa9879";
|
||||
reg = <0x6c>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c1>;
|
||||
#sound-dai-cells = <0>;
|
||||
};
|
||||
};
|
@ -1,12 +1,12 @@
|
||||
PCM512x audio CODECs
|
||||
PCM512x and TAS575x audio CODECs/amplifiers
|
||||
|
||||
These devices support both I2C and SPI (configured with pin strapping
|
||||
on the board).
|
||||
on the board). The TAS575x devices only support I2C.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : One of "ti,pcm5121", "ti,pcm5122", "ti,pcm5141" or
|
||||
"ti,pcm5142"
|
||||
- compatible : One of "ti,pcm5121", "ti,pcm5122", "ti,pcm5141",
|
||||
"ti,pcm5142", "ti,tas5754" or "ti,tas5756"
|
||||
|
||||
- reg : the I2C address of the device for I2C, the chip select
|
||||
number for SPI.
|
||||
@ -25,6 +25,7 @@ Optional properties:
|
||||
through <6>. The device will be configured for clock input on the
|
||||
given pll-in pin and PLL output on the given pll-out pin. An
|
||||
external connection from the pll-out pin to the SCLK pin is assumed.
|
||||
Caution: the TAS-desvices only support gpios 1,2 and 3
|
||||
|
||||
Examples:
|
||||
|
||||
|
@ -13,6 +13,7 @@ properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,sc7280-lpass-tx-macro
|
||||
- qcom,sm6115-lpass-tx-macro
|
||||
- qcom,sm8250-lpass-tx-macro
|
||||
- qcom,sm8450-lpass-tx-macro
|
||||
- qcom,sm8550-lpass-tx-macro
|
||||
@ -97,6 +98,23 @@ allOf:
|
||||
- const: dcodec
|
||||
- const: fsgen
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,sm6115-lpass-tx-macro
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
minItems: 4
|
||||
maxItems: 4
|
||||
clock-names:
|
||||
items:
|
||||
- const: mclk
|
||||
- const: npl
|
||||
- const: dcodec
|
||||
- const: fsgen
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
|
49
Documentation/devicetree/bindings/sound/realtek,rt5616.yaml
Normal file
49
Documentation/devicetree/bindings/sound/realtek,rt5616.yaml
Normal file
@ -0,0 +1,49 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/realtek,rt5616.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Realtek rt5616 ALSA SoC audio codec driver
|
||||
|
||||
description: |
|
||||
Pins on the device (for linking into audio routes) for RT5616:
|
||||
|
||||
* IN1P
|
||||
* IN2P
|
||||
* IN2N
|
||||
* LOUTL
|
||||
* LOUTR
|
||||
* HPOL
|
||||
* HPOR
|
||||
|
||||
maintainers:
|
||||
- Bard Liao <bardliao@realtek.com>
|
||||
|
||||
allOf:
|
||||
- $ref: dai-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: realtek,rt5616
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
audio-codec@1b {
|
||||
compatible = "realtek,rt5616";
|
||||
reg = <0x1b>;
|
||||
};
|
||||
};
|
61
Documentation/devicetree/bindings/sound/richtek,rtq9128.yaml
Normal file
61
Documentation/devicetree/bindings/sound/richtek,rtq9128.yaml
Normal file
@ -0,0 +1,61 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/richtek,rtq9128.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Richtek RTQ9128 Automative Audio Power Amplifier
|
||||
|
||||
maintainers:
|
||||
- ChiYuan Huang <cy_huang@richtek.com>
|
||||
|
||||
description:
|
||||
The RTQ9128 is a ultra-low output noise, high-efficiency, four-channel
|
||||
class-D audio power amplifier and delivering 4x75W into 4OHm at 10%
|
||||
THD+N from a 25V supply in automotive applications.
|
||||
|
||||
allOf:
|
||||
- $ref: dai-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- richtek,rtq9128
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
enable-gpios:
|
||||
maxItems: 1
|
||||
|
||||
richtek,tdm-input-data2-select:
|
||||
type: boolean
|
||||
description:
|
||||
By default, if TDM mode is used, TDM data input will select 'DATA1' pin
|
||||
as the data source. This option will configure TDM data input source from
|
||||
'DATA1' to 'DATA2' pin.
|
||||
|
||||
'#sound-dai-cells':
|
||||
const: 0
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- '#sound-dai-cells'
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
speaker@1a {
|
||||
compatible = "richtek,rtq9128";
|
||||
reg = <0x1a>;
|
||||
enable-gpios = <&gpio 26 GPIO_ACTIVE_HIGH>;
|
||||
#sound-dai-cells = <0>;
|
||||
};
|
||||
};
|
@ -1,32 +0,0 @@
|
||||
RT5616 audio CODEC
|
||||
|
||||
This device supports I2C only.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : "realtek,rt5616".
|
||||
|
||||
- reg : The I2C address of the device.
|
||||
|
||||
Optional properties:
|
||||
|
||||
- clocks: The phandle of the master clock to the CODEC.
|
||||
|
||||
- clock-names: Should be "mclk".
|
||||
|
||||
Pins on the device (for linking into audio routes) for RT5616:
|
||||
|
||||
* IN1P
|
||||
* IN2P
|
||||
* IN2N
|
||||
* LOUTL
|
||||
* LOUTR
|
||||
* HPOL
|
||||
* HPOR
|
||||
|
||||
Example:
|
||||
|
||||
rt5616: codec@1b {
|
||||
compatible = "realtek,rt5616";
|
||||
reg = <0x1b>;
|
||||
};
|
@ -0,0 +1,76 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/sound/starfive,jh7110-pwmdac.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: StarFive JH7110 PWM-DAC Controller
|
||||
|
||||
description:
|
||||
The PWM-DAC Controller uses PWM square wave generators plus RC filters to
|
||||
form a DAC for audio play in StarFive JH7110 SoC. This audio play controller
|
||||
supports 16 bit audio format, up to 48K sampling frequency, up to left and
|
||||
right dual channels.
|
||||
|
||||
maintainers:
|
||||
- Hal Feng <hal.feng@starfivetech.com>
|
||||
|
||||
allOf:
|
||||
- $ref: dai-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: starfive,jh7110-pwmdac
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: PWMDAC APB
|
||||
- description: PWMDAC CORE
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: apb
|
||||
- const: core
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
description: PWMDAC APB
|
||||
|
||||
dmas:
|
||||
maxItems: 1
|
||||
description: TX DMA Channel
|
||||
|
||||
dma-names:
|
||||
const: tx
|
||||
|
||||
"#sound-dai-cells":
|
||||
const: 0
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- clock-names
|
||||
- resets
|
||||
- dmas
|
||||
- dma-names
|
||||
- "#sound-dai-cells"
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
pwmdac@100b0000 {
|
||||
compatible = "starfive,jh7110-pwmdac";
|
||||
reg = <0x100b0000 0x1000>;
|
||||
clocks = <&syscrg 157>,
|
||||
<&syscrg 158>;
|
||||
clock-names = "apb", "core";
|
||||
resets = <&syscrg 96>;
|
||||
dmas = <&dma 22>;
|
||||
dma-names = "tx";
|
||||
#sound-dai-cells = <0>;
|
||||
};
|
@ -37,6 +37,8 @@ properties:
|
||||
generated from TI's PPC3 tool.
|
||||
$ref: /schemas/types.yaml#/definitions/string
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
@ -52,5 +54,4 @@ examples:
|
||||
ti,dsp-config-name = "mono_pbtl_48khz";
|
||||
};
|
||||
};
|
||||
|
||||
additionalProperties: true
|
||||
...
|
||||
|
@ -1,23 +0,0 @@
|
||||
NXP TFA9879 class-D audio amplifier
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : "nxp,tfa9879"
|
||||
|
||||
- reg : the I2C address of the device
|
||||
|
||||
- #sound-dai-cells : must be 0.
|
||||
|
||||
Example:
|
||||
|
||||
&i2c1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c1>;
|
||||
|
||||
amp: amp@6c {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "nxp,tfa9879";
|
||||
reg = <0x6c>;
|
||||
};
|
||||
};
|
||||
|
@ -60,6 +60,7 @@ properties:
|
||||
|
||||
ports:
|
||||
$ref: audio-graph-port.yaml#/definitions/port-base
|
||||
unevaluatedProperties: false
|
||||
properties:
|
||||
port@0:
|
||||
$ref: audio-graph-port.yaml#
|
||||
|
@ -8,10 +8,17 @@ Required properties:
|
||||
- Vdda-supply : phandle to a regulator for the analog power supply (2.7V - 5.5V)
|
||||
- Vdd-supply : phandle to a regulator for the digital power supply (2.7V - 3.6V)
|
||||
|
||||
Optional properties:
|
||||
|
||||
- wlf,fsampen:
|
||||
FSAMPEN pin value, 0 for low, 1 for high, 2 for disconnected.
|
||||
Defaults to 0 if left unspecified.
|
||||
|
||||
Example:
|
||||
|
||||
wm8782: stereo-adc {
|
||||
compatible = "wlf,wm8782";
|
||||
Vdda-supply = <&vdda_supply>;
|
||||
Vdd-supply = <&vdd_supply>;
|
||||
wlf,fsampen = <2>; /* 192KHz */
|
||||
};
|
||||
|
@ -70,7 +70,8 @@ file:
|
||||
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
|
||||
| SND_SOC_DAIFMT_CBM_CFM,
|
||||
.ignore_suspend = 1,
|
||||
.params = &dsp_codec_params,
|
||||
.c2c_params = &dsp_codec_params,
|
||||
.num_c2c_params = 1,
|
||||
},
|
||||
{
|
||||
.name = "DSP-CODEC",
|
||||
@ -81,12 +82,13 @@ file:
|
||||
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
|
||||
| SND_SOC_DAIFMT_CBM_CFM,
|
||||
.ignore_suspend = 1,
|
||||
.params = &dsp_codec_params,
|
||||
.c2c_params = &dsp_codec_params,
|
||||
.num_c2c_params = 1,
|
||||
},
|
||||
|
||||
Above code snippet is motivated from sound/soc/samsung/speyside.c.
|
||||
|
||||
Note the "params" callback which lets the dapm know that this
|
||||
Note the "c2c_params" callback which lets the dapm know that this
|
||||
dai_link is a codec to codec connection.
|
||||
|
||||
In dapm core a route is created between cpu_dai playback widget
|
||||
|
@ -368,7 +368,8 @@ The machine driver sets some additional parameters to the DAI link i.e.
|
||||
.codec_name = "modem",
|
||||
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
|
||||
| SND_SOC_DAIFMT_CBM_CFM,
|
||||
.params = &dai_params,
|
||||
.c2c_params = &dai_params,
|
||||
.num_c2c_params = 1,
|
||||
}
|
||||
< ... more DAI links here ... >
|
||||
|
||||
|
13
MAINTAINERS
13
MAINTAINERS
@ -15424,7 +15424,7 @@ NXP TFA9879 DRIVER
|
||||
M: Peter Rosin <peda@axentia.se>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/sound/tfa9879.txt
|
||||
F: Documentation/devicetree/bindings/sound/nxp,tfa9879.yaml
|
||||
F: sound/soc/codecs/tfa9879*
|
||||
|
||||
NXP-NCI NFC DRIVER
|
||||
@ -20114,6 +20114,10 @@ F: Documentation/devicetree/bindings/sound/
|
||||
F: Documentation/sound/soc/
|
||||
F: include/dt-bindings/sound/
|
||||
F: include/sound/soc*
|
||||
F: include/sound/sof.h
|
||||
F: include/sound/sof/
|
||||
F: include/trace/events/sof*.h
|
||||
F: include/uapi/sound/asoc.h
|
||||
F: sound/soc/
|
||||
|
||||
SOUND - SOUND OPEN FIRMWARE (SOF) DRIVERS
|
||||
@ -20467,6 +20471,13 @@ S: Supported
|
||||
F: Documentation/devicetree/bindings/clock/starfive,jh7110-pll.yaml
|
||||
F: drivers/clk/starfive/clk-starfive-jh7110-pll.c
|
||||
|
||||
STARFIVE JH7110 PWMDAC DRIVER
|
||||
M: Hal Feng <hal.feng@starfivetech.com>
|
||||
M: Xingyu Wu <xingyu.wu@starfivetech.com>
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/sound/starfive,jh7110-pwmdac.yaml
|
||||
F: sound/soc/starfive/jh7110_pwmdac.c
|
||||
|
||||
STARFIVE JH7110 SYSCON
|
||||
M: William Qiu <william.qiu@starfivetech.com>
|
||||
M: Xingyu Wu <xingyu.wu@starfivetech.com>
|
||||
|
@ -498,6 +498,15 @@ struct menelaus_platform_data n8x0_menelaus_platform_data = {
|
||||
.late_init = n8x0_menelaus_late_init,
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table nokia810_asoc_gpio_table = {
|
||||
.dev_id = "soc-audio",
|
||||
.table = {
|
||||
GPIO_LOOKUP("gpio-0-15", 10, "headset", GPIO_ACTIVE_HIGH),
|
||||
GPIO_LOOKUP("gpio-80-111", 21, "speaker", GPIO_ACTIVE_HIGH),
|
||||
{ }
|
||||
},
|
||||
};
|
||||
|
||||
static int __init n8x0_late_initcall(void)
|
||||
{
|
||||
if (!board_caps)
|
||||
@ -505,6 +514,7 @@ static int __init n8x0_late_initcall(void)
|
||||
|
||||
n8x0_mmc_init();
|
||||
n8x0_usb_init();
|
||||
gpiod_add_lookup_table(&nokia810_asoc_gpio_table);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -275,9 +275,19 @@ static struct platform_device pandora_backlight = {
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table pandora_soc_audio_gpios = {
|
||||
.dev_id = "soc-audio",
|
||||
.table = {
|
||||
GPIO_LOOKUP("gpio-112-127", 6, "dac", GPIO_ACTIVE_HIGH),
|
||||
GPIO_LOOKUP("gpio-0-15", 14, "amp", GPIO_ACTIVE_HIGH),
|
||||
{ }
|
||||
},
|
||||
};
|
||||
|
||||
static void __init omap3_pandora_legacy_init(void)
|
||||
{
|
||||
platform_device_register(&pandora_backlight);
|
||||
gpiod_add_lookup_table(&pandora_soc_audio_gpios);
|
||||
}
|
||||
#endif /* CONFIG_ARCH_OMAP3 */
|
||||
|
||||
|
@ -881,7 +881,7 @@ static struct platform_device fsi_device = {
|
||||
.resource = fsi_resources,
|
||||
};
|
||||
|
||||
static struct asoc_simple_card_info fsi_da7210_info = {
|
||||
static struct simple_util_info fsi_da7210_info = {
|
||||
.name = "DA7210",
|
||||
.card = "FSIB-DA7210",
|
||||
.codec = "da7210.0-001a",
|
||||
|
@ -300,7 +300,7 @@ static struct platform_device fsi_device = {
|
||||
.resource = fsi_resources,
|
||||
};
|
||||
|
||||
static struct asoc_simple_card_info fsi_ak4642_info = {
|
||||
static struct simple_util_info fsi_ak4642_info = {
|
||||
.name = "AK4642",
|
||||
.card = "FSIA-AK4642",
|
||||
.codec = "ak4642-codec.0-0012",
|
||||
|
@ -512,6 +512,10 @@ static struct gpio_desc *of_find_gpio_rename(struct device_node *np,
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_CS42L56)
|
||||
{ "reset", "cirrus,gpio-nreset", "cirrus,cs42l56" },
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_MT2701_CS42448)
|
||||
{ "i2s1-in-sel-gpio1", NULL, "mediatek,mt2701-cs42448-machine" },
|
||||
{ "i2s1-in-sel-gpio2", NULL, "mediatek,mt2701-cs42448-machine" },
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_TLV320AIC3X)
|
||||
{ "reset", "gpio-reset", "ti,tlv320aic3x" },
|
||||
{ "reset", "gpio-reset", "ti,tlv320aic33" },
|
||||
|
@ -759,7 +759,7 @@ static int intel_prepare(struct snd_pcm_substream *substream,
|
||||
}
|
||||
|
||||
if (dai_runtime->suspended) {
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_pcm_hw_params *hw_params;
|
||||
|
||||
hw_params = &rtd->dpcm[substream->stream].hw_params;
|
||||
|
@ -327,7 +327,7 @@ static int intel_prepare(struct snd_pcm_substream *substream,
|
||||
}
|
||||
|
||||
if (dai_runtime->suspended) {
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_pcm_hw_params *hw_params;
|
||||
|
||||
hw_params = &rtd->dpcm[substream->stream].hw_params;
|
||||
|
@ -1819,7 +1819,7 @@ void sdw_shutdown_stream(void *sdw_substream)
|
||||
struct snd_soc_dai *dai;
|
||||
|
||||
/* Find stream from first CPU DAI */
|
||||
dai = asoc_rtd_to_cpu(rtd, 0);
|
||||
dai = snd_soc_rtd_to_cpu(rtd, 0);
|
||||
|
||||
sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
|
||||
|
||||
|
@ -37,9 +37,6 @@ struct omap_tw4030_pdata {
|
||||
bool has_digimic0;
|
||||
bool has_digimic1;
|
||||
u8 has_linein;
|
||||
|
||||
/* Jack detect GPIO or <= 0 if it is not implemented */
|
||||
int jack_detect;
|
||||
};
|
||||
|
||||
#endif /* _OMAP_TWL4030_H_ */
|
||||
|
@ -11,7 +11,6 @@
|
||||
#define __CS35L41_H
|
||||
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/firmware/cirrus/cs_dsp.h>
|
||||
|
||||
#define CS35L41_FIRSTREG 0x00000000
|
||||
@ -902,7 +901,8 @@ int cs35l41_exit_hibernate(struct device *dev, struct regmap *regmap);
|
||||
int cs35l41_init_boost(struct device *dev, struct regmap *regmap,
|
||||
struct cs35l41_hw_cfg *hw_cfg);
|
||||
bool cs35l41_safe_reset(struct regmap *regmap, enum cs35l41_boost_type b_type);
|
||||
int cs35l41_mdsync_up(struct regmap *regmap);
|
||||
int cs35l41_global_enable(struct device *dev, struct regmap *regmap, enum cs35l41_boost_type b_type,
|
||||
int enable, struct completion *pll_lock, bool firmware_running);
|
||||
int enable, bool firmware_running);
|
||||
|
||||
#endif /* __CS35L41_H */
|
||||
|
@ -242,9 +242,8 @@
|
||||
#define CS35L56_CONTROL_PORT_READY_US 2200
|
||||
#define CS35L56_HALO_STATE_POLL_US 1000
|
||||
#define CS35L56_HALO_STATE_TIMEOUT_US 50000
|
||||
#define CS35L56_HIBERNATE_WAKE_POLL_US 500
|
||||
#define CS35L56_HIBERNATE_WAKE_TIMEOUT_US 5000
|
||||
#define CS35L56_RESET_PULSE_MIN_US 1100
|
||||
#define CS35L56_WAKE_HOLD_TIME_US 1000
|
||||
|
||||
#define CS35L56_SDW1_PLAYBACK_PORT 1
|
||||
#define CS35L56_SDW1_CAPTURE_PORT 3
|
||||
|
@ -9,27 +9,27 @@
|
||||
|
||||
#include <sound/simple_card_utils.h>
|
||||
|
||||
typedef int (*GRAPH2_CUSTOM)(struct asoc_simple_priv *priv,
|
||||
typedef int (*GRAPH2_CUSTOM)(struct simple_util_priv *priv,
|
||||
struct device_node *lnk,
|
||||
struct link_info *li);
|
||||
|
||||
struct graph2_custom_hooks {
|
||||
int (*hook_pre)(struct asoc_simple_priv *priv);
|
||||
int (*hook_post)(struct asoc_simple_priv *priv);
|
||||
int (*hook_pre)(struct simple_util_priv *priv);
|
||||
int (*hook_post)(struct simple_util_priv *priv);
|
||||
GRAPH2_CUSTOM custom_normal;
|
||||
GRAPH2_CUSTOM custom_dpcm;
|
||||
GRAPH2_CUSTOM custom_c2c;
|
||||
};
|
||||
|
||||
int audio_graph_parse_of(struct asoc_simple_priv *priv, struct device *dev);
|
||||
int audio_graph2_parse_of(struct asoc_simple_priv *priv, struct device *dev,
|
||||
int audio_graph_parse_of(struct simple_util_priv *priv, struct device *dev);
|
||||
int audio_graph2_parse_of(struct simple_util_priv *priv, struct device *dev,
|
||||
struct graph2_custom_hooks *hooks);
|
||||
|
||||
int audio_graph2_link_normal(struct asoc_simple_priv *priv,
|
||||
int audio_graph2_link_normal(struct simple_util_priv *priv,
|
||||
struct device_node *lnk, struct link_info *li);
|
||||
int audio_graph2_link_dpcm(struct asoc_simple_priv *priv,
|
||||
int audio_graph2_link_dpcm(struct simple_util_priv *priv,
|
||||
struct device_node *lnk, struct link_info *li);
|
||||
int audio_graph2_link_c2c(struct asoc_simple_priv *priv,
|
||||
int audio_graph2_link_c2c(struct simple_util_priv *priv,
|
||||
struct device_node *lnk, struct link_info *li);
|
||||
|
||||
#endif /* __GRAPH_CARD_H */
|
||||
|
@ -9,14 +9,10 @@
|
||||
|
||||
/**
|
||||
* struct max9768_pdata - optional platform specific MAX9768 configuration
|
||||
* @shdn_gpio: GPIO to SHDN pin. If not valid, pin must be hardwired HIGH
|
||||
* @mute_gpio: GPIO to MUTE pin. If not valid, control for mute won't be added
|
||||
* @flags: configuration flags, e.g. set classic PWM mode (check datasheet
|
||||
* regarding "filterless modulation" which is default).
|
||||
*/
|
||||
struct max9768_pdata {
|
||||
int shdn_gpio;
|
||||
int mute_gpio;
|
||||
unsigned flags;
|
||||
#define MAX9768_FLAG_CLASSIC_PWM (1 << 0)
|
||||
};
|
||||
|
@ -12,15 +12,15 @@
|
||||
#include <sound/soc.h>
|
||||
#include <sound/simple_card_utils.h>
|
||||
|
||||
struct asoc_simple_card_info {
|
||||
struct simple_util_info {
|
||||
const char *name;
|
||||
const char *card;
|
||||
const char *codec;
|
||||
const char *platform;
|
||||
|
||||
unsigned int daifmt;
|
||||
struct asoc_simple_dai cpu_dai;
|
||||
struct asoc_simple_dai codec_dai;
|
||||
struct simple_util_dai cpu_dai;
|
||||
struct simple_util_dai codec_dai;
|
||||
};
|
||||
|
||||
#endif /* __SIMPLE_CARD_H */
|
||||
|
@ -11,18 +11,18 @@
|
||||
#include <linux/clk.h>
|
||||
#include <sound/soc.h>
|
||||
|
||||
#define asoc_simple_init_hp(card, sjack, 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, NULL)
|
||||
#define simple_util_init_hp(card, sjack, prefix) \
|
||||
simple_util_init_jack(card, sjack, 1, prefix, NULL)
|
||||
#define simple_util_init_mic(card, sjack, prefix) \
|
||||
simple_util_init_jack(card, sjack, 0, prefix, NULL)
|
||||
|
||||
struct asoc_simple_tdm_width_map {
|
||||
struct simple_util_tdm_width_map {
|
||||
u8 sample_bits;
|
||||
u8 slot_count;
|
||||
u16 slot_width;
|
||||
};
|
||||
|
||||
struct asoc_simple_dai {
|
||||
struct simple_util_dai {
|
||||
const char *name;
|
||||
unsigned int sysclk;
|
||||
int clk_direction;
|
||||
@ -32,17 +32,17 @@ struct asoc_simple_dai {
|
||||
unsigned int rx_slot_mask;
|
||||
struct clk *clk;
|
||||
bool clk_fixed;
|
||||
struct asoc_simple_tdm_width_map *tdm_width_map;
|
||||
struct simple_util_tdm_width_map *tdm_width_map;
|
||||
int n_tdm_widths;
|
||||
};
|
||||
|
||||
struct asoc_simple_data {
|
||||
struct simple_util_data {
|
||||
u32 convert_rate;
|
||||
u32 convert_channels;
|
||||
const char *convert_sample_format;
|
||||
};
|
||||
|
||||
struct asoc_simple_jack {
|
||||
struct simple_util_jack {
|
||||
struct snd_soc_jack jack;
|
||||
struct snd_soc_jack_pin pin;
|
||||
struct snd_soc_jack_gpio gpio;
|
||||
@ -54,21 +54,21 @@ struct prop_nums {
|
||||
int platforms;
|
||||
};
|
||||
|
||||
struct asoc_simple_priv {
|
||||
struct simple_util_priv {
|
||||
struct snd_soc_card snd_card;
|
||||
struct simple_dai_props {
|
||||
struct asoc_simple_dai *cpu_dai;
|
||||
struct asoc_simple_dai *codec_dai;
|
||||
struct asoc_simple_data adata;
|
||||
struct simple_util_dai *cpu_dai;
|
||||
struct simple_util_dai *codec_dai;
|
||||
struct simple_util_data adata;
|
||||
struct snd_soc_codec_conf *codec_conf;
|
||||
struct prop_nums num;
|
||||
unsigned int mclk_fs;
|
||||
} *dai_props;
|
||||
struct asoc_simple_jack hp_jack;
|
||||
struct asoc_simple_jack mic_jack;
|
||||
struct simple_util_jack hp_jack;
|
||||
struct simple_util_jack mic_jack;
|
||||
struct snd_soc_jack *aux_jacks;
|
||||
struct snd_soc_dai_link *dai_link;
|
||||
struct asoc_simple_dai *dais;
|
||||
struct simple_util_dai *dais;
|
||||
struct snd_soc_dai_link_component *dlcs;
|
||||
struct snd_soc_codec_conf *codec_conf;
|
||||
struct gpio_desc *pa_gpio;
|
||||
@ -130,75 +130,75 @@ struct link_info {
|
||||
struct prop_nums num[SNDRV_MAX_LINKS];
|
||||
};
|
||||
|
||||
int asoc_simple_parse_daifmt(struct device *dev,
|
||||
int simple_util_parse_daifmt(struct device *dev,
|
||||
struct device_node *node,
|
||||
struct device_node *codec,
|
||||
char *prefix,
|
||||
unsigned int *retfmt);
|
||||
int asoc_simple_parse_tdm_width_map(struct device *dev, struct device_node *np,
|
||||
struct asoc_simple_dai *dai);
|
||||
int simple_util_parse_tdm_width_map(struct device *dev, struct device_node *np,
|
||||
struct simple_util_dai *dai);
|
||||
|
||||
__printf(3, 4)
|
||||
int asoc_simple_set_dailink_name(struct device *dev,
|
||||
int simple_util_set_dailink_name(struct device *dev,
|
||||
struct snd_soc_dai_link *dai_link,
|
||||
const char *fmt, ...);
|
||||
int asoc_simple_parse_card_name(struct snd_soc_card *card,
|
||||
int simple_util_parse_card_name(struct snd_soc_card *card,
|
||||
char *prefix);
|
||||
|
||||
int asoc_simple_parse_clk(struct device *dev,
|
||||
int simple_util_parse_clk(struct device *dev,
|
||||
struct device_node *node,
|
||||
struct asoc_simple_dai *simple_dai,
|
||||
struct simple_util_dai *simple_dai,
|
||||
struct snd_soc_dai_link_component *dlc);
|
||||
int asoc_simple_startup(struct snd_pcm_substream *substream);
|
||||
void asoc_simple_shutdown(struct snd_pcm_substream *substream);
|
||||
int asoc_simple_hw_params(struct snd_pcm_substream *substream,
|
||||
int simple_util_startup(struct snd_pcm_substream *substream);
|
||||
void simple_util_shutdown(struct snd_pcm_substream *substream);
|
||||
int simple_util_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params);
|
||||
int asoc_simple_dai_init(struct snd_soc_pcm_runtime *rtd);
|
||||
int asoc_simple_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
int simple_util_dai_init(struct snd_soc_pcm_runtime *rtd);
|
||||
int simple_util_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_pcm_hw_params *params);
|
||||
|
||||
#define asoc_simple_parse_tdm(np, dai) \
|
||||
#define simple_util_parse_tdm(np, dai) \
|
||||
snd_soc_of_parse_tdm_slot(np, &(dai)->tx_slot_mask, \
|
||||
&(dai)->rx_slot_mask, \
|
||||
&(dai)->slots, \
|
||||
&(dai)->slot_width);
|
||||
|
||||
void asoc_simple_canonicalize_platform(struct snd_soc_dai_link_component *platforms,
|
||||
void simple_util_canonicalize_platform(struct snd_soc_dai_link_component *platforms,
|
||||
struct snd_soc_dai_link_component *cpus);
|
||||
void asoc_simple_canonicalize_cpu(struct snd_soc_dai_link_component *cpus,
|
||||
void simple_util_canonicalize_cpu(struct snd_soc_dai_link_component *cpus,
|
||||
int is_single_links);
|
||||
|
||||
void asoc_simple_clean_reference(struct snd_soc_card *card);
|
||||
void simple_util_clean_reference(struct snd_soc_card *card);
|
||||
|
||||
void asoc_simple_parse_convert(struct device_node *np, char *prefix,
|
||||
struct asoc_simple_data *data);
|
||||
bool asoc_simple_is_convert_required(const struct asoc_simple_data *data);
|
||||
void simple_util_parse_convert(struct device_node *np, char *prefix,
|
||||
struct simple_util_data *data);
|
||||
bool simple_util_is_convert_required(const struct simple_util_data *data);
|
||||
|
||||
int asoc_simple_parse_routing(struct snd_soc_card *card,
|
||||
int simple_util_parse_routing(struct snd_soc_card *card,
|
||||
char *prefix);
|
||||
int asoc_simple_parse_widgets(struct snd_soc_card *card,
|
||||
int simple_util_parse_widgets(struct snd_soc_card *card,
|
||||
char *prefix);
|
||||
int asoc_simple_parse_pin_switches(struct snd_soc_card *card,
|
||||
int simple_util_parse_pin_switches(struct snd_soc_card *card,
|
||||
char *prefix);
|
||||
|
||||
int asoc_simple_init_jack(struct snd_soc_card *card,
|
||||
struct asoc_simple_jack *sjack,
|
||||
int simple_util_init_jack(struct snd_soc_card *card,
|
||||
struct simple_util_jack *sjack,
|
||||
int is_hp, char *prefix, char *pin);
|
||||
int asoc_simple_init_aux_jacks(struct asoc_simple_priv *priv,
|
||||
int simple_util_init_aux_jacks(struct simple_util_priv *priv,
|
||||
char *prefix);
|
||||
int asoc_simple_init_priv(struct asoc_simple_priv *priv,
|
||||
int simple_util_init_priv(struct simple_util_priv *priv,
|
||||
struct link_info *li);
|
||||
int asoc_simple_remove(struct platform_device *pdev);
|
||||
int simple_util_remove(struct platform_device *pdev);
|
||||
|
||||
int asoc_graph_card_probe(struct snd_soc_card *card);
|
||||
int asoc_graph_is_ports0(struct device_node *port);
|
||||
int asoc_graph_parse_dai(struct device *dev, struct device_node *ep,
|
||||
int graph_util_card_probe(struct snd_soc_card *card);
|
||||
int graph_util_is_ports0(struct device_node *port);
|
||||
int graph_util_parse_dai(struct device *dev, struct device_node *ep,
|
||||
struct snd_soc_dai_link_component *dlc, int *is_single_link);
|
||||
|
||||
#ifdef DEBUG
|
||||
static inline void asoc_simple_debug_dai(struct asoc_simple_priv *priv,
|
||||
static inline void simple_util_debug_dai(struct simple_util_priv *priv,
|
||||
char *name,
|
||||
struct asoc_simple_dai *dai)
|
||||
struct simple_util_dai *dai)
|
||||
{
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
|
||||
@ -228,7 +228,7 @@ static inline void asoc_simple_debug_dai(struct asoc_simple_priv *priv,
|
||||
name, dai->clk_direction ? "OUT" : "IN");
|
||||
}
|
||||
|
||||
static inline void asoc_simple_debug_info(struct asoc_simple_priv *priv)
|
||||
static inline void simple_util_debug_info(struct simple_util_priv *priv)
|
||||
{
|
||||
struct snd_soc_card *card = simple_priv_to_card(priv);
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
@ -241,7 +241,7 @@ static inline void asoc_simple_debug_info(struct asoc_simple_priv *priv)
|
||||
for (i = 0; i < card->num_links; i++) {
|
||||
struct simple_dai_props *props = simple_priv_to_props(priv, i);
|
||||
struct snd_soc_dai_link *link = simple_priv_to_link(priv, i);
|
||||
struct asoc_simple_dai *dai;
|
||||
struct simple_util_dai *dai;
|
||||
struct snd_soc_codec_conf *cnf;
|
||||
int j;
|
||||
|
||||
@ -249,10 +249,10 @@ static inline void asoc_simple_debug_info(struct asoc_simple_priv *priv)
|
||||
|
||||
dev_dbg(dev, "cpu num = %d\n", link->num_cpus);
|
||||
for_each_prop_dai_cpu(props, j, dai)
|
||||
asoc_simple_debug_dai(priv, "cpu", dai);
|
||||
simple_util_debug_dai(priv, "cpu", dai);
|
||||
dev_dbg(dev, "codec num = %d\n", link->num_codecs);
|
||||
for_each_prop_dai_codec(props, j, dai)
|
||||
asoc_simple_debug_dai(priv, "codec", dai);
|
||||
simple_util_debug_dai(priv, "codec", dai);
|
||||
|
||||
if (link->name)
|
||||
dev_dbg(dev, "dai name = %s\n", link->name);
|
||||
@ -270,7 +270,7 @@ static inline void asoc_simple_debug_info(struct asoc_simple_priv *priv)
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define asoc_simple_debug_info(priv)
|
||||
#define simple_util_debug_info(priv)
|
||||
#endif /* DEBUG */
|
||||
|
||||
#endif /* __SIMPLE_CARD_UTILS_H */
|
||||
|
@ -32,6 +32,7 @@ extern struct snd_soc_acpi_mach snd_soc_acpi_intel_adl_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_rpl_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_mtl_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_lnl_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_arl_machines[];
|
||||
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_cnl_sdw_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_cfl_sdw_machines[];
|
||||
@ -42,6 +43,7 @@ extern struct snd_soc_acpi_mach snd_soc_acpi_intel_adl_sdw_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_rpl_sdw_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_mtl_sdw_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_lnl_sdw_machines[];
|
||||
extern struct snd_soc_acpi_mach snd_soc_acpi_intel_arl_sdw_machines[];
|
||||
|
||||
/*
|
||||
* generic table used for HDA codec-based platforms, possibly with
|
||||
|
@ -68,6 +68,10 @@ static inline struct snd_soc_acpi_mach *snd_soc_acpi_codec_list(void *arg)
|
||||
* @i2s_link_mask: I2S/TDM links enabled on the board
|
||||
* @num_dai_drivers: number of elements in @dai_drivers
|
||||
* @dai_drivers: pointer to dai_drivers, used e.g. in nocodec mode
|
||||
* @subsystem_vendor: optional PCI SSID vendor value
|
||||
* @subsystem_device: optional PCI SSID device value
|
||||
* @subsystem_id_set: true if a value has been written to
|
||||
* subsystem_vendor and subsystem_device.
|
||||
*/
|
||||
struct snd_soc_acpi_mach_params {
|
||||
u32 acpi_ipc_irq_index;
|
||||
@ -80,6 +84,9 @@ struct snd_soc_acpi_mach_params {
|
||||
u32 i2s_link_mask;
|
||||
u32 num_dai_drivers;
|
||||
struct snd_soc_dai_driver *dai_drivers;
|
||||
unsigned short subsystem_vendor;
|
||||
unsigned short subsystem_device;
|
||||
bool subsystem_id_set;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -59,6 +59,43 @@ int snd_soc_card_add_dai_link(struct snd_soc_card *card,
|
||||
void snd_soc_card_remove_dai_link(struct snd_soc_card *card,
|
||||
struct snd_soc_dai_link *dai_link);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
static inline void snd_soc_card_set_pci_ssid(struct snd_soc_card *card,
|
||||
unsigned short vendor,
|
||||
unsigned short device)
|
||||
{
|
||||
card->pci_subsystem_vendor = vendor;
|
||||
card->pci_subsystem_device = device;
|
||||
card->pci_subsystem_set = true;
|
||||
}
|
||||
|
||||
static inline int snd_soc_card_get_pci_ssid(struct snd_soc_card *card,
|
||||
unsigned short *vendor,
|
||||
unsigned short *device)
|
||||
{
|
||||
if (!card->pci_subsystem_set)
|
||||
return -ENOENT;
|
||||
|
||||
*vendor = card->pci_subsystem_vendor;
|
||||
*device = card->pci_subsystem_device;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else /* !CONFIG_PCI */
|
||||
static inline void snd_soc_card_set_pci_ssid(struct snd_soc_card *card,
|
||||
unsigned short vendor,
|
||||
unsigned short device)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int snd_soc_card_get_pci_ssid(struct snd_soc_card *card,
|
||||
unsigned short *vendor,
|
||||
unsigned short *device)
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
/* device driver data */
|
||||
static inline void snd_soc_card_set_drvdata(struct snd_soc_card *card,
|
||||
void *data)
|
||||
@ -78,8 +115,8 @@ struct snd_soc_dai *snd_soc_card_get_codec_dai(struct snd_soc_card *card,
|
||||
struct snd_soc_pcm_runtime *rtd;
|
||||
|
||||
for_each_card_rtds(card, rtd) {
|
||||
if (!strcmp(asoc_rtd_to_codec(rtd, 0)->name, dai_name))
|
||||
return asoc_rtd_to_codec(rtd, 0);
|
||||
if (!strcmp(snd_soc_rtd_to_codec(rtd, 0)->name, dai_name))
|
||||
return snd_soc_rtd_to_codec(rtd, 0);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
@ -718,7 +718,7 @@ struct snd_soc_dapm_context {
|
||||
/* A list of widgets associated with an object, typically a snd_kcontrol */
|
||||
struct snd_soc_dapm_widget_list {
|
||||
int num_widgets;
|
||||
struct snd_soc_dapm_widget *widgets[];
|
||||
struct snd_soc_dapm_widget *widgets[] __counted_by(num_widgets);
|
||||
};
|
||||
|
||||
#define for_each_dapm_widgets(list, i, widget) \
|
||||
|
@ -10,6 +10,7 @@
|
||||
#ifndef __LINUX_SND_SOC_H
|
||||
#define __LINUX_SND_SOC_H
|
||||
|
||||
#include <linux/args.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/types.h>
|
||||
@ -775,36 +776,36 @@ struct snd_soc_dai_link {
|
||||
};
|
||||
|
||||
static inline struct snd_soc_dai_link_component*
|
||||
asoc_link_to_cpu(struct snd_soc_dai_link *link, int n) {
|
||||
snd_soc_link_to_cpu(struct snd_soc_dai_link *link, int n) {
|
||||
return &(link)->cpus[n];
|
||||
}
|
||||
|
||||
static inline struct snd_soc_dai_link_component*
|
||||
asoc_link_to_codec(struct snd_soc_dai_link *link, int n) {
|
||||
snd_soc_link_to_codec(struct snd_soc_dai_link *link, int n) {
|
||||
return &(link)->codecs[n];
|
||||
}
|
||||
|
||||
static inline struct snd_soc_dai_link_component*
|
||||
asoc_link_to_platform(struct snd_soc_dai_link *link, int n) {
|
||||
snd_soc_link_to_platform(struct snd_soc_dai_link *link, int n) {
|
||||
return &(link)->platforms[n];
|
||||
}
|
||||
|
||||
#define for_each_link_codecs(link, i, codec) \
|
||||
for ((i) = 0; \
|
||||
((i) < link->num_codecs) && \
|
||||
((codec) = asoc_link_to_codec(link, i)); \
|
||||
((codec) = snd_soc_link_to_codec(link, i)); \
|
||||
(i)++)
|
||||
|
||||
#define for_each_link_platforms(link, i, platform) \
|
||||
for ((i) = 0; \
|
||||
((i) < link->num_platforms) && \
|
||||
((platform) = asoc_link_to_platform(link, i)); \
|
||||
((platform) = snd_soc_link_to_platform(link, i)); \
|
||||
(i)++)
|
||||
|
||||
#define for_each_link_cpus(link, i, cpu) \
|
||||
for ((i) = 0; \
|
||||
((i) < link->num_cpus) && \
|
||||
((cpu) = asoc_link_to_cpu(link, i)); \
|
||||
((cpu) = snd_soc_link_to_cpu(link, i)); \
|
||||
(i)++)
|
||||
|
||||
/*
|
||||
@ -870,12 +871,8 @@ asoc_link_to_platform(struct snd_soc_dai_link *link, int n) {
|
||||
.platforms = platform, \
|
||||
.num_platforms = ARRAY_SIZE(platform)
|
||||
|
||||
#define SND_SOC_DAILINK_REGx(_1, _2, _3, func, ...) func
|
||||
#define SND_SOC_DAILINK_REG(...) \
|
||||
SND_SOC_DAILINK_REGx(__VA_ARGS__, \
|
||||
SND_SOC_DAILINK_REG3, \
|
||||
SND_SOC_DAILINK_REG2, \
|
||||
SND_SOC_DAILINK_REG1)(__VA_ARGS__)
|
||||
CONCATENATE(SND_SOC_DAILINK_REG, COUNT_ARGS(__VA_ARGS__))(__VA_ARGS__)
|
||||
|
||||
#define SND_SOC_DAILINK_DEF(name, def...) \
|
||||
static struct snd_soc_dai_link_component name[] = { def }
|
||||
@ -895,7 +892,7 @@ asoc_link_to_platform(struct snd_soc_dai_link *link, int n) {
|
||||
#define COMP_DUMMY() { .name = "snd-soc-dummy", .dai_name = "snd-soc-dummy-dai", }
|
||||
|
||||
extern struct snd_soc_dai_link_component null_dailink_component[0];
|
||||
extern struct snd_soc_dai_link_component asoc_dummy_dlc;
|
||||
extern struct snd_soc_dai_link_component snd_soc_dummy_dlc;
|
||||
|
||||
|
||||
struct snd_soc_codec_conf {
|
||||
@ -932,6 +929,17 @@ struct snd_soc_card {
|
||||
#ifdef CONFIG_DMI
|
||||
char dmi_longname[80];
|
||||
#endif /* CONFIG_DMI */
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
/*
|
||||
* PCI does not define 0 as invalid, so pci_subsystem_set indicates
|
||||
* whether a value has been written to these fields.
|
||||
*/
|
||||
unsigned short pci_subsystem_vendor;
|
||||
unsigned short pci_subsystem_device;
|
||||
bool pci_subsystem_set;
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
char topology_shortname[32];
|
||||
|
||||
struct device *dev;
|
||||
@ -1102,8 +1110,8 @@ struct snd_soc_pcm_runtime {
|
||||
* dais = cpu_dai + codec_dai
|
||||
* see
|
||||
* soc_new_pcm_runtime()
|
||||
* asoc_rtd_to_cpu()
|
||||
* asoc_rtd_to_codec()
|
||||
* snd_soc_rtd_to_cpu()
|
||||
* snd_soc_rtd_to_codec()
|
||||
*/
|
||||
struct snd_soc_dai **dais;
|
||||
|
||||
@ -1131,10 +1139,11 @@ struct snd_soc_pcm_runtime {
|
||||
int num_components;
|
||||
struct snd_soc_component *components[]; /* CPU/Codec/Platform */
|
||||
};
|
||||
|
||||
/* 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)->dai_link->num_cpus]
|
||||
#define asoc_substream_to_rtd(substream) \
|
||||
#define snd_soc_rtd_to_cpu(rtd, n) (rtd)->dais[n]
|
||||
#define snd_soc_rtd_to_codec(rtd, n) (rtd)->dais[n + (rtd)->dai_link->num_cpus]
|
||||
#define snd_soc_substream_to_rtd(substream) \
|
||||
(struct snd_soc_pcm_runtime *)snd_pcm_substream_chip(substream)
|
||||
|
||||
#define for_each_rtd_components(rtd, i, component) \
|
||||
@ -1143,11 +1152,11 @@ struct snd_soc_pcm_runtime {
|
||||
(i)++)
|
||||
#define for_each_rtd_cpu_dais(rtd, i, dai) \
|
||||
for ((i) = 0; \
|
||||
((i) < rtd->dai_link->num_cpus) && ((dai) = asoc_rtd_to_cpu(rtd, i)); \
|
||||
((i) < rtd->dai_link->num_cpus) && ((dai) = snd_soc_rtd_to_cpu(rtd, i)); \
|
||||
(i)++)
|
||||
#define for_each_rtd_codec_dais(rtd, i, dai) \
|
||||
for ((i) = 0; \
|
||||
((i) < rtd->dai_link->num_codecs) && ((dai) = asoc_rtd_to_codec(rtd, i)); \
|
||||
((i) < rtd->dai_link->num_codecs) && ((dai) = snd_soc_rtd_to_codec(rtd, i)); \
|
||||
(i)++)
|
||||
#define for_each_rtd_dais(rtd, i, dai) \
|
||||
for ((i) = 0; \
|
||||
|
@ -52,8 +52,8 @@ enum sof_dsp_power_states {
|
||||
|
||||
/* Definitions for multiple IPCs */
|
||||
enum sof_ipc_type {
|
||||
SOF_IPC,
|
||||
SOF_INTEL_IPC4,
|
||||
SOF_IPC_TYPE_3,
|
||||
SOF_IPC_TYPE_4,
|
||||
SOF_IPC_TYPE_COUNT
|
||||
};
|
||||
|
||||
@ -64,6 +64,14 @@ struct snd_sof_pdata {
|
||||
const char *name;
|
||||
const char *platform;
|
||||
|
||||
/*
|
||||
* PCI SSID. As PCI does not define 0 as invalid, the subsystem_id_set
|
||||
* flag indicates that a value has been written to these members.
|
||||
*/
|
||||
unsigned short subsystem_vendor;
|
||||
unsigned short subsystem_device;
|
||||
bool subsystem_id_set;
|
||||
|
||||
struct device *dev;
|
||||
|
||||
/*
|
||||
|
@ -106,12 +106,19 @@ enum sof_ipc4_global_msg {
|
||||
SOF_IPC4_GLB_SAVE_PIPELINE,
|
||||
SOF_IPC4_GLB_RESTORE_PIPELINE,
|
||||
|
||||
/* Loads library (using Code Load or HD/A Host Output DMA) */
|
||||
/*
|
||||
* library loading
|
||||
*
|
||||
* Loads library (using Code Load or HD/A Host Output DMA)
|
||||
*/
|
||||
SOF_IPC4_GLB_LOAD_LIBRARY,
|
||||
/*
|
||||
* Prepare the host DMA channel for library loading, must be followed by
|
||||
* a SOF_IPC4_GLB_LOAD_LIBRARY message as the library loading step
|
||||
*/
|
||||
SOF_IPC4_GLB_LOAD_LIBRARY_PREPARE,
|
||||
|
||||
/* 25: RESERVED - do not use */
|
||||
|
||||
SOF_IPC4_GLB_INTERNAL_MESSAGE = 26,
|
||||
SOF_IPC4_GLB_INTERNAL_MESSAGE,
|
||||
|
||||
/* Notification (FW to SW driver) */
|
||||
SOF_IPC4_GLB_NOTIFICATION,
|
||||
@ -508,6 +515,23 @@ struct sof_ipc4_notify_resource_data {
|
||||
uint32_t data[6];
|
||||
} __packed __aligned(4);
|
||||
|
||||
#define SOF_IPC4_DEBUG_DESCRIPTOR_SIZE 12 /* 3 x u32 */
|
||||
|
||||
/*
|
||||
* The debug memory window is divided into 16 slots, and the
|
||||
* first slot is used as a recorder for the other 15 slots.
|
||||
*/
|
||||
#define SOF_IPC4_MAX_DEBUG_SLOTS 15
|
||||
#define SOF_IPC4_DEBUG_SLOT_SIZE 0x1000
|
||||
|
||||
/* debug log slot types */
|
||||
#define SOF_IPC4_DEBUG_SLOT_UNUSED 0x00000000
|
||||
#define SOF_IPC4_DEBUG_SLOT_CRITICAL_LOG 0x54524300 /* byte 0: core ID */
|
||||
#define SOF_IPC4_DEBUG_SLOT_DEBUG_LOG 0x474f4c00 /* byte 0: core ID */
|
||||
#define SOF_IPC4_DEBUG_SLOT_GDB_STUB 0x42444700
|
||||
#define SOF_IPC4_DEBUG_SLOT_TELEMETRY 0x4c455400
|
||||
#define SOF_IPC4_DEBUG_SLOT_BROKEN 0x44414544
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif
|
||||
|
@ -77,6 +77,11 @@ struct tasdev_blk {
|
||||
unsigned int nr_cmds;
|
||||
unsigned int blk_size;
|
||||
unsigned int nr_subblocks;
|
||||
/* fixed m68k compiling issue, storing the dev_idx as a member of block
|
||||
* can reduce unnecessary timeand system resource comsumption of
|
||||
* dev_idx mapping every time the block data writing to the dsp.
|
||||
*/
|
||||
unsigned char dev_idx;
|
||||
unsigned char *data;
|
||||
};
|
||||
|
||||
|
@ -38,7 +38,7 @@ int pxa2xx_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
struct dma_slave_config config;
|
||||
int ret;
|
||||
|
||||
dma_params = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
|
||||
dma_params = snd_soc_dai_get_dma_data(snd_soc_rtd_to_cpu(rtd, 0), substream);
|
||||
if (!dma_params)
|
||||
return 0;
|
||||
|
||||
@ -47,7 +47,7 @@ int pxa2xx_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
return ret;
|
||||
|
||||
snd_dmaengine_pcm_set_config_from_dai_data(substream,
|
||||
snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream),
|
||||
snd_soc_dai_get_dma_data(snd_soc_rtd_to_cpu(rtd, 0), substream),
|
||||
&config);
|
||||
|
||||
ret = dmaengine_slave_config(chan, &config);
|
||||
@ -86,7 +86,7 @@ int pxa2xx_pcm_open(struct snd_pcm_substream *substream)
|
||||
|
||||
runtime->hw = pxa2xx_pcm_hardware;
|
||||
|
||||
dma_params = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
|
||||
dma_params = snd_soc_dai_get_dma_data(snd_soc_rtd_to_cpu(rtd, 0), substream);
|
||||
if (!dma_params)
|
||||
return 0;
|
||||
|
||||
@ -111,7 +111,7 @@ int pxa2xx_pcm_open(struct snd_pcm_substream *substream)
|
||||
return ret;
|
||||
|
||||
return snd_dmaengine_pcm_open(
|
||||
substream, dma_request_slave_channel(asoc_rtd_to_cpu(rtd, 0)->dev,
|
||||
substream, dma_request_slave_channel(snd_soc_rtd_to_cpu(rtd, 0)->dev,
|
||||
dma_params->chan_name));
|
||||
}
|
||||
EXPORT_SYMBOL(pxa2xx_pcm_open);
|
||||
|
@ -598,7 +598,7 @@ static void cs35l41_hda_play_done(struct device *dev)
|
||||
|
||||
dev_dbg(dev, "Play (Complete)\n");
|
||||
|
||||
cs35l41_global_enable(dev, reg, cs35l41->hw_cfg.bst_type, 1, NULL,
|
||||
cs35l41_global_enable(dev, reg, cs35l41->hw_cfg.bst_type, 1,
|
||||
cs35l41->firmware_running);
|
||||
cs35l41_mute(dev, false);
|
||||
}
|
||||
@ -611,7 +611,7 @@ static void cs35l41_hda_pause_start(struct device *dev)
|
||||
dev_dbg(dev, "Pause (Start)\n");
|
||||
|
||||
cs35l41_mute(dev, true);
|
||||
cs35l41_global_enable(dev, reg, cs35l41->hw_cfg.bst_type, 0, NULL,
|
||||
cs35l41_global_enable(dev, reg, cs35l41->hw_cfg.bst_type, 0,
|
||||
cs35l41->firmware_running);
|
||||
}
|
||||
|
||||
@ -1699,27 +1699,27 @@ int cs35l41_hda_probe(struct device *dev, const char *device_name, int id, int i
|
||||
ret = regmap_read_poll_timeout(cs35l41->regmap, CS35L41_IRQ1_STATUS4, int_status,
|
||||
int_status & CS35L41_OTP_BOOT_DONE, 1000, 100000);
|
||||
if (ret) {
|
||||
dev_err(cs35l41->dev, "Failed waiting for OTP_BOOT_DONE: %d\n", ret);
|
||||
dev_err_probe(cs35l41->dev, ret, "Failed waiting for OTP_BOOT_DONE\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = regmap_read(cs35l41->regmap, CS35L41_IRQ1_STATUS3, &int_sts);
|
||||
if (ret || (int_sts & CS35L41_OTP_BOOT_ERR)) {
|
||||
dev_err(cs35l41->dev, "OTP Boot status %x error: %d\n",
|
||||
int_sts & CS35L41_OTP_BOOT_ERR, ret);
|
||||
dev_err_probe(cs35l41->dev, ret, "OTP Boot status %x error\n",
|
||||
int_sts & CS35L41_OTP_BOOT_ERR);
|
||||
ret = -EIO;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = regmap_read(cs35l41->regmap, CS35L41_DEVID, ®id);
|
||||
if (ret) {
|
||||
dev_err(cs35l41->dev, "Get Device ID failed: %d\n", ret);
|
||||
dev_err_probe(cs35l41->dev, ret, "Get Device ID failed\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = regmap_read(cs35l41->regmap, CS35L41_REVID, ®_revid);
|
||||
if (ret) {
|
||||
dev_err(cs35l41->dev, "Get Revision ID failed: %d\n", ret);
|
||||
dev_err_probe(cs35l41->dev, ret, "Get Revision ID failed\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
@ -1742,7 +1742,7 @@ int cs35l41_hda_probe(struct device *dev, const char *device_name, int id, int i
|
||||
|
||||
ret = cs35l41_otp_unpack(cs35l41->dev, cs35l41->regmap);
|
||||
if (ret) {
|
||||
dev_err(cs35l41->dev, "OTP Unpack failed: %d\n", ret);
|
||||
dev_err_probe(cs35l41->dev, ret, "OTP Unpack failed\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
@ -1770,9 +1770,8 @@ int cs35l41_hda_probe(struct device *dev, const char *device_name, int id, int i
|
||||
|
||||
ret = component_add(cs35l41->dev, &cs35l41_hda_comp_ops);
|
||||
if (ret) {
|
||||
dev_err(cs35l41->dev, "Register component failed: %d\n", ret);
|
||||
pm_runtime_disable(cs35l41->dev);
|
||||
goto err;
|
||||
dev_err_probe(cs35l41->dev, ret, "Register component failed\n");
|
||||
goto err_pm;
|
||||
}
|
||||
|
||||
dev_info(cs35l41->dev, "Cirrus Logic CS35L41 (%x), Revision: %02X\n", regid, reg_revid);
|
||||
@ -1780,6 +1779,7 @@ int cs35l41_hda_probe(struct device *dev, const char *device_name, int id, int i
|
||||
return 0;
|
||||
|
||||
err_pm:
|
||||
pm_runtime_dont_use_autosuspend(cs35l41->dev);
|
||||
pm_runtime_disable(cs35l41->dev);
|
||||
pm_runtime_put_noidle(cs35l41->dev);
|
||||
|
||||
@ -1799,6 +1799,7 @@ void cs35l41_hda_remove(struct device *dev)
|
||||
struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
|
||||
|
||||
pm_runtime_get_sync(cs35l41->dev);
|
||||
pm_runtime_dont_use_autosuspend(cs35l41->dev);
|
||||
pm_runtime_disable(cs35l41->dev);
|
||||
|
||||
if (cs35l41->halo_initialized)
|
||||
|
@ -61,6 +61,76 @@ static const struct config_entry config_table[] = {
|
||||
{}
|
||||
},
|
||||
},
|
||||
{
|
||||
.flags = FLAG_AMD_LEGACY,
|
||||
.device = ACP_PCI_DEV_ID,
|
||||
.dmi_table = (const struct dmi_system_id []) {
|
||||
{
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "KLVL-WXXW"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
},
|
||||
},
|
||||
{
|
||||
.flags = FLAG_AMD_LEGACY,
|
||||
.device = ACP_PCI_DEV_ID,
|
||||
.dmi_table = (const struct dmi_system_id []) {
|
||||
{
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "KLVL-WXX9"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
},
|
||||
},
|
||||
{
|
||||
.flags = FLAG_AMD_LEGACY,
|
||||
.device = ACP_PCI_DEV_ID,
|
||||
.dmi_table = (const struct dmi_system_id []) {
|
||||
{
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "BOM-WXX9"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
},
|
||||
},
|
||||
{
|
||||
.flags = FLAG_AMD_LEGACY,
|
||||
.device = ACP_PCI_DEV_ID,
|
||||
.dmi_table = (const struct dmi_system_id []) {
|
||||
{
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HVY-WXX9"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1020"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
},
|
||||
},
|
||||
{
|
||||
.flags = FLAG_AMD_LEGACY,
|
||||
.device = ACP_PCI_DEV_ID,
|
||||
.dmi_table = (const struct dmi_system_id []) {
|
||||
{
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HVY-WXX9"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1040"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
int snd_amd_acp_find_config(struct pci_dev *pci)
|
||||
|
@ -54,7 +54,7 @@ static int cz_da7219_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
int ret;
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
|
||||
dev_info(rtd->dev, "codec dai name = %s\n", codec_dai->name);
|
||||
@ -106,7 +106,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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
|
||||
/*
|
||||
* Set wclk to 48000 because the rate constraint of this driver is
|
||||
@ -134,7 +134,7 @@ static int cz_rt5682_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
int ret;
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
|
||||
dev_info(codec_dai->dev, "codec dai name = %s\n", codec_dai->name);
|
||||
@ -191,7 +191,7 @@ static int cz_rt5682_init(struct snd_soc_pcm_runtime *rtd)
|
||||
static int rt5682_clk_enable(struct snd_pcm_substream *substream)
|
||||
{
|
||||
int ret;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
|
||||
/*
|
||||
* Set wclk to 48000 because the rate constraint of this driver is
|
||||
@ -245,7 +245,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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
@ -266,7 +266,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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
@ -288,7 +288,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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
@ -309,7 +309,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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
@ -330,7 +330,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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
@ -357,7 +357,7 @@ static void cz_da7219_shutdown(struct snd_pcm_substream *substream)
|
||||
static int cz_rt5682_play_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
@ -378,7 +378,7 @@ static int cz_rt5682_play_startup(struct snd_pcm_substream *substream)
|
||||
static int cz_rt5682_cap_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
@ -400,7 +400,7 @@ static int cz_rt5682_cap_startup(struct snd_pcm_substream *substream)
|
||||
static int cz_rt5682_max_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
@ -421,7 +421,7 @@ static int cz_rt5682_max_startup(struct snd_pcm_substream *substream)
|
||||
static int cz_rt5682_dmic0_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
@ -442,7 +442,7 @@ static int cz_rt5682_dmic0_startup(struct snd_pcm_substream *substream)
|
||||
static int cz_rt5682_dmic1_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
|
@ -62,7 +62,7 @@ static int st_es8336_init(struct snd_soc_pcm_runtime *rtd)
|
||||
struct snd_soc_card *card;
|
||||
struct snd_soc_component *codec;
|
||||
|
||||
codec = asoc_rtd_to_codec(rtd, 0)->component;
|
||||
codec = snd_soc_rtd_to_codec(rtd, 0)->component;
|
||||
card = rtd->card;
|
||||
|
||||
ret = snd_soc_card_jack_new_pins(card, "Headset", SND_JACK_HEADSET | SND_JACK_BTN_0,
|
||||
@ -111,10 +111,10 @@ static int st_es8336_codec_startup(struct snd_pcm_substream *substream)
|
||||
int ret;
|
||||
|
||||
runtime = substream->runtime;
|
||||
rtd = asoc_substream_to_rtd(substream);
|
||||
rtd = snd_soc_substream_to_rtd(substream);
|
||||
card = rtd->card;
|
||||
machine = snd_soc_card_get_drvdata(card);
|
||||
codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
ret = snd_soc_dai_set_sysclk(codec_dai, 0, ES8336_PLL_FREQ, SND_SOC_CLOCK_IN);
|
||||
if (ret < 0) {
|
||||
dev_err(rtd->dev, "can't set codec sysclk: %d\n", ret);
|
||||
|
@ -849,7 +849,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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *prtd = snd_soc_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);
|
||||
|
@ -57,8 +57,8 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
|
||||
ret = snd_soc_dai_set_pll(codec_dai, 0, RT5645_PLL1_S_MCLK,
|
||||
CZ_PLAT_CLK, params_rate(params) * 512);
|
||||
@ -83,7 +83,7 @@ static int cz_init(struct snd_soc_pcm_runtime *rtd)
|
||||
struct snd_soc_card *card;
|
||||
struct snd_soc_component *codec;
|
||||
|
||||
codec = asoc_rtd_to_codec(rtd, 0)->component;
|
||||
codec = snd_soc_rtd_to_codec(rtd, 0)->component;
|
||||
card = rtd->card;
|
||||
|
||||
ret = snd_soc_card_jack_new_pins(card, "Headset Jack",
|
||||
|
@ -17,7 +17,7 @@ snd-acp-rembrandt-objs := acp-rembrandt.o
|
||||
|
||||
#machine specific driver
|
||||
snd-acp-mach-objs := acp-mach-common.o
|
||||
snd-acp-legacy-mach-objs := acp-legacy-mach.o
|
||||
snd-acp-legacy-mach-objs := acp-legacy-mach.o acp3x-es83xx/acp3x-es83xx.o
|
||||
snd-acp-sof-mach-objs := acp-sof-mach.o
|
||||
|
||||
obj-$(CONFIG_SND_SOC_AMD_ACP_PCM) += snd-acp-pcm.o
|
||||
|
@ -80,8 +80,8 @@ void restore_acp_pdm_params(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_pcm_runtime *soc_runtime;
|
||||
u32 ext_int_ctrl;
|
||||
|
||||
soc_runtime = asoc_substream_to_rtd(substream);
|
||||
dai = asoc_rtd_to_cpu(soc_runtime, 0);
|
||||
soc_runtime = snd_soc_substream_to_rtd(substream);
|
||||
dai = snd_soc_rtd_to_cpu(soc_runtime, 0);
|
||||
/* Programming channel mask and sampling rate */
|
||||
writel(adata->ch_mask, adata->acp_base + ACP_WOV_PDM_NO_OF_CHANNELS);
|
||||
writel(PDM_DEC_64, adata->acp_base + ACP_WOV_PDM_DECIMATION_FACTOR);
|
||||
@ -192,8 +192,8 @@ int restore_acp_i2s_params(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_pcm_runtime *soc_runtime;
|
||||
u32 tdm_fmt, reg_val, fmt_reg, val;
|
||||
|
||||
soc_runtime = asoc_substream_to_rtd(substream);
|
||||
dai = asoc_rtd_to_cpu(soc_runtime, 0);
|
||||
soc_runtime = snd_soc_substream_to_rtd(substream);
|
||||
dai = snd_soc_rtd_to_cpu(soc_runtime, 0);
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
tdm_fmt = adata->tdm_tx_fmt[stream->dai_id - 1];
|
||||
switch (stream->dai_id) {
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <linux/module.h>
|
||||
|
||||
#include "acp-mach.h"
|
||||
#include "acp3x-es83xx/acp3x-es83xx.h"
|
||||
|
||||
static struct acp_card_drvdata rt5682_rt1019_data = {
|
||||
.hs_cpu_id = I2S_SP,
|
||||
@ -51,6 +52,14 @@ static struct acp_card_drvdata rt5682s_rt1019_data = {
|
||||
.tdm_mode = false,
|
||||
};
|
||||
|
||||
static struct acp_card_drvdata es83xx_rn_data = {
|
||||
.hs_cpu_id = I2S_SP,
|
||||
.dmic_cpu_id = DMIC,
|
||||
.hs_codec_id = ES83XX,
|
||||
.dmic_codec_id = DMIC,
|
||||
.platform = RENOIR,
|
||||
};
|
||||
|
||||
static struct acp_card_drvdata max_nau8825_data = {
|
||||
.hs_cpu_id = I2S_HS,
|
||||
.amp_cpu_id = I2S_HS,
|
||||
@ -75,6 +84,39 @@ static struct acp_card_drvdata rt5682s_rt1019_rmb_data = {
|
||||
.tdm_mode = false,
|
||||
};
|
||||
|
||||
static bool acp_asoc_init_ops(struct acp_card_drvdata *priv)
|
||||
{
|
||||
bool has_ops = false;
|
||||
|
||||
if (priv->hs_codec_id == ES83XX) {
|
||||
has_ops = true;
|
||||
acp3x_es83xx_init_ops(&priv->ops);
|
||||
}
|
||||
return has_ops;
|
||||
}
|
||||
|
||||
static int acp_asoc_suspend_pre(struct snd_soc_card *card)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = acp_ops_suspend_pre(card);
|
||||
if (ret == 1)
|
||||
return 0;
|
||||
else
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int acp_asoc_resume_post(struct snd_soc_card *card)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = acp_ops_resume_post(card);
|
||||
if (ret == 1)
|
||||
return 0;
|
||||
else
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int acp_asoc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct snd_soc_card *card = NULL;
|
||||
@ -83,35 +125,68 @@ static int acp_asoc_probe(struct platform_device *pdev)
|
||||
struct acp_card_drvdata *acp_card_drvdata;
|
||||
int ret;
|
||||
|
||||
if (!pdev->id_entry)
|
||||
return -EINVAL;
|
||||
if (!pdev->id_entry) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL);
|
||||
if (!card)
|
||||
return -ENOMEM;
|
||||
if (!card) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
card->drvdata = (struct acp_card_drvdata *)pdev->id_entry->driver_data;
|
||||
acp_card_drvdata = card->drvdata;
|
||||
acp_card_drvdata->acpi_mach = (struct snd_soc_acpi_mach *)pdev->dev.platform_data;
|
||||
card->dev = dev;
|
||||
card->owner = THIS_MODULE;
|
||||
card->name = pdev->id_entry->name;
|
||||
card->drvdata = (struct acp_card_drvdata *)pdev->id_entry->driver_data;
|
||||
/* Widgets and controls added per-codec in acp-mach-common.c */
|
||||
|
||||
acp_card_drvdata = card->drvdata;
|
||||
acp_asoc_init_ops(card->drvdata);
|
||||
|
||||
/* If widgets and controls are not set in specific callback,
|
||||
* they will be added per-codec in acp-mach-common.c
|
||||
*/
|
||||
ret = acp_ops_configure_widgets(card);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev,
|
||||
"Cannot configure widgets for card (%s): %d\n",
|
||||
card->name, ret);
|
||||
goto out;
|
||||
}
|
||||
card->suspend_pre = acp_asoc_suspend_pre;
|
||||
card->resume_post = acp_asoc_resume_post;
|
||||
|
||||
ret = acp_ops_probe(card);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev,
|
||||
"Cannot probe card (%s): %d\n",
|
||||
card->name, ret);
|
||||
goto out;
|
||||
}
|
||||
|
||||
dmi_id = dmi_first_match(acp_quirk_table);
|
||||
if (dmi_id && dmi_id->driver_data)
|
||||
acp_card_drvdata->tdm_mode = dmi_id->driver_data;
|
||||
|
||||
acp_legacy_dai_links_create(card);
|
||||
ret = acp_legacy_dai_links_create(card);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev,
|
||||
"Cannot create dai links for card (%s): %d\n",
|
||||
card->name, ret);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = devm_snd_soc_register_card(&pdev->dev, card);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev,
|
||||
"devm_snd_soc_register_card(%s) failed: %d\n",
|
||||
card->name, ret);
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
|
||||
return 0;
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct platform_device_id board_ids[] = {
|
||||
@ -127,6 +202,10 @@ static const struct platform_device_id board_ids[] = {
|
||||
.name = "acp3xalc5682s1019",
|
||||
.driver_data = (kernel_ulong_t)&rt5682s_rt1019_data,
|
||||
},
|
||||
{
|
||||
.name = "acp3x-es83xx",
|
||||
.driver_data = (kernel_ulong_t)&es83xx_rn_data,
|
||||
},
|
||||
{
|
||||
.name = "rmb-nau8825-max",
|
||||
.driver_data = (kernel_ulong_t)&max_nau8825_data,
|
||||
@ -153,6 +232,7 @@ MODULE_DESCRIPTION("ACP chrome audio support");
|
||||
MODULE_ALIAS("platform:acp3xalc56821019");
|
||||
MODULE_ALIAS("platform:acp3xalc5682sm98360");
|
||||
MODULE_ALIAS("platform:acp3xalc5682s1019");
|
||||
MODULE_ALIAS("platform:acp3x-es83xx");
|
||||
MODULE_ALIAS("platform:rmb-nau8825-max");
|
||||
MODULE_ALIAS("platform:rmb-rt5682s-rt1019");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -117,7 +117,7 @@ static int acp_card_rt5682_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_card_drvdata *drvdata = card->drvdata;
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
int ret;
|
||||
|
||||
@ -172,10 +172,10 @@ static int acp_card_rt5682_init(struct snd_soc_pcm_runtime *rtd)
|
||||
static int acp_card_hs_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_card_drvdata *drvdata = card->drvdata;
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
int ret;
|
||||
unsigned int fmt;
|
||||
|
||||
@ -206,7 +206,7 @@ static int acp_card_hs_startup(struct snd_pcm_substream *substream)
|
||||
|
||||
static void acp_card_shutdown(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_card_drvdata *drvdata = card->drvdata;
|
||||
|
||||
@ -220,8 +220,8 @@ static int acp_card_rt5682_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_card_drvdata *drvdata = card->drvdata;
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
|
||||
int ret;
|
||||
unsigned int fmt, srate, ch, format;
|
||||
|
||||
@ -342,7 +342,7 @@ static int acp_card_rt5682s_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_card_drvdata *drvdata = card->drvdata;
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
int ret;
|
||||
|
||||
@ -402,8 +402,8 @@ static int acp_card_rt5682s_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_card_drvdata *drvdata = card->drvdata;
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
|
||||
int ret;
|
||||
unsigned int fmt, srate, ch, format;
|
||||
|
||||
@ -573,7 +573,7 @@ static int acp_card_rt1019_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_card_drvdata *drvdata = card->drvdata;
|
||||
struct snd_soc_dai *codec_dai;
|
||||
struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
|
||||
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
|
||||
int i, ret = 0;
|
||||
unsigned int fmt, srate, ch, format;
|
||||
|
||||
@ -737,7 +737,7 @@ static int acp_card_maxim_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_card_drvdata *drvdata = card->drvdata;
|
||||
struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
|
||||
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
|
||||
unsigned int fmt, srate, ch, format;
|
||||
int ret;
|
||||
|
||||
@ -928,7 +928,7 @@ static int acp_card_nau8825_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_card_drvdata *drvdata = card->drvdata;
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
int ret;
|
||||
|
||||
@ -980,11 +980,11 @@ static int acp_card_nau8825_init(struct snd_soc_pcm_runtime *rtd)
|
||||
static int acp_nau8825_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_card_drvdata *drvdata = card->drvdata;
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
|
||||
int ret;
|
||||
unsigned int fmt;
|
||||
|
||||
@ -1142,7 +1142,7 @@ static struct snd_pcm_hw_constraint_list constraints_sample_bits = {
|
||||
static int acp_8821_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
int ret;
|
||||
|
||||
@ -1204,10 +1204,10 @@ static int acp_8821_startup(struct snd_pcm_substream *substream)
|
||||
static int acp_nau8821_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp_card_drvdata *drvdata = card->drvdata;
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
int ret;
|
||||
unsigned int fmt;
|
||||
|
||||
@ -1358,7 +1358,7 @@ int acp_sofdsp_dai_links_create(struct snd_soc_card *card)
|
||||
links[i].no_pcm = 1;
|
||||
if (!drv_data->hs_codec_id) {
|
||||
/* Use dummy codec if codec id not specified */
|
||||
links[i].codecs = &asoc_dummy_dlc;
|
||||
links[i].codecs = &snd_soc_dummy_dlc;
|
||||
links[i].num_codecs = 1;
|
||||
}
|
||||
if (drv_data->hs_codec_id == RT5682) {
|
||||
@ -1395,7 +1395,7 @@ int acp_sofdsp_dai_links_create(struct snd_soc_card *card)
|
||||
links[i].no_pcm = 1;
|
||||
if (!drv_data->hs_codec_id) {
|
||||
/* Use dummy codec if codec id not specified */
|
||||
links[i].codecs = &asoc_dummy_dlc;
|
||||
links[i].codecs = &snd_soc_dummy_dlc;
|
||||
links[i].num_codecs = 1;
|
||||
}
|
||||
if (drv_data->hs_codec_id == NAU8825) {
|
||||
@ -1425,7 +1425,7 @@ int acp_sofdsp_dai_links_create(struct snd_soc_card *card)
|
||||
links[i].no_pcm = 1;
|
||||
if (!drv_data->amp_codec_id) {
|
||||
/* Use dummy codec if codec id not specified */
|
||||
links[i].codecs = &asoc_dummy_dlc;
|
||||
links[i].codecs = &snd_soc_dummy_dlc;
|
||||
links[i].num_codecs = 1;
|
||||
}
|
||||
if (drv_data->amp_codec_id == RT1019) {
|
||||
@ -1457,7 +1457,7 @@ int acp_sofdsp_dai_links_create(struct snd_soc_card *card)
|
||||
links[i].no_pcm = 1;
|
||||
if (!drv_data->amp_codec_id) {
|
||||
/* Use dummy codec if codec id not specified */
|
||||
links[i].codecs = &asoc_dummy_dlc;
|
||||
links[i].codecs = &snd_soc_dummy_dlc;
|
||||
links[i].num_codecs = 1;
|
||||
}
|
||||
if (drv_data->amp_codec_id == MAX98360A) {
|
||||
@ -1513,6 +1513,7 @@ int acp_legacy_dai_links_create(struct snd_soc_card *card)
|
||||
struct device *dev = card->dev;
|
||||
struct acp_card_drvdata *drv_data = card->drvdata;
|
||||
int i = 0, num_links = 0;
|
||||
int rc;
|
||||
|
||||
if (drv_data->hs_cpu_id)
|
||||
num_links++;
|
||||
@ -1536,7 +1537,7 @@ int acp_legacy_dai_links_create(struct snd_soc_card *card)
|
||||
links[i].dpcm_capture = 1;
|
||||
if (!drv_data->hs_codec_id) {
|
||||
/* Use dummy codec if codec id not specified */
|
||||
links[i].codecs = &asoc_dummy_dlc;
|
||||
links[i].codecs = &snd_soc_dummy_dlc;
|
||||
links[i].num_codecs = 1;
|
||||
}
|
||||
if (drv_data->hs_codec_id == RT5682) {
|
||||
@ -1551,6 +1552,13 @@ int acp_legacy_dai_links_create(struct snd_soc_card *card)
|
||||
links[i].init = acp_card_rt5682s_init;
|
||||
links[i].ops = &acp_card_rt5682s_ops;
|
||||
}
|
||||
if (drv_data->hs_codec_id == ES83XX) {
|
||||
rc = acp_ops_configure_link(card, &links[i]);
|
||||
if (rc != 0) {
|
||||
dev_err(dev, "Failed to configure link for ES83XX: %d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
@ -1570,7 +1578,7 @@ int acp_legacy_dai_links_create(struct snd_soc_card *card)
|
||||
links[i].dpcm_capture = 1;
|
||||
if (!drv_data->hs_codec_id) {
|
||||
/* Use dummy codec if codec id not specified */
|
||||
links[i].codecs = &asoc_dummy_dlc;
|
||||
links[i].codecs = &snd_soc_dummy_dlc;
|
||||
links[i].num_codecs = 1;
|
||||
}
|
||||
if (drv_data->hs_codec_id == NAU8825) {
|
||||
@ -1598,7 +1606,7 @@ int acp_legacy_dai_links_create(struct snd_soc_card *card)
|
||||
links[i].dpcm_playback = 1;
|
||||
if (!drv_data->amp_codec_id) {
|
||||
/* Use dummy codec if codec id not specified */
|
||||
links[i].codecs = &asoc_dummy_dlc;
|
||||
links[i].codecs = &snd_soc_dummy_dlc;
|
||||
links[i].num_codecs = 1;
|
||||
}
|
||||
if (drv_data->amp_codec_id == RT1019) {
|
||||
@ -1633,7 +1641,7 @@ int acp_legacy_dai_links_create(struct snd_soc_card *card)
|
||||
links[i].dpcm_playback = 1;
|
||||
if (!drv_data->amp_codec_id) {
|
||||
/* Use dummy codec if codec id not specified */
|
||||
links[i].codecs = &asoc_dummy_dlc;
|
||||
links[i].codecs = &snd_soc_dummy_dlc;
|
||||
links[i].num_codecs = 1;
|
||||
}
|
||||
if (drv_data->amp_codec_id == MAX98360A) {
|
||||
@ -1661,7 +1669,7 @@ int acp_legacy_dai_links_create(struct snd_soc_card *card)
|
||||
links[i].num_codecs = ARRAY_SIZE(dmic_codec);
|
||||
} else {
|
||||
/* Use dummy codec if codec id not specified */
|
||||
links[i].codecs = &asoc_dummy_dlc;
|
||||
links[i].codecs = &snd_soc_dummy_dlc;
|
||||
links[i].num_codecs = 1;
|
||||
}
|
||||
links[i].cpus = pdm_dmic;
|
||||
|
@ -20,6 +20,10 @@
|
||||
|
||||
#define TDM_CHANNELS 8
|
||||
|
||||
#define ACP_OPS(priv, cb) ((priv)->ops.cb)
|
||||
|
||||
#define acp_get_drvdata(card) ((struct acp_card_drvdata *)(card)->drvdata)
|
||||
|
||||
enum be_id {
|
||||
HEADSET_BE_ID = 0,
|
||||
AMP_BE_ID,
|
||||
@ -43,6 +47,7 @@ enum codec_endpoints {
|
||||
NAU8825,
|
||||
NAU8821,
|
||||
MAX98388,
|
||||
ES83XX,
|
||||
};
|
||||
|
||||
enum platform_end_point {
|
||||
@ -50,6 +55,14 @@ enum platform_end_point {
|
||||
REMBRANDT,
|
||||
};
|
||||
|
||||
struct acp_mach_ops {
|
||||
int (*probe)(struct snd_soc_card *card);
|
||||
int (*configure_link)(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);
|
||||
int (*configure_widgets)(struct snd_soc_card *card);
|
||||
int (*suspend_pre)(struct snd_soc_card *card);
|
||||
int (*resume_post)(struct snd_soc_card *card);
|
||||
};
|
||||
|
||||
struct acp_card_drvdata {
|
||||
unsigned int hs_cpu_id;
|
||||
unsigned int amp_cpu_id;
|
||||
@ -61,6 +74,9 @@ struct acp_card_drvdata {
|
||||
unsigned int platform;
|
||||
struct clk *wclk;
|
||||
struct clk *bclk;
|
||||
struct acp_mach_ops ops;
|
||||
struct snd_soc_acpi_mach *acpi_mach;
|
||||
void *mach_priv;
|
||||
bool soc_mclk;
|
||||
bool tdm_mode;
|
||||
};
|
||||
@ -69,4 +85,55 @@ int acp_sofdsp_dai_links_create(struct snd_soc_card *card);
|
||||
int acp_legacy_dai_links_create(struct snd_soc_card *card);
|
||||
extern const struct dmi_system_id acp_quirk_table[];
|
||||
|
||||
static inline int acp_ops_probe(struct snd_soc_card *card)
|
||||
{
|
||||
int ret = 1;
|
||||
struct acp_card_drvdata *priv = acp_get_drvdata(card);
|
||||
|
||||
if (ACP_OPS(priv, probe))
|
||||
ret = ACP_OPS(priv, probe)(card);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int acp_ops_configure_link(struct snd_soc_card *card,
|
||||
struct snd_soc_dai_link *dai_link)
|
||||
{
|
||||
int ret = 1;
|
||||
struct acp_card_drvdata *priv = acp_get_drvdata(card);
|
||||
|
||||
if (ACP_OPS(priv, configure_link))
|
||||
ret = ACP_OPS(priv, configure_link)(card, dai_link);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int acp_ops_configure_widgets(struct snd_soc_card *card)
|
||||
{
|
||||
int ret = 1;
|
||||
struct acp_card_drvdata *priv = acp_get_drvdata(card);
|
||||
|
||||
if (ACP_OPS(priv, configure_widgets))
|
||||
ret = ACP_OPS(priv, configure_widgets)(card);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int acp_ops_suspend_pre(struct snd_soc_card *card)
|
||||
{
|
||||
int ret = 1;
|
||||
struct acp_card_drvdata *priv = acp_get_drvdata(card);
|
||||
|
||||
if (ACP_OPS(priv, suspend_pre))
|
||||
ret = ACP_OPS(priv, suspend_pre)(card);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int acp_ops_resume_post(struct snd_soc_card *card)
|
||||
{
|
||||
int ret = 1;
|
||||
struct acp_card_drvdata *priv = acp_get_drvdata(card);
|
||||
|
||||
if (ACP_OPS(priv, resume_post))
|
||||
ret = ACP_OPS(priv, resume_post)(card);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -69,6 +69,10 @@ static struct snd_soc_acpi_mach snd_soc_acpi_amd_acp_machines[] = {
|
||||
.id = "AMDI1019",
|
||||
.drv_name = "renoir-acp",
|
||||
},
|
||||
{
|
||||
.id = "ESSX8336",
|
||||
.drv_name = "acp3x-es83xx",
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
||||
|
444
sound/soc/amd/acp/acp3x-es83xx/acp3x-es83xx.c
Normal file
444
sound/soc/amd/acp/acp3x-es83xx/acp3x-es83xx.c
Normal file
@ -0,0 +1,444 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// Machine driver for AMD ACP Audio engine using ES8336 codec.
|
||||
//
|
||||
// Copyright 2023 Marian Postevca <posteuca@mutex.one>
|
||||
#include <sound/core.h>
|
||||
#include <sound/soc.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/pcm_params.h>
|
||||
#include <sound/soc-dapm.h>
|
||||
#include <sound/jack.h>
|
||||
#include <sound/soc-acpi.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/dmi.h>
|
||||
#include "../acp-mach.h"
|
||||
#include "acp3x-es83xx.h"
|
||||
|
||||
#define get_mach_priv(card) ((struct acp3x_es83xx_private *)((acp_get_drvdata(card))->mach_priv))
|
||||
|
||||
#define DUAL_CHANNEL 2
|
||||
|
||||
#define ES83XX_ENABLE_DMIC BIT(4)
|
||||
#define ES83XX_48_MHZ_MCLK BIT(5)
|
||||
|
||||
struct acp3x_es83xx_private {
|
||||
bool speaker_on;
|
||||
bool headphone_on;
|
||||
unsigned long quirk;
|
||||
struct snd_soc_component *codec;
|
||||
struct device *codec_dev;
|
||||
struct gpio_desc *gpio_speakers, *gpio_headphone;
|
||||
struct acpi_gpio_params enable_spk_gpio, enable_hp_gpio;
|
||||
struct acpi_gpio_mapping gpio_mapping[3];
|
||||
struct snd_soc_dapm_route mic_map[2];
|
||||
};
|
||||
|
||||
static const unsigned int channels[] = {
|
||||
DUAL_CHANNEL,
|
||||
};
|
||||
|
||||
static const struct snd_pcm_hw_constraint_list constraints_channels = {
|
||||
.count = ARRAY_SIZE(channels),
|
||||
.list = channels,
|
||||
.mask = 0,
|
||||
};
|
||||
|
||||
#define ES83xx_12288_KHZ_MCLK_FREQ (48000 * 256)
|
||||
#define ES83xx_48_MHZ_MCLK_FREQ (48000 * 1000)
|
||||
|
||||
static int acp3x_es83xx_headphone_power_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event);
|
||||
static int acp3x_es83xx_speaker_power_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event);
|
||||
|
||||
static int acp3x_es83xx_codec_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime;
|
||||
struct snd_soc_pcm_runtime *rtd;
|
||||
struct snd_soc_dai *codec_dai;
|
||||
struct acp3x_es83xx_private *priv;
|
||||
unsigned int freq;
|
||||
int ret;
|
||||
|
||||
runtime = substream->runtime;
|
||||
rtd = snd_soc_substream_to_rtd(substream);
|
||||
codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
priv = get_mach_priv(rtd->card);
|
||||
|
||||
if (priv->quirk & ES83XX_48_MHZ_MCLK) {
|
||||
dev_dbg(priv->codec_dev, "using a 48Mhz MCLK\n");
|
||||
freq = ES83xx_48_MHZ_MCLK_FREQ;
|
||||
} else {
|
||||
dev_dbg(priv->codec_dev, "using a 12.288Mhz MCLK\n");
|
||||
freq = ES83xx_12288_KHZ_MCLK_FREQ;
|
||||
}
|
||||
|
||||
ret = snd_soc_dai_set_sysclk(codec_dai, 0, freq, SND_SOC_CLOCK_OUT);
|
||||
if (ret < 0) {
|
||||
dev_err(rtd->dev, "can't set codec sysclk: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
runtime->hw.channels_max = DUAL_CHANNEL;
|
||||
snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
|
||||
&constraints_channels);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct snd_soc_jack es83xx_jack;
|
||||
|
||||
static struct snd_soc_jack_pin es83xx_jack_pins[] = {
|
||||
{
|
||||
.pin = "Headphone",
|
||||
.mask = SND_JACK_HEADPHONE,
|
||||
},
|
||||
{
|
||||
.pin = "Headset Mic",
|
||||
.mask = SND_JACK_MICROPHONE,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_widget acp3x_es83xx_widgets[] = {
|
||||
SND_SOC_DAPM_SPK("Speaker", NULL),
|
||||
SND_SOC_DAPM_HP("Headphone", NULL),
|
||||
SND_SOC_DAPM_MIC("Headset Mic", NULL),
|
||||
SND_SOC_DAPM_MIC("Internal Mic", NULL),
|
||||
|
||||
SND_SOC_DAPM_SUPPLY("Headphone Power", SND_SOC_NOPM, 0, 0,
|
||||
acp3x_es83xx_headphone_power_event,
|
||||
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
||||
SND_SOC_DAPM_SUPPLY("Speaker Power", SND_SOC_NOPM, 0, 0,
|
||||
acp3x_es83xx_speaker_power_event,
|
||||
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route acp3x_es83xx_audio_map[] = {
|
||||
{"Headphone", NULL, "HPOL"},
|
||||
{"Headphone", NULL, "HPOR"},
|
||||
{"Headphone", NULL, "Headphone Power"},
|
||||
|
||||
/*
|
||||
* There is no separate speaker output instead the speakers are muxed to
|
||||
* the HP outputs. The mux is controlled Speaker and/or headphone switch.
|
||||
*/
|
||||
{"Speaker", NULL, "HPOL"},
|
||||
{"Speaker", NULL, "HPOR"},
|
||||
{"Speaker", NULL, "Speaker Power"},
|
||||
};
|
||||
|
||||
|
||||
static const struct snd_kcontrol_new acp3x_es83xx_controls[] = {
|
||||
SOC_DAPM_PIN_SWITCH("Speaker"),
|
||||
SOC_DAPM_PIN_SWITCH("Headphone"),
|
||||
SOC_DAPM_PIN_SWITCH("Headset Mic"),
|
||||
SOC_DAPM_PIN_SWITCH("Internal Mic"),
|
||||
};
|
||||
|
||||
static int acp3x_es83xx_configure_widgets(struct snd_soc_card *card)
|
||||
{
|
||||
card->dapm_widgets = acp3x_es83xx_widgets;
|
||||
card->num_dapm_widgets = ARRAY_SIZE(acp3x_es83xx_widgets);
|
||||
card->controls = acp3x_es83xx_controls;
|
||||
card->num_controls = ARRAY_SIZE(acp3x_es83xx_controls);
|
||||
card->dapm_routes = acp3x_es83xx_audio_map;
|
||||
card->num_dapm_routes = ARRAY_SIZE(acp3x_es83xx_audio_map);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acp3x_es83xx_headphone_power_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
struct acp3x_es83xx_private *priv = get_mach_priv(w->dapm->card);
|
||||
|
||||
dev_dbg(priv->codec_dev, "headphone power event = %d\n", event);
|
||||
if (SND_SOC_DAPM_EVENT_ON(event))
|
||||
priv->headphone_on = true;
|
||||
else
|
||||
priv->headphone_on = false;
|
||||
|
||||
gpiod_set_value_cansleep(priv->gpio_speakers, priv->speaker_on);
|
||||
gpiod_set_value_cansleep(priv->gpio_headphone, priv->headphone_on);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acp3x_es83xx_speaker_power_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
struct acp3x_es83xx_private *priv = get_mach_priv(w->dapm->card);
|
||||
|
||||
dev_dbg(priv->codec_dev, "speaker power event: %d\n", event);
|
||||
if (SND_SOC_DAPM_EVENT_ON(event))
|
||||
priv->speaker_on = true;
|
||||
else
|
||||
priv->speaker_on = false;
|
||||
|
||||
gpiod_set_value_cansleep(priv->gpio_speakers, priv->speaker_on);
|
||||
gpiod_set_value_cansleep(priv->gpio_headphone, priv->headphone_on);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acp3x_es83xx_suspend_pre(struct snd_soc_card *card)
|
||||
{
|
||||
struct acp3x_es83xx_private *priv = get_mach_priv(card);
|
||||
|
||||
/* We need to disable the jack in the machine driver suspend
|
||||
* callback so that the CODEC suspend callback actually gets
|
||||
* called. Without doing it, the CODEC suspend/resume
|
||||
* callbacks do not get called if headphones are plugged in.
|
||||
* This is because plugging in headphones keeps some supplies
|
||||
* active, this in turn means that the lowest bias level
|
||||
* that the CODEC can go to is SND_SOC_BIAS_STANDBY.
|
||||
* If components do not set idle_bias_on to true then
|
||||
* their suspend/resume callbacks do not get called.
|
||||
*/
|
||||
dev_dbg(priv->codec_dev, "card suspend\n");
|
||||
snd_soc_component_set_jack(priv->codec, NULL, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acp3x_es83xx_resume_post(struct snd_soc_card *card)
|
||||
{
|
||||
struct acp3x_es83xx_private *priv = get_mach_priv(card);
|
||||
|
||||
/* We disabled jack detection in suspend callback,
|
||||
* enable it back.
|
||||
*/
|
||||
dev_dbg(priv->codec_dev, "card resume\n");
|
||||
snd_soc_component_set_jack(priv->codec, &es83xx_jack, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acp3x_es83xx_configure_gpios(struct acp3x_es83xx_private *priv)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
priv->enable_spk_gpio.crs_entry_index = 0;
|
||||
priv->enable_hp_gpio.crs_entry_index = 1;
|
||||
|
||||
priv->enable_spk_gpio.active_low = false;
|
||||
priv->enable_hp_gpio.active_low = false;
|
||||
|
||||
priv->gpio_mapping[0].name = "speakers-enable-gpios";
|
||||
priv->gpio_mapping[0].data = &priv->enable_spk_gpio;
|
||||
priv->gpio_mapping[0].size = 1;
|
||||
priv->gpio_mapping[0].quirks = ACPI_GPIO_QUIRK_ONLY_GPIOIO;
|
||||
|
||||
priv->gpio_mapping[1].name = "headphone-enable-gpios";
|
||||
priv->gpio_mapping[1].data = &priv->enable_hp_gpio;
|
||||
priv->gpio_mapping[1].size = 1;
|
||||
priv->gpio_mapping[1].quirks = ACPI_GPIO_QUIRK_ONLY_GPIOIO;
|
||||
|
||||
dev_info(priv->codec_dev, "speaker gpio %d active %s, headphone gpio %d active %s\n",
|
||||
priv->enable_spk_gpio.crs_entry_index,
|
||||
priv->enable_spk_gpio.active_low ? "low" : "high",
|
||||
priv->enable_hp_gpio.crs_entry_index,
|
||||
priv->enable_hp_gpio.active_low ? "low" : "high");
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int acp3x_es83xx_configure_mics(struct acp3x_es83xx_private *priv)
|
||||
{
|
||||
int num_routes = 0;
|
||||
int i;
|
||||
|
||||
if (!(priv->quirk & ES83XX_ENABLE_DMIC)) {
|
||||
priv->mic_map[num_routes].sink = "MIC1";
|
||||
priv->mic_map[num_routes].source = "Internal Mic";
|
||||
num_routes++;
|
||||
}
|
||||
|
||||
priv->mic_map[num_routes].sink = "MIC2";
|
||||
priv->mic_map[num_routes].source = "Headset Mic";
|
||||
num_routes++;
|
||||
|
||||
for (i = 0; i < num_routes; i++)
|
||||
dev_info(priv->codec_dev, "%s is %s\n",
|
||||
priv->mic_map[i].source, priv->mic_map[i].sink);
|
||||
|
||||
return num_routes;
|
||||
}
|
||||
|
||||
static int acp3x_es83xx_init(struct snd_soc_pcm_runtime *runtime)
|
||||
{
|
||||
struct snd_soc_component *codec = snd_soc_rtd_to_codec(runtime, 0)->component;
|
||||
struct snd_soc_card *card = runtime->card;
|
||||
struct acp3x_es83xx_private *priv = get_mach_priv(card);
|
||||
int ret = 0;
|
||||
int num_routes;
|
||||
|
||||
ret = snd_soc_card_jack_new_pins(card, "Headset",
|
||||
SND_JACK_HEADSET | SND_JACK_BTN_0,
|
||||
&es83xx_jack, es83xx_jack_pins,
|
||||
ARRAY_SIZE(es83xx_jack_pins));
|
||||
if (ret) {
|
||||
dev_err(card->dev, "jack creation failed %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
snd_jack_set_key(es83xx_jack.jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
|
||||
|
||||
snd_soc_component_set_jack(codec, &es83xx_jack, NULL);
|
||||
|
||||
priv->codec = codec;
|
||||
acp3x_es83xx_configure_gpios(priv);
|
||||
|
||||
ret = devm_acpi_dev_add_driver_gpios(priv->codec_dev, priv->gpio_mapping);
|
||||
if (ret)
|
||||
dev_warn(priv->codec_dev, "failed to add speaker gpio\n");
|
||||
|
||||
priv->gpio_speakers = gpiod_get_optional(priv->codec_dev, "speakers-enable",
|
||||
priv->enable_spk_gpio.active_low ? GPIOD_OUT_LOW : GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(priv->gpio_speakers)) {
|
||||
dev_err(priv->codec_dev, "could not get speakers-enable GPIO\n");
|
||||
return PTR_ERR(priv->gpio_speakers);
|
||||
}
|
||||
|
||||
priv->gpio_headphone = gpiod_get_optional(priv->codec_dev, "headphone-enable",
|
||||
priv->enable_hp_gpio.active_low ? GPIOD_OUT_LOW : GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(priv->gpio_headphone)) {
|
||||
dev_err(priv->codec_dev, "could not get headphone-enable GPIO\n");
|
||||
return PTR_ERR(priv->gpio_headphone);
|
||||
}
|
||||
|
||||
num_routes = acp3x_es83xx_configure_mics(priv);
|
||||
if (num_routes > 0) {
|
||||
ret = snd_soc_dapm_add_routes(&card->dapm, priv->mic_map, num_routes);
|
||||
if (ret != 0)
|
||||
device_remove_software_node(priv->codec_dev);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct snd_soc_ops acp3x_es83xx_ops = {
|
||||
.startup = acp3x_es83xx_codec_startup,
|
||||
};
|
||||
|
||||
|
||||
SND_SOC_DAILINK_DEF(codec,
|
||||
DAILINK_COMP_ARRAY(COMP_CODEC("i2c-ESSX8336:00", "ES8316 HiFi")));
|
||||
|
||||
static const struct dmi_system_id acp3x_es83xx_dmi_table[] = {
|
||||
{
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "KLVL-WXXW"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),
|
||||
},
|
||||
.driver_data = (void *)(ES83XX_ENABLE_DMIC),
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "KLVL-WXX9"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),
|
||||
},
|
||||
.driver_data = (void *)(ES83XX_ENABLE_DMIC),
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "BOM-WXX9"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),
|
||||
},
|
||||
.driver_data = (void *)(ES83XX_ENABLE_DMIC|ES83XX_48_MHZ_MCLK),
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HVY-WXX9"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1020"),
|
||||
},
|
||||
.driver_data = (void *)(ES83XX_ENABLE_DMIC),
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HVY-WXX9"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1040"),
|
||||
},
|
||||
.driver_data = (void *)(ES83XX_ENABLE_DMIC),
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static int acp3x_es83xx_configure_link(struct snd_soc_card *card, struct snd_soc_dai_link *link)
|
||||
{
|
||||
link->codecs = codec;
|
||||
link->num_codecs = ARRAY_SIZE(codec);
|
||||
link->init = acp3x_es83xx_init;
|
||||
link->ops = &acp3x_es83xx_ops;
|
||||
link->dai_fmt = SND_SOC_DAIFMT_I2S
|
||||
| SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBP_CFP;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acp3x_es83xx_probe(struct snd_soc_card *card)
|
||||
{
|
||||
int ret = 0;
|
||||
struct device *dev = card->dev;
|
||||
const struct dmi_system_id *dmi_id;
|
||||
|
||||
dmi_id = dmi_first_match(acp3x_es83xx_dmi_table);
|
||||
if (dmi_id && dmi_id->driver_data) {
|
||||
struct acp3x_es83xx_private *priv;
|
||||
struct acp_card_drvdata *acp_drvdata;
|
||||
struct acpi_device *adev;
|
||||
struct device *codec_dev;
|
||||
|
||||
acp_drvdata = (struct acp_card_drvdata *)card->drvdata;
|
||||
|
||||
dev_info(dev, "matched DMI table with this system, trying to register sound card\n");
|
||||
|
||||
adev = acpi_dev_get_first_match_dev(acp_drvdata->acpi_mach->id, NULL, -1);
|
||||
if (!adev) {
|
||||
dev_err(dev, "Error cannot find '%s' dev\n", acp_drvdata->acpi_mach->id);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
codec_dev = acpi_get_first_physical_node(adev);
|
||||
acpi_dev_put(adev);
|
||||
if (!codec_dev) {
|
||||
dev_warn(dev, "Error cannot find codec device, will defer probe\n");
|
||||
return -EPROBE_DEFER;
|
||||
}
|
||||
|
||||
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv) {
|
||||
put_device(codec_dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
priv->codec_dev = codec_dev;
|
||||
priv->quirk = (unsigned long)dmi_id->driver_data;
|
||||
acp_drvdata->mach_priv = priv;
|
||||
dev_info(dev, "successfully probed the sound card\n");
|
||||
} else {
|
||||
ret = -ENODEV;
|
||||
dev_warn(dev, "this system has a ES83xx codec defined in ACPI, but the driver doesn't have this system registered in DMI table\n");
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void acp3x_es83xx_init_ops(struct acp_mach_ops *ops)
|
||||
{
|
||||
ops->probe = acp3x_es83xx_probe;
|
||||
ops->configure_widgets = acp3x_es83xx_configure_widgets;
|
||||
ops->configure_link = acp3x_es83xx_configure_link;
|
||||
ops->suspend_pre = acp3x_es83xx_suspend_pre;
|
||||
ops->resume_post = acp3x_es83xx_resume_post;
|
||||
}
|
12
sound/soc/amd/acp/acp3x-es83xx/acp3x-es83xx.h
Normal file
12
sound/soc/amd/acp/acp3x-es83xx/acp3x-es83xx.h
Normal file
@ -0,0 +1,12 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright 2023 Marian Postevca <posteuca@mutex.one>
|
||||
*/
|
||||
|
||||
#ifndef __ACP3X_ES83XX_H
|
||||
#define __ACP3X_ES83XX_H
|
||||
|
||||
void acp3x_es83xx_init_ops(struct acp_mach_ops *ops);
|
||||
|
||||
#endif
|
||||
|
@ -54,7 +54,7 @@ static int acp3x_5682_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
int ret;
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
|
||||
dev_info(rtd->dev, "codec dai name = %s\n", codec_dai->name);
|
||||
@ -126,7 +126,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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
|
||||
/* RT5682 will support only 48K output with 48M mclk */
|
||||
clk_set_rate(rt5682_dai_wclk, 48000);
|
||||
@ -194,7 +194,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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp3x_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
@ -212,7 +212,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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct acp3x_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
@ -228,9 +228,9 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
struct acp3x_platform_info *machine = snd_soc_card_get_drvdata(card);
|
||||
|
||||
machine->cap_i2s_instance = I2S_BT_INSTANCE;
|
||||
|
@ -274,7 +274,7 @@ static int sdw_amd_scan_controller(struct device *dev)
|
||||
dev_dbg(dev, "ACPI reports %d SoundWire Manager devices\n", count);
|
||||
acp_data->sdw_manager_count = count;
|
||||
for (index = 0; index < count; index++) {
|
||||
snprintf(name, sizeof(name), "mipi-sdw-link-%d-subproperties", index);
|
||||
scnprintf(name, sizeof(name), "mipi-sdw-link-%d-subproperties", index);
|
||||
link = fwnode_get_named_child_node(acp_data->sdw_fw_node, name);
|
||||
if (!link) {
|
||||
dev_err(dev, "Manager node %s not found\n", name);
|
||||
@ -650,6 +650,7 @@ static int snd_acp63_probe(struct pci_dev *pci,
|
||||
goto de_init;
|
||||
}
|
||||
skip_pdev_creation:
|
||||
device_set_wakeup_enable(&pci->dev, true);
|
||||
pm_runtime_set_autosuspend_delay(&pci->dev, ACP_SUSPEND_DELAY_MS);
|
||||
pm_runtime_use_autosuspend(&pci->dev);
|
||||
pm_runtime_put_noidle(&pci->dev);
|
||||
|
@ -222,7 +222,7 @@ static int acp63_sdw_dma_open(struct snd_soc_component *component,
|
||||
int ret;
|
||||
|
||||
runtime = substream->runtime;
|
||||
cpu_dai = asoc_rtd_to_cpu(prtd, 0);
|
||||
cpu_dai = snd_soc_rtd_to_cpu(prtd, 0);
|
||||
amd_manager = snd_soc_dai_get_drvdata(cpu_dai);
|
||||
stream = kzalloc(sizeof(*stream), GFP_KERNEL);
|
||||
if (!stream)
|
||||
|
@ -80,7 +80,7 @@ static int acp3x_i2s_hwparams(struct snd_pcm_substream *substream,
|
||||
u32 val;
|
||||
u32 reg_val, frmt_reg;
|
||||
|
||||
prtd = asoc_substream_to_rtd(substream);
|
||||
prtd = snd_soc_substream_to_rtd(substream);
|
||||
rtd = substream->runtime->private_data;
|
||||
card = prtd->card;
|
||||
adata = snd_soc_dai_get_drvdata(dai);
|
||||
|
@ -215,7 +215,7 @@ static int acp3x_dma_open(struct snd_soc_component *component,
|
||||
int ret;
|
||||
|
||||
runtime = substream->runtime;
|
||||
prtd = asoc_substream_to_rtd(substream);
|
||||
prtd = snd_soc_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);
|
||||
@ -252,7 +252,7 @@ static int acp3x_dma_hw_params(struct snd_soc_component *component,
|
||||
struct i2s_dev_data *adata;
|
||||
u64 size;
|
||||
|
||||
prtd = asoc_substream_to_rtd(substream);
|
||||
prtd = snd_soc_substream_to_rtd(substream);
|
||||
card = prtd->card;
|
||||
pinfo = snd_soc_card_get_drvdata(card);
|
||||
adata = dev_get_drvdata(component->dev);
|
||||
@ -327,7 +327,7 @@ static int acp3x_dma_close(struct snd_soc_component *component,
|
||||
struct i2s_dev_data *adata;
|
||||
struct i2s_stream_instance *ins;
|
||||
|
||||
prtd = asoc_substream_to_rtd(substream);
|
||||
prtd = snd_soc_substream_to_rtd(substream);
|
||||
component = snd_soc_rtdcom_lookup(prtd, DRV_NAME);
|
||||
adata = dev_get_drvdata(component->dev);
|
||||
ins = substream->runtime->private_data;
|
||||
|
@ -95,7 +95,7 @@ static int acp5x_i2s_hwparams(struct snd_pcm_substream *substream,
|
||||
|
||||
lrclk_div_val = 0;
|
||||
bclk_div_val = 0;
|
||||
prtd = asoc_substream_to_rtd(substream);
|
||||
prtd = snd_soc_substream_to_rtd(substream);
|
||||
rtd = substream->runtime->private_data;
|
||||
card = prtd->card;
|
||||
adata = snd_soc_dai_get_drvdata(dai);
|
||||
|
@ -92,7 +92,7 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w,
|
||||
|
||||
static int acp5x_8821_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_component *component = asoc_rtd_to_codec(rtd, 0)->component;
|
||||
struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
@ -144,7 +144,7 @@ static struct snd_pcm_hw_constraint_list constraints_sample_bits = {
|
||||
static int acp5x_8821_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct acp5x_platform_info *machine = snd_soc_card_get_drvdata(rtd->card);
|
||||
|
||||
machine->play_i2s_instance = I2S_SP_INSTANCE;
|
||||
@ -165,7 +165,7 @@ static int acp5x_8821_startup(struct snd_pcm_substream *substream)
|
||||
static int acp5x_nau8821_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct snd_soc_dai *dai = snd_soc_card_get_codec_dai(card, ACP5X_NAU8821_DAI_NAME);
|
||||
int ret, bclk;
|
||||
@ -197,7 +197,7 @@ static const struct snd_soc_ops acp5x_8821_ops = {
|
||||
|
||||
static int acp5x_cs35l41_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct acp5x_platform_info *machine = snd_soc_card_get_drvdata(rtd->card);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
|
||||
@ -215,7 +215,7 @@ static int acp5x_cs35l41_startup(struct snd_pcm_substream *substream)
|
||||
static int acp5x_cs35l41_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
unsigned int bclk, rate = params_rate(params);
|
||||
struct snd_soc_component *comp;
|
||||
int ret, i;
|
||||
@ -334,7 +334,7 @@ static struct snd_soc_card acp5x_8821_35l41_card = {
|
||||
|
||||
static int acp5x_max98388_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct acp5x_platform_info *machine = snd_soc_card_get_drvdata(rtd->card);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
|
||||
|
@ -209,7 +209,7 @@ static int acp5x_dma_open(struct snd_soc_component *component,
|
||||
int ret;
|
||||
|
||||
runtime = substream->runtime;
|
||||
prtd = asoc_substream_to_rtd(substream);
|
||||
prtd = snd_soc_substream_to_rtd(substream);
|
||||
component = snd_soc_rtdcom_lookup(prtd, DRV_NAME);
|
||||
adata = dev_get_drvdata(component->dev);
|
||||
|
||||
@ -245,7 +245,7 @@ static int acp5x_dma_hw_params(struct snd_soc_component *component,
|
||||
struct i2s_dev_data *adata;
|
||||
u64 size;
|
||||
|
||||
prtd = asoc_substream_to_rtd(substream);
|
||||
prtd = snd_soc_substream_to_rtd(substream);
|
||||
card = prtd->card;
|
||||
pinfo = snd_soc_card_get_drvdata(card);
|
||||
adata = dev_get_drvdata(component->dev);
|
||||
@ -322,7 +322,7 @@ static int acp5x_dma_close(struct snd_soc_component *component,
|
||||
struct i2s_dev_data *adata;
|
||||
struct i2s_stream_instance *ins;
|
||||
|
||||
prtd = asoc_substream_to_rtd(substream);
|
||||
prtd = snd_soc_substream_to_rtd(substream);
|
||||
component = snd_soc_rtdcom_lookup(prtd, DRV_NAME);
|
||||
adata = dev_get_drvdata(component->dev);
|
||||
ins = substream->runtime->private_data;
|
||||
|
@ -161,7 +161,7 @@ struct mca_data {
|
||||
struct mutex port_mutex;
|
||||
|
||||
int nclusters;
|
||||
struct mca_cluster clusters[];
|
||||
struct mca_cluster clusters[] __counted_by(nclusters);
|
||||
};
|
||||
|
||||
static void mca_modify(struct mca_cluster *cl, int regoffset, u32 mask, u32 val)
|
||||
@ -546,7 +546,7 @@ static int mca_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
|
||||
|
||||
static int mca_fe_get_port(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *fe = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *fe = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *be;
|
||||
struct snd_soc_dpcm *dpcm;
|
||||
|
||||
@ -559,7 +559,7 @@ static int mca_fe_get_port(struct snd_pcm_substream *substream)
|
||||
if (!be)
|
||||
return -EINVAL;
|
||||
|
||||
return mca_dai_to_cluster(asoc_rtd_to_cpu(be, 0))->no;
|
||||
return mca_dai_to_cluster(snd_soc_rtd_to_cpu(be, 0))->no;
|
||||
}
|
||||
|
||||
static int mca_fe_hw_params(struct snd_pcm_substream *substream,
|
||||
@ -700,7 +700,7 @@ static bool mca_be_started(struct mca_cluster *cl)
|
||||
static int mca_be_startup(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *dai)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *be = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *be = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *fe;
|
||||
struct mca_cluster *cl = mca_dai_to_cluster(dai);
|
||||
struct mca_cluster *fe_cl;
|
||||
@ -721,7 +721,7 @@ static int mca_be_startup(struct snd_pcm_substream *substream,
|
||||
if (!fe)
|
||||
return -EINVAL;
|
||||
|
||||
fe_cl = mca_dai_to_cluster(asoc_rtd_to_cpu(fe, 0));
|
||||
fe_cl = mca_dai_to_cluster(snd_soc_rtd_to_cpu(fe, 0));
|
||||
|
||||
if (mca_be_started(cl)) {
|
||||
/*
|
||||
@ -811,8 +811,8 @@ static int mca_set_runtime_hwparams(struct snd_soc_component *component,
|
||||
static int mca_pcm_open(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct mca_cluster *cl = mca_dai_to_cluster(asoc_rtd_to_cpu(rtd, 0));
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct mca_cluster *cl = mca_dai_to_cluster(snd_soc_rtd_to_cpu(rtd, 0));
|
||||
struct dma_chan *chan = cl->dma_chans[substream->stream];
|
||||
int ret;
|
||||
|
||||
@ -830,7 +830,7 @@ static int mca_hw_params(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct dma_chan *chan = snd_dmaengine_pcm_get_chan(substream);
|
||||
struct dma_slave_config slave_config;
|
||||
int ret;
|
||||
@ -857,7 +857,7 @@ static int mca_hw_params(struct snd_soc_component *component,
|
||||
static int mca_close(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
|
||||
if (rtd->dai_link->no_pcm)
|
||||
return 0;
|
||||
@ -868,7 +868,7 @@ static int mca_close(struct snd_soc_component *component,
|
||||
static int mca_trigger(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream, int cmd)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
|
||||
if (rtd->dai_link->no_pcm)
|
||||
return 0;
|
||||
@ -877,7 +877,7 @@ static int mca_trigger(struct snd_soc_component *component,
|
||||
* Before we do the PCM trigger proper, insert an opportunity
|
||||
* to reset the frontend's SERDES.
|
||||
*/
|
||||
mca_fe_early_trigger(substream, cmd, asoc_rtd_to_cpu(rtd, 0));
|
||||
mca_fe_early_trigger(substream, cmd, snd_soc_rtd_to_cpu(rtd, 0));
|
||||
|
||||
return snd_dmaengine_pcm_trigger(substream, cmd);
|
||||
}
|
||||
@ -885,7 +885,7 @@ static int mca_trigger(struct snd_soc_component *component,
|
||||
static snd_pcm_uframes_t mca_pointer(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
|
||||
if (rtd->dai_link->no_pcm)
|
||||
return -ENOTSUPP;
|
||||
@ -911,7 +911,7 @@ static void mca_pcm_free(struct snd_soc_component *component,
|
||||
struct snd_pcm *pcm)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = snd_pcm_chip(pcm);
|
||||
struct mca_cluster *cl = mca_dai_to_cluster(asoc_rtd_to_cpu(rtd, 0));
|
||||
struct mca_cluster *cl = mca_dai_to_cluster(snd_soc_rtd_to_cpu(rtd, 0));
|
||||
unsigned int i;
|
||||
|
||||
if (rtd->dai_link->no_pcm)
|
||||
@ -933,7 +933,7 @@ static void mca_pcm_free(struct snd_soc_component *component,
|
||||
static int mca_pcm_new(struct snd_soc_component *component,
|
||||
struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct mca_cluster *cl = mca_dai_to_cluster(asoc_rtd_to_cpu(rtd, 0));
|
||||
struct mca_cluster *cl = mca_dai_to_cluster(snd_soc_rtd_to_cpu(rtd, 0));
|
||||
unsigned int i;
|
||||
|
||||
if (rtd->dai_link->no_pcm)
|
||||
|
@ -118,7 +118,7 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
int err;
|
||||
|
||||
@ -141,7 +141,7 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
|
||||
if (params_physical_width(params) != 16) {
|
||||
@ -338,7 +338,7 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
struct snd_soc_component *component = cpu_dai->component;
|
||||
int fs;
|
||||
@ -381,7 +381,7 @@ static void
|
||||
atmel_classd_cpu_dai_shutdown(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *cpu_dai)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
|
||||
clk_disable_unprepare(dd->gclk);
|
||||
@ -478,7 +478,7 @@ static int atmel_classd_asoc_card_init(struct device *dev,
|
||||
return -ENOMEM;
|
||||
|
||||
dai_link->cpus = comp;
|
||||
dai_link->codecs = &asoc_dummy_dlc;
|
||||
dai_link->codecs = &snd_soc_dummy_dlc;
|
||||
|
||||
dai_link->num_cpus = 1;
|
||||
dai_link->num_codecs = 1;
|
||||
|
@ -52,10 +52,10 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct atmel_pcm_dma_params *prtd;
|
||||
|
||||
prtd = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
|
||||
prtd = snd_soc_dai_get_dma_data(snd_soc_rtd_to_cpu(rtd, 0), substream);
|
||||
|
||||
if (ssc_sr & prtd->mask->ssc_error) {
|
||||
if (snd_pcm_running(substream))
|
||||
@ -77,12 +77,12 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct atmel_pcm_dma_params *prtd;
|
||||
struct ssc_device *ssc;
|
||||
int ret;
|
||||
|
||||
prtd = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
|
||||
prtd = snd_soc_dai_get_dma_data(snd_soc_rtd_to_cpu(rtd, 0), substream);
|
||||
ssc = prtd->ssc;
|
||||
|
||||
ret = snd_hwparams_to_dma_slave_config(substream, params, slave_config);
|
||||
|
@ -140,12 +140,12 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
|
||||
/* this may get called several times by oss emulation
|
||||
* with different params */
|
||||
|
||||
prtd->params = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
|
||||
prtd->params = snd_soc_dai_get_dma_data(snd_soc_rtd_to_cpu(rtd, 0), substream);
|
||||
prtd->params->dma_intr_handler = atmel_pcm_dma_irq;
|
||||
|
||||
prtd->dma_buffer = runtime->dma_addr;
|
||||
|
@ -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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct atmel_pdmic *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
|
||||
/* Disable the overrun error interrupt */
|
||||
@ -145,7 +145,7 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_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;
|
||||
@ -191,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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct atmel_pdmic *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
int ret;
|
||||
|
||||
@ -356,7 +356,7 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct atmel_pdmic *dd = snd_soc_card_get_drvdata(rtd->card);
|
||||
struct snd_soc_component *component = cpu_dai->component;
|
||||
unsigned int rate_min = substream->runtime->hw.rate_min;
|
||||
@ -501,7 +501,7 @@ static int atmel_pdmic_asoc_card_init(struct device *dev,
|
||||
return -ENOMEM;
|
||||
|
||||
dai_link->cpus = comp;
|
||||
dai_link->codecs = &asoc_dummy_dlc;
|
||||
dai_link->codecs = &snd_soc_dummy_dlc;
|
||||
|
||||
dai_link->num_cpus = 1;
|
||||
dai_link->num_codecs = 1;
|
||||
|
@ -10,7 +10,6 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
|
||||
#include <sound/soc.h>
|
||||
|
||||
@ -26,8 +25,8 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
int ret;
|
||||
|
||||
ret = snd_soc_dai_set_pll(codec_dai, WM8904_FLL_MCLK, WM8904_FLL_MCLK,
|
||||
|
@ -16,7 +16,7 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/lcm.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
#include <sound/core.h>
|
||||
#include <sound/pcm.h>
|
||||
|
@ -21,7 +21,7 @@
|
||||
static int snd_proto_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
|
||||
/* Set proto sysclk */
|
||||
int ret = snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_XTAL,
|
||||
|
@ -66,7 +66,7 @@ static const struct snd_soc_dapm_route intercon[] = {
|
||||
*/
|
||||
static int at91sam9g20ek_wm8731_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
struct device *dev = rtd->dev;
|
||||
int ret;
|
||||
|
||||
|
@ -40,7 +40,7 @@ struct sam9x5_drvdata {
|
||||
*/
|
||||
static int sam9x5_wm8731_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
struct device *dev = rtd->dev;
|
||||
int ret;
|
||||
|
||||
|
@ -38,7 +38,6 @@
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
|
@ -94,8 +94,8 @@ static struct snd_soc_card db1550_ac97_machine = {
|
||||
|
||||
static int db1200_i2s_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
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_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
|
||||
/* WM8731 has its own 12MHz crystal */
|
||||
snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_XTAL,
|
||||
|
@ -278,10 +278,10 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
int stype = substream->stream, *dmaids;
|
||||
|
||||
dmaids = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
|
||||
dmaids = snd_soc_dai_get_dma_data(snd_soc_rtd_to_cpu(rtd, 0), substream);
|
||||
if (!dmaids)
|
||||
return -ENODEV; /* whoa, has ordering changed? */
|
||||
|
||||
|
@ -191,11 +191,11 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
int *dmaids, s = substream->stream;
|
||||
char *name;
|
||||
|
||||
dmaids = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
|
||||
dmaids = snd_soc_dai_get_dma_data(snd_soc_rtd_to_cpu(rtd, 0), substream);
|
||||
if (!dmaids)
|
||||
return -ENODEV; /* whoa, has ordering changed? */
|
||||
|
||||
|
@ -58,7 +58,7 @@ static struct au1xpsc_audio_data *au1xpsc_ac97_workdata;
|
||||
static inline struct au1xpsc_audio_data *ac97_to_pscdata(struct snd_ac97 *x)
|
||||
{
|
||||
struct snd_soc_card *c = x->bus->card->private_data;
|
||||
return snd_soc_dai_get_drvdata(c->asoc_rtd_to_cpu(rtd, 0));
|
||||
return snd_soc_dai_get_drvdata(c->snd_soc_rtd_to_cpu(rtd, 0));
|
||||
}
|
||||
|
||||
#else
|
||||
|
@ -46,13 +46,13 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
|
||||
dma_desc = kzalloc(sizeof(*dma_desc), GFP_NOWAIT);
|
||||
if (!dma_desc)
|
||||
return -ENOMEM;
|
||||
|
||||
snd_soc_dai_set_dma_data(asoc_rtd_to_cpu(rtd, 0), substream, dma_desc);
|
||||
snd_soc_dai_set_dma_data(snd_soc_rtd_to_cpu(rtd, 0), substream, dma_desc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -61,9 +61,9 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
|
||||
dma_desc = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
|
||||
dma_desc = snd_soc_dai_get_dma_data(snd_soc_rtd_to_cpu(rtd, 0), substream);
|
||||
kfree(dma_desc);
|
||||
|
||||
return 0;
|
||||
@ -77,8 +77,8 @@ static int bcm63xx_pcm_trigger(struct snd_soc_component *component,
|
||||
struct bcm_i2s_priv *i2s_priv;
|
||||
struct regmap *regmap_i2s;
|
||||
|
||||
rtd = asoc_substream_to_rtd(substream);
|
||||
i2s_priv = dev_get_drvdata(asoc_rtd_to_cpu(rtd, 0)->dev);
|
||||
rtd = snd_soc_substream_to_rtd(substream);
|
||||
i2s_priv = dev_get_drvdata(snd_soc_rtd_to_cpu(rtd, 0)->dev);
|
||||
regmap_i2s = i2s_priv->regmap_i2s;
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
@ -144,11 +144,11 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
uint32_t regaddr_desclen, regaddr_descaddr;
|
||||
|
||||
dma_desc = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
|
||||
dma_desc = snd_soc_dai_get_dma_data(snd_soc_rtd_to_cpu(rtd, 0), substream);
|
||||
dma_desc->dma_len = snd_pcm_lib_period_bytes(substream);
|
||||
dma_desc->dma_addr = runtime->dma_addr;
|
||||
dma_desc->dma_area = runtime->dma_area;
|
||||
@ -161,7 +161,7 @@ static int bcm63xx_pcm_prepare(struct snd_soc_component *component,
|
||||
regaddr_descaddr = I2S_RX_DESC_IFF_ADDR;
|
||||
}
|
||||
|
||||
i2s_priv = dev_get_drvdata(asoc_rtd_to_cpu(rtd, 0)->dev);
|
||||
i2s_priv = dev_get_drvdata(snd_soc_rtd_to_cpu(rtd, 0)->dev);
|
||||
regmap_i2s = i2s_priv->regmap_i2s;
|
||||
|
||||
regmap_write(regmap_i2s, regaddr_desclen, dma_desc->dma_len);
|
||||
@ -250,9 +250,9 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
rtd = snd_soc_substream_to_rtd(substream);
|
||||
prtd = runtime->private_data;
|
||||
dma_desc = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
|
||||
dma_desc = snd_soc_dai_get_dma_data(snd_soc_rtd_to_cpu(rtd, 0), substream);
|
||||
|
||||
offlevel = (int_status & I2S_RX_DESC_OFF_LEVEL_MASK) >>
|
||||
I2S_RX_DESC_OFF_LEVEL_SHIFT;
|
||||
@ -298,9 +298,9 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
rtd = snd_soc_substream_to_rtd(substream);
|
||||
prtd = runtime->private_data;
|
||||
dma_desc = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
|
||||
dma_desc = snd_soc_dai_get_dma_data(snd_soc_rtd_to_cpu(rtd, 0), substream);
|
||||
|
||||
offlevel = (int_status & I2S_TX_DESC_OFF_LEVEL_MASK) >>
|
||||
I2S_TX_DESC_OFF_LEVEL_SHIFT;
|
||||
@ -352,7 +352,7 @@ static int bcm63xx_soc_pcm_new(struct snd_soc_component *component,
|
||||
struct bcm_i2s_priv *i2s_priv;
|
||||
int ret;
|
||||
|
||||
i2s_priv = dev_get_drvdata(asoc_rtd_to_cpu(rtd, 0)->dev);
|
||||
i2s_priv = dev_get_drvdata(snd_soc_rtd_to_cpu(rtd, 0)->dev);
|
||||
|
||||
of_dma_configure(pcm->card->dev, pcm->card->dev->of_node, 1);
|
||||
|
||||
|
@ -197,9 +197,9 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *soc_runtime = snd_soc_substream_to_rtd(substream);
|
||||
|
||||
return snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(soc_runtime, 0), substream);
|
||||
return snd_soc_dai_get_dma_data(snd_soc_rtd_to_cpu(soc_runtime, 0), substream);
|
||||
}
|
||||
|
||||
static void ringbuf_set_initial(void __iomem *audio_io,
|
||||
@ -343,13 +343,13 @@ static void enable_intr(struct snd_pcm_substream *substream)
|
||||
|
||||
static void disable_intr(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct cygnus_aio_port *aio;
|
||||
u32 set_mask;
|
||||
|
||||
aio = cygnus_dai_get_dma_data(substream);
|
||||
|
||||
dev_dbg(asoc_rtd_to_cpu(rtd, 0)->dev, "%s on port %d\n", __func__, aio->portnum);
|
||||
dev_dbg(snd_soc_rtd_to_cpu(rtd, 0)->dev, "%s on port %d\n", __func__, aio->portnum);
|
||||
|
||||
/* The port number maps to the bit position to be set */
|
||||
set_mask = BIT(aio->portnum);
|
||||
@ -571,7 +571,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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct cygnus_aio_port *aio;
|
||||
int ret;
|
||||
@ -580,7 +580,7 @@ static int cygnus_pcm_open(struct snd_soc_component *component,
|
||||
if (!aio)
|
||||
return -ENODEV;
|
||||
|
||||
dev_dbg(asoc_rtd_to_cpu(rtd, 0)->dev, "%s port %d\n", __func__, aio->portnum);
|
||||
dev_dbg(snd_soc_rtd_to_cpu(rtd, 0)->dev, "%s port %d\n", __func__, aio->portnum);
|
||||
|
||||
snd_soc_set_runtime_hwparams(substream, &cygnus_pcm_hw);
|
||||
|
||||
@ -608,12 +608,12 @@ 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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct cygnus_aio_port *aio;
|
||||
|
||||
aio = cygnus_dai_get_dma_data(substream);
|
||||
|
||||
dev_dbg(asoc_rtd_to_cpu(rtd, 0)->dev, "%s port %d\n", __func__, aio->portnum);
|
||||
dev_dbg(snd_soc_rtd_to_cpu(rtd, 0)->dev, "%s port %d\n", __func__, aio->portnum);
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
aio->play_stream = NULL;
|
||||
@ -621,7 +621,7 @@ static int cygnus_pcm_close(struct snd_soc_component *component,
|
||||
aio->capture_stream = NULL;
|
||||
|
||||
if (!aio->play_stream && !aio->capture_stream)
|
||||
dev_dbg(asoc_rtd_to_cpu(rtd, 0)->dev, "freed port %d\n", aio->portnum);
|
||||
dev_dbg(snd_soc_rtd_to_cpu(rtd, 0)->dev, "freed port %d\n", aio->portnum);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -629,7 +629,7 @@ static int cygnus_pcm_close(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 = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct cygnus_aio_port *aio;
|
||||
unsigned long bufsize, periodsize;
|
||||
@ -638,12 +638,12 @@ static int cygnus_pcm_prepare(struct snd_soc_component *component,
|
||||
struct ringbuf_regs *p_rbuf = NULL;
|
||||
|
||||
aio = cygnus_dai_get_dma_data(substream);
|
||||
dev_dbg(asoc_rtd_to_cpu(rtd, 0)->dev, "%s port %d\n", __func__, aio->portnum);
|
||||
dev_dbg(snd_soc_rtd_to_cpu(rtd, 0)->dev, "%s port %d\n", __func__, aio->portnum);
|
||||
|
||||
bufsize = snd_pcm_lib_buffer_bytes(substream);
|
||||
periodsize = snd_pcm_lib_period_bytes(substream);
|
||||
|
||||
dev_dbg(asoc_rtd_to_cpu(rtd, 0)->dev, "%s (buf_size %lu) (period_size %lu)\n",
|
||||
dev_dbg(snd_soc_rtd_to_cpu(rtd, 0)->dev, "%s (buf_size %lu) (period_size %lu)\n",
|
||||
__func__, bufsize, periodsize);
|
||||
|
||||
configure_ringbuf_regs(substream);
|
||||
|
@ -5,7 +5,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/slab.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/pcm.h>
|
||||
|
@ -22,9 +22,9 @@
|
||||
static int edb93xx_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
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);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
|
||||
int err;
|
||||
unsigned int mclk_rate;
|
||||
unsigned int rate = params_rate(params);
|
||||
|
@ -54,6 +54,7 @@ config SND_SOC_ALL_CODECS
|
||||
imply SND_SOC_ALC5632
|
||||
imply SND_SOC_AUDIO_IIO_AUX
|
||||
imply SND_SOC_AW8738
|
||||
imply SND_SOC_AW87390
|
||||
imply SND_SOC_AW88395
|
||||
imply SND_SOC_AW88261
|
||||
imply SND_SOC_BT_SCO
|
||||
@ -218,6 +219,7 @@ config SND_SOC_ALL_CODECS
|
||||
imply SND_SOC_RT1316_SDW
|
||||
imply SND_SOC_RT1318_SDW
|
||||
imply SND_SOC_RT9120
|
||||
imply SND_SOC_RTQ9128
|
||||
imply SND_SOC_SDW_MOCKUP
|
||||
imply SND_SOC_SGTL5000
|
||||
imply SND_SOC_SI476X
|
||||
@ -638,12 +640,12 @@ config SND_SOC_AW8738
|
||||
operation mode using the Awinic-specific one-wire pulse control.
|
||||
|
||||
config SND_SOC_AW88395_LIB
|
||||
select CRC8
|
||||
tristate
|
||||
|
||||
config SND_SOC_AW88395
|
||||
tristate "Soc Audio for awinic aw88395"
|
||||
depends on I2C
|
||||
select CRC8
|
||||
select CRC32
|
||||
select REGMAP_I2C
|
||||
select GPIOLIB
|
||||
@ -657,7 +659,6 @@ config SND_SOC_AW88395
|
||||
config SND_SOC_AW88261
|
||||
tristate "Soc Audio for awinic aw88261"
|
||||
depends on I2C
|
||||
select CRC8
|
||||
select REGMAP_I2C
|
||||
select GPIOLIB
|
||||
select SND_SOC_AW88395_LIB
|
||||
@ -668,6 +669,17 @@ config SND_SOC_AW88261
|
||||
boost converter can be adjusted smartly according to
|
||||
the input amplitude.
|
||||
|
||||
config SND_SOC_AW87390
|
||||
tristate "Soc Audio for awinic aw87390"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
select SND_SOC_AW88395_LIB
|
||||
help
|
||||
The awinic aw87390 is specifically designed to improve
|
||||
the musical output dynamic range, enhance the overall
|
||||
sound quality, which is a new high efficiency, low
|
||||
noise, constant large volume, 6th Smart K audio amplifier.
|
||||
|
||||
config SND_SOC_BD28623
|
||||
tristate "ROHM BD28623 CODEC"
|
||||
help
|
||||
@ -1636,6 +1648,20 @@ config SND_SOC_RT9120
|
||||
Enable support for Richtek RT9120 20W, stereo, inductor-less,
|
||||
high-efficiency Class-D audio amplifier.
|
||||
|
||||
config SND_SOC_RTQ9128
|
||||
tristate "Richtek RTQ9128 45W Digital Input Amplifier"
|
||||
depends on I2C
|
||||
select REGMAP
|
||||
help
|
||||
Enable support for Richtek RTQ9128 digital input 4-channel
|
||||
automotive audio amplifier. It is a ultra-low output noise,
|
||||
high-efficiency, four-channel class-D audio power amplifier
|
||||
that can deliver over 87% power efficienty at 4x75W into 4Ohm,
|
||||
25V supply in automotive applications.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called snd-soc-rtq9128.
|
||||
|
||||
config SND_SOC_SDW_MOCKUP
|
||||
tristate "SoundWire mockup codec"
|
||||
depends on EXPERT
|
||||
|
@ -47,6 +47,7 @@ snd-soc-ak5558-objs := ak5558.o
|
||||
snd-soc-arizona-objs := arizona.o arizona-jack.o
|
||||
snd-soc-audio-iio-aux-objs := audio-iio-aux.o
|
||||
snd-soc-aw8738-objs := aw8738.o
|
||||
snd-soc-aw87390-objs := aw87390.o
|
||||
snd-soc-aw88395-lib-objs := aw88395/aw88395_lib.o
|
||||
snd-soc-aw88395-objs := aw88395/aw88395.o \
|
||||
aw88395/aw88395_device.o
|
||||
@ -245,6 +246,7 @@ snd-soc-rt715-objs := rt715.o rt715-sdw.o
|
||||
snd-soc-rt715-sdca-objs := rt715-sdca.o rt715-sdca-sdw.o
|
||||
snd-soc-rt722-sdca-objs := rt722-sdca.o rt722-sdca-sdw.o
|
||||
snd-soc-rt9120-objs := rt9120.o
|
||||
snd-soc-rtq9128-objs := rtq9128.o
|
||||
snd-soc-sdw-mockup-objs := sdw-mockup.o
|
||||
snd-soc-sgtl5000-objs := sgtl5000.o
|
||||
snd-soc-alc5623-objs := alc5623.o
|
||||
@ -434,6 +436,7 @@ obj-$(CONFIG_SND_SOC_ALC5632) += snd-soc-alc5632.o
|
||||
obj-$(CONFIG_SND_SOC_ARIZONA) += snd-soc-arizona.o
|
||||
obj-$(CONFIG_SND_SOC_AUDIO_IIO_AUX) += snd-soc-audio-iio-aux.o
|
||||
obj-$(CONFIG_SND_SOC_AW8738) += snd-soc-aw8738.o
|
||||
obj-$(CONFIG_SND_SOC_AW87390) += snd-soc-aw87390.o
|
||||
obj-$(CONFIG_SND_SOC_AW88395_LIB) += snd-soc-aw88395-lib.o
|
||||
obj-$(CONFIG_SND_SOC_AW88395) +=snd-soc-aw88395.o
|
||||
obj-$(CONFIG_SND_SOC_AW88261) +=snd-soc-aw88261.o
|
||||
@ -627,6 +630,7 @@ obj-$(CONFIG_SND_SOC_RT715) += snd-soc-rt715.o
|
||||
obj-$(CONFIG_SND_SOC_RT715_SDCA_SDW) += snd-soc-rt715-sdca.o
|
||||
obj-$(CONFIG_SND_SOC_RT722_SDCA_SDW) += snd-soc-rt722-sdca.o
|
||||
obj-$(CONFIG_SND_SOC_RT9120) += snd-soc-rt9120.o
|
||||
obj-$(CONFIG_SND_SOC_RTQ9128) += snd-soc-rtq9128.o
|
||||
obj-$(CONFIG_SND_SOC_SDW_MOCKUP) += snd-soc-sdw-mockup.o
|
||||
obj-$(CONFIG_SND_SOC_SGTL5000) += snd-soc-sgtl5000.o
|
||||
obj-$(CONFIG_SND_SOC_SIGMADSP) += snd-soc-sigmadsp.o
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/regmap.h>
|
||||
|
@ -10,7 +10,6 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <sound/soc.h>
|
||||
|
||||
|
@ -5,10 +5,10 @@
|
||||
* Copyright (c) 2009 Daniel Mack <daniel@caiaq.de>
|
||||
*/
|
||||
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <sound/asoundef.h>
|
||||
|
@ -8,7 +8,7 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/slab.h>
|
||||
|
@ -9,7 +9,7 @@
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <sound/soc.h>
|
||||
|
@ -9,7 +9,7 @@
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
@ -99,7 +99,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_graph.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/regmap.h>
|
||||
|
@ -24,7 +24,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <sound/soc.h>
|
||||
@ -628,37 +628,23 @@ static struct clk *ak4642_of_parse_mcko(struct device *dev)
|
||||
#define ak4642_of_parse_mcko(d) 0
|
||||
#endif
|
||||
|
||||
static const struct of_device_id ak4642_of_match[];
|
||||
static const struct i2c_device_id ak4642_i2c_id[];
|
||||
static int ak4642_i2c_probe(struct i2c_client *i2c)
|
||||
{
|
||||
struct device *dev = &i2c->dev;
|
||||
struct device_node *np = dev->of_node;
|
||||
const struct ak4642_drvdata *drvdata = NULL;
|
||||
const struct ak4642_drvdata *drvdata;
|
||||
struct regmap *regmap;
|
||||
struct ak4642_priv *priv;
|
||||
struct clk *mcko = NULL;
|
||||
|
||||
if (np) {
|
||||
const struct of_device_id *of_id;
|
||||
|
||||
if (dev_fwnode(dev)) {
|
||||
mcko = ak4642_of_parse_mcko(dev);
|
||||
if (IS_ERR(mcko))
|
||||
mcko = NULL;
|
||||
|
||||
of_id = of_match_device(ak4642_of_match, dev);
|
||||
if (of_id)
|
||||
drvdata = of_id->data;
|
||||
} else {
|
||||
const struct i2c_device_id *id =
|
||||
i2c_match_id(ak4642_i2c_id, i2c);
|
||||
drvdata = (const struct ak4642_drvdata *)id->driver_data;
|
||||
}
|
||||
|
||||
if (!drvdata) {
|
||||
dev_err(dev, "Unknown device type\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
drvdata = i2c_get_match_data(i2c);
|
||||
if (!drvdata)
|
||||
return dev_err_probe(dev, -EINVAL, "Unknown device type\n");
|
||||
|
||||
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
@ -681,7 +667,7 @@ static const struct of_device_id ak4642_of_match[] = {
|
||||
{ .compatible = "asahi-kasei,ak4642", .data = &ak4642_drvdata},
|
||||
{ .compatible = "asahi-kasei,ak4643", .data = &ak4643_drvdata},
|
||||
{ .compatible = "asahi-kasei,ak4648", .data = &ak4648_drvdata},
|
||||
{},
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ak4642_of_match);
|
||||
|
||||
@ -689,7 +675,7 @@ static const struct i2c_device_id ak4642_i2c_id[] = {
|
||||
{ "ak4642", (kernel_ulong_t)&ak4642_drvdata },
|
||||
{ "ak4643", (kernel_ulong_t)&ak4643_drvdata },
|
||||
{ "ak4648", (kernel_ulong_t)&ak4648_drvdata },
|
||||
{ }
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, ak4642_i2c_id);
|
||||
|
||||
|
@ -10,7 +10,6 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <sound/soc.h>
|
||||
#include <sound/pcm.h>
|
||||
@ -168,7 +167,6 @@ static int ak5386_probe(struct platform_device *pdev)
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
priv->reset_gpio = -EINVAL;
|
||||
dev_set_drvdata(dev, priv);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(supply_names); i++)
|
||||
@ -179,9 +177,8 @@ static int ak5386_probe(struct platform_device *pdev)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (of_match_device(of_match_ptr(ak5386_dt_ids), dev))
|
||||
priv->reset_gpio = of_get_named_gpio(dev->of_node,
|
||||
"reset-gpio", 0);
|
||||
priv->reset_gpio = of_get_named_gpio(dev->of_node,
|
||||
"reset-gpio", 0);
|
||||
|
||||
if (gpio_is_valid(priv->reset_gpio))
|
||||
if (devm_gpio_request_one(dev, priv->reset_gpio,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user