Message ID | 20250307135244.100443-4-francesco@dolcini.it (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | ASoC: wm8904: Add DMIC and DRC support | expand |
On Fri, Mar 07, 2025 at 02:52:42PM +0100, Francesco Dolcini wrote: > From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com> > > Add two properties to select the IN1L/DMICDAT1 and IN2R/DMICDAT2 > functionality: > - wlf,in1l-as-dmicdat1 > - wlf,in1r-as-dmicdat2 > > Add a property to describe the GPIO configuration registers, that can be > used to set the four multifunction pins: > - wlf,gpio-cfg > > Add a property to describe the mic bias control registers: > - wlf,mic-cfg > > Add two properties to describe the Dynamic Range Controller (DRC), > allowing multiple named configurations where each config sets the 4 DRC > registers (R40-R43): > - wlf,drc-cfg-regs > - wlf,drc-cfg-names > > Add three properties to describe the equalizer (ReTune Mobile), allowing > multiple named configurations (associated with a samplerate) that set > the 24 (R134-R157) EQ registers: > - wlf,retune-mobile-cfg-regs > - wlf,retune-mobile-cfg-hz > - wlf,retune-mobile-cfg-rates > > Datasheet: https://statics.cirrus.com/pubs/proDatasheet/WM8904_Rev4.1.pdf > Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com> > Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com> > Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com> > --- > v3: v2 did not pass dt_binding_check, this is now fixed. > Fixed a DT compilation error by moving a misplaced closing bracket. > Changed 'retune-mobile-cfg-names' to be a nonunique-string-array. > Renamed 'retune-mobile-cfg-rates' to 'retune-mobile-cfg-hz', > dropped the 'ref' because it is now a standard unit suffix prop. > Redid line wrapping to be compliant with the DTS style guidelines. > v2: Added an example of how to use the ReTune Mobile config properties > v1: https://lore.kernel.org/lkml/20250206163152.423199-4-francesco@dolcini.it/ > --- > .../devicetree/bindings/sound/wlf,wm8904.yaml | 116 ++++++++++++++++++ > 1 file changed, 116 insertions(+) > > diff --git a/Documentation/devicetree/bindings/sound/wlf,wm8904.yaml b/Documentation/devicetree/bindings/sound/wlf,wm8904.yaml > index 329260cf0fa0..4ad8681cb266 100644 > --- a/Documentation/devicetree/bindings/sound/wlf,wm8904.yaml > +++ b/Documentation/devicetree/bindings/sound/wlf,wm8904.yaml > @@ -38,6 +38,72 @@ properties: > DCVDD-supply: true > MICVDD-supply: true > > + wlf,in1l-as-dmicdat1: > + type: boolean > + description: > + Use IN1L/DMICDAT1 as DMICDAT1, enabling the DMIC input path. > + > + wlf,in1r-as-dmicdat2: > + type: boolean > + description: > + Use IN1R/DMICDAT2 as DMICDAT2, enabling the DMIC input path. Are these two properties mutually exclusive? > + > + wlf,gpio-cfg: > + $ref: /schemas/types.yaml#/definitions/uint32-array > + minItems: 4 > + maxItems: 4 > + description: > + Default register values for R121/122/123/124 (GPIO Control). > + If any entry has the value 0xFFFF, the related register won't be set. > + default: [0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF] > + > + wlf,mic-cfg: > + $ref: /schemas/types.yaml#/definitions/uint32-array > + minItems: 2 > + maxItems: 2 > + description: > + Default register values for R6/R7 (Mic Bias Control). > + default: [0, 0] > + > + wlf,drc-cfg-names: > + $ref: /schemas/types.yaml#/definitions/string-array No constraints, so I assume you can have here any number of items? > + description: > + List of strings for the available DRC modes. Why the actual names are not defined? Why do you need this property if they are not defined (thus driver does not request this by the name)? > + If absent, DRC is disabled. > + > + wlf,drc-cfg-regs: > + $ref: /schemas/types.yaml#/definitions/uint16-array > + description: > + Default register values for R40/41/42/43 (DRC). > + The list must be 4 times the length of wlf,drc-cfg-names. > + If absent, DRC is disabled. > + > + wlf,retune-mobile-cfg-names: > + $ref: /schemas/types.yaml#/definitions/non-unique-string-array > + description: > + List of strings for the available retune modes. > + If absent, retune is disabled. > + > + wlf,retune-mobile-cfg-hz: > + description: > + The list must be the same length as wlf,retune-mobile-cfg-names. > + If absent, retune is disabled. > + > + wlf,retune-mobile-cfg-regs: > + $ref: /schemas/types.yaml#/definitions/uint16-array > + description: > + Default register values for R134/.../157 (EQ). > + The list must be 24 times the length of wlf,retune-mobile-cfg-names. > + If absent, retune is disabled. > + > +dependencies: > + wlf,drc-cfg-names: [ 'wlf,drc-cfg-regs' ] > + wlf,drc-cfg-regs: [ 'wlf,drc-cfg-names' ] > + > + wlf,retune-mobile-cfg-names: [ 'wlf,retune-mobile-cfg-hz', 'wlf,retune-mobile-cfg-regs' ] > + wlf,retune-mobile-cfg-regs: [ 'wlf,retune-mobile-cfg-names', 'wlf,retune-mobile-cfg-hz' ] > + wlf,retune-mobile-cfg-hz: [ 'wlf,retune-mobile-cfg-names', 'wlf,retune-mobile-cfg-regs' ] > + > required: > - compatible > - reg > @@ -70,5 +136,55 @@ examples: > DBVDD-supply = <®_1p8v>; > DCVDD-supply = <®_1p8v>; > MICVDD-supply = <®_1p8v>; > + > + wlf,drc-cfg-names = "default", "peaklimiter", "tradition", "soft", > + "music"; > + /* > + * Config registers per name, respectively: > + * KNEE_IP = 0, KNEE_OP = 0, HI_COMP = 1, LO_COMP = 1 > + * KNEE_IP = -24, KNEE_OP = -6, HI_COMP = 1/4, LO_COMP = 1 > + * KNEE_IP = -42, KNEE_OP = -3, HI_COMP = 0, LO_COMP = 1 > + * KNEE_IP = -45, KNEE_OP = -9, HI_COMP = 1/8, LO_COMP = 1 > + * KNEE_IP = -30, KNEE_OP = -10.5, HI_COMP = 1/4, LO_COMP = 1 > + */ > + wlf,drc-cfg-regs = /bits/ 16 <0x01af 0x3248 0x0000 0x0000>, <number>, <number>, <number> ... unless you wanted 64-bit? > + /bits/ 16 <0x04af 0x324b 0x0010 0x0408>, > + /bits/ 16 <0x04af 0x324b 0x0028 0x0704>, > + /bits/ 16 <0x04af 0x324b 0x0018 0x078c>, > + /bits/ 16 <0x04af 0x324b 0x0010 0x050e>; > + > + /* GPIO1 = DMIC_CLK, don't touch others */ > + wlf,gpio-cfg = <0x0018 0xffff 0xffff 0xffff>; So how many items here? > + > + wlf,retune-mobile-cfg-names = "bassboost", "bassboost", "treble"; > + wlf,retune-mobile-cfg-hz = <48000 44100 48000>; > + /* > + * Config registers per name, respectively: > + * EQ_ENA, 100 Hz, 300 Hz, 875 Hz, 2400 Hz, 6900 Hz > + * 1, +6 dB, +3 dB, 0 dB, 0 dB, 0 dB > + * 1, +6 dB, +3 dB, 0 dB, 0 dB, 0 dB > + * 1, -2 dB, -2 dB, 0 dB, 0 dB, +3 dB > + * Each one uses the defaults for ReTune Mobile registers 140-157 > + */ > + wlf,retune-mobile-cfg-regs = /bits/ 16 <0x1 0x12 0xf 0xc 0xc 0xc>, > + /bits/ 16 <0x0fca 0x0400 0x00d8 0x1eb5 > + 0xf145 0x0bd5 0x0075 0x1c58 > + 0xf3d3 0x0a54 0x0568 0x168e > + 0xf829 0x07ad 0x1103 0x0564 > + 0x0559 0x4000>, I am really confused what are the matrix bounds here. > + > + /bits/ 16 <0x1 0x12 0xf 0xc 0xc 0xc>, > + /bits/ 16 <0x0fca 0x0400 0x00d8 0x1eb5 > + 0xf145 0x0bd5 0x0075 0x1c58 > + 0xf3d3 0x0a54 0x0568 0x168e > + 0xf829 0x07ad 0x1103 0x0564 > + 0x0559 0x4000>, Best regards, Krzysztof
On Tue, Mar 11, 2025 at 09:42:45AM +0100, Krzysztof Kozlowski wrote: > On Fri, Mar 07, 2025 at 02:52:42PM +0100, Francesco Dolcini wrote: > > + wlf,in1l-as-dmicdat1: > > + type: boolean > > + description: > > + Use IN1L/DMICDAT1 as DMICDAT1, enabling the DMIC input path. > > + wlf,in1r-as-dmicdat2: > > + type: boolean > > + description: > > + Use IN1R/DMICDAT2 as DMICDAT2, enabling the DMIC input path. > Are these two properties mutually exclusive? No, it's one property each for the left and right channels. > > + wlf,drc-cfg-names: > > + $ref: /schemas/types.yaml#/definitions/string-array > No constraints, so I assume you can have here any number of items? Yes. > > + description: > > + List of strings for the available DRC modes. > Why the actual names are not defined? Why do you need this property if > they are not defined (thus driver does not request this by the name)? The driver displays the list of names to the end user for them to choose between.
On Tue, Mar 11, 2025 at 09:42:45AM +0100, Krzysztof Kozlowski wrote: > On Fri, Mar 07, 2025 at 02:52:42PM +0100, Francesco Dolcini wrote: > > From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com> > > > > Add two properties to select the IN1L/DMICDAT1 and IN2R/DMICDAT2 > > functionality: > > - wlf,in1l-as-dmicdat1 > > - wlf,in1r-as-dmicdat2 > > > > Add a property to describe the GPIO configuration registers, that can be > > used to set the four multifunction pins: > > - wlf,gpio-cfg > > > > Add a property to describe the mic bias control registers: > > - wlf,mic-cfg > > > > Add two properties to describe the Dynamic Range Controller (DRC), > > allowing multiple named configurations where each config sets the 4 DRC > > registers (R40-R43): > > - wlf,drc-cfg-regs > > - wlf,drc-cfg-names > > > > Add three properties to describe the equalizer (ReTune Mobile), allowing > > multiple named configurations (associated with a samplerate) that set > > the 24 (R134-R157) EQ registers: > > - wlf,retune-mobile-cfg-regs > > - wlf,retune-mobile-cfg-hz > > - wlf,retune-mobile-cfg-rates > > + * Config registers per name, respectively: > > + * KNEE_IP = 0, KNEE_OP = 0, HI_COMP = 1, LO_COMP = 1 > > + * KNEE_IP = -24, KNEE_OP = -6, HI_COMP = 1/4, LO_COMP = 1 > > + * KNEE_IP = -42, KNEE_OP = -3, HI_COMP = 0, LO_COMP = 1 > > + * KNEE_IP = -45, KNEE_OP = -9, HI_COMP = 1/8, LO_COMP = 1 > > + * KNEE_IP = -30, KNEE_OP = -10.5, HI_COMP = 1/4, LO_COMP = 1 > > + */ > > + wlf,drc-cfg-regs = /bits/ 16 <0x01af 0x3248 0x0000 0x0000>, > > <number>, <number>, <number> ... > > unless you wanted 64-bit? Why? You would need "/bits/ 16 <number>, /bits/ 16 <number>, ..." Rob
diff --git a/Documentation/devicetree/bindings/sound/wlf,wm8904.yaml b/Documentation/devicetree/bindings/sound/wlf,wm8904.yaml index 329260cf0fa0..4ad8681cb266 100644 --- a/Documentation/devicetree/bindings/sound/wlf,wm8904.yaml +++ b/Documentation/devicetree/bindings/sound/wlf,wm8904.yaml @@ -38,6 +38,72 @@ properties: DCVDD-supply: true MICVDD-supply: true + wlf,in1l-as-dmicdat1: + type: boolean + description: + Use IN1L/DMICDAT1 as DMICDAT1, enabling the DMIC input path. + + wlf,in1r-as-dmicdat2: + type: boolean + description: + Use IN1R/DMICDAT2 as DMICDAT2, enabling the DMIC input path. + + wlf,gpio-cfg: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 4 + maxItems: 4 + description: + Default register values for R121/122/123/124 (GPIO Control). + If any entry has the value 0xFFFF, the related register won't be set. + default: [0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF] + + wlf,mic-cfg: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 2 + maxItems: 2 + description: + Default register values for R6/R7 (Mic Bias Control). + default: [0, 0] + + wlf,drc-cfg-names: + $ref: /schemas/types.yaml#/definitions/string-array + description: + List of strings for the available DRC modes. + If absent, DRC is disabled. + + wlf,drc-cfg-regs: + $ref: /schemas/types.yaml#/definitions/uint16-array + description: + Default register values for R40/41/42/43 (DRC). + The list must be 4 times the length of wlf,drc-cfg-names. + If absent, DRC is disabled. + + wlf,retune-mobile-cfg-names: + $ref: /schemas/types.yaml#/definitions/non-unique-string-array + description: + List of strings for the available retune modes. + If absent, retune is disabled. + + wlf,retune-mobile-cfg-hz: + description: + The list must be the same length as wlf,retune-mobile-cfg-names. + If absent, retune is disabled. + + wlf,retune-mobile-cfg-regs: + $ref: /schemas/types.yaml#/definitions/uint16-array + description: + Default register values for R134/.../157 (EQ). + The list must be 24 times the length of wlf,retune-mobile-cfg-names. + If absent, retune is disabled. + +dependencies: + wlf,drc-cfg-names: [ 'wlf,drc-cfg-regs' ] + wlf,drc-cfg-regs: [ 'wlf,drc-cfg-names' ] + + wlf,retune-mobile-cfg-names: [ 'wlf,retune-mobile-cfg-hz', 'wlf,retune-mobile-cfg-regs' ] + wlf,retune-mobile-cfg-regs: [ 'wlf,retune-mobile-cfg-names', 'wlf,retune-mobile-cfg-hz' ] + wlf,retune-mobile-cfg-hz: [ 'wlf,retune-mobile-cfg-names', 'wlf,retune-mobile-cfg-regs' ] + required: - compatible - reg @@ -70,5 +136,55 @@ examples: DBVDD-supply = <®_1p8v>; DCVDD-supply = <®_1p8v>; MICVDD-supply = <®_1p8v>; + + wlf,drc-cfg-names = "default", "peaklimiter", "tradition", "soft", + "music"; + /* + * Config registers per name, respectively: + * KNEE_IP = 0, KNEE_OP = 0, HI_COMP = 1, LO_COMP = 1 + * KNEE_IP = -24, KNEE_OP = -6, HI_COMP = 1/4, LO_COMP = 1 + * KNEE_IP = -42, KNEE_OP = -3, HI_COMP = 0, LO_COMP = 1 + * KNEE_IP = -45, KNEE_OP = -9, HI_COMP = 1/8, LO_COMP = 1 + * KNEE_IP = -30, KNEE_OP = -10.5, HI_COMP = 1/4, LO_COMP = 1 + */ + wlf,drc-cfg-regs = /bits/ 16 <0x01af 0x3248 0x0000 0x0000>, + /bits/ 16 <0x04af 0x324b 0x0010 0x0408>, + /bits/ 16 <0x04af 0x324b 0x0028 0x0704>, + /bits/ 16 <0x04af 0x324b 0x0018 0x078c>, + /bits/ 16 <0x04af 0x324b 0x0010 0x050e>; + + /* GPIO1 = DMIC_CLK, don't touch others */ + wlf,gpio-cfg = <0x0018 0xffff 0xffff 0xffff>; + + wlf,retune-mobile-cfg-names = "bassboost", "bassboost", "treble"; + wlf,retune-mobile-cfg-hz = <48000 44100 48000>; + /* + * Config registers per name, respectively: + * EQ_ENA, 100 Hz, 300 Hz, 875 Hz, 2400 Hz, 6900 Hz + * 1, +6 dB, +3 dB, 0 dB, 0 dB, 0 dB + * 1, +6 dB, +3 dB, 0 dB, 0 dB, 0 dB + * 1, -2 dB, -2 dB, 0 dB, 0 dB, +3 dB + * Each one uses the defaults for ReTune Mobile registers 140-157 + */ + wlf,retune-mobile-cfg-regs = /bits/ 16 <0x1 0x12 0xf 0xc 0xc 0xc>, + /bits/ 16 <0x0fca 0x0400 0x00d8 0x1eb5 + 0xf145 0x0bd5 0x0075 0x1c58 + 0xf3d3 0x0a54 0x0568 0x168e + 0xf829 0x07ad 0x1103 0x0564 + 0x0559 0x4000>, + + /bits/ 16 <0x1 0x12 0xf 0xc 0xc 0xc>, + /bits/ 16 <0x0fca 0x0400 0x00d8 0x1eb5 + 0xf145 0x0bd5 0x0075 0x1c58 + 0xf3d3 0x0a54 0x0568 0x168e + 0xf829 0x07ad 0x1103 0x0564 + 0x0559 0x4000>, + + /bits/ 16 <0x1 0xa 0xa 0xc 0xc 0xf>, + /bits/ 16 <0x0fca 0x0400 0x00d8 0x1eb5 + 0xf145 0x0bd5 0x0075 0x1c58 + 0xf3d3 0x0a54 0x0568 0x168e + 0xf829 0x07ad 0x1103 0x0564 + 0x0559 0x4000>; }; };