Commit bc23ca35 authored by Jeeja KP's avatar Jeeja KP Committed by Mark Brown

ASoC: Intel: Skylake: Move Skylake dsp ops & loader ops

The code loading for Skylake and other platforms is different, so
add a dsp_ops and a loader_ops which can be defined for each
platform.

Move the dsp init, cleanup and loader ops (alloc and free dma) to
these ops
Signed-off-by: default avatarJeeja KP <jeeja.kp@intel.com>
Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent b822ee63
...@@ -72,17 +72,47 @@ static void skl_dsp_enable_notification(struct skl_sst *ctx, bool enable) ...@@ -72,17 +72,47 @@ static void skl_dsp_enable_notification(struct skl_sst *ctx, bool enable)
skl_ipc_set_large_config(&ctx->ipc, &msg, (u32 *)&mask); skl_ipc_set_large_config(&ctx->ipc, &msg, (u32 *)&mask);
} }
static struct skl_dsp_loader_ops skl_get_loader_ops(void)
{
struct skl_dsp_loader_ops loader_ops;
memset(&loader_ops, 0, sizeof(struct skl_dsp_loader_ops));
loader_ops.alloc_dma_buf = skl_alloc_dma_buf;
loader_ops.free_dma_buf = skl_free_dma_buf;
return loader_ops;
};
static const struct skl_dsp_ops dsp_ops[] = {
{
.id = 0x9d70,
.loader_ops = skl_get_loader_ops,
.init = skl_sst_dsp_init,
.cleanup = skl_sst_dsp_cleanup
},
};
static int skl_get_dsp_ops(int pci_id)
{
int i;
for (i = 0; i < ARRAY_SIZE(dsp_ops); i++) {
if (dsp_ops[i].id == pci_id)
return i;
}
return -EINVAL;
}
int skl_init_dsp(struct skl *skl) int skl_init_dsp(struct skl *skl)
{ {
void __iomem *mmio_base; void __iomem *mmio_base;
struct hdac_ext_bus *ebus = &skl->ebus; struct hdac_ext_bus *ebus = &skl->ebus;
struct hdac_bus *bus = ebus_to_hbus(ebus); struct hdac_bus *bus = ebus_to_hbus(ebus);
int irq = bus->irq;
struct skl_dsp_loader_ops loader_ops; struct skl_dsp_loader_ops loader_ops;
int ret; int irq = bus->irq;
int ret, index;
loader_ops.alloc_dma_buf = skl_alloc_dma_buf;
loader_ops.free_dma_buf = skl_free_dma_buf;
/* enable ppcap interrupt */ /* enable ppcap interrupt */
snd_hdac_ext_bus_ppcap_enable(&skl->ebus, true); snd_hdac_ext_bus_ppcap_enable(&skl->ebus, true);
...@@ -95,8 +125,14 @@ int skl_init_dsp(struct skl *skl) ...@@ -95,8 +125,14 @@ int skl_init_dsp(struct skl *skl)
return -ENXIO; return -ENXIO;
} }
ret = skl_sst_dsp_init(bus->dev, mmio_base, irq, index = skl_get_dsp_ops(skl->pci->device);
if (index < 0)
return -EINVAL;
loader_ops = dsp_ops[index].loader_ops();
ret = dsp_ops[index].init(bus->dev, mmio_base, irq,
skl->fw_name, loader_ops, &skl->skl_sst); skl->fw_name, loader_ops, &skl->skl_sst);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -106,18 +142,26 @@ int skl_init_dsp(struct skl *skl) ...@@ -106,18 +142,26 @@ int skl_init_dsp(struct skl *skl)
return ret; return ret;
} }
void skl_free_dsp(struct skl *skl) int skl_free_dsp(struct skl *skl)
{ {
struct hdac_ext_bus *ebus = &skl->ebus; struct hdac_ext_bus *ebus = &skl->ebus;
struct hdac_bus *bus = ebus_to_hbus(ebus); struct hdac_bus *bus = ebus_to_hbus(ebus);
struct skl_sst *ctx = skl->skl_sst; struct skl_sst *ctx = skl->skl_sst;
int index;
/* disable ppcap interrupt */ /* disable ppcap interrupt */
snd_hdac_ext_bus_ppcap_int_enable(&skl->ebus, false); snd_hdac_ext_bus_ppcap_int_enable(&skl->ebus, false);
skl_sst_dsp_cleanup(bus->dev, ctx); index = skl_get_dsp_ops(skl->pci->device);
if (index < 0)
return -EIO;
dsp_ops[index].cleanup(bus->dev, ctx);
if (ctx->dsp->addr.lpe) if (ctx->dsp->addr.lpe)
iounmap(ctx->dsp->addr.lpe); iounmap(ctx->dsp->addr.lpe);
return 0;
} }
int skl_suspend_dsp(struct skl *skl) int skl_suspend_dsp(struct skl *skl)
......
...@@ -90,6 +90,16 @@ struct skl_dma_params { ...@@ -90,6 +90,16 @@ struct skl_dma_params {
u8 stream_tag; u8 stream_tag;
}; };
struct skl_dsp_ops {
int id;
struct skl_dsp_loader_ops (*loader_ops)(void);
int (*init)(struct device *dev, void __iomem *mmio_base,
int irq, const char *fw_name,
struct skl_dsp_loader_ops loader_ops,
struct skl_sst **skl_sst);
void (*cleanup)(struct device *dev, struct skl_sst *ctx);
};
int skl_platform_unregister(struct device *dev); int skl_platform_unregister(struct device *dev);
int skl_platform_register(struct device *dev); int skl_platform_register(struct device *dev);
...@@ -100,7 +110,7 @@ struct nhlt_specific_cfg *skl_get_ep_blob(struct skl *skl, u32 instance, ...@@ -100,7 +110,7 @@ struct nhlt_specific_cfg *skl_get_ep_blob(struct skl *skl, u32 instance,
int skl_nhlt_update_topology_bin(struct skl *skl); int skl_nhlt_update_topology_bin(struct skl *skl);
int skl_init_dsp(struct skl *skl); int skl_init_dsp(struct skl *skl);
void skl_free_dsp(struct skl *skl); int skl_free_dsp(struct skl *skl);
int skl_suspend_dsp(struct skl *skl); int skl_suspend_dsp(struct skl *skl);
int skl_resume_dsp(struct skl *skl); int skl_resume_dsp(struct skl *skl);
#endif /* __SOUND_SOC_SKL_H */ #endif /* __SOUND_SOC_SKL_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment