Merge branch 'topic/hda-core-intel' into for-next
Merge the development branch for HD-audio ext bus refactoring. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
@@ -215,6 +215,11 @@ struct hdac_driver {
|
||||
const struct hda_device_id *id_table;
|
||||
int (*match)(struct hdac_device *dev, struct hdac_driver *drv);
|
||||
void (*unsol_event)(struct hdac_device *dev, unsigned int event);
|
||||
|
||||
/* fields used by ext bus APIs */
|
||||
int (*probe)(struct hdac_device *dev);
|
||||
int (*remove)(struct hdac_device *dev);
|
||||
void (*shutdown)(struct hdac_device *dev);
|
||||
};
|
||||
|
||||
#define drv_to_hdac_driver(_drv) container_of(_drv, struct hdac_driver, driver)
|
||||
@@ -235,6 +240,14 @@ struct hdac_bus_ops {
|
||||
int (*link_power)(struct hdac_bus *bus, bool enable);
|
||||
};
|
||||
|
||||
/*
|
||||
* ops used for ASoC HDA codec drivers
|
||||
*/
|
||||
struct hdac_ext_bus_ops {
|
||||
int (*hdev_attach)(struct hdac_device *hdev);
|
||||
int (*hdev_detach)(struct hdac_device *hdev);
|
||||
};
|
||||
|
||||
/*
|
||||
* Lowlevel I/O operators
|
||||
*/
|
||||
@@ -277,11 +290,17 @@ struct hdac_rb {
|
||||
* @mlcap: MultiLink capabilities pointer
|
||||
* @gtscap: gts capabilities pointer
|
||||
* @drsmcap: dma resume capabilities pointer
|
||||
* @num_streams: streams supported
|
||||
* @idx: HDA link index
|
||||
* @hlink_list: link list of HDA links
|
||||
* @lock: lock for link mgmt
|
||||
* @cmd_dma_state: state of cmd DMAs: CORB and RIRB
|
||||
*/
|
||||
struct hdac_bus {
|
||||
struct device *dev;
|
||||
const struct hdac_bus_ops *ops;
|
||||
const struct hdac_io_ops *io_ops;
|
||||
const struct hdac_ext_bus_ops *ext_ops;
|
||||
|
||||
/* h/w resources */
|
||||
unsigned long addr;
|
||||
@@ -344,6 +363,16 @@ struct hdac_bus {
|
||||
/* i915 component interface */
|
||||
struct i915_audio_component *audio_component;
|
||||
int i915_power_refcount;
|
||||
|
||||
/* parameters required for enhanced capabilities */
|
||||
int num_streams;
|
||||
int idx;
|
||||
|
||||
struct list_head hlink_list;
|
||||
|
||||
struct mutex lock;
|
||||
bool cmd_dma_state;
|
||||
|
||||
};
|
||||
|
||||
int snd_hdac_bus_init(struct hdac_bus *bus, struct device *dev,
|
||||
|
@@ -4,38 +4,16 @@
|
||||
|
||||
#include <sound/hdaudio.h>
|
||||
|
||||
/**
|
||||
* hdac_ext_bus: HDAC extended bus for extended HDA caps
|
||||
*
|
||||
* @bus: hdac bus
|
||||
* @num_streams: streams supported
|
||||
* @hlink_list: link list of HDA links
|
||||
* @lock: lock for link mgmt
|
||||
* @cmd_dma_state: state of cmd DMAs: CORB and RIRB
|
||||
*/
|
||||
struct hdac_ext_bus {
|
||||
struct hdac_bus bus;
|
||||
int num_streams;
|
||||
int idx;
|
||||
|
||||
struct list_head hlink_list;
|
||||
|
||||
struct mutex lock;
|
||||
bool cmd_dma_state;
|
||||
};
|
||||
|
||||
int snd_hdac_ext_bus_init(struct hdac_ext_bus *sbus, struct device *dev,
|
||||
int snd_hdac_ext_bus_init(struct hdac_bus *bus, struct device *dev,
|
||||
const struct hdac_bus_ops *ops,
|
||||
const struct hdac_io_ops *io_ops);
|
||||
const struct hdac_io_ops *io_ops,
|
||||
const struct hdac_ext_bus_ops *ext_ops);
|
||||
|
||||
void snd_hdac_ext_bus_exit(struct hdac_ext_bus *sbus);
|
||||
int snd_hdac_ext_bus_device_init(struct hdac_ext_bus *sbus, int addr);
|
||||
void snd_hdac_ext_bus_exit(struct hdac_bus *bus);
|
||||
int snd_hdac_ext_bus_device_init(struct hdac_bus *bus, int addr,
|
||||
struct hdac_device *hdev);
|
||||
void snd_hdac_ext_bus_device_exit(struct hdac_device *hdev);
|
||||
void snd_hdac_ext_bus_device_remove(struct hdac_ext_bus *ebus);
|
||||
|
||||
#define ebus_to_hbus(ebus) (&(ebus)->bus)
|
||||
#define hbus_to_ebus(_bus) \
|
||||
container_of(_bus, struct hdac_ext_bus, bus)
|
||||
void snd_hdac_ext_bus_device_remove(struct hdac_bus *bus);
|
||||
|
||||
#define HDA_CODEC_REV_EXT_ENTRY(_vid, _rev, _name, drv_data) \
|
||||
{ .vendor_id = (_vid), .rev_id = (_rev), .name = (_name), \
|
||||
@@ -44,14 +22,14 @@ void snd_hdac_ext_bus_device_remove(struct hdac_ext_bus *ebus);
|
||||
#define HDA_CODEC_EXT_ENTRY(_vid, _revid, _name, _drv_data) \
|
||||
HDA_CODEC_REV_EXT_ENTRY(_vid, _revid, _name, _drv_data)
|
||||
|
||||
void snd_hdac_ext_bus_ppcap_enable(struct hdac_ext_bus *chip, bool enable);
|
||||
void snd_hdac_ext_bus_ppcap_int_enable(struct hdac_ext_bus *chip, bool enable);
|
||||
void snd_hdac_ext_bus_ppcap_enable(struct hdac_bus *chip, bool enable);
|
||||
void snd_hdac_ext_bus_ppcap_int_enable(struct hdac_bus *chip, bool enable);
|
||||
|
||||
void snd_hdac_ext_stream_spbcap_enable(struct hdac_ext_bus *chip,
|
||||
void snd_hdac_ext_stream_spbcap_enable(struct hdac_bus *chip,
|
||||
bool enable, int index);
|
||||
|
||||
int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_ext_bus *bus);
|
||||
struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_ext_bus *bus,
|
||||
int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_bus *bus);
|
||||
struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_bus *bus,
|
||||
const char *codec_name);
|
||||
|
||||
enum hdac_ext_stream_type {
|
||||
@@ -100,28 +78,28 @@ struct hdac_ext_stream {
|
||||
#define stream_to_hdac_ext_stream(s) \
|
||||
container_of(s, struct hdac_ext_stream, hstream)
|
||||
|
||||
void snd_hdac_ext_stream_init(struct hdac_ext_bus *bus,
|
||||
void snd_hdac_ext_stream_init(struct hdac_bus *bus,
|
||||
struct hdac_ext_stream *stream, int idx,
|
||||
int direction, int tag);
|
||||
int snd_hdac_ext_stream_init_all(struct hdac_ext_bus *ebus, int start_idx,
|
||||
int snd_hdac_ext_stream_init_all(struct hdac_bus *bus, int start_idx,
|
||||
int num_stream, int dir);
|
||||
void snd_hdac_stream_free_all(struct hdac_ext_bus *ebus);
|
||||
void snd_hdac_link_free_all(struct hdac_ext_bus *ebus);
|
||||
struct hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_ext_bus *bus,
|
||||
void snd_hdac_stream_free_all(struct hdac_bus *bus);
|
||||
void snd_hdac_link_free_all(struct hdac_bus *bus);
|
||||
struct hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_bus *bus,
|
||||
struct snd_pcm_substream *substream,
|
||||
int type);
|
||||
void snd_hdac_ext_stream_release(struct hdac_ext_stream *azx_dev, int type);
|
||||
void snd_hdac_ext_stream_decouple(struct hdac_ext_bus *bus,
|
||||
void snd_hdac_ext_stream_decouple(struct hdac_bus *bus,
|
||||
struct hdac_ext_stream *azx_dev, bool decouple);
|
||||
void snd_hdac_ext_stop_streams(struct hdac_ext_bus *sbus);
|
||||
void snd_hdac_ext_stop_streams(struct hdac_bus *bus);
|
||||
|
||||
int snd_hdac_ext_stream_set_spib(struct hdac_ext_bus *ebus,
|
||||
int snd_hdac_ext_stream_set_spib(struct hdac_bus *bus,
|
||||
struct hdac_ext_stream *stream, u32 value);
|
||||
int snd_hdac_ext_stream_get_spbmaxfifo(struct hdac_ext_bus *ebus,
|
||||
int snd_hdac_ext_stream_get_spbmaxfifo(struct hdac_bus *bus,
|
||||
struct hdac_ext_stream *stream);
|
||||
void snd_hdac_ext_stream_drsm_enable(struct hdac_ext_bus *ebus,
|
||||
void snd_hdac_ext_stream_drsm_enable(struct hdac_bus *bus,
|
||||
bool enable, int index);
|
||||
int snd_hdac_ext_stream_set_dpibr(struct hdac_ext_bus *ebus,
|
||||
int snd_hdac_ext_stream_set_dpibr(struct hdac_bus *bus,
|
||||
struct hdac_ext_stream *stream, u32 value);
|
||||
int snd_hdac_ext_stream_set_lpib(struct hdac_ext_stream *stream, u32 value);
|
||||
|
||||
@@ -144,17 +122,15 @@ struct hdac_ext_link {
|
||||
|
||||
int snd_hdac_ext_bus_link_power_up(struct hdac_ext_link *link);
|
||||
int snd_hdac_ext_bus_link_power_down(struct hdac_ext_link *link);
|
||||
int snd_hdac_ext_bus_link_power_up_all(struct hdac_ext_bus *ebus);
|
||||
int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus);
|
||||
int snd_hdac_ext_bus_link_power_up_all(struct hdac_bus *bus);
|
||||
int snd_hdac_ext_bus_link_power_down_all(struct hdac_bus *bus);
|
||||
void snd_hdac_ext_link_set_stream_id(struct hdac_ext_link *link,
|
||||
int stream);
|
||||
void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link,
|
||||
int stream);
|
||||
|
||||
int snd_hdac_ext_bus_link_get(struct hdac_ext_bus *ebus,
|
||||
struct hdac_ext_link *link);
|
||||
int snd_hdac_ext_bus_link_put(struct hdac_ext_bus *ebus,
|
||||
struct hdac_ext_link *link);
|
||||
int snd_hdac_ext_bus_link_get(struct hdac_bus *bus, struct hdac_ext_link *link);
|
||||
int snd_hdac_ext_bus_link_put(struct hdac_bus *bus, struct hdac_ext_link *link);
|
||||
|
||||
/* update register macro */
|
||||
#define snd_hdac_updatel(addr, reg, mask, val) \
|
||||
@@ -181,53 +157,12 @@ struct hda_dai_map {
|
||||
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 hdev;
|
||||
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;
|
||||
|
||||
struct snd_card *card;
|
||||
void *scodec;
|
||||
void *private_data;
|
||||
};
|
||||
|
||||
struct hdac_ext_dma_params {
|
||||
u32 format;
|
||||
u8 stream_tag;
|
||||
};
|
||||
#define to_ehdac_device(dev) (container_of((dev), \
|
||||
struct hdac_ext_device, hdev))
|
||||
/*
|
||||
* HD-audio codec base driver
|
||||
*/
|
||||
struct hdac_ext_driver {
|
||||
struct hdac_driver hdac;
|
||||
|
||||
int (*probe)(struct hdac_ext_device *dev);
|
||||
int (*remove)(struct hdac_ext_device *dev);
|
||||
void (*shutdown)(struct hdac_ext_device *dev);
|
||||
};
|
||||
|
||||
int snd_hda_ext_driver_register(struct hdac_ext_driver *drv);
|
||||
void snd_hda_ext_driver_unregister(struct hdac_ext_driver *drv);
|
||||
|
||||
#define to_ehdac_driver(_drv) container_of(_drv, struct hdac_ext_driver, hdac)
|
||||
int snd_hda_ext_driver_register(struct hdac_driver *drv);
|
||||
void snd_hda_ext_driver_unregister(struct hdac_driver *drv);
|
||||
|
||||
#endif /* __SOUND_HDAUDIO_EXT_H */
|
||||
|
Reference in New Issue
Block a user