mirror of https://gitee.com/openkylin/linux.git
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:
parent
ee2d51b3d4
commit
a512f56116
|
@ -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 */
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue