[alsa-devel] writing an alsa driver
Michele Curti
michele.curti at gmail.com
Thu Jun 4 21:39:22 CEST 2015
On Mon, Jun 01, 2015 at 12:06:08PM +0100, Liam Girdwood wrote:
> + Jarkko
>
> On Fri, 2015-05-29 at 15:17 +0200, Michele Curti wrote:
> > On Fri, May 29, 2015 at 10:42:01AM +0100, Liam Girdwood wrote:
> > > On Thu, 2015-05-28 at 21:17 +0200, Michele Curti wrote:
> > >
> > > > to let the probe continue, the system become quite unusable but I get the
> > > > logs.
> > > >
> > > > May 28 20:34:00 asus kernel: byt-rt5645 byt-rt5645: ASoC: CPU DAI baytrail-pcm-audio not registered
> > > > May 28 20:34:00 asus kernel: baytrail-pcm-audio baytrail-pcm-audio: initialising Byt DSP IPC
> > > > May 28 20:34:00 asus kernel: baytrail-pcm-audio baytrail-pcm-audio: initialising audio DSP id 0xf28
> > > > May 28 20:34:00 asus kernel: irq used for dsp = 6
> > > >
> > > > ---> The IRQ number used is 6
> > > >
>
> Jarkko thinks the IRQ may be incorrectly reported by ACPI and that it
> could be using another ACPI index. This could probably be checked by
> decompiling the ACPi data and searching for the audio DSP.
>
Done an acpidump/iasl and (I think) the interesting part is:
Scope (_SB)
{
Device (LPEA)
{
Name (_ADR, Zero) // _ADR: Address
Name (_HID, "80860F28" /* Intel SST Audio DSP */) // _HID: Hardware ID
Name (_CID, "80860F28" /* Intel SST Audio DSP */) // _CID: Compatible ID
Name (_DDN, "Intel(R) Low Power Audio Controller - 80860F28") // _DDN: DOS Device Name
Name (_SUB, "1043182D") // _SUB: Subsystem ID
Name (_UID, One) // _UID: Unique ID
Name (ADEP, Package (0x01)
{
^I2C2.TTLV
})
Name (_DEP, Package (0x01) // _DEP: Dependencies
{
^I2C2.RTEK
})
Name (_PR0, Package (0x01) // _PR0: Power Resources for D0
{
PLPE
})
Method (_STA, 0, NotSerialized) // _STA: Status
{
If (((LPEE == 0x02) && (LPED == Zero)))
{
Return (0x0F)
}
Return (Zero)
}
Method (_DIS, 0, NotSerialized) // _DIS: Disable Device
{
}
Name (RBUF, ResourceTemplate ()
{
Memory32Fixed (ReadWrite,
0x12345678, // Address Base
0x00200000, // Address Length
_Y04)
Memory32Fixed (ReadWrite,
0xFE830000, // Address Base
0x00001000, // Address Length
_Y05)
Memory32Fixed (ReadWrite,
0x55AA55AA, // Address Base
0x00200000, // Address Length
_Y06)
Interrupt (ResourceConsumer, Level, ActiveLow, Exclusive, ,, )
{
0x0000001D,
}
Interrupt (ResourceConsumer, Level, ActiveLow, Exclusive, ,, )
{
0x00000018,
}
Interrupt (ResourceConsumer, Level, ActiveLow, Exclusive, ,, )
{
0x00000019,
}
Interrupt (ResourceConsumer, Level, ActiveLow, Exclusive, ,, )
{
0x0000001A,
}
Interrupt (ResourceConsumer, Level, ActiveLow, Exclusive, ,, )
{
0x0000001B,
}
Interrupt (ResourceConsumer, Level, ActiveLow, Exclusive, ,, )
{
0x0000001C,
}
})
Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings
{
CreateDWordField (RBUF, \_SB.LPEA._Y04._BAS, B0BA) // _BAS: Base Address
B0BA = LPE0 /* \LPE0 */
CreateDWordField (RBUF, \_SB.LPEA._Y05._BAS, B1BA) // _BAS: Base Address
B1BA = LPE1 /* \LPE1 */
CreateDWordField (RBUF, \_SB.LPEA._Y06._BAS, B2BA) // _BAS: Base Address
B2BA = LPE2 /* \LPE2 */
Return (RBUF) /* \_SB_.LPEA.RBUF */
}
OperationRegion (KEYS, SystemMemory, LPE1, 0x0100)
Field (KEYS, DWordAcc, NoLock, WriteAsZeros)
{
Offset (0x84),
PSAT, 32
}
PowerResource (PLPE, 0x05, 0x0000)
{
Method (_STA, 0, NotSerialized) // _STA: Status
{
Return (One)
}
Method (_ON, 0, NotSerialized) // _ON_: Power On
{
PSAT &= 0xFFFFFFFC
Local0 = PSAT /* \_SB_.LPEA.PSAT */
}
Method (_OFF, 0, NotSerialized) // _OFF: Power Off
{
PSAT |= 0x03
Local0 = PSAT /* \_SB_.LPEA.PSAT */
}
}
So, 6 possible IRQs for the LPE core, from 0x18 to 0x1D?
Changed the code and tried all six
diff --git a/sound/soc/intel/common/sst-acpi.c b/sound/soc/intel/common/sst-acpi.c
index bb28e84..a306502 100644
--- a/sound/soc/intel/common/sst-acpi.c
+++ b/sound/soc/intel/common/sst-acpi.c
@@ -149,8 +149,12 @@ static int sst_acpi_probe(struct platform_device *pdev)
sst_pdata->dma_size = desc->dma_size;
}
- if (desc->irqindex_host_ipc >= 0)
- sst_pdata->irq = platform_get_irq(pdev, desc->irqindex_host_ipc);
+ if (desc->irqindex_host_ipc >= 0) {
+ sst_pdata->irq = 0x1D; /* acpi-dump, from 0x18 to 0x1D */
+ pr_info("audio dsp: IRQ # was %d, force to %d\n",
+ platform_get_irq(pdev, desc->irqindex_host_ipc),
+ sst_pdata->irq);
+ }
if (desc->resindex_lpe_base >= 0) {
mmio = platform_get_resource(pdev, IORESOURCE_MEM,
without success, I get always the "dsp boot timeout".
I'm going to investigate why platform_get_irq() returns 6 instead of something
in the range 0x18-0x1D.. :)
Thanks for the time spent,
Michele
More information about the Alsa-devel
mailing list