[alsa-devel] [RFC 01/11] ALSA: hda - add id table support for hdac device/driver

Subhransu S. Prusty subhransu.s.prusty at intel.com
Sun Apr 12 14:36:08 CEST 2015


From: Jeeja KP <jeeja.kp at intel.com>

For device/driver matching, uses id table
if device type is HDA_DEV_ASOC.

Signed-off-by: Jeeja KP <jeeja.kp at intel.com>
Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty at intel.com>
Signed-off-by: Vinod Koul <vinod.koul at intel.com>
---
 include/sound/hdaudio.h  | 16 ++++++++++++++++
 sound/hda/hda_bus_type.c |  2 ++
 sound/hda/hdac_bus.c     | 24 ++++++++++++++++++++++++
 3 files changed, 42 insertions(+)

diff --git a/include/sound/hdaudio.h b/include/sound/hdaudio.h
index 1652764..3628a09 100644
--- a/include/sound/hdaudio.h
+++ b/include/sound/hdaudio.h
@@ -42,6 +42,14 @@ struct hdac_widget_tree;
  */
 extern struct bus_type snd_hda_bus_type;
 
+/*HDA device table*/
+#define HDA_NAME_SIZE      20
+struct hdac_device_id {
+	__u32 id;
+	char name[HDA_NAME_SIZE];
+	unsigned long driver_data;
+};
+
 /*
  * HD-audio codec base device
  */
@@ -82,6 +90,8 @@ struct hdac_device {
 
 	/* sysfs */
 	struct hdac_widget_tree *widgets;
+
+	const struct hdac_device_id *id_entry;
 };
 
 /* device/driver type used for matching */
@@ -96,6 +106,9 @@ enum {
 	HDA_INPUT, HDA_OUTPUT
 };
 
+
+#define hda_get_device_id(pdev)    ((pdev)->id_entry)
+
 #define dev_to_hdac_dev(_dev)	container_of(_dev, struct hdac_device, dev)
 
 int snd_hdac_device_init(struct hdac_device *dev, struct hdac_bus *bus,
@@ -126,12 +139,14 @@ static inline void snd_hdac_power_up(struct hdac_device *codec) {}
 static inline void snd_hdac_power_down(struct hdac_device *codec) {}
 #endif
 
+
 /*
  * HD-audio codec base driver
  */
 struct hdac_driver {
 	struct device_driver driver;
 	int type;
+	struct hdac_device_id *id_table;
 	int (*match)(struct hdac_device *dev, struct hdac_driver *drv);
 	void (*unsol_event)(struct hdac_device *dev, unsigned int event);
 };
@@ -248,6 +263,7 @@ void snd_hdac_bus_queue_event(struct hdac_bus *bus, u32 res, u32 res_ex);
 int snd_hdac_bus_add_device(struct hdac_bus *bus, struct hdac_device *codec);
 void snd_hdac_bus_remove_device(struct hdac_bus *bus,
 				struct hdac_device *codec);
+int snd_hdac_bus_match_id(struct hdac_device *dev, struct hdac_driver *drv);
 
 static inline void snd_hdac_codec_link_up(struct hdac_device *codec)
 {
diff --git a/sound/hda/hda_bus_type.c b/sound/hda/hda_bus_type.c
index 519914a..8899c56 100644
--- a/sound/hda/hda_bus_type.c
+++ b/sound/hda/hda_bus_type.c
@@ -19,6 +19,8 @@ static int hda_bus_match(struct device *dev, struct device_driver *drv)
 		return 0;
 	if (hdrv->match)
 		return hdrv->match(hdev, hdrv);
+	if (hdrv->id_table)
+		return snd_hdac_bus_match_id(hdev, hdrv);
 	return 1;
 }
 
diff --git a/sound/hda/hdac_bus.c b/sound/hda/hdac_bus.c
index 3294fd4..f0ee295 100644
--- a/sound/hda/hdac_bus.c
+++ b/sound/hda/hdac_bus.c
@@ -195,3 +195,27 @@ void snd_hdac_bus_remove_device(struct hdac_bus *bus,
 	bus->num_codecs--;
 }
 EXPORT_SYMBOL_GPL(snd_hdac_bus_remove_device);
+
+/**
+ * snd_hdac_bus_match_id - bind hdac device to hdac driver.
+ * @hdev: device.
+ * @hdrv: driver.
+ *
+ */
+int snd_hdac_bus_match_id(struct hdac_device *dev,
+		 struct hdac_driver *drv)
+{
+	if (drv->id_table) {
+		struct hdac_device_id *id = drv->id_table;
+
+		while (id->name[0]) {
+			if (dev->vendor_id == id->id) {
+				dev->id_entry = id;
+				return 1;
+			}
+			id++;
+		}
+	}
+	return 0;
+}
+EXPORT_SYMBOL_GPL(snd_hdac_bus_match_id);
-- 
1.9.0



More information about the Alsa-devel mailing list