ALSA: hdac: add hdac extended device
authorVinod Koul <vinod.koul@intel.com>
Fri, 21 Aug 2015 10:17:41 +0000 (15:47 +0530)
committerTakashi Iwai <tiwai@suse.de>
Fri, 21 Aug 2015 10:34:01 +0000 (12:34 +0200)
This adds based hdac extended device object which will be used by
ASoC HDAC codecs

Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/hdaudio_ext.h
sound/hda/ext/hdac_ext_bus.c

index 148267b76ab7752b94171bd9f4f4b1c2a5e0d788..0641d00e2a949aa53495de12bf4cb88945790a55 100644 (file)
@@ -130,4 +130,48 @@ void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link,
        writew(((readw(addr + reg) & ~(mask)) | (val)), \
                addr + reg)
 
+
+struct hdac_ext_device;
+
+/* ops common to all codec drivers */
+struct hdac_ext_codec_ops {
+       int (*build_controls)(struct hdac_ext_device *dev);
+       int (*init)(struct hdac_ext_device *dev);
+       void (*free)(struct hdac_ext_device *dev);
+};
+
+struct hda_dai_map {
+       char *dai_name;
+       hda_nid_t nid;
+       u32     maxbps;
+};
+
+#define HDA_MAX_NIDS 16
+
+/**
+ * struct hdac_ext_device - HDAC Ext device
+ *
+ * @hdac: hdac core device
+ * @nid_list - the dai map which matches the dai-name with the nid
+ * @map_cur_idx - the idx in use in dai_map
+ * @ops - the hda codec ops common to all codec drivers
+ * @pvt_data - private data, for asoc contains asoc codec object
+ */
+struct hdac_ext_device {
+       struct hdac_device hdac;
+       struct hdac_ext_bus *ebus;
+
+       /* soc-dai to nid map */
+       struct hda_dai_map nid_list[HDA_MAX_NIDS];
+       unsigned int map_cur_idx;
+
+       /* codec ops */
+       struct hdac_ext_codec_ops ops;
+
+       void *private_data;
+};
+
+#define to_ehdac_device(dev) (container_of((dev), \
+                                struct hdac_ext_device, hdac))
+
 #endif /* __SOUND_HDAUDIO_EXT_H */
index cf69202f7da0b59e571486097e63dc3456f3d9ad..94fb9878f5cb4420f30ade44cfa6feeed1ce5110 100644 (file)
@@ -125,7 +125,7 @@ static void default_release(struct device *dev)
 }
 
 /**
- * snd_hdac_ext_device_init - initialize the HDA extended codec base device
+ * snd_hdac_ext_bus_device_init - initialize the HDA extended codec base device
  * @ebus: hdac extended bus to attach to
  * @addr: codec address
  *
@@ -133,14 +133,16 @@ static void default_release(struct device *dev)
  */
 int snd_hdac_ext_bus_device_init(struct hdac_ext_bus *ebus, int addr)
 {
+       struct hdac_ext_device *edev;
        struct hdac_device *hdev = NULL;
        struct hdac_bus *bus = ebus_to_hbus(ebus);
        char name[15];
        int ret;
 
-       hdev = kzalloc(sizeof(*hdev), GFP_KERNEL);
-       if (!hdev)
+       edev = kzalloc(sizeof(*hdev), GFP_KERNEL);
+       if (!edev)
                return -ENOMEM;
+       hdev = &edev->hdac;
 
        snprintf(name, sizeof(name), "ehdaudio%dD%d", ebus->idx, addr);
 
@@ -158,6 +160,7 @@ int snd_hdac_ext_bus_device_init(struct hdac_ext_bus *ebus, int addr)
                snd_hdac_ext_bus_device_exit(hdev);
                return ret;
        }
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_init);
@@ -168,8 +171,10 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_init);
  */
 void snd_hdac_ext_bus_device_exit(struct hdac_device *hdev)
 {
+       struct hdac_ext_device *edev = to_ehdac_device(hdev);
+
        snd_hdac_device_exit(hdev);
-       kfree(hdev);
+       kfree(edev);
 }
 EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_exit);