mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 14:14:24 +08:00
sound updates for 4.3-rc1
There are little changes in core part, but lots of development are found in drivers, especially ASoC. The diffstat shows regmap- related changes for a slight API additions / changes, and that's all. Looking at the code size statistics, the most significant addition is for Intel Skylake. (Note that SKL support is still underway, the codec driver is missing.) Also STI controller driver is a major addition as well as a few new codec drivers. In HD-audio side, there are fewer changes than the past. The noticeable change is the support of ELD notification from i915 graphics driver. Thus this pull request carries a few changes in drm/i915. Other than that, USB-audio got a rewrite of runtime PM code. It was initiated by lockdep warning, but resulted in a good cleanup in the end. Below are the highlights: Common: - Factoring out of AC'97 reset code from ASoC into the core helper - A few regmap API extensions (in case it's not pulled yet) ASoC: - New drivers for Cirrus CS4349, GTM601, InvenSense ICS43432, Realtek RT298 and ST STI controllers - Machine drivers for Rockchip systems with MAX98090 and RT5645 and RT5650 - Initial driver support for Intel Skylake devices - Lots of rsnd cleanup and enhancements - A few DAPM fixes and cleanups - A large number of cleanups in various drivers (conversion and standardized to regmap, component) mostly by Lars-Peter and Axel HD-audio: - Extended HD-audio core for Intel Skylake controller support - Quirks for Dell headsets, Alienware 15 - Clean up of pin-based quirk tables for Realtek codecs - ELD notifier implenetation for Intel HDMI/DP USB-audio: - Refactor runtime PM code to make lockdep happier -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJV6TwJAAoJEGwxgFQ9KSmkZoEP/06GrsGlfgIfBbnlAKcsZ0t0 RDDCbxmwD8IsjTk180Gs3qBuhVPurhmPxq6Leow5fBktkEK5bIN3eAQkO9aIMroW xxU1UF6Q9XE2j97e/PhhUld7/NP0IQK/YTMuwX74G2kfEkA9Lktl4UjNMw9mKJX2 8OIwz8ZuqSG60znmGlgiqRE4M3Svs1L/jVP1wrPg2DXQfe+ptAJpUTsyVGOMRWm3 IaJ9h5OelPg8Jm61zcg6/pgsdYx4oquCV5wLwMz8rzIUfHb7ox8F7YKOzB+sXtYI zcsTfF2CqifoBcQAh9c+XE4+gMamAdheA+uc8ScUkcskucTj4Fr5tXLiPSN9QMt4 QGOOVjqcpWv5rWwAgzUJvl1/PT4HyQfkXn5tEQVGdg9Ab1SIcQBzD1+nHUV94vKZ N7/grMdqJ56zUGK2fEcBS6BEDlaSToOIHDrQ1iPFNBvmW8qjBq9tYaufTGC6Vtj2 0YKJukzIbyqLIgQtQf44aqLouFIz2lq437PqRQ4W+9C3FwGN9FKCYJ/JzvOGDIJa sSjEwQkJ9vnmZ3E2B30NKb24TG8pPq9WPIN2Rqe5EbHctU3gEnMScwvmG7SmCSG5 LtDVr6Q5XKFM56cVb7tdZl6Jv97BvGu6EERM+zN+8YyMver206rC8upWOev6R2q3 asvLDEchv7Qm3upx+PYg =/sXs -----END PGP SIGNATURE----- Merge tag 'sound-4.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound updates from Takashi Iwai: "There are little changes in core part, but lots of development are found in drivers, especially ASoC. The diffstat shows regmap-related changes for a slight API additions / changes, and that's all. Looking at the code size statistics, the most significant addition is for Intel Skylake. (Note that SKL support is still underway, the codec driver is missing.) Also STI controller driver is a major addition as well as a few new codec drivers. In HD-audio side, there are fewer changes than the past. The noticeable change is the support of ELD notification from i915 graphics driver. Thus this pull request carries a few changes in drm/i915. Other than that, USB-audio got a rewrite of runtime PM code. It was initiated by lockdep warning, but resulted in a good cleanup in the end. Below are the highlights: Common: - Factoring out of AC'97 reset code from ASoC into the core helper - A few regmap API extensions (in case it's not pulled yet) ASoC: - New drivers for Cirrus CS4349, GTM601, InvenSense ICS43432, Realtek RT298 and ST STI controllers - Machine drivers for Rockchip systems with MAX98090 and RT5645 and RT5650 - Initial driver support for Intel Skylake devices - Lots of rsnd cleanup and enhancements - A few DAPM fixes and cleanups - A large number of cleanups in various drivers (conversion and standardized to regmap, component) mostly by Lars-Peter and Axel HD-audio: - Extended HD-audio core for Intel Skylake controller support - Quirks for Dell headsets, Alienware 15 - Clean up of pin-based quirk tables for Realtek codecs - ELD notifier implenetation for Intel HDMI/DP USB-audio: - Refactor runtime PM code to make lockdep happier" * tag 'sound-4.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (411 commits) drm/i915: Add locks around audio component bind/unbind drm/i915: Drop port_mst_index parameter from pin/eld callback ALSA: hda - Fix missing inline for dummy snd_hdac_set_codec_wakeup() ALSA: hda - Wake the codec up on pin/ELD notify events ALSA: hda - allow codecs to access the i915 pin/ELD callback drm/i915: Call audio pin/ELD notify function drm/i915: Add audio pin sense / ELD callback ASoC: zx296702-i2s: Fix resource leak when unload module ASoC: sti_uniperif: Ensure component is unregistered when unload module ASoC: au1x: psc-i2s: Convert to use devm_ioremap_resource ASoC: sh: dma-sh7760: Convert to devm_snd_soc_register_platform ASoC: spear_pcm: Use devm_snd_dmaengine_pcm_register to fix resource leak ALSA: fireworks/bebob/dice/oxfw: fix substreams counting at vmalloc failure ASoC: Clean up docbook warnings ASoC: txx9: Convert to devm_snd_soc_register_platform ASoC: pxa: Convert to devm_snd_soc_register_platform ASoC: nuc900: Convert to devm_snd_soc_register_platform ASoC: blackfin: Convert to devm_snd_soc_register_platform ASoC: au1x: Convert to devm_snd_soc_register_platform ASoC: qcom: Constify asoc_qcom_lpass_cpu_dai_ops ...
This commit is contained in:
commit
abebcdfb64
@ -108,7 +108,7 @@
|
||||
<sect1><title>ASoC Core API</title>
|
||||
!Iinclude/sound/soc.h
|
||||
!Esound/soc/soc-core.c
|
||||
!Esound/soc/soc-cache.c
|
||||
<!-- !Esound/soc/soc-cache.c no docbook comments here -->
|
||||
!Esound/soc/soc-devres.c
|
||||
!Esound/soc/soc-io.c
|
||||
!Esound/soc/soc-pcm.c
|
||||
|
19
Documentation/devicetree/bindings/sound/cs4349.txt
Normal file
19
Documentation/devicetree/bindings/sound/cs4349.txt
Normal file
@ -0,0 +1,19 @@
|
||||
CS4349 audio CODEC
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : "cirrus,cs4349"
|
||||
|
||||
- reg : the I2C address of the device for I2C
|
||||
|
||||
Optional properties:
|
||||
|
||||
- reset-gpios : a GPIO spec for the reset pin.
|
||||
|
||||
Example:
|
||||
|
||||
codec: cs4349@48 {
|
||||
compatible = "cirrus,cs4349";
|
||||
reg = <0x48>;
|
||||
reset-gpios = <&gpio 54 0>;
|
||||
};
|
17
Documentation/devicetree/bindings/sound/ics43432.txt
Normal file
17
Documentation/devicetree/bindings/sound/ics43432.txt
Normal file
@ -0,0 +1,17 @@
|
||||
Invensense ICS-43432 MEMS microphone with I2S output.
|
||||
|
||||
There are no software configuration options for this device, indeed, the only
|
||||
host connection is the I2S interface. Apart from requirements on clock
|
||||
frequency (460 kHz to 3.379 MHz according to the data sheet) there must be
|
||||
64 clock cycles in each stereo output frame; 24 of the 32 available bits
|
||||
contain audio data. A hardware pin determines if the device outputs data
|
||||
on the left or right channel of the I2S frame.
|
||||
|
||||
Required properties:
|
||||
- compatible : Must be "invensense,ics43432"
|
||||
|
||||
Example:
|
||||
|
||||
ics43432: ics43432 {
|
||||
compatible = "invensense,ics43432";
|
||||
};
|
@ -4,7 +4,11 @@ This node models the Maxim MAX98357A DAC.
|
||||
|
||||
Required properties:
|
||||
- compatible : "maxim,max98357a"
|
||||
- sdmode-gpios : GPIO specifier for the GPIO -> DAC SDMODE pin
|
||||
|
||||
Optional properties:
|
||||
- sdmode-gpios : GPIO specifier for the chip's SD_MODE pin.
|
||||
If this option is not specified then driver does not manage
|
||||
the pin state (e.g. chip is always on).
|
||||
|
||||
Example:
|
||||
|
||||
|
@ -18,6 +18,12 @@ Required properties:
|
||||
- rcar_sound,src : Should contain SRC feature.
|
||||
The number of SRC subnode should be same as HW.
|
||||
see below for detail.
|
||||
- rcar_sound,ctu : Should contain CTU feature.
|
||||
The number of CTU subnode should be same as HW.
|
||||
see below for detail.
|
||||
- rcar_sound,mix : Should contain MIX feature.
|
||||
The number of MIX subnode should be same as HW.
|
||||
see below for detail.
|
||||
- rcar_sound,dvc : Should contain DVC feature.
|
||||
The number of DVC subnode should be same as HW.
|
||||
see below for detail.
|
||||
@ -90,6 +96,22 @@ rcar_sound: sound@ec500000 {
|
||||
};
|
||||
};
|
||||
|
||||
rcar_sound,mix {
|
||||
mix0: mix@0 { };
|
||||
mix1: mix@1 { };
|
||||
};
|
||||
|
||||
rcar_sound,ctu {
|
||||
ctu00: ctu@0 { };
|
||||
ctu01: ctu@1 { };
|
||||
ctu02: ctu@2 { };
|
||||
ctu03: ctu@3 { };
|
||||
ctu10: ctu@4 { };
|
||||
ctu11: ctu@5 { };
|
||||
ctu12: ctu@6 { };
|
||||
ctu13: ctu@7 { };
|
||||
};
|
||||
|
||||
rcar_sound,src {
|
||||
src0: src@0 {
|
||||
interrupts = <0 352 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
@ -6,6 +6,7 @@ Required properties:
|
||||
|
||||
- compatible : "renesas,rsrc-card,<board>"
|
||||
Examples with soctypes are:
|
||||
- "renesas,rsrc-card"
|
||||
- "renesas,rsrc-card,lager"
|
||||
- "renesas,rsrc-card,koelsch"
|
||||
Optional properties:
|
||||
@ -29,6 +30,12 @@ Optional subnode properties:
|
||||
- frame-inversion : bool property. Add this if the
|
||||
dai-link uses frame clock inversion.
|
||||
- convert-rate : platform specified sampling rate convert
|
||||
- audio-prefix : see audio-routing
|
||||
- audio-routing : A list of the connections between audio components.
|
||||
Each entry is a pair of strings, the first being the connection's sink,
|
||||
the second being the connection's source. Valid names for sources.
|
||||
use audio-prefix if some components is using same sink/sources naming.
|
||||
it can be used if compatible was "renesas,rsrc-card";
|
||||
|
||||
Required CPU/CODEC subnodes properties:
|
||||
|
||||
|
@ -0,0 +1,19 @@
|
||||
ROCKCHIP with MAX98090 CODEC
|
||||
|
||||
Required properties:
|
||||
- compatible: "rockchip,rockchip-audio-max98090"
|
||||
- rockchip,model: The user-visible name of this sound complex
|
||||
- rockchip,i2s-controller: The phandle of the Rockchip I2S controller that's
|
||||
connected to the CODEC
|
||||
- rockchip,audio-codec: The phandle of the MAX98090 audio codec
|
||||
- rockchip,headset-codec: The phandle of Ext chip for jack detection
|
||||
|
||||
Example:
|
||||
|
||||
sound {
|
||||
compatible = "rockchip,rockchip-audio-max98090";
|
||||
rockchip,model = "ROCKCHIP-I2S";
|
||||
rockchip,i2s-controller = <&i2s>;
|
||||
rockchip,audio-codec = <&max98090>;
|
||||
rockchip,headset-codec = <&headsetcodec>;
|
||||
};
|
17
Documentation/devicetree/bindings/sound/rockchip-rt5645.txt
Normal file
17
Documentation/devicetree/bindings/sound/rockchip-rt5645.txt
Normal file
@ -0,0 +1,17 @@
|
||||
ROCKCHIP with RT5645/RT5650 CODECS
|
||||
|
||||
Required properties:
|
||||
- compatible: "rockchip,rockchip-audio-rt5645"
|
||||
- rockchip,model: The user-visible name of this sound complex
|
||||
- rockchip,i2s-controller: The phandle of the Rockchip I2S controller that's
|
||||
connected to the CODEC
|
||||
- rockchip,audio-codec: The phandle of the RT5645/RT5650 audio codec
|
||||
|
||||
Example:
|
||||
|
||||
sound {
|
||||
compatible = "rockchip,rockchip-audio-rt5645";
|
||||
rockchip,model = "ROCKCHIP-I2S";
|
||||
rockchip,i2s-controller = <&i2s>;
|
||||
rockchip,audio-codec = <&rt5645>;
|
||||
};
|
155
Documentation/devicetree/bindings/sound/st,sti-asoc-card.txt
Normal file
155
Documentation/devicetree/bindings/sound/st,sti-asoc-card.txt
Normal file
@ -0,0 +1,155 @@
|
||||
STMicroelectronics sti ASoC cards
|
||||
|
||||
The sti ASoC Sound Card can be used, for all sti SoCs using internal sti-sas
|
||||
codec or external codecs.
|
||||
|
||||
sti sound drivers allows to expose sti SoC audio interface through the
|
||||
generic ASoC simple card. For details about sound card declaration please refer to
|
||||
Documentation/devicetree/bindings/sound/simple-card.txt.
|
||||
|
||||
1) sti-uniperiph-dai: audio dai device.
|
||||
---------------------------------------
|
||||
|
||||
Required properties:
|
||||
- compatible: "st,sti-uni-player" or "st,sti-uni-reader"
|
||||
|
||||
- st,syscfg: phandle to boot-device system configuration registers
|
||||
|
||||
- clock-names: name of the clocks listed in clocks property in the same order
|
||||
|
||||
- reg: CPU DAI IP Base address and size entries, listed in same
|
||||
order than the CPU_DAI properties.
|
||||
|
||||
- reg-names: names of the mapped memory regions listed in regs property in
|
||||
the same order.
|
||||
|
||||
- interrupts: CPU_DAI interrupt line, listed in the same order than the
|
||||
CPU_DAI properties.
|
||||
|
||||
- dma: CPU_DAI DMA controller phandle and DMA request line, listed in the same
|
||||
order than the CPU_DAI properties.
|
||||
|
||||
- dma-names: identifier string for each DMA request line in the dmas property.
|
||||
"tx" for "st,sti-uni-player" compatibility
|
||||
"rx" for "st,sti-uni-reader" compatibility
|
||||
|
||||
- version: IP version integrated in SOC.
|
||||
|
||||
- dai-name: DAI name that describes the IP.
|
||||
|
||||
Required properties ("st,sti-uni-player" compatibility only):
|
||||
- clocks: CPU_DAI IP clock source, listed in the same order than the
|
||||
CPU_DAI properties.
|
||||
|
||||
- uniperiph-id: internal SOC IP instance ID.
|
||||
|
||||
- IP mode: IP working mode depending on associated codec.
|
||||
"HDMI" connected to HDMI codec IP and IEC HDMI formats.
|
||||
"SPDIF"connected to SPDIF codec and support SPDIF formats.
|
||||
"PCM" PCM standard mode for I2S or TDM bus.
|
||||
|
||||
Optional properties:
|
||||
- pinctrl-0: defined for CPU_DAI@1 and CPU_DAI@4 to describe I2S PIOs for
|
||||
external codecs connection.
|
||||
|
||||
- pinctrl-names: should contain only one value - "default".
|
||||
|
||||
Example:
|
||||
|
||||
sti_uni_player2: sti-uni-player@2 {
|
||||
compatible = "st,sti-uni-player";
|
||||
status = "okay";
|
||||
#sound-dai-cells = <0>;
|
||||
st,syscfg = <&syscfg_core>;
|
||||
clocks = <&clk_s_d0_flexgen CLK_PCM_2>;
|
||||
reg = <0x8D82000 0x158>;
|
||||
interrupts = <GIC_SPI 86 IRQ_TYPE_NONE>;
|
||||
dmas = <&fdma0 4 0 1>;
|
||||
dai-name = "Uni Player #1 (DAC)";
|
||||
dma-names = "tx";
|
||||
uniperiph-id = <2>;
|
||||
version = <5>;
|
||||
mode = "PCM";
|
||||
};
|
||||
|
||||
sti_uni_player3: sti-uni-player@3 {
|
||||
compatible = "st,sti-uni-player";
|
||||
status = "okay";
|
||||
#sound-dai-cells = <0>;
|
||||
st,syscfg = <&syscfg_core>;
|
||||
clocks = <&clk_s_d0_flexgen CLK_SPDIFF>;
|
||||
reg = <0x8D85000 0x158>;
|
||||
interrupts = <GIC_SPI 89 IRQ_TYPE_NONE>;
|
||||
dmas = <&fdma0 7 0 1>;
|
||||
dma-names = "tx";
|
||||
dai-name = "Uni Player #1 (PIO)";
|
||||
uniperiph-id = <3>;
|
||||
version = <5>;
|
||||
mode = "SPDIF";
|
||||
};
|
||||
|
||||
sti_uni_reader1: sti-uni-reader@1 {
|
||||
compatible = "st,sti-uni-reader";
|
||||
status = "disabled";
|
||||
#sound-dai-cells = <0>;
|
||||
st,syscfg = <&syscfg_core>;
|
||||
reg = <0x8D84000 0x158>;
|
||||
interrupts = <GIC_SPI 88 IRQ_TYPE_NONE>;
|
||||
dmas = <&fdma0 6 0 1>;
|
||||
dma-names = "rx";
|
||||
dai-name = "Uni Reader #1 (HDMI RX)";
|
||||
version = <3>;
|
||||
};
|
||||
|
||||
2) sti-sas-codec: internal audio codec IPs driver
|
||||
-------------------------------------------------
|
||||
|
||||
Required properties:
|
||||
- compatible: "st,sti<chip>-sas-codec" .
|
||||
Should be chip "st,stih416-sas-codec" or "st,stih407-sas-codec"
|
||||
|
||||
- st,syscfg: phandle to boot-device system configuration registers.
|
||||
|
||||
- pinctrl-0: SPDIF PIO description.
|
||||
|
||||
- pinctrl-names: should contain only one value - "default".
|
||||
|
||||
Example:
|
||||
sti_sas_codec: sti-sas-codec {
|
||||
compatible = "st,stih407-sas-codec";
|
||||
#sound-dai-cells = <1>;
|
||||
st,reg_audio = <&syscfg_core>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_spdif_out >;
|
||||
};
|
||||
|
||||
Example of audio card declaration:
|
||||
sound {
|
||||
compatible = "simple-audio-card";
|
||||
simple-audio-card,name = "sti audio card";
|
||||
status = "okay";
|
||||
|
||||
simple-audio-card,dai-link@0 {
|
||||
/* DAC */
|
||||
format = "i2s";
|
||||
dai-tdm-slot-width = <32>;
|
||||
cpu {
|
||||
sound-dai = <&sti_uni_player2>;
|
||||
};
|
||||
|
||||
codec {
|
||||
sound-dai = <&sti_sasg_codec 1>;
|
||||
};
|
||||
};
|
||||
simple-audio-card,dai-link@1 {
|
||||
/* SPDIF */
|
||||
format = "left_j";
|
||||
cpu {
|
||||
sound-dai = <&sti_uni_player3>;
|
||||
};
|
||||
|
||||
codec {
|
||||
sound-dai = <&sti_sasg_codec 0>;
|
||||
};
|
||||
};
|
||||
};
|
@ -111,6 +111,7 @@ ingenic Ingenic Semiconductor
|
||||
innolux Innolux Corporation
|
||||
intel Intel Corporation
|
||||
intercontrol Inter Control Group
|
||||
invensense InvenSense Inc.
|
||||
isee ISEE 2007 S.L.
|
||||
isil Intersil
|
||||
jedec JEDEC Solid State Technology Association
|
||||
@ -155,6 +156,7 @@ nvidia NVIDIA
|
||||
nxp NXP Semiconductors
|
||||
onnn ON Semiconductor Corp.
|
||||
opencores OpenCores.org
|
||||
option Option NV
|
||||
ortustech Ortus Technology Co., Ltd.
|
||||
ovti OmniVision Technologies
|
||||
panasonic Panasonic Corporation
|
||||
|
@ -136,7 +136,7 @@ struct regmap {
|
||||
/* if set, the HW registers are known to match map->reg_defaults */
|
||||
bool no_sync_defaults;
|
||||
|
||||
struct reg_default *patch;
|
||||
struct reg_sequence *patch;
|
||||
int patch_regs;
|
||||
|
||||
/* if set, converts bulk rw to single rw */
|
||||
|
@ -34,7 +34,7 @@
|
||||
|
||||
static int _regmap_update_bits(struct regmap *map, unsigned int reg,
|
||||
unsigned int mask, unsigned int val,
|
||||
bool *change);
|
||||
bool *change, bool force_write);
|
||||
|
||||
static int _regmap_bus_reg_read(void *context, unsigned int reg,
|
||||
unsigned int *val);
|
||||
@ -1178,7 +1178,7 @@ static int _regmap_select_page(struct regmap *map, unsigned int *reg,
|
||||
ret = _regmap_update_bits(map, range->selector_reg,
|
||||
range->selector_mask,
|
||||
win_page << range->selector_shift,
|
||||
&page_chg);
|
||||
&page_chg, false);
|
||||
|
||||
map->work_buf = orig_work_buf;
|
||||
|
||||
@ -1624,6 +1624,18 @@ int regmap_fields_write(struct regmap_field *field, unsigned int id,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(regmap_fields_write);
|
||||
|
||||
int regmap_fields_force_write(struct regmap_field *field, unsigned int id,
|
||||
unsigned int val)
|
||||
{
|
||||
if (id >= field->id_size)
|
||||
return -EINVAL;
|
||||
|
||||
return regmap_write_bits(field->regmap,
|
||||
field->reg + (field->id_offset * id),
|
||||
field->mask, val << field->shift);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(regmap_fields_force_write);
|
||||
|
||||
/**
|
||||
* regmap_fields_update_bits(): Perform a read/modify/write cycle
|
||||
* on the register field
|
||||
@ -1743,7 +1755,7 @@ EXPORT_SYMBOL_GPL(regmap_bulk_write);
|
||||
* relative. The page register has been written if that was neccessary.
|
||||
*/
|
||||
static int _regmap_raw_multi_reg_write(struct regmap *map,
|
||||
const struct reg_default *regs,
|
||||
const struct reg_sequence *regs,
|
||||
size_t num_regs)
|
||||
{
|
||||
int ret;
|
||||
@ -1800,12 +1812,12 @@ static unsigned int _regmap_register_page(struct regmap *map,
|
||||
}
|
||||
|
||||
static int _regmap_range_multi_paged_reg_write(struct regmap *map,
|
||||
struct reg_default *regs,
|
||||
struct reg_sequence *regs,
|
||||
size_t num_regs)
|
||||
{
|
||||
int ret;
|
||||
int i, n;
|
||||
struct reg_default *base;
|
||||
struct reg_sequence *base;
|
||||
unsigned int this_page = 0;
|
||||
/*
|
||||
* the set of registers are not neccessarily in order, but
|
||||
@ -1843,7 +1855,7 @@ static int _regmap_range_multi_paged_reg_write(struct regmap *map,
|
||||
}
|
||||
|
||||
static int _regmap_multi_reg_write(struct regmap *map,
|
||||
const struct reg_default *regs,
|
||||
const struct reg_sequence *regs,
|
||||
size_t num_regs)
|
||||
{
|
||||
int i;
|
||||
@ -1895,8 +1907,8 @@ static int _regmap_multi_reg_write(struct regmap *map,
|
||||
struct regmap_range_node *range;
|
||||
range = _regmap_range_lookup(map, reg);
|
||||
if (range) {
|
||||
size_t len = sizeof(struct reg_default)*num_regs;
|
||||
struct reg_default *base = kmemdup(regs, len,
|
||||
size_t len = sizeof(struct reg_sequence)*num_regs;
|
||||
struct reg_sequence *base = kmemdup(regs, len,
|
||||
GFP_KERNEL);
|
||||
if (!base)
|
||||
return -ENOMEM;
|
||||
@ -1929,7 +1941,7 @@ static int _regmap_multi_reg_write(struct regmap *map,
|
||||
* A value of zero will be returned on success, a negative errno will be
|
||||
* returned in error cases.
|
||||
*/
|
||||
int regmap_multi_reg_write(struct regmap *map, const struct reg_default *regs,
|
||||
int regmap_multi_reg_write(struct regmap *map, const struct reg_sequence *regs,
|
||||
int num_regs)
|
||||
{
|
||||
int ret;
|
||||
@ -1962,7 +1974,7 @@ EXPORT_SYMBOL_GPL(regmap_multi_reg_write);
|
||||
* be returned in error cases.
|
||||
*/
|
||||
int regmap_multi_reg_write_bypassed(struct regmap *map,
|
||||
const struct reg_default *regs,
|
||||
const struct reg_sequence *regs,
|
||||
int num_regs)
|
||||
{
|
||||
int ret;
|
||||
@ -2327,7 +2339,7 @@ EXPORT_SYMBOL_GPL(regmap_bulk_read);
|
||||
|
||||
static int _regmap_update_bits(struct regmap *map, unsigned int reg,
|
||||
unsigned int mask, unsigned int val,
|
||||
bool *change)
|
||||
bool *change, bool force_write)
|
||||
{
|
||||
int ret;
|
||||
unsigned int tmp, orig;
|
||||
@ -2339,7 +2351,7 @@ static int _regmap_update_bits(struct regmap *map, unsigned int reg,
|
||||
tmp = orig & ~mask;
|
||||
tmp |= val & mask;
|
||||
|
||||
if (tmp != orig) {
|
||||
if (force_write || (tmp != orig)) {
|
||||
ret = _regmap_write(map, reg, tmp);
|
||||
if (change)
|
||||
*change = true;
|
||||
@ -2367,13 +2379,36 @@ int regmap_update_bits(struct regmap *map, unsigned int reg,
|
||||
int ret;
|
||||
|
||||
map->lock(map->lock_arg);
|
||||
ret = _regmap_update_bits(map, reg, mask, val, NULL);
|
||||
ret = _regmap_update_bits(map, reg, mask, val, NULL, false);
|
||||
map->unlock(map->lock_arg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(regmap_update_bits);
|
||||
|
||||
/**
|
||||
* regmap_write_bits: Perform a read/modify/write cycle on the register map
|
||||
*
|
||||
* @map: Register map to update
|
||||
* @reg: Register to update
|
||||
* @mask: Bitmask to change
|
||||
* @val: New value for bitmask
|
||||
*
|
||||
* Returns zero for success, a negative number on error.
|
||||
*/
|
||||
int regmap_write_bits(struct regmap *map, unsigned int reg,
|
||||
unsigned int mask, unsigned int val)
|
||||
{
|
||||
int ret;
|
||||
|
||||
map->lock(map->lock_arg);
|
||||
ret = _regmap_update_bits(map, reg, mask, val, NULL, true);
|
||||
map->unlock(map->lock_arg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(regmap_write_bits);
|
||||
|
||||
/**
|
||||
* regmap_update_bits_async: Perform a read/modify/write cycle on the register
|
||||
* map asynchronously
|
||||
@ -2398,7 +2433,7 @@ int regmap_update_bits_async(struct regmap *map, unsigned int reg,
|
||||
|
||||
map->async = true;
|
||||
|
||||
ret = _regmap_update_bits(map, reg, mask, val, NULL);
|
||||
ret = _regmap_update_bits(map, reg, mask, val, NULL, false);
|
||||
|
||||
map->async = false;
|
||||
|
||||
@ -2427,7 +2462,7 @@ int regmap_update_bits_check(struct regmap *map, unsigned int reg,
|
||||
int ret;
|
||||
|
||||
map->lock(map->lock_arg);
|
||||
ret = _regmap_update_bits(map, reg, mask, val, change);
|
||||
ret = _regmap_update_bits(map, reg, mask, val, change, false);
|
||||
map->unlock(map->lock_arg);
|
||||
return ret;
|
||||
}
|
||||
@ -2460,7 +2495,7 @@ int regmap_update_bits_check_async(struct regmap *map, unsigned int reg,
|
||||
|
||||
map->async = true;
|
||||
|
||||
ret = _regmap_update_bits(map, reg, mask, val, change);
|
||||
ret = _regmap_update_bits(map, reg, mask, val, change, false);
|
||||
|
||||
map->async = false;
|
||||
|
||||
@ -2552,10 +2587,10 @@ EXPORT_SYMBOL_GPL(regmap_async_complete);
|
||||
* The caller must ensure that this function cannot be called
|
||||
* concurrently with either itself or regcache_sync().
|
||||
*/
|
||||
int regmap_register_patch(struct regmap *map, const struct reg_default *regs,
|
||||
int regmap_register_patch(struct regmap *map, const struct reg_sequence *regs,
|
||||
int num_regs)
|
||||
{
|
||||
struct reg_default *p;
|
||||
struct reg_sequence *p;
|
||||
int ret;
|
||||
bool bypass;
|
||||
|
||||
@ -2564,7 +2599,7 @@ int regmap_register_patch(struct regmap *map, const struct reg_default *regs,
|
||||
return 0;
|
||||
|
||||
p = krealloc(map->patch,
|
||||
sizeof(struct reg_default) * (map->patch_regs + num_regs),
|
||||
sizeof(struct reg_sequence) * (map->patch_regs + num_regs),
|
||||
GFP_KERNEL);
|
||||
if (p) {
|
||||
memcpy(p + map->patch_regs, regs, num_regs * sizeof(*regs));
|
||||
|
@ -54,7 +54,7 @@ static struct adv7511 *encoder_to_adv7511(struct drm_encoder *encoder)
|
||||
}
|
||||
|
||||
/* ADI recommended values for proper operation. */
|
||||
static const struct reg_default adv7511_fixed_registers[] = {
|
||||
static const struct reg_sequence adv7511_fixed_registers[] = {
|
||||
{ 0x98, 0x03 },
|
||||
{ 0x9a, 0xe0 },
|
||||
{ 0x9c, 0x30 },
|
||||
|
@ -1809,6 +1809,7 @@ struct drm_i915_private {
|
||||
struct drm_property *force_audio_property;
|
||||
|
||||
/* hda/i915 audio component */
|
||||
struct i915_audio_component *audio_component;
|
||||
bool audio_component_registered;
|
||||
|
||||
uint32_t hw_context_size;
|
||||
|
@ -399,6 +399,9 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder)
|
||||
struct drm_connector *connector;
|
||||
struct drm_device *dev = encoder->dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct i915_audio_component *acomp = dev_priv->audio_component;
|
||||
struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
|
||||
enum port port = intel_dig_port->port;
|
||||
|
||||
connector = drm_select_eld(encoder, mode);
|
||||
if (!connector)
|
||||
@ -419,6 +422,9 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder)
|
||||
|
||||
if (dev_priv->display.audio_codec_enable)
|
||||
dev_priv->display.audio_codec_enable(connector, intel_encoder, mode);
|
||||
|
||||
if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
|
||||
acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr, (int) port);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -428,13 +434,20 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder)
|
||||
* The disable sequences must be performed before disabling the transcoder or
|
||||
* port.
|
||||
*/
|
||||
void intel_audio_codec_disable(struct intel_encoder *encoder)
|
||||
void intel_audio_codec_disable(struct intel_encoder *intel_encoder)
|
||||
{
|
||||
struct drm_device *dev = encoder->base.dev;
|
||||
struct drm_encoder *encoder = &intel_encoder->base;
|
||||
struct drm_device *dev = encoder->dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct i915_audio_component *acomp = dev_priv->audio_component;
|
||||
struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
|
||||
enum port port = intel_dig_port->port;
|
||||
|
||||
if (dev_priv->display.audio_codec_disable)
|
||||
dev_priv->display.audio_codec_disable(encoder);
|
||||
dev_priv->display.audio_codec_disable(intel_encoder);
|
||||
|
||||
if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
|
||||
acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr, (int) port);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -525,12 +538,16 @@ static int i915_audio_component_bind(struct device *i915_dev,
|
||||
struct device *hda_dev, void *data)
|
||||
{
|
||||
struct i915_audio_component *acomp = data;
|
||||
struct drm_i915_private *dev_priv = dev_to_i915(i915_dev);
|
||||
|
||||
if (WARN_ON(acomp->ops || acomp->dev))
|
||||
return -EEXIST;
|
||||
|
||||
drm_modeset_lock_all(dev_priv->dev);
|
||||
acomp->ops = &i915_audio_component_ops;
|
||||
acomp->dev = i915_dev;
|
||||
dev_priv->audio_component = acomp;
|
||||
drm_modeset_unlock_all(dev_priv->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -539,9 +556,13 @@ static void i915_audio_component_unbind(struct device *i915_dev,
|
||||
struct device *hda_dev, void *data)
|
||||
{
|
||||
struct i915_audio_component *acomp = data;
|
||||
struct drm_i915_private *dev_priv = dev_to_i915(i915_dev);
|
||||
|
||||
drm_modeset_lock_all(dev_priv->dev);
|
||||
acomp->ops = NULL;
|
||||
acomp->dev = NULL;
|
||||
dev_priv->audio_component = NULL;
|
||||
drm_modeset_unlock_all(dev_priv->dev);
|
||||
}
|
||||
|
||||
static const struct component_ops i915_audio_component_bind_ops = {
|
||||
|
@ -313,14 +313,14 @@ static void drv260x_close(struct input_dev *input)
|
||||
gpiod_set_value(haptics->enable_gpio, 0);
|
||||
}
|
||||
|
||||
static const struct reg_default drv260x_lra_cal_regs[] = {
|
||||
static const struct reg_sequence drv260x_lra_cal_regs[] = {
|
||||
{ DRV260X_MODE, DRV260X_AUTO_CAL },
|
||||
{ DRV260X_CTRL3, DRV260X_NG_THRESH_2 },
|
||||
{ DRV260X_FEEDBACK_CTRL, DRV260X_FB_REG_LRA_MODE |
|
||||
DRV260X_BRAKE_FACTOR_4X | DRV260X_LOOP_GAIN_HIGH },
|
||||
};
|
||||
|
||||
static const struct reg_default drv260x_lra_init_regs[] = {
|
||||
static const struct reg_sequence drv260x_lra_init_regs[] = {
|
||||
{ DRV260X_MODE, DRV260X_RT_PLAYBACK },
|
||||
{ DRV260X_A_TO_V_CTRL, DRV260X_AUDIO_HAPTICS_PEAK_20MS |
|
||||
DRV260X_AUDIO_HAPTICS_FILTER_125HZ },
|
||||
@ -337,7 +337,7 @@ static const struct reg_default drv260x_lra_init_regs[] = {
|
||||
{ DRV260X_CTRL4, DRV260X_AUTOCAL_TIME_500MS },
|
||||
};
|
||||
|
||||
static const struct reg_default drv260x_erm_cal_regs[] = {
|
||||
static const struct reg_sequence drv260x_erm_cal_regs[] = {
|
||||
{ DRV260X_MODE, DRV260X_AUTO_CAL },
|
||||
{ DRV260X_A_TO_V_MIN_INPUT, DRV260X_AUDIO_HAPTICS_MIN_IN_VOLT },
|
||||
{ DRV260X_A_TO_V_MAX_INPUT, DRV260X_AUDIO_HAPTICS_MAX_IN_VOLT },
|
||||
|
@ -132,7 +132,7 @@ static void drv2665_close(struct input_dev *input)
|
||||
"Failed to enter standby mode: %d\n", error);
|
||||
}
|
||||
|
||||
static const struct reg_default drv2665_init_regs[] = {
|
||||
static const struct reg_sequence drv2665_init_regs[] = {
|
||||
{ DRV2665_CTRL_2, 0 | DRV2665_10_MS_IDLE_TOUT },
|
||||
{ DRV2665_CTRL_1, DRV2665_25_VPP_GAIN },
|
||||
};
|
||||
|
@ -262,14 +262,14 @@ static void drv2667_close(struct input_dev *input)
|
||||
"Failed to enter standby mode: %d\n", error);
|
||||
}
|
||||
|
||||
static const struct reg_default drv2667_init_regs[] = {
|
||||
static const struct reg_sequence drv2667_init_regs[] = {
|
||||
{ DRV2667_CTRL_2, 0 },
|
||||
{ DRV2667_CTRL_1, DRV2667_25_VPP_GAIN },
|
||||
{ DRV2667_WV_SEQ_0, 1 },
|
||||
{ DRV2667_WV_SEQ_1, 0 }
|
||||
};
|
||||
|
||||
static const struct reg_default drv2667_page1_init[] = {
|
||||
static const struct reg_sequence drv2667_page1_init[] = {
|
||||
{ DRV2667_RAM_HDR_SZ, 0x05 },
|
||||
{ DRV2667_RAM_START_HI, 0x80 },
|
||||
{ DRV2667_RAM_START_LO, 0x06 },
|
||||
|
@ -732,8 +732,7 @@ static int wm97xx_remove(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int wm97xx_suspend(struct device *dev, pm_message_t state)
|
||||
static int __maybe_unused wm97xx_suspend(struct device *dev)
|
||||
{
|
||||
struct wm97xx *wm = dev_get_drvdata(dev);
|
||||
u16 reg;
|
||||
@ -765,7 +764,7 @@ static int wm97xx_suspend(struct device *dev, pm_message_t state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wm97xx_resume(struct device *dev)
|
||||
static int __maybe_unused wm97xx_resume(struct device *dev)
|
||||
{
|
||||
struct wm97xx *wm = dev_get_drvdata(dev);
|
||||
|
||||
@ -799,10 +798,7 @@ static int wm97xx_resume(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
#define wm97xx_suspend NULL
|
||||
#define wm97xx_resume NULL
|
||||
#endif
|
||||
static SIMPLE_DEV_PM_OPS(wm97xx_pm_ops, wm97xx_suspend, wm97xx_resume);
|
||||
|
||||
/*
|
||||
* Machine specific operations
|
||||
@ -836,8 +832,7 @@ static struct device_driver wm97xx_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.probe = wm97xx_probe,
|
||||
.remove = wm97xx_remove,
|
||||
.suspend = wm97xx_suspend,
|
||||
.resume = wm97xx_resume,
|
||||
.pm = &wm97xx_pm_ops,
|
||||
};
|
||||
|
||||
static int __init wm97xx_init(void)
|
||||
|
@ -409,7 +409,7 @@ err:
|
||||
* Register patch to some of the CODECs internal write sequences
|
||||
* to ensure a clean exit from the low power sleep state.
|
||||
*/
|
||||
static const struct reg_default wm5110_sleep_patch[] = {
|
||||
static const struct reg_sequence wm5110_sleep_patch[] = {
|
||||
{ 0x337A, 0xC100 },
|
||||
{ 0x337B, 0x0041 },
|
||||
{ 0x3300, 0xA210 },
|
||||
|
@ -86,7 +86,7 @@ static const struct reg_default twl6040_defaults[] = {
|
||||
{ 0x2E, 0x00 }, /* REG_STATUS (ro) */
|
||||
};
|
||||
|
||||
static struct reg_default twl6040_patch[] = {
|
||||
static struct reg_sequence twl6040_patch[] = {
|
||||
/*
|
||||
* Select I2C bus access to dual access registers
|
||||
* Interrupt register is cleared on read
|
||||
|
@ -21,7 +21,7 @@
|
||||
#define WM5102_NUM_AOD_ISR 2
|
||||
#define WM5102_NUM_ISR 5
|
||||
|
||||
static const struct reg_default wm5102_reva_patch[] = {
|
||||
static const struct reg_sequence wm5102_reva_patch[] = {
|
||||
{ 0x80, 0x0003 },
|
||||
{ 0x221, 0x0090 },
|
||||
{ 0x211, 0x0014 },
|
||||
@ -57,7 +57,7 @@ static const struct reg_default wm5102_reva_patch[] = {
|
||||
{ 0x80, 0x0000 },
|
||||
};
|
||||
|
||||
static const struct reg_default wm5102_revb_patch[] = {
|
||||
static const struct reg_sequence wm5102_revb_patch[] = {
|
||||
{ 0x19, 0x0001 },
|
||||
{ 0x80, 0x0003 },
|
||||
{ 0x081, 0xE022 },
|
||||
@ -80,7 +80,7 @@ static const struct reg_default wm5102_revb_patch[] = {
|
||||
/* We use a function so we can use ARRAY_SIZE() */
|
||||
int wm5102_patch(struct arizona *arizona)
|
||||
{
|
||||
const struct reg_default *wm5102_patch;
|
||||
const struct reg_sequence *wm5102_patch;
|
||||
int patch_size;
|
||||
|
||||
switch (arizona->rev) {
|
||||
|
@ -21,7 +21,7 @@
|
||||
#define WM5110_NUM_AOD_ISR 2
|
||||
#define WM5110_NUM_ISR 5
|
||||
|
||||
static const struct reg_default wm5110_reva_patch[] = {
|
||||
static const struct reg_sequence wm5110_reva_patch[] = {
|
||||
{ 0x80, 0x3 },
|
||||
{ 0x44, 0x20 },
|
||||
{ 0x45, 0x40 },
|
||||
@ -134,7 +134,7 @@ static const struct reg_default wm5110_reva_patch[] = {
|
||||
{ 0x209, 0x002A },
|
||||
};
|
||||
|
||||
static const struct reg_default wm5110_revb_patch[] = {
|
||||
static const struct reg_sequence wm5110_revb_patch[] = {
|
||||
{ 0x80, 0x3 },
|
||||
{ 0x36e, 0x0210 },
|
||||
{ 0x370, 0x0210 },
|
||||
@ -224,7 +224,7 @@ static const struct reg_default wm5110_revb_patch[] = {
|
||||
{ 0x80, 0x0 },
|
||||
};
|
||||
|
||||
static const struct reg_default wm5110_revd_patch[] = {
|
||||
static const struct reg_sequence wm5110_revd_patch[] = {
|
||||
{ 0x80, 0x3 },
|
||||
{ 0x80, 0x3 },
|
||||
{ 0x393, 0x27 },
|
||||
@ -249,6 +249,16 @@ static const struct reg_default wm5110_revd_patch[] = {
|
||||
{ 0x80, 0x0 },
|
||||
};
|
||||
|
||||
/* Add extra headphone write sequence locations */
|
||||
static const struct reg_default wm5110_reve_patch[] = {
|
||||
{ 0x80, 0x3 },
|
||||
{ 0x80, 0x3 },
|
||||
{ 0x4b, 0x138 },
|
||||
{ 0x4c, 0x13d },
|
||||
{ 0x80, 0x0 },
|
||||
{ 0x80, 0x0 },
|
||||
};
|
||||
|
||||
/* We use a function so we can use ARRAY_SIZE() */
|
||||
int wm5110_patch(struct arizona *arizona)
|
||||
{
|
||||
@ -266,7 +276,9 @@ int wm5110_patch(struct arizona *arizona)
|
||||
wm5110_revd_patch,
|
||||
ARRAY_SIZE(wm5110_revd_patch));
|
||||
default:
|
||||
return 0;
|
||||
return regmap_register_patch(arizona->regmap,
|
||||
wm5110_reve_patch,
|
||||
ARRAY_SIZE(wm5110_reve_patch));
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wm5110_patch);
|
||||
@ -676,6 +688,7 @@ static const struct reg_default wm5110_reg_default[] = {
|
||||
{ 0x00000032, 0x0100 }, /* R50 - PWM Drive 3 */
|
||||
{ 0x00000040, 0x0000 }, /* R64 - Wake control */
|
||||
{ 0x00000041, 0x0000 }, /* R65 - Sequence control */
|
||||
{ 0x00000042, 0x0000 }, /* R66 - Spare Triggers */
|
||||
{ 0x00000061, 0x01FF }, /* R97 - Sample Rate Sequence Select 1 */
|
||||
{ 0x00000062, 0x01FF }, /* R98 - Sample Rate Sequence Select 2 */
|
||||
{ 0x00000063, 0x01FF }, /* R99 - Sample Rate Sequence Select 3 */
|
||||
@ -1706,6 +1719,7 @@ static bool wm5110_readable_register(struct device *dev, unsigned int reg)
|
||||
case ARIZONA_PWM_DRIVE_3:
|
||||
case ARIZONA_WAKE_CONTROL:
|
||||
case ARIZONA_SEQUENCE_CONTROL:
|
||||
case ARIZONA_SPARE_TRIGGERS:
|
||||
case ARIZONA_SAMPLE_RATE_SEQUENCE_SELECT_1:
|
||||
case ARIZONA_SAMPLE_RATE_SEQUENCE_SELECT_2:
|
||||
case ARIZONA_SAMPLE_RATE_SEQUENCE_SELECT_3:
|
||||
|
@ -243,21 +243,21 @@ static int wm8994_ldo_in_use(struct wm8994_pdata *pdata, int ldo)
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct reg_default wm8994_revc_patch[] = {
|
||||
static const struct reg_sequence wm8994_revc_patch[] = {
|
||||
{ 0x102, 0x3 },
|
||||
{ 0x56, 0x3 },
|
||||
{ 0x817, 0x0 },
|
||||
{ 0x102, 0x0 },
|
||||
};
|
||||
|
||||
static const struct reg_default wm8958_reva_patch[] = {
|
||||
static const struct reg_sequence wm8958_reva_patch[] = {
|
||||
{ 0x102, 0x3 },
|
||||
{ 0xcb, 0x81 },
|
||||
{ 0x817, 0x0 },
|
||||
{ 0x102, 0x0 },
|
||||
};
|
||||
|
||||
static const struct reg_default wm1811_reva_patch[] = {
|
||||
static const struct reg_sequence wm1811_reva_patch[] = {
|
||||
{ 0x102, 0x3 },
|
||||
{ 0x56, 0xc07 },
|
||||
{ 0x5d, 0x7e },
|
||||
@ -326,7 +326,7 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq)
|
||||
{
|
||||
struct wm8994_pdata *pdata;
|
||||
struct regmap_config *regmap_config;
|
||||
const struct reg_default *regmap_patch = NULL;
|
||||
const struct reg_sequence *regmap_patch = NULL;
|
||||
const char *devname;
|
||||
int ret, i, patch_regs = 0;
|
||||
int pulls = 0;
|
||||
|
@ -17,7 +17,7 @@
|
||||
|
||||
#include "arizona.h"
|
||||
|
||||
static const struct reg_default wm8997_reva_patch[] = {
|
||||
static const struct reg_sequence wm8997_reva_patch[] = {
|
||||
{ 0x80, 0x0003 },
|
||||
{ 0x214, 0x0008 },
|
||||
{ 0x458, 0x0000 },
|
||||
|
@ -34,6 +34,17 @@ struct i915_audio_component {
|
||||
void (*codec_wake_override)(struct device *, bool enable);
|
||||
int (*get_cdclk_freq)(struct device *);
|
||||
} *ops;
|
||||
|
||||
const struct i915_audio_component_audio_ops {
|
||||
void *audio_ptr;
|
||||
/**
|
||||
* Call from i915 driver, notifying the HDA driver that
|
||||
* pin sense and/or ELD information has changed.
|
||||
* @audio_ptr: HDA driver object
|
||||
* @port: Which port has changed (PORTA / PORTB / PORTC etc)
|
||||
*/
|
||||
void (*pin_eld_notify)(void *audio_ptr, int port);
|
||||
} *audio_ops;
|
||||
};
|
||||
|
||||
#endif /* _I915_COMPONENT_H_ */
|
||||
|
@ -39,6 +39,7 @@
|
||||
#define ARIZONA_PWM_DRIVE_3 0x32
|
||||
#define ARIZONA_WAKE_CONTROL 0x40
|
||||
#define ARIZONA_SEQUENCE_CONTROL 0x41
|
||||
#define ARIZONA_SPARE_TRIGGERS 0x42
|
||||
#define ARIZONA_SAMPLE_RATE_SEQUENCE_SELECT_1 0x61
|
||||
#define ARIZONA_SAMPLE_RATE_SEQUENCE_SELECT_2 0x62
|
||||
#define ARIZONA_SAMPLE_RATE_SEQUENCE_SELECT_3 0x63
|
||||
@ -1451,6 +1452,42 @@
|
||||
#define ARIZONA_WSEQ_ENA_JD2_RISE_SHIFT 0 /* WSEQ_ENA_JD2_RISE */
|
||||
#define ARIZONA_WSEQ_ENA_JD2_RISE_WIDTH 1 /* WSEQ_ENA_JD2_RISE */
|
||||
|
||||
/*
|
||||
* R66 (0x42) - Spare Triggers
|
||||
*/
|
||||
#define ARIZONA_WS_TRG8 0x0080 /* WS_TRG8 */
|
||||
#define ARIZONA_WS_TRG8_MASK 0x0080 /* WS_TRG8 */
|
||||
#define ARIZONA_WS_TRG8_SHIFT 7 /* WS_TRG8 */
|
||||
#define ARIZONA_WS_TRG8_WIDTH 1 /* WS_TRG8 */
|
||||
#define ARIZONA_WS_TRG7 0x0040 /* WS_TRG7 */
|
||||
#define ARIZONA_WS_TRG7_MASK 0x0040 /* WS_TRG7 */
|
||||
#define ARIZONA_WS_TRG7_SHIFT 6 /* WS_TRG7 */
|
||||
#define ARIZONA_WS_TRG7_WIDTH 1 /* WS_TRG7 */
|
||||
#define ARIZONA_WS_TRG6 0x0020 /* WS_TRG6 */
|
||||
#define ARIZONA_WS_TRG6_MASK 0x0020 /* WS_TRG6 */
|
||||
#define ARIZONA_WS_TRG6_SHIFT 5 /* WS_TRG6 */
|
||||
#define ARIZONA_WS_TRG6_WIDTH 1 /* WS_TRG6 */
|
||||
#define ARIZONA_WS_TRG5 0x0010 /* WS_TRG5 */
|
||||
#define ARIZONA_WS_TRG5_MASK 0x0010 /* WS_TRG5 */
|
||||
#define ARIZONA_WS_TRG5_SHIFT 4 /* WS_TRG5 */
|
||||
#define ARIZONA_WS_TRG5_WIDTH 1 /* WS_TRG5 */
|
||||
#define ARIZONA_WS_TRG4 0x0008 /* WS_TRG4 */
|
||||
#define ARIZONA_WS_TRG4_MASK 0x0008 /* WS_TRG4 */
|
||||
#define ARIZONA_WS_TRG4_SHIFT 3 /* WS_TRG4 */
|
||||
#define ARIZONA_WS_TRG4_WIDTH 1 /* WS_TRG4 */
|
||||
#define ARIZONA_WS_TRG3 0x0004 /* WS_TRG3 */
|
||||
#define ARIZONA_WS_TRG3_MASK 0x0004 /* WS_TRG3 */
|
||||
#define ARIZONA_WS_TRG3_SHIFT 2 /* WS_TRG3 */
|
||||
#define ARIZONA_WS_TRG3_WIDTH 1 /* WS_TRG3 */
|
||||
#define ARIZONA_WS_TRG2 0x0002 /* WS_TRG2 */
|
||||
#define ARIZONA_WS_TRG2_MASK 0x0002 /* WS_TRG2 */
|
||||
#define ARIZONA_WS_TRG2_SHIFT 1 /* WS_TRG2 */
|
||||
#define ARIZONA_WS_TRG2_WIDTH 1 /* WS_TRG2 */
|
||||
#define ARIZONA_WS_TRG1 0x0001 /* WS_TRG1 */
|
||||
#define ARIZONA_WS_TRG1_MASK 0x0001 /* WS_TRG1 */
|
||||
#define ARIZONA_WS_TRG1_SHIFT 0 /* WS_TRG1 */
|
||||
#define ARIZONA_WS_TRG1_WIDTH 1 /* WS_TRG1 */
|
||||
|
||||
/*
|
||||
* R97 (0x61) - Sample Rate Sequence Select 1
|
||||
*/
|
||||
|
@ -50,6 +50,17 @@ struct reg_default {
|
||||
unsigned int def;
|
||||
};
|
||||
|
||||
/**
|
||||
* Register/value pairs for sequences of writes
|
||||
*
|
||||
* @reg: Register address.
|
||||
* @def: Register value.
|
||||
*/
|
||||
struct reg_sequence {
|
||||
unsigned int reg;
|
||||
unsigned int def;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_REGMAP
|
||||
|
||||
enum regmap_endian {
|
||||
@ -410,10 +421,10 @@ int regmap_raw_write(struct regmap *map, unsigned int reg,
|
||||
const void *val, size_t val_len);
|
||||
int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
|
||||
size_t val_count);
|
||||
int regmap_multi_reg_write(struct regmap *map, const struct reg_default *regs,
|
||||
int regmap_multi_reg_write(struct regmap *map, const struct reg_sequence *regs,
|
||||
int num_regs);
|
||||
int regmap_multi_reg_write_bypassed(struct regmap *map,
|
||||
const struct reg_default *regs,
|
||||
const struct reg_sequence *regs,
|
||||
int num_regs);
|
||||
int regmap_raw_write_async(struct regmap *map, unsigned int reg,
|
||||
const void *val, size_t val_len);
|
||||
@ -424,6 +435,8 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
|
||||
size_t val_count);
|
||||
int regmap_update_bits(struct regmap *map, unsigned int reg,
|
||||
unsigned int mask, unsigned int val);
|
||||
int regmap_write_bits(struct regmap *map, unsigned int reg,
|
||||
unsigned int mask, unsigned int val);
|
||||
int regmap_update_bits_async(struct regmap *map, unsigned int reg,
|
||||
unsigned int mask, unsigned int val);
|
||||
int regmap_update_bits_check(struct regmap *map, unsigned int reg,
|
||||
@ -450,7 +463,7 @@ void regcache_mark_dirty(struct regmap *map);
|
||||
bool regmap_check_range_table(struct regmap *map, unsigned int reg,
|
||||
const struct regmap_access_table *table);
|
||||
|
||||
int regmap_register_patch(struct regmap *map, const struct reg_default *regs,
|
||||
int regmap_register_patch(struct regmap *map, const struct reg_sequence *regs,
|
||||
int num_regs);
|
||||
int regmap_parse_val(struct regmap *map, const void *buf,
|
||||
unsigned int *val);
|
||||
@ -503,6 +516,8 @@ int regmap_field_update_bits(struct regmap_field *field,
|
||||
|
||||
int regmap_fields_write(struct regmap_field *field, unsigned int id,
|
||||
unsigned int val);
|
||||
int regmap_fields_force_write(struct regmap_field *field, unsigned int id,
|
||||
unsigned int val);
|
||||
int regmap_fields_read(struct regmap_field *field, unsigned int id,
|
||||
unsigned int *val);
|
||||
int regmap_fields_update_bits(struct regmap_field *field, unsigned int id,
|
||||
@ -645,6 +660,13 @@ static inline int regmap_update_bits(struct regmap *map, unsigned int reg,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int regmap_write_bits(struct regmap *map, unsigned int reg,
|
||||
unsigned int mask, unsigned int val)
|
||||
{
|
||||
WARN_ONCE(1, "regmap API is disabled");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int regmap_update_bits_async(struct regmap *map,
|
||||
unsigned int reg,
|
||||
unsigned int mask, unsigned int val)
|
||||
|
@ -584,6 +584,8 @@ static inline int snd_ac97_update_power(struct snd_ac97 *ac97, int reg,
|
||||
void snd_ac97_suspend(struct snd_ac97 *ac97);
|
||||
void snd_ac97_resume(struct snd_ac97 *ac97);
|
||||
#endif
|
||||
int snd_ac97_reset(struct snd_ac97 *ac97, bool try_warm, unsigned int id,
|
||||
unsigned int id_mask);
|
||||
|
||||
/* quirk types */
|
||||
enum {
|
||||
|
@ -4,14 +4,17 @@
|
||||
#ifndef __SOUND_HDA_I915_H
|
||||
#define __SOUND_HDA_I915_H
|
||||
|
||||
#include <drm/i915_component.h>
|
||||
|
||||
#ifdef CONFIG_SND_HDA_I915
|
||||
int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable);
|
||||
int snd_hdac_display_power(struct hdac_bus *bus, bool enable);
|
||||
int snd_hdac_get_display_clk(struct hdac_bus *bus);
|
||||
int snd_hdac_i915_init(struct hdac_bus *bus);
|
||||
int snd_hdac_i915_exit(struct hdac_bus *bus);
|
||||
int snd_hdac_i915_register_notifier(const struct i915_audio_component_audio_ops *);
|
||||
#else
|
||||
static int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable)
|
||||
static inline int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@ -31,6 +34,10 @@ static inline int snd_hdac_i915_exit(struct hdac_bus *bus)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int snd_hdac_i915_register_notifier(const struct i915_audio_component_audio_ops *ops)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __SOUND_HDA_I915_H */
|
||||
|
@ -160,6 +160,10 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
|
||||
#define AZX_SPB_BASE 0x08
|
||||
/* Interval used to calculate the iterating register offset */
|
||||
#define AZX_SPB_INTERVAL 0x08
|
||||
/* SPIB base */
|
||||
#define AZX_SPB_SPIB 0x00
|
||||
/* SPIB MAXFIFO base*/
|
||||
#define AZX_SPB_MAXFIFO 0x04
|
||||
|
||||
/* registers of Global Time Synchronization Capability Structure */
|
||||
#define AZX_GTS_CAP_ID 0x1
|
||||
|
@ -119,6 +119,7 @@ int snd_hdac_device_register(struct hdac_device *codec);
|
||||
void snd_hdac_device_unregister(struct hdac_device *codec);
|
||||
|
||||
int snd_hdac_refresh_widgets(struct hdac_device *codec);
|
||||
int snd_hdac_refresh_widget_sysfs(struct hdac_device *codec);
|
||||
|
||||
unsigned int snd_hdac_make_cmd(struct hdac_device *codec, hda_nid_t nid,
|
||||
unsigned int verb, unsigned int parm);
|
||||
@ -164,15 +165,15 @@ static inline int snd_hdac_read_parm(struct hdac_device *codec, hda_nid_t nid,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
void snd_hdac_power_up(struct hdac_device *codec);
|
||||
void snd_hdac_power_down(struct hdac_device *codec);
|
||||
void snd_hdac_power_up_pm(struct hdac_device *codec);
|
||||
void snd_hdac_power_down_pm(struct hdac_device *codec);
|
||||
int snd_hdac_power_up(struct hdac_device *codec);
|
||||
int snd_hdac_power_down(struct hdac_device *codec);
|
||||
int snd_hdac_power_up_pm(struct hdac_device *codec);
|
||||
int snd_hdac_power_down_pm(struct hdac_device *codec);
|
||||
#else
|
||||
static inline void snd_hdac_power_up(struct hdac_device *codec) {}
|
||||
static inline void snd_hdac_power_down(struct hdac_device *codec) {}
|
||||
static inline void snd_hdac_power_up_pm(struct hdac_device *codec) {}
|
||||
static inline void snd_hdac_power_down_pm(struct hdac_device *codec) {}
|
||||
static inline int snd_hdac_power_up(struct hdac_device *codec) { return 0; }
|
||||
static inline int snd_hdac_power_down(struct hdac_device *codec) { return 0; }
|
||||
static inline int snd_hdac_power_up_pm(struct hdac_device *codec) { return 0; }
|
||||
static inline int snd_hdac_power_down_pm(struct hdac_device *codec) { return 0; }
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -437,6 +438,8 @@ void snd_hdac_stream_init(struct hdac_bus *bus, struct hdac_stream *azx_dev,
|
||||
struct hdac_stream *snd_hdac_stream_assign(struct hdac_bus *bus,
|
||||
struct snd_pcm_substream *substream);
|
||||
void snd_hdac_stream_release(struct hdac_stream *azx_dev);
|
||||
struct hdac_stream *snd_hdac_get_stream(struct hdac_bus *bus,
|
||||
int dir, int stream_tag);
|
||||
|
||||
int snd_hdac_stream_setup(struct hdac_stream *azx_dev);
|
||||
void snd_hdac_stream_cleanup(struct hdac_stream *azx_dev);
|
||||
|
@ -34,6 +34,7 @@ int snd_hdac_ext_bus_init(struct hdac_ext_bus *sbus, struct device *dev,
|
||||
void snd_hdac_ext_bus_exit(struct hdac_ext_bus *sbus);
|
||||
int snd_hdac_ext_bus_device_init(struct hdac_ext_bus *sbus, int addr);
|
||||
void snd_hdac_ext_bus_device_exit(struct hdac_device *hdev);
|
||||
void snd_hdac_ext_bus_device_remove(struct hdac_ext_bus *ebus);
|
||||
|
||||
#define ebus_to_hbus(ebus) (&(ebus)->bus)
|
||||
#define hbus_to_ebus(_bus) \
|
||||
@ -62,6 +63,8 @@ enum hdac_ext_stream_type {
|
||||
* @hstream: hdac_stream
|
||||
* @pphc_addr: processing pipe host stream pointer
|
||||
* @pplc_addr: processing pipe link stream pointer
|
||||
* @spib_addr: software position in buffers stream pointer
|
||||
* @fifo_addr: software position Max fifos stream pointer
|
||||
* @decoupled: stream host and link is decoupled
|
||||
* @link_locked: link is locked
|
||||
* @link_prepared: link is prepared
|
||||
@ -73,6 +76,9 @@ struct hdac_ext_stream {
|
||||
void __iomem *pphc_addr;
|
||||
void __iomem *pplc_addr;
|
||||
|
||||
void __iomem *spib_addr;
|
||||
void __iomem *fifo_addr;
|
||||
|
||||
bool decoupled:1;
|
||||
bool link_locked:1;
|
||||
bool link_prepared;
|
||||
@ -99,6 +105,11 @@ void snd_hdac_ext_stream_decouple(struct hdac_ext_bus *bus,
|
||||
struct hdac_ext_stream *azx_dev, bool decouple);
|
||||
void snd_hdac_ext_stop_streams(struct hdac_ext_bus *sbus);
|
||||
|
||||
int snd_hdac_ext_stream_set_spib(struct hdac_ext_bus *ebus,
|
||||
struct hdac_ext_stream *stream, u32 value);
|
||||
int snd_hdac_ext_stream_get_spbmaxfifo(struct hdac_ext_bus *ebus,
|
||||
struct hdac_ext_stream *stream);
|
||||
|
||||
void snd_hdac_ext_link_stream_start(struct hdac_ext_stream *hstream);
|
||||
void snd_hdac_ext_link_stream_clear(struct hdac_ext_stream *hstream);
|
||||
void snd_hdac_ext_link_stream_reset(struct hdac_ext_stream *hstream);
|
||||
@ -115,6 +126,7 @@ struct hdac_ext_link {
|
||||
|
||||
int snd_hdac_ext_bus_link_power_up(struct hdac_ext_link *link);
|
||||
int snd_hdac_ext_bus_link_power_down(struct hdac_ext_link *link);
|
||||
int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus);
|
||||
void snd_hdac_ext_link_set_stream_id(struct hdac_ext_link *link,
|
||||
int stream);
|
||||
void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link,
|
||||
@ -129,4 +141,63 @@ void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link,
|
||||
writew(((readw(addr + reg) & ~(mask)) | (val)), \
|
||||
addr + reg)
|
||||
|
||||
|
||||
struct hdac_ext_device;
|
||||
|
||||
/* ops common to all codec drivers */
|
||||
struct hdac_ext_codec_ops {
|
||||
int (*build_controls)(struct hdac_ext_device *dev);
|
||||
int (*init)(struct hdac_ext_device *dev);
|
||||
void (*free)(struct hdac_ext_device *dev);
|
||||
};
|
||||
|
||||
struct hda_dai_map {
|
||||
char *dai_name;
|
||||
hda_nid_t nid;
|
||||
u32 maxbps;
|
||||
};
|
||||
|
||||
#define HDA_MAX_NIDS 16
|
||||
|
||||
/**
|
||||
* struct hdac_ext_device - HDAC Ext device
|
||||
*
|
||||
* @hdac: hdac core device
|
||||
* @nid_list - the dai map which matches the dai-name with the nid
|
||||
* @map_cur_idx - the idx in use in dai_map
|
||||
* @ops - the hda codec ops common to all codec drivers
|
||||
* @pvt_data - private data, for asoc contains asoc codec object
|
||||
*/
|
||||
struct hdac_ext_device {
|
||||
struct hdac_device hdac;
|
||||
struct hdac_ext_bus *ebus;
|
||||
|
||||
/* soc-dai to nid map */
|
||||
struct hda_dai_map nid_list[HDA_MAX_NIDS];
|
||||
unsigned int map_cur_idx;
|
||||
|
||||
/* codec ops */
|
||||
struct hdac_ext_codec_ops ops;
|
||||
|
||||
void *private_data;
|
||||
};
|
||||
|
||||
#define to_ehdac_device(dev) (container_of((dev), \
|
||||
struct hdac_ext_device, hdac))
|
||||
/*
|
||||
* HD-audio codec base driver
|
||||
*/
|
||||
struct hdac_ext_driver {
|
||||
struct hdac_driver hdac;
|
||||
|
||||
int (*probe)(struct hdac_ext_device *dev);
|
||||
int (*remove)(struct hdac_ext_device *dev);
|
||||
void (*shutdown)(struct hdac_ext_device *dev);
|
||||
};
|
||||
|
||||
int snd_hda_ext_driver_register(struct hdac_ext_driver *drv);
|
||||
void snd_hda_ext_driver_unregister(struct hdac_ext_driver *drv);
|
||||
|
||||
#define to_ehdac_driver(_drv) container_of(_drv, struct hdac_ext_driver, hdac)
|
||||
|
||||
#endif /* __SOUND_HDAUDIO_EXT_H */
|
||||
|
@ -61,6 +61,14 @@ struct rsnd_src_platform_info {
|
||||
/*
|
||||
* flags
|
||||
*/
|
||||
struct rsnd_ctu_platform_info {
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
struct rsnd_mix_platform_info {
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
struct rsnd_dvc_platform_info {
|
||||
u32 flags;
|
||||
};
|
||||
@ -68,6 +76,8 @@ struct rsnd_dvc_platform_info {
|
||||
struct rsnd_dai_path_info {
|
||||
struct rsnd_ssi_platform_info *ssi;
|
||||
struct rsnd_src_platform_info *src;
|
||||
struct rsnd_ctu_platform_info *ctu;
|
||||
struct rsnd_mix_platform_info *mix;
|
||||
struct rsnd_dvc_platform_info *dvc;
|
||||
};
|
||||
|
||||
@ -93,6 +103,10 @@ struct rcar_snd_info {
|
||||
int ssi_info_nr;
|
||||
struct rsnd_src_platform_info *src_info;
|
||||
int src_info_nr;
|
||||
struct rsnd_ctu_platform_info *ctu_info;
|
||||
int ctu_info_nr;
|
||||
struct rsnd_mix_platform_info *mix_info;
|
||||
int mix_info_nr;
|
||||
struct rsnd_dvc_platform_info *dvc_info;
|
||||
int dvc_info_nr;
|
||||
struct rsnd_dai_platform_info *dai_info;
|
||||
|
20
include/sound/rt298.h
Normal file
20
include/sound/rt298.h
Normal file
@ -0,0 +1,20 @@
|
||||
/*
|
||||
* linux/sound/rt286.h -- Platform data for RT286
|
||||
*
|
||||
* Copyright 2013 Realtek Microelectronics
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_SND_RT298_H
|
||||
#define __LINUX_SND_RT298_H
|
||||
|
||||
struct rt298_platform_data {
|
||||
bool cbj_en; /*combo jack enable*/
|
||||
bool gpio2_en; /*GPIO2 enable*/
|
||||
bool suspend_power_off; /* power is off during suspend */
|
||||
};
|
||||
|
||||
#endif
|
@ -397,6 +397,7 @@ int snd_soc_dapm_del_routes(struct snd_soc_dapm_context *dapm,
|
||||
const struct snd_soc_dapm_route *route, int num);
|
||||
int snd_soc_dapm_weak_routes(struct snd_soc_dapm_context *dapm,
|
||||
const struct snd_soc_dapm_route *route, int num);
|
||||
void snd_soc_dapm_free_widget(struct snd_soc_dapm_widget *w);
|
||||
|
||||
/* dapm events */
|
||||
void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream,
|
||||
@ -511,9 +512,18 @@ struct snd_soc_dapm_route {
|
||||
struct snd_soc_dapm_path {
|
||||
const char *name;
|
||||
|
||||
/* source (input) and sink (output) widgets */
|
||||
struct snd_soc_dapm_widget *source;
|
||||
struct snd_soc_dapm_widget *sink;
|
||||
/*
|
||||
* source (input) and sink (output) widgets
|
||||
* The union is for convience, since it is a lot nicer to type
|
||||
* p->source, rather than p->node[SND_SOC_DAPM_DIR_IN]
|
||||
*/
|
||||
union {
|
||||
struct {
|
||||
struct snd_soc_dapm_widget *source;
|
||||
struct snd_soc_dapm_widget *sink;
|
||||
};
|
||||
struct snd_soc_dapm_widget *node[2];
|
||||
};
|
||||
|
||||
/* status */
|
||||
u32 connect:1; /* source and sink widgets are connected */
|
||||
@ -524,8 +534,7 @@ struct snd_soc_dapm_path {
|
||||
int (*connected)(struct snd_soc_dapm_widget *source,
|
||||
struct snd_soc_dapm_widget *sink);
|
||||
|
||||
struct list_head list_source;
|
||||
struct list_head list_sink;
|
||||
struct list_head list_node[2];
|
||||
struct list_head list_kcontrol;
|
||||
struct list_head list;
|
||||
};
|
||||
@ -559,8 +568,7 @@ struct snd_soc_dapm_widget {
|
||||
unsigned char new_power:1; /* power from this run */
|
||||
unsigned char power_checked:1; /* power checked this run */
|
||||
unsigned char is_supply:1; /* Widget is a supply type widget */
|
||||
unsigned char is_sink:1; /* Widget is a sink type widget */
|
||||
unsigned char is_source:1; /* Widget is a source type widget */
|
||||
unsigned char is_ep:2; /* Widget is a endpoint type widget */
|
||||
int subseq; /* sort within widget type */
|
||||
|
||||
int (*power_check)(struct snd_soc_dapm_widget *w);
|
||||
@ -575,16 +583,14 @@ struct snd_soc_dapm_widget {
|
||||
struct snd_kcontrol **kcontrols;
|
||||
struct snd_soc_dobj dobj;
|
||||
|
||||
/* widget input and outputs */
|
||||
struct list_head sources;
|
||||
struct list_head sinks;
|
||||
/* widget input and output edges */
|
||||
struct list_head edges[2];
|
||||
|
||||
/* used during DAPM updates */
|
||||
struct list_head work_list;
|
||||
struct list_head power_list;
|
||||
struct list_head dirty;
|
||||
int inputs;
|
||||
int outputs;
|
||||
int endpoints[2];
|
||||
|
||||
struct clk *clk;
|
||||
};
|
||||
@ -672,4 +678,58 @@ static inline enum snd_soc_bias_level snd_soc_dapm_get_bias_level(
|
||||
return dapm->bias_level;
|
||||
}
|
||||
|
||||
enum snd_soc_dapm_direction {
|
||||
SND_SOC_DAPM_DIR_IN,
|
||||
SND_SOC_DAPM_DIR_OUT
|
||||
};
|
||||
|
||||
#define SND_SOC_DAPM_DIR_TO_EP(x) BIT(x)
|
||||
|
||||
#define SND_SOC_DAPM_EP_SOURCE SND_SOC_DAPM_DIR_TO_EP(SND_SOC_DAPM_DIR_IN)
|
||||
#define SND_SOC_DAPM_EP_SINK SND_SOC_DAPM_DIR_TO_EP(SND_SOC_DAPM_DIR_OUT)
|
||||
|
||||
/**
|
||||
* snd_soc_dapm_widget_for_each_sink_path - Iterates over all paths in the
|
||||
* specified direction of a widget
|
||||
* @w: The widget
|
||||
* @dir: Whether to iterate over the paths where the specified widget is the
|
||||
* incoming or outgoing widgets
|
||||
* @p: The path iterator variable
|
||||
*/
|
||||
#define snd_soc_dapm_widget_for_each_path(w, dir, p) \
|
||||
list_for_each_entry(p, &w->edges[dir], list_node[dir])
|
||||
|
||||
/**
|
||||
* snd_soc_dapm_widget_for_each_sink_path_safe - Iterates over all paths in the
|
||||
* specified direction of a widget
|
||||
* @w: The widget
|
||||
* @dir: Whether to iterate over the paths where the specified widget is the
|
||||
* incoming or outgoing widgets
|
||||
* @p: The path iterator variable
|
||||
* @next_p: Temporary storage for the next path
|
||||
*
|
||||
* This function works like snd_soc_dapm_widget_for_each_sink_path, expect that
|
||||
* it is safe to remove the current path from the list while iterating
|
||||
*/
|
||||
#define snd_soc_dapm_widget_for_each_path_safe(w, dir, p, next_p) \
|
||||
list_for_each_entry_safe(p, next_p, &w->edges[dir], list_node[dir])
|
||||
|
||||
/**
|
||||
* snd_soc_dapm_widget_for_each_sink_path - Iterates over all paths leaving a
|
||||
* widget
|
||||
* @w: The widget
|
||||
* @p: The path iterator variable
|
||||
*/
|
||||
#define snd_soc_dapm_widget_for_each_sink_path(w, p) \
|
||||
snd_soc_dapm_widget_for_each_path(w, SND_SOC_DAPM_DIR_IN, p)
|
||||
|
||||
/**
|
||||
* snd_soc_dapm_widget_for_each_source_path - Iterates over all paths leading to
|
||||
* a widget
|
||||
* @w: The widget
|
||||
* @p: The path iterator variable
|
||||
*/
|
||||
#define snd_soc_dapm_widget_for_each_source_path(w, p) \
|
||||
snd_soc_dapm_widget_for_each_path(w, SND_SOC_DAPM_DIR_OUT, p)
|
||||
|
||||
#endif
|
||||
|
@ -89,6 +89,13 @@ struct snd_soc_tplg_kcontrol_ops {
|
||||
struct snd_ctl_elem_info *uinfo);
|
||||
};
|
||||
|
||||
/* Bytes ext operations, for TLV byte controls */
|
||||
struct snd_soc_tplg_bytes_ext_ops {
|
||||
u32 id;
|
||||
int (*get)(unsigned int __user *bytes, unsigned int size);
|
||||
int (*put)(const unsigned int __user *bytes, unsigned int size);
|
||||
};
|
||||
|
||||
/*
|
||||
* DAPM widget event handlers - used to map handlers onto widgets.
|
||||
*/
|
||||
@ -136,9 +143,13 @@ struct snd_soc_tplg_ops {
|
||||
int (*manifest)(struct snd_soc_component *,
|
||||
struct snd_soc_tplg_manifest *);
|
||||
|
||||
/* bespoke kcontrol handlers available for binding */
|
||||
/* vendor specific kcontrol handlers available for binding */
|
||||
const struct snd_soc_tplg_kcontrol_ops *io_ops;
|
||||
int io_ops_count;
|
||||
|
||||
/* vendor specific bytes ext handlers available for binding */
|
||||
const struct snd_soc_tplg_bytes_ext_ops *bytes_ext_ops;
|
||||
int bytes_ext_ops_count;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SND_SOC_TOPOLOGY
|
||||
|
@ -526,7 +526,8 @@ int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned int reg,
|
||||
|
||||
#ifdef CONFIG_SND_SOC_AC97_BUS
|
||||
struct snd_ac97 *snd_soc_alloc_ac97_codec(struct snd_soc_codec *codec);
|
||||
struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec);
|
||||
struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
|
||||
unsigned int id, unsigned int id_mask);
|
||||
void snd_soc_free_ac97_codec(struct snd_ac97 *ac97);
|
||||
|
||||
int snd_soc_set_ac97_ops(struct snd_ac97_bus_ops *ops);
|
||||
@ -619,6 +620,7 @@ int snd_soc_put_strobe(struct snd_kcontrol *kcontrol,
|
||||
* @pin: name of the pin to update
|
||||
* @mask: bits to check for in reported jack status
|
||||
* @invert: if non-zero then pin is enabled when status is not reported
|
||||
* @list: internal list entry
|
||||
*/
|
||||
struct snd_soc_jack_pin {
|
||||
struct list_head list;
|
||||
@ -635,7 +637,7 @@ struct snd_soc_jack_pin {
|
||||
* @jack_type: type of jack that is expected for this voltage
|
||||
* @debounce_time: debounce_time for jack, codec driver should wait for this
|
||||
* duration before reading the adc for voltages
|
||||
* @:list: list container
|
||||
* @list: internal list entry
|
||||
*/
|
||||
struct snd_soc_jack_zone {
|
||||
unsigned int min_mv;
|
||||
@ -651,12 +653,12 @@ struct snd_soc_jack_zone {
|
||||
* @gpio: legacy gpio number
|
||||
* @idx: gpio descriptor index within the function of the GPIO
|
||||
* consumer device
|
||||
* @gpiod_dev GPIO consumer device
|
||||
* @gpiod_dev: GPIO consumer device
|
||||
* @name: gpio name. Also as connection ID for the GPIO consumer
|
||||
* device function name lookup
|
||||
* @report: value to report when jack detected
|
||||
* @invert: report presence in low state
|
||||
* @debouce_time: debouce time in ms
|
||||
* @debounce_time: debounce time in ms
|
||||
* @wake: enable as wake source
|
||||
* @jack_status_check: callback function which overrides the detection
|
||||
* to provide more complex checks (eg, reading an
|
||||
@ -672,11 +674,13 @@ struct snd_soc_jack_gpio {
|
||||
int debounce_time;
|
||||
bool wake;
|
||||
|
||||
/* private: */
|
||||
struct snd_soc_jack *jack;
|
||||
struct delayed_work work;
|
||||
struct gpio_desc *desc;
|
||||
|
||||
void *data;
|
||||
/* public: */
|
||||
int (*jack_status_check)(void *data);
|
||||
};
|
||||
|
||||
@ -758,7 +762,6 @@ struct snd_soc_component {
|
||||
|
||||
unsigned int ignore_pmdown_time:1; /* pmdown_time is ignored at stop */
|
||||
unsigned int registered_as_component:1;
|
||||
unsigned int probed:1;
|
||||
|
||||
struct list_head list;
|
||||
|
||||
@ -792,7 +795,6 @@ struct snd_soc_component {
|
||||
|
||||
/* Don't use these, use snd_soc_component_get_dapm() */
|
||||
struct snd_soc_dapm_context dapm;
|
||||
struct snd_soc_dapm_context *dapm_ptr;
|
||||
|
||||
const struct snd_kcontrol_new *controls;
|
||||
unsigned int num_controls;
|
||||
@ -832,9 +834,6 @@ struct snd_soc_codec {
|
||||
/* component */
|
||||
struct snd_soc_component component;
|
||||
|
||||
/* Don't access this directly, use snd_soc_codec_get_dapm() */
|
||||
struct snd_soc_dapm_context dapm;
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *debugfs_reg;
|
||||
#endif
|
||||
@ -1277,7 +1276,7 @@ static inline struct snd_soc_component *snd_soc_dapm_to_component(
|
||||
static inline struct snd_soc_codec *snd_soc_dapm_to_codec(
|
||||
struct snd_soc_dapm_context *dapm)
|
||||
{
|
||||
return container_of(dapm, struct snd_soc_codec, dapm);
|
||||
return snd_soc_component_to_codec(snd_soc_dapm_to_component(dapm));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1302,7 +1301,7 @@ static inline struct snd_soc_platform *snd_soc_dapm_to_platform(
|
||||
static inline struct snd_soc_dapm_context *snd_soc_component_get_dapm(
|
||||
struct snd_soc_component *component)
|
||||
{
|
||||
return component->dapm_ptr;
|
||||
return &component->dapm;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1314,12 +1313,12 @@ static inline struct snd_soc_dapm_context *snd_soc_component_get_dapm(
|
||||
static inline struct snd_soc_dapm_context *snd_soc_codec_get_dapm(
|
||||
struct snd_soc_codec *codec)
|
||||
{
|
||||
return &codec->dapm;
|
||||
return snd_soc_component_get_dapm(&codec->component);
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_dapm_init_bias_level() - Initialize CODEC DAPM bias level
|
||||
* @dapm: The CODEC for which to initialize the DAPM bias level
|
||||
* @codec: The CODEC for which to initialize the DAPM bias level
|
||||
* @level: The DAPM level to initialize to
|
||||
*
|
||||
* Initializes the CODEC DAPM bias level. See snd_soc_dapm_init_bias_level().
|
||||
@ -1604,6 +1603,10 @@ int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card,
|
||||
int snd_soc_of_parse_tdm_slot(struct device_node *np,
|
||||
unsigned int *slots,
|
||||
unsigned int *slot_width);
|
||||
void snd_soc_of_parse_audio_prefix(struct snd_soc_card *card,
|
||||
struct snd_soc_codec_conf *codec_conf,
|
||||
struct device_node *of_node,
|
||||
const char *propname);
|
||||
int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,
|
||||
const char *propname);
|
||||
unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
#define DAPM_DIRECT "(direct)"
|
||||
#define DAPM_ARROW(dir) (((dir) == SND_SOC_DAPM_DIR_OUT) ? "->" : "<-")
|
||||
|
||||
struct snd_soc_jack;
|
||||
struct snd_soc_codec;
|
||||
@ -152,62 +153,38 @@ TRACE_EVENT(snd_soc_dapm_walk_done,
|
||||
(int)__entry->path_checks, (int)__entry->neighbour_checks)
|
||||
);
|
||||
|
||||
TRACE_EVENT(snd_soc_dapm_output_path,
|
||||
TRACE_EVENT(snd_soc_dapm_path,
|
||||
|
||||
TP_PROTO(struct snd_soc_dapm_widget *widget,
|
||||
enum snd_soc_dapm_direction dir,
|
||||
struct snd_soc_dapm_path *path),
|
||||
|
||||
TP_ARGS(widget, path),
|
||||
TP_ARGS(widget, dir, path),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string( wname, widget->name )
|
||||
__string( pname, path->name ? path->name : DAPM_DIRECT)
|
||||
__string( psname, path->sink->name )
|
||||
__field( int, path_sink )
|
||||
__string( pnname, path->node[dir]->name )
|
||||
__field( int, path_node )
|
||||
__field( int, path_connect )
|
||||
__field( int, path_dir )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(wname, widget->name);
|
||||
__assign_str(pname, path->name ? path->name : DAPM_DIRECT);
|
||||
__assign_str(psname, path->sink->name);
|
||||
__assign_str(pnname, path->node[dir]->name);
|
||||
__entry->path_connect = path->connect;
|
||||
__entry->path_sink = (long)path->sink;
|
||||
__entry->path_node = (long)path->node[dir];
|
||||
__entry->path_dir = dir;
|
||||
),
|
||||
|
||||
TP_printk("%c%s -> %s -> %s",
|
||||
(int) __entry->path_sink &&
|
||||
TP_printk("%c%s %s %s %s %s",
|
||||
(int) __entry->path_node &&
|
||||
(int) __entry->path_connect ? '*' : ' ',
|
||||
__get_str(wname), __get_str(pname), __get_str(psname))
|
||||
);
|
||||
|
||||
TRACE_EVENT(snd_soc_dapm_input_path,
|
||||
|
||||
TP_PROTO(struct snd_soc_dapm_widget *widget,
|
||||
struct snd_soc_dapm_path *path),
|
||||
|
||||
TP_ARGS(widget, path),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string( wname, widget->name )
|
||||
__string( pname, path->name ? path->name : DAPM_DIRECT)
|
||||
__string( psname, path->source->name )
|
||||
__field( int, path_source )
|
||||
__field( int, path_connect )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(wname, widget->name);
|
||||
__assign_str(pname, path->name ? path->name : DAPM_DIRECT);
|
||||
__assign_str(psname, path->source->name);
|
||||
__entry->path_connect = path->connect;
|
||||
__entry->path_source = (long)path->source;
|
||||
),
|
||||
|
||||
TP_printk("%c%s <- %s <- %s",
|
||||
(int) __entry->path_source &&
|
||||
(int) __entry->path_connect ? '*' : ' ',
|
||||
__get_str(wname), __get_str(pname), __get_str(psname))
|
||||
__get_str(wname), DAPM_ARROW(__entry->path_dir),
|
||||
__get_str(pname), DAPM_ARROW(__entry->path_dir),
|
||||
__get_str(pnname))
|
||||
);
|
||||
|
||||
TRACE_EVENT(snd_soc_dapm_connected,
|
||||
|
@ -17,6 +17,68 @@
|
||||
#include <linux/string.h>
|
||||
#include <sound/ac97_codec.h>
|
||||
|
||||
/*
|
||||
* snd_ac97_check_id() - Reads and checks the vendor ID of the device
|
||||
* @ac97: The AC97 device to check
|
||||
* @id: The ID to compare to
|
||||
* @id_mask: Mask that is applied to the device ID before comparing to @id
|
||||
*
|
||||
* If @id is 0 this function returns true if the read device vendor ID is
|
||||
* a valid ID. If @id is non 0 this functions returns true if @id
|
||||
* matches the read vendor ID. Otherwise the function returns false.
|
||||
*/
|
||||
static bool snd_ac97_check_id(struct snd_ac97 *ac97, unsigned int id,
|
||||
unsigned int id_mask)
|
||||
{
|
||||
ac97->id = ac97->bus->ops->read(ac97, AC97_VENDOR_ID1) << 16;
|
||||
ac97->id |= ac97->bus->ops->read(ac97, AC97_VENDOR_ID2);
|
||||
|
||||
if (ac97->id == 0x0 || ac97->id == 0xffffffff)
|
||||
return false;
|
||||
|
||||
if (id != 0 && id != (ac97->id & id_mask))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_ac97_reset() - Reset AC'97 device
|
||||
* @ac97: The AC'97 device to reset
|
||||
* @try_warm: Try a warm reset first
|
||||
* @id: Expected device vendor ID
|
||||
* @id_mask: Mask that is applied to the device ID before comparing to @id
|
||||
*
|
||||
* This function resets the AC'97 device. If @try_warm is true the function
|
||||
* first performs a warm reset. If the warm reset is successful the function
|
||||
* returns 1. Otherwise or if @try_warm is false the function issues cold reset
|
||||
* followed by a warm reset. If this is successful the function returns 0,
|
||||
* otherwise a negative error code. If @id is 0 any valid device ID will be
|
||||
* accepted, otherwise only the ID that matches @id and @id_mask is accepted.
|
||||
*/
|
||||
int snd_ac97_reset(struct snd_ac97 *ac97, bool try_warm, unsigned int id,
|
||||
unsigned int id_mask)
|
||||
{
|
||||
struct snd_ac97_bus_ops *ops = ac97->bus->ops;
|
||||
|
||||
if (try_warm && ops->warm_reset) {
|
||||
ops->warm_reset(ac97);
|
||||
if (snd_ac97_check_id(ac97, id, id_mask))
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ops->reset)
|
||||
ops->reset(ac97);
|
||||
if (ops->warm_reset)
|
||||
ops->warm_reset(ac97);
|
||||
|
||||
if (snd_ac97_check_id(ac97, id, id_mask))
|
||||
return 0;
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_ac97_reset);
|
||||
|
||||
/*
|
||||
* Let drivers decide whether they want to support given codec from their
|
||||
* probe method. Drivers have direct access to the struct snd_ac97
|
||||
@ -27,35 +89,9 @@ static int ac97_bus_match(struct device *dev, struct device_driver *drv)
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int ac97_bus_suspend(struct device *dev, pm_message_t state)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (dev->driver && dev->driver->suspend)
|
||||
ret = dev->driver->suspend(dev, state);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ac97_bus_resume(struct device *dev)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (dev->driver && dev->driver->resume)
|
||||
ret = dev->driver->resume(dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
struct bus_type ac97_bus_type = {
|
||||
.name = "ac97",
|
||||
.match = ac97_bus_match,
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = ac97_bus_suspend,
|
||||
.resume = ac97_bus_resume,
|
||||
#endif /* CONFIG_PM */
|
||||
};
|
||||
|
||||
static int __init ac97_bus_init(void)
|
||||
|
@ -1050,7 +1050,6 @@ MODULE_DEVICE_TABLE(i2c,onyx_i2c_id);
|
||||
static struct i2c_driver onyx_driver = {
|
||||
.driver = {
|
||||
.name = "aoa_codec_onyx",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = onyx_i2c_probe,
|
||||
.remove = onyx_i2c_remove,
|
||||
|
@ -939,7 +939,6 @@ MODULE_DEVICE_TABLE(i2c,tas_i2c_id);
|
||||
static struct i2c_driver tas_driver = {
|
||||
.driver = {
|
||||
.name = "aoa_codec_tas",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = tas_i2c_probe,
|
||||
.remove = tas_i2c_remove,
|
||||
|
@ -1120,10 +1120,10 @@ static int aoa_fabric_layout_remove(struct soundbus_dev *sdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int aoa_fabric_layout_suspend(struct soundbus_dev *sdev, pm_message_t state)
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int aoa_fabric_layout_suspend(struct device *dev)
|
||||
{
|
||||
struct layout_dev *ldev = dev_get_drvdata(&sdev->ofdev.dev);
|
||||
struct layout_dev *ldev = dev_get_drvdata(dev);
|
||||
|
||||
if (ldev->gpio.methods && ldev->gpio.methods->all_amps_off)
|
||||
ldev->gpio.methods->all_amps_off(&ldev->gpio);
|
||||
@ -1131,15 +1131,19 @@ static int aoa_fabric_layout_suspend(struct soundbus_dev *sdev, pm_message_t sta
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int aoa_fabric_layout_resume(struct soundbus_dev *sdev)
|
||||
static int aoa_fabric_layout_resume(struct device *dev)
|
||||
{
|
||||
struct layout_dev *ldev = dev_get_drvdata(&sdev->ofdev.dev);
|
||||
struct layout_dev *ldev = dev_get_drvdata(dev);
|
||||
|
||||
if (ldev->gpio.methods && ldev->gpio.methods->all_amps_restore)
|
||||
ldev->gpio.methods->all_amps_restore(&ldev->gpio);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(aoa_fabric_layout_pm_ops,
|
||||
aoa_fabric_layout_suspend, aoa_fabric_layout_resume);
|
||||
|
||||
#endif
|
||||
|
||||
static struct soundbus_driver aoa_soundbus_driver = {
|
||||
@ -1147,12 +1151,11 @@ static struct soundbus_driver aoa_soundbus_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.probe = aoa_fabric_layout_probe,
|
||||
.remove = aoa_fabric_layout_remove,
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = aoa_fabric_layout_suspend,
|
||||
.resume = aoa_fabric_layout_resume,
|
||||
#endif
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.pm = &aoa_fabric_layout_pm_ops,
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -126,30 +126,6 @@ static void soundbus_device_shutdown(struct device *dev)
|
||||
drv->shutdown(soundbus_dev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
static int soundbus_device_suspend(struct device *dev, pm_message_t state)
|
||||
{
|
||||
struct soundbus_dev * soundbus_dev = to_soundbus_device(dev);
|
||||
struct soundbus_driver * drv = to_soundbus_driver(dev->driver);
|
||||
|
||||
if (dev->driver && drv->suspend)
|
||||
return drv->suspend(soundbus_dev, state);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int soundbus_device_resume(struct device * dev)
|
||||
{
|
||||
struct soundbus_dev * soundbus_dev = to_soundbus_device(dev);
|
||||
struct soundbus_driver * drv = to_soundbus_driver(dev->driver);
|
||||
|
||||
if (dev->driver && drv->resume)
|
||||
return drv->resume(soundbus_dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
/* soundbus_dev_attrs is declared in sysfs.c */
|
||||
ATTRIBUTE_GROUPS(soundbus_dev);
|
||||
static struct bus_type soundbus_bus_type = {
|
||||
@ -158,10 +134,6 @@ static struct bus_type soundbus_bus_type = {
|
||||
.uevent = soundbus_uevent,
|
||||
.remove = soundbus_device_remove,
|
||||
.shutdown = soundbus_device_shutdown,
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = soundbus_device_suspend,
|
||||
.resume = soundbus_device_resume,
|
||||
#endif
|
||||
.dev_groups = soundbus_dev_groups,
|
||||
};
|
||||
|
||||
|
@ -188,8 +188,6 @@ struct soundbus_driver {
|
||||
int (*probe)(struct soundbus_dev* dev);
|
||||
int (*remove)(struct soundbus_dev* dev);
|
||||
|
||||
int (*suspend)(struct soundbus_dev* dev, pm_message_t state);
|
||||
int (*resume)(struct soundbus_dev* dev);
|
||||
int (*shutdown)(struct soundbus_dev* dev);
|
||||
|
||||
struct device_driver driver;
|
||||
|
@ -211,26 +211,38 @@ pcm_capture_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *hw_params)
|
||||
{
|
||||
struct snd_bebob *bebob = substream->private_data;
|
||||
int err;
|
||||
|
||||
err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
|
||||
params_buffer_bytes(hw_params));
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN)
|
||||
atomic_inc(&bebob->substreams_counter);
|
||||
amdtp_stream_set_pcm_format(&bebob->tx_stream,
|
||||
params_format(hw_params));
|
||||
return snd_pcm_lib_alloc_vmalloc_buffer(substream,
|
||||
params_buffer_bytes(hw_params));
|
||||
|
||||
return 0;
|
||||
}
|
||||
static int
|
||||
pcm_playback_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *hw_params)
|
||||
{
|
||||
struct snd_bebob *bebob = substream->private_data;
|
||||
int err;
|
||||
|
||||
err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
|
||||
params_buffer_bytes(hw_params));
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN)
|
||||
atomic_inc(&bebob->substreams_counter);
|
||||
amdtp_stream_set_pcm_format(&bebob->rx_stream,
|
||||
params_format(hw_params));
|
||||
return snd_pcm_lib_alloc_vmalloc_buffer(substream,
|
||||
params_buffer_bytes(hw_params));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -230,6 +230,12 @@ static int capture_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *hw_params)
|
||||
{
|
||||
struct snd_dice *dice = substream->private_data;
|
||||
int err;
|
||||
|
||||
err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
|
||||
params_buffer_bytes(hw_params));
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) {
|
||||
mutex_lock(&dice->mutex);
|
||||
@ -240,13 +246,18 @@ static int capture_hw_params(struct snd_pcm_substream *substream,
|
||||
amdtp_stream_set_pcm_format(&dice->tx_stream,
|
||||
params_format(hw_params));
|
||||
|
||||
return snd_pcm_lib_alloc_vmalloc_buffer(substream,
|
||||
params_buffer_bytes(hw_params));
|
||||
return 0;
|
||||
}
|
||||
static int playback_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *hw_params)
|
||||
{
|
||||
struct snd_dice *dice = substream->private_data;
|
||||
int err;
|
||||
|
||||
err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
|
||||
params_buffer_bytes(hw_params));
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) {
|
||||
mutex_lock(&dice->mutex);
|
||||
@ -257,8 +268,7 @@ static int playback_hw_params(struct snd_pcm_substream *substream,
|
||||
amdtp_stream_set_pcm_format(&dice->rx_stream,
|
||||
params_format(hw_params));
|
||||
|
||||
return snd_pcm_lib_alloc_vmalloc_buffer(substream,
|
||||
params_buffer_bytes(hw_params));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int capture_hw_free(struct snd_pcm_substream *substream)
|
||||
|
@ -244,25 +244,35 @@ static int pcm_capture_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *hw_params)
|
||||
{
|
||||
struct snd_efw *efw = substream->private_data;
|
||||
int err;
|
||||
|
||||
err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
|
||||
params_buffer_bytes(hw_params));
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN)
|
||||
atomic_inc(&efw->capture_substreams);
|
||||
amdtp_stream_set_pcm_format(&efw->tx_stream, params_format(hw_params));
|
||||
|
||||
return snd_pcm_lib_alloc_vmalloc_buffer(substream,
|
||||
params_buffer_bytes(hw_params));
|
||||
return 0;
|
||||
}
|
||||
static int pcm_playback_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *hw_params)
|
||||
{
|
||||
struct snd_efw *efw = substream->private_data;
|
||||
int err;
|
||||
|
||||
err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
|
||||
params_buffer_bytes(hw_params));
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN)
|
||||
atomic_inc(&efw->playback_substreams);
|
||||
amdtp_stream_set_pcm_format(&efw->rx_stream, params_format(hw_params));
|
||||
|
||||
return snd_pcm_lib_alloc_vmalloc_buffer(substream,
|
||||
params_buffer_bytes(hw_params));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcm_capture_hw_free(struct snd_pcm_substream *substream)
|
||||
|
@ -231,7 +231,12 @@ static int pcm_capture_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *hw_params)
|
||||
{
|
||||
struct snd_oxfw *oxfw = substream->private_data;
|
||||
int err;
|
||||
|
||||
err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
|
||||
params_buffer_bytes(hw_params));
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) {
|
||||
mutex_lock(&oxfw->mutex);
|
||||
@ -241,13 +246,18 @@ static int pcm_capture_hw_params(struct snd_pcm_substream *substream,
|
||||
|
||||
amdtp_stream_set_pcm_format(&oxfw->tx_stream, params_format(hw_params));
|
||||
|
||||
return snd_pcm_lib_alloc_vmalloc_buffer(substream,
|
||||
params_buffer_bytes(hw_params));
|
||||
return 0;
|
||||
}
|
||||
static int pcm_playback_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *hw_params)
|
||||
{
|
||||
struct snd_oxfw *oxfw = substream->private_data;
|
||||
int err;
|
||||
|
||||
err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
|
||||
params_buffer_bytes(hw_params));
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) {
|
||||
mutex_lock(&oxfw->mutex);
|
||||
@ -257,8 +267,7 @@ static int pcm_playback_hw_params(struct snd_pcm_substream *substream,
|
||||
|
||||
amdtp_stream_set_pcm_format(&oxfw->rx_stream, params_format(hw_params));
|
||||
|
||||
return snd_pcm_lib_alloc_vmalloc_buffer(substream,
|
||||
params_buffer_bytes(hw_params));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcm_capture_hw_free(struct snd_pcm_substream *substream)
|
||||
|
@ -512,12 +512,11 @@ assume_stream_formats(struct snd_oxfw *oxfw, enum avc_general_plug_dir dir,
|
||||
if (err < 0)
|
||||
goto end;
|
||||
|
||||
formats[eid] = kmalloc(*len, GFP_KERNEL);
|
||||
formats[eid] = kmemdup(buf, *len, GFP_KERNEL);
|
||||
if (formats[eid] == NULL) {
|
||||
err = -ENOMEM;
|
||||
goto end;
|
||||
}
|
||||
memcpy(formats[eid], buf, *len);
|
||||
|
||||
/* apply the format for each available sampling rate */
|
||||
for (i = 0; i < ARRAY_SIZE(oxfw_rate_table); i++) {
|
||||
@ -531,12 +530,11 @@ assume_stream_formats(struct snd_oxfw *oxfw, enum avc_general_plug_dir dir,
|
||||
continue;
|
||||
|
||||
eid++;
|
||||
formats[eid] = kmalloc(*len, GFP_KERNEL);
|
||||
formats[eid] = kmemdup(buf, *len, GFP_KERNEL);
|
||||
if (formats[eid] == NULL) {
|
||||
err = -ENOMEM;
|
||||
goto end;
|
||||
}
|
||||
memcpy(formats[eid], buf, *len);
|
||||
formats[eid][2] = avc_stream_rate_table[i];
|
||||
}
|
||||
|
||||
@ -594,12 +592,11 @@ static int fill_stream_formats(struct snd_oxfw *oxfw,
|
||||
if (err < 0)
|
||||
break;
|
||||
|
||||
formats[eid] = kmalloc(len, GFP_KERNEL);
|
||||
formats[eid] = kmemdup(buf, len, GFP_KERNEL);
|
||||
if (formats[eid] == NULL) {
|
||||
err = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
memcpy(formats[eid], buf, len);
|
||||
|
||||
/* get next entry */
|
||||
len = AVC_GENERIC_FRAME_MAXIMUM_BYTES;
|
||||
|
@ -125,7 +125,7 @@ static void default_release(struct device *dev)
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_hdac_ext_device_init - initialize the HDA extended codec base device
|
||||
* snd_hdac_ext_bus_device_init - initialize the HDA extended codec base device
|
||||
* @ebus: hdac extended bus to attach to
|
||||
* @addr: codec address
|
||||
*
|
||||
@ -133,14 +133,16 @@ static void default_release(struct device *dev)
|
||||
*/
|
||||
int snd_hdac_ext_bus_device_init(struct hdac_ext_bus *ebus, int addr)
|
||||
{
|
||||
struct hdac_ext_device *edev;
|
||||
struct hdac_device *hdev = NULL;
|
||||
struct hdac_bus *bus = ebus_to_hbus(ebus);
|
||||
char name[15];
|
||||
int ret;
|
||||
|
||||
hdev = kzalloc(sizeof(*hdev), GFP_KERNEL);
|
||||
if (!hdev)
|
||||
edev = kzalloc(sizeof(*edev), GFP_KERNEL);
|
||||
if (!edev)
|
||||
return -ENOMEM;
|
||||
hdev = &edev->hdac;
|
||||
|
||||
snprintf(name, sizeof(name), "ehdaudio%dD%d", ebus->idx, addr);
|
||||
|
||||
@ -158,6 +160,7 @@ int snd_hdac_ext_bus_device_init(struct hdac_ext_bus *ebus, int addr)
|
||||
snd_hdac_ext_bus_device_exit(hdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_init);
|
||||
@ -168,7 +171,94 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_init);
|
||||
*/
|
||||
void snd_hdac_ext_bus_device_exit(struct hdac_device *hdev)
|
||||
{
|
||||
struct hdac_ext_device *edev = to_ehdac_device(hdev);
|
||||
|
||||
snd_hdac_device_exit(hdev);
|
||||
kfree(hdev);
|
||||
kfree(edev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_exit);
|
||||
|
||||
/**
|
||||
* snd_hdac_ext_bus_device_remove - remove HD-audio extended codec base devices
|
||||
*
|
||||
* @ebus: HD-audio extended bus
|
||||
*/
|
||||
void snd_hdac_ext_bus_device_remove(struct hdac_ext_bus *ebus)
|
||||
{
|
||||
struct hdac_device *codec, *__codec;
|
||||
/*
|
||||
* we need to remove all the codec devices objects created in the
|
||||
* snd_hdac_ext_bus_device_init
|
||||
*/
|
||||
list_for_each_entry_safe(codec, __codec, &ebus->bus.codec_list, list) {
|
||||
snd_hdac_device_unregister(codec);
|
||||
put_device(&codec->dev);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_remove);
|
||||
#define dev_to_hdac(dev) (container_of((dev), \
|
||||
struct hdac_device, dev))
|
||||
|
||||
static inline struct hdac_ext_driver *get_edrv(struct device *dev)
|
||||
{
|
||||
struct hdac_driver *hdrv = drv_to_hdac_driver(dev->driver);
|
||||
struct hdac_ext_driver *edrv = to_ehdac_driver(hdrv);
|
||||
|
||||
return edrv;
|
||||
}
|
||||
|
||||
static inline struct hdac_ext_device *get_edev(struct device *dev)
|
||||
{
|
||||
struct hdac_device *hdev = dev_to_hdac_dev(dev);
|
||||
struct hdac_ext_device *edev = to_ehdac_device(hdev);
|
||||
|
||||
return edev;
|
||||
}
|
||||
|
||||
static int hda_ext_drv_probe(struct device *dev)
|
||||
{
|
||||
return (get_edrv(dev))->probe(get_edev(dev));
|
||||
}
|
||||
|
||||
static int hdac_ext_drv_remove(struct device *dev)
|
||||
{
|
||||
return (get_edrv(dev))->remove(get_edev(dev));
|
||||
}
|
||||
|
||||
static void hdac_ext_drv_shutdown(struct device *dev)
|
||||
{
|
||||
return (get_edrv(dev))->shutdown(get_edev(dev));
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_hda_ext_driver_register - register a driver for ext hda devices
|
||||
*
|
||||
* @drv: ext hda driver structure
|
||||
*/
|
||||
int snd_hda_ext_driver_register(struct hdac_ext_driver *drv)
|
||||
{
|
||||
drv->hdac.type = HDA_DEV_ASOC;
|
||||
drv->hdac.driver.bus = &snd_hda_bus_type;
|
||||
/* we use default match */
|
||||
|
||||
if (drv->probe)
|
||||
drv->hdac.driver.probe = hda_ext_drv_probe;
|
||||
if (drv->remove)
|
||||
drv->hdac.driver.remove = hdac_ext_drv_remove;
|
||||
if (drv->shutdown)
|
||||
drv->hdac.driver.shutdown = hdac_ext_drv_shutdown;
|
||||
|
||||
return driver_register(&drv->hdac.driver);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hda_ext_driver_register);
|
||||
|
||||
/**
|
||||
* snd_hda_ext_driver_unregister - unregister a driver for ext hda devices
|
||||
*
|
||||
* @drv: ext hda driver structure
|
||||
*/
|
||||
void snd_hda_ext_driver_unregister(struct hdac_ext_driver *drv)
|
||||
{
|
||||
driver_unregister(&drv->hdac.driver);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hda_ext_driver_unregister);
|
||||
|
@ -177,8 +177,8 @@ int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_ext_bus *ebus)
|
||||
hlink->bus = bus;
|
||||
hlink->ml_addr = ebus->mlcap + AZX_ML_BASE +
|
||||
(AZX_ML_INTERVAL * idx);
|
||||
hlink->lcaps = snd_hdac_chip_readl(bus, ML_LCAP);
|
||||
hlink->lsdiid = snd_hdac_chip_readw(bus, ML_LSDIID);
|
||||
hlink->lcaps = readl(hlink->ml_addr + AZX_REG_ML_LCAP);
|
||||
hlink->lsdiid = readw(hlink->ml_addr + AZX_REG_ML_LSDIID);
|
||||
|
||||
list_add_tail(&hlink->list, &ebus->hlink_list);
|
||||
}
|
||||
@ -243,7 +243,7 @@ static int check_hdac_link_power_active(struct hdac_ext_link *link, bool enable)
|
||||
timeout = 50;
|
||||
|
||||
do {
|
||||
val = snd_hdac_chip_readl(link->bus, ML_LCTL);
|
||||
val = readl(link->ml_addr + AZX_REG_ML_LCTL);
|
||||
if (enable) {
|
||||
if (((val & mask) >> AZX_MLCTL_CPA))
|
||||
return 0;
|
||||
@ -263,7 +263,7 @@ static int check_hdac_link_power_active(struct hdac_ext_link *link, bool enable)
|
||||
*/
|
||||
int snd_hdac_ext_bus_link_power_up(struct hdac_ext_link *link)
|
||||
{
|
||||
snd_hdac_chip_updatel(link->bus, ML_LCTL, 0, AZX_MLCTL_SPA);
|
||||
snd_hdac_updatel(link->ml_addr, AZX_REG_ML_LCTL, 0, AZX_MLCTL_SPA);
|
||||
|
||||
return check_hdac_link_power_active(link, true);
|
||||
}
|
||||
@ -275,8 +275,28 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_up);
|
||||
*/
|
||||
int snd_hdac_ext_bus_link_power_down(struct hdac_ext_link *link)
|
||||
{
|
||||
snd_hdac_chip_updatel(link->bus, ML_LCTL, AZX_MLCTL_SPA, 0);
|
||||
snd_hdac_updatel(link->ml_addr, AZX_REG_ML_LCTL, AZX_MLCTL_SPA, 0);
|
||||
|
||||
return check_hdac_link_power_active(link, false);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_down);
|
||||
|
||||
/**
|
||||
* snd_hdac_ext_bus_link_power_down_all -power down all hda link
|
||||
* @ebus: HD-audio extended bus
|
||||
*/
|
||||
int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus)
|
||||
{
|
||||
struct hdac_ext_link *hlink = NULL;
|
||||
int ret;
|
||||
|
||||
list_for_each_entry(hlink, &ebus->hlink_list, list) {
|
||||
snd_hdac_updatel(hlink->ml_addr, AZX_REG_ML_LCTL, AZX_MLCTL_SPA, 0);
|
||||
ret = check_hdac_link_power_active(hlink, false);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_down_all);
|
||||
|
@ -49,6 +49,16 @@ void snd_hdac_ext_stream_init(struct hdac_ext_bus *ebus,
|
||||
AZX_PPLC_INTERVAL * idx;
|
||||
}
|
||||
|
||||
if (ebus->spbcap) {
|
||||
stream->spib_addr = ebus->spbcap + AZX_SPB_BASE +
|
||||
AZX_SPB_INTERVAL * idx +
|
||||
AZX_SPB_SPIB;
|
||||
|
||||
stream->fifo_addr = ebus->spbcap + AZX_SPB_BASE +
|
||||
AZX_SPB_INTERVAL * idx +
|
||||
AZX_SPB_MAXFIFO;
|
||||
}
|
||||
|
||||
stream->decoupled = false;
|
||||
snd_hdac_stream_init(bus, &stream->hstream, idx, direction, tag);
|
||||
}
|
||||
@ -281,17 +291,12 @@ hdac_ext_host_stream_assign(struct hdac_ext_bus *ebus,
|
||||
struct hdac_ext_stream *res = NULL;
|
||||
struct hdac_stream *stream = NULL;
|
||||
struct hdac_bus *hbus = &ebus->bus;
|
||||
int key;
|
||||
|
||||
if (!ebus->ppcap) {
|
||||
dev_err(hbus->dev, "stream type not supported\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* make a non-zero unique key for the substream */
|
||||
key = (substream->pcm->device << 16) | (substream->number << 2) |
|
||||
(substream->stream + 1);
|
||||
|
||||
list_for_each_entry(stream, &hbus->stream_list, list) {
|
||||
struct hdac_ext_stream *hstream = container_of(stream,
|
||||
struct hdac_ext_stream,
|
||||
@ -310,7 +315,6 @@ hdac_ext_host_stream_assign(struct hdac_ext_bus *ebus,
|
||||
spin_lock_irq(&hbus->reg_lock);
|
||||
res->hstream.opened = 1;
|
||||
res->hstream.running = 0;
|
||||
res->hstream.assigned_key = key;
|
||||
res->hstream.substream = substream;
|
||||
spin_unlock_irq(&hbus->reg_lock);
|
||||
}
|
||||
@ -423,7 +427,7 @@ void snd_hdac_ext_stream_spbcap_enable(struct hdac_ext_bus *ebus,
|
||||
|
||||
mask |= (1 << index);
|
||||
|
||||
register_mask = snd_hdac_chip_readl(bus, SPB_SPBFCCTL);
|
||||
register_mask = readl(ebus->spbcap + AZX_REG_SPB_SPBFCCTL);
|
||||
|
||||
mask |= register_mask;
|
||||
|
||||
@ -434,6 +438,50 @@ void snd_hdac_ext_stream_spbcap_enable(struct hdac_ext_bus *ebus,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_spbcap_enable);
|
||||
|
||||
/**
|
||||
* snd_hdac_ext_stream_set_spib - sets the spib value of a stream
|
||||
* @ebus: HD-audio ext core bus
|
||||
* @stream: hdac_ext_stream
|
||||
* @value: spib value to set
|
||||
*/
|
||||
int snd_hdac_ext_stream_set_spib(struct hdac_ext_bus *ebus,
|
||||
struct hdac_ext_stream *stream, u32 value)
|
||||
{
|
||||
struct hdac_bus *bus = &ebus->bus;
|
||||
|
||||
if (!ebus->spbcap) {
|
||||
dev_err(bus->dev, "Address of SPB capability is NULL");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
writel(value, stream->spib_addr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_set_spib);
|
||||
|
||||
/**
|
||||
* snd_hdac_ext_stream_get_spbmaxfifo - gets the spib value of a stream
|
||||
* @ebus: HD-audio ext core bus
|
||||
* @stream: hdac_ext_stream
|
||||
*
|
||||
* Return maxfifo for the stream
|
||||
*/
|
||||
int snd_hdac_ext_stream_get_spbmaxfifo(struct hdac_ext_bus *ebus,
|
||||
struct hdac_ext_stream *stream)
|
||||
{
|
||||
struct hdac_bus *bus = &ebus->bus;
|
||||
|
||||
if (!ebus->spbcap) {
|
||||
dev_err(bus->dev, "Address of SPB capability is NULL");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return readl(stream->fifo_addr);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_get_spbmaxfifo);
|
||||
|
||||
|
||||
/**
|
||||
* snd_hdac_ext_stop_streams - stop all stream if running
|
||||
* @ebus: HD-audio ext core bus
|
||||
|
@ -372,6 +372,36 @@ int snd_hdac_refresh_widgets(struct hdac_device *codec)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_refresh_widgets);
|
||||
|
||||
/**
|
||||
* snd_hdac_refresh_widget_sysfs - Reset the codec widgets and reinit the
|
||||
* codec sysfs
|
||||
* @codec: the codec object
|
||||
*
|
||||
* first we need to remove sysfs, then refresh widgets and lastly
|
||||
* recreate it
|
||||
*/
|
||||
int snd_hdac_refresh_widget_sysfs(struct hdac_device *codec)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (device_is_registered(&codec->dev))
|
||||
hda_widget_sysfs_exit(codec);
|
||||
ret = snd_hdac_refresh_widgets(codec);
|
||||
if (ret) {
|
||||
dev_err(&codec->dev, "failed to refresh widget: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
if (device_is_registered(&codec->dev)) {
|
||||
ret = hda_widget_sysfs_init(codec);
|
||||
if (ret) {
|
||||
dev_err(&codec->dev, "failed to init sysfs: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_refresh_widget_sysfs);
|
||||
|
||||
/* return CONNLIST_LEN parameter of the given widget */
|
||||
static unsigned int get_num_conns(struct hdac_device *codec, hda_nid_t nid)
|
||||
{
|
||||
@ -501,23 +531,27 @@ EXPORT_SYMBOL_GPL(snd_hdac_get_connections);
|
||||
* This function calls the runtime PM helper to power up the given codec.
|
||||
* Unlike snd_hdac_power_up_pm(), you should call this only for the code
|
||||
* path that isn't included in PM path. Otherwise it gets stuck.
|
||||
*
|
||||
* Returns zero if successful, or a negative error code.
|
||||
*/
|
||||
void snd_hdac_power_up(struct hdac_device *codec)
|
||||
int snd_hdac_power_up(struct hdac_device *codec)
|
||||
{
|
||||
pm_runtime_get_sync(&codec->dev);
|
||||
return pm_runtime_get_sync(&codec->dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_power_up);
|
||||
|
||||
/**
|
||||
* snd_hdac_power_down - power down the codec
|
||||
* @codec: the codec object
|
||||
*
|
||||
* Returns zero if successful, or a negative error code.
|
||||
*/
|
||||
void snd_hdac_power_down(struct hdac_device *codec)
|
||||
int snd_hdac_power_down(struct hdac_device *codec)
|
||||
{
|
||||
struct device *dev = &codec->dev;
|
||||
|
||||
pm_runtime_mark_last_busy(dev);
|
||||
pm_runtime_put_autosuspend(dev);
|
||||
return pm_runtime_put_autosuspend(dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_power_down);
|
||||
|
||||
@ -529,11 +563,14 @@ EXPORT_SYMBOL_GPL(snd_hdac_power_down);
|
||||
* which may be called by PM suspend/resume again. OTOH, if a power-up
|
||||
* call must wake up the sleeper (e.g. in a kctl callback), use
|
||||
* snd_hdac_power_up() instead.
|
||||
*
|
||||
* Returns zero if successful, or a negative error code.
|
||||
*/
|
||||
void snd_hdac_power_up_pm(struct hdac_device *codec)
|
||||
int snd_hdac_power_up_pm(struct hdac_device *codec)
|
||||
{
|
||||
if (!atomic_inc_not_zero(&codec->in_pm))
|
||||
snd_hdac_power_up(codec);
|
||||
return snd_hdac_power_up(codec);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_power_up_pm);
|
||||
|
||||
@ -543,11 +580,14 @@ EXPORT_SYMBOL_GPL(snd_hdac_power_up_pm);
|
||||
*
|
||||
* Like snd_hdac_power_up_pm(), this function is used in a recursive
|
||||
* code path like init code which may be called by PM suspend/resume again.
|
||||
*
|
||||
* Returns zero if successful, or a negative error code.
|
||||
*/
|
||||
void snd_hdac_power_down_pm(struct hdac_device *codec)
|
||||
int snd_hdac_power_down_pm(struct hdac_device *codec)
|
||||
{
|
||||
if (atomic_dec_if_positive(&codec->in_pm) < 0)
|
||||
snd_hdac_power_down(codec);
|
||||
return snd_hdac_power_down(codec);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_power_down_pm);
|
||||
#endif
|
||||
|
@ -134,6 +134,16 @@ static int hdac_component_master_match(struct device *dev, void *data)
|
||||
return !strcmp(dev->driver->name, "i915");
|
||||
}
|
||||
|
||||
int snd_hdac_i915_register_notifier(const struct i915_audio_component_audio_ops *aops)
|
||||
{
|
||||
if (WARN_ON(!hdac_acomp))
|
||||
return -ENODEV;
|
||||
|
||||
hdac_acomp->audio_ops = aops;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_i915_register_notifier);
|
||||
|
||||
int snd_hdac_i915_init(struct hdac_bus *bus)
|
||||
{
|
||||
struct component_match *match = NULL;
|
||||
|
@ -410,8 +410,9 @@ int snd_hdac_regmap_write_raw(struct hdac_device *codec, unsigned int reg,
|
||||
|
||||
err = reg_raw_write(codec, reg, val);
|
||||
if (err == -EAGAIN) {
|
||||
snd_hdac_power_up_pm(codec);
|
||||
err = reg_raw_write(codec, reg, val);
|
||||
err = snd_hdac_power_up_pm(codec);
|
||||
if (!err)
|
||||
err = reg_raw_write(codec, reg, val);
|
||||
snd_hdac_power_down_pm(codec);
|
||||
}
|
||||
return err;
|
||||
@ -442,8 +443,9 @@ int snd_hdac_regmap_read_raw(struct hdac_device *codec, unsigned int reg,
|
||||
|
||||
err = reg_raw_read(codec, reg, val);
|
||||
if (err == -EAGAIN) {
|
||||
snd_hdac_power_up_pm(codec);
|
||||
err = reg_raw_read(codec, reg, val);
|
||||
err = snd_hdac_power_up_pm(codec);
|
||||
if (!err)
|
||||
err = reg_raw_read(codec, reg, val);
|
||||
snd_hdac_power_down_pm(codec);
|
||||
}
|
||||
return err;
|
||||
|
@ -286,6 +286,28 @@ void snd_hdac_stream_release(struct hdac_stream *azx_dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_stream_release);
|
||||
|
||||
/**
|
||||
* snd_hdac_get_stream - return hdac_stream based on stream_tag and
|
||||
* direction
|
||||
*
|
||||
* @bus: HD-audio core bus
|
||||
* @dir: direction for the stream to be found
|
||||
* @stream_tag: stream tag for stream to be found
|
||||
*/
|
||||
struct hdac_stream *snd_hdac_get_stream(struct hdac_bus *bus,
|
||||
int dir, int stream_tag)
|
||||
{
|
||||
struct hdac_stream *s;
|
||||
|
||||
list_for_each_entry(s, &bus->stream_list, list) {
|
||||
if (s->direction == dir && s->stream_tag == stream_tag)
|
||||
return s;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_get_stream);
|
||||
|
||||
/*
|
||||
* set up a BDL entry
|
||||
*/
|
||||
|
@ -321,8 +321,7 @@ static void widget_tree_free(struct hdac_device *codec)
|
||||
free_widget_node(*p, &widget_node_group);
|
||||
kfree(tree->nodes);
|
||||
}
|
||||
if (tree->root)
|
||||
kobject_put(tree->root);
|
||||
kobject_put(tree->root);
|
||||
kfree(tree);
|
||||
codec->widgets = NULL;
|
||||
}
|
||||
@ -391,6 +390,9 @@ int hda_widget_sysfs_init(struct hdac_device *codec)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (codec->widgets)
|
||||
return 0; /* already created */
|
||||
|
||||
err = widget_tree_create(codec);
|
||||
if (err < 0) {
|
||||
widget_tree_free(codec);
|
||||
|
@ -44,18 +44,18 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
chip->device_id = device_id;
|
||||
chip->subdevice_id = subdevice_id;
|
||||
chip->bad_board = TRUE;
|
||||
chip->bad_board = true;
|
||||
chip->dsp_code_to_load = FW_DARLA20_DSP;
|
||||
chip->spdif_status = GD_SPDIF_STATUS_UNDEF;
|
||||
chip->clock_state = GD_CLOCK_UNDEF;
|
||||
/* Since this card has no ASIC, mark it as loaded so everything
|
||||
works OK */
|
||||
chip->asic_loaded = TRUE;
|
||||
chip->asic_loaded = true;
|
||||
chip->input_clock_types = ECHO_CLOCK_BIT_INTERNAL;
|
||||
|
||||
if ((err = load_firmware(chip)) < 0)
|
||||
return err;
|
||||
chip->bad_board = FALSE;
|
||||
chip->bad_board = false;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -44,17 +44,17 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
chip->device_id = device_id;
|
||||
chip->subdevice_id = subdevice_id;
|
||||
chip->bad_board = TRUE;
|
||||
chip->bad_board = true;
|
||||
chip->dsp_code_to_load = FW_DARLA24_DSP;
|
||||
/* Since this card has no ASIC, mark it as loaded so everything
|
||||
works OK */
|
||||
chip->asic_loaded = TRUE;
|
||||
chip->asic_loaded = true;
|
||||
chip->input_clock_types = ECHO_CLOCK_BIT_INTERNAL |
|
||||
ECHO_CLOCK_BIT_ESYNC;
|
||||
|
||||
if ((err = load_firmware(chip)) < 0)
|
||||
return err;
|
||||
chip->bad_board = FALSE;
|
||||
chip->bad_board = false;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -59,8 +59,8 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
cpu_to_le32((E3G_MAGIC_NUMBER / 48000) - 2);
|
||||
chip->device_id = device_id;
|
||||
chip->subdevice_id = subdevice_id;
|
||||
chip->bad_board = TRUE;
|
||||
chip->has_midi = TRUE;
|
||||
chip->bad_board = true;
|
||||
chip->has_midi = true;
|
||||
chip->dsp_code_to_load = FW_ECHO3G_DSP;
|
||||
|
||||
/* Load the DSP code and the ASIC on the PCI card and get
|
||||
@ -78,8 +78,8 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
chip->px_analog_in = chip->bx_analog_in = 14;
|
||||
chip->px_digital_in = chip->bx_digital_in = 16;
|
||||
chip->px_num = chip->bx_num = 24;
|
||||
chip->has_phantom_power = TRUE;
|
||||
chip->hasnt_input_nominal_level = TRUE;
|
||||
chip->has_phantom_power = true;
|
||||
chip->hasnt_input_nominal_level = true;
|
||||
} else if (err == E3G_LAYLA3G_BOX_TYPE) {
|
||||
chip->input_clock_types = ECHO_CLOCK_BIT_INTERNAL |
|
||||
ECHO_CLOCK_BIT_SPDIF |
|
||||
@ -106,10 +106,10 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
static int set_mixer_defaults(struct echoaudio *chip)
|
||||
{
|
||||
chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
|
||||
chip->professional_spdif = FALSE;
|
||||
chip->non_audio_spdif = FALSE;
|
||||
chip->bad_board = FALSE;
|
||||
chip->phantom_power = FALSE;
|
||||
chip->professional_spdif = false;
|
||||
chip->non_audio_spdif = false;
|
||||
chip->bad_board = false;
|
||||
chip->phantom_power = false;
|
||||
return init_line_levels(chip);
|
||||
}
|
||||
|
||||
|
@ -2245,7 +2245,7 @@ static int snd_echo_resume(struct device *dev)
|
||||
|
||||
#ifdef ECHOCARD_HAS_MIDI
|
||||
if (chip->midi_input_enabled)
|
||||
enable_midi_input(chip, TRUE);
|
||||
enable_midi_input(chip, true);
|
||||
if (chip->midi_out)
|
||||
snd_echo_midi_output_trigger(chip->midi_out, 1);
|
||||
#endif
|
||||
|
@ -153,9 +153,6 @@
|
||||
#define _ECHOAUDIO_H_
|
||||
|
||||
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
|
||||
#include "echoaudio_dsp.h"
|
||||
|
||||
|
||||
@ -378,8 +375,8 @@ struct echoaudio {
|
||||
*/
|
||||
u8 output_clock; /* Layla20 only */
|
||||
char meters_enabled; /* VU-meters status */
|
||||
char asic_loaded; /* Set TRUE when ASIC loaded */
|
||||
char bad_board; /* Set TRUE if DSP won't load */
|
||||
char asic_loaded; /* Set true when ASIC loaded */
|
||||
char bad_board; /* Set true if DSP won't load */
|
||||
char professional_spdif; /* 0 = consumer; 1 = professional */
|
||||
char non_audio_spdif; /* 3G - only */
|
||||
char digital_in_automute; /* Gina24, Layla24, Mona - only */
|
||||
|
@ -41,7 +41,7 @@ static int check_asic_status(struct echoaudio *chip)
|
||||
return -EIO;
|
||||
|
||||
chip->comm_page->ext_box_status = cpu_to_le32(E3G_ASIC_NOT_LOADED);
|
||||
chip->asic_loaded = FALSE;
|
||||
chip->asic_loaded = false;
|
||||
clear_handshake(chip);
|
||||
send_vector(chip, DSP_VC_TEST_ASIC);
|
||||
|
||||
@ -55,7 +55,7 @@ static int check_asic_status(struct echoaudio *chip)
|
||||
if (box_status == E3G_ASIC_NOT_LOADED)
|
||||
return -ENODEV;
|
||||
|
||||
chip->asic_loaded = TRUE;
|
||||
chip->asic_loaded = true;
|
||||
return box_status & E3G_BOX_TYPE_MASK;
|
||||
}
|
||||
|
||||
@ -243,7 +243,7 @@ static int load_asic(struct echoaudio *chip)
|
||||
* 48 kHz, internal clock, S/PDIF RCA mode */
|
||||
if (box_type >= 0) {
|
||||
err = write_control_reg(chip, E3G_48KHZ,
|
||||
E3G_FREQ_REG_DEFAULT, TRUE);
|
||||
E3G_FREQ_REG_DEFAULT, true);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
@ -378,16 +378,16 @@ static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
|
||||
int err, incompatible_clock;
|
||||
|
||||
/* Set clock to "internal" if it's not compatible with the new mode */
|
||||
incompatible_clock = FALSE;
|
||||
incompatible_clock = false;
|
||||
switch (mode) {
|
||||
case DIGITAL_MODE_SPDIF_OPTICAL:
|
||||
case DIGITAL_MODE_SPDIF_RCA:
|
||||
if (chip->input_clock == ECHO_CLOCK_ADAT)
|
||||
incompatible_clock = TRUE;
|
||||
incompatible_clock = true;
|
||||
break;
|
||||
case DIGITAL_MODE_ADAT:
|
||||
if (chip->input_clock == ECHO_CLOCK_SPDIF)
|
||||
incompatible_clock = TRUE;
|
||||
incompatible_clock = true;
|
||||
break;
|
||||
default:
|
||||
dev_err(chip->card->dev,
|
||||
|
@ -103,8 +103,8 @@ static int write_dsp(struct echoaudio *chip, u32 data)
|
||||
cond_resched();
|
||||
}
|
||||
|
||||
chip->bad_board = TRUE; /* Set TRUE until DSP re-loaded */
|
||||
dev_dbg(chip->card->dev, "write_dsp: Set bad_board to TRUE\n");
|
||||
chip->bad_board = true; /* Set true until DSP re-loaded */
|
||||
dev_dbg(chip->card->dev, "write_dsp: Set bad_board to true\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@ -126,8 +126,8 @@ static int read_dsp(struct echoaudio *chip, u32 *data)
|
||||
cond_resched();
|
||||
}
|
||||
|
||||
chip->bad_board = TRUE; /* Set TRUE until DSP re-loaded */
|
||||
dev_err(chip->card->dev, "read_dsp: Set bad_board to TRUE\n");
|
||||
chip->bad_board = true; /* Set true until DSP re-loaded */
|
||||
dev_err(chip->card->dev, "read_dsp: Set bad_board to true\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@ -166,7 +166,7 @@ static int read_sn(struct echoaudio *chip)
|
||||
/* This card has no ASIC, just return ok */
|
||||
static inline int check_asic_status(struct echoaudio *chip)
|
||||
{
|
||||
chip->asic_loaded = TRUE;
|
||||
chip->asic_loaded = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -341,11 +341,11 @@ static int load_dsp(struct echoaudio *chip, u16 *code)
|
||||
dev_warn(chip->card->dev, "DSP is already loaded!\n");
|
||||
return 0;
|
||||
}
|
||||
chip->bad_board = TRUE; /* Set TRUE until DSP loaded */
|
||||
chip->bad_board = true; /* Set true until DSP loaded */
|
||||
chip->dsp_code = NULL; /* Current DSP code not loaded */
|
||||
chip->asic_loaded = FALSE; /* Loading the DSP code will reset the ASIC */
|
||||
chip->asic_loaded = false; /* Loading the DSP code will reset the ASIC */
|
||||
|
||||
dev_dbg(chip->card->dev, "load_dsp: Set bad_board to TRUE\n");
|
||||
dev_dbg(chip->card->dev, "load_dsp: Set bad_board to true\n");
|
||||
|
||||
/* If this board requires a resident loader, install it. */
|
||||
#ifdef DSP_56361
|
||||
@ -471,7 +471,7 @@ static int load_dsp(struct echoaudio *chip, u16 *code)
|
||||
}
|
||||
|
||||
chip->dsp_code = code; /* Show which DSP code loaded */
|
||||
chip->bad_board = FALSE; /* DSP OK */
|
||||
chip->bad_board = false; /* DSP OK */
|
||||
return 0;
|
||||
}
|
||||
udelay(100);
|
||||
@ -951,10 +951,10 @@ static int rest_in_peace(struct echoaudio *chip)
|
||||
/* Stops all active pipes (just to be sure) */
|
||||
stop_transport(chip, chip->active_mask);
|
||||
|
||||
set_meters_on(chip, FALSE);
|
||||
set_meters_on(chip, false);
|
||||
|
||||
#ifdef ECHOCARD_HAS_MIDI
|
||||
enable_midi_input(chip, FALSE);
|
||||
enable_midi_input(chip, false);
|
||||
#endif
|
||||
|
||||
/* Go to sleep */
|
||||
@ -981,9 +981,9 @@ static int init_dsp_comm_page(struct echoaudio *chip)
|
||||
|
||||
/* Init all the basic stuff */
|
||||
chip->card_name = ECHOCARD_NAME;
|
||||
chip->bad_board = TRUE; /* Set TRUE until DSP loaded */
|
||||
chip->bad_board = true; /* Set true until DSP loaded */
|
||||
chip->dsp_code = NULL; /* Current DSP code not loaded */
|
||||
chip->asic_loaded = FALSE;
|
||||
chip->asic_loaded = false;
|
||||
memset(chip->comm_page, 0, sizeof(struct comm_page));
|
||||
|
||||
/* Init the comm page */
|
||||
|
@ -48,7 +48,7 @@ static int check_asic_status(struct echoaudio *chip)
|
||||
if (read_dsp(chip, &asic_status) < 0) {
|
||||
dev_err(chip->card->dev,
|
||||
"check_asic_status: failed on read_dsp\n");
|
||||
chip->asic_loaded = FALSE;
|
||||
chip->asic_loaded = false;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@ -192,7 +192,7 @@ static int set_professional_spdif(struct echoaudio *chip, char prof)
|
||||
}
|
||||
}
|
||||
|
||||
if ((err = write_control_reg(chip, control_reg, FALSE)))
|
||||
if ((err = write_control_reg(chip, control_reg, false)))
|
||||
return err;
|
||||
chip->professional_spdif = prof;
|
||||
dev_dbg(chip->card->dev, "set_professional_spdif to %s\n",
|
||||
|
@ -23,7 +23,7 @@
|
||||
#define ECHOCARD_HAS_INPUT_GAIN
|
||||
#define ECHOCARD_HAS_DIGITAL_IO
|
||||
#define ECHOCARD_HAS_EXTERNAL_CLOCK
|
||||
#define ECHOCARD_HAS_ADAT FALSE
|
||||
#define ECHOCARD_HAS_ADAT false
|
||||
|
||||
/* Pipe indexes */
|
||||
#define PX_ANALOG_OUT 0 /* 8 */
|
||||
|
@ -48,19 +48,19 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
chip->device_id = device_id;
|
||||
chip->subdevice_id = subdevice_id;
|
||||
chip->bad_board = TRUE;
|
||||
chip->bad_board = true;
|
||||
chip->dsp_code_to_load = FW_GINA20_DSP;
|
||||
chip->spdif_status = GD_SPDIF_STATUS_UNDEF;
|
||||
chip->clock_state = GD_CLOCK_UNDEF;
|
||||
/* Since this card has no ASIC, mark it as loaded so everything
|
||||
works OK */
|
||||
chip->asic_loaded = TRUE;
|
||||
chip->asic_loaded = true;
|
||||
chip->input_clock_types = ECHO_CLOCK_BIT_INTERNAL |
|
||||
ECHO_CLOCK_BIT_SPDIF;
|
||||
|
||||
if ((err = load_firmware(chip)) < 0)
|
||||
return err;
|
||||
chip->bad_board = FALSE;
|
||||
chip->bad_board = false;
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -69,7 +69,7 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
static int set_mixer_defaults(struct echoaudio *chip)
|
||||
{
|
||||
chip->professional_spdif = FALSE;
|
||||
chip->professional_spdif = false;
|
||||
return init_line_levels(chip);
|
||||
}
|
||||
|
||||
|
@ -52,7 +52,7 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
chip->device_id = device_id;
|
||||
chip->subdevice_id = subdevice_id;
|
||||
chip->bad_board = TRUE;
|
||||
chip->bad_board = true;
|
||||
chip->input_clock_types =
|
||||
ECHO_CLOCK_BIT_INTERNAL | ECHO_CLOCK_BIT_SPDIF |
|
||||
ECHO_CLOCK_BIT_ESYNC | ECHO_CLOCK_BIT_ESYNC96 |
|
||||
@ -76,7 +76,7 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
if ((err = load_firmware(chip)) < 0)
|
||||
return err;
|
||||
chip->bad_board = FALSE;
|
||||
chip->bad_board = false;
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -86,8 +86,8 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
static int set_mixer_defaults(struct echoaudio *chip)
|
||||
{
|
||||
chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
|
||||
chip->professional_spdif = FALSE;
|
||||
chip->digital_in_automute = TRUE;
|
||||
chip->professional_spdif = false;
|
||||
chip->digital_in_automute = true;
|
||||
return init_line_levels(chip);
|
||||
}
|
||||
|
||||
@ -152,7 +152,7 @@ static int load_asic(struct echoaudio *chip)
|
||||
48 kHz, internal clock, S/PDIF RCA mode */
|
||||
if (!err) {
|
||||
control_reg = GML_CONVERTER_ENABLE | GML_48KHZ;
|
||||
err = write_control_reg(chip, control_reg, TRUE);
|
||||
err = write_control_reg(chip, control_reg, true);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
@ -226,7 +226,7 @@ static int set_sample_rate(struct echoaudio *chip, u32 rate)
|
||||
chip->sample_rate = rate;
|
||||
dev_dbg(chip->card->dev, "set_sample_rate: %d clock %d\n", rate, clock);
|
||||
|
||||
return write_control_reg(chip, control_reg, FALSE);
|
||||
return write_control_reg(chip, control_reg, false);
|
||||
}
|
||||
|
||||
|
||||
@ -274,7 +274,7 @@ static int set_input_clock(struct echoaudio *chip, u16 clock)
|
||||
}
|
||||
|
||||
chip->input_clock = clock;
|
||||
return write_control_reg(chip, control_reg, TRUE);
|
||||
return write_control_reg(chip, control_reg, true);
|
||||
}
|
||||
|
||||
|
||||
@ -285,17 +285,17 @@ static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
|
||||
int err, incompatible_clock;
|
||||
|
||||
/* Set clock to "internal" if it's not compatible with the new mode */
|
||||
incompatible_clock = FALSE;
|
||||
incompatible_clock = false;
|
||||
switch (mode) {
|
||||
case DIGITAL_MODE_SPDIF_OPTICAL:
|
||||
case DIGITAL_MODE_SPDIF_CDROM:
|
||||
case DIGITAL_MODE_SPDIF_RCA:
|
||||
if (chip->input_clock == ECHO_CLOCK_ADAT)
|
||||
incompatible_clock = TRUE;
|
||||
incompatible_clock = true;
|
||||
break;
|
||||
case DIGITAL_MODE_ADAT:
|
||||
if (chip->input_clock == ECHO_CLOCK_SPDIF)
|
||||
incompatible_clock = TRUE;
|
||||
incompatible_clock = true;
|
||||
break;
|
||||
default:
|
||||
dev_err(chip->card->dev,
|
||||
@ -333,7 +333,7 @@ static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
|
||||
break;
|
||||
}
|
||||
|
||||
err = write_control_reg(chip, control_reg, TRUE);
|
||||
err = write_control_reg(chip, control_reg, true);
|
||||
spin_unlock_irq(&chip->lock);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
@ -49,16 +49,16 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
chip->device_id = device_id;
|
||||
chip->subdevice_id = subdevice_id;
|
||||
chip->bad_board = TRUE;
|
||||
chip->bad_board = true;
|
||||
chip->dsp_code_to_load = FW_INDIGO_DSP;
|
||||
/* Since this card has no ASIC, mark it as loaded so everything
|
||||
works OK */
|
||||
chip->asic_loaded = TRUE;
|
||||
chip->asic_loaded = true;
|
||||
chip->input_clock_types = ECHO_CLOCK_BIT_INTERNAL;
|
||||
|
||||
if ((err = load_firmware(chip)) < 0)
|
||||
return err;
|
||||
chip->bad_board = FALSE;
|
||||
chip->bad_board = false;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -49,16 +49,16 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
chip->device_id = device_id;
|
||||
chip->subdevice_id = subdevice_id;
|
||||
chip->bad_board = TRUE;
|
||||
chip->bad_board = true;
|
||||
chip->dsp_code_to_load = FW_INDIGO_DJ_DSP;
|
||||
/* Since this card has no ASIC, mark it as loaded so everything
|
||||
works OK */
|
||||
chip->asic_loaded = TRUE;
|
||||
chip->asic_loaded = true;
|
||||
chip->input_clock_types = ECHO_CLOCK_BIT_INTERNAL;
|
||||
|
||||
if ((err = load_firmware(chip)) < 0)
|
||||
return err;
|
||||
chip->bad_board = FALSE;
|
||||
chip->bad_board = false;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -47,17 +47,17 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
chip->device_id = device_id;
|
||||
chip->subdevice_id = subdevice_id;
|
||||
chip->bad_board = TRUE;
|
||||
chip->bad_board = true;
|
||||
chip->dsp_code_to_load = FW_INDIGO_DJX_DSP;
|
||||
/* Since this card has no ASIC, mark it as loaded so everything
|
||||
works OK */
|
||||
chip->asic_loaded = TRUE;
|
||||
chip->asic_loaded = true;
|
||||
chip->input_clock_types = ECHO_CLOCK_BIT_INTERNAL;
|
||||
|
||||
err = load_firmware(chip);
|
||||
if (err < 0)
|
||||
return err;
|
||||
chip->bad_board = FALSE;
|
||||
chip->bad_board = false;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -49,16 +49,16 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
chip->device_id = device_id;
|
||||
chip->subdevice_id = subdevice_id;
|
||||
chip->bad_board = TRUE;
|
||||
chip->bad_board = true;
|
||||
chip->dsp_code_to_load = FW_INDIGO_IO_DSP;
|
||||
/* Since this card has no ASIC, mark it as loaded so everything
|
||||
works OK */
|
||||
chip->asic_loaded = TRUE;
|
||||
chip->asic_loaded = true;
|
||||
chip->input_clock_types = ECHO_CLOCK_BIT_INTERNAL;
|
||||
|
||||
if ((err = load_firmware(chip)) < 0)
|
||||
return err;
|
||||
chip->bad_board = FALSE;
|
||||
chip->bad_board = false;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -47,17 +47,17 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
chip->device_id = device_id;
|
||||
chip->subdevice_id = subdevice_id;
|
||||
chip->bad_board = TRUE;
|
||||
chip->bad_board = true;
|
||||
chip->dsp_code_to_load = FW_INDIGO_IOX_DSP;
|
||||
/* Since this card has no ASIC, mark it as loaded so everything
|
||||
works OK */
|
||||
chip->asic_loaded = TRUE;
|
||||
chip->asic_loaded = true;
|
||||
chip->input_clock_types = ECHO_CLOCK_BIT_INTERNAL;
|
||||
|
||||
err = load_firmware(chip);
|
||||
if (err < 0)
|
||||
return err;
|
||||
chip->bad_board = FALSE;
|
||||
chip->bad_board = false;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -26,7 +26,7 @@
|
||||
#define ECHOCARD_HAS_SUPER_INTERLEAVE
|
||||
#define ECHOCARD_HAS_DIGITAL_IO
|
||||
#define ECHOCARD_HAS_EXTERNAL_CLOCK
|
||||
#define ECHOCARD_HAS_ADAT FALSE
|
||||
#define ECHOCARD_HAS_ADAT false
|
||||
#define ECHOCARD_HAS_OUTPUT_CLOCK_SWITCH
|
||||
#define ECHOCARD_HAS_MIDI
|
||||
|
||||
|
@ -51,8 +51,8 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
chip->device_id = device_id;
|
||||
chip->subdevice_id = subdevice_id;
|
||||
chip->bad_board = TRUE;
|
||||
chip->has_midi = TRUE;
|
||||
chip->bad_board = true;
|
||||
chip->has_midi = true;
|
||||
chip->dsp_code_to_load = FW_LAYLA20_DSP;
|
||||
chip->input_clock_types =
|
||||
ECHO_CLOCK_BIT_INTERNAL | ECHO_CLOCK_BIT_SPDIF |
|
||||
@ -62,7 +62,7 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
if ((err = load_firmware(chip)) < 0)
|
||||
return err;
|
||||
chip->bad_board = FALSE;
|
||||
chip->bad_board = false;
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -71,7 +71,7 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
static int set_mixer_defaults(struct echoaudio *chip)
|
||||
{
|
||||
chip->professional_spdif = FALSE;
|
||||
chip->professional_spdif = false;
|
||||
return init_line_levels(chip);
|
||||
}
|
||||
|
||||
@ -113,7 +113,7 @@ static int check_asic_status(struct echoaudio *chip)
|
||||
u32 asic_status;
|
||||
int goodcnt, i;
|
||||
|
||||
chip->asic_loaded = FALSE;
|
||||
chip->asic_loaded = false;
|
||||
for (i = goodcnt = 0; i < 5; i++) {
|
||||
send_vector(chip, DSP_VC_TEST_ASIC);
|
||||
|
||||
@ -127,7 +127,7 @@ static int check_asic_status(struct echoaudio *chip)
|
||||
|
||||
if (asic_status == ASIC_ALREADY_LOADED) {
|
||||
if (++goodcnt == 3) {
|
||||
chip->asic_loaded = TRUE;
|
||||
chip->asic_loaded = true;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -51,8 +51,8 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
chip->device_id = device_id;
|
||||
chip->subdevice_id = subdevice_id;
|
||||
chip->bad_board = TRUE;
|
||||
chip->has_midi = TRUE;
|
||||
chip->bad_board = true;
|
||||
chip->has_midi = true;
|
||||
chip->dsp_code_to_load = FW_LAYLA24_DSP;
|
||||
chip->input_clock_types =
|
||||
ECHO_CLOCK_BIT_INTERNAL | ECHO_CLOCK_BIT_SPDIF |
|
||||
@ -64,7 +64,7 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
if ((err = load_firmware(chip)) < 0)
|
||||
return err;
|
||||
chip->bad_board = FALSE;
|
||||
chip->bad_board = false;
|
||||
|
||||
if ((err = init_line_levels(chip)) < 0)
|
||||
return err;
|
||||
@ -77,8 +77,8 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
static int set_mixer_defaults(struct echoaudio *chip)
|
||||
{
|
||||
chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
|
||||
chip->professional_spdif = FALSE;
|
||||
chip->digital_in_automute = TRUE;
|
||||
chip->professional_spdif = false;
|
||||
chip->digital_in_automute = true;
|
||||
return init_line_levels(chip);
|
||||
}
|
||||
|
||||
@ -135,7 +135,7 @@ static int load_asic(struct echoaudio *chip)
|
||||
err = load_asic_generic(chip, DSP_FNC_LOAD_LAYLA24_EXTERNAL_ASIC,
|
||||
FW_LAYLA24_2S_ASIC);
|
||||
if (err < 0)
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
/* Now give the external ASIC a little time to set up */
|
||||
mdelay(10);
|
||||
@ -147,7 +147,7 @@ static int load_asic(struct echoaudio *chip)
|
||||
48 kHz, internal clock, S/PDIF RCA mode */
|
||||
if (!err)
|
||||
err = write_control_reg(chip, GML_CONVERTER_ENABLE | GML_48KHZ,
|
||||
TRUE);
|
||||
true);
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -241,7 +241,7 @@ static int set_sample_rate(struct echoaudio *chip, u32 rate)
|
||||
dev_dbg(chip->card->dev,
|
||||
"set_sample_rate: %d clock %d\n", rate, control_reg);
|
||||
|
||||
return write_control_reg(chip, control_reg, FALSE);
|
||||
return write_control_reg(chip, control_reg, false);
|
||||
}
|
||||
|
||||
|
||||
@ -287,7 +287,7 @@ static int set_input_clock(struct echoaudio *chip, u16 clock)
|
||||
}
|
||||
|
||||
chip->input_clock = clock;
|
||||
return write_control_reg(chip, control_reg, TRUE);
|
||||
return write_control_reg(chip, control_reg, true);
|
||||
}
|
||||
|
||||
|
||||
@ -334,17 +334,17 @@ static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
|
||||
short asic;
|
||||
|
||||
/* Set clock to "internal" if it's not compatible with the new mode */
|
||||
incompatible_clock = FALSE;
|
||||
incompatible_clock = false;
|
||||
switch (mode) {
|
||||
case DIGITAL_MODE_SPDIF_OPTICAL:
|
||||
case DIGITAL_MODE_SPDIF_RCA:
|
||||
if (chip->input_clock == ECHO_CLOCK_ADAT)
|
||||
incompatible_clock = TRUE;
|
||||
incompatible_clock = true;
|
||||
asic = FW_LAYLA24_2S_ASIC;
|
||||
break;
|
||||
case DIGITAL_MODE_ADAT:
|
||||
if (chip->input_clock == ECHO_CLOCK_SPDIF)
|
||||
incompatible_clock = TRUE;
|
||||
incompatible_clock = true;
|
||||
asic = FW_LAYLA24_2A_ASIC;
|
||||
break;
|
||||
default:
|
||||
@ -383,7 +383,7 @@ static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
|
||||
break;
|
||||
}
|
||||
|
||||
err = write_control_reg(chip, control_reg, TRUE);
|
||||
err = write_control_reg(chip, control_reg, true);
|
||||
spin_unlock_irq(&chip->lock);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
@ -26,7 +26,7 @@
|
||||
#define ECHOCARD_HAS_VMIXER
|
||||
#define ECHOCARD_HAS_DIGITAL_IO
|
||||
#define ECHOCARD_HAS_EXTERNAL_CLOCK
|
||||
#define ECHOCARD_HAS_ADAT FALSE
|
||||
#define ECHOCARD_HAS_ADAT false
|
||||
#define ECHOCARD_HAS_STEREO_BIG_ENDIAN32
|
||||
#define ECHOCARD_HAS_MIDI
|
||||
#define ECHOCARD_HAS_LINE_OUT_GAIN
|
||||
|
@ -52,19 +52,19 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
chip->device_id = device_id;
|
||||
chip->subdevice_id = subdevice_id;
|
||||
chip->bad_board = TRUE;
|
||||
chip->bad_board = true;
|
||||
chip->dsp_code_to_load = FW_MIA_DSP;
|
||||
/* Since this card has no ASIC, mark it as loaded so everything
|
||||
works OK */
|
||||
chip->asic_loaded = TRUE;
|
||||
chip->asic_loaded = true;
|
||||
if ((subdevice_id & 0x0000f) == MIA_MIDI_REV)
|
||||
chip->has_midi = TRUE;
|
||||
chip->has_midi = true;
|
||||
chip->input_clock_types = ECHO_CLOCK_BIT_INTERNAL |
|
||||
ECHO_CLOCK_BIT_SPDIF;
|
||||
|
||||
if ((err = load_firmware(chip)) < 0)
|
||||
return err;
|
||||
chip->bad_board = FALSE;
|
||||
chip->bad_board = false;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -52,7 +52,7 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
chip->device_id = device_id;
|
||||
chip->subdevice_id = subdevice_id;
|
||||
chip->bad_board = TRUE;
|
||||
chip->bad_board = true;
|
||||
chip->input_clock_types =
|
||||
ECHO_CLOCK_BIT_INTERNAL | ECHO_CLOCK_BIT_SPDIF |
|
||||
ECHO_CLOCK_BIT_WORD | ECHO_CLOCK_BIT_ADAT;
|
||||
@ -69,7 +69,7 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
|
||||
if ((err = load_firmware(chip)) < 0)
|
||||
return err;
|
||||
chip->bad_board = FALSE;
|
||||
chip->bad_board = false;
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -79,8 +79,8 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
|
||||
static int set_mixer_defaults(struct echoaudio *chip)
|
||||
{
|
||||
chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
|
||||
chip->professional_spdif = FALSE;
|
||||
chip->digital_in_automute = TRUE;
|
||||
chip->professional_spdif = false;
|
||||
chip->digital_in_automute = true;
|
||||
return init_line_levels(chip);
|
||||
}
|
||||
|
||||
@ -148,7 +148,7 @@ static int load_asic(struct echoaudio *chip)
|
||||
48 kHz, internal clock, S/PDIF RCA mode */
|
||||
if (!err) {
|
||||
control_reg = GML_CONVERTER_ENABLE | GML_48KHZ;
|
||||
err = write_control_reg(chip, control_reg, TRUE);
|
||||
err = write_control_reg(chip, control_reg, true);
|
||||
}
|
||||
|
||||
return err;
|
||||
@ -356,7 +356,7 @@ static int set_input_clock(struct echoaudio *chip, u16 clock)
|
||||
}
|
||||
|
||||
chip->input_clock = clock;
|
||||
return write_control_reg(chip, control_reg, TRUE);
|
||||
return write_control_reg(chip, control_reg, true);
|
||||
}
|
||||
|
||||
|
||||
@ -367,16 +367,16 @@ static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
|
||||
int err, incompatible_clock;
|
||||
|
||||
/* Set clock to "internal" if it's not compatible with the new mode */
|
||||
incompatible_clock = FALSE;
|
||||
incompatible_clock = false;
|
||||
switch (mode) {
|
||||
case DIGITAL_MODE_SPDIF_OPTICAL:
|
||||
case DIGITAL_MODE_SPDIF_RCA:
|
||||
if (chip->input_clock == ECHO_CLOCK_ADAT)
|
||||
incompatible_clock = TRUE;
|
||||
incompatible_clock = true;
|
||||
break;
|
||||
case DIGITAL_MODE_ADAT:
|
||||
if (chip->input_clock == ECHO_CLOCK_SPDIF)
|
||||
incompatible_clock = TRUE;
|
||||
incompatible_clock = true;
|
||||
break;
|
||||
default:
|
||||
dev_err(chip->card->dev,
|
||||
@ -415,7 +415,7 @@ static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
|
||||
break;
|
||||
}
|
||||
|
||||
err = write_control_reg(chip, control_reg, FALSE);
|
||||
err = write_control_reg(chip, control_reg, false);
|
||||
spin_unlock_irq(&chip->lock);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
@ -1741,7 +1741,7 @@ static int snd_audigy_capture_boost_put(struct snd_kcontrol *kcontrol,
|
||||
static struct snd_kcontrol_new snd_audigy_capture_boost =
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "Analog Capture Boost",
|
||||
.name = "Mic Extra Boost",
|
||||
.info = snd_audigy_capture_boost_info,
|
||||
.get = snd_audigy_capture_boost_get,
|
||||
.put = snd_audigy_capture_boost_put
|
||||
@ -1819,8 +1819,6 @@ int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
|
||||
* the Philips ADC for 24bit capture */
|
||||
"PCM Playback Switch",
|
||||
"PCM Playback Volume",
|
||||
"Master Mono Playback Switch",
|
||||
"Master Mono Playback Volume",
|
||||
"Master Playback Switch",
|
||||
"Master Playback Volume",
|
||||
"PCM Out Path & Mute",
|
||||
@ -1830,10 +1828,16 @@ int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
|
||||
"Capture Switch",
|
||||
"Capture Volume",
|
||||
"Mic Select",
|
||||
"Headphone Playback Switch",
|
||||
"Headphone Playback Volume",
|
||||
"3D Control - Center",
|
||||
"3D Control - Depth",
|
||||
"3D Control - Switch",
|
||||
"Video Playback Switch",
|
||||
"Video Playback Volume",
|
||||
"Mic Playback Switch",
|
||||
"Mic Playback Volume",
|
||||
"External Amplifier",
|
||||
NULL
|
||||
};
|
||||
static char *audigy_rename_ctls[] = {
|
||||
@ -1842,6 +1846,8 @@ int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
|
||||
/* "Wave Capture Volume", "PCM Capture Volume", */
|
||||
"Wave Master Playback Volume", "Master Playback Volume",
|
||||
"AMic Playback Volume", "Mic Playback Volume",
|
||||
"Master Mono Playback Switch", "Phone Output Playback Switch",
|
||||
"Master Mono Playback Volume", "Phone Output Playback Volume",
|
||||
NULL
|
||||
};
|
||||
static char *audigy_rename_ctls_i2c_adc[] = {
|
||||
@ -1867,8 +1873,6 @@ int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
|
||||
* the Philips ADC for 24bit capture */
|
||||
"PCM Playback Switch",
|
||||
"PCM Playback Volume",
|
||||
"Master Mono Playback Switch",
|
||||
"Master Mono Playback Volume",
|
||||
"Capture Source",
|
||||
"Capture Switch",
|
||||
"Capture Volume",
|
||||
@ -1900,7 +1904,8 @@ int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
|
||||
"Aux Playback Volume", "Aux Capture Volume",
|
||||
"Video Playback Switch", "Video Capture Switch",
|
||||
"Video Playback Volume", "Video Capture Volume",
|
||||
|
||||
"Master Mono Playback Switch", "Phone Output Playback Switch",
|
||||
"Master Mono Playback Volume", "Phone Output Playback Volume",
|
||||
NULL
|
||||
};
|
||||
|
||||
@ -1935,6 +1940,9 @@ int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
|
||||
snd_ac97_write_cache(emu->ac97, AC97_MASTER, 0x0000);
|
||||
/* set capture source to mic */
|
||||
snd_ac97_write_cache(emu->ac97, AC97_REC_SEL, 0x0000);
|
||||
/* set mono output (TAD) to mic */
|
||||
snd_ac97_update_bits(emu->ac97, AC97_GENERAL_PURPOSE,
|
||||
0x0200, 0x0200);
|
||||
if (emu->card_capabilities->adc_1361t)
|
||||
c = audigy_remove_ctls_1361t_adc;
|
||||
else
|
||||
@ -1996,11 +2004,6 @@ int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
|
||||
rename_ctl(card, "Analog Mix Capture Volume", "Line2 Capture Volume");
|
||||
rename_ctl(card, "Aux2 Capture Volume", "Line3 Capture Volume");
|
||||
rename_ctl(card, "Mic Capture Volume", "Unknown1 Capture Volume");
|
||||
remove_ctl(card, "Headphone Playback Switch");
|
||||
remove_ctl(card, "Headphone Playback Volume");
|
||||
remove_ctl(card, "3D Control - Center");
|
||||
remove_ctl(card, "3D Control - Depth");
|
||||
remove_ctl(card, "3D Control - Switch");
|
||||
}
|
||||
if ((kctl = emu->ctl_send_routing = snd_ctl_new1(&snd_emu10k1_send_routing_control, emu)) == NULL)
|
||||
return -ENOMEM;
|
||||
|
@ -887,11 +887,32 @@ EXPORT_SYMBOL_GPL(snd_hda_apply_fixup);
|
||||
static bool pin_config_match(struct hda_codec *codec,
|
||||
const struct hda_pintbl *pins)
|
||||
{
|
||||
for (; pins->nid; pins++) {
|
||||
u32 def_conf = snd_hda_codec_get_pincfg(codec, pins->nid);
|
||||
if (pins->val != def_conf)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < codec->init_pins.used; i++) {
|
||||
struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
|
||||
hda_nid_t nid = pin->nid;
|
||||
u32 cfg = pin->cfg;
|
||||
const struct hda_pintbl *t_pins;
|
||||
int found;
|
||||
|
||||
t_pins = pins;
|
||||
found = 0;
|
||||
for (; t_pins->nid; t_pins++) {
|
||||
if (t_pins->nid == nid) {
|
||||
found = 1;
|
||||
if (t_pins->val == cfg)
|
||||
break;
|
||||
else if ((cfg & 0xf0000000) == 0x40000000 && (t_pins->val & 0xf0000000) == 0x40000000)
|
||||
break;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!found && (cfg & 0xf0000000) != 0x40000000)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -53,76 +53,6 @@
|
||||
#define codec_has_clkstop(codec) \
|
||||
((codec)->core.power_caps & AC_PWRST_CLKSTOP)
|
||||
|
||||
/**
|
||||
* snd_hda_get_jack_location - Give a location string of the jack
|
||||
* @cfg: pin default config value
|
||||
*
|
||||
* Parse the pin default config value and returns the string of the
|
||||
* jack location, e.g. "Rear", "Front", etc.
|
||||
*/
|
||||
const char *snd_hda_get_jack_location(u32 cfg)
|
||||
{
|
||||
static char *bases[7] = {
|
||||
"N/A", "Rear", "Front", "Left", "Right", "Top", "Bottom",
|
||||
};
|
||||
static unsigned char specials_idx[] = {
|
||||
0x07, 0x08,
|
||||
0x17, 0x18, 0x19,
|
||||
0x37, 0x38
|
||||
};
|
||||
static char *specials[] = {
|
||||
"Rear Panel", "Drive Bar",
|
||||
"Riser", "HDMI", "ATAPI",
|
||||
"Mobile-In", "Mobile-Out"
|
||||
};
|
||||
int i;
|
||||
cfg = (cfg & AC_DEFCFG_LOCATION) >> AC_DEFCFG_LOCATION_SHIFT;
|
||||
if ((cfg & 0x0f) < 7)
|
||||
return bases[cfg & 0x0f];
|
||||
for (i = 0; i < ARRAY_SIZE(specials_idx); i++) {
|
||||
if (cfg == specials_idx[i])
|
||||
return specials[i];
|
||||
}
|
||||
return "UNKNOWN";
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hda_get_jack_location);
|
||||
|
||||
/**
|
||||
* snd_hda_get_jack_connectivity - Give a connectivity string of the jack
|
||||
* @cfg: pin default config value
|
||||
*
|
||||
* Parse the pin default config value and returns the string of the
|
||||
* jack connectivity, i.e. external or internal connection.
|
||||
*/
|
||||
const char *snd_hda_get_jack_connectivity(u32 cfg)
|
||||
{
|
||||
static char *jack_locations[4] = { "Ext", "Int", "Sep", "Oth" };
|
||||
|
||||
return jack_locations[(cfg >> (AC_DEFCFG_LOCATION_SHIFT + 4)) & 3];
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hda_get_jack_connectivity);
|
||||
|
||||
/**
|
||||
* snd_hda_get_jack_type - Give a type string of the jack
|
||||
* @cfg: pin default config value
|
||||
*
|
||||
* Parse the pin default config value and returns the string of the
|
||||
* jack type, i.e. the purpose of the jack, such as Line-Out or CD.
|
||||
*/
|
||||
const char *snd_hda_get_jack_type(u32 cfg)
|
||||
{
|
||||
static char *jack_types[16] = {
|
||||
"Line Out", "Speaker", "HP Out", "CD",
|
||||
"SPDIF Out", "Digital Out", "Modem Line", "Modem Hand",
|
||||
"Line In", "Aux", "Mic", "Telephony",
|
||||
"SPDIF In", "Digital In", "Reserved", "Other"
|
||||
};
|
||||
|
||||
return jack_types[(cfg & AC_DEFCFG_DEVICE)
|
||||
>> AC_DEFCFG_DEVICE_SHIFT];
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hda_get_jack_type);
|
||||
|
||||
/*
|
||||
* Send and receive a verb - passed to exec_verb override for hdac_device
|
||||
*/
|
||||
@ -975,7 +905,7 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
|
||||
if (codec->bus->modelname) {
|
||||
codec->modelname = kstrdup(codec->bus->modelname, GFP_KERNEL);
|
||||
if (!codec->modelname) {
|
||||
err = -ENODEV;
|
||||
err = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
@ -1025,7 +955,7 @@ int snd_hda_codec_update_widgets(struct hda_codec *codec)
|
||||
hda_nid_t fg;
|
||||
int err;
|
||||
|
||||
err = snd_hdac_refresh_widgets(&codec->core);
|
||||
err = snd_hdac_refresh_widget_sysfs(&codec->core);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
@ -3172,8 +3102,7 @@ static int add_std_chmaps(struct hda_codec *codec)
|
||||
struct snd_pcm_chmap *chmap;
|
||||
const struct snd_pcm_chmap_elem *elem;
|
||||
|
||||
if (!pcm || !pcm->pcm || pcm->own_chmap ||
|
||||
!hinfo->substreams)
|
||||
if (!pcm->pcm || pcm->own_chmap || !hinfo->substreams)
|
||||
continue;
|
||||
elem = hinfo->chmap ? hinfo->chmap : snd_pcm_std_chmaps;
|
||||
err = snd_pcm_add_chmap_ctls(pcm->pcm, str, elem,
|
||||
|
@ -468,13 +468,6 @@ int hda_call_check_power_status(struct hda_codec *codec, hda_nid_t nid)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* get widget information
|
||||
*/
|
||||
const char *snd_hda_get_jack_connectivity(u32 cfg);
|
||||
const char *snd_hda_get_jack_type(u32 cfg);
|
||||
const char *snd_hda_get_jack_location(u32 cfg);
|
||||
|
||||
/*
|
||||
* power saving
|
||||
*/
|
||||
|
@ -42,7 +42,7 @@ enum cea_edid_versions {
|
||||
CEA_EDID_VER_RESERVED = 4,
|
||||
};
|
||||
|
||||
static char *cea_speaker_allocation_names[] = {
|
||||
static const char * const cea_speaker_allocation_names[] = {
|
||||
/* 0 */ "FL/FR",
|
||||
/* 1 */ "LFE",
|
||||
/* 2 */ "FC",
|
||||
@ -56,7 +56,7 @@ static char *cea_speaker_allocation_names[] = {
|
||||
/* 10 */ "FCH",
|
||||
};
|
||||
|
||||
static char *eld_connection_type_names[4] = {
|
||||
static const char * const eld_connection_type_names[4] = {
|
||||
"HDMI",
|
||||
"DisplayPort",
|
||||
"2-reserved",
|
||||
@ -94,7 +94,7 @@ enum cea_audio_coding_xtypes {
|
||||
AUDIO_CODING_XTYPE_FIRST_RESERVED = 4,
|
||||
};
|
||||
|
||||
static char *cea_audio_coding_type_names[] = {
|
||||
static const char * const cea_audio_coding_type_names[] = {
|
||||
/* 0 */ "undefined",
|
||||
/* 1 */ "LPCM",
|
||||
/* 2 */ "AC-3",
|
||||
@ -482,14 +482,14 @@ void snd_hdmi_print_eld_info(struct hdmi_eld *eld,
|
||||
struct parsed_hdmi_eld *e = &eld->info;
|
||||
char buf[SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE];
|
||||
int i;
|
||||
static char *eld_version_names[32] = {
|
||||
static const char * const eld_version_names[32] = {
|
||||
"reserved",
|
||||
"reserved",
|
||||
"CEA-861D or below",
|
||||
[3 ... 30] = "reserved",
|
||||
[31] = "partial"
|
||||
};
|
||||
static char *cea_edid_version_names[8] = {
|
||||
static const char * const cea_edid_version_names[8] = {
|
||||
"no CEA EDID Timing Extension block present",
|
||||
"CEA-861",
|
||||
"CEA-861-A",
|
||||
|
@ -36,24 +36,9 @@ MODULE_PARM_DESC(dump_coef, "Dump processing coefficients in codec proc file (-1
|
||||
#define param_read(codec, nid, parm) \
|
||||
snd_hdac_read_parm_uncached(&(codec)->core, nid, parm)
|
||||
|
||||
static char *bits_names(unsigned int bits, char *names[], int size)
|
||||
{
|
||||
int i, n;
|
||||
static char buf[128];
|
||||
|
||||
for (i = 0, n = 0; i < size; i++) {
|
||||
if (bits & (1U<<i) && names[i])
|
||||
n += snprintf(buf + n, sizeof(buf) - n, " %s",
|
||||
names[i]);
|
||||
}
|
||||
buf[n] = '\0';
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
static const char *get_wid_type_name(unsigned int wid_value)
|
||||
{
|
||||
static char *names[16] = {
|
||||
static const char * const names[16] = {
|
||||
[AC_WID_AUD_OUT] = "Audio Output",
|
||||
[AC_WID_AUD_IN] = "Audio Input",
|
||||
[AC_WID_AUD_MIX] = "Audio Mixer",
|
||||
@ -241,7 +226,7 @@ static void print_pcm_caps(struct snd_info_buffer *buffer,
|
||||
|
||||
static const char *get_jack_connection(u32 cfg)
|
||||
{
|
||||
static char *names[16] = {
|
||||
static const char * const names[16] = {
|
||||
"Unknown", "1/8", "1/4", "ATAPI",
|
||||
"RCA", "Optical","Digital", "Analog",
|
||||
"DIN", "XLR", "RJ11", "Comb",
|
||||
@ -256,7 +241,7 @@ static const char *get_jack_connection(u32 cfg)
|
||||
|
||||
static const char *get_jack_color(u32 cfg)
|
||||
{
|
||||
static char *names[16] = {
|
||||
static const char * const names[16] = {
|
||||
"Unknown", "Black", "Grey", "Blue",
|
||||
"Green", "Red", "Orange", "Yellow",
|
||||
"Purple", "Pink", NULL, NULL,
|
||||
@ -269,11 +254,74 @@ static const char *get_jack_color(u32 cfg)
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse the pin default config value and returns the string of the
|
||||
* jack location, e.g. "Rear", "Front", etc.
|
||||
*/
|
||||
static const char *get_jack_location(u32 cfg)
|
||||
{
|
||||
static const char * const bases[7] = {
|
||||
"N/A", "Rear", "Front", "Left", "Right", "Top", "Bottom",
|
||||
};
|
||||
static const unsigned char specials_idx[] = {
|
||||
0x07, 0x08,
|
||||
0x17, 0x18, 0x19,
|
||||
0x37, 0x38
|
||||
};
|
||||
static const char * const specials[] = {
|
||||
"Rear Panel", "Drive Bar",
|
||||
"Riser", "HDMI", "ATAPI",
|
||||
"Mobile-In", "Mobile-Out"
|
||||
};
|
||||
int i;
|
||||
|
||||
cfg = (cfg & AC_DEFCFG_LOCATION) >> AC_DEFCFG_LOCATION_SHIFT;
|
||||
if ((cfg & 0x0f) < 7)
|
||||
return bases[cfg & 0x0f];
|
||||
for (i = 0; i < ARRAY_SIZE(specials_idx); i++) {
|
||||
if (cfg == specials_idx[i])
|
||||
return specials[i];
|
||||
}
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse the pin default config value and returns the string of the
|
||||
* jack connectivity, i.e. external or internal connection.
|
||||
*/
|
||||
static const char *get_jack_connectivity(u32 cfg)
|
||||
{
|
||||
static const char * const jack_locations[4] = {
|
||||
"Ext", "Int", "Sep", "Oth"
|
||||
};
|
||||
|
||||
return jack_locations[(cfg >> (AC_DEFCFG_LOCATION_SHIFT + 4)) & 3];
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse the pin default config value and returns the string of the
|
||||
* jack type, i.e. the purpose of the jack, such as Line-Out or CD.
|
||||
*/
|
||||
static const char *get_jack_type(u32 cfg)
|
||||
{
|
||||
static const char * const jack_types[16] = {
|
||||
"Line Out", "Speaker", "HP Out", "CD",
|
||||
"SPDIF Out", "Digital Out", "Modem Line", "Modem Hand",
|
||||
"Line In", "Aux", "Mic", "Telephony",
|
||||
"SPDIF In", "Digital In", "Reserved", "Other"
|
||||
};
|
||||
|
||||
return jack_types[(cfg & AC_DEFCFG_DEVICE)
|
||||
>> AC_DEFCFG_DEVICE_SHIFT];
|
||||
}
|
||||
|
||||
static void print_pin_caps(struct snd_info_buffer *buffer,
|
||||
struct hda_codec *codec, hda_nid_t nid,
|
||||
int *supports_vref)
|
||||
{
|
||||
static char *jack_conns[4] = { "Jack", "N/A", "Fixed", "Both" };
|
||||
static const char * const jack_conns[4] = {
|
||||
"Jack", "N/A", "Fixed", "Both"
|
||||
};
|
||||
unsigned int caps, val;
|
||||
|
||||
caps = param_read(codec, nid, AC_PAR_PIN_CAP);
|
||||
@ -340,9 +388,9 @@ static void print_pin_caps(struct snd_info_buffer *buffer,
|
||||
caps = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONFIG_DEFAULT, 0);
|
||||
snd_iprintf(buffer, " Pin Default 0x%08x: [%s] %s at %s %s\n", caps,
|
||||
jack_conns[(caps & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT],
|
||||
snd_hda_get_jack_type(caps),
|
||||
snd_hda_get_jack_connectivity(caps),
|
||||
snd_hda_get_jack_location(caps));
|
||||
get_jack_type(caps),
|
||||
get_jack_connectivity(caps),
|
||||
get_jack_location(caps));
|
||||
snd_iprintf(buffer, " Conn = %s, Color = %s\n",
|
||||
get_jack_connection(caps),
|
||||
get_jack_color(caps));
|
||||
@ -478,7 +526,7 @@ static const char *get_pwr_state(u32 state)
|
||||
static void print_power_state(struct snd_info_buffer *buffer,
|
||||
struct hda_codec *codec, hda_nid_t nid)
|
||||
{
|
||||
static char *names[] = {
|
||||
static const char * const names[] = {
|
||||
[ilog2(AC_PWRST_D0SUP)] = "D0",
|
||||
[ilog2(AC_PWRST_D1SUP)] = "D1",
|
||||
[ilog2(AC_PWRST_D2SUP)] = "D2",
|
||||
@ -492,9 +540,16 @@ static void print_power_state(struct snd_info_buffer *buffer,
|
||||
int sup = param_read(codec, nid, AC_PAR_POWER_STATE);
|
||||
int pwr = snd_hda_codec_read(codec, nid, 0,
|
||||
AC_VERB_GET_POWER_STATE, 0);
|
||||
if (sup != -1)
|
||||
snd_iprintf(buffer, " Power states: %s\n",
|
||||
bits_names(sup, names, ARRAY_SIZE(names)));
|
||||
if (sup != -1) {
|
||||
int i;
|
||||
|
||||
snd_iprintf(buffer, " Power states: ");
|
||||
for (i = 0; i < ARRAY_SIZE(names); i++) {
|
||||
if (sup & (1U << i))
|
||||
snd_iprintf(buffer, " %s", names[i]);
|
||||
}
|
||||
snd_iprintf(buffer, "\n");
|
||||
}
|
||||
|
||||
snd_iprintf(buffer, " Power: setting=%s, actual=%s",
|
||||
get_pwr_state(pwr & AC_PWRST_SETTING),
|
||||
|
@ -763,6 +763,20 @@ enum {
|
||||
QUIRK_ALIENWARE,
|
||||
};
|
||||
|
||||
static const struct hda_pintbl alienware_pincfgs[] = {
|
||||
{ 0x0b, 0x90170110 }, /* Builtin Speaker */
|
||||
{ 0x0c, 0x411111f0 }, /* N/A */
|
||||
{ 0x0d, 0x411111f0 }, /* N/A */
|
||||
{ 0x0e, 0x411111f0 }, /* N/A */
|
||||
{ 0x0f, 0x0321101f }, /* HP */
|
||||
{ 0x10, 0x411111f0 }, /* Headset? disabled for now */
|
||||
{ 0x11, 0x03a11021 }, /* Mic */
|
||||
{ 0x12, 0xd5a30140 }, /* Builtin Mic */
|
||||
{ 0x13, 0x411111f0 }, /* N/A */
|
||||
{ 0x18, 0x411111f0 }, /* N/A */
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk ca0132_quirks[] = {
|
||||
SND_PCI_QUIRK(0x1028, 0x0685, "Alienware 15", QUIRK_ALIENWARE),
|
||||
{}
|
||||
@ -3147,7 +3161,7 @@ static int ca0132_select_out(struct hda_codec *codec)
|
||||
auto_jack = spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
|
||||
|
||||
if (auto_jack)
|
||||
jack_present = snd_hda_jack_detect(codec, spec->out_pins[1]);
|
||||
jack_present = snd_hda_jack_detect(codec, spec->unsol_tag_hp);
|
||||
else
|
||||
jack_present =
|
||||
spec->vnode_lswitch[VNID_HP_SEL - VNODE_START_NID];
|
||||
@ -3309,7 +3323,7 @@ static int ca0132_select_mic(struct hda_codec *codec)
|
||||
auto_jack = spec->vnode_lswitch[VNID_AMIC1_ASEL - VNODE_START_NID];
|
||||
|
||||
if (auto_jack)
|
||||
jack_present = snd_hda_jack_detect(codec, spec->input_pins[0]);
|
||||
jack_present = snd_hda_jack_detect(codec, spec->unsol_tag_amic1);
|
||||
else
|
||||
jack_present =
|
||||
spec->vnode_lswitch[VNID_AMIC1_SEL - VNODE_START_NID];
|
||||
@ -4617,37 +4631,54 @@ static void ca0132_config(struct hda_codec *codec)
|
||||
spec->multiout.num_dacs = 3;
|
||||
spec->multiout.max_channels = 2;
|
||||
|
||||
spec->num_outputs = 2;
|
||||
spec->out_pins[0] = 0x0b; /* speaker out */
|
||||
if (spec->quirk == QUIRK_ALIENWARE) {
|
||||
codec_dbg(codec, "ca0132_config: QUIRK_ALIENWARE applied.\n");
|
||||
snd_hda_apply_pincfgs(codec, alienware_pincfgs);
|
||||
|
||||
spec->num_outputs = 2;
|
||||
spec->out_pins[0] = 0x0b; /* speaker out */
|
||||
spec->out_pins[1] = 0x0f;
|
||||
} else{
|
||||
spec->shared_out_nid = 0x2;
|
||||
spec->unsol_tag_hp = 0x0f;
|
||||
|
||||
spec->adcs[0] = 0x7; /* digital mic / analog mic1 */
|
||||
spec->adcs[1] = 0x8; /* analog mic2 */
|
||||
spec->adcs[2] = 0xa; /* what u hear */
|
||||
|
||||
spec->num_inputs = 3;
|
||||
spec->input_pins[0] = 0x12;
|
||||
spec->input_pins[1] = 0x11;
|
||||
spec->input_pins[2] = 0x13;
|
||||
spec->shared_mic_nid = 0x7;
|
||||
spec->unsol_tag_amic1 = 0x11;
|
||||
} else {
|
||||
spec->num_outputs = 2;
|
||||
spec->out_pins[0] = 0x0b; /* speaker out */
|
||||
spec->out_pins[1] = 0x10; /* headphone out */
|
||||
spec->shared_out_nid = 0x2;
|
||||
spec->unsol_tag_hp = spec->out_pins[1];
|
||||
|
||||
spec->adcs[0] = 0x7; /* digital mic / analog mic1 */
|
||||
spec->adcs[1] = 0x8; /* analog mic2 */
|
||||
spec->adcs[2] = 0xa; /* what u hear */
|
||||
|
||||
spec->num_inputs = 3;
|
||||
spec->input_pins[0] = 0x12;
|
||||
spec->input_pins[1] = 0x11;
|
||||
spec->input_pins[2] = 0x13;
|
||||
spec->shared_mic_nid = 0x7;
|
||||
spec->unsol_tag_amic1 = spec->input_pins[0];
|
||||
|
||||
/* SPDIF I/O */
|
||||
spec->dig_out = 0x05;
|
||||
spec->multiout.dig_out_nid = spec->dig_out;
|
||||
cfg->dig_out_pins[0] = 0x0c;
|
||||
cfg->dig_outs = 1;
|
||||
cfg->dig_out_type[0] = HDA_PCM_TYPE_SPDIF;
|
||||
spec->dig_in = 0x09;
|
||||
cfg->dig_in_pin = 0x0e;
|
||||
cfg->dig_in_type = HDA_PCM_TYPE_SPDIF;
|
||||
}
|
||||
spec->shared_out_nid = 0x2;
|
||||
spec->unsol_tag_hp = spec->out_pins[1];
|
||||
|
||||
spec->adcs[0] = 0x7; /* digital mic / analog mic1 */
|
||||
spec->adcs[1] = 0x8; /* analog mic2 */
|
||||
spec->adcs[2] = 0xa; /* what u hear */
|
||||
|
||||
spec->num_inputs = 3;
|
||||
spec->input_pins[0] = 0x12;
|
||||
spec->input_pins[1] = 0x11;
|
||||
spec->input_pins[2] = 0x13;
|
||||
spec->shared_mic_nid = 0x7;
|
||||
spec->unsol_tag_amic1 = spec->input_pins[0];
|
||||
|
||||
/* SPDIF I/O */
|
||||
spec->dig_out = 0x05;
|
||||
spec->multiout.dig_out_nid = spec->dig_out;
|
||||
cfg->dig_out_pins[0] = 0x0c;
|
||||
cfg->dig_outs = 1;
|
||||
cfg->dig_out_type[0] = HDA_PCM_TYPE_SPDIF;
|
||||
spec->dig_in = 0x09;
|
||||
cfg->dig_in_pin = 0x0e;
|
||||
cfg->dig_in_type = HDA_PCM_TYPE_SPDIF;
|
||||
}
|
||||
|
||||
static int ca0132_prepare_verbs(struct hda_codec *codec)
|
||||
|
@ -37,6 +37,8 @@
|
||||
#include <sound/jack.h>
|
||||
#include <sound/asoundef.h>
|
||||
#include <sound/tlv.h>
|
||||
#include <sound/hdaudio.h>
|
||||
#include <sound/hda_i915.h>
|
||||
#include "hda_codec.h"
|
||||
#include "hda_local.h"
|
||||
#include "hda_jack.h"
|
||||
@ -144,6 +146,9 @@ struct hdmi_spec {
|
||||
*/
|
||||
struct hda_multi_out multiout;
|
||||
struct hda_pcm_stream pcm_playback;
|
||||
|
||||
/* i915/powerwell (Haswell+/Valleyview+) specific */
|
||||
struct i915_audio_component_audio_ops i915_audio_ops;
|
||||
};
|
||||
|
||||
|
||||
@ -2191,6 +2196,9 @@ static void generic_hdmi_free(struct hda_codec *codec)
|
||||
struct hdmi_spec *spec = codec->spec;
|
||||
int pin_idx;
|
||||
|
||||
if (is_haswell_plus(codec) || is_valleyview_plus(codec))
|
||||
snd_hdac_i915_register_notifier(NULL);
|
||||
|
||||
for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
|
||||
struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx);
|
||||
|
||||
@ -2316,6 +2324,14 @@ static void haswell_set_power_state(struct hda_codec *codec, hda_nid_t fg,
|
||||
snd_hda_codec_set_power_to_all(codec, fg, power_state);
|
||||
}
|
||||
|
||||
static void intel_pin_eld_notify(void *audio_ptr, int port)
|
||||
{
|
||||
struct hda_codec *codec = audio_ptr;
|
||||
int pin_nid = port + 0x04;
|
||||
|
||||
check_presence_and_report(codec, pin_nid);
|
||||
}
|
||||
|
||||
static int patch_generic_hdmi(struct hda_codec *codec)
|
||||
{
|
||||
struct hdmi_spec *spec;
|
||||
@ -2342,8 +2358,12 @@ static int patch_generic_hdmi(struct hda_codec *codec)
|
||||
if (is_valleyview_plus(codec) || is_skylake(codec))
|
||||
codec->core.link_power_control = 1;
|
||||
|
||||
if (is_haswell_plus(codec) || is_valleyview_plus(codec))
|
||||
if (is_haswell_plus(codec) || is_valleyview_plus(codec)) {
|
||||
codec->depop_delay = 0;
|
||||
spec->i915_audio_ops.audio_ptr = codec;
|
||||
spec->i915_audio_ops.pin_eld_notify = intel_pin_eld_notify;
|
||||
snd_hdac_i915_register_notifier(&spec->i915_audio_ops);
|
||||
}
|
||||
|
||||
if (hdmi_parse_codec(codec) < 0) {
|
||||
codec->spec = NULL;
|
||||
|
@ -5389,400 +5389,202 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
|
||||
{}
|
||||
};
|
||||
|
||||
#define ALC255_STANDARD_PINS \
|
||||
{0x18, 0x411111f0}, \
|
||||
{0x19, 0x411111f0}, \
|
||||
{0x1a, 0x411111f0}, \
|
||||
{0x1b, 0x411111f0}, \
|
||||
{0x1e, 0x411111f0}
|
||||
|
||||
#define ALC256_STANDARD_PINS \
|
||||
{0x12, 0x90a60140}, \
|
||||
{0x14, 0x90170110}, \
|
||||
{0x19, 0x411111f0}, \
|
||||
{0x1a, 0x411111f0}, \
|
||||
{0x1b, 0x411111f0}, \
|
||||
{0x21, 0x02211020}
|
||||
|
||||
#define ALC282_STANDARD_PINS \
|
||||
{0x14, 0x90170110}, \
|
||||
{0x18, 0x411111f0}, \
|
||||
{0x1a, 0x411111f0}, \
|
||||
{0x1b, 0x411111f0}, \
|
||||
{0x1e, 0x411111f0}
|
||||
|
||||
#define ALC288_STANDARD_PINS \
|
||||
{0x17, 0x411111f0}, \
|
||||
{0x18, 0x411111f0}, \
|
||||
{0x19, 0x411111f0}, \
|
||||
{0x1a, 0x411111f0}, \
|
||||
{0x1e, 0x411111f0}
|
||||
{0x14, 0x90170110}
|
||||
|
||||
#define ALC290_STANDARD_PINS \
|
||||
{0x12, 0x99a30130}, \
|
||||
{0x13, 0x40000000}, \
|
||||
{0x16, 0x411111f0}, \
|
||||
{0x17, 0x411111f0}, \
|
||||
{0x19, 0x411111f0}, \
|
||||
{0x1b, 0x411111f0}, \
|
||||
{0x1e, 0x411111f0}
|
||||
{0x12, 0x99a30130}
|
||||
|
||||
#define ALC292_STANDARD_PINS \
|
||||
{0x14, 0x90170110}, \
|
||||
{0x15, 0x0221401f}, \
|
||||
{0x1a, 0x411111f0}, \
|
||||
{0x1b, 0x411111f0}, \
|
||||
{0x1d, 0x40700001}
|
||||
{0x15, 0x0221401f}
|
||||
|
||||
#define ALC298_STANDARD_PINS \
|
||||
{0x18, 0x411111f0}, \
|
||||
{0x19, 0x411111f0}, \
|
||||
{0x1a, 0x411111f0}, \
|
||||
{0x1e, 0x411111f0}, \
|
||||
{0x1f, 0x411111f0}
|
||||
{0x12, 0x90a60130}, \
|
||||
{0x21, 0x03211020}
|
||||
|
||||
static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
|
||||
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
|
||||
ALC255_STANDARD_PINS,
|
||||
{0x12, 0x40300000},
|
||||
{0x14, 0x90170110},
|
||||
{0x17, 0x411111f0},
|
||||
{0x1d, 0x40538029},
|
||||
{0x21, 0x02211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC255_STANDARD_PINS,
|
||||
{0x12, 0x90a60140},
|
||||
{0x14, 0x90170110},
|
||||
{0x17, 0x40000000},
|
||||
{0x1d, 0x40700001},
|
||||
{0x21, 0x02211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC255_STANDARD_PINS,
|
||||
{0x12, 0x90a60160},
|
||||
{0x14, 0x90170120},
|
||||
{0x17, 0x40000000},
|
||||
{0x1d, 0x40700001},
|
||||
{0x21, 0x02211030}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
{0x12, 0x40000000},
|
||||
{0x14, 0x90170130},
|
||||
{0x17, 0x411111f0},
|
||||
{0x18, 0x411111f0},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1a, 0x411111f0},
|
||||
{0x1b, 0x01014020},
|
||||
{0x1d, 0x4054c029},
|
||||
{0x1e, 0x411111f0},
|
||||
{0x21, 0x0221103f}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
{0x12, 0x40000000},
|
||||
{0x14, 0x90170150},
|
||||
{0x17, 0x411111f0},
|
||||
{0x18, 0x411111f0},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1a, 0x411111f0},
|
||||
{0x1b, 0x02011020},
|
||||
{0x1d, 0x4054c029},
|
||||
{0x1e, 0x411111f0},
|
||||
{0x21, 0x0221105f}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
{0x12, 0x40000000},
|
||||
{0x14, 0x90170110},
|
||||
{0x17, 0x411111f0},
|
||||
{0x18, 0x411111f0},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1a, 0x411111f0},
|
||||
{0x1b, 0x01014020},
|
||||
{0x1d, 0x4054c029},
|
||||
{0x1e, 0x411111f0},
|
||||
{0x21, 0x0221101f}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
{0x12, 0x90a60160},
|
||||
{0x14, 0x90170120},
|
||||
{0x17, 0x90170140},
|
||||
{0x18, 0x40000000},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1a, 0x411111f0},
|
||||
{0x1b, 0x411111f0},
|
||||
{0x1d, 0x41163b05},
|
||||
{0x1e, 0x411111f0},
|
||||
{0x21, 0x0321102f}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC255_STANDARD_PINS,
|
||||
{0x12, 0x90a60160},
|
||||
{0x14, 0x90170130},
|
||||
{0x17, 0x40000000},
|
||||
{0x1d, 0x40700001},
|
||||
{0x21, 0x02211040}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC255_STANDARD_PINS,
|
||||
{0x12, 0x90a60160},
|
||||
{0x14, 0x90170140},
|
||||
{0x17, 0x40000000},
|
||||
{0x1d, 0x40700001},
|
||||
{0x21, 0x02211050}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC255_STANDARD_PINS,
|
||||
{0x12, 0x90a60170},
|
||||
{0x14, 0x90170120},
|
||||
{0x17, 0x40000000},
|
||||
{0x1d, 0x40700001},
|
||||
{0x21, 0x02211030}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC255_STANDARD_PINS,
|
||||
{0x12, 0x90a60170},
|
||||
{0x14, 0x90170130},
|
||||
{0x17, 0x40000000},
|
||||
{0x1d, 0x40700001},
|
||||
{0x21, 0x02211040}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC255_STANDARD_PINS,
|
||||
{0x12, 0x90a60170},
|
||||
{0x14, 0x90170140},
|
||||
{0x17, 0x40000000},
|
||||
{0x1d, 0x40700001},
|
||||
{0x21, 0x02211050}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC255_STANDARD_PINS,
|
||||
{0x12, 0x90a60180},
|
||||
{0x14, 0x90170130},
|
||||
{0x17, 0x40000000},
|
||||
{0x1d, 0x40700001},
|
||||
{0x21, 0x02211040}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC255_STANDARD_PINS,
|
||||
{0x12, 0x90a60160},
|
||||
{0x14, 0x90170120},
|
||||
{0x17, 0x40000000},
|
||||
{0x1d, 0x40700001},
|
||||
{0x21, 0x02211030}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC256_STANDARD_PINS,
|
||||
{0x13, 0x40000000},
|
||||
{0x1d, 0x40700001},
|
||||
{0x1e, 0x411111f0}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC256_STANDARD_PINS,
|
||||
{0x13, 0x411111f0},
|
||||
{0x1d, 0x40700001},
|
||||
{0x1e, 0x411111f0}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC256_STANDARD_PINS,
|
||||
{0x13, 0x411111f0},
|
||||
{0x1d, 0x4077992d},
|
||||
{0x1e, 0x411111ff}),
|
||||
ALC256_STANDARD_PINS),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
|
||||
{0x12, 0x90a60130},
|
||||
{0x13, 0x40000000},
|
||||
{0x14, 0x90170110},
|
||||
{0x15, 0x0421101f},
|
||||
{0x16, 0x411111f0},
|
||||
{0x17, 0x411111f0},
|
||||
{0x18, 0x411111f0},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1a, 0x04a11020},
|
||||
{0x1b, 0x411111f0},
|
||||
{0x1d, 0x40748605},
|
||||
{0x1e, 0x411111f0}),
|
||||
{0x1a, 0x04a11020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
|
||||
{0x12, 0x90a60140},
|
||||
{0x13, 0x40000000},
|
||||
{0x14, 0x90170110},
|
||||
{0x15, 0x0421101f},
|
||||
{0x16, 0x411111f0},
|
||||
{0x17, 0x411111f0},
|
||||
{0x18, 0x02811030},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1a, 0x04a1103f},
|
||||
{0x1b, 0x02011020},
|
||||
{0x1d, 0x40700001},
|
||||
{0x1e, 0x411111f0}),
|
||||
{0x1b, 0x02011020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
|
||||
ALC282_STANDARD_PINS,
|
||||
{0x12, 0x99a30130},
|
||||
{0x17, 0x40000000},
|
||||
{0x19, 0x03a11020},
|
||||
{0x1d, 0x40f41905},
|
||||
{0x21, 0x0321101f}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
|
||||
ALC282_STANDARD_PINS,
|
||||
{0x12, 0x99a30130},
|
||||
{0x17, 0x40020008},
|
||||
{0x19, 0x03a11020},
|
||||
{0x1d, 0x40e00001},
|
||||
{0x21, 0x03211040}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
|
||||
ALC282_STANDARD_PINS,
|
||||
{0x12, 0x99a30130},
|
||||
{0x17, 0x40000000},
|
||||
{0x19, 0x03a11030},
|
||||
{0x1d, 0x40e00001},
|
||||
{0x21, 0x03211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
|
||||
ALC282_STANDARD_PINS,
|
||||
{0x12, 0x99a30130},
|
||||
{0x17, 0x40000000},
|
||||
{0x19, 0x03a11030},
|
||||
{0x1d, 0x40f00001},
|
||||
{0x21, 0x03211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
|
||||
ALC282_STANDARD_PINS,
|
||||
{0x12, 0x99a30130},
|
||||
{0x17, 0x40000000},
|
||||
{0x19, 0x04a11020},
|
||||
{0x1d, 0x40f00001},
|
||||
{0x21, 0x0421101f}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
|
||||
ALC282_STANDARD_PINS,
|
||||
{0x12, 0x99a30130},
|
||||
{0x17, 0x40000000},
|
||||
{0x19, 0x03a11030},
|
||||
{0x1d, 0x40f00001},
|
||||
{0x21, 0x04211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
|
||||
ALC282_STANDARD_PINS,
|
||||
{0x12, 0x90a60140},
|
||||
{0x17, 0x40000000},
|
||||
{0x19, 0x04a11030},
|
||||
{0x1d, 0x40f00001},
|
||||
{0x21, 0x04211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC282_STANDARD_PINS,
|
||||
{0x12, 0x90a60130},
|
||||
{0x17, 0x40020008},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1d, 0x40e00001},
|
||||
{0x21, 0x0321101f}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
{0x12, 0x90a60160},
|
||||
{0x14, 0x90170120},
|
||||
{0x17, 0x40000000},
|
||||
{0x18, 0x411111f0},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1a, 0x411111f0},
|
||||
{0x1b, 0x411111f0},
|
||||
{0x1d, 0x40700001},
|
||||
{0x1e, 0x411111f0},
|
||||
{0x21, 0x02211030}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC282_STANDARD_PINS,
|
||||
{0x12, 0x90a60130},
|
||||
{0x17, 0x40020008},
|
||||
{0x19, 0x03a11020},
|
||||
{0x1d, 0x40e00001},
|
||||
{0x21, 0x0321101f}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL_XPS_13_GPIO6,
|
||||
ALC288_STANDARD_PINS,
|
||||
{0x12, 0x90a60120},
|
||||
{0x13, 0x40000000},
|
||||
{0x14, 0x90170110},
|
||||
{0x1d, 0x4076832d},
|
||||
{0x21, 0x0321101f}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
|
||||
ALC290_STANDARD_PINS,
|
||||
{0x14, 0x411111f0},
|
||||
{0x15, 0x04211040},
|
||||
{0x18, 0x90170112},
|
||||
{0x1a, 0x04a11020},
|
||||
{0x1d, 0x4075812d}),
|
||||
{0x1a, 0x04a11020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
|
||||
ALC290_STANDARD_PINS,
|
||||
{0x14, 0x411111f0},
|
||||
{0x15, 0x04211040},
|
||||
{0x18, 0x90170110},
|
||||
{0x1a, 0x04a11020},
|
||||
{0x1d, 0x4075812d}),
|
||||
{0x1a, 0x04a11020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
|
||||
ALC290_STANDARD_PINS,
|
||||
{0x14, 0x411111f0},
|
||||
{0x15, 0x0421101f},
|
||||
{0x18, 0x411111f0},
|
||||
{0x1a, 0x04a11020},
|
||||
{0x1d, 0x4075812d}),
|
||||
{0x1a, 0x04a11020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
|
||||
ALC290_STANDARD_PINS,
|
||||
{0x14, 0x411111f0},
|
||||
{0x15, 0x04211020},
|
||||
{0x18, 0x411111f0},
|
||||
{0x1a, 0x04a11040},
|
||||
{0x1d, 0x4076a12d}),
|
||||
{0x1a, 0x04a11040}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
|
||||
ALC290_STANDARD_PINS,
|
||||
{0x14, 0x90170110},
|
||||
{0x15, 0x04211020},
|
||||
{0x18, 0x411111f0},
|
||||
{0x1a, 0x04a11040},
|
||||
{0x1d, 0x4076a12d}),
|
||||
{0x1a, 0x04a11040}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
|
||||
ALC290_STANDARD_PINS,
|
||||
{0x14, 0x90170110},
|
||||
{0x15, 0x04211020},
|
||||
{0x18, 0x411111f0},
|
||||
{0x1a, 0x04a11020},
|
||||
{0x1d, 0x4076a12d}),
|
||||
{0x1a, 0x04a11020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
|
||||
ALC290_STANDARD_PINS,
|
||||
{0x14, 0x90170110},
|
||||
{0x15, 0x0421101f},
|
||||
{0x18, 0x411111f0},
|
||||
{0x1a, 0x04a11020},
|
||||
{0x1d, 0x4075812d}),
|
||||
{0x1a, 0x04a11020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
|
||||
ALC292_STANDARD_PINS,
|
||||
{0x12, 0x90a60140},
|
||||
{0x13, 0x411111f0},
|
||||
{0x16, 0x01014020},
|
||||
{0x18, 0x411111f0},
|
||||
{0x19, 0x01a19030},
|
||||
{0x1e, 0x411111f0}),
|
||||
{0x19, 0x01a19030}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
|
||||
ALC292_STANDARD_PINS,
|
||||
{0x12, 0x90a60140},
|
||||
{0x13, 0x411111f0},
|
||||
{0x16, 0x01014020},
|
||||
{0x18, 0x02a19031},
|
||||
{0x19, 0x01a1903e},
|
||||
{0x1e, 0x411111f0}),
|
||||
{0x19, 0x01a1903e}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
|
||||
ALC292_STANDARD_PINS,
|
||||
{0x12, 0x90a60140},
|
||||
{0x13, 0x411111f0},
|
||||
{0x16, 0x411111f0},
|
||||
{0x18, 0x411111f0},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1e, 0x411111f0}),
|
||||
{0x12, 0x90a60140}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC292_STANDARD_PINS,
|
||||
{0x12, 0x40000000},
|
||||
{0x13, 0x90a60140},
|
||||
{0x16, 0x21014020},
|
||||
{0x18, 0x411111f0},
|
||||
{0x19, 0x21a19030},
|
||||
{0x1e, 0x411111f0}),
|
||||
{0x19, 0x21a19030}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC292_STANDARD_PINS,
|
||||
{0x12, 0x40000000},
|
||||
{0x13, 0x90a60140},
|
||||
{0x16, 0x411111f0},
|
||||
{0x18, 0x411111f0},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1e, 0x411111f0}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC292_STANDARD_PINS,
|
||||
{0x12, 0x40000000},
|
||||
{0x13, 0x90a60140},
|
||||
{0x16, 0x21014020},
|
||||
{0x18, 0x411111f0},
|
||||
{0x19, 0x21a19030},
|
||||
{0x1e, 0x411111ff}),
|
||||
{0x13, 0x90a60140}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC298_STANDARD_PINS,
|
||||
{0x12, 0x90a60130},
|
||||
{0x13, 0x40000000},
|
||||
{0x14, 0x411111f0},
|
||||
{0x17, 0x90170140},
|
||||
{0x1d, 0x4068a36d},
|
||||
{0x21, 0x03211020}),
|
||||
{0x17, 0x90170110}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC298_STANDARD_PINS,
|
||||
{0x17, 0x90170140}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC298_STANDARD_PINS,
|
||||
{0x17, 0x90170150}),
|
||||
{}
|
||||
};
|
||||
|
||||
@ -6675,77 +6477,33 @@ static const struct hda_model_fixup alc662_fixup_models[] = {
|
||||
|
||||
static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
|
||||
SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
|
||||
{0x12, 0x4004c000},
|
||||
{0x14, 0x01014010},
|
||||
{0x15, 0x411111f0},
|
||||
{0x16, 0x411111f0},
|
||||
{0x18, 0x01a19020},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1a, 0x0181302f},
|
||||
{0x1b, 0x0221401f},
|
||||
{0x1c, 0x411111f0},
|
||||
{0x1d, 0x4054c601},
|
||||
{0x1e, 0x411111f0}),
|
||||
{0x1b, 0x0221401f}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
|
||||
{0x12, 0x99a30130},
|
||||
{0x14, 0x90170110},
|
||||
{0x15, 0x0321101f},
|
||||
{0x16, 0x03011020},
|
||||
{0x18, 0x40000008},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1a, 0x411111f0},
|
||||
{0x1b, 0x411111f0},
|
||||
{0x1d, 0x41000001},
|
||||
{0x1e, 0x411111f0},
|
||||
{0x1f, 0x411111f0}),
|
||||
{0x16, 0x03011020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
|
||||
{0x12, 0x99a30140},
|
||||
{0x14, 0x90170110},
|
||||
{0x15, 0x0321101f},
|
||||
{0x16, 0x03011020},
|
||||
{0x18, 0x40000008},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1a, 0x411111f0},
|
||||
{0x1b, 0x411111f0},
|
||||
{0x1d, 0x41000001},
|
||||
{0x1e, 0x411111f0},
|
||||
{0x1f, 0x411111f0}),
|
||||
{0x16, 0x03011020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
|
||||
{0x12, 0x99a30150},
|
||||
{0x14, 0x90170110},
|
||||
{0x15, 0x0321101f},
|
||||
{0x16, 0x03011020},
|
||||
{0x18, 0x40000008},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1a, 0x411111f0},
|
||||
{0x1b, 0x411111f0},
|
||||
{0x1d, 0x41000001},
|
||||
{0x1e, 0x411111f0},
|
||||
{0x1f, 0x411111f0}),
|
||||
{0x16, 0x03011020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
|
||||
{0x12, 0x411111f0},
|
||||
{0x14, 0x90170110},
|
||||
{0x15, 0x0321101f},
|
||||
{0x16, 0x03011020},
|
||||
{0x18, 0x40000008},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1a, 0x411111f0},
|
||||
{0x1b, 0x411111f0},
|
||||
{0x1d, 0x41000001},
|
||||
{0x1e, 0x411111f0},
|
||||
{0x1f, 0x411111f0}),
|
||||
{0x16, 0x03011020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
|
||||
{0x12, 0x90a60130},
|
||||
{0x14, 0x90170110},
|
||||
{0x15, 0x0321101f},
|
||||
{0x16, 0x40000000},
|
||||
{0x18, 0x411111f0},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1a, 0x411111f0},
|
||||
{0x1b, 0x411111f0},
|
||||
{0x1d, 0x40d6832d},
|
||||
{0x1e, 0x411111f0},
|
||||
{0x1f, 0x411111f0}),
|
||||
{0x15, 0x0321101f}),
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -1526,7 +1526,7 @@ static struct snd_rawmidi_ops snd_hdsp_midi_input =
|
||||
|
||||
static int snd_hdsp_create_midi (struct snd_card *card, struct hdsp *hdsp, int id)
|
||||
{
|
||||
char buf[32];
|
||||
char buf[40];
|
||||
|
||||
hdsp->midi[id].id = id;
|
||||
hdsp->midi[id].rmidi = NULL;
|
||||
@ -1537,7 +1537,7 @@ static int snd_hdsp_create_midi (struct snd_card *card, struct hdsp *hdsp, int i
|
||||
hdsp->midi[id].pending = 0;
|
||||
spin_lock_init (&hdsp->midi[id].lock);
|
||||
|
||||
sprintf (buf, "%s MIDI %d", card->shortname, id+1);
|
||||
snprintf(buf, sizeof(buf), "%s MIDI %d", card->shortname, id + 1);
|
||||
if (snd_rawmidi_new (card, buf, id, 1, 1, &hdsp->midi[id].rmidi) < 0)
|
||||
return -1;
|
||||
|
||||
@ -2806,7 +2806,8 @@ static int snd_hdsp_get_adat_sync_check(struct snd_kcontrol *kcontrol, struct sn
|
||||
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
|
||||
|
||||
offset = ucontrol->id.index - 1;
|
||||
snd_BUG_ON(offset < 0);
|
||||
if (snd_BUG_ON(offset < 0))
|
||||
return -EINVAL;
|
||||
|
||||
switch (hdsp->io_type) {
|
||||
case Digiface:
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/module.h>
|
||||
#include <sound/core.h>
|
||||
#include "pmac.h"
|
||||
|
||||
@ -101,6 +102,7 @@ static const struct i2c_device_id keywest_i2c_id[] = {
|
||||
{ "keywest", 0 }, /* instantiated by us if needed */
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, keywest_i2c_id);
|
||||
|
||||
static struct i2c_driver keywest_driver = {
|
||||
.driver = {
|
||||
|
@ -57,6 +57,7 @@ source "sound/soc/samsung/Kconfig"
|
||||
source "sound/soc/sh/Kconfig"
|
||||
source "sound/soc/sirf/Kconfig"
|
||||
source "sound/soc/spear/Kconfig"
|
||||
source "sound/soc/sti/Kconfig"
|
||||
source "sound/soc/tegra/Kconfig"
|
||||
source "sound/soc/txx9/Kconfig"
|
||||
source "sound/soc/ux500/Kconfig"
|
||||
|
@ -39,6 +39,7 @@ obj-$(CONFIG_SND_SOC) += samsung/
|
||||
obj-$(CONFIG_SND_SOC) += sh/
|
||||
obj-$(CONFIG_SND_SOC) += sirf/
|
||||
obj-$(CONFIG_SND_SOC) += spear/
|
||||
obj-$(CONFIG_SND_SOC) += sti/
|
||||
obj-$(CONFIG_SND_SOC) += tegra/
|
||||
obj-$(CONFIG_SND_SOC) += txx9/
|
||||
obj-$(CONFIG_SND_SOC) += ux500/
|
||||
|
@ -290,7 +290,7 @@ static int atmel_ssc_startup(struct snd_pcm_substream *substream,
|
||||
int dir, dir_mask;
|
||||
int ret;
|
||||
|
||||
pr_debug("atmel_ssc_startup: SSC_SR=0x%u\n",
|
||||
pr_debug("atmel_ssc_startup: SSC_SR=0x%x\n",
|
||||
ssc_readl(ssc_p->ssc->regs, SR));
|
||||
|
||||
/* Enable PMC peripheral clock for this SSC */
|
||||
|
@ -344,14 +344,8 @@ static int au1xpsc_pcm_drvprobe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, dmadata);
|
||||
|
||||
return snd_soc_register_platform(&pdev->dev, &au1xpsc_soc_platform);
|
||||
}
|
||||
|
||||
static int au1xpsc_pcm_drvremove(struct platform_device *pdev)
|
||||
{
|
||||
snd_soc_unregister_platform(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
return devm_snd_soc_register_platform(&pdev->dev,
|
||||
&au1xpsc_soc_platform);
|
||||
}
|
||||
|
||||
static struct platform_driver au1xpsc_pcm_driver = {
|
||||
@ -359,7 +353,6 @@ static struct platform_driver au1xpsc_pcm_driver = {
|
||||
.name = "au1xpsc-pcm",
|
||||
},
|
||||
.probe = au1xpsc_pcm_drvprobe,
|
||||
.remove = au1xpsc_pcm_drvremove,
|
||||
};
|
||||
|
||||
module_platform_driver(au1xpsc_pcm_driver);
|
||||
|
@ -312,14 +312,8 @@ static int alchemy_pcm_drvprobe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, ctx);
|
||||
|
||||
return snd_soc_register_platform(&pdev->dev, &alchemy_pcm_soc_platform);
|
||||
}
|
||||
|
||||
static int alchemy_pcm_drvremove(struct platform_device *pdev)
|
||||
{
|
||||
snd_soc_unregister_platform(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
return devm_snd_soc_register_platform(&pdev->dev,
|
||||
&alchemy_pcm_soc_platform);
|
||||
}
|
||||
|
||||
static struct platform_driver alchemy_pcmdma_driver = {
|
||||
@ -327,7 +321,6 @@ static struct platform_driver alchemy_pcmdma_driver = {
|
||||
.name = "alchemy-pcm-dma",
|
||||
},
|
||||
.probe = alchemy_pcm_drvprobe,
|
||||
.remove = alchemy_pcm_drvremove,
|
||||
};
|
||||
|
||||
module_platform_driver(alchemy_pcmdma_driver);
|
||||
|
@ -305,19 +305,9 @@ static int au1xpsc_i2s_drvprobe(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
|
||||
iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!iores)
|
||||
return -ENODEV;
|
||||
|
||||
ret = -EBUSY;
|
||||
if (!devm_request_mem_region(&pdev->dev, iores->start,
|
||||
resource_size(iores),
|
||||
pdev->name))
|
||||
return -EBUSY;
|
||||
|
||||
wd->mmio = devm_ioremap(&pdev->dev, iores->start,
|
||||
resource_size(iores));
|
||||
if (!wd->mmio)
|
||||
return -EBUSY;
|
||||
wd->mmio = devm_ioremap_resource(&pdev->dev, iores);
|
||||
if (IS_ERR(wd->mmio))
|
||||
return PTR_ERR(wd->mmio);
|
||||
|
||||
dmares = platform_get_resource(pdev, IORESOURCE_DMA, 0);
|
||||
if (!dmares)
|
||||
|
@ -862,6 +862,8 @@ static const struct of_device_id bcm2835_i2s_of_match[] = {
|
||||
{},
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(of, bcm2835_i2s_of_match);
|
||||
|
||||
static struct platform_driver bcm2835_i2s_driver = {
|
||||
.probe = bcm2835_i2s_probe,
|
||||
.driver = {
|
||||
|
@ -450,13 +450,8 @@ static struct snd_soc_platform_driver bf5xx_ac97_soc_platform = {
|
||||
|
||||
static int bf5xx_soc_platform_probe(struct platform_device *pdev)
|
||||
{
|
||||
return snd_soc_register_platform(&pdev->dev, &bf5xx_ac97_soc_platform);
|
||||
}
|
||||
|
||||
static int bf5xx_soc_platform_remove(struct platform_device *pdev)
|
||||
{
|
||||
snd_soc_unregister_platform(&pdev->dev);
|
||||
return 0;
|
||||
return devm_snd_soc_register_platform(&pdev->dev,
|
||||
&bf5xx_ac97_soc_platform);
|
||||
}
|
||||
|
||||
static struct platform_driver bf5xx_pcm_driver = {
|
||||
@ -465,7 +460,6 @@ static struct platform_driver bf5xx_pcm_driver = {
|
||||
},
|
||||
|
||||
.probe = bf5xx_soc_platform_probe,
|
||||
.remove = bf5xx_soc_platform_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(bf5xx_pcm_driver);
|
||||
|
@ -342,13 +342,8 @@ static struct snd_soc_platform_driver bf5xx_i2s_soc_platform = {
|
||||
|
||||
static int bfin_i2s_soc_platform_probe(struct platform_device *pdev)
|
||||
{
|
||||
return snd_soc_register_platform(&pdev->dev, &bf5xx_i2s_soc_platform);
|
||||
}
|
||||
|
||||
static int bfin_i2s_soc_platform_remove(struct platform_device *pdev)
|
||||
{
|
||||
snd_soc_unregister_platform(&pdev->dev);
|
||||
return 0;
|
||||
return devm_snd_soc_register_platform(&pdev->dev,
|
||||
&bf5xx_i2s_soc_platform);
|
||||
}
|
||||
|
||||
static struct platform_driver bfin_i2s_pcm_driver = {
|
||||
@ -357,7 +352,6 @@ static struct platform_driver bfin_i2s_pcm_driver = {
|
||||
},
|
||||
|
||||
.probe = bfin_i2s_soc_platform_probe,
|
||||
.remove = bfin_i2s_soc_platform_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(bfin_i2s_pcm_driver);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user