Commit 9a9b13dd authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'topic/hda-core-intel' into topic/hda-acomp

parents c5a59d24 cb04ba33
...@@ -188,6 +188,11 @@ struct hdac_driver { ...@@ -188,6 +188,11 @@ struct hdac_driver {
const struct hda_device_id *id_table; const struct hda_device_id *id_table;
int (*match)(struct hdac_device *dev, struct hdac_driver *drv); int (*match)(struct hdac_device *dev, struct hdac_driver *drv);
void (*unsol_event)(struct hdac_device *dev, unsigned int event); 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) #define drv_to_hdac_driver(_drv) container_of(_drv, struct hdac_driver, driver)
...@@ -208,6 +213,14 @@ struct hdac_bus_ops { ...@@ -208,6 +213,14 @@ struct hdac_bus_ops {
int (*link_power)(struct hdac_bus *bus, bool enable); 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 * Lowlevel I/O operators
*/ */
...@@ -250,11 +263,17 @@ struct hdac_rb { ...@@ -250,11 +263,17 @@ struct hdac_rb {
* @mlcap: MultiLink capabilities pointer * @mlcap: MultiLink capabilities pointer
* @gtscap: gts capabilities pointer * @gtscap: gts capabilities pointer
* @drsmcap: dma resume 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 hdac_bus {
struct device *dev; struct device *dev;
const struct hdac_bus_ops *ops; 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;
/* h/w resources */ /* h/w resources */
unsigned long addr; unsigned long addr;
...@@ -317,6 +336,16 @@ struct hdac_bus { ...@@ -317,6 +336,16 @@ struct hdac_bus {
/* i915 component interface */ /* i915 component interface */
struct i915_audio_component *audio_component; struct i915_audio_component *audio_component;
int i915_power_refcount; 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, int snd_hdac_bus_init(struct hdac_bus *bus, struct device *dev,
......
...@@ -4,38 +4,16 @@ ...@@ -4,38 +4,16 @@
#include <sound/hdaudio.h> #include <sound/hdaudio.h>
/** int snd_hdac_ext_bus_init(struct hdac_bus *bus, struct device *dev,
* 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,
const struct hdac_bus_ops *ops, 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); void snd_hdac_ext_bus_exit(struct hdac_bus *bus);
int snd_hdac_ext_bus_device_init(struct hdac_ext_bus *sbus, int addr); 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_exit(struct hdac_device *hdev);
void snd_hdac_ext_bus_device_remove(struct hdac_ext_bus *ebus); void snd_hdac_ext_bus_device_remove(struct hdac_bus *bus);
#define ebus_to_hbus(ebus) (&(ebus)->bus)
#define hbus_to_ebus(_bus) \
container_of(_bus, struct hdac_ext_bus, bus)
#define HDA_CODEC_REV_EXT_ENTRY(_vid, _rev, _name, drv_data) \ #define HDA_CODEC_REV_EXT_ENTRY(_vid, _rev, _name, drv_data) \
{ .vendor_id = (_vid), .rev_id = (_rev), .name = (_name), \ { .vendor_id = (_vid), .rev_id = (_rev), .name = (_name), \
...@@ -44,14 +22,14 @@ void snd_hdac_ext_bus_device_remove(struct hdac_ext_bus *ebus); ...@@ -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) \ #define HDA_CODEC_EXT_ENTRY(_vid, _revid, _name, _drv_data) \
HDA_CODEC_REV_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_enable(struct hdac_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_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); bool enable, int index);
int snd_hdac_ext_bus_get_ml_capabilities(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_ext_bus *bus, struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_bus *bus,
const char *codec_name); const char *codec_name);
enum hdac_ext_stream_type { enum hdac_ext_stream_type {
...@@ -100,28 +78,28 @@ struct hdac_ext_stream { ...@@ -100,28 +78,28 @@ struct hdac_ext_stream {
#define stream_to_hdac_ext_stream(s) \ #define stream_to_hdac_ext_stream(s) \
container_of(s, struct hdac_ext_stream, hstream) 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, struct hdac_ext_stream *stream, int idx,
int direction, int tag); 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); int num_stream, int dir);
void snd_hdac_stream_free_all(struct hdac_ext_bus *ebus); void snd_hdac_stream_free_all(struct hdac_bus *bus);
void snd_hdac_link_free_all(struct hdac_ext_bus *ebus); void snd_hdac_link_free_all(struct hdac_bus *bus);
struct hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_ext_bus *bus, struct hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_bus *bus,
struct snd_pcm_substream *substream, struct snd_pcm_substream *substream,
int type); int type);
void snd_hdac_ext_stream_release(struct hdac_ext_stream *azx_dev, 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); 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); 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); 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); 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); struct hdac_ext_stream *stream, u32 value);
int snd_hdac_ext_stream_set_lpib(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 { ...@@ -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_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_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_up_all(struct hdac_bus *bus);
int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus); 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, void snd_hdac_ext_link_set_stream_id(struct hdac_ext_link *link,
int stream); int stream);
void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link, void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link,
int stream); int stream);
int snd_hdac_ext_bus_link_get(struct hdac_ext_bus *ebus, int snd_hdac_ext_bus_link_get(struct hdac_bus *bus, struct hdac_ext_link *link);
struct hdac_ext_link *link); int snd_hdac_ext_bus_link_put(struct hdac_bus *bus, struct hdac_ext_link *link);
int snd_hdac_ext_bus_link_put(struct hdac_ext_bus *ebus,
struct hdac_ext_link *link);
/* update register macro */ /* update register macro */
#define snd_hdac_updatel(addr, reg, mask, val) \ #define snd_hdac_updatel(addr, reg, mask, val) \
...@@ -181,53 +157,12 @@ struct hda_dai_map { ...@@ -181,53 +157,12 @@ struct hda_dai_map {
u32 maxbps; 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 { struct hdac_ext_dma_params {
u32 format; u32 format;
u8 stream_tag; 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 */ #endif /* __SOUND_HDAUDIO_EXT_H */
...@@ -87,9 +87,10 @@ static const struct hdac_io_ops hdac_ext_default_io = { ...@@ -87,9 +87,10 @@ static const struct hdac_io_ops hdac_ext_default_io = {
* *
* Returns 0 if successful, or a negative error code. * Returns 0 if successful, or a negative error code.
*/ */
int snd_hdac_ext_bus_init(struct hdac_ext_bus *ebus, 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_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)
{ {
int ret; int ret;
static int idx; static int idx;
...@@ -98,15 +99,16 @@ int snd_hdac_ext_bus_init(struct hdac_ext_bus *ebus, struct device *dev, ...@@ -98,15 +99,16 @@ int snd_hdac_ext_bus_init(struct hdac_ext_bus *ebus, struct device *dev,
if (io_ops == NULL) if (io_ops == NULL)
io_ops = &hdac_ext_default_io; io_ops = &hdac_ext_default_io;
ret = snd_hdac_bus_init(&ebus->bus, dev, ops, io_ops); ret = snd_hdac_bus_init(bus, dev, ops, io_ops);
if (ret < 0) if (ret < 0)
return ret; return ret;
INIT_LIST_HEAD(&ebus->hlink_list); bus->ext_ops = ext_ops;
ebus->idx = idx++; INIT_LIST_HEAD(&bus->hlink_list);
bus->idx = idx++;
mutex_init(&ebus->lock); mutex_init(&bus->lock);
ebus->cmd_dma_state = true; bus->cmd_dma_state = true;
return 0; return 0;
} }
...@@ -116,10 +118,10 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_init); ...@@ -116,10 +118,10 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_init);
* snd_hdac_ext_bus_exit - clean up a HD-audio extended bus * snd_hdac_ext_bus_exit - clean up a HD-audio extended bus
* @ebus: the pointer to extended bus object * @ebus: the pointer to extended bus object
*/ */
void snd_hdac_ext_bus_exit(struct hdac_ext_bus *ebus) void snd_hdac_ext_bus_exit(struct hdac_bus *bus)
{ {
snd_hdac_bus_exit(&ebus->bus); snd_hdac_bus_exit(bus);
WARN_ON(!list_empty(&ebus->hlink_list)); WARN_ON(!list_empty(&bus->hlink_list));
} }
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_exit); EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_exit);
...@@ -135,21 +137,15 @@ static void default_release(struct device *dev) ...@@ -135,21 +137,15 @@ static void default_release(struct device *dev)
* *
* Returns zero for success or a negative error code. * Returns zero for success or a negative error code.
*/ */
int snd_hdac_ext_bus_device_init(struct hdac_ext_bus *ebus, int addr) int snd_hdac_ext_bus_device_init(struct hdac_bus *bus, int addr,
struct hdac_device *hdev)
{ {
struct hdac_ext_device *edev;
struct hdac_device *hdev = NULL;
struct hdac_bus *bus = ebus_to_hbus(ebus);
char name[15]; char name[15];
int ret; int ret;
edev = kzalloc(sizeof(*edev), GFP_KERNEL); hdev->bus = bus;
if (!edev)
return -ENOMEM;
hdev = &edev->hdev;
edev->ebus = ebus;
snprintf(name, sizeof(name), "ehdaudio%dD%d", ebus->idx, addr); snprintf(name, sizeof(name), "ehdaudio%dD%d", bus->idx, addr);
ret = snd_hdac_device_init(hdev, bus, name, addr); ret = snd_hdac_device_init(hdev, bus, name, addr);
if (ret < 0) { if (ret < 0) {
...@@ -176,10 +172,8 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_init); ...@@ -176,10 +172,8 @@ 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(edev); kfree(hdev);
} }
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_exit); EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_exit);
...@@ -188,14 +182,14 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_exit); ...@@ -188,14 +182,14 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_exit);
* *
* @ebus: HD-audio extended bus * @ebus: HD-audio extended bus
*/ */
void snd_hdac_ext_bus_device_remove(struct hdac_ext_bus *ebus) void snd_hdac_ext_bus_device_remove(struct hdac_bus *bus)
{ {
struct hdac_device *codec, *__codec; struct hdac_device *codec, *__codec;
/* /*
* we need to remove all the codec devices objects created in the * we need to remove all the codec devices objects created in the
* snd_hdac_ext_bus_device_init * snd_hdac_ext_bus_device_init
*/ */
list_for_each_entry_safe(codec, __codec, &ebus->bus.codec_list, list) { list_for_each_entry_safe(codec, __codec, &bus->codec_list, list) {
snd_hdac_device_unregister(codec); snd_hdac_device_unregister(codec);
put_device(&codec->dev); put_device(&codec->dev);
} }
...@@ -204,35 +198,31 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_remove); ...@@ -204,35 +198,31 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_remove);
#define dev_to_hdac(dev) (container_of((dev), \ #define dev_to_hdac(dev) (container_of((dev), \
struct hdac_device, dev)) struct hdac_device, dev))
static inline struct hdac_ext_driver *get_edrv(struct device *dev) static inline struct hdac_driver *get_hdrv(struct device *dev)
{ {
struct hdac_driver *hdrv = drv_to_hdac_driver(dev->driver); struct hdac_driver *hdrv = drv_to_hdac_driver(dev->driver);
struct hdac_ext_driver *edrv = to_ehdac_driver(hdrv); return hdrv;
return edrv;
} }
static inline struct hdac_ext_device *get_edev(struct device *dev) static inline struct hdac_device *get_hdev(struct device *dev)
{ {
struct hdac_device *hdev = dev_to_hdac_dev(dev); struct hdac_device *hdev = dev_to_hdac_dev(dev);
struct hdac_ext_device *edev = to_ehdac_device(hdev); return hdev;
return edev;
} }
static int hda_ext_drv_probe(struct device *dev) static int hda_ext_drv_probe(struct device *dev)
{ {
return (get_edrv(dev))->probe(get_edev(dev)); return (get_hdrv(dev))->probe(get_hdev(dev));
} }
static int hdac_ext_drv_remove(struct device *dev) static int hdac_ext_drv_remove(struct device *dev)
{ {
return (get_edrv(dev))->remove(get_edev(dev)); return (get_hdrv(dev))->remove(get_hdev(dev));
} }
static void hdac_ext_drv_shutdown(struct device *dev) static void hdac_ext_drv_shutdown(struct device *dev)
{ {
return (get_edrv(dev))->shutdown(get_edev(dev)); return (get_hdrv(dev))->shutdown(get_hdev(dev));
} }
/** /**
...@@ -240,20 +230,20 @@ static void hdac_ext_drv_shutdown(struct device *dev) ...@@ -240,20 +230,20 @@ static void hdac_ext_drv_shutdown(struct device *dev)
* *
* @drv: ext hda driver structure * @drv: ext hda driver structure
*/ */
int snd_hda_ext_driver_register(struct hdac_ext_driver *drv) int snd_hda_ext_driver_register(struct hdac_driver *drv)
{ {
drv->hdac.type = HDA_DEV_ASOC; drv->type = HDA_DEV_ASOC;
drv->hdac.driver.bus = &snd_hda_bus_type; drv->driver.bus = &snd_hda_bus_type;
/* we use default match */ /* we use default match */
if (drv->probe) if (drv->probe)
drv->hdac.driver.probe = hda_ext_drv_probe; drv->driver.probe = hda_ext_drv_probe;
if (drv->remove) if (drv->remove)
drv->hdac.driver.remove = hdac_ext_drv_remove; drv->driver.remove = hdac_ext_drv_remove;
if (drv->shutdown) if (drv->shutdown)
drv->hdac.driver.shutdown = hdac_ext_drv_shutdown; drv->driver.shutdown = hdac_ext_drv_shutdown;
return driver_register(&drv->hdac.driver); return driver_register(&drv->driver);
} }
EXPORT_SYMBOL_GPL(snd_hda_ext_driver_register); EXPORT_SYMBOL_GPL(snd_hda_ext_driver_register);
...@@ -262,8 +252,8 @@ EXPORT_SYMBOL_GPL(snd_hda_ext_driver_register); ...@@ -262,8 +252,8 @@ EXPORT_SYMBOL_GPL(snd_hda_ext_driver_register);
* *
* @drv: ext hda driver structure * @drv: ext hda driver structure
*/ */
void snd_hda_ext_driver_unregister(struct hdac_ext_driver *drv) void snd_hda_ext_driver_unregister(struct hdac_driver *drv)
{ {
driver_unregister(&drv->hdac.driver); driver_unregister(&drv->driver);
} }
EXPORT_SYMBOL_GPL(snd_hda_ext_driver_unregister); EXPORT_SYMBOL_GPL(snd_hda_ext_driver_unregister);
...@@ -39,9 +39,8 @@ ...@@ -39,9 +39,8 @@
* @ebus: HD-audio extended core bus * @ebus: HD-audio extended core bus
* @enable: flag to turn on/off the capability * @enable: flag to turn on/off the capability
*/ */
void snd_hdac_ext_bus_ppcap_enable(struct hdac_ext_bus *ebus, bool enable) void snd_hdac_ext_bus_ppcap_enable(struct hdac_bus *bus, bool enable)
{ {
struct hdac_bus *bus = &ebus->bus;
if (!bus->ppcap) { if (!bus->ppcap) {
dev_err(bus->dev, "Address of PP capability is NULL"); dev_err(bus->dev, "Address of PP capability is NULL");
...@@ -60,9 +59,8 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_ppcap_enable); ...@@ -60,9 +59,8 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_ppcap_enable);
* @ebus: HD-audio extended core bus * @ebus: HD-audio extended core bus
* @enable: flag to enable/disable interrupt * @enable: flag to enable/disable interrupt
*/ */
void snd_hdac_ext_bus_ppcap_int_enable(struct hdac_ext_bus *ebus, bool enable) void snd_hdac_ext_bus_ppcap_int_enable(struct hdac_bus *bus, bool enable)
{ {
struct hdac_bus *bus = &ebus->bus;
if (!bus->ppcap) { if (!bus->ppcap) {
dev_err(bus->dev, "Address of PP capability is NULL\n"); dev_err(bus->dev, "Address of PP capability is NULL\n");
...@@ -89,12 +87,11 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_ppcap_int_enable); ...@@ -89,12 +87,11 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_ppcap_int_enable);
* in hlink_list of extended hdac bus * in hlink_list of extended hdac bus
* Note: this will be freed on bus exit by driver * Note: this will be freed on bus exit by driver
*/ */
int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_ext_bus *ebus) int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_bus *bus)
{ {
int idx; int idx;
u32 link_count; u32 link_count;
struct hdac_ext_link *hlink; struct hdac_ext_link *hlink;
struct hdac_bus *bus = &ebus->bus;
link_count = readl(bus->mlcap + AZX_REG_ML_MLCD) + 1; link_count = readl(bus->mlcap + AZX_REG_ML_MLCD) + 1;
...@@ -114,7 +111,7 @@ int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_ext_bus *ebus) ...@@ -114,7 +111,7 @@ int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_ext_bus *ebus)
/* since link in On, update the ref */ /* since link in On, update the ref */
hlink->ref_count = 1; hlink->ref_count = 1;
list_add_tail(&hlink->list, &ebus->hlink_list); list_add_tail(&hlink->list, &bus->hlink_list);
} }
return 0; return 0;
...@@ -127,12 +124,12 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_get_ml_capabilities); ...@@ -127,12 +124,12 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_get_ml_capabilities);
* @ebus: HD-audio ext core bus * @ebus: HD-audio ext core bus
*/ */
void snd_hdac_link_free_all(struct hdac_ext_bus *ebus) void snd_hdac_link_free_all(struct hdac_bus *bus)
{ {
struct hdac_ext_link *l; struct hdac_ext_link *l;
while (!list_empty(&ebus->hlink_list)) { while (!list_empty(&bus->hlink_list)) {
l = list_first_entry(&ebus->hlink_list, struct hdac_ext_link, list); l = list_first_entry(&bus->hlink_list, struct hdac_ext_link, list);
list_del(&l->list); list_del(&l->list);
kfree(l); kfree(l);
} }
...@@ -144,7 +141,7 @@ EXPORT_SYMBOL_GPL(snd_hdac_link_free_all); ...@@ -144,7 +141,7 @@ EXPORT_SYMBOL_GPL(snd_hdac_link_free_all);
* @ebus: HD-audio extended core bus * @ebus: HD-audio extended core bus
* @codec_name: codec name * @codec_name: codec name
*/ */
struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_ext_bus *ebus, struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_bus *bus,
const char *codec_name) const char *codec_name)
{ {
int i; int i;
...@@ -153,10 +150,10 @@ struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_ext_bus *ebus, ...@@ -153,10 +150,10 @@ struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_ext_bus *ebus,
if (sscanf(codec_name, "ehdaudio%dD%d", &bus_idx, &addr) != 2) if (sscanf(codec_name, "ehdaudio%dD%d", &bus_idx, &addr) != 2)
return NULL; return NULL;
if (ebus->idx != bus_idx) if (bus->idx != bus_idx)
return NULL; return NULL;
list_for_each_entry(hlink, &ebus->hlink_list, list) { list_for_each_entry(hlink, &bus->hlink_list, list) {
for (i = 0; i < HDA_MAX_CODECS; i++) { for (i = 0; i < HDA_MAX_CODECS; i++) {
if (hlink->lsdiid & (0x1 << addr)) if (hlink->lsdiid & (0x1 << addr))
return hlink; return hlink;
...@@ -219,12 +216,12 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_down); ...@@ -219,12 +216,12 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_down);
* snd_hdac_ext_bus_link_power_up_all -power up all hda link * snd_hdac_ext_bus_link_power_up_all -power up all hda link
* @ebus: HD-audio extended bus * @ebus: HD-audio extended bus
*/ */
int snd_hdac_ext_bus_link_power_up_all(struct hdac_ext_bus *ebus) int snd_hdac_ext_bus_link_power_up_all(struct hdac_bus *bus)
{ {
struct hdac_ext_link *hlink = NULL; struct hdac_ext_link *hlink = NULL;
int ret; int ret;
list_for_each_entry(hlink, &ebus->hlink_list, list) { list_for_each_entry(hlink, &bus->hlink_list, list) {
snd_hdac_updatel(hlink->ml_addr, snd_hdac_updatel(hlink->ml_addr,
AZX_REG_ML_LCTL, 0, AZX_MLCTL_SPA); AZX_REG_ML_LCTL, 0, AZX_MLCTL_SPA);
ret = check_hdac_link_power_active(hlink, true); ret = check_hdac_link_power_active(hlink, true);
...@@ -240,12 +237,12 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_up_all); ...@@ -240,12 +237,12 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_up_all);
* snd_hdac_ext_bus_link_power_down_all -power down all hda link * snd_hdac_ext_bus_link_power_down_all -power down all hda link
* @ebus: HD-audio extended bus * @ebus: HD-audio extended bus
*/ */
int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus) int snd_hdac_ext_bus_link_power_down_all(struct hdac_bus *bus)
{ {
struct hdac_ext_link *hlink = NULL; struct hdac_ext_link *hlink = NULL;
int ret; int ret;
list_for_each_entry(hlink, &ebus->hlink_list, list) { list_for_each_entry(hlink, &bus->hlink_list, list) {
snd_hdac_updatel(hlink->ml_addr, AZX_REG_ML_LCTL, AZX_MLCTL_SPA, 0); snd_hdac_updatel(hlink->ml_addr, AZX_REG_ML_LCTL, AZX_MLCTL_SPA, 0);
ret = check_hdac_link_power_active(hlink, false); ret = check_hdac_link_power_active(hlink, false);
if (ret < 0) if (ret < 0)
...@@ -256,39 +253,48 @@ int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus) ...@@ -256,39 +253,48 @@ int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus)
} }
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_down_all); EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_down_all);
int snd_hdac_ext_bus_link_get(struct hdac_ext_bus *ebus, int snd_hdac_ext_bus_link_get(struct hdac_bus *bus,
struct hdac_ext_link *link) struct hdac_ext_link *link)
{ {
int ret = 0; int ret = 0;
mutex_lock(&ebus->lock); mutex_lock(&bus->lock);
/* /*
* if we move from 0 to 1, count will be 1 so power up this link * if we move from 0 to 1, count will be 1 so power up this link
* as well, also check the dma status and trigger that * as well, also check the dma status and trigger that
*/ */
if (++link->ref_count == 1) { if (++link->ref_count == 1) {
if (!ebus->cmd_dma_state) { if (!bus->cmd_dma_state) {
snd_hdac_bus_init_cmd_io(&ebus->bus); snd_hdac_bus_init_cmd_io(bus);
ebus->cmd_dma_state = true; bus->cmd_dma_state = true;
} }
ret = snd_hdac_ext_bus_link_power_up(link); ret = snd_hdac_ext_bus_link_power_up(link);
/*
* wait for 521usec for codec to report status
* HDA spec section 4.3 - Codec Discovery
*/
udelay(521);
bus->codec_mask = snd_hdac_chip_readw(bus, STATESTS);
dev_dbg(bus->dev, "codec_mask = 0x%lx\n", bus->codec_mask);
snd_hdac_chip_writew(bus, STATESTS, bus->codec_mask);
} }
mutex_unlock(&ebus->lock); mutex_unlock(&bus->lock);
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_get); EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_get);
int snd_hdac_ext_bus_link_put(struct hdac_ext_bus *ebus, int snd_hdac_ext_bus_link_put(struct hdac_bus *bus,
struct hdac_ext_link *link) struct hdac_ext_link *link)
{ {
int ret = 0; int ret = 0;
struct hdac_ext_link *hlink; struct hdac_ext_link *hlink;
bool link_up = false; bool link_up = false;
mutex_lock(&ebus->lock); mutex_lock(&bus->lock);
/* /*
* if we move from 1 to 0, count will be 0 * if we move from 1 to 0, count will be 0
...@@ -301,7 +307,7 @@ int snd_hdac_ext_bus_link_put(struct hdac_ext_bus *ebus, ...@@ -301,7 +307,7 @@ int snd_hdac_ext_bus_link_put(struct hdac_ext_bus *ebus,
* now check if all links are off, if so turn off * now check if all links are off, if so turn off
* cmd dma as well * cmd dma as well
*/ */
list_for_each_entry(hlink, &ebus->hlink_list, list) { list_for_each_entry(hlink, &bus->hlink_list, list) {
if (hlink->ref_count) { if (hlink->ref_count) {
link_up = true; link_up = true;
break; break;
...@@ -309,12 +315,12 @@ int snd_hdac_ext_bus_link_put(struct hdac_ext_bus *ebus, ...@@ -309,12 +315,12 @@ int snd_hdac_ext_bus_link_put(struct hdac_ext_bus *ebus,
} }
if (!link_up) { if (!link_up) {
snd_hdac_bus_stop_cmd_io(&ebus->bus); snd_hdac_bus_stop_cmd_io(bus);
ebus->cmd_dma_state = false; bus->cmd_dma_state = false;
} }
} }
mutex_unlock(&ebus->lock); mutex_unlock(&bus->lock);
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_put); EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_put);
This diff is collapsed.
...@@ -858,6 +858,39 @@ static void snd_hda_codec_dev_release(struct device *dev) ...@@ -858,6 +858,39 @@ static void snd_hda_codec_dev_release(struct device *dev)
kfree(codec); kfree(codec);
} }
#define DEV_NAME_LEN 31
static int snd_hda_codec_device_init(struct hda_bus *bus, struct snd_card *card,
unsigned int codec_addr, struct hda_codec **codecp)
{
char name[DEV_NAME_LEN];
struct hda_codec *codec;
int err;
dev_dbg(card->dev, "%s: entry\n", __func__);
if (snd_BUG_ON(!bus))
return -EINVAL;
if (snd_BUG_ON(codec_addr > HDA_MAX_CODEC_ADDRESS))
return -EINVAL;
codec = kzalloc(sizeof(*codec), GFP_KERNEL);
if (!codec)
return -ENOMEM;
sprintf(name, "hdaudioC%dD%d", card->number, codec_addr);
err = snd_hdac_device_init(&codec->core, &bus->core, name, codec_addr);
if (err < 0) {
kfree(codec);
return err;
}
codec->core.type = HDA_DEV_LEGACY;
*codecp = codec;
return err;
}
/** /**
* snd_hda_codec_new - create a HDA codec * snd_hda_codec_new - create a HDA codec
* @bus: the bus to assign * @bus: the bus to assign
...@@ -869,7 +902,19 @@ static void snd_hda_codec_dev_release(struct device *dev) ...@@ -869,7 +902,19 @@ static void snd_hda_codec_dev_release(struct device *dev)
int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
unsigned int codec_addr, struct hda_codec **codecp) unsigned int codec_addr, struct hda_codec **codecp)
{ {
struct hda_codec *codec; int ret;
ret = snd_hda_codec_device_init(bus, card, codec_addr, codecp);
if (ret < 0)
return ret;
return snd_hda_codec_device_new(bus, card, codec_addr, *codecp);
}
EXPORT_SYMBOL_GPL(snd_hda_codec_new);
int snd_hda_codec_device_new(struct hda_bus *bus, struct snd_card *card,
unsigned int codec_addr, struct hda_codec *codec)
{
char component[31]; char component[31];
hda_nid_t fg; hda_nid_t fg;
int err; int err;
...@@ -879,25 +924,14 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, ...@@ -879,25 +924,14 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
.dev_free = snd_hda_codec_dev_free, .dev_free = snd_hda_codec_dev_free,
}; };
dev_dbg(card->dev, "%s: entry\n", __func__);
if (snd_BUG_ON(!bus)) if (snd_BUG_ON(!bus))
return -EINVAL; return -EINVAL;
if (snd_BUG_ON(codec_addr > HDA_MAX_CODEC_ADDRESS)) if (snd_BUG_ON(codec_addr > HDA_MAX_CODEC_ADDRESS))
return -EINVAL; return -EINVAL;
codec = kzalloc(sizeof(*codec), GFP_KERNEL);
if (!codec)
return -ENOMEM;
sprintf(component, "hdaudioC%dD%d", card->number, codec_addr);
err = snd_hdac_device_init(&codec->core, &bus->core, component,
codec_addr);
if (err < 0) {
kfree(codec);
return err;
}
codec->core.dev.release = snd_hda_codec_dev_release; codec->core.dev.release = snd_hda_codec_dev_release;
codec->core.type = HDA_DEV_LEGACY;
codec->core.exec_verb = codec_exec_verb; codec->core.exec_verb = codec_exec_verb;
codec->bus = bus; codec->bus = bus;
...@@ -957,15 +991,13 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, ...@@ -957,15 +991,13 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
if (err < 0) if (err < 0)
goto error; goto error;
if (codecp)
*codecp = codec;
return 0; return 0;
error: error:
put_device(hda_codec_dev(codec)); put_device(hda_codec_dev(codec));
return err; return err;
} }
EXPORT_SYMBOL_GPL(snd_hda_codec_new); EXPORT_SYMBOL_GPL(snd_hda_codec_device_new);
/** /**
* snd_hda_codec_update_widgets - Refresh widget caps and pin defaults * snd_hda_codec_update_widgets - Refresh widget caps and pin defaults
...@@ -2992,6 +3024,7 @@ int snd_hda_codec_build_controls(struct hda_codec *codec) ...@@ -2992,6 +3024,7 @@ int snd_hda_codec_build_controls(struct hda_codec *codec)
sync_power_up_states(codec); sync_power_up_states(codec);
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(snd_hda_codec_build_controls);
/* /*
* PCM stuff * PCM stuff
...@@ -3197,6 +3230,7 @@ int snd_hda_codec_parse_pcms(struct hda_codec *codec) ...@@ -3197,6 +3230,7 @@ int snd_hda_codec_parse_pcms(struct hda_codec *codec)
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(snd_hda_codec_parse_pcms);
/* assign all PCMs of the given codec */ /* assign all PCMs of the given codec */
int snd_hda_codec_build_pcms(struct hda_codec *codec) int snd_hda_codec_build_pcms(struct hda_codec *codec)
......
...@@ -308,6 +308,8 @@ struct hda_codec { ...@@ -308,6 +308,8 @@ struct hda_codec {
*/ */
int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
unsigned int codec_addr, struct hda_codec **codecp); unsigned int codec_addr, struct hda_codec **codecp);
int snd_hda_codec_device_new(struct hda_bus *bus, struct snd_card *card,
unsigned int codec_addr, struct hda_codec *codec);
int snd_hda_codec_configure(struct hda_codec *codec); int snd_hda_codec_configure(struct hda_codec *codec);
int snd_hda_codec_update_widgets(struct hda_codec *codec); int snd_hda_codec_update_widgets(struct hda_codec *codec);
......
This diff is collapsed.
...@@ -33,8 +33,7 @@ ...@@ -33,8 +33,7 @@
static int skl_alloc_dma_buf(struct device *dev, static int skl_alloc_dma_buf(struct device *dev,
struct snd_dma_buffer *dmab, size_t size) struct snd_dma_buffer *dmab, size_t size)
{ {
struct hdac_ext_bus *ebus = dev_get_drvdata(dev); struct hdac_bus *bus = dev_get_drvdata(dev);
struct hdac_bus *bus = ebus_to_hbus(ebus);
if (!bus) if (!bus)
return -ENODEV; return -ENODEV;
...@@ -44,8 +43,7 @@ static int skl_alloc_dma_buf(struct device *dev, ...@@ -44,8 +43,7 @@ static int skl_alloc_dma_buf(struct device *dev,
static int skl_free_dma_buf(struct device *dev, struct snd_dma_buffer *dmab) static int skl_free_dma_buf(struct device *dev, struct snd_dma_buffer *dmab)
{ {
struct hdac_ext_bus *ebus = dev_get_drvdata(dev); struct hdac_bus *bus = dev_get_drvdata(dev);
struct hdac_bus *bus = ebus_to_hbus(ebus);
if (!bus) if (!bus)
return -ENODEV; return -ENODEV;
...@@ -89,8 +87,7 @@ void skl_dsp_enable_notification(struct skl_sst *ctx, bool enable) ...@@ -89,8 +87,7 @@ void skl_dsp_enable_notification(struct skl_sst *ctx, bool enable)
static int skl_dsp_setup_spib(struct device *dev, unsigned int size, static int skl_dsp_setup_spib(struct device *dev, unsigned int size,
int stream_tag, int enable) int stream_tag, int enable)
{ {
struct hdac_ext_bus *ebus = dev_get_drvdata(dev); struct hdac_bus *bus = dev_get_drvdata(dev);
struct hdac_bus *bus = ebus_to_hbus(ebus);
struct hdac_stream *stream = snd_hdac_get_stream(bus, struct hdac_stream *stream = snd_hdac_get_stream(bus,
SNDRV_PCM_STREAM_PLAYBACK, stream_tag); SNDRV_PCM_STREAM_PLAYBACK, stream_tag);
struct hdac_ext_stream *estream; struct hdac_ext_stream *estream;
...@@ -100,10 +97,10 @@ static int skl_dsp_setup_spib(struct device *dev, unsigned int size, ...@@ -100,10 +97,10 @@ static int skl_dsp_setup_spib(struct device *dev, unsigned int size,
estream = stream_to_hdac_ext_stream(stream); estream = stream_to_hdac_ext_stream(stream);
/* enable/disable SPIB for this hdac stream */ /* enable/disable SPIB for this hdac stream */
snd_hdac_ext_stream_spbcap_enable(ebus, enable, stream->index); snd_hdac_ext_stream_spbcap_enable(bus, enable, stream->index);
/* set the spib value */ /* set the spib value */
snd_hdac_ext_stream_set_spib(ebus, estream, size); snd_hdac_ext_stream_set_spib(bus, estream, size);
return 0; return 0;
} }
...@@ -111,8 +108,7 @@ static int skl_dsp_setup_spib(struct device *dev, unsigned int size, ...@@ -111,8 +108,7 @@ static int skl_dsp_setup_spib(struct device *dev, unsigned int size,
static int skl_dsp_prepare(struct device *dev, unsigned int format, static int skl_dsp_prepare(struct device *dev, unsigned int format,
unsigned int size, struct snd_dma_buffer *dmab) unsigned int size, struct snd_dma_buffer *dmab)
{ {
struct hdac_ext_bus *ebus = dev_get_drvdata(dev); struct hdac_bus *bus = dev_get_drvdata(dev);
struct hdac_bus *bus = ebus_to_hbus(ebus);
struct hdac_ext_stream *estream; struct hdac_ext_stream *estream;
struct hdac_stream *stream; struct hdac_stream *stream;
struct snd_pcm_substream substream; struct snd_pcm_substream substream;
...@@ -124,7 +120,7 @@ static int skl_dsp_prepare(struct device *dev, unsigned int format, ...@@ -124,7 +120,7 @@ static int skl_dsp_prepare(struct device *dev, unsigned int format,
memset(&substream, 0, sizeof(substream)); memset(&substream, 0, sizeof(substream));
substream.stream = SNDRV_PCM_STREAM_PLAYBACK; substream.stream = SNDRV_PCM_STREAM_PLAYBACK;
estream = snd_hdac_ext_stream_assign(ebus, &substream, estream = snd_hdac_ext_stream_assign(bus, &substream,
HDAC_EXT_STREAM_TYPE_HOST); HDAC_EXT_STREAM_TYPE_HOST);
if (!estream) if (!estream)
return -ENODEV; return -ENODEV;
...@@ -143,9 +139,8 @@ static int skl_dsp_prepare(struct device *dev, unsigned int format, ...@@ -143,9 +139,8 @@ static int skl_dsp_prepare(struct device *dev, unsigned int format,
static int skl_dsp_trigger(struct device *dev, bool start, int stream_tag) static int skl_dsp_trigger(struct device *dev, bool start, int stream_tag)
{ {
struct hdac_ext_bus *ebus = dev_get_drvdata(dev); struct hdac_bus *bus = dev_get_drvdata(dev);
struct hdac_stream *stream; struct hdac_stream *stream;
struct hdac_bus *bus = ebus_to_hbus(ebus);
if (!bus) if (!bus)
return -ENODEV; return -ENODEV;
...@@ -163,10 +158,9 @@ static int skl_dsp_trigger(struct device *dev, bool start, int stream_tag) ...@@ -163,10 +158,9 @@ static int skl_dsp_trigger(struct device *dev, bool start, int stream_tag)
static int skl_dsp_cleanup(struct device *dev, static int skl_dsp_cleanup(struct device *dev,
struct snd_dma_buffer *dmab, int stream_tag) struct snd_dma_buffer *dmab, int stream_tag)
{ {
struct hdac_ext_bus *ebus = dev_get_drvdata(dev); struct hdac_bus *bus = dev_get_drvdata(dev);
struct hdac_stream *stream; struct hdac_stream *stream;
struct hdac_ext_stream *estream; struct hdac_ext_stream *estream;
struct hdac_bus *bus = ebus_to_hbus(ebus);
if (!bus) if (!bus)
return -ENODEV; return -ENODEV;
...@@ -270,8 +264,7 @@ const struct skl_dsp_ops *skl_get_dsp_ops(int pci_id) ...@@ -270,8 +264,7 @@ const struct skl_dsp_ops *skl_get_dsp_ops(int pci_id)
int skl_init_dsp(struct skl *skl) int skl_init_dsp(struct skl *skl)
{ {
void __iomem *mmio_base; void __iomem *mmio_base;
struct hdac_ext_bus *ebus = &skl->ebus; struct hdac_bus *bus = skl_to_bus(skl);
struct hdac_bus *bus = ebus_to_hbus(ebus);
struct skl_dsp_loader_ops loader_ops; struct skl_dsp_loader_ops loader_ops;
int irq = bus->irq; int irq = bus->irq;
const struct skl_dsp_ops *ops; const struct skl_dsp_ops *ops;
...@@ -279,8 +272,8 @@ int skl_init_dsp(struct skl *skl) ...@@ -279,8 +272,8 @@ int skl_init_dsp(struct skl *skl)
int ret; int ret;
/* enable ppcap interrupt */ /* enable ppcap interrupt */
snd_hdac_ext_bus_ppcap_enable(&skl->ebus, true); snd_hdac_ext_bus_ppcap_enable(bus, true);
snd_hdac_ext_bus_ppcap_int_enable(&skl->ebus, true); snd_hdac_ext_bus_ppcap_int_enable(bus, true);
/* read the BAR of the ADSP MMIO */ /* read the BAR of the ADSP MMIO */
mmio_base = pci_ioremap_bar(skl->pci, 4); mmio_base = pci_ioremap_bar(skl->pci, 4);
...@@ -335,12 +328,11 @@ int skl_init_dsp(struct skl *skl) ...@@ -335,12 +328,11 @@ int skl_init_dsp(struct skl *skl)
int skl_free_dsp(struct skl *skl) int skl_free_dsp(struct skl *skl)
{ {
struct hdac_ext_bus *ebus = &skl->ebus; struct hdac_bus *bus = skl_to_bus(skl);
struct hdac_bus *bus = ebus_to_hbus(ebus);
struct skl_sst *ctx = skl->skl_sst; struct skl_sst *ctx = skl->skl_sst;
/* disable ppcap interrupt */ /* disable ppcap interrupt */
snd_hdac_ext_bus_ppcap_int_enable(&skl->ebus, false); snd_hdac_ext_bus_ppcap_int_enable(bus, false);
ctx->dsp_ops->cleanup(bus->dev, ctx); ctx->dsp_ops->cleanup(bus->dev, ctx);
...@@ -383,10 +375,11 @@ int skl_suspend_late_dsp(struct skl *skl) ...@@ -383,10 +375,11 @@ int skl_suspend_late_dsp(struct skl *skl)
int skl_suspend_dsp(struct skl *skl) int skl_suspend_dsp(struct skl *skl)
{ {
struct skl_sst *ctx = skl->skl_sst; struct skl_sst *ctx = skl->skl_sst;
struct hdac_bus *bus = skl_to_bus(skl);
int ret; int ret;
/* if ppcap is not supported return 0 */ /* if ppcap is not supported return 0 */
if (!skl->ebus.bus.ppcap) if (!bus->ppcap)
return 0; return 0;
ret = skl_dsp_sleep(ctx->dsp); ret = skl_dsp_sleep(ctx->dsp);
...@@ -394,8 +387,8 @@ int skl_suspend_dsp(struct skl *skl) ...@@ -394,8 +387,8 @@ int skl_suspend_dsp(struct skl *skl)
return ret; return ret;
/* disable ppcap interrupt */ /* disable ppcap interrupt */
snd_hdac_ext_bus_ppcap_int_enable(&skl->ebus, false); snd_hdac_ext_bus_ppcap_int_enable(bus, false);
snd_hdac_ext_bus_ppcap_enable(&skl->ebus, false); snd_hdac_ext_bus_ppcap_enable(bus, false);
return 0; return 0;
} }
...@@ -403,15 +396,16 @@ int skl_suspend_dsp(struct skl *skl) ...@@ -403,15 +396,16 @@ int skl_suspend_dsp(struct skl *skl)
int skl_resume_dsp(struct skl *skl) int skl_resume_dsp(struct skl *skl)
{ {
struct skl_sst *ctx = skl->skl_sst; struct skl_sst *ctx = skl->skl_sst;
struct hdac_bus *bus = skl_to_bus(skl);
int ret; int ret;
/* if ppcap is not supported return 0 */ /* if ppcap is not supported return 0 */
if (!skl->ebus.bus.ppcap) if (!bus->ppcap)
return 0; return 0;
/* enable ppcap interrupt */ /* enable ppcap interrupt */
snd_hdac_ext_bus_ppcap_enable(&skl->ebus, true); snd_hdac_ext_bus_ppcap_enable(bus, true);
snd_hdac_ext_bus_ppcap_int_enable(&skl->ebus, true); snd_hdac_ext_bus_ppcap_int_enable(bus, true);
/* check if DSP 1st boot is done */ /* check if DSP 1st boot is done */
if (skl->skl_sst->is_first_boot == true) if (skl->skl_sst->is_first_boot == true)
......
...@@ -141,7 +141,7 @@ struct nhlt_specific_cfg ...@@ -141,7 +141,7 @@ struct nhlt_specific_cfg
{ {
struct nhlt_fmt *fmt; struct nhlt_fmt *fmt;
struct nhlt_endpoint *epnt; struct nhlt_endpoint *epnt;
struct hdac_bus *bus = ebus_to_hbus(&skl->ebus); struct hdac_bus *bus = skl_to_bus(skl);
struct device *dev = bus->dev; struct device *dev = bus->dev;
struct nhlt_specific_cfg *sp_config; struct nhlt_specific_cfg *sp_config;
struct nhlt_acpi_table *nhlt = skl->nhlt; struct nhlt_acpi_table *nhlt = skl->nhlt;
...@@ -228,7 +228,7 @@ static void skl_nhlt_trim_space(char *trim) ...@@ -228,7 +228,7 @@ static void skl_nhlt_trim_space(char *trim)
int skl_nhlt_update_topology_bin(struct skl *skl) int skl_nhlt_update_topology_bin(struct skl *skl)
{ {
struct nhlt_acpi_table *nhlt = (struct nhlt_acpi_table *)skl->nhlt; struct nhlt_acpi_table *nhlt = (struct nhlt_acpi_table *)skl->nhlt;
struct hdac_bus *bus = ebus_to_hbus(&skl->ebus); struct hdac_bus *bus = skl_to_bus(skl);
struct device *dev = bus->dev; struct device *dev = bus->dev;
dev_dbg(dev, "oem_id %.6s, oem_table_id %8s oem_revision %d\n", dev_dbg(dev, "oem_id %.6s, oem_table_id %8s oem_revision %d\n",
...@@ -248,8 +248,8 @@ static ssize_t skl_nhlt_platform_id_show(struct device *dev, ...@@ -248,8 +248,8 @@ static ssize_t skl_nhlt_platform_id_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct pci_dev *pci = to_pci_dev(dev); struct pci_dev *pci = to_pci_dev(dev);
struct hdac_ext_bus *ebus = pci_get_drvdata(pci); struct hdac_bus *bus = pci_get_drvdata(pci);
struct skl *skl = ebus_to_skl(ebus); struct skl *skl = bus_to_skl(bus);
struct nhlt_acpi_table *nhlt = (struct nhlt_acpi_table *)skl->nhlt; struct nhlt_acpi_table *nhlt = (struct nhlt_acpi_table *)skl->nhlt;
char platform_id[32]; char platform_id[32];
......
This diff is collapsed.
...@@ -934,7 +934,7 @@ static int skl_tplg_find_moduleid_from_uuid(struct skl *skl, ...@@ -934,7 +934,7 @@ static int skl_tplg_find_moduleid_from_uuid(struct skl *skl,
struct soc_bytes_ext *sb = (void *) k->private_value; struct soc_bytes_ext *sb = (void *) k->private_value;
struct skl_algo_data *bc = (struct skl_algo_data *)sb->dobj.private; struct skl_algo_data *bc = (struct skl_algo_data *)sb->dobj.private;
struct skl_kpb_params *uuid_params, *params; struct skl_kpb_params *uuid_params, *params;
struct hdac_bus *bus = ebus_to_hbus(skl_to_ebus(skl)); struct hdac_bus *bus = skl_to_bus(skl);
int i, size, module_id; int i, size, module_id;
if (bc->set_params == SKL_PARAM_BIND && bc->max) { if (bc->set_params == SKL_PARAM_BIND && bc->max) {
...@@ -3029,9 +3029,8 @@ static int skl_tplg_widget_load(struct snd_soc_component *cmpnt, ...@@ -3029,9 +3029,8 @@ static int skl_tplg_widget_load(struct snd_soc_component *cmpnt,
struct snd_soc_tplg_dapm_widget *tplg_w) struct snd_soc_tplg_dapm_widget *tplg_w)
{ {
int ret; int ret;
struct hdac_ext_bus *ebus = snd_soc_component_get_drvdata(cmpnt); struct hdac_bus *bus = snd_soc_component_get_drvdata(cmpnt);
struct skl *skl = ebus_to_skl(ebus); struct skl *skl = bus_to_skl(bus);
struct hdac_bus *bus = ebus_to_hbus(ebus);
struct skl_module_cfg *mconfig; struct skl_module_cfg *mconfig;
if (!tplg_w->priv.size) if (!tplg_w->priv.size)
...@@ -3137,8 +3136,7 @@ static int skl_tplg_control_load(struct snd_soc_component *cmpnt, ...@@ -3137,8 +3136,7 @@ static int skl_tplg_control_load(struct snd_soc_component *cmpnt,
struct soc_bytes_ext *sb; struct soc_bytes_ext *sb;
struct snd_soc_tplg_bytes_control *tplg_bc; struct snd_soc_tplg_bytes_control *tplg_bc;
struct snd_soc_tplg_enum_control *tplg_ec; struct snd_soc_tplg_enum_control *tplg_ec;
struct hdac_ext_bus *ebus = snd_soc_component_get_drvdata(cmpnt); struct hdac_bus *bus = snd_soc_component_get_drvdata(cmpnt);
struct hdac_bus *bus = ebus_to_hbus(ebus);
struct soc_enum *se; struct soc_enum *se;
switch (hdr->ops.info) { switch (hdr->ops.info) {
...@@ -3622,9 +3620,8 @@ static int skl_tplg_get_manifest_data(struct snd_soc_tplg_manifest *manifest, ...@@ -3622,9 +3620,8 @@ static int skl_tplg_get_manifest_data(struct snd_soc_tplg_manifest *manifest,
static int skl_manifest_load(struct snd_soc_component *cmpnt, static int skl_manifest_load(struct snd_soc_component *cmpnt,
struct snd_soc_tplg_manifest *manifest) struct snd_soc_tplg_manifest *manifest)
{ {
struct hdac_ext_bus *ebus = snd_soc_component_get_drvdata(cmpnt); struct hdac_bus *bus = snd_soc_component_get_drvdata(cmpnt);
struct hdac_bus *bus = ebus_to_hbus(ebus); struct skl *skl = bus_to_skl(bus);
struct skl *skl = ebus_to_skl(ebus);
/* proceed only if we have private data defined */ /* proceed only if we have private data defined */
if (manifest->priv.size == 0) if (manifest->priv.size == 0)
...@@ -3713,12 +3710,11 @@ static void skl_tplg_set_pipe_type(struct skl *skl, struct skl_pipe *pipe) ...@@ -3713,12 +3710,11 @@ static void skl_tplg_set_pipe_type(struct skl *skl, struct skl_pipe *pipe)
/* /*
* SKL topology init routine * SKL topology init routine
*/ */
int skl_tplg_init(struct snd_soc_component *component, struct hdac_ext_bus *ebus) int skl_tplg_init(struct snd_soc_component *component, struct hdac_bus *bus)
{ {
int ret; int ret;
const struct firmware *fw; const struct firmware *fw;
struct hdac_bus *bus = ebus_to_hbus(ebus); struct skl *skl = bus_to_skl(bus);
struct skl *skl = ebus_to_skl(ebus);
struct skl_pipeline *ppl; struct skl_pipeline *ppl;
ret = request_firmware(&fw, skl->tplg_name, bus->dev); ret = request_firmware(&fw, skl->tplg_name, bus->dev);
......
...@@ -458,9 +458,9 @@ enum skl_channel { ...@@ -458,9 +458,9 @@ enum skl_channel {
static inline struct skl *get_skl_ctx(struct device *dev) static inline struct skl *get_skl_ctx(struct device *dev)
{ {
struct hdac_ext_bus *ebus = dev_get_drvdata(dev); struct hdac_bus *bus = dev_get_drvdata(dev);
return ebus_to_skl(ebus); return bus_to_skl(bus);
} }
int skl_tplg_be_update_params(struct snd_soc_dai *dai, int skl_tplg_be_update_params(struct snd_soc_dai *dai,
...@@ -470,7 +470,7 @@ int skl_dsp_set_dma_control(struct skl_sst *ctx, u32 *caps, ...@@ -470,7 +470,7 @@ int skl_dsp_set_dma_control(struct skl_sst *ctx, u32 *caps,
void skl_tplg_set_be_dmic_config(struct snd_soc_dai *dai, void skl_tplg_set_be_dmic_config(struct snd_soc_dai *dai,
struct skl_pipe_params *params, int stream); struct skl_pipe_params *params, int stream);
int skl_tplg_init(struct snd_soc_component *component, int skl_tplg_init(struct snd_soc_component *component,
struct hdac_ext_bus *ebus); struct hdac_bus *ebus);
struct skl_module_cfg *skl_tplg_fe_get_cpr_module( struct skl_module_cfg *skl_tplg_fe_get_cpr_module(
struct snd_soc_dai *dai, int stream); struct snd_soc_dai *dai, int stream);
int skl_tplg_update_pipe_params(struct device *dev, int skl_tplg_update_pipe_params(struct device *dev,
......
This diff is collapsed.
...@@ -71,7 +71,7 @@ struct skl_fw_config { ...@@ -71,7 +71,7 @@ struct skl_fw_config {
}; };
struct skl { struct skl {
struct hdac_ext_bus ebus; struct hdac_bus hbus;
struct pci_dev *pci; struct pci_dev *pci;
unsigned int init_done:1; /* delayed init status */ unsigned int init_done:1; /* delayed init status */
...@@ -105,9 +105,8 @@ struct skl { ...@@ -105,9 +105,8 @@ struct skl {
struct snd_soc_acpi_mach *mach; struct snd_soc_acpi_mach *mach;
}; };
#define skl_to_ebus(s) (&(s)->ebus) #define skl_to_bus(s) (&(s)->hbus)
#define ebus_to_skl(sbus) \ #define bus_to_skl(bus) container_of(bus, struct skl, hbus)
container_of(sbus, struct skl, sbus)
/* to pass dai dma data */ /* to pass dai dma data */
struct skl_dma_params { struct skl_dma_params {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment