ALSA: hdac: add hdac extended device

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>
This commit is contained in:
Vinod Koul 2015-08-21 15:47:41 +05:30 committed by Takashi Iwai
parent ee2d51b3d4
commit a512f56116
2 changed files with 53 additions and 4 deletions

View File

@ -130,4 +130,48 @@ void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link,
writew(((readw(addr + reg) & ~(mask)) | (val)), \ writew(((readw(addr + reg) & ~(mask)) | (val)), \
addr + reg) 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 */ #endif /* __SOUND_HDAUDIO_EXT_H */

View 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 * @ebus: hdac extended bus to attach to
* @addr: codec address * @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) 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_device *hdev = NULL;
struct hdac_bus *bus = ebus_to_hbus(ebus); struct hdac_bus *bus = ebus_to_hbus(ebus);
char name[15]; char name[15];
int ret; int ret;
hdev = kzalloc(sizeof(*hdev), GFP_KERNEL); edev = kzalloc(sizeof(*hdev), GFP_KERNEL);
if (!hdev) if (!edev)
return -ENOMEM; return -ENOMEM;
hdev = &edev->hdac;
snprintf(name, sizeof(name), "ehdaudio%dD%d", ebus->idx, addr); 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); snd_hdac_ext_bus_device_exit(hdev);
return ret; return ret;
} }
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_init); 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) 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); snd_hdac_device_exit(hdev);
kfree(hdev); kfree(edev);
} }
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_exit); EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_exit);