diff mbox

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

Message ID 1428842178-7105-2-git-send-email-subhransu.s.prusty@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Subhransu S. Prusty April 12, 2015, 12:36 p.m. UTC
From: Jeeja KP <jeeja.kp@intel.com>

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

Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@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(+)

Comments

Takashi Iwai April 13, 2015, 11:46 a.m. UTC | #1
At Sun, 12 Apr 2015 18:06:08 +0530,
Subhransu S. Prusty wrote:
> 
> From: Jeeja KP <jeeja.kp@intel.com>
> 
> For device/driver matching, uses id table
> if device type is HDA_DEV_ASOC.
> 
> Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
> Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
> Signed-off-by: Vinod Koul <vinod.koul@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);

Please make these rather ASoC specific.  These ID checks aren't needed
for the legacy driver as they need more other fields checks like
revision id.

For example,

struct hda_soc_device {
	struct hdac_device core;
	const struct hda_soc_device_id *id_entry;
	....
};

and give the match ops to hdac_driver for checking the ID.


thanks,

Takashi
Vinod Koul April 14, 2015, 4:34 a.m. UTC | #2
On Mon, Apr 13, 2015 at 01:46:25PM +0200, Takashi Iwai wrote:
> At Sun, 12 Apr 2015 18:06:08 +0530,
> Subhransu S. Prusty wrote:
> > 
> > From: Jeeja KP <jeeja.kp@intel.com>
> > 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);
> 
> Please make these rather ASoC specific.  These ID checks aren't needed
> for the legacy driver as they need more other fields checks like
> revision id.
> 
> For example,
> 
> struct hda_soc_device {
> 	struct hdac_device core;
> 	const struct hda_soc_device_id *id_entry;
> 	....
> };
> 
> and give the match ops to hdac_driver for checking the ID.
Okay, will move these to asoc then. I am planning to move this to generic
asoc layer and not in skl driver specfic
diff mbox

Patch

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);