I am working on DM8148 and use McAsp3 to connect AIC3106. I made it running.
I want to share for everybody.
in the board-ti8148ipnc.c
//panda static u8 ti8148_iis_serializer_direction_1[] = { TX_MODE, RX_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, }; static struct snd_platform_data ti8148_evm_snd_data[] = { { .tx_dma_offset = 0x46800000, .rx_dma_offset = 0x46800000, .op_mode = DAVINCI_MCASP_IIS_MODE, .num_serializer = ARRAY_SIZE(ti8148_iis_serializer_direction), .tdm_slots = 2, .serial_dir = ti8148_iis_serializer_direction, .asp_chan_q = EVENTQ_2, .version = MCASP_VERSION_2, .txnumevt = 64, .rxnumevt = 64, }, { .tx_dma_offset = 0x4A1A5000, .rx_dma_offset = 0x4A1A5000, .op_mode = DAVINCI_MCASP_IIS_MODE, .num_serializer = ARRAY_SIZE(ti8148_iis_serializer_direction_1), .tdm_slots = 2, .serial_dir = ti8148_iis_serializer_direction_1, .asp_chan_q = EVENTQ_2,//?? .version = MCASP_VERSION_2, .txnumevt = 1,//? .rxnumevt = 1,//? } };
also add a register line in function ti8148_ipnc_init
ti81xx_register_mcasp(3, &ti8148_evm_snd_data[1]);
in the devices.c
static struct resource ti81xx_mcasp3_resource[] = { { .name = "mcasp", .start = TI81XX_ASP3_BASE, .end = TI81XX_ASP3_BASE + (SZ_1K * 12) - 1, .flags = IORESOURCE_MEM, }, /* TX event */ { .start = TI81XX_DMA_MCASP3_AXEVT, .end = TI81XX_DMA_MCASP3_AXEVT, .flags = IORESOURCE_DMA, }, /* RX event */ { .start = TI81XX_DMA_MCASP3_AREVT, .end = TI81XX_DMA_MCASP3_AREVT, .flags = IORESOURCE_DMA, }, }; static struct platform_device ti81xx_mcasp3_device = { .name = "davinci-mcasp", };
with some defination in the asp.h
//panda
/* EDMA channels of ti81xx McASP3 */
#define TI81XX_DMA_MCASP3_AXEVT 56
#define TI81XX_DMA_MCASP3_AREVT 57
//~panda
//panda
#define TI81XX_ASP3_BASE 0x4A1A2000
//~panda
modify ti81xx_register_mcasp function in devices.c like that:
void __init ti81xx_register_mcasp(int id, struct snd_platform_data *pdata) { if (id==2) { if (machine_is_ti8168evm() || machine_is_ti8148evm() || machine_is_ti811xevm() || machine_is_ti8148ipnc()) { ti81xx_mcasp_device.id = 2; ti81xx_mcasp_device.resource = ti81xx_mcasp_resource; ti81xx_mcasp_device.num_resources = ARRAY_SIZE(ti81xx_mcasp_resource); } else if (machine_is_dm385evm() || machine_is_dm385ipnc()) { ti81xx_mcasp_device.id = 1; ti81xx_mcasp_device.resource = dm385_mcasp_resource; ti81xx_mcasp_device.num_resources = ARRAY_SIZE(dm385_mcasp_resource); } else { pr_err("%s: platform not supported\n", __func__); return; } /* TI811x AIC_MCLK is connected to SoC pin MCA2_AHCLKX */ //omap_mux_init_signal("xref_clk2.mcasp2_ahclkx", 0); ti81xx_mcasp_device.dev.platform_data = pdata; platform_device_register(&ti81xx_mcasp_device); } if (id==3) { if (machine_is_ti8168evm() || machine_is_ti8148evm() || machine_is_ti811xevm() || machine_is_ti8148ipnc()) { ti81xx_mcasp3_device.id = 3; ti81xx_mcasp3_device.resource = ti81xx_mcasp3_resource; ti81xx_mcasp3_device.num_resources = ARRAY_SIZE(ti81xx_mcasp3_resource); } else if (machine_is_dm385evm() || machine_is_dm385ipnc()) { ti81xx_mcasp3_device.id = 3; ti81xx_mcasp3_device.resource = dm385_mcasp_resource; ti81xx_mcasp3_device.num_resources = ARRAY_SIZE(dm385_mcasp_resource); } else { pr_err("%s: platform not supported\n", __func__); return; } /* TI811x AIC_MCLK is connected to SoC pin MCA2_AHCLKX */ //omap_mux_init_signal("xref_clk2.mcasp2_ahclkx", 0); ti81xx_mcasp3_device.dev.platform_data = pdata; platform_device_register(&ti81xx_mcasp3_device); } }
finally , due to dma for mcasp 345 work on dsp so We have modify on devices.c dma slot and dma channel rsv :
static const s16 ti814x_dma_rsv_chans[][2] = {
/* (offset, number) */
{0, 2},
{14, 2},
{26, 6},
{48, 4},
{58, 6},//panda {56,8}
{-1, -1}
};
static const s16 ti814x_dma_rsv_slots[][2] = {
/* (offset, number) */
{0, 2},
{14, 2},
{26, 6},
{48, 4},
{58, 6},//panda {56,8}
{64, 127},
{-1, -1}
};
(for this one, please read http://processors.wiki.ti.com/index.php/TI81XX_EDMA_Driver_User_Guide )
finally, mcasp3 work on the A8.
i am amateur, i just want share what i done, forgive me if i have mistake.
thank you
(I spent alot of time to fix bug "davinci_pcm: Failed to get dma channels" . So i want to help who have same situation)