Commit cc18c5fd authored by Vinod Koul's avatar Vinod Koul Committed by Mark Brown

ASoC: Intel: Skylake: Fix skl machine driver creation

Now that we have common match code in place, update the SKL
driver to use the common match routines for driver entry creation
for UEFI BIOS systems
Signed-off-by: default avatarJeeja KP <jeeja.kp@intel.com>
Signed-off-by: default avatarOmair M Abdullah <omair.m.abdullah@intel.com>
Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 12cc291b
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <sound/pcm.h> #include <sound/pcm.h>
#include "../common/sst-acpi.h"
#include "skl.h" #include "skl.h"
/* /*
...@@ -251,6 +252,42 @@ static int skl_free(struct hdac_ext_bus *ebus) ...@@ -251,6 +252,42 @@ static int skl_free(struct hdac_ext_bus *ebus)
return 0; return 0;
} }
static int skl_machine_device_register(struct skl *skl, void *driver_data)
{
struct hdac_bus *bus = ebus_to_hbus(&skl->ebus);
struct platform_device *pdev;
struct sst_acpi_mach *mach = driver_data;
int ret;
mach = sst_acpi_find_machine(mach);
if (mach == NULL) {
dev_err(bus->dev, "No matching machine driver found\n");
return -ENODEV;
}
pdev = platform_device_alloc(mach->drv_name, -1);
if (pdev == NULL) {
dev_err(bus->dev, "platform device alloc failed\n");
return -EIO;
}
ret = platform_device_add(pdev);
if (ret) {
dev_err(bus->dev, "failed to add machine device\n");
platform_device_put(pdev);
return -EIO;
}
skl->i2s_dev = pdev;
return 0;
}
static void skl_machine_device_unregister(struct skl *skl)
{
if (skl->i2s_dev)
platform_device_unregister(skl->i2s_dev);
}
static int skl_dmic_device_register(struct skl *skl) static int skl_dmic_device_register(struct skl *skl)
{ {
struct hdac_bus *bus = ebus_to_hbus(&skl->ebus); struct hdac_bus *bus = ebus_to_hbus(&skl->ebus);
...@@ -479,10 +516,15 @@ static int skl_probe(struct pci_dev *pci, ...@@ -479,10 +516,15 @@ static int skl_probe(struct pci_dev *pci,
/* check if dsp is there */ /* check if dsp is there */
if (ebus->ppcap) { if (ebus->ppcap) {
err = skl_machine_device_register(skl,
(void *)pci_id->driver_data);
if (err < 0)
goto out_free;
err = skl_init_dsp(skl); err = skl_init_dsp(skl);
if (err < 0) { if (err < 0) {
dev_dbg(bus->dev, "error failed to register dsp\n"); dev_dbg(bus->dev, "error failed to register dsp\n");
goto out_free; goto out_mach_free;
} }
} }
if (ebus->mlcap) if (ebus->mlcap)
...@@ -517,6 +559,8 @@ static int skl_probe(struct pci_dev *pci, ...@@ -517,6 +559,8 @@ static int skl_probe(struct pci_dev *pci,
skl_dmic_device_unregister(skl); skl_dmic_device_unregister(skl);
out_dsp_free: out_dsp_free:
skl_free_dsp(skl); skl_free_dsp(skl);
out_mach_free:
skl_machine_device_unregister(skl);
out_free: out_free:
skl->init_failed = 1; skl->init_failed = 1;
skl_free(ebus); skl_free(ebus);
...@@ -534,15 +578,22 @@ static void skl_remove(struct pci_dev *pci) ...@@ -534,15 +578,22 @@ static void skl_remove(struct pci_dev *pci)
pci_dev_put(pci); pci_dev_put(pci);
skl_platform_unregister(&pci->dev); skl_platform_unregister(&pci->dev);
skl_free_dsp(skl); skl_free_dsp(skl);
skl_machine_device_unregister(skl);
skl_dmic_device_unregister(skl); skl_dmic_device_unregister(skl);
skl_free(ebus); skl_free(ebus);
dev_set_drvdata(&pci->dev, NULL); dev_set_drvdata(&pci->dev, NULL);
} }
static struct sst_acpi_mach sst_skl_devdata[] = {
{ "INT343A", "skl_alc286s_i2s", "intel/dsp_fw_release.bin", NULL, NULL, NULL },
{}
};
/* PCI IDs */ /* PCI IDs */
static const struct pci_device_id skl_ids[] = { static const struct pci_device_id skl_ids[] = {
/* Sunrise Point-LP */ /* Sunrise Point-LP */
{ PCI_DEVICE(0x8086, 0x9d70), 0}, { PCI_DEVICE(0x8086, 0x9d70),
.driver_data = (unsigned long)&sst_skl_devdata},
{ 0, } { 0, }
}; };
MODULE_DEVICE_TABLE(pci, skl_ids); MODULE_DEVICE_TABLE(pci, skl_ids);
......
...@@ -61,6 +61,7 @@ struct skl { ...@@ -61,6 +61,7 @@ struct skl {
unsigned int init_failed:1; /* delayed init failed */ unsigned int init_failed:1; /* delayed init failed */
struct platform_device *dmic_dev; struct platform_device *dmic_dev;
struct platform_device *i2s_dev;
void *nhlt; /* nhlt ptr */ void *nhlt; /* nhlt ptr */
struct skl_sst *skl_sst; /* sst skl ctx */ struct skl_sst *skl_sst; /* sst skl ctx */
......
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