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

Takashi Iwai tiwai at suse.de
Mon Apr 13 13:46:25 CEST 2015


At Sun, 12 Apr 2015 18:06:08 +0530,
Subhransu S. Prusty wrote:
> 
> 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);

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


More information about the Alsa-devel mailing list