Skip to content

Commit

Permalink
ALSA: hdac: add hdac extended device
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Vinod Koul authored and Takashi Iwai committed Aug 21, 2015
1 parent ee2d51b commit a512f56
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 4 deletions.
44 changes: 44 additions & 0 deletions include/sound/hdaudio_ext.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,4 +130,48 @@ void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link,
writew(((readw(addr + reg) & ~(mask)) | (val)), \
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 */
13 changes: 9 additions & 4 deletions sound/hda/ext/hdac_ext_bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,22 +125,24 @@ 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
* @addr: codec address
*
* Returns zero for success or a negative error code.
*/
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_bus *bus = ebus_to_hbus(ebus);
char name[15];
int ret;

hdev = kzalloc(sizeof(*hdev), GFP_KERNEL);
if (!hdev)
edev = kzalloc(sizeof(*hdev), GFP_KERNEL);
if (!edev)
return -ENOMEM;
hdev = &edev->hdac;

snprintf(name, sizeof(name), "ehdaudio%dD%d", ebus->idx, addr);

Expand All @@ -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);
return ret;
}

return 0;
}
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_init);
Expand All @@ -168,8 +171,10 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_init);
*/
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);
kfree(hdev);
kfree(edev);
}
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_exit);

Expand Down

0 comments on commit a512f56

Please sign in to comment.