[alsa-devel] writing an alsa driver
Liam Girdwood
liam.r.girdwood at linux.intel.com
Thu May 28 15:21:34 CEST 2015
On Thu, 2015-05-28 at 14:53 +0200, Michele Curti wrote:
> On Thu, May 28, 2015 at 12:31:08PM +0100, Liam Girdwood wrote:
> >
> > > [ 2.000642] byt-rt5645 byt-rt5645: ASoC: CPU DAI baytrail-pcm-audio not registered
> >
> > We are seeing a lot of these. Can you confirm whether this driver has
> > probed ? If not can you see it's ACPI ID listed
> > under /sys/bus/acpi/devices.
> >
> > If it's not probing, it may also have a different ACPI ID compared to
> > the reference driver. You may have to add an entry to sst-acpi.c i.e.
> >
> > static struct sst_acpi_mach baytrail_machines[] = {
> > { "10EC5640", "byt-rt5640", "intel/fw_sst_0f28.bin-48kHz_i2s_master" },
> > { "193C9890", "byt-max98090", "intel/fw_sst_0f28.bin-48kHz_i2s_master" },
> > {}
> > };
> >
> > Liam
> >
>
> Yes I already added an element in this list, I wrote:
>
> static struct sst_acpi_mach baytrail_machines[] = {
> { "10EC5640", "byt-rt5640", "intel/fw_sst_0f28.bin-48kHz_i2s_master" },
> { "10EC5648", "byt-rt5645", "intel/fw_sst_0f28.bin-48kHz_i2s_master" },
> { "193C9890", "byt-max98090", "intel/fw_sst_0f28.bin-48kHz_i2s_master" },
> {}
> };
>
> because in the i2c bus i saw:
> [zio at asus linux-next]$ ls /sys/bus/acpi/devices/ | grep 10EC
> 10EC5648:00
>
>
> About the probe, if I understood what you mean, the driver fails to probe
> because of the DSP boot timeout.
>
> The probe function is called, I added some debug:
>
> static int sst_byt_pcm_dev_probe(struct platform_device *pdev)
> {
> struct sst_pdata *sst_pdata = dev_get_platdata(&pdev->dev);
> int ret;
>
> ret = sst_byt_dsp_init(&pdev->dev, sst_pdata);
> if (ret < 0) {
> pr_info("sst_byt_pcm_dev_probe failed dsp init\n");
> return -ENODEV;
> }
>
> ret = snd_soc_register_platform(&pdev->dev, &byt_soc_platform);
> if (ret < 0) {
> pr_info("sst_byt_pcm_dev_probe failed register platform\n");
> goto err_plat;
> }
>
> ret = snd_soc_register_component(&pdev->dev, &byt_dai_component,
> byt_dais, ARRAY_SIZE(byt_dais));
> if (ret < 0) {
> pr_info("sst_byt_pcm_dev_probe failed register component\n");
> goto err_comp;
> }
>
> return 0;
>
> err_comp:
> snd_soc_unregister_platform(&pdev->dev);
> err_plat:
> sst_byt_dsp_free(&pdev->dev, sst_pdata);
> return ret;
> }
>
> and in dmesg I got:
>
> [zio at asus ~]$ dmesg | grep probe
> [ 1.794754] sst_byt_pcm_dev_probe failed dsp init
>
Ok, so the DSP FW has been loaded but the FW is failing to boot. The FW
is just copied with memcpy() from the host to the DSP memory. Some
things to check :-
1) Does the DSP have a valid IRQ number and handler. The IRQ is used to
signal FW boot has completed.
2) Can you verify the FW data copied with memcpy by reading it back from
DSP memory. The DSP device may be in D3 here...
3) can you send the output of sst_byt_dump_shim() when boot fails.
Liam
More information about the Alsa-devel
mailing list