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?