I am using DM368 EVM board and PSP 03.21.00.04 (kernel 2.6.37).
I need spi1 with DMA support, but spi1 does not respond.
How can I solve this?
I cheked User-mode SPI driver support options, and added some code as below:
dm365.c
---------------------------------------------------------------
static u64 dm365_spi1_dma_mask = DMA_BIT_MASK(32);
static struct davinci_spi_platform_data dm365_spi1_pdata = {
.version = SPI_VERSION_1,
.num_chipselect = 2,
};
static struct resource dm365_spi1_resources[] = {
{
.start = 0x01C66800,
.end = 0x01C66FFF,
.flags = IORESOURCE_MEM,
},
{
.start = IRQ_DM365_SPIINT3_0,
.flags = IORESOURCE_IRQ,
},
{
.start = 15,
.flags = IORESOURCE_DMA,
},
{
.start = 14,
.flags = IORESOURCE_DMA,
},
{
.start = EVENTQ_3,
.flags = IORESOURCE_DMA,
},
};
static struct platform_device dm365_spi1_device = {
.name = "spi_davinci",
.id = 1,
.dev = {
.dma_mask = &dm365_spi1_dma_mask,
.coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = &dm365_spi1_pdata,
},
.num_resources = ARRAY_SIZE(dm365_spi1_resources),
.resource = dm365_spi1_resources,
};
void __init dm365_init_spi1(unsigned chipselect_mask,
struct spi_board_info *info, unsigned len)
{
davinci_cfg_reg(DM365_SPI1_SCLK);
davinci_cfg_reg(DM365_SPI1_SDI);
davinci_cfg_reg(DM365_SPI1_SDO);
/* not all slaves will be wired up */
if (chipselect_mask & BIT(0))
davinci_cfg_reg(DM365_SPI1_SDENA0);
if (chipselect_mask & BIT(1))
davinci_cfg_reg(DM365_SPI1_SDENA1);
spi_register_board_info(info, len);
platform_device_register(&dm365_spi1_device);
}
---------------------------------------------------------------
board-dm365-evm.c
static struct spi_board_info dm365_evm_spi1_info[] __initconst = {
{
.modalias = "spidev",
.max_speed_hz = 20 * 1000 * 1000,
.bus_num = 1,
.chip_select = 0,
.mode = SPI_MODE_0,
},
};
static __init void dm365_evm_init(void)
{
dm365_init_spi1(BIT(0), dm365_evm_spi1_info,
ARRAY_SIZE(dm365_evm_spi1_info));
}
----------------------------------------------------------------
Then, I could find /dev/spidev1.0 , but spidev_test task blocked.
root@dm368-evm:~/dm368# ./spidev_test -D /dev/spidev1.0
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)
INFO: task spidev_test:1533 blocked for more than 120 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
spidev_test D c0350844 0 1533 1525 0x00000000
Backtrace:
[<c0350508>] (schedule+0x0/0x3d4) from [<c0350f38>] (schedule_timeout+0x24/0x22)
[<c0350f14>] (schedule_timeout+0x0/0x220) from [<c0350d78>] (wait_for_common+0x)
r7:7fffffff r6:c281fe5c r5:c35ed200 r4:c281fe18
[<c0350c84>] (wait_for_common+0x0/0x1bc) from [<c0350ee8>] (wait_for_completion)
[<c0350ed0>] (wait_for_completion+0x0/0x1c) from [<c01e9694>] (spidev_sync+0xb4)
[<c01e95e0>] (spidev_sync+0x0/0xd0) from [<c01e9db4>] (spidev_ioctl+0x500/0x5c4)
r6:c3457700 r5:c2e00300 r4:c35ebb80
[<c01e98b4>] (spidev_ioctl+0x0/0x5c4) from [<c00b4d44>] (vfs_ioctl+0x28/0x44)
[<c00b4d1c>] (vfs_ioctl+0x0/0x44) from [<c00b54d4>] (do_vfs_ioctl+0x558/0x5b4)
[<c00b4f7c>] (do_vfs_ioctl+0x0/0x5b4) from [<c00b5570>] (sys_ioctl+0x40/0x64)
[<c00b5530>] (sys_ioctl+0x0/0x64) from [<c002efc0>] (ret_fast_syscall+0x0/0x2c)
r7:00000036 r6:00008590 r5:00000000 r4:00000000
Thanks for reading, Lee.