@@ -9,7 +9,8 @@ int snd_hdac_ext_bus_init(struct hdac_bus *bus, struct device *dev,
const struct hdac_io_ops *io_ops);
void snd_hdac_ext_bus_exit(struct hdac_bus *bus);
-int snd_hdac_ext_bus_device_init(struct hdac_bus *bus, int addr);
+int snd_hdac_ext_bus_device_init(struct hdac_bus *bus, int addr,
+ struct hdac_device *hdev);
void snd_hdac_ext_bus_device_exit(struct hdac_device *hdev);
void snd_hdac_ext_bus_device_remove(struct hdac_bus *bus);
@@ -135,16 +135,12 @@ static void default_release(struct device *dev)
*
* Returns zero for success or a negative error code.
*/
-int snd_hdac_ext_bus_device_init(struct hdac_bus *bus, int addr)
+int snd_hdac_ext_bus_device_init(struct hdac_bus *bus, int addr,
+ struct hdac_device *hdev)
{
- struct hdac_device *hdev = NULL;
char name[15];
int ret;
- hdev = kzalloc(sizeof(*hdev), GFP_KERNEL);
- if (!hdev)
- return -ENOMEM;
-
hdev->bus = bus;
snprintf(name, sizeof(name), "ehdaudio%dD%d", bus->idx, addr);
@@ -175,7 +171,6 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_init);
void snd_hdac_ext_bus_device_exit(struct hdac_device *hdev)
{
snd_hdac_device_exit(hdev);
- kfree(hdev);
}
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_exit);
@@ -35,6 +35,7 @@
#include "skl.h"
#include "skl-sst-dsp.h"
#include "skl-sst-ipc.h"
+#include "../../../pci/hda/hda_codec.h"
static struct skl_machine_pdata skl_dmic_data;
@@ -617,6 +618,8 @@ static int probe_codec(struct hdac_bus *bus, int addr)
unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) |
(AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID;
unsigned int res = -1;
+ struct skl *skl = bus_to_skl(bus);
+ struct hdac_device *hdev;
mutex_lock(&bus->cmd_mutex);
snd_hdac_bus_send_cmd(bus, cmd);
@@ -626,7 +629,19 @@ static int probe_codec(struct hdac_bus *bus, int addr)
return -EIO;
dev_dbg(bus->dev, "codec #%d probed OK\n", addr);
- return snd_hdac_ext_bus_device_init(bus, addr);
+ /*
+ * FIXME:
+ * The legacy HDA controller driver allocates data structure
+ * for hda_codec. Ideally it should allocate only hdac_device
+ * so that it has no dependency on the data structure of the
+ * codec driver. If legacy controller driver can be changed this
+ * code change can be avoided.
+ */
+ hdev = devm_kzalloc(&skl->pci->dev, sizeof(*hdev), GFP_KERNEL);
+ if (!hdev)
+ return -ENOMEM;
+
+ return snd_hdac_ext_bus_device_init(bus, addr, hdev);
}
/* Codec initialization */
@@ -751,6 +766,7 @@ static int skl_create(struct pci_dev *pci,
{
struct skl *skl;
struct hdac_bus *bus;
+ struct hda_bus *hbus;
int err;
@@ -766,6 +782,7 @@ static int skl_create(struct pci_dev *pci,
return -ENOMEM;
}
+ hbus = skl_to_hbus(skl);
bus = skl_to_bus(skl);
snd_hdac_ext_bus_init(bus, &pci->dev, &bus_core_ops, io_ops);
bus->use_posbuf = 1;
@@ -773,6 +790,14 @@ static int skl_create(struct pci_dev *pci,
INIT_WORK(&skl->probe_work, skl_probe_work);
bus->bdl_pos_adj = 0;
+ /*
+ * TODO: other parameters can be taken the way it is taken by
+ * legacy HDA driver
+ */
+ mutex_init(&hbus->prepare_mutex);
+ hbus->pci = pci;
+ hbus->mixer_assigned = -1;
+
*rskl = skl;
return 0;
@@ -26,6 +26,7 @@
#include <sound/soc.h>
#include "skl-nhlt.h"
#include "skl-ssp-clk.h"
+#include "../../../pci/hda/hda_codec.h"
#define SKL_SUSPEND_DELAY 2000
@@ -63,7 +64,7 @@ struct skl_fw_config {
};
struct skl {
- struct hdac_bus hbus;
+ struct hda_bus hbus;
struct pci_dev *pci;
unsigned int init_done:1; /* delayed init status */
@@ -96,8 +97,11 @@ struct skl {
struct skl_fw_config cfg;
};
-#define skl_to_bus(s) (&(s)->hbus)
-#define bus_to_skl(bus) container_of(bus, struct skl, hbus)
+#define skl_to_bus(s) (&(s)->hbus.core)
+#define bus_to_skl(bus) container_of(bus, struct skl, hbus.core)
+
+#define skl_to_hbus(s) (&(s)->hbus)
+#define hbus_to_skl(hbus) container_of(hbus, struct skl, hbus)
/* to pass dai dma data */
struct skl_dma_params {
This patch prepares SKL platform driver to make reuse of legacy HDA codec drivers. It does following things. use hda_bus instead of hdac_bus in the SKL platform driver to align with the legacy controller driver. modify snd_hdac_ext_bus_device_init definition to align with snd_hdac_bus_device_init, used by legacy drivers. Memory for hdac_device is allocated by the caller Signed-off-by: Rakesh Ughreja <rakesh.a.ughreja@intel.com> --- include/sound/hdaudio_ext.h | 3 ++- sound/hda/ext/hdac_ext_bus.c | 9 ++------- sound/soc/intel/skylake/skl.c | 27 ++++++++++++++++++++++++++- sound/soc/intel/skylake/skl.h | 10 +++++++--- 4 files changed, 37 insertions(+), 12 deletions(-)