diff mbox

No sound captured with SGTL5000 on i.MX6 in I²S master mode

Message ID CAOMZO5CReW7-8L7zx=z1TshwJSzcfGThCjws7fTfbZJKCnCZLg@mail.gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Fabio Estevam Sept. 18, 2014, 1:30 p.m. UTC
Hi Jean-Michel,

On Thu, Sep 18, 2014 at 9:56 AM, Jean-Michel Hautbois
<jean-michel.hautbois@vodalys.com> wrote:
> Hi,
>
> Sorry if double posting, I have not received confirmation on
> subscription yesterday... So I try again :/.
>
> I have a custom i.MX6 board, and have a sgtl5000 connected on it. I
> would like to have it used in master mode (it is used only for audio
> capture) but I get a "pcm_read:2031: read error: Input/output error"
> when using arecord.
> I have checked my signals and I get something on I²S which seems to be good.
> I launch :
> $> arecord -f cd -Dhw:0,0 -v -V stereo
> Receive Frame Sync is 44.1KHz
> Receive Clock Signal is ~1MHz (I can be more precise if needed)
> Data Receive is present, only when arecord is launched. It stops when
> there is no capture asked.
> Both clocks are still present even when no arecord is running.
>
> This suggests, for me, that master mode is working.
> So, I don't know why I can't get any data to my arecord. Is this a
> left/right justified master mode ? Anything else ?

I am also trying to test fsl_ssi in master mode.

I am running linux-next 20140912 with the following changes to get SSI
in master mode:


,but when I do aplay I do not get any sound.

> I am wondering if I forgot something in my DT or if I need to do
> something else :
>
>     sound {
>         compatible = "fsl,imx6q-vbx3-sgtl5000",
>                  "fsl,imx-audio-sgtl5000";
>         model = "imx6q-vbx3-sgtl5000";
>         ssi-controller = <&ssi1>;
>         audio-codec = <&codec>;
>         audio-routing =
>             "LINE_IN", "Line In Jack";
>         mux-int-port = <1>;
>         mux-ext-port = <5>;
>     };
>
> &audmux {
>     pinctrl-names = "default";
>     pinctrl-0 = <&pinctrl_audmux>;
>     status = "okay";
> };
>
> &i2c2 {
>     clock-frequency = <100000>;
>     pinctrl-names = "default";
>     pinctrl-0 = <&pinctrl_i2c2>;
>     status = "okay";
>
>     codec: sgtl5000@0a {
>         compatible = "fsl,sgtl5000";
>         reg = <0x0a>;
>         clocks = <&clks 201>;
>         VDDA-supply = <&vgen6_reg>;
>         VDDIO-supply = <&vgen6_reg>;
>         sysclk = <24000000>;
>     };
> };
>
> &iomuxc {
>     pinctrl-names = "default";
>     pinctrl-0 = <&pinctrl_hog>;
>
>     imx6qdl-vbx3 {
>         pinctrl_audmux: audmuxgrp {
>             fsl,pins = <
>                 MX6QDLPAD_DISP0_DAT13__AUD5_RXFS        0x130b0
>                 MX6QDL_PAD_DISP0_DAT14__AUD5_RXC        0x130b0
>                 MX6QDL_PAD_DISP0_DAT19__AUD5_RXD        0x130b0
>             >;
>         };
> };
>
> &ssi1 {
>     status = "okay";
>     codec-handle = <&codec>;

I think this codec-handle is not needed here.

>     fsl,mode = "i2s-master";
>     fsl,ssi-asynchronous; /* Not sure about it, but does not change anything */
> };
>
> Here is the dmesg part :
> [    6.026803] sgtl5000 1-000a: sgtl5000 revision 0x11
> [    6.129380] imx-sgtl5000 sound: snd_soc_register_card failed (-517)
> [    6.248849] platform sound: Driver imx-sgtl5000 requests probe deferral
> [    6.311643] sgtl5000 1-000a: Using internal LDO instead of VDDD
> [    6.393196] imx-sgtl5000 sound: sgtl5000 <-> 2028000.ssi mapping ok
>
> And the user space commands :
> $> arecord -l
> **** List of CAPTURE Hardware Devices ****
> card 0: imx6qvbx3sgtl50 [imx6q-vbx3-sgtl5000], device 0: HiFi sgtl5000-0 []
>   Subdevices: 1/1
>   Subdevice #0: subdevice #0
>
> $> arecord -v -V stereo -fdat -D hw:0,0 somefile.wav
> Recording WAVE 'somefile.wav' : Signed 16 bit Little Endian, Rate
> 48000 Hz, Stereo
> Hardware PCM card 0 'imx6q-vbx3-sgtl5000' device 0 subdevice 0
> Its setup is:
>   stream       : CAPTURE
>   access       : RW_INTERLEAVED
>   format       : S16_LE
>   subformat    : STD
>   channels     : 2
>   rate         : 48000
>   exact rate   : 48000 (48000/1)
>   msbits       : 16
>   buffer_size  : 16384
>   period_size  : 4096
>   period_time  : 85333
>   tstamp_mode  : NONE
>   period_step  : 1
>   avail_min    : 4096
>   period_event : 0
>   start_threshold  : 1
>   stop_threshold   : 16384
>   silence_threshold: 0
>   silence_size : 0
>   boundary     : 1073741824
>   appl_ptr     : 0
>   hw_ptr       : 0
> arecord: pcm_read:2031: read error: Input/output error
>
> The kernel is 3.17-rc5.
>
> Thanks for reading all this, and for any advice :).

I am adding some more folks in Cc in case they have some suggestions.

Regards,

Fabio Estevam

Comments

Michael Nazzareno Trimarchi Sept. 18, 2014, 1:35 p.m. UTC | #1
Hi

On Thu, Sep 18, 2014 at 3:30 PM, Fabio Estevam <festevam@gmail.com> wrote:
> Hi Jean-Michel,
>
> On Thu, Sep 18, 2014 at 9:56 AM, Jean-Michel Hautbois
> <jean-michel.hautbois@vodalys.com> wrote:
>> Hi,
>>
>> Sorry if double posting, I have not received confirmation on
>> subscription yesterday... So I try again :/.
>>
>> I have a custom i.MX6 board, and have a sgtl5000 connected on it. I
>> would like to have it used in master mode (it is used only for audio
>> capture) but I get a "pcm_read:2031: read error: Input/output error"
>> when using arecord.
>> I have checked my signals and I get something on I²S which seems to be good.
>> I launch :
>> $> arecord -f cd -Dhw:0,0 -v -V stereo
>> Receive Frame Sync is 44.1KHz
>> Receive Clock Signal is ~1MHz (I can be more precise if needed)
>> Data Receive is present, only when arecord is launched. It stops when
>> there is no capture asked.
>> Both clocks are still present even when no arecord is running.
>>
>> This suggests, for me, that master mode is working.
>> So, I don't know why I can't get any data to my arecord. Is this a
>> left/right justified master mode ? Anything else ?
>

Yes, can you check if the direction of the mux-port is correct and you
are really get data.

> I am also trying to test fsl_ssi in master mode.
>
> I am running linux-next 20140912 with the following changes to get SSI
> in master mode:
>
> --- a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
> +++ b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
> @@ -532,6 +532,7 @@
>  };
>
>  &ssi2 {
> +       fsl,mode = "i2s-master";
>         status = "okay";
>  };
>
> diff --git a/sound/soc/fsl/imx-wm8962.c b/sound/soc/fsl/imx-wm8962.c
> index 3a3d17c..09ea6a5 100644
> --- a/sound/soc/fsl/imx-wm8962.c
> +++ b/sound/soc/fsl/imx-wm8962.c
> @@ -247,7 +247,7 @@ static int imx_wm8962_probe(struct platform_device *pdev)
>         data->dai.platform_of_node = ssi_np;
>         data->dai.ops = &imx_hifi_ops;
>         data->dai.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
> -                           SND_SOC_DAIFMT_CBM_CFM;
> +                           SND_SOC_DAIFMT_CBS_CFS;
>
>         data->card.dev = &pdev->dev;
>         ret = snd_soc_of_parse_card_name(&data->card, "model");
>
> ,but when I do aplay I do not get any sound.
>
>> I am wondering if I forgot something in my DT or if I need to do
>> something else :
>>
>>     sound {
>>         compatible = "fsl,imx6q-vbx3-sgtl5000",
>>                  "fsl,imx-audio-sgtl5000";
>>         model = "imx6q-vbx3-sgtl5000";
>>         ssi-controller = <&ssi1>;
>>         audio-codec = <&codec>;
>>         audio-routing =
>>             "LINE_IN", "Line In Jack";
>>         mux-int-port = <1>;
>>         mux-ext-port = <5>;
>>     };
>>
>> &audmux {
>>     pinctrl-names = "default";
>>     pinctrl-0 = <&pinctrl_audmux>;
>>     status = "okay";
>> };
>>
>> &i2c2 {
>>     clock-frequency = <100000>;
>>     pinctrl-names = "default";
>>     pinctrl-0 = <&pinctrl_i2c2>;
>>     status = "okay";
>>
>>     codec: sgtl5000@0a {
>>         compatible = "fsl,sgtl5000";
>>         reg = <0x0a>;
>>         clocks = <&clks 201>;
>>         VDDA-supply = <&vgen6_reg>;
>>         VDDIO-supply = <&vgen6_reg>;
>>         sysclk = <24000000>;
>>     };
>> };
>>
>> &iomuxc {
>>     pinctrl-names = "default";
>>     pinctrl-0 = <&pinctrl_hog>;
>>
>>     imx6qdl-vbx3 {
>>         pinctrl_audmux: audmuxgrp {
>>             fsl,pins = <
>>                 MX6QDLPAD_DISP0_DAT13__AUD5_RXFS        0x130b0
>>                 MX6QDL_PAD_DISP0_DAT14__AUD5_RXC        0x130b0
>>                 MX6QDL_PAD_DISP0_DAT19__AUD5_RXD        0x130b0
>>             >;
>>         };
>> };
>>
>> &ssi1 {
>>     status = "okay";
>>     codec-handle = <&codec>;
>
> I think this codec-handle is not needed here.
>
>>     fsl,mode = "i2s-master";
>>     fsl,ssi-asynchronous; /* Not sure about it, but does not change anything */
>> };
>>
>> Here is the dmesg part :
>> [    6.026803] sgtl5000 1-000a: sgtl5000 revision 0x11
>> [    6.129380] imx-sgtl5000 sound: snd_soc_register_card failed (-517)
>> [    6.248849] platform sound: Driver imx-sgtl5000 requests probe deferral
>> [    6.311643] sgtl5000 1-000a: Using internal LDO instead of VDDD
>> [    6.393196] imx-sgtl5000 sound: sgtl5000 <-> 2028000.ssi mapping ok
>>
>> And the user space commands :
>> $> arecord -l
>> **** List of CAPTURE Hardware Devices ****
>> card 0: imx6qvbx3sgtl50 [imx6q-vbx3-sgtl5000], device 0: HiFi sgtl5000-0 []
>>   Subdevices: 1/1
>>   Subdevice #0: subdevice #0
>>
>> $> arecord -v -V stereo -fdat -D hw:0,0 somefile.wav
>> Recording WAVE 'somefile.wav' : Signed 16 bit Little Endian, Rate
>> 48000 Hz, Stereo
>> Hardware PCM card 0 'imx6q-vbx3-sgtl5000' device 0 subdevice 0
>> Its setup is:
>>   stream       : CAPTURE
>>   access       : RW_INTERLEAVED
>>   format       : S16_LE
>>   subformat    : STD
>>   channels     : 2
>>   rate         : 48000
>>   exact rate   : 48000 (48000/1)
>>   msbits       : 16
>>   buffer_size  : 16384
>>   period_size  : 4096
>>   period_time  : 85333
>>   tstamp_mode  : NONE
>>   period_step  : 1
>>   avail_min    : 4096
>>   period_event : 0
>>   start_threshold  : 1
>>   stop_threshold   : 16384
>>   silence_threshold: 0
>>   silence_size : 0
>>   boundary     : 1073741824
>>   appl_ptr     : 0
>>   hw_ptr       : 0
>> arecord: pcm_read:2031: read error: Input/output error
>>

The clock is not get in

Michael

>> The kernel is 3.17-rc5.
>>
>> Thanks for reading all this, and for any advice :).
>
> I am adding some more folks in Cc in case they have some suggestions.
>
> Regards,
>
> Fabio Estevam
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel@alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
Jean-Michel Hautbois Sept. 18, 2014, 1:45 p.m. UTC | #2
2014-09-18 15:35 GMT+02:00 Michael Trimarchi <michael@amarulasolutions.com>:
> Hi
>
> On Thu, Sep 18, 2014 at 3:30 PM, Fabio Estevam <festevam@gmail.com> wrote:
>> Hi Jean-Michel,
>>
>> On Thu, Sep 18, 2014 at 9:56 AM, Jean-Michel Hautbois
>> <jean-michel.hautbois@vodalys.com> wrote:
>>> Hi,
>>>
>>> Sorry if double posting, I have not received confirmation on
>>> subscription yesterday... So I try again :/.
>>>
>>> I have a custom i.MX6 board, and have a sgtl5000 connected on it. I
>>> would like to have it used in master mode (it is used only for audio
>>> capture) but I get a "pcm_read:2031: read error: Input/output error"
>>> when using arecord.
>>> I have checked my signals and I get something on I²S which seems to be good.
>>> I launch :
>>> $> arecord -f cd -Dhw:0,0 -v -V stereo
>>> Receive Frame Sync is 44.1KHz
>>> Receive Clock Signal is ~1MHz (I can be more precise if needed)
>>> Data Receive is present, only when arecord is launched. It stops when
>>> there is no capture asked.
>>> Both clocks are still present even when no arecord is running.
>>>
>>> This suggests, for me, that master mode is working.
>>> So, I don't know why I can't get any data to my arecord. Is this a
>>> left/right justified master mode ? Anything else ?
>>
>
> Yes, can you check if the direction of the mux-port is correct and you
> are really get data.

Mmh, can you explain in more details, I don't get it...

>> I am also trying to test fsl_ssi in master mode.
>>
>> I am running linux-next 20140912 with the following changes to get SSI
>> in master mode:
>>
>> --- a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
>> +++ b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
>> @@ -532,6 +532,7 @@
>>  };
>>
>>  &ssi2 {
>> +       fsl,mode = "i2s-master";
>>         status = "okay";
>>  };
>>
>> diff --git a/sound/soc/fsl/imx-wm8962.c b/sound/soc/fsl/imx-wm8962.c
>> index 3a3d17c..09ea6a5 100644
>> --- a/sound/soc/fsl/imx-wm8962.c
>> +++ b/sound/soc/fsl/imx-wm8962.c
>> @@ -247,7 +247,7 @@ static int imx_wm8962_probe(struct platform_device *pdev)
>>         data->dai.platform_of_node = ssi_np;
>>         data->dai.ops = &imx_hifi_ops;
>>         data->dai.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
>> -                           SND_SOC_DAIFMT_CBM_CFM;
>> +                           SND_SOC_DAIFMT_CBS_CFS;
>>
>>         data->card.dev = &pdev->dev;
>>         ret = snd_soc_of_parse_card_name(&data->card, "model");
>>
>> ,but when I do aplay I do not get any sound.
>>
>>> I am wondering if I forgot something in my DT or if I need to do
>>> something else :
>>>
>>>     sound {
>>>         compatible = "fsl,imx6q-vbx3-sgtl5000",
>>>                  "fsl,imx-audio-sgtl5000";
>>>         model = "imx6q-vbx3-sgtl5000";
>>>         ssi-controller = <&ssi1>;
>>>         audio-codec = <&codec>;
>>>         audio-routing =
>>>             "LINE_IN", "Line In Jack";
>>>         mux-int-port = <1>;
>>>         mux-ext-port = <5>;
>>>     };
>>>
>>> &audmux {
>>>     pinctrl-names = "default";
>>>     pinctrl-0 = <&pinctrl_audmux>;
>>>     status = "okay";
>>> };
>>>
>>> &i2c2 {
>>>     clock-frequency = <100000>;
>>>     pinctrl-names = "default";
>>>     pinctrl-0 = <&pinctrl_i2c2>;
>>>     status = "okay";
>>>
>>>     codec: sgtl5000@0a {
>>>         compatible = "fsl,sgtl5000";
>>>         reg = <0x0a>;
>>>         clocks = <&clks 201>;
>>>         VDDA-supply = <&vgen6_reg>;
>>>         VDDIO-supply = <&vgen6_reg>;
>>>         sysclk = <24000000>;
>>>     };
>>> };
>>>
>>> &iomuxc {
>>>     pinctrl-names = "default";
>>>     pinctrl-0 = <&pinctrl_hog>;
>>>
>>>     imx6qdl-vbx3 {
>>>         pinctrl_audmux: audmuxgrp {
>>>             fsl,pins = <
>>>                 MX6QDLPAD_DISP0_DAT13__AUD5_RXFS        0x130b0
>>>                 MX6QDL_PAD_DISP0_DAT14__AUD5_RXC        0x130b0
>>>                 MX6QDL_PAD_DISP0_DAT19__AUD5_RXD        0x130b0
>>>             >;
>>>         };
>>> };
>>>
>>> &ssi1 {
>>>     status = "okay";
>>>     codec-handle = <&codec>;
>>
>> I think this codec-handle is not needed here.
>>
>>>     fsl,mode = "i2s-master";
>>>     fsl,ssi-asynchronous; /* Not sure about it, but does not change anything */
>>> };
>>>
>>> Here is the dmesg part :
>>> [    6.026803] sgtl5000 1-000a: sgtl5000 revision 0x11
>>> [    6.129380] imx-sgtl5000 sound: snd_soc_register_card failed (-517)
>>> [    6.248849] platform sound: Driver imx-sgtl5000 requests probe deferral
>>> [    6.311643] sgtl5000 1-000a: Using internal LDO instead of VDDD
>>> [    6.393196] imx-sgtl5000 sound: sgtl5000 <-> 2028000.ssi mapping ok
>>>
>>> And the user space commands :
>>> $> arecord -l
>>> **** List of CAPTURE Hardware Devices ****
>>> card 0: imx6qvbx3sgtl50 [imx6q-vbx3-sgtl5000], device 0: HiFi sgtl5000-0 []
>>>   Subdevices: 1/1
>>>   Subdevice #0: subdevice #0
>>>
>>> $> arecord -v -V stereo -fdat -D hw:0,0 somefile.wav
>>> Recording WAVE 'somefile.wav' : Signed 16 bit Little Endian, Rate
>>> 48000 Hz, Stereo
>>> Hardware PCM card 0 'imx6q-vbx3-sgtl5000' device 0 subdevice 0
>>> Its setup is:
>>>   stream       : CAPTURE
>>>   access       : RW_INTERLEAVED
>>>   format       : S16_LE
>>>   subformat    : STD
>>>   channels     : 2
>>>   rate         : 48000
>>>   exact rate   : 48000 (48000/1)
>>>   msbits       : 16
>>>   buffer_size  : 16384
>>>   period_size  : 4096
>>>   period_time  : 85333
>>>   tstamp_mode  : NONE
>>>   period_step  : 1
>>>   avail_min    : 4096
>>>   period_event : 0
>>>   start_threshold  : 1
>>>   stop_threshold   : 16384
>>>   silence_threshold: 0
>>>   silence_size : 0
>>>   boundary     : 1073741824
>>>   appl_ptr     : 0
>>>   hw_ptr       : 0
>>> arecord: pcm_read:2031: read error: Input/output error
>>>
>
> The clock is not get in

And what can this mean from a driver/mux perspective ?
Thanks,
JM
Michael Nazzareno Trimarchi Sept. 18, 2014, 1:55 p.m. UTC | #3
Hi

On Thu, Sep 18, 2014 at 3:45 PM, Jean-Michel Hautbois
<jean-michel.hautbois@vodalys.com> wrote:
> 2014-09-18 15:35 GMT+02:00 Michael Trimarchi <michael@amarulasolutions.com>:
>> Hi
>>
>> On Thu, Sep 18, 2014 at 3:30 PM, Fabio Estevam <festevam@gmail.com> wrote:
>>> Hi Jean-Michel,
>>>
>>> On Thu, Sep 18, 2014 at 9:56 AM, Jean-Michel Hautbois
>>> <jean-michel.hautbois@vodalys.com> wrote:
>>>> Hi,
>>>>
>>>> Sorry if double posting, I have not received confirmation on
>>>> subscription yesterday... So I try again :/.
>>>>
>>>> I have a custom i.MX6 board, and have a sgtl5000 connected on it. I
>>>> would like to have it used in master mode (it is used only for audio
>>>> capture) but I get a "pcm_read:2031: read error: Input/output error"
>>>> when using arecord.
>>>> I have checked my signals and I get something on I²S which seems to be good.
>>>> I launch :
>>>> $> arecord -f cd -Dhw:0,0 -v -V stereo
>>>> Receive Frame Sync is 44.1KHz
>>>> Receive Clock Signal is ~1MHz (I can be more precise if needed)
>>>> Data Receive is present, only when arecord is launched. It stops when
>>>> there is no capture asked.
>>>> Both clocks are still present even when no arecord is running.
>>>>
>>>> This suggests, for me, that master mode is working.
>>>> So, I don't know why I can't get any data to my arecord. Is this a
>>>> left/right justified master mode ? Anything else ?
>>>
>>
>> Yes, can you check if the direction of the mux-port is correct and you
>> are really get data.
>
> Mmh, can you explain in more details, I don't get it...
>

ssi is the peripheral that is rooted from the pins outside (audmux) and audmux
should configured according to clock direction and data direction etc. I don't
remember now is done now in the latest kernel, because I have in the
head too much architecture,
but it should be possible to dump it from sysfs how is configured. So
you need to check if it match

>>> I am also trying to test fsl_ssi in master mode.
>>>
>>> I am running linux-next 20140912 with the following changes to get SSI
>>> in master mode:
>>>
>>> --- a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
>>> +++ b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
>>> @@ -532,6 +532,7 @@
>>>  };
>>>
>>>  &ssi2 {
>>> +       fsl,mode = "i2s-master";
>>>         status = "okay";
>>>  };
>>>
>>> diff --git a/sound/soc/fsl/imx-wm8962.c b/sound/soc/fsl/imx-wm8962.c
>>> index 3a3d17c..09ea6a5 100644
>>> --- a/sound/soc/fsl/imx-wm8962.c
>>> +++ b/sound/soc/fsl/imx-wm8962.c
>>> @@ -247,7 +247,7 @@ static int imx_wm8962_probe(struct platform_device *pdev)
>>>         data->dai.platform_of_node = ssi_np;
>>>         data->dai.ops = &imx_hifi_ops;
>>>         data->dai.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
>>> -                           SND_SOC_DAIFMT_CBM_CFM;
>>> +                           SND_SOC_DAIFMT_CBS_CFS;
>>>
>>>         data->card.dev = &pdev->dev;
>>>         ret = snd_soc_of_parse_card_name(&data->card, "model");
>>>
>>> ,but when I do aplay I do not get any sound.
>>>
>>>> I am wondering if I forgot something in my DT or if I need to do
>>>> something else :
>>>>
>>>>     sound {
>>>>         compatible = "fsl,imx6q-vbx3-sgtl5000",
>>>>                  "fsl,imx-audio-sgtl5000";
>>>>         model = "imx6q-vbx3-sgtl5000";
>>>>         ssi-controller = <&ssi1>;
>>>>         audio-codec = <&codec>;
>>>>         audio-routing =
>>>>             "LINE_IN", "Line In Jack";
>>>>         mux-int-port = <1>;
>>>>         mux-ext-port = <5>;
>>>>     };
>>>>
>>>> &audmux {
>>>>     pinctrl-names = "default";
>>>>     pinctrl-0 = <&pinctrl_audmux>;
>>>>     status = "okay";
>>>> };
>>>>
>>>> &i2c2 {
>>>>     clock-frequency = <100000>;
>>>>     pinctrl-names = "default";
>>>>     pinctrl-0 = <&pinctrl_i2c2>;
>>>>     status = "okay";
>>>>
>>>>     codec: sgtl5000@0a {
>>>>         compatible = "fsl,sgtl5000";
>>>>         reg = <0x0a>;
>>>>         clocks = <&clks 201>;
>>>>         VDDA-supply = <&vgen6_reg>;
>>>>         VDDIO-supply = <&vgen6_reg>;
>>>>         sysclk = <24000000>;
>>>>     };
>>>> };
>>>>
>>>> &iomuxc {
>>>>     pinctrl-names = "default";
>>>>     pinctrl-0 = <&pinctrl_hog>;
>>>>
>>>>     imx6qdl-vbx3 {
>>>>         pinctrl_audmux: audmuxgrp {
>>>>             fsl,pins = <
>>>>                 MX6QDLPAD_DISP0_DAT13__AUD5_RXFS        0x130b0
>>>>                 MX6QDL_PAD_DISP0_DAT14__AUD5_RXC        0x130b0
>>>>                 MX6QDL_PAD_DISP0_DAT19__AUD5_RXD        0x130b0
>>>>             >;
>>>>         };
>>>> };
>>>>
>>>> &ssi1 {
>>>>     status = "okay";
>>>>     codec-handle = <&codec>;
>>>
>>> I think this codec-handle is not needed here.
>>>
>>>>     fsl,mode = "i2s-master";
>>>>     fsl,ssi-asynchronous; /* Not sure about it, but does not change anything */
>>>> };
>>>>
>>>> Here is the dmesg part :
>>>> [    6.026803] sgtl5000 1-000a: sgtl5000 revision 0x11
>>>> [    6.129380] imx-sgtl5000 sound: snd_soc_register_card failed (-517)
>>>> [    6.248849] platform sound: Driver imx-sgtl5000 requests probe deferral
>>>> [    6.311643] sgtl5000 1-000a: Using internal LDO instead of VDDD
>>>> [    6.393196] imx-sgtl5000 sound: sgtl5000 <-> 2028000.ssi mapping ok
>>>>
>>>> And the user space commands :
>>>> $> arecord -l
>>>> **** List of CAPTURE Hardware Devices ****
>>>> card 0: imx6qvbx3sgtl50 [imx6q-vbx3-sgtl5000], device 0: HiFi sgtl5000-0 []
>>>>   Subdevices: 1/1
>>>>   Subdevice #0: subdevice #0
>>>>
>>>> $> arecord -v -V stereo -fdat -D hw:0,0 somefile.wav
>>>> Recording WAVE 'somefile.wav' : Signed 16 bit Little Endian, Rate
>>>> 48000 Hz, Stereo
>>>> Hardware PCM card 0 'imx6q-vbx3-sgtl5000' device 0 subdevice 0
>>>> Its setup is:
>>>>   stream       : CAPTURE
>>>>   access       : RW_INTERLEAVED
>>>>   format       : S16_LE
>>>>   subformat    : STD
>>>>   channels     : 2
>>>>   rate         : 48000
>>>>   exact rate   : 48000 (48000/1)
>>>>   msbits       : 16
>>>>   buffer_size  : 16384
>>>>   period_size  : 4096
>>>>   period_time  : 85333
>>>>   tstamp_mode  : NONE
>>>>   period_step  : 1
>>>>   avail_min    : 4096
>>>>   period_event : 0
>>>>   start_threshold  : 1
>>>>   stop_threshold   : 16384
>>>>   silence_threshold: 0
>>>>   silence_size : 0
>>>>   boundary     : 1073741824
>>>>   appl_ptr     : 0
>>>>   hw_ptr       : 0
>>>> arecord: pcm_read:2031: read error: Input/output error
>>>>
>>
>> The clock is not get in
>
> And what can this mean from a driver/mux perspective ?

ssi <--- audmxux ---> pins (configured by pinctrl)

I forget that you see the clock out. BTW too late. What I'm trying to
said is that even if pins are configured and routed they can be routed
in the wrong direction. Right now you try to generate both clock from
the cpu and you can see them but receive path can be configured in
syncronous mode or it can work take the clock from another pin. What
is your configuration?

Michael

> Thanks,
> JM
Jean-Michel Hautbois Sept. 18, 2014, 2:09 p.m. UTC | #4
2014-09-18 15:55 GMT+02:00 Michael Trimarchi <michael@amarulasolutions.com>:
> Hi
>
> On Thu, Sep 18, 2014 at 3:45 PM, Jean-Michel Hautbois
> <jean-michel.hautbois@vodalys.com> wrote:
>> 2014-09-18 15:35 GMT+02:00 Michael Trimarchi <michael@amarulasolutions.com>:
>>> Hi
>>>
>>> On Thu, Sep 18, 2014 at 3:30 PM, Fabio Estevam <festevam@gmail.com> wrote:
>>>> Hi Jean-Michel,
>>>>
>>>> On Thu, Sep 18, 2014 at 9:56 AM, Jean-Michel Hautbois
>>>> <jean-michel.hautbois@vodalys.com> wrote:
>>>>> Hi,
>>>>>
>>>>> Sorry if double posting, I have not received confirmation on
>>>>> subscription yesterday... So I try again :/.
>>>>>
>>>>> I have a custom i.MX6 board, and have a sgtl5000 connected on it. I
>>>>> would like to have it used in master mode (it is used only for audio
>>>>> capture) but I get a "pcm_read:2031: read error: Input/output error"
>>>>> when using arecord.
>>>>> I have checked my signals and I get something on I²S which seems to be good.
>>>>> I launch :
>>>>> $> arecord -f cd -Dhw:0,0 -v -V stereo
>>>>> Receive Frame Sync is 44.1KHz
>>>>> Receive Clock Signal is ~1MHz (I can be more precise if needed)
>>>>> Data Receive is present, only when arecord is launched. It stops when
>>>>> there is no capture asked.
>>>>> Both clocks are still present even when no arecord is running.
>>>>>
>>>>> This suggests, for me, that master mode is working.
>>>>> So, I don't know why I can't get any data to my arecord. Is this a
>>>>> left/right justified master mode ? Anything else ?
>>>>
>>>
>>> Yes, can you check if the direction of the mux-port is correct and you
>>> are really get data.
>>
>> Mmh, can you explain in more details, I don't get it...
>>
>
> ssi is the peripheral that is rooted from the pins outside (audmux) and audmux
> should configured according to clock direction and data direction etc. I don't
> remember now is done now in the latest kernel, because I have in the
> head too much architecture,
> but it should be possible to dump it from sysfs how is configured. So
> you need to check if it match

OK, I will try to find out everything I can.

>>>> I am also trying to test fsl_ssi in master mode.
>>>>
>>>> I am running linux-next 20140912 with the following changes to get SSI
>>>> in master mode:
>>>>
>>>> --- a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
>>>> +++ b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
>>>> @@ -532,6 +532,7 @@
>>>>  };
>>>>
>>>>  &ssi2 {
>>>> +       fsl,mode = "i2s-master";
>>>>         status = "okay";
>>>>  };
>>>>
>>>> diff --git a/sound/soc/fsl/imx-wm8962.c b/sound/soc/fsl/imx-wm8962.c
>>>> index 3a3d17c..09ea6a5 100644
>>>> --- a/sound/soc/fsl/imx-wm8962.c
>>>> +++ b/sound/soc/fsl/imx-wm8962.c
>>>> @@ -247,7 +247,7 @@ static int imx_wm8962_probe(struct platform_device *pdev)
>>>>         data->dai.platform_of_node = ssi_np;
>>>>         data->dai.ops = &imx_hifi_ops;
>>>>         data->dai.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
>>>> -                           SND_SOC_DAIFMT_CBM_CFM;
>>>> +                           SND_SOC_DAIFMT_CBS_CFS;
>>>>
>>>>         data->card.dev = &pdev->dev;
>>>>         ret = snd_soc_of_parse_card_name(&data->card, "model");
>>>>
>>>> ,but when I do aplay I do not get any sound.
>>>>
>>>>> I am wondering if I forgot something in my DT or if I need to do
>>>>> something else :
>>>>>
>>>>>     sound {
>>>>>         compatible = "fsl,imx6q-vbx3-sgtl5000",
>>>>>                  "fsl,imx-audio-sgtl5000";
>>>>>         model = "imx6q-vbx3-sgtl5000";
>>>>>         ssi-controller = <&ssi1>;
>>>>>         audio-codec = <&codec>;
>>>>>         audio-routing =
>>>>>             "LINE_IN", "Line In Jack";
>>>>>         mux-int-port = <1>;
>>>>>         mux-ext-port = <5>;
>>>>>     };
>>>>>
>>>>> &audmux {
>>>>>     pinctrl-names = "default";
>>>>>     pinctrl-0 = <&pinctrl_audmux>;
>>>>>     status = "okay";
>>>>> };
>>>>>
>>>>> &i2c2 {
>>>>>     clock-frequency = <100000>;
>>>>>     pinctrl-names = "default";
>>>>>     pinctrl-0 = <&pinctrl_i2c2>;
>>>>>     status = "okay";
>>>>>
>>>>>     codec: sgtl5000@0a {
>>>>>         compatible = "fsl,sgtl5000";
>>>>>         reg = <0x0a>;
>>>>>         clocks = <&clks 201>;
>>>>>         VDDA-supply = <&vgen6_reg>;
>>>>>         VDDIO-supply = <&vgen6_reg>;
>>>>>         sysclk = <24000000>;
>>>>>     };
>>>>> };
>>>>>
>>>>> &iomuxc {
>>>>>     pinctrl-names = "default";
>>>>>     pinctrl-0 = <&pinctrl_hog>;
>>>>>
>>>>>     imx6qdl-vbx3 {
>>>>>         pinctrl_audmux: audmuxgrp {
>>>>>             fsl,pins = <
>>>>>                 MX6QDLPAD_DISP0_DAT13__AUD5_RXFS        0x130b0
>>>>>                 MX6QDL_PAD_DISP0_DAT14__AUD5_RXC        0x130b0
>>>>>                 MX6QDL_PAD_DISP0_DAT19__AUD5_RXD        0x130b0
>>>>>             >;
>>>>>         };
>>>>> };
>>>>>
>>>>> &ssi1 {
>>>>>     status = "okay";
>>>>>     codec-handle = <&codec>;
>>>>
>>>> I think this codec-handle is not needed here.
>>>>
>>>>>     fsl,mode = "i2s-master";
>>>>>     fsl,ssi-asynchronous; /* Not sure about it, but does not change anything */
>>>>> };
>>>>>
>>>>> Here is the dmesg part :
>>>>> [    6.026803] sgtl5000 1-000a: sgtl5000 revision 0x11
>>>>> [    6.129380] imx-sgtl5000 sound: snd_soc_register_card failed (-517)
>>>>> [    6.248849] platform sound: Driver imx-sgtl5000 requests probe deferral
>>>>> [    6.311643] sgtl5000 1-000a: Using internal LDO instead of VDDD
>>>>> [    6.393196] imx-sgtl5000 sound: sgtl5000 <-> 2028000.ssi mapping ok
>>>>>
>>>>> And the user space commands :
>>>>> $> arecord -l
>>>>> **** List of CAPTURE Hardware Devices ****
>>>>> card 0: imx6qvbx3sgtl50 [imx6q-vbx3-sgtl5000], device 0: HiFi sgtl5000-0 []
>>>>>   Subdevices: 1/1
>>>>>   Subdevice #0: subdevice #0
>>>>>
>>>>> $> arecord -v -V stereo -fdat -D hw:0,0 somefile.wav
>>>>> Recording WAVE 'somefile.wav' : Signed 16 bit Little Endian, Rate
>>>>> 48000 Hz, Stereo
>>>>> Hardware PCM card 0 'imx6q-vbx3-sgtl5000' device 0 subdevice 0
>>>>> Its setup is:
>>>>>   stream       : CAPTURE
>>>>>   access       : RW_INTERLEAVED
>>>>>   format       : S16_LE
>>>>>   subformat    : STD
>>>>>   channels     : 2
>>>>>   rate         : 48000
>>>>>   exact rate   : 48000 (48000/1)
>>>>>   msbits       : 16
>>>>>   buffer_size  : 16384
>>>>>   period_size  : 4096
>>>>>   period_time  : 85333
>>>>>   tstamp_mode  : NONE
>>>>>   period_step  : 1
>>>>>   avail_min    : 4096
>>>>>   period_event : 0
>>>>>   start_threshold  : 1
>>>>>   stop_threshold   : 16384
>>>>>   silence_threshold: 0
>>>>>   silence_size : 0
>>>>>   boundary     : 1073741824
>>>>>   appl_ptr     : 0
>>>>>   hw_ptr       : 0
>>>>> arecord: pcm_read:2031: read error: Input/output error
>>>>>
>>>
>>> The clock is not get in
>>
>> And what can this mean from a driver/mux perspective ?
>
> ssi <--- audmxux ---> pins (configured by pinctrl)
>
> I forget that you see the clock out. BTW too late. What I'm trying to
> said is that even if pins are configured and routed they can be routed
> in the wrong direction. Right now you try to generate both clock from
> the cpu and you can see them but receive path can be configured in
> syncronous mode or it can work take the clock from another pin. What
> is your configuration?

The master clock is provided by the CPU but I just found out
something. I have a FPGA between sgtl5000 and i.MX6. It is here in
order to route signals. And when imx-audmux is probed, it does not
find the clock, because the FPGA is not configured yet.
And as this driver is not returning EPROBE_DEFER, it does not try a
little bit later (when the clock will really be here).
I don't know if this is the explanation of my issue, but at least this
is an interesting catch.
I will try and get you informed.

JM
Jean-Michel Hautbois Sept. 18, 2014, 4:09 p.m. UTC | #5
<snip>

>> I forget that you see the clock out. BTW too late. What I'm trying to
>> said is that even if pins are configured and routed they can be routed
>> in the wrong direction. Right now you try to generate both clock from
>> the cpu and you can see them but receive path can be configured in
>> syncronous mode or it can work take the clock from another pin. What
>> is your configuration?
>
> The master clock is provided by the CPU but I just found out
> something. I have a FPGA between sgtl5000 and i.MX6. It is here in
> order to route signals. And when imx-audmux is probed, it does not
> find the clock, because the FPGA is not configured yet.
> And as this driver is not returning EPROBE_DEFER, it does not try a
> little bit later (when the clock will really be here).
> I don't know if this is the explanation of my issue, but at least this
> is an interesting catch.
> I will try and get you informed.

Well, audmux is not getting clock, this is normal I think, the clock I
was mentionning is the MCLK of SGTL5000 and this one is linked to
FPGA, but found after all.
I now had a further look into sound/soc/fsl/fsl_ssi.c and I see this :

    sprop = of_get_property(np, "fsl,mode", NULL);
    if (sprop) {
        if (!strcmp(sprop, "ac97-slave"))
            ssi_private->dai_fmt = SND_SOC_DAIFMT_AC97;
        else if (!strcmp(sprop, "i2s-slave"))
            ssi_private->dai_fmt = SND_SOC_DAIFMT_I2S |
                SND_SOC_DAIFMT_CBM_CFM;
    }

I may have missed something, but it seems that i2s-master is not
parsed, and does not set dai_fmt ?
Or maybe is it done later ?
I tried :
                else if (!strcmp(sprop, "i2s-slave"))
                        ssi_private->dai_fmt = SND_SOC_DAIFMT_I2S |
                                SND_SOC_DAIFMT_CBM_CFM;
+               else if (!strcmp(sprop, "i2s-master"))
+                       ssi_private->dai_fmt = SND_SOC_DAIFMT_I2S |
+                               SND_SOC_DAIFMT_CBM_CFS;
        }

But this is not better :


arecord -v -V stereo -f cd -D hw:0,0 somefile.wav
Recording WAVE 'somefile.wav' : Signed 16 bit Little Endian, Rate
44100 Hz, Stereo
Hardware PCM card 0 'imx6q-vbx3-sgtl5000' device 0 subdevice 0
Its setup is:
  stream       : CAPTURE
  access       : RW_INTERLEAVED
  format       : S16_LE
  subformat    : STD
  channels     : 2
  rate         : 44100
  exact rate   : 44100 (44100/1)
  msbits       : 16
  buffer_size  : 16384
  period_size  : 4096
  period_time  : 92879
  tstamp_mode  : NONE
  period_step  : 1
  avail_min    : 4096
  period_event : 0
  start_threshold  : 1
  stop_threshold   : 16384
  silence_threshold: 0
  silence_size : 0
  boundary     : 1073741824
  appl_ptr     : 0
  hw_ptr       : 0
arecord: pcm_read:2031: read error: Input/output error

JM
Nicolin Chen Sept. 18, 2014, 5:05 p.m. UTC | #6
On Thu, Sep 18, 2014 at 06:09:50PM +0200, Jean-Michel Hautbois wrote:
> Well, audmux is not getting clock, this is normal I think, the clock I
> was mentionning is the MCLK of SGTL5000 and this one is linked to
> FPGA, but found after all.
> I now had a further look into sound/soc/fsl/fsl_ssi.c and I see this :
> 
>     sprop = of_get_property(np, "fsl,mode", NULL);
>     if (sprop) {
>         if (!strcmp(sprop, "ac97-slave"))
>             ssi_private->dai_fmt = SND_SOC_DAIFMT_AC97;
>         else if (!strcmp(sprop, "i2s-slave"))
>             ssi_private->dai_fmt = SND_SOC_DAIFMT_I2S |
>                 SND_SOC_DAIFMT_CBM_CFM;
>     }
> 
> I may have missed something, but it seems that i2s-master is not
> parsed, and does not set dai_fmt ?

Actually this is kind of obsolete property because initially the SSI
driver only supported i2s-slave. We've put an i2s-slave check here is
to limit the driver by excluding other modes.

But now, the driver has the capability to derive clock from CCM and
output it for external CODEC. So this one could be dropped in fact
rather than adding a new i2s-master case IMO.

> arecord -v -V stereo -f cd -D hw:0,0 somefile.wav
> Recording WAVE 'somefile.wav' : Signed 16 bit Little Endian, Rate
> 44100 Hz, Stereo

> arecord: pcm_read:2031: read error: Input/output error

The problem here should be the AUDMUX configuration issue. The imx-
sgtl5000.c driver only supports CODEC in master mode. So if you try
to switch the CODEC slave mode, you shall also change not only the
CBM_CFM to CBS_CFS but also swap the ext_port and int_port of AUDMUX
(a little confusing approach here as the configuration of AUDMUX is
routing the data and clocks from a source port to a destination port
while each of side, external or internal, might be a source port --
When using CBM_CFM, the source port should be external port; while
using CBS_CFS, the source port should be the internal port.)

There may be another topic, however, actually the fsl-asoc-card
driver does handle the master/slave mode supports. So if you are
trying to add the CODEC slave mode support into imx-sgtl5000. I
suggest you to try the fsl-asoc-card instead. Its DT binding's
totally compatible with imx-sgtl5000's. What you need to do is
just enable it (and disable imx-sgtl500) in the menuconfig or
add these enable/disable into imx_v6_v7_defconfig.

Nicolin
Nicolin Chen Sept. 18, 2014, 5:19 p.m. UTC | #7
On Thu, Sep 18, 2014 at 10:30:18AM -0300, Fabio Estevam wrote:
> > &iomuxc {
> >     pinctrl-names = "default";
> >     pinctrl-0 = <&pinctrl_hog>;
> >
> >     imx6qdl-vbx3 {
> >         pinctrl_audmux: audmuxgrp {
> >             fsl,pins = <
> >                 MX6QDLPAD_DISP0_DAT13__AUD5_RXFS        0x130b0
> >                 MX6QDL_PAD_DISP0_DAT14__AUD5_RXC        0x130b0
> >                 MX6QDL_PAD_DISP0_DAT19__AUD5_RXD        0x130b0

The other issue over here is you are using asynchronous mode of SSI,
while imx-sgtl5000 is using synchronous configurations for AUDMUX.

You can try it with fsl-asoc-card because it uses asynchronous mode
of AUDMUX, although I've not tested it with SSI in its asynchronous
mode as I only have a synchronous (SSI) environment.

> > &ssi1 {
> >     status = "okay";
> >     codec-handle = <&codec>;
> >     fsl,mode = "i2s-master";
> >     fsl,ssi-asynchronous; /* Not sure about it, but does not change anything */

The driver cares about it. If you look at the symmetric part carefully,
you would find some register configurations of SSI does depends on the
this property via symmetric check. For example:

	if (ssi_private->cpu_dai_drv.symmetric_rates) {
		/* Need to clear RXDIR when using SYNC mode */
		srcr &= ~CCSR_SSI_SRCR_RXDIR;
		scr |= CCSR_SSI_SCR_SYN;
	}

Nicolin
diff mbox

Patch

--- a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
@@ -532,6 +532,7 @@ 
 };

 &ssi2 {
+       fsl,mode = "i2s-master";
        status = "okay";
 };

diff --git a/sound/soc/fsl/imx-wm8962.c b/sound/soc/fsl/imx-wm8962.c
index 3a3d17c..09ea6a5 100644
--- a/sound/soc/fsl/imx-wm8962.c
+++ b/sound/soc/fsl/imx-wm8962.c
@@ -247,7 +247,7 @@  static int imx_wm8962_probe(struct platform_device *pdev)
        data->dai.platform_of_node = ssi_np;
        data->dai.ops = &imx_hifi_ops;
        data->dai.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
-                           SND_SOC_DAIFMT_CBM_CFM;
+                           SND_SOC_DAIFMT_CBS_CFS;

        data->card.dev = &pdev->dev;
        ret = snd_soc_of_parse_card_name(&data->card, "model");