diff mbox

AM335x BeagleBone SPI Issues

Message ID 20121211142725.GA17708@arwen.pp.htv.fi (mailing list archive)
State New, archived
Headers show

Commit Message

Felipe Balbi Dec. 11, 2012, 2:27 p.m. UTC
Hi again,

On Tue, Dec 11, 2012 at 01:48:10PM +0200, Felipe Balbi wrote:
> On Tue, Dec 11, 2012 at 10:38:58AM +0000, Jack Mitchell wrote:
> > On 11/12/12 10:20, Felipe Balbi wrote:
> > >Hi,
> > >
> > >On Tue, Dec 11, 2012 at 10:17:42AM +0000, Jack Mitchell wrote:
> > >
> > ><big snip>
> > >
> > >>Shubhro, Felipe,
> > >>
> > >>Thank you, the reordering dma patch fixed the dma issue I was having!
> > >>However, the bad news, I now get the same results for the dma and
> > >>non-dma spidev test. While the scope shows the SPI clk and data is
> > >>fine, the reading from the program still shows 0x00 for all words.
> > ><removed spidev_test output>
> > >
> > >>dmesg shows nothing of interest apart from the spi bus setting up.
> > >>Any ideas?
> > >>
> > >>To iterate for my own sanity; I have bridged pins 18 and 21 on the P9
> > >>header which should be the d0 and d1 spi data pins for spi0. This
> > >>result of 0x00 usually comes from a result of not joining the pins,
> > >>but I can assure you they are joined!
> > >>
> > >>Thank you for the help so far.
> > >according to the schematics [1], those pins are muxed as UART2_TXD and
> > >I2C1_SDA, have you remuxed them properly ? Can you try with pins 29 and
> > >30 on the same header ? That's SPI1, so you will have to add DT data for
> > >spidev on that bus too.
> > >
> > >[1] http://beagleboard.org/static/beaglebone/latest/Docs/Hardware/BONE_SCH.pdf
> > >
> > 
> > No change unfortunately:
> > 
> > root@beaglebone:~# ./spidev
> > spi mode: 0
> > bits per word: 16
> > max speed: 24000000 Hz (24000 KHz)
> > 
> > 00 00 00 00 00 00
> > 00 00 00 00 00 00
> > 00 00 00 00 00 00
> > 00 00 00 00 00 00
> > 00 00 00 00 00 00
> > 00 00 00 00 00 00
> > 00 00
> > 
> > root@beaglebone:~# ./spidev -D /dev/s
> > shm/       spidev1.0  spidev2.0  stderr     stdin      stdout
> > root@beaglebone:~# ./spidev -D /dev/spidev2.0

one thing caught my attention, shouldn't you be passing '-l' argument
here for loopback testing ? That would mean you need to make sure your
"spi->mode" has SPI_LOOP flag set. Currently there is no way to do that
via DeviceTree (AFAICT), so please apply ths patch to your tree and set
spi-loopback; property for your spidev entry:

Comments

Jack Mitchell Dec. 11, 2012, 3:23 p.m. UTC | #1
On 11/12/12 14:27, Felipe Balbi wrote:
> Hi again,
>
> On Tue, Dec 11, 2012 at 01:48:10PM +0200, Felipe Balbi wrote:
>> On Tue, Dec 11, 2012 at 10:38:58AM +0000, Jack Mitchell wrote:
>>> On 11/12/12 10:20, Felipe Balbi wrote:
>>>> Hi,
>>>>
>>>> On Tue, Dec 11, 2012 at 10:17:42AM +0000, Jack Mitchell wrote:
>>>>
>>>> <big snip>
>>>>
>>>>> Shubhro, Felipe,
>>>>>
>>>>> Thank you, the reordering dma patch fixed the dma issue I was having!
>>>>> However, the bad news, I now get the same results for the dma and
>>>>> non-dma spidev test. While the scope shows the SPI clk and data is
>>>>> fine, the reading from the program still shows 0x00 for all words.
>>>> <removed spidev_test output>
>>>>
>>>>> dmesg shows nothing of interest apart from the spi bus setting up.
>>>>> Any ideas?
>>>>>
>>>>> To iterate for my own sanity; I have bridged pins 18 and 21 on the P9
>>>>> header which should be the d0 and d1 spi data pins for spi0. This
>>>>> result of 0x00 usually comes from a result of not joining the pins,
>>>>> but I can assure you they are joined!
>>>>>
>>>>> Thank you for the help so far.
>>>> according to the schematics [1], those pins are muxed as UART2_TXD and
>>>> I2C1_SDA, have you remuxed them properly ? Can you try with pins 29 and
>>>> 30 on the same header ? That's SPI1, so you will have to add DT data for
>>>> spidev on that bus too.
>>>>
>>>> [1] http://beagleboard.org/static/beaglebone/latest/Docs/Hardware/BONE_SCH.pdf
>>>>
>>> No change unfortunately:
>>>
>>> root@beaglebone:~# ./spidev
>>> spi mode: 0
>>> bits per word: 16
>>> max speed: 24000000 Hz (24000 KHz)
>>>
>>> 00 00 00 00 00 00
>>> 00 00 00 00 00 00
>>> 00 00 00 00 00 00
>>> 00 00 00 00 00 00
>>> 00 00 00 00 00 00
>>> 00 00 00 00 00 00
>>> 00 00
>>>
>>> root@beaglebone:~# ./spidev -D /dev/s
>>> shm/       spidev1.0  spidev2.0  stderr     stdin      stdout
>>> root@beaglebone:~# ./spidev -D /dev/spidev2.0
> one thing caught my attention, shouldn't you be passing '-l' argument
> here for loopback testing ? That would mean you need to make sure your
> "spi->mode" has SPI_LOOP flag set. Currently there is no way to do that
> via DeviceTree (AFAICT), so please apply ths patch to your tree and set
> spi-loopback; property for your spidev entry:
>
> diff --git a/Documentation/devicetree/bindings/spi/spi-bus.txt b/Documentation/devicetree/bindings/spi/spi-bus.txt
> index 296015e..1949586 100644
> --- a/Documentation/devicetree/bindings/spi/spi-bus.txt
> +++ b/Documentation/devicetree/bindings/spi/spi-bus.txt
> @@ -55,6 +55,8 @@ contain the following properties.
>       		chip select active high
>   - spi-3wire       - (optional) Empty property indicating device requires
>       		    3-wire mode.
> +- spi-loopback    - (optional) Empty property indicating device requires
> +    		    loopback mode.
>   
>   If a gpio chipselect is used for the SPI slave the gpio number will be passed
>   via the cs_gpio
> diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
> index 3f1b9ee..6bcdc03 100644
> --- a/drivers/spi/spi.c
> +++ b/drivers/spi/spi.c
> @@ -868,6 +868,8 @@ static void of_register_spi_devices(struct spi_master *master)
>   			spi->mode |= SPI_CS_HIGH;
>   		if (of_find_property(nc, "spi-3wire", NULL))
>   			spi->mode |= SPI_3WIRE;
> +		if (of_find_property(nc, "spi-loopback", NULL))
> +			spi->mode |= SPI_LOOP;
>   
>   		/* Device speed */
>   		prop = of_get_property(nc, "spi-max-frequency", &len);
>

I get the following error when I apply this patch and add spi-loopback.

&spi0 {
   status = "okay";
   pinctrl-names = "default";
   pinctrl-0 = <&spi0_pins>;

   spidev0: spidev@0 {
   compatible = "linux,spidev";
   reg = <0>;
   spi-max-frequency = <24000000>;
   spi-loopback;
   };

};

[    1.093565] omap2_mcspi 48030000.spi: registered master spi1
[    1.094491] spi spi1.0: setup: unsupported mode bits 20
[    1.100035] omap2_mcspi 48030000.spi: can't setup spi1.0, status -22
[    1.106715] spi_master spi1: spi_device register error 
/ocp/spi@48030000/spidev@0
[    1.115030] omap2_mcspi 481a0000.spi: registered master spi2
[    1.115710] spi spi2.0: setup: unsupported mode bits 20
[    1.121225] omap2_mcspi 481a0000.spi: can't setup spi2.0, status -22
[    1.127903] spi_master spi2: spi_device register error 
/ocp/spi@481a0000/spidev@0

I have run this test many times before and have never needed to use a 
loopback...
Felipe Balbi Dec. 11, 2012, 4:15 p.m. UTC | #2
Hi,

On Tue, Dec 11, 2012 at 03:23:48PM +0000, Jack Mitchell wrote:
> On 11/12/12 14:27, Felipe Balbi wrote:
> >Hi again,
> >
> >On Tue, Dec 11, 2012 at 01:48:10PM +0200, Felipe Balbi wrote:
> >>On Tue, Dec 11, 2012 at 10:38:58AM +0000, Jack Mitchell wrote:
> >>>On 11/12/12 10:20, Felipe Balbi wrote:
> >>>>Hi,
> >>>>
> >>>>On Tue, Dec 11, 2012 at 10:17:42AM +0000, Jack Mitchell wrote:
> >>>>
> >>>><big snip>
> >>>>
> >>>>>Shubhro, Felipe,
> >>>>>
> >>>>>Thank you, the reordering dma patch fixed the dma issue I was having!
> >>>>>However, the bad news, I now get the same results for the dma and
> >>>>>non-dma spidev test. While the scope shows the SPI clk and data is
> >>>>>fine, the reading from the program still shows 0x00 for all words.
> >>>><removed spidev_test output>
> >>>>
> >>>>>dmesg shows nothing of interest apart from the spi bus setting up.
> >>>>>Any ideas?
> >>>>>
> >>>>>To iterate for my own sanity; I have bridged pins 18 and 21 on the P9
> >>>>>header which should be the d0 and d1 spi data pins for spi0. This
> >>>>>result of 0x00 usually comes from a result of not joining the pins,
> >>>>>but I can assure you they are joined!
> >>>>>
> >>>>>Thank you for the help so far.
> >>>>according to the schematics [1], those pins are muxed as UART2_TXD and
> >>>>I2C1_SDA, have you remuxed them properly ? Can you try with pins 29 and
> >>>>30 on the same header ? That's SPI1, so you will have to add DT data for
> >>>>spidev on that bus too.
> >>>>
> >>>>[1] http://beagleboard.org/static/beaglebone/latest/Docs/Hardware/BONE_SCH.pdf
> >>>>
> >>>No change unfortunately:
> >>>
> >>>root@beaglebone:~# ./spidev
> >>>spi mode: 0
> >>>bits per word: 16
> >>>max speed: 24000000 Hz (24000 KHz)
> >>>
> >>>00 00 00 00 00 00
> >>>00 00 00 00 00 00
> >>>00 00 00 00 00 00
> >>>00 00 00 00 00 00
> >>>00 00 00 00 00 00
> >>>00 00 00 00 00 00
> >>>00 00
> >>>
> >>>root@beaglebone:~# ./spidev -D /dev/s
> >>>shm/       spidev1.0  spidev2.0  stderr     stdin      stdout
> >>>root@beaglebone:~# ./spidev -D /dev/spidev2.0
> >one thing caught my attention, shouldn't you be passing '-l' argument
> >here for loopback testing ? That would mean you need to make sure your
> >"spi->mode" has SPI_LOOP flag set. Currently there is no way to do that
> >via DeviceTree (AFAICT), so please apply ths patch to your tree and set
> >spi-loopback; property for your spidev entry:
> >
> >diff --git a/Documentation/devicetree/bindings/spi/spi-bus.txt b/Documentation/devicetree/bindings/spi/spi-bus.txt
> >index 296015e..1949586 100644
> >--- a/Documentation/devicetree/bindings/spi/spi-bus.txt
> >+++ b/Documentation/devicetree/bindings/spi/spi-bus.txt
> >@@ -55,6 +55,8 @@ contain the following properties.
> >      		chip select active high
> >  - spi-3wire       - (optional) Empty property indicating device requires
> >      		    3-wire mode.
> >+- spi-loopback    - (optional) Empty property indicating device requires
> >+    		    loopback mode.
> >  If a gpio chipselect is used for the SPI slave the gpio number will be passed
> >  via the cs_gpio
> >diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
> >index 3f1b9ee..6bcdc03 100644
> >--- a/drivers/spi/spi.c
> >+++ b/drivers/spi/spi.c
> >@@ -868,6 +868,8 @@ static void of_register_spi_devices(struct spi_master *master)
> >  			spi->mode |= SPI_CS_HIGH;
> >  		if (of_find_property(nc, "spi-3wire", NULL))
> >  			spi->mode |= SPI_3WIRE;
> >+		if (of_find_property(nc, "spi-loopback", NULL))
> >+			spi->mode |= SPI_LOOP;
> >  		/* Device speed */
> >  		prop = of_get_property(nc, "spi-max-frequency", &len);
> >
> 
> I get the following error when I apply this patch and add spi-loopback.
> 
> &spi0 {
>   status = "okay";
>   pinctrl-names = "default";
>   pinctrl-0 = <&spi0_pins>;
> 
>   spidev0: spidev@0 {
>   compatible = "linux,spidev";
>   reg = <0>;
>   spi-max-frequency = <24000000>;
>   spi-loopback;
>   };
> 
> };
> 
> [    1.093565] omap2_mcspi 48030000.spi: registered master spi1
> [    1.094491] spi spi1.0: setup: unsupported mode bits 20
> [    1.100035] omap2_mcspi 48030000.spi: can't setup spi1.0, status -22
> [    1.106715] spi_master spi1: spi_device register error
> /ocp/spi@48030000/spidev@0
> [    1.115030] omap2_mcspi 481a0000.spi: registered master spi2
> [    1.115710] spi spi2.0: setup: unsupported mode bits 20
> [    1.121225] omap2_mcspi 481a0000.spi: can't setup spi2.0, status -22
> [    1.127903] spi_master spi2: spi_device register error
> /ocp/spi@481a0000/spidev@0
> 
> I have run this test many times before and have never needed to use a
> loopback...

I finally managed to test with my pandaboard and I have same results as
yourself (btw you need to SPI_LOOP to mode_bits on
drivers/spi/spi-omap2-mcspi.c for this to probe fine, my bad).

I have looked at the pins over and over again and I'm sure I'm shorting
the correct pins... Oh well, time to debug :-p
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/spi/spi-bus.txt b/Documentation/devicetree/bindings/spi/spi-bus.txt
index 296015e..1949586 100644
--- a/Documentation/devicetree/bindings/spi/spi-bus.txt
+++ b/Documentation/devicetree/bindings/spi/spi-bus.txt
@@ -55,6 +55,8 @@  contain the following properties.
     		chip select active high
 - spi-3wire       - (optional) Empty property indicating device requires
     		    3-wire mode.
+- spi-loopback    - (optional) Empty property indicating device requires
+    		    loopback mode.
 
 If a gpio chipselect is used for the SPI slave the gpio number will be passed
 via the cs_gpio
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 3f1b9ee..6bcdc03 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -868,6 +868,8 @@  static void of_register_spi_devices(struct spi_master *master)
 			spi->mode |= SPI_CS_HIGH;
 		if (of_find_property(nc, "spi-3wire", NULL))
 			spi->mode |= SPI_3WIRE;
+		if (of_find_property(nc, "spi-loopback", NULL))
+			spi->mode |= SPI_LOOP;
 
 		/* Device speed */
 		prop = of_get_property(nc, "spi-max-frequency", &len);