Other Parts Discussed in Thread: TPS65910,
Hi~ Dear Ti
I'm adapting a new audio codec wm8974.
Linux kernel version:3.2.0
Hardware: MCASP0
Get some error log:
aplay -D hw:0,0 -f S16_LE -r 48000 -c 2 /dev/zero
Playing raw data '/dev/zero' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
[ 17.440694] _______Set clk 12288000 success_______
[ 17.445543] asoc: machine hw_params failed
aplay: set_params:1129: Unable to install hw params:
ACCESS: RW_INTERLEAVED
FORMAT: S16_LE
SUBFORMAT: STD
SAMPLE_BITS: 16
FRAME_BITS: 32
CHANNELS: 2
RATE: 48000
PERIOD_TIME: (42666 42667)
PERIOD_SIZE: 2048
PERIOD_BYTES: 8192
PERIODS: 16
BUFFER_TIME: (682666 682667)
BUFFER_SIZE: 32768
BUFFER_BYTES: 131072
TICK_TIME: 0
And sound/soc/davinci/davinci-evm.c
static int evm_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct snd_soc_dai *codec_dai = rtd->codec_dai;
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret = 0;
unsigned sysclk;
/* ASP1 on DM355 EVM is clocked by an external oscillator */
if (machine_is_davinci_dm355_evm() || machine_is_davinci_dm6467_evm() ||
machine_is_davinci_dm365_evm())
sysclk = 27000000;
/* ASP0 in DM6446 EVM is clocked by U55, as configured by
* board-dm644x-evm.c using GPIOs from U18. There are six
* options; here we "know" we use a 48 KHz sample rate.
*/
else if (machine_is_davinci_evm())
sysclk = 12288000;
else if (machine_is_davinci_da830_evm() ||
machine_is_davinci_da850_evm())
sysclk = 24576000;
/* On AM335X, CODEC gets MCLK from external Xtal (12MHz). */
else if (machine_is_am335xevm())
#ifdef CONFIG_MACH_AM335XEVM
if (am335x_evm_get_id() == EVM_SK)
// sysclk = 24000000;
{ printk("_______Set clk 12288000 success_______");
sysclk = 12288000;
}else
#endif
sysclk = 12000000;
else
return -EINVAL;
/* set codec DAI configuration */
ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFM | SND_SOC_DAIFMT_NB_NF);
if (ret < 0)
return ret;
/* set cpu DAI configuration */
ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_NB_NF);
if (ret < 0)
return ret;
/* set the codec system clock */
ret = snd_soc_dai_set_sysclk(codec_dai, 0, sysclk, SND_SOC_CLOCK_IN);
if (ret < 0)
return ret;
return 0;
}
static struct snd_soc_dai_link am335x_evm_sk_dai = {
.name = "WM8974",
.stream_name = "M8974",
//.cpu_dai_name = "davinci-mcasp.1", // use mcasp0 on the QY board
.cpu_dai_name = "davinci-mcasp.0", // modify by maoh of 2025-08-01
.codec_dai_name = "wm8974-hifi",
//.codec_name = "tlv320aic3x-codec.1-001b",
.codec_name = "wm8974-codec.1-001a", // wm8974
.platform_name = "davinci-pcm-audio",
.init = evm_aic3x_init,
.ops = &evm_ops,
};
And arch/arm/mach-omap2/board-am335xevm.c
static struct snd_platform_data am335x_evm_snd_data0 = {
.tx_dma_offset = 0x46000000, /* McASP0 */
.rx_dma_offset = 0x46000000,
.op_mode = DAVINCI_MCASP_IIS_MODE,
.num_serializer = ARRAY_SIZE(am335x_iis_serializer_direction0),
.tdm_slots = 2,
.serial_dir = am335x_iis_serializer_direction0,
.asp_chan_q = EVENTQ_2,
.version = MCASP_VERSION_3,
.txnumevt = 32,
.rxnumevt = 32,
.get_context_loss_count =
omap_pm_get_dev_context_loss_count,
};
static struct i2c_board_info __initdata am335x_i2c0_boardinfo[] = {
{
I2C_BOARD_INFO("tps65910", TPS65910_I2C_ID1),
.platform_data = &am335x_tps65910_info,
},
{
I2C_BOARD_INFO("tlv320aic3x", 0x18),
},
{
I2C_BOARD_INFO("wm8974", 0x1a),
},
{
I2C_BOARD_INFO("ds1338", 0xd0 >> 1),
},
};
static struct pinmux_config mcasp0_pin_mux[] = {
{"mcasp0_aclkx.mcasp0_aclkx", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
{"mcasp0_fsx.mcasp0_fsx", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
{"mcasp0_axr0.mcasp0_axr0", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
{"mcasp0_axr1.mcasp0_axr1", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
{"mcasp0_ahclkx.mcasp0_ahclkx", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
{NULL, 0},
};
WM8974 use externel oscillator 12.288Mhz.
I feel maye i should set MCASP0 to I2S Slave mode and set wm8974 to I2S master mode.
Do you have some suggestion to me?
