Slow spi_sync() on pxa2xx_spi

Eric Miao eric.y.miao at gmail.com
Thu Jun 16 06:02:20 EDT 2011


On Thu, Jun 16, 2011 at 5:59 PM, Stefan Schmidt
<stefan at datenfreihafen.org> wrote:
> Hello.
>
> On Thu, 2011-06-16 at 11:19, Stefan Schmidt wrote:
>>
>> On Thu, 2011-06-16 at 16:34, Eric Miao wrote:
>> >
>> > What is the SPI frequency?
>>
>> I tried various settings in .max_speed_hz from the original 6.6 MHt to
>> 10 MHz and 13MHz as maximum of the controller. Did also not change
>> anything for me.
>>
>> That reminds me that after defining DEBUG in pxa2xx_spi it did always
>> report 13MHz to me. Need to have a look at it.
>
> Either the debug statement or the setting is indeed wrong.
>
> [    0.696759] spi spi1.0: 13000000 Hz actual, PIO
> [    0.715760] spi spi3.0: 13000000 Hz actual, PIO
>
> Which comes from this part of the driver (with #define DEBUG set):
>
>        /* NOTE:  PXA25x_SSP _could_ use external clocking ... */
>        if (!pxa25x_ssp_comp(drv_data))
>                dev_dbg(&spi->dev, "%ld Hz actual, %s\n",
>                        clk_get_rate(ssp->clk)
>                                / (1 + ((chip->cr0 & SSCR0_SCR(0xfff)) >> 8)),
>                        chip->enable_dma ? "DMA" : "PIO");
>        else
>                dev_dbg(&spi->dev, "%ld Hz actual, %s\n",
>                        clk_get_rate(ssp->clk) / 2
>                                / (1 + ((chip->cr0 & SSCR0_SCR(0x0ff)) >> 8)),
>                        chip->enable_dma ? "DMA" : "PIO");
>
> But the board file has this:
>
> static struct spi_board_info spi_board_info[] __initdata = {
>        {
>                .modalias = "lis3l02dq",
>                .max_speed_hz = 8000000,/* 8MHz max spi frequency at 3V */
>                .bus_num = 1,
>                .chip_select = 0,
>                .controller_data = &staccel_chip_info,
>                .irq = IRQ_GPIO(96),
>        }, {
>                .modalias = "cc2420",
> //              .max_speed_hz = 6500000,
>                .max_speed_hz = 10000000, /* 10MHz */
>                .bus_num = 3,
>                .chip_select = 0,
>                .controller_data = &cc2420_info,
>                .platform_data = &cc2420_pdata,
>
>        },
> };
>
> Its neither 8MHz for spi1.0 nor 10MHz for spi3.0.
>
> Adding some debug info shows me that the driver gets the data fine form the
> platform data:
> [    0.695770] spi spi1.0: chip->speed_hz: 8000000, spi->max_speed_hz: 8000000
> [    0.695872] spi spi1.0: 13000000 Hz actual, PIO
> [    0.714824] spi spi3.0: chip->speed_hz: 10000000, spi->max_speed_hz: 10000000
> [    0.714929] spi spi3.0: 13000000 Hz actual, PIO
>
> Thats directly above the chip->cr0 and chip->cr1 calculations. Is this just the
> initial seeting and it gets overwritten before a transfer or is the speed
> calculation wrong?

Every SPI chip has a clock setting, so spi_setup() will be done before
every transfer, that's my understanding. Do check the resulting SCCR
register settings to confirm it's not setup correctly before each transfer.

>
> regards
> Stefan Schmidt
>



More information about the linux-arm-kernel mailing list