|
@@ -453,19 +453,34 @@ static struct skl_ssp_clk skl_ssp_clks[] = {
|
|
|
{.name = "ssp5_sclkfs"},
|
|
|
};
|
|
|
|
|
|
-static int skl_machine_device_register(struct skl *skl, void *driver_data)
|
|
|
+static int skl_find_machine(struct skl *skl, void *driver_data)
|
|
|
{
|
|
|
- struct hdac_bus *bus = ebus_to_hbus(&skl->ebus);
|
|
|
- struct platform_device *pdev;
|
|
|
struct snd_soc_acpi_mach *mach = driver_data;
|
|
|
- int ret;
|
|
|
+ struct hdac_bus *bus = ebus_to_hbus(&skl->ebus);
|
|
|
+ struct skl_machine_pdata *pdata;
|
|
|
|
|
|
mach = snd_soc_acpi_find_machine(mach);
|
|
|
if (mach == NULL) {
|
|
|
dev_err(bus->dev, "No matching machine driver found\n");
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
+
|
|
|
+ skl->mach = mach;
|
|
|
skl->fw_name = mach->fw_filename;
|
|
|
+ pdata = skl->mach->pdata;
|
|
|
+
|
|
|
+ if (mach->pdata)
|
|
|
+ skl->use_tplg_pcm = pdata->use_tplg_pcm;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int skl_machine_device_register(struct skl *skl)
|
|
|
+{
|
|
|
+ struct hdac_bus *bus = ebus_to_hbus(&skl->ebus);
|
|
|
+ struct snd_soc_acpi_mach *mach = skl->mach;
|
|
|
+ struct platform_device *pdev;
|
|
|
+ int ret;
|
|
|
|
|
|
pdev = platform_device_alloc(mach->drv_name, -1);
|
|
|
if (pdev == NULL) {
|
|
@@ -480,11 +495,8 @@ static int skl_machine_device_register(struct skl *skl, void *driver_data)
|
|
|
return -EIO;
|
|
|
}
|
|
|
|
|
|
- if (mach->pdata) {
|
|
|
- skl->use_tplg_pcm =
|
|
|
- ((struct skl_machine_pdata *)mach->pdata)->use_tplg_pcm;
|
|
|
+ if (mach->pdata)
|
|
|
dev_set_drvdata(&pdev->dev, mach->pdata);
|
|
|
- }
|
|
|
|
|
|
skl->i2s_dev = pdev;
|
|
|
|
|
@@ -701,18 +713,30 @@ static void skl_probe_work(struct work_struct *work)
|
|
|
/* create codec instances */
|
|
|
skl_codec_create(ebus);
|
|
|
|
|
|
+ /* register platform dai and controls */
|
|
|
+ err = skl_platform_register(bus->dev);
|
|
|
+ if (err < 0) {
|
|
|
+ dev_err(bus->dev, "platform register failed: %d\n", err);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (bus->ppcap) {
|
|
|
+ err = skl_machine_device_register(skl);
|
|
|
+ if (err < 0) {
|
|
|
+ dev_err(bus->dev, "machine register failed: %d\n", err);
|
|
|
+ goto out_err;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)) {
|
|
|
err = snd_hdac_display_power(bus, false);
|
|
|
if (err < 0) {
|
|
|
dev_err(bus->dev, "Cannot turn off display power on i915\n");
|
|
|
+ skl_machine_device_unregister(skl);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /* register platform dai and controls */
|
|
|
- err = skl_platform_register(bus->dev);
|
|
|
- if (err < 0)
|
|
|
- return;
|
|
|
/*
|
|
|
* we are done probing so decrement link counts
|
|
|
*/
|
|
@@ -882,18 +906,16 @@ static int skl_probe(struct pci_dev *pci,
|
|
|
if (err < 0)
|
|
|
goto out_clk_free;
|
|
|
|
|
|
- err = skl_machine_device_register(skl,
|
|
|
- (void *)pci_id->driver_data);
|
|
|
+ err = skl_find_machine(skl, (void *)pci_id->driver_data);
|
|
|
if (err < 0)
|
|
|
goto out_nhlt_free;
|
|
|
|
|
|
err = skl_init_dsp(skl);
|
|
|
if (err < 0) {
|
|
|
dev_dbg(bus->dev, "error failed to register dsp\n");
|
|
|
- goto out_mach_free;
|
|
|
+ goto out_nhlt_free;
|
|
|
}
|
|
|
skl->skl_sst->enable_miscbdcge = skl_enable_miscbdcge;
|
|
|
-
|
|
|
}
|
|
|
if (bus->mlcap)
|
|
|
snd_hdac_ext_bus_get_ml_capabilities(ebus);
|
|
@@ -911,8 +933,6 @@ static int skl_probe(struct pci_dev *pci,
|
|
|
|
|
|
out_dsp_free:
|
|
|
skl_free_dsp(skl);
|
|
|
-out_mach_free:
|
|
|
- skl_machine_device_unregister(skl);
|
|
|
out_clk_free:
|
|
|
skl_clock_device_unregister(skl);
|
|
|
out_nhlt_free:
|