diff mbox

[RFC] ARM: dts: bcm283x: Fix probing of bcm2835-i2s

Message ID 20171120131815.2oaa7mvksi2h5bip@camel2.lan (mailing list archive)
State New, archived
Headers show

Commit Message

Matthias Reichl Nov. 20, 2017, 1:18 p.m. UTC
Hi Stefan!

On Sun, Nov 19, 2017 at 06:00:27PM +0100, Stefan Wahren wrote:
> Since 517e7a1537a ("ASoC: bcm2835: move to use the clock framework")
> the bcm2835-i2s requires a clock as DT property. Unfortunately
> the necessary DT change has never been applied. While we are at it
> also fix the first PCM register range to cover the PCM_GRAY register.
> 
> This patch also fixes the dt-bindings accordlingly.
> 
> Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
> ---
>  Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.txt   | 4 ++--
>  Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt | 9 ++++-----
>  arch/arm/boot/dts/bcm283x.dtsi                               | 4 ++--
>  3 files changed, 8 insertions(+), 9 deletions(-)
> 
> Hi, this is only probe tested with a RPi 1B. I don't have the sound hardware
> to test the drivers function.
> 
> diff --git a/Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.txt b/Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.txt
> index baf9b34..b6a8cc0 100644
> --- a/Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.txt
> +++ b/Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.txt
> @@ -74,8 +74,8 @@ Example:
>  
>  bcm2835_i2s: i2s@7e203000 {
>  	compatible = "brcm,bcm2835-i2s";
> -	reg = <	0x7e203000 0x20>,
> -	      < 0x7e101098 0x02>;
> +	reg = <	0x7e203000 0x24>;
> +	clocks = <&clocks BCM2835_CLOCK_PCM>;
>  
>  	dmas = <&dma 2>,
>  	       <&dma 3>;
> diff --git a/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt b/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt
> index 65783de..7bb0362 100644
> --- a/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt
> +++ b/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt
> @@ -2,9 +2,8 @@
>  
>  Required properties:
>  - compatible: "brcm,bcm2835-i2s"
> -- reg: A list of base address and size entries:
> -	* The first entry should cover the PCM registers
> -	* The second entry should cover the PCM clock registers
> +- reg: Should contain PCM registers location and length.
> +- clocks: the (PCM) clock to use
>  - dmas: List of DMA controller phandle and DMA request line ordered pairs.
>  - dma-names: Identifier string for each DMA request line in the dmas property.
>    These strings correspond 1:1 with the ordered pairs in dmas.
> @@ -16,8 +15,8 @@ Example:
>  
>  bcm2835_i2s: i2s@7e203000 {
>  	compatible = "brcm,bcm2835-i2s";
> -	reg = <0x7e203000 0x20>,
> -	      <0x7e101098 0x02>;
> +	reg = <0x7e203000 0x24>;
> +	clocks = <&clocks BCM2835_CLOCK_PCM>;
>  
>  	dmas = <&dma 2>,
>  	       <&dma 3>;
> diff --git a/arch/arm/boot/dts/bcm283x.dtsi b/arch/arm/boot/dts/bcm283x.dtsi
> index 431dcfc..01733a9 100644
> --- a/arch/arm/boot/dts/bcm283x.dtsi
> +++ b/arch/arm/boot/dts/bcm283x.dtsi
> @@ -391,8 +391,8 @@
>  
>  		i2s: i2s@7e203000 {
>  			compatible = "brcm,bcm2835-i2s";
> -			reg = <0x7e203000 0x20>,
> -			      <0x7e101098 0x02>;
> +			reg = <0x7e203000 0x24>;
> +			clocks = <&clocks BCM2835_CLOCK_PCM>;
>  
>  			dmas = <&dma 2>,
>  			       <&dma 3>;
> -- 

Thanks a lot for fixing the DT and binding docs, the register range
and clock changes look fine to me.

While testing with a simple card DT overlay I noticed another
issue: the i2s node is missing the #sound-dai-cells property
and simple card refuses to load because of that:

[    0.956912] OF: /sound/simple-audio-card,cpu: could not get #sound-dai-cells for /soc/i2s@7e203000

As bcm2835-i2s has only a single DAI I think that property should
be set to 0:

With this additional change I could successfully test the following
overlay with a PCM5102 codec attached to a RPi B+:

/dts-v1/;
/plugin/;

/ {
    compatible = "brcm,bcm2835";

    fragment@0 {
        target = <&i2s>;
        __overlay__ {
            status = "okay";
        };
    };

    fragment@1 {
        target-path = "/";
        __overlay__ {
            spdif_codec: spdif-transmitter {
                #address-cells = <0>;
                #size-cells = <0>;
                #sound-dai-cells = <0>;
                compatible = "linux,spdif-dit";
            };

            sound {
                compatible = "simple-audio-card";
                simple-audio-card,name = "simple";
                simple-audio-card,format = "i2s";
                simple-audio-card,bitclock-master = <&dailink_master>;
                simple-audio-card,frame-master = <&dailink_master>;

                dailink_master: simple-audio-card,cpu {
                        sound-dai = <&i2s>;
                };

                simple-audio-card,codec {
                        sound-dai = <&spdif_codec>;
                };
            };
        };
    };
};

BTW: this overlay will work without any hardware attached, you
just need to enable SND_SIMPLE_CARD and SND_SOC_SPDIF (which
serves as a generic codec) in your config.

so long,

Hias

Comments

Stefan Wahren Nov. 20, 2017, 8:24 p.m. UTC | #1
Hi Hias,

> Matthias Reichl <hias@horus.com> hat am 20. November 2017 um 14:18 geschrieben:
> 
> 
> Hi Stefan!
> 
> On Sun, Nov 19, 2017 at 06:00:27PM +0100, Stefan Wahren wrote:
> ...
> 
> Thanks a lot for fixing the DT and binding docs, the register range
> and clock changes look fine to me.

after writing the patch i noticed that Martin Sperl wrote a very similiar patch back last year.

> 
> While testing with a simple card DT overlay I noticed another
> issue: the i2s node is missing the #sound-dai-cells property
> and simple card refuses to load because of that:
> 
> [    0.956912] OF: /sound/simple-audio-card,cpu: could not get #sound-dai-cells for /soc/i2s@7e203000

This should be a separate patch. Could you please send a proper one after this has been applied?

> 
> As bcm2835-i2s has only a single DAI I think that property should
> be set to 0:
> 
> diff --git a/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt b/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt
> index 7bb0362828ec..7349f22bed1b 100644
> --- a/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt
> +++ b/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt
> @@ -7,6 +7,7 @@ Required properties:
>  - dmas: List of DMA controller phandle and DMA request line ordered pairs.
>  - dma-names: Identifier string for each DMA request line in the dmas property.
>    These strings correspond 1:1 with the ordered pairs in dmas.
> +- #sound-dai-cells: Must be set to 0.

I'm not sure about the property description, but i think there should be a reference to the simple card binding.

>  
>    One of the DMA channels will be responsible for transmission (should be
>    named "tx") and one for reception (should be named "rx").
> @@ -21,4 +22,5 @@ bcm2835_i2s: i2s@7e203000 {
>  	dmas = <&dma 2>,
>  	       <&dma 3>;
>  	dma-names = "tx", "rx";
> +	#sound-dai-cells = <0>;
>  };
> diff --git a/arch/arm/boot/dts/bcm283x.dtsi b/arch/arm/boot/dts/bcm283x.dtsi
> index e08203c1d74a..bbe890d4dbb5 100644
> --- a/arch/arm/boot/dts/bcm283x.dtsi
> +++ b/arch/arm/boot/dts/bcm283x.dtsi
> @@ -402,6 +402,7 @@
>  			dmas = <&dma 2>,
>  			       <&dma 3>;
>  			dma-names = "tx", "rx";
> +			#sound-dai-cells = <0>;
>  			status = "disabled";
>  		};
> 
> With this additional change I could successfully test the following
> overlay with a PCM5102 codec attached to a RPi B+:
> 
> /dts-v1/;
> /plugin/;
> 
> / {
>     compatible = "brcm,bcm2835";
> 
>     fragment@0 {
>         target = <&i2s>;
>         __overlay__ {
>             status = "okay";
>         };
>     };
> 
>     fragment@1 {
>         target-path = "/";
>         __overlay__ {
>             spdif_codec: spdif-transmitter {
>                 #address-cells = <0>;
>                 #size-cells = <0>;
>                 #sound-dai-cells = <0>;
>                 compatible = "linux,spdif-dit";
>             };
> 
>             sound {
>                 compatible = "simple-audio-card";
>                 simple-audio-card,name = "simple";
>                 simple-audio-card,format = "i2s";
>                 simple-audio-card,bitclock-master = <&dailink_master>;
>                 simple-audio-card,frame-master = <&dailink_master>;
> 
>                 dailink_master: simple-audio-card,cpu {
>                         sound-dai = <&i2s>;
>                 };
> 
>                 simple-audio-card,codec {
>                         sound-dai = <&spdif_codec>;
>                 };
>             };
>         };
>     };
> };
> 
> BTW: this overlay will work without any hardware attached, you
> just need to enable SND_SIMPLE_CARD and SND_SOC_SPDIF (which
> serves as a generic codec) in your config.

Do you think it should be included in bcm2835_defconfig?

> 
> so long,
> 
> Hias
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Matthias Reichl Nov. 21, 2017, 7:58 p.m. UTC | #2
Hi Stefan,

On Mon, Nov 20, 2017 at 09:24:29PM +0100, Stefan Wahren wrote:
> > Matthias Reichl <hias@horus.com> hat am 20. November 2017 um 14:18 geschrieben:
> > 
> > While testing with a simple card DT overlay I noticed another
> > issue: the i2s node is missing the #sound-dai-cells property
> > and simple card refuses to load because of that:
> > 
> > [    0.956912] OF: /sound/simple-audio-card,cpu: could not get #sound-dai-cells for /soc/i2s@7e203000
> 
> This should be a separate patch. Could you please send a proper one after this has been applied?

Sure, will do that.

> > As bcm2835-i2s has only a single DAI I think that property should
> > be set to 0:
> > 
> > diff --git a/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt b/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt
> > index 7bb0362828ec..7349f22bed1b 100644
> > --- a/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt
> > +++ b/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt
> > @@ -7,6 +7,7 @@ Required properties:
> >  - dmas: List of DMA controller phandle and DMA request line ordered pairs.
> >  - dma-names: Identifier string for each DMA request line in the dmas property.
> >    These strings correspond 1:1 with the ordered pairs in dmas.
> > +- #sound-dai-cells: Must be set to 0.
> 
> I'm not sure about the property description, but i think there should be a reference to the simple card binding.

Description of #sound-dai-cells in the other binding docs is equally
minimal - but I think I'll reword it to "Must be equal to 0" to
match it the majority of other docs.

> > With this additional change I could successfully test the following
> > overlay with a PCM5102 codec attached to a RPi B+:
> > 
> > /dts-v1/;
> > /plugin/;
> > 
> > / {
> >     compatible = "brcm,bcm2835";
> > 
> >     fragment@0 {
> >         target = <&i2s>;
> >         __overlay__ {
> >             status = "okay";
> >         };
> >     };
> > 
> >     fragment@1 {
> >         target-path = "/";
> >         __overlay__ {
> >             spdif_codec: spdif-transmitter {
> >                 #address-cells = <0>;
> >                 #size-cells = <0>;
> >                 #sound-dai-cells = <0>;
> >                 compatible = "linux,spdif-dit";
> >             };
> > 
> >             sound {
> >                 compatible = "simple-audio-card";
> >                 simple-audio-card,name = "simple";
> >                 simple-audio-card,format = "i2s";
> >                 simple-audio-card,bitclock-master = <&dailink_master>;
> >                 simple-audio-card,frame-master = <&dailink_master>;
> > 
> >                 dailink_master: simple-audio-card,cpu {
> >                         sound-dai = <&i2s>;
> >                 };
> > 
> >                 simple-audio-card,codec {
> >                         sound-dai = <&spdif_codec>;
> >                 };
> >             };
> >         };
> >     };
> > };
> > 
> > BTW: this overlay will work without any hardware attached, you
> > just need to enable SND_SIMPLE_CARD and SND_SOC_SPDIF (which
> > serves as a generic codec) in your config.
> 
> Do you think it should be included in bcm2835_defconfig?

I think we can keep defconfig as it is. Most of the time one has
to enable the "real" codec drivers anyways and when you're already
changing the config you can enable the simple or audio graph card
driver, too.

so long,

Hias
Stefan Wahren Nov. 21, 2017, 8:28 p.m. UTC | #3
Hi Hias,

> Matthias Reichl <hias@horus.com> hat am 21. November 2017 um 20:58 geschrieben:
> 
> 
> Hi Stefan,
> 
> On Mon, Nov 20, 2017 at 09:24:29PM +0100, Stefan Wahren wrote:
> > > Matthias Reichl <hias@horus.com> hat am 20. November 2017 um 14:18 geschrieben:
> > > 
> > > While testing with a simple card DT overlay I noticed another
> > > issue: the i2s node is missing the #sound-dai-cells property
> > > and simple card refuses to load because of that:
> > > 
> > > [    0.956912] OF: /sound/simple-audio-card,cpu: could not get #sound-dai-cells for /soc/i2s@7e203000
> > 
> > This should be a separate patch. Could you please send a proper one after this has been applied?
> 
> Sure, will do that.

Great. Can i assume your Tested-by for my patch?
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt b/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt
index 7bb0362828ec..7349f22bed1b 100644
--- a/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt
+++ b/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt
@@ -7,6 +7,7 @@  Required properties:
 - dmas: List of DMA controller phandle and DMA request line ordered pairs.
 - dma-names: Identifier string for each DMA request line in the dmas property.
   These strings correspond 1:1 with the ordered pairs in dmas.
+- #sound-dai-cells: Must be set to 0.
 
   One of the DMA channels will be responsible for transmission (should be
   named "tx") and one for reception (should be named "rx").
@@ -21,4 +22,5 @@  bcm2835_i2s: i2s@7e203000 {
 	dmas = <&dma 2>,
 	       <&dma 3>;
 	dma-names = "tx", "rx";
+	#sound-dai-cells = <0>;
 };
diff --git a/arch/arm/boot/dts/bcm283x.dtsi b/arch/arm/boot/dts/bcm283x.dtsi
index e08203c1d74a..bbe890d4dbb5 100644
--- a/arch/arm/boot/dts/bcm283x.dtsi
+++ b/arch/arm/boot/dts/bcm283x.dtsi
@@ -402,6 +402,7 @@ 
 			dmas = <&dma 2>,
 			       <&dma 3>;
 			dma-names = "tx", "rx";
+			#sound-dai-cells = <0>;
 			status = "disabled";
 		};