diff --git a/0005-conf-ucm-Add-chtrt5645-mono-speaker-analog-mic-confi.patch b/0005-conf-ucm-Add-chtrt5645-mono-speaker-analog-mic-confi.patch new file mode 100644 index 0000000..249ca10 --- /dev/null +++ b/0005-conf-ucm-Add-chtrt5645-mono-speaker-analog-mic-confi.patch @@ -0,0 +1,512 @@ +From 60ed28999a272e1a3d737a9eeee0719b98efd447 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Sat, 6 Jan 2018 23:03:20 +0100 +Subject: [PATCH] conf/ucm: Add chtrt5645-mono-speaker-analog-mic configuration + +Add a configuration for Cherry Trail boards which use a rt5645 codec +connected to a mono speaker and with an analog mic on IN2N + IN2P. + +The chtrt5645-mono-speaker-analog-mic/HiFi.conf for this is based on the +latest version from https://github.com/plbossart/UCM/tree/master/chtrt5645 +with all the unused input options removed and some changes made to make +the analog mic work. + +This commit also adds 2 ucm dirs with the longname of 2 boards known to use +this setup, which simply contain a symlink to the generic +chtrt5645-mono-speaker-analog-mic entry. + +Signed-off-by: Hans de Goede +Signed-off-by: Takashi Iwai +--- + configure.ac | 3 + + src/conf/ucm/Makefile.am | 3 + + .../Makefile.am | 4 + + ...TECLAST-X80Pro-Defaultstring-CherryTrailCR.conf | 1 + + .../chtrt5645-mono-speaker-analog-mic/HiFi.conf | 361 +++++++++++++++++++++ + .../chtrt5645-mono-speaker-analog-mic/Makefile.am | 4 + + .../chtrt5645-mono-speaker-analog-mic.conf | 5 + + src/conf/ucm/gpd-win-pocket-rt5645/Makefile.am | 4 + + .../gpd-win-pocket-rt5645.conf | 1 + + 9 files changed, 386 insertions(+) + create mode 100644 src/conf/ucm/TECLAST-X80Pro-Defaultstring-CherryTrailCR/Makefile.am + create mode 120000 src/conf/ucm/TECLAST-X80Pro-Defaultstring-CherryTrailCR/TECLAST-X80Pro-Defaultstring-CherryTrailCR.conf + create mode 100644 src/conf/ucm/chtrt5645-mono-speaker-analog-mic/HiFi.conf + create mode 100644 src/conf/ucm/chtrt5645-mono-speaker-analog-mic/Makefile.am + create mode 100644 src/conf/ucm/chtrt5645-mono-speaker-analog-mic/chtrt5645-mono-speaker-analog-mic.conf + create mode 100644 src/conf/ucm/gpd-win-pocket-rt5645/Makefile.am + create mode 120000 src/conf/ucm/gpd-win-pocket-rt5645/gpd-win-pocket-rt5645.conf + +diff --git a/configure.ac b/configure.ac +index 47c50fcf89b4..2c51ce75555a 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -713,9 +713,11 @@ AC_OUTPUT(Makefile doc/Makefile doc/pictures/Makefile doc/doxygen.cfg \ + src/conf/ucm/broxton-rt298/Makefile \ + src/conf/ucm/bytcr-rt5651/Makefile \ + src/conf/ucm/chtrt5645/Makefile \ ++ src/conf/ucm/chtrt5645-mono-speaker-analog-mic/Makefile \ + src/conf/ucm/DAISY-I2S/Makefile \ + src/conf/ucm/DB410c/Makefile \ + src/conf/ucm/GoogleNyan/Makefile \ ++ src/conf/ucm/gpd-win-pocket-rt5645/Makefile \ + src/conf/ucm/HDAudio-Gigabyte-ALC1220DualCodecs/Makefile \ + src/conf/ucm/HDAudio-Lenovo-DualCodecs/Makefile \ + src/conf/ucm/PandaBoard/Makefile \ +@@ -723,6 +725,7 @@ AC_OUTPUT(Makefile doc/Makefile doc/pictures/Makefile doc/doxygen.cfg \ + src/conf/ucm/PAZ00/Makefile \ + src/conf/ucm/SDP4430/Makefile \ + src/conf/ucm/skylake-rt286/Makefile \ ++ src/conf/ucm/TECLAST-X80Pro-Defaultstring-CherryTrailCR/Makefile \ + src/conf/ucm/tegraalc5632/Makefile \ + src/conf/ucm/VEYRON-I2S/Makefile \ + src/conf/topology/Makefile \ +diff --git a/src/conf/ucm/Makefile.am b/src/conf/ucm/Makefile.am +index 954e32b8f0c8..3b4f13a880e6 100644 +--- a/src/conf/ucm/Makefile.am ++++ b/src/conf/ucm/Makefile.am +@@ -3,9 +3,11 @@ broadwell-rt286 \ + broxton-rt298 \ + bytcr-rt5651 \ + chtrt5645 \ ++chtrt5645-mono-speaker-analog-mic \ + DAISY-I2S \ + DB410c \ + GoogleNyan \ ++gpd-win-pocket-rt5645 \ + HDAudio-Gigabyte-ALC1220DualCodecs \ + HDAudio-Lenovo-DualCodecs \ + PandaBoard \ +@@ -13,5 +15,6 @@ PandaBoardES \ + PAZ00 \ + SDP4430 \ + skylake-rt286 \ ++TECLAST-X80Pro-Defaultstring-CherryTrailCR \ + tegraalc5632 \ + VEYRON-I2S +diff --git a/src/conf/ucm/TECLAST-X80Pro-Defaultstring-CherryTrailCR/Makefile.am b/src/conf/ucm/TECLAST-X80Pro-Defaultstring-CherryTrailCR/Makefile.am +new file mode 100644 +index 000000000000..f56a817c73e0 +--- /dev/null ++++ b/src/conf/ucm/TECLAST-X80Pro-Defaultstring-CherryTrailCR/Makefile.am +@@ -0,0 +1,4 @@ ++alsaconfigdir = @ALSA_CONFIG_DIR@ ++ucmdir = $(alsaconfigdir)/ucm/TECLAST-X80Pro-Defaultstring-CherryTrailCR ++ucm_DATA = TECLAST-X80Pro-Defaultstring-CherryTrailCR.conf ++EXTRA_DIST = $(ucm_DATA) +diff --git a/src/conf/ucm/TECLAST-X80Pro-Defaultstring-CherryTrailCR/TECLAST-X80Pro-Defaultstring-CherryTrailCR.conf b/src/conf/ucm/TECLAST-X80Pro-Defaultstring-CherryTrailCR/TECLAST-X80Pro-Defaultstring-CherryTrailCR.conf +new file mode 120000 +index 000000000000..1b1d47540b73 +--- /dev/null ++++ b/src/conf/ucm/TECLAST-X80Pro-Defaultstring-CherryTrailCR/TECLAST-X80Pro-Defaultstring-CherryTrailCR.conf +@@ -0,0 +1 @@ ++../chtrt5645-mono-speaker-analog-mic/chtrt5645-mono-speaker-analog-mic.conf +\ No newline at end of file +diff --git a/src/conf/ucm/chtrt5645-mono-speaker-analog-mic/HiFi.conf b/src/conf/ucm/chtrt5645-mono-speaker-analog-mic/HiFi.conf +new file mode 100644 +index 000000000000..7a0cd51c0790 +--- /dev/null ++++ b/src/conf/ucm/chtrt5645-mono-speaker-analog-mic/HiFi.conf +@@ -0,0 +1,361 @@ ++SectionVerb { ++ # ALSA PCM ++ Value { ++ TQ "HiFi" ++ ++ # ALSA PCM device for HiFi ++ PlaybackPCM "hw:chtrt5645" ++ CapturePCM "hw:chtrt5645" ++ } ++ ++ EnableSequence [ ++ cdev "hw:chtrt5645" ++ ++ # media mixer settings ++ # compress ++ cset "name='media0_in Gain 0 Switch' on" ++ cset "name='media0_in Gain 0 Volume' 0" ++ ++ # normal ++ cset "name='media1_in Gain 0 Switch' on" ++ cset "name='media1_in Gain 0 Volume' 0" ++ # swm loopback ++ cset "name='media2_in Gain 0 Switch' off" ++ cset "name='media2_in Gain 0 Volume' 0%" ++ # deep buffer ++ cset "name='media3_in Gain 0 Switch' on" ++ cset "name='media3_in Gain 0 Volume' 0" ++ ++ cset "name='media0_out mix 0 media0_in Switch' on" ++ cset "name='media0_out mix 0 media1_in Switch' on" ++ cset "name='media0_out mix 0 media2_in Switch' off" ++ cset "name='media0_out mix 0 media3_in Switch' on" ++ ++ cset "name='media1_out mix 0 media0_in Switch' off" ++ cset "name='media1_out mix 0 media1_in Switch' off" ++ cset "name='media1_out mix 0 media2_in Switch' off" ++ cset "name='media1_out mix 0 media3_in Switch' off" ++ ++ cset "name='pcm0_in Gain 0 Switch' on" ++ cset "name='pcm0_in Gain 0 Volume' 0" ++ ++ cset "name='pcm1_in Gain 0 Switch' off" ++ cset "name='pcm1_in Gain 0 Volume' 0%" ++ ++ # codec0_out settings (used if ssp2 is connected to aif1) ++ cset "name='codec_out0 mix 0 codec_in0 Switch' off" ++ cset "name='codec_out0 mix 0 codec_in1 Switch' off" ++ cset "name='codec_out0 mix 0 media_loop1_in Switch' off" ++ cset "name='codec_out0 mix 0 media_loop2_in Switch' off" ++ cset "name='codec_out0 mix 0 pcm0_in Switch' on" ++ cset "name='codec_out0 mix 0 pcm1_in Switch' off" ++ cset "name='codec_out0 mix 0 sprot_loop_in Switch' off" ++ cset "name='codec_out0 Gain 0 Switch' on" ++ cset "name='codec_out0 Gain 0 Volume' 0" ++ ++ # modem_out settings (used if ssp0 is connected to aif2) ++ cset "name='modem_out mix 0 codec_in0 Switch' off" ++ cset "name='modem_out mix 0 codec_in1 Switch' off" ++ cset "name='modem_out mix 0 media_loop1_in Switch' off" ++ cset "name='modem_out mix 0 media_loop2_in Switch' off" ++ cset "name='modem_out mix 0 pcm0_in Switch' on" ++ cset "name='modem_out mix 0 pcm1_in Switch' off" ++ cset "name='modem_out mix 0 sprot_loop_in Switch' off" ++ cset "name='modem_out Gain 0 Switch' on" ++ cset "name='modem_out Gain 0 Volume' 0" ++ ++ # input settings ++ # pcm1_out settings ++ ++ # input used when SSP2 is connected ++ cset "name='codec_in0 Gain 0 Switch' on" ++ cset "name='codec_in0 Gain 0 Volume' 0" ++ ++ # input used when SSP0 is connected ++ cset "name='modem_in Gain 0 Switch' on" ++ cset "name='modem_in Gain 0 Volume' 0" ++ ++ cset "name='pcm1_out mix 0 codec_in0 Switch' on" ++ cset "name='pcm1_out mix 0 modem_in Switch' on" ++ cset "name='pcm1_out mix 0 codec_in1 Switch' off" ++ cset "name='pcm1_out mix 0 media_loop1_in Switch' off" ++ cset "name='pcm1_out mix 0 media_loop2_in Switch' off" ++ cset "name='pcm1_out mix 0 pcm0_in Switch' off" ++ cset "name='pcm1_out mix 0 pcm1_in Switch' off" ++ cset "name='pcm1_out mix 0 sprot_loop_in Switch' off" ++ ++ cset "name='pcm1_out Gain 0 Switch' on" ++ cset "name='pcm1_out Gain 0 Volume' 0" ++ ++ # disable codec_out1 ++ cset "name='codec_out1 mix 0 codec_in0 Switch' off" ++ cset "name='codec_out1 mix 0 codec_in1 Switch' off" ++ cset "name='codec_out1 mix 0 media_loop1_in Switch' off" ++ cset "name='codec_out1 mix 0 media_loop2_in Switch' off" ++ cset "name='codec_out1 mix 0 pcm0_in Switch' off" ++ cset "name='codec_out1 mix 0 pcm1_in Switch' off" ++ cset "name='codec_out1 mix 0 sprot_loop_in Switch' off" ++ cset "name='codec_out1 Gain 0 Switch' off" ++ cset "name='codec_out1 Gain 0 Volume' 0%" ++ ++ # disable codec_in1 ++ cset "name='codec_in1 Gain 0 Switch' off" ++ cset "name='codec_in1 Gain 0 Volume' 0%" ++ ++ # disable all loops ++ cset "name='media_loop1_out mix 0 codec_in0 Switch' off" ++ cset "name='media_loop1_out mix 0 codec_in1 Switch' off" ++ cset "name='media_loop1_out mix 0 media_loop1_in Switch' off" ++ cset "name='media_loop1_out mix 0 media_loop2_in Switch' off" ++ cset "name='media_loop1_out mix 0 pcm0_in Switch' off" ++ cset "name='media_loop1_out mix 0 pcm1_in Switch' off" ++ cset "name='media_loop1_out mix 0 sprot_loop_in Switch' off" ++ ++ cset "name='media_loop2_out mix 0 codec_in0 Switch' off" ++ cset "name='media_loop2_out mix 0 codec_in1 Switch' off" ++ cset "name='media_loop2_out mix 0 media_loop1_in Switch' off" ++ cset "name='media_loop2_out mix 0 media_loop2_in Switch' off" ++ cset "name='media_loop2_out mix 0 pcm0_in Switch' off" ++ cset "name='media_loop2_out mix 0 pcm1_in Switch' off" ++ cset "name='media_loop2_out mix 0 sprot_loop_in Switch' off" ++ ++ cset "name='sprot_loop_out mix 0 codec_in0 Switch' off" ++ cset "name='sprot_loop_out mix 0 codec_in1 Switch' off" ++ cset "name='sprot_loop_out mix 0 media_loop1_in Switch' off" ++ cset "name='sprot_loop_out mix 0 media_loop2_in Switch' off" ++ cset "name='sprot_loop_out mix 0 pcm0_in Switch' off" ++ cset "name='sprot_loop_out mix 0 pcm1_in Switch' off" ++ cset "name='sprot_loop_out mix 0 sprot_loop_in Switch' off" ++ ++ # Output Configuration ++ cset "name='DAC1 L Mux' IF1 DAC" ++ cset "name='DAC1 R Mux' IF1 DAC" ++ cset "name='DAC1 MIXL DAC1 Switch' 1" ++ cset "name='DAC1 MIXR DAC1 Switch' 1" ++ cset "name='Stereo DAC MIXL DAC L1 Switch' 1" ++ cset "name='Stereo DAC MIXR DAC R1 Switch' 1" ++ ++ cset "name='DAC L2 Mux' IF2 DAC" ++ cset "name='DAC R2 Mux' IF2 DAC" ++ cset "name='Mono DAC MIXL DAC L2 Switch' on" ++ cset "name='Mono DAC MIXR DAC R2 Switch' on" ++ cset "name='DAC2 Playback Switch' on" ++ ++ cset "name='HPOVOL MIXL DAC1 Switch' on" ++ cset "name='HPOVOL MIXR DAC1 Switch' on" ++ cset "name='HPOVOL MIXL DAC2 Switch' on" ++ cset "name='HPOVOL MIXR DAC2 Switch' on" ++ cset "name='HPO MIX HPVOL Switch' on" ++ cset "name='HPOVOL L Switch' on" ++ cset "name='HPOVOL R Switch' on" ++ ++ cset "name='SPK MIXL DAC L1 Switch' on" ++ cset "name='SPK MIXR DAC R1 Switch' on" ++ cset "name='SPK MIXL DAC L2 Switch' on" ++ cset "name='SPK MIXR DAC R2 Switch' on" ++ cset "name='SPOL MIX SPKVOL L Switch' on" ++ cset "name='SPOR MIX SPKVOL R Switch' on" ++ cset "name='SPKVOL L Switch' on" ++ cset "name='SPKVOL R Switch' on" ++ ++ # Input Configuration ++ cset "name='Stereo1 DMIC Mux' 0" ++ cset "name='Stereo1 ADC1 Mux' 1" ++ cset "name='Stereo1 ADC2 Mux' 1" ++ cset "name='ADC Capture Switch' on" ++ # 55/63 ++ cset "name='ADC Capture Volume' 55" ++ # set ADC Boost to 0/3, higher vals cause a lot of white noise ++ cset "name='ADC Boost Capture Volume' 0" ++ # 55/63 ++ cset "name='Mono ADC Capture Volume' 55" ++ # 0/3 ++ cset "name='Mono ADC Boost Capture Volume' 0" ++ # 27/31 ++ cset "name='IN Capture Volume' 27" ++ cset "name='I2S2 Func Switch' on" ++ # 3/12 the headphone mic tends to be quite loud ++ cset "name='IN1 Boost' 3" ++ # 8/8 the internal analog mic tends to be quite soft ++ cset "name='IN2 Boost' 8" ++ ] ++ ++ DisableSequence [ ++ cdev "hw:chtrt5645" ++ ++ # Disable audio output path ++ cset "name='codec_out1 mix 0 pcm0_in Switch' off" ++ cset "name='media0_out mix 0 media1_in Switch' off" ++ ++ cset "name='media1_in Gain 0 Switch' off" ++ cset "name='pcm0_in Gain 0 Switch' off" ++ cset "name='codec_out1 Gain 0 Switch' off" ++ ++ # Disable audio input path ++ cset "name='pcm1_out mix 0 media_loop2_in Switch' off" ++ cset "name='media_loop2_out mix 0 codec_in0 Switch' off" ++ ++ cset "name='media_loop2_out Gain 0 Switch' off" ++ cset "name='pcm1_out Gain 0 Switch' off" ++ cset "name='codec_in0 Gain 0 Switch' off" ++ ] ++} ++ ++SectionDevice."Speaker" { ++ Comment "Speaker" ++ ++ Value { ++ PlaybackChannels "2" ++ } ++ ++ ConflictingDevice [ ++ "Headphones" ++ ] ++ ++ EnableSequence [ ++ cdev "hw:chtrt5645" ++ ++ # Monospeaker: Mix right to left ++ cset "name='Stereo DAC MIXL DAC R1 Switch' 1" ++ cset "name='Stereo DAC MIXR DAC R1 Switch' 0" ++ ++ cset "name='Headphone Switch' off" ++ cset "name='Headphone Channel Switch' off" ++ ++ cset "name='Ext Spk Switch' on" ++ cset "name='Speaker Channel Switch' on" ++ cset "name='Speaker Playback Volume' 31" ++ ] ++ ++ DisableSequence [ ++ cdev "hw:chtrt5645" ++ ++ cset "name='Ext Spk Switch' off" ++ cset "name='Speaker Channel Switch' off" ++ ] ++} ++ ++SectionDevice."Headphones" { ++ Comment "Headphones" ++ ++ Value { ++ PlaybackChannels "2" ++ JackControl "Headphone Jack" ++ JackHWMute "Speaker" ++ } ++ ++ ConflictingDevice [ ++ "Speaker" ++ ] ++ ++ EnableSequence [ ++ cdev "hw:chtrt5645" ++ ++ # Undo monospeaker mixing ++ cset "name='Stereo DAC MIXL DAC R1 Switch' 0" ++ cset "name='Stereo DAC MIXR DAC R1 Switch' 1" ++ ++ cset "name='Ext Spk Switch' off" ++ cset "name='Speaker Channel Switch' off" ++ ++ cset "name='Headphone Switch' on" ++ cset "name='Headphone Channel Switch' on" ++ # 25/39 higher values cause crackling on some boards ++ cset "name='Headphone Playback Volume' 25" ++ ] ++ ++ DisableSequence [ ++ cdev "hw:chtrt5645" ++ ++ cset "name='Headphone Switch' off" ++ cset "name='Headphone Channel Switch' off" ++ ] ++} ++ ++SectionDevice."Mic".0 { ++ Comment "Internal Analog Microphone" ++ ++ Value { ++ CaptureChannels "2" ++ CapturePriority "150" ++ } ++ ++ EnableSequence [ ++ cdev "hw:chtrt5645" ++ ++ cset "name='Int Analog Mic Switch' on" ++ ++ cset "name='Sto1 ADC MIXL ADC1 Switch' on" ++ cset "name='Sto1 ADC MIXR ADC1 Switch' on" ++ cset "name='Sto1 ADC MIXL ADC2 Switch' off" ++ cset "name='Sto1 ADC MIXR ADC2 Switch' off" ++ ++ cset "name='Mono ADC MIXL ADC1 Switch' on" ++ cset "name='Mono ADC MIXR ADC1 Switch' on" ++ cset "name='Mono ADC MIXL ADC2 Switch' off" ++ cset "name='Mono ADC MIXR ADC2 Switch' off" ++ ++ cset "name='RECMIXL BST2 Switch' on" ++ cset "name='RECMIXR BST2 Switch' on" ++ ++ ] ++ ++ DisableSequence [ ++ cdev "hw:chtrt5645" ++ ++ cset "name='Sto1 ADC MIXL ADC1 Switch' off" ++ cset "name='Sto1 ADC MIXR ADC1 Switch' off" ++ cset "name='Mono ADC MIXL ADC1 Switch' off" ++ cset "name='Mono ADC MIXR ADC1 Switch' off" ++ ++ cset "name='RECMIXL BST2 Switch' off" ++ cset "name='RECMIXR BST2 Switch' off" ++ ++ cset "name='Int Analog Mic Switch' off" ++ ] ++} ++ ++ ++SectionDevice."HSMic".0 { ++ Comment "Headset Microphone" ++ ++ Value { ++ CaptureChannels "2" ++ JackControl "Headset Mic Jack" ++ JackHWMute "Mic" ++ } ++ ++ EnableSequence [ ++ cdev "hw:chtrt5645" ++ ++ cset "name='Headset Mic Switch' on" ++ ++ cset "name='Sto1 ADC MIXL ADC1 Switch' on" ++ cset "name='Sto1 ADC MIXR ADC1 Switch' on" ++ cset "name='Sto1 ADC MIXL ADC2 Switch' off" ++ cset "name='Sto1 ADC MIXR ADC2 Switch' off" ++ ++ cset "name='Mono ADC MIXL ADC1 Switch' on" ++ cset "name='Mono ADC MIXR ADC1 Switch' on" ++ cset "name='Mono ADC MIXL ADC2 Switch' off" ++ cset "name='Mono ADC MIXR ADC2 Switch' off" ++ ++ cset "name='RECMIXL BST1 Switch' on" ++ cset "name='RECMIXR BST1 Switch' on" ++ ++ ] ++ ++ DisableSequence [ ++ cdev "hw:chtrt5645" ++ ++ cset "name='Headset Mic Switch' off" ++ ++ cset "name='RECMIXL BST1 Switch' off" ++ cset "name='RECMIXR BST1 Switch' off" ++ cset "name='Sto1 ADC MIXL ADC1 Switch' off" ++ cset "name='Sto1 ADC MIXR ADC1 Switch' off" ++ cset "name='Mono ADC MIXL ADC1 Switch' on" ++ cset "name='Mono ADC MIXR ADC1 Switch' on" ++ ++ ] ++} +diff --git a/src/conf/ucm/chtrt5645-mono-speaker-analog-mic/Makefile.am b/src/conf/ucm/chtrt5645-mono-speaker-analog-mic/Makefile.am +new file mode 100644 +index 000000000000..4c4d7cf4df85 +--- /dev/null ++++ b/src/conf/ucm/chtrt5645-mono-speaker-analog-mic/Makefile.am +@@ -0,0 +1,4 @@ ++alsaconfigdir = @ALSA_CONFIG_DIR@ ++ucmdir = $(alsaconfigdir)/ucm/chtrt5645-mono-speaker-analog-mic ++ucm_DATA = chtrt5645-mono-speaker-analog-mic.conf HiFi.conf ++EXTRA_DIST = $(ucm_DATA) +diff --git a/src/conf/ucm/chtrt5645-mono-speaker-analog-mic/chtrt5645-mono-speaker-analog-mic.conf b/src/conf/ucm/chtrt5645-mono-speaker-analog-mic/chtrt5645-mono-speaker-analog-mic.conf +new file mode 100644 +index 000000000000..b1a5206e24b1 +--- /dev/null ++++ b/src/conf/ucm/chtrt5645-mono-speaker-analog-mic/chtrt5645-mono-speaker-analog-mic.conf +@@ -0,0 +1,5 @@ ++Comment "Intel SoC Audio Device" ++SectionUseCase."HiFi" { ++ File "../chtrt5645-mono-speaker-analog-mic/HiFi.conf" ++ Comment "Default" ++} +diff --git a/src/conf/ucm/gpd-win-pocket-rt5645/Makefile.am b/src/conf/ucm/gpd-win-pocket-rt5645/Makefile.am +new file mode 100644 +index 000000000000..62440926057b +--- /dev/null ++++ b/src/conf/ucm/gpd-win-pocket-rt5645/Makefile.am +@@ -0,0 +1,4 @@ ++alsaconfigdir = @ALSA_CONFIG_DIR@ ++ucmdir = $(alsaconfigdir)/ucm/gpd-win-pocket-rt5645 ++ucm_DATA = gpd-win-pocket-rt5645.conf ++EXTRA_DIST = $(ucm_DATA) +diff --git a/src/conf/ucm/gpd-win-pocket-rt5645/gpd-win-pocket-rt5645.conf b/src/conf/ucm/gpd-win-pocket-rt5645/gpd-win-pocket-rt5645.conf +new file mode 120000 +index 000000000000..1b1d47540b73 +--- /dev/null ++++ b/src/conf/ucm/gpd-win-pocket-rt5645/gpd-win-pocket-rt5645.conf +@@ -0,0 +1 @@ ++../chtrt5645-mono-speaker-analog-mic/chtrt5645-mono-speaker-analog-mic.conf +\ No newline at end of file +-- +2.15.1 + diff --git a/0006-pcm-Return-the-consistent-error-code-for-unexpected-.patch b/0006-pcm-Return-the-consistent-error-code-for-unexpected-.patch new file mode 100644 index 0000000..9f3d74b --- /dev/null +++ b/0006-pcm-Return-the-consistent-error-code-for-unexpected-.patch @@ -0,0 +1,417 @@ +From 6e555781259281e31f8b5dc518a317511d67bbd8 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Wed, 17 Jan 2018 15:57:20 +0100 +Subject: [PATCH] pcm: Return the consistent error code for unexpected PCM + states + +Some PCM functions have the sanity check of the expected PCM states, +and most of them return -EBADFD if the current state doesn't match. +This is bad for some programs like aplay that expect the function +returning a proper code corresponding to the state, e.g. -ESTRPIPE for +the suspend. + +This patch is an attempt to address such inconsistencies. The sanity +checker bad_pcm_state() now returns the error code instead of bool, so +that the caller can pass the returned code as is. And it calls a new +helper, pcm_state_to_error(), for obtaining the error code to certain +known PCM error state. + +While we're at it, use the new pcm_state_to_error() for simplifying +the existing code to retrieve the error code, too. + +Tested-by: Mirza Krak +Signed-off-by: Takashi Iwai +--- + src/pcm/pcm.c | 170 +++++++++++++++++++++++++++++++++------------------------- + 1 file changed, 98 insertions(+), 72 deletions(-) + +diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c +index e9ebf383c31b..69d7d66500ea 100644 +--- a/src/pcm/pcm.c ++++ b/src/pcm/pcm.c +@@ -657,6 +657,21 @@ playback devices. + #include "pcm_local.h" + + #ifndef DOC_HIDDEN ++/* return specific error codes for known bad PCM states */ ++static int pcm_state_to_error(snd_pcm_state_t state) ++{ ++ switch (state) { ++ case SND_PCM_STATE_XRUN: ++ return -EPIPE; ++ case SND_PCM_STATE_SUSPENDED: ++ return -ESTRPIPE; ++ case SND_PCM_STATE_DISCONNECTED: ++ return -ENODEV; ++ default: ++ return 0; ++ } ++} ++ + #define P_STATE(x) (1U << SND_PCM_STATE_ ## x) + #define P_STATE_RUNNABLE (P_STATE(PREPARED) | \ + P_STATE(RUNNING) | \ +@@ -667,9 +682,18 @@ playback devices. + /* check whether the PCM is in the unexpected state */ + static int bad_pcm_state(snd_pcm_t *pcm, unsigned int supported_states) + { ++ snd_pcm_state_t state; ++ int err; ++ + if (pcm->own_state_check) + return 0; /* don't care, the plugin checks by itself */ +- return !(supported_states & (1U << snd_pcm_state(pcm))); ++ state = snd_pcm_state(pcm); ++ if (supported_states & (1U << state)) ++ return 0; /* OK */ ++ err = pcm_state_to_error(state); ++ if (err < 0) ++ return err; ++ return -EBADFD; + } + #endif + +@@ -1143,8 +1167,9 @@ int snd_pcm_prepare(snd_pcm_t *pcm) + SNDMSG("PCM not set up"); + return -EIO; + } +- if (bad_pcm_state(pcm, ~P_STATE(DISCONNECTED))) +- return -EBADFD; ++ err = bad_pcm_state(pcm, ~P_STATE(DISCONNECTED)); ++ if (err < 0) ++ return err; + snd_pcm_lock(pcm); + err = pcm->fast_ops->prepare(pcm->fast_op_arg); + snd_pcm_unlock(pcm); +@@ -1191,8 +1216,9 @@ int snd_pcm_start(snd_pcm_t *pcm) + SNDMSG("PCM not set up"); + return -EIO; + } +- if (bad_pcm_state(pcm, P_STATE(PREPARED))) +- return -EBADFD; ++ err = bad_pcm_state(pcm, P_STATE(PREPARED)); ++ if (err < 0) ++ return err; + snd_pcm_lock(pcm); + err = __snd_pcm_start(pcm); + snd_pcm_unlock(pcm); +@@ -1221,9 +1247,10 @@ int snd_pcm_drop(snd_pcm_t *pcm) + SNDMSG("PCM not set up"); + return -EIO; + } +- if (bad_pcm_state(pcm, P_STATE_RUNNABLE | P_STATE(SETUP) | +- P_STATE(SUSPENDED))) +- return -EBADFD; ++ err = bad_pcm_state(pcm, P_STATE_RUNNABLE | P_STATE(SETUP) | ++ P_STATE(SUSPENDED)); ++ if (err < 0) ++ return err; + snd_pcm_lock(pcm); + err = pcm->fast_ops->drop(pcm->fast_op_arg); + snd_pcm_unlock(pcm); +@@ -1247,13 +1274,16 @@ int snd_pcm_drop(snd_pcm_t *pcm) + */ + int snd_pcm_drain(snd_pcm_t *pcm) + { ++ int err; ++ + assert(pcm); + if (CHECK_SANITY(! pcm->setup)) { + SNDMSG("PCM not set up"); + return -EIO; + } +- if (bad_pcm_state(pcm, P_STATE_RUNNABLE)) +- return -EBADFD; ++ err = bad_pcm_state(pcm, P_STATE_RUNNABLE); ++ if (err < 0) ++ return err; + /* lock handled in the callback */ + return pcm->fast_ops->drain(pcm->fast_op_arg); + } +@@ -1279,8 +1309,9 @@ int snd_pcm_pause(snd_pcm_t *pcm, int enable) + SNDMSG("PCM not set up"); + return -EIO; + } +- if (bad_pcm_state(pcm, P_STATE_RUNNABLE)) +- return -EBADFD; ++ err = bad_pcm_state(pcm, P_STATE_RUNNABLE); ++ if (err < 0) ++ return err; + snd_pcm_lock(pcm); + err = pcm->fast_ops->pause(pcm->fast_op_arg, enable); + snd_pcm_unlock(pcm); +@@ -1301,14 +1332,16 @@ int snd_pcm_pause(snd_pcm_t *pcm, int enable) + snd_pcm_sframes_t snd_pcm_rewindable(snd_pcm_t *pcm) + { + snd_pcm_sframes_t result; ++ int err; + + assert(pcm); + if (CHECK_SANITY(! pcm->setup)) { + SNDMSG("PCM not set up"); + return -EIO; + } +- if (bad_pcm_state(pcm, P_STATE_RUNNABLE)) +- return -EBADFD; ++ err = bad_pcm_state(pcm, P_STATE_RUNNABLE); ++ if (err < 0) ++ return err; + snd_pcm_lock(pcm); + result = pcm->fast_ops->rewindable(pcm->fast_op_arg); + snd_pcm_unlock(pcm); +@@ -1327,6 +1360,7 @@ snd_pcm_sframes_t snd_pcm_rewindable(snd_pcm_t *pcm) + snd_pcm_sframes_t snd_pcm_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames) + { + snd_pcm_sframes_t result; ++ int err; + + assert(pcm); + if (CHECK_SANITY(! pcm->setup)) { +@@ -1335,8 +1369,9 @@ snd_pcm_sframes_t snd_pcm_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames) + } + if (frames == 0) + return 0; +- if (bad_pcm_state(pcm, P_STATE_RUNNABLE)) +- return -EBADFD; ++ err = bad_pcm_state(pcm, P_STATE_RUNNABLE); ++ if (err < 0) ++ return err; + snd_pcm_lock(pcm); + result = pcm->fast_ops->rewind(pcm->fast_op_arg, frames); + snd_pcm_unlock(pcm); +@@ -1357,14 +1392,16 @@ snd_pcm_sframes_t snd_pcm_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames) + snd_pcm_sframes_t snd_pcm_forwardable(snd_pcm_t *pcm) + { + snd_pcm_sframes_t result; ++ int err; + + assert(pcm); + if (CHECK_SANITY(! pcm->setup)) { + SNDMSG("PCM not set up"); + return -EIO; + } +- if (bad_pcm_state(pcm, P_STATE_RUNNABLE)) +- return -EBADFD; ++ err = bad_pcm_state(pcm, P_STATE_RUNNABLE); ++ if (err < 0) ++ return err; + snd_pcm_lock(pcm); + result = pcm->fast_ops->forwardable(pcm->fast_op_arg); + snd_pcm_unlock(pcm); +@@ -1387,6 +1424,7 @@ snd_pcm_sframes_t snd_pcm_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames) + #endif + { + snd_pcm_sframes_t result; ++ int err; + + assert(pcm); + if (CHECK_SANITY(! pcm->setup)) { +@@ -1395,8 +1433,9 @@ snd_pcm_sframes_t snd_pcm_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames) + } + if (frames == 0) + return 0; +- if (bad_pcm_state(pcm, P_STATE_RUNNABLE)) +- return -EBADFD; ++ err = bad_pcm_state(pcm, P_STATE_RUNNABLE); ++ if (err < 0) ++ return err; + snd_pcm_lock(pcm); + result = pcm->fast_ops->forward(pcm->fast_op_arg, frames); + snd_pcm_unlock(pcm); +@@ -1425,6 +1464,8 @@ use_default_symbol_version(__snd_pcm_forward, snd_pcm_forward, ALSA_0.9.0rc8); + */ + snd_pcm_sframes_t snd_pcm_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size) + { ++ int err; ++ + assert(pcm); + assert(size == 0 || buffer); + if (CHECK_SANITY(! pcm->setup)) { +@@ -1435,8 +1476,9 @@ snd_pcm_sframes_t snd_pcm_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_ufr + SNDMSG("invalid access type %s", snd_pcm_access_name(pcm->access)); + return -EINVAL; + } +- if (bad_pcm_state(pcm, P_STATE_RUNNABLE)) +- return -EBADFD; ++ err = bad_pcm_state(pcm, P_STATE_RUNNABLE); ++ if (err < 0) ++ return err; + return _snd_pcm_writei(pcm, buffer, size); + } + +@@ -1461,6 +1503,8 @@ snd_pcm_sframes_t snd_pcm_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_ufr + */ + snd_pcm_sframes_t snd_pcm_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size) + { ++ int err; ++ + assert(pcm); + assert(size == 0 || bufs); + if (CHECK_SANITY(! pcm->setup)) { +@@ -1471,8 +1515,9 @@ snd_pcm_sframes_t snd_pcm_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t + SNDMSG("invalid access type %s", snd_pcm_access_name(pcm->access)); + return -EINVAL; + } +- if (bad_pcm_state(pcm, P_STATE_RUNNABLE)) +- return -EBADFD; ++ err = bad_pcm_state(pcm, P_STATE_RUNNABLE); ++ if (err < 0) ++ return err; + return _snd_pcm_writen(pcm, bufs, size); + } + +@@ -1497,6 +1542,8 @@ snd_pcm_sframes_t snd_pcm_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t + */ + snd_pcm_sframes_t snd_pcm_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size) + { ++ int err; ++ + assert(pcm); + assert(size == 0 || buffer); + if (CHECK_SANITY(! pcm->setup)) { +@@ -1507,8 +1554,9 @@ snd_pcm_sframes_t snd_pcm_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t + SNDMSG("invalid access type %s", snd_pcm_access_name(pcm->access)); + return -EINVAL; + } +- if (bad_pcm_state(pcm, P_STATE_RUNNABLE)) +- return -EBADFD; ++ err = bad_pcm_state(pcm, P_STATE_RUNNABLE); ++ if (err < 0) ++ return err; + return _snd_pcm_readi(pcm, buffer, size); + } + +@@ -1533,6 +1581,8 @@ snd_pcm_sframes_t snd_pcm_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t + */ + snd_pcm_sframes_t snd_pcm_readn(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size) + { ++ int err; ++ + assert(pcm); + assert(size == 0 || bufs); + if (CHECK_SANITY(! pcm->setup)) { +@@ -1543,8 +1593,9 @@ snd_pcm_sframes_t snd_pcm_readn(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t s + SNDMSG("invalid access type %s", snd_pcm_access_name(pcm->access)); + return -EINVAL; + } +- if (bad_pcm_state(pcm, P_STATE_RUNNABLE)) +- return -EBADFD; ++ err = bad_pcm_state(pcm, P_STATE_RUNNABLE); ++ if (err < 0) ++ return err; + return _snd_pcm_readn(pcm, bufs, size); + } + +@@ -2695,18 +2746,12 @@ int snd_pcm_wait(snd_pcm_t *pcm, int timeout) + /* locked version */ + int __snd_pcm_wait_in_lock(snd_pcm_t *pcm, int timeout) + { ++ int err; ++ + if (!snd_pcm_may_wait_for_avail_min(pcm, snd_pcm_mmap_avail(pcm))) { + /* check more precisely */ +- switch (__snd_pcm_state(pcm)) { +- case SND_PCM_STATE_XRUN: +- return -EPIPE; +- case SND_PCM_STATE_SUSPENDED: +- return -ESTRPIPE; +- case SND_PCM_STATE_DISCONNECTED: +- return -ENODEV; +- default: +- return 1; +- } ++ err = pcm_state_to_error(__snd_pcm_state(pcm)); ++ return err < 0 ? err : 1; + } + return snd_pcm_wait_nocheck(pcm, timeout); + } +@@ -2753,16 +2798,8 @@ int snd_pcm_wait_nocheck(snd_pcm_t *pcm, int timeout) + return err; + if (revents & (POLLERR | POLLNVAL)) { + /* check more precisely */ +- switch (__snd_pcm_state(pcm)) { +- case SND_PCM_STATE_XRUN: +- return -EPIPE; +- case SND_PCM_STATE_SUSPENDED: +- return -ESTRPIPE; +- case SND_PCM_STATE_DISCONNECTED: +- return -ENODEV; +- default: +- return -EIO; +- } ++ err = pcm_state_to_error(__snd_pcm_state(pcm)); ++ return err < 0 ? err : -EIO; + } + } while (!(revents & (POLLIN | POLLOUT))); + #if 0 /* very useful code to test poll related problems */ +@@ -7010,8 +7047,9 @@ int snd_pcm_mmap_begin(snd_pcm_t *pcm, + { + int err; + +- if (bad_pcm_state(pcm, P_STATE_RUNNABLE)) +- return -EBADFD; ++ err = bad_pcm_state(pcm, P_STATE_RUNNABLE); ++ if (err < 0) ++ return err; + snd_pcm_lock(pcm); + err = __snd_pcm_mmap_begin(pcm, areas, offset, frames); + snd_pcm_unlock(pcm); +@@ -7106,9 +7144,11 @@ snd_pcm_sframes_t snd_pcm_mmap_commit(snd_pcm_t *pcm, + snd_pcm_uframes_t frames) + { + snd_pcm_sframes_t result; ++ int err; + +- if (bad_pcm_state(pcm, P_STATE_RUNNABLE)) +- return -EBADFD; ++ err = bad_pcm_state(pcm, P_STATE_RUNNABLE); ++ if (err < 0) ++ return err; + snd_pcm_lock(pcm); + result = __snd_pcm_mmap_commit(pcm, offset, frames); + snd_pcm_unlock(pcm); +@@ -7204,17 +7244,10 @@ snd_pcm_sframes_t snd_pcm_read_areas(snd_pcm_t *pcm, const snd_pcm_channel_area_ + case SND_PCM_STATE_DRAINING: + case SND_PCM_STATE_PAUSED: + break; +- case SND_PCM_STATE_XRUN: +- err = -EPIPE; +- goto _end; +- case SND_PCM_STATE_SUSPENDED: +- err = -ESTRPIPE; +- goto _end; +- case SND_PCM_STATE_DISCONNECTED: +- err = -ENODEV; +- goto _end; + default: +- err = -EBADFD; ++ err = pcm_state_to_error(state); ++ if (!err) ++ err = -EBADFD; + goto _end; + } + avail = __snd_pcm_avail_update(pcm); +@@ -7280,17 +7313,10 @@ snd_pcm_sframes_t snd_pcm_write_areas(snd_pcm_t *pcm, const snd_pcm_channel_area + if (err < 0) + goto _end; + break; +- case SND_PCM_STATE_XRUN: +- err = -EPIPE; +- goto _end; +- case SND_PCM_STATE_SUSPENDED: +- err = -ESTRPIPE; +- goto _end; +- case SND_PCM_STATE_DISCONNECTED: +- err = -ENODEV; +- goto _end; + default: +- err = -EBADFD; ++ err = pcm_state_to_error(state); ++ if (!err) ++ err = -EBADFD; + goto _end; + } + avail = __snd_pcm_avail_update(pcm); +-- +2.15.1 + diff --git a/alsa.changes b/alsa.changes index f4ac010..d510f72 100644 --- a/alsa.changes +++ b/alsa.changes @@ -1,3 +1,12 @@ +------------------------------------------------------------------- +Thu Jan 18 12:26:08 CET 2018 - tiwai@suse.de + +- Upstream fixes: + * Add the new ucm for Cherrytrail devices (bsc#1068546): + 0005-conf-ucm-Add-chtrt5645-mono-speaker-analog-mic-confi.patch + * Fix for error code from PCM API functions at unexpected states: + 0006-pcm-Return-the-consistent-error-code-for-unexpected-.patch + ------------------------------------------------------------------- Tue Dec 19 08:12:02 CET 2017 - tiwai@suse.de diff --git a/alsa.spec b/alsa.spec index 3225930..27a1f6f 100644 --- a/alsa.spec +++ b/alsa.spec @@ -1,7 +1,7 @@ # # spec file for package alsa # -# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -54,6 +54,8 @@ Patch1: 0001-pcm-route-Fix-use_getput-flag-computation-for-3-byte.patch Patch2: 0002-conf-ucm-Rearrange-Makefile.am.patch Patch3: 0003-conf-ucm-Add-dual-HD-audio-codecs-config-for-Lenovo.patch Patch4: 0004-conf-ucm-Add-Gigabyte-mobo-UCM-profile-with-dual-HD-.patch +Patch5: 0005-conf-ucm-Add-chtrt5645-mono-speaker-analog-mic-confi.patch +Patch6: 0006-pcm-Return-the-consistent-error-code-for-unexpected-.patch # rest suse fixes Source101: chtcx2072x.conf Source102: chtcx2072x-HiFi.conf @@ -123,6 +125,8 @@ Architecture. %patch2 -p1 %patch3 -p1 %patch4 -p1 +%patch5 -p1 +%patch6 -p1 %build export AUTOMAKE_JOBS="%{?_smp_mflags}"