root/include/sound/hdaudio.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. snd_hdac_read_parm
  2. snd_hdac_enter_pm
  3. snd_hdac_leave_pm
  4. snd_hdac_is_in_pm
  5. snd_hdac_is_power_on
  6. snd_hdac_power_up
  7. snd_hdac_power_down
  8. snd_hdac_power_up_pm
  9. snd_hdac_power_down_pm
  10. snd_hdac_keep_power_up
  11. snd_hdac_enter_pm
  12. snd_hdac_leave_pm
  13. snd_hdac_is_in_pm
  14. snd_hdac_is_power_on
  15. snd_hdac_codec_link_up
  16. snd_hdac_codec_link_down
  17. snd_hdac_reg_writeb
  18. snd_hdac_reg_writew
  19. snd_hdac_reg_readb
  20. snd_hdac_reg_readw
  21. snd_hdac_dsp_prepare
  22. snd_hdac_dsp_trigger
  23. snd_hdac_dsp_cleanup
  24. snd_array_init
  25. snd_array_elem
  26. snd_array_index

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /*
   3  * HD-audio core stuff
   4  */
   5 
   6 #ifndef __SOUND_HDAUDIO_H
   7 #define __SOUND_HDAUDIO_H
   8 
   9 #include <linux/device.h>
  10 #include <linux/interrupt.h>
  11 #include <linux/io.h>
  12 #include <linux/pm_runtime.h>
  13 #include <linux/timecounter.h>
  14 #include <sound/core.h>
  15 #include <sound/pcm.h>
  16 #include <sound/memalloc.h>
  17 #include <sound/hda_verbs.h>
  18 #include <drm/i915_component.h>
  19 
  20 /* codec node id */
  21 typedef u16 hda_nid_t;
  22 
  23 struct hdac_bus;
  24 struct hdac_stream;
  25 struct hdac_device;
  26 struct hdac_driver;
  27 struct hdac_widget_tree;
  28 struct hda_device_id;
  29 
  30 /*
  31  * exported bus type
  32  */
  33 extern struct bus_type snd_hda_bus_type;
  34 
  35 /*
  36  * generic arrays
  37  */
  38 struct snd_array {
  39         unsigned int used;
  40         unsigned int alloced;
  41         unsigned int elem_size;
  42         unsigned int alloc_align;
  43         void *list;
  44 };
  45 
  46 /*
  47  * HD-audio codec base device
  48  */
  49 struct hdac_device {
  50         struct device dev;
  51         int type;
  52         struct hdac_bus *bus;
  53         unsigned int addr;              /* codec address */
  54         struct list_head list;          /* list point for bus codec_list */
  55 
  56         hda_nid_t afg;                  /* AFG node id */
  57         hda_nid_t mfg;                  /* MFG node id */
  58 
  59         /* ids */
  60         unsigned int vendor_id;
  61         unsigned int subsystem_id;
  62         unsigned int revision_id;
  63         unsigned int afg_function_id;
  64         unsigned int mfg_function_id;
  65         unsigned int afg_unsol:1;
  66         unsigned int mfg_unsol:1;
  67 
  68         unsigned int power_caps;        /* FG power caps */
  69 
  70         const char *vendor_name;        /* codec vendor name */
  71         const char *chip_name;          /* codec chip name */
  72 
  73         /* verb exec op override */
  74         int (*exec_verb)(struct hdac_device *dev, unsigned int cmd,
  75                          unsigned int flags, unsigned int *res);
  76 
  77         /* widgets */
  78         unsigned int num_nodes;
  79         hda_nid_t start_nid, end_nid;
  80 
  81         /* misc flags */
  82         atomic_t in_pm;         /* suspend/resume being performed */
  83 
  84         /* sysfs */
  85         struct mutex widget_lock;
  86         struct hdac_widget_tree *widgets;
  87 
  88         /* regmap */
  89         struct regmap *regmap;
  90         struct mutex regmap_lock;
  91         struct snd_array vendor_verbs;
  92         bool lazy_cache:1;      /* don't wake up for writes */
  93         bool caps_overwriting:1; /* caps overwrite being in process */
  94         bool cache_coef:1;      /* cache COEF read/write too */
  95 };
  96 
  97 /* device/driver type used for matching */
  98 enum {
  99         HDA_DEV_CORE,
 100         HDA_DEV_LEGACY,
 101         HDA_DEV_ASOC,
 102 };
 103 
 104 enum {
 105         SND_SKL_PCI_BIND_AUTO,  /* automatic selection based on pci class */
 106         SND_SKL_PCI_BIND_LEGACY,/* bind only with legacy driver */
 107         SND_SKL_PCI_BIND_ASOC   /* bind only with ASoC driver */
 108 };
 109 
 110 /* direction */
 111 enum {
 112         HDA_INPUT, HDA_OUTPUT
 113 };
 114 
 115 #define dev_to_hdac_dev(_dev)   container_of(_dev, struct hdac_device, dev)
 116 
 117 int snd_hdac_device_init(struct hdac_device *dev, struct hdac_bus *bus,
 118                          const char *name, unsigned int addr);
 119 void snd_hdac_device_exit(struct hdac_device *dev);
 120 int snd_hdac_device_register(struct hdac_device *codec);
 121 void snd_hdac_device_unregister(struct hdac_device *codec);
 122 int snd_hdac_device_set_chip_name(struct hdac_device *codec, const char *name);
 123 int snd_hdac_codec_modalias(struct hdac_device *hdac, char *buf, size_t size);
 124 
 125 int snd_hdac_refresh_widgets(struct hdac_device *codec);
 126 
 127 int snd_hdac_read(struct hdac_device *codec, hda_nid_t nid,
 128                   unsigned int verb, unsigned int parm, unsigned int *res);
 129 int _snd_hdac_read_parm(struct hdac_device *codec, hda_nid_t nid, int parm,
 130                         unsigned int *res);
 131 int snd_hdac_read_parm_uncached(struct hdac_device *codec, hda_nid_t nid,
 132                                 int parm);
 133 int snd_hdac_override_parm(struct hdac_device *codec, hda_nid_t nid,
 134                            unsigned int parm, unsigned int val);
 135 int snd_hdac_get_connections(struct hdac_device *codec, hda_nid_t nid,
 136                              hda_nid_t *conn_list, int max_conns);
 137 int snd_hdac_get_sub_nodes(struct hdac_device *codec, hda_nid_t nid,
 138                            hda_nid_t *start_id);
 139 unsigned int snd_hdac_calc_stream_format(unsigned int rate,
 140                                          unsigned int channels,
 141                                          snd_pcm_format_t format,
 142                                          unsigned int maxbps,
 143                                          unsigned short spdif_ctls);
 144 int snd_hdac_query_supported_pcm(struct hdac_device *codec, hda_nid_t nid,
 145                                 u32 *ratesp, u64 *formatsp, unsigned int *bpsp);
 146 bool snd_hdac_is_supported_format(struct hdac_device *codec, hda_nid_t nid,
 147                                   unsigned int format);
 148 
 149 int snd_hdac_codec_read(struct hdac_device *hdac, hda_nid_t nid,
 150                         int flags, unsigned int verb, unsigned int parm);
 151 int snd_hdac_codec_write(struct hdac_device *hdac, hda_nid_t nid,
 152                         int flags, unsigned int verb, unsigned int parm);
 153 bool snd_hdac_check_power_state(struct hdac_device *hdac,
 154                 hda_nid_t nid, unsigned int target_state);
 155 unsigned int snd_hdac_sync_power_state(struct hdac_device *hdac,
 156                       hda_nid_t nid, unsigned int target_state);
 157 /**
 158  * snd_hdac_read_parm - read a codec parameter
 159  * @codec: the codec object
 160  * @nid: NID to read a parameter
 161  * @parm: parameter to read
 162  *
 163  * Returns -1 for error.  If you need to distinguish the error more
 164  * strictly, use _snd_hdac_read_parm() directly.
 165  */
 166 static inline int snd_hdac_read_parm(struct hdac_device *codec, hda_nid_t nid,
 167                                      int parm)
 168 {
 169         unsigned int val;
 170 
 171         return _snd_hdac_read_parm(codec, nid, parm, &val) < 0 ? -1 : val;
 172 }
 173 
 174 #ifdef CONFIG_PM
 175 int snd_hdac_power_up(struct hdac_device *codec);
 176 int snd_hdac_power_down(struct hdac_device *codec);
 177 int snd_hdac_power_up_pm(struct hdac_device *codec);
 178 int snd_hdac_power_down_pm(struct hdac_device *codec);
 179 int snd_hdac_keep_power_up(struct hdac_device *codec);
 180 
 181 /* call this at entering into suspend/resume callbacks in codec driver */
 182 static inline void snd_hdac_enter_pm(struct hdac_device *codec)
 183 {
 184         atomic_inc(&codec->in_pm);
 185 }
 186 
 187 /* call this at leaving from suspend/resume callbacks in codec driver */
 188 static inline void snd_hdac_leave_pm(struct hdac_device *codec)
 189 {
 190         atomic_dec(&codec->in_pm);
 191 }
 192 
 193 static inline bool snd_hdac_is_in_pm(struct hdac_device *codec)
 194 {
 195         return atomic_read(&codec->in_pm);
 196 }
 197 
 198 static inline bool snd_hdac_is_power_on(struct hdac_device *codec)
 199 {
 200         return !pm_runtime_suspended(&codec->dev);
 201 }
 202 #else
 203 static inline int snd_hdac_power_up(struct hdac_device *codec) { return 0; }
 204 static inline int snd_hdac_power_down(struct hdac_device *codec) { return 0; }
 205 static inline int snd_hdac_power_up_pm(struct hdac_device *codec) { return 0; }
 206 static inline int snd_hdac_power_down_pm(struct hdac_device *codec) { return 0; }
 207 static inline int snd_hdac_keep_power_up(struct hdac_device *codec) { return 0; }
 208 static inline void snd_hdac_enter_pm(struct hdac_device *codec) {}
 209 static inline void snd_hdac_leave_pm(struct hdac_device *codec) {}
 210 static inline bool snd_hdac_is_in_pm(struct hdac_device *codec) { return 0; }
 211 static inline bool snd_hdac_is_power_on(struct hdac_device *codec) { return 1; }
 212 #endif
 213 
 214 /*
 215  * HD-audio codec base driver
 216  */
 217 struct hdac_driver {
 218         struct device_driver driver;
 219         int type;
 220         const struct hda_device_id *id_table;
 221         int (*match)(struct hdac_device *dev, struct hdac_driver *drv);
 222         void (*unsol_event)(struct hdac_device *dev, unsigned int event);
 223 
 224         /* fields used by ext bus APIs */
 225         int (*probe)(struct hdac_device *dev);
 226         int (*remove)(struct hdac_device *dev);
 227         void (*shutdown)(struct hdac_device *dev);
 228 };
 229 
 230 #define drv_to_hdac_driver(_drv) container_of(_drv, struct hdac_driver, driver)
 231 
 232 const struct hda_device_id *
 233 hdac_get_device_id(struct hdac_device *hdev, struct hdac_driver *drv);
 234 
 235 /*
 236  * Bus verb operators
 237  */
 238 struct hdac_bus_ops {
 239         /* send a single command */
 240         int (*command)(struct hdac_bus *bus, unsigned int cmd);
 241         /* get a response from the last command */
 242         int (*get_response)(struct hdac_bus *bus, unsigned int addr,
 243                             unsigned int *res);
 244 };
 245 
 246 /*
 247  * ops used for ASoC HDA codec drivers
 248  */
 249 struct hdac_ext_bus_ops {
 250         int (*hdev_attach)(struct hdac_device *hdev);
 251         int (*hdev_detach)(struct hdac_device *hdev);
 252 };
 253 
 254 #define HDA_UNSOL_QUEUE_SIZE    64
 255 #define HDA_MAX_CODECS          8       /* limit by controller side */
 256 
 257 /*
 258  * CORB/RIRB
 259  *
 260  * Each CORB entry is 4byte, RIRB is 8byte
 261  */
 262 struct hdac_rb {
 263         __le32 *buf;            /* virtual address of CORB/RIRB buffer */
 264         dma_addr_t addr;        /* physical address of CORB/RIRB buffer */
 265         unsigned short rp, wp;  /* RIRB read/write pointers */
 266         int cmds[HDA_MAX_CODECS];       /* number of pending requests */
 267         u32 res[HDA_MAX_CODECS];        /* last read value */
 268 };
 269 
 270 /*
 271  * HD-audio bus base driver
 272  *
 273  * @ppcap: pp capabilities pointer
 274  * @spbcap: SPIB capabilities pointer
 275  * @mlcap: MultiLink capabilities pointer
 276  * @gtscap: gts capabilities pointer
 277  * @drsmcap: dma resume capabilities pointer
 278  * @num_streams: streams supported
 279  * @idx: HDA link index
 280  * @hlink_list: link list of HDA links
 281  * @lock: lock for link and display power mgmt
 282  * @cmd_dma_state: state of cmd DMAs: CORB and RIRB
 283  */
 284 struct hdac_bus {
 285         struct device *dev;
 286         const struct hdac_bus_ops *ops;
 287         const struct hdac_ext_bus_ops *ext_ops;
 288 
 289         /* h/w resources */
 290         unsigned long addr;
 291         void __iomem *remap_addr;
 292         int irq;
 293 
 294         void __iomem *ppcap;
 295         void __iomem *spbcap;
 296         void __iomem *mlcap;
 297         void __iomem *gtscap;
 298         void __iomem *drsmcap;
 299 
 300         /* codec linked list */
 301         struct list_head codec_list;
 302         unsigned int num_codecs;
 303 
 304         /* link caddr -> codec */
 305         struct hdac_device *caddr_tbl[HDA_MAX_CODEC_ADDRESS + 1];
 306 
 307         /* unsolicited event queue */
 308         u32 unsol_queue[HDA_UNSOL_QUEUE_SIZE * 2]; /* ring buffer */
 309         unsigned int unsol_rp, unsol_wp;
 310         struct work_struct unsol_work;
 311 
 312         /* bit flags of detected codecs */
 313         unsigned long codec_mask;
 314 
 315         /* bit flags of powered codecs */
 316         unsigned long codec_powered;
 317 
 318         /* CORB/RIRB */
 319         struct hdac_rb corb;
 320         struct hdac_rb rirb;
 321         unsigned int last_cmd[HDA_MAX_CODECS];  /* last sent command */
 322 
 323         /* CORB/RIRB and position buffers */
 324         struct snd_dma_buffer rb;
 325         struct snd_dma_buffer posbuf;
 326         int dma_type;                   /* SNDRV_DMA_TYPE_XXX for CORB/RIRB */
 327 
 328         /* hdac_stream linked list */
 329         struct list_head stream_list;
 330 
 331         /* operation state */
 332         bool chip_init:1;               /* h/w initialized */
 333 
 334         /* behavior flags */
 335         bool aligned_mmio:1;            /* aligned MMIO access */
 336         bool sync_write:1;              /* sync after verb write */
 337         bool use_posbuf:1;              /* use position buffer */
 338         bool snoop:1;                   /* enable snooping */
 339         bool align_bdle_4k:1;           /* BDLE align 4K boundary */
 340         bool reverse_assign:1;          /* assign devices in reverse order */
 341         bool corbrp_self_clear:1;       /* CORBRP clears itself after reset */
 342         bool polling_mode:1;
 343 
 344         int poll_count;
 345 
 346         int bdl_pos_adj;                /* BDL position adjustment */
 347 
 348         /* locks */
 349         spinlock_t reg_lock;
 350         struct mutex cmd_mutex;
 351         struct mutex lock;
 352 
 353         /* DRM component interface */
 354         struct drm_audio_component *audio_component;
 355         long display_power_status;
 356         unsigned long display_power_active;
 357 
 358         /* parameters required for enhanced capabilities */
 359         int num_streams;
 360         int idx;
 361 
 362         /* link management */
 363         struct list_head hlink_list;
 364         bool cmd_dma_state;
 365 };
 366 
 367 int snd_hdac_bus_init(struct hdac_bus *bus, struct device *dev,
 368                       const struct hdac_bus_ops *ops);
 369 void snd_hdac_bus_exit(struct hdac_bus *bus);
 370 int snd_hdac_bus_exec_verb(struct hdac_bus *bus, unsigned int addr,
 371                            unsigned int cmd, unsigned int *res);
 372 int snd_hdac_bus_exec_verb_unlocked(struct hdac_bus *bus, unsigned int addr,
 373                                     unsigned int cmd, unsigned int *res);
 374 void snd_hdac_bus_queue_event(struct hdac_bus *bus, u32 res, u32 res_ex);
 375 
 376 static inline void snd_hdac_codec_link_up(struct hdac_device *codec)
 377 {
 378         set_bit(codec->addr, &codec->bus->codec_powered);
 379 }
 380 
 381 static inline void snd_hdac_codec_link_down(struct hdac_device *codec)
 382 {
 383         clear_bit(codec->addr, &codec->bus->codec_powered);
 384 }
 385 
 386 int snd_hdac_bus_send_cmd(struct hdac_bus *bus, unsigned int val);
 387 int snd_hdac_bus_get_response(struct hdac_bus *bus, unsigned int addr,
 388                               unsigned int *res);
 389 int snd_hdac_bus_parse_capabilities(struct hdac_bus *bus);
 390 
 391 bool snd_hdac_bus_init_chip(struct hdac_bus *bus, bool full_reset);
 392 void snd_hdac_bus_stop_chip(struct hdac_bus *bus);
 393 void snd_hdac_bus_init_cmd_io(struct hdac_bus *bus);
 394 void snd_hdac_bus_stop_cmd_io(struct hdac_bus *bus);
 395 void snd_hdac_bus_enter_link_reset(struct hdac_bus *bus);
 396 void snd_hdac_bus_exit_link_reset(struct hdac_bus *bus);
 397 int snd_hdac_bus_reset_link(struct hdac_bus *bus, bool full_reset);
 398 
 399 void snd_hdac_bus_update_rirb(struct hdac_bus *bus);
 400 int snd_hdac_bus_handle_stream_irq(struct hdac_bus *bus, unsigned int status,
 401                                     void (*ack)(struct hdac_bus *,
 402                                                 struct hdac_stream *));
 403 
 404 int snd_hdac_bus_alloc_stream_pages(struct hdac_bus *bus);
 405 void snd_hdac_bus_free_stream_pages(struct hdac_bus *bus);
 406 
 407 #ifdef CONFIG_SND_HDA_ALIGNED_MMIO
 408 unsigned int snd_hdac_aligned_read(void __iomem *addr, unsigned int mask);
 409 void snd_hdac_aligned_write(unsigned int val, void __iomem *addr,
 410                             unsigned int mask);
 411 #define snd_hdac_aligned_mmio(bus)      (bus)->aligned_mmio
 412 #else
 413 #define snd_hdac_aligned_mmio(bus)      false
 414 #define snd_hdac_aligned_read(addr, mask)       0
 415 #define snd_hdac_aligned_write(val, addr, mask) do {} while (0)
 416 #endif
 417 
 418 static inline void snd_hdac_reg_writeb(struct hdac_bus *bus, void __iomem *addr,
 419                                        u8 val)
 420 {
 421         if (snd_hdac_aligned_mmio(bus))
 422                 snd_hdac_aligned_write(val, addr, 0xff);
 423         else
 424                 writeb(val, addr);
 425 }
 426 
 427 static inline void snd_hdac_reg_writew(struct hdac_bus *bus, void __iomem *addr,
 428                                        u16 val)
 429 {
 430         if (snd_hdac_aligned_mmio(bus))
 431                 snd_hdac_aligned_write(val, addr, 0xffff);
 432         else
 433                 writew(val, addr);
 434 }
 435 
 436 static inline u8 snd_hdac_reg_readb(struct hdac_bus *bus, void __iomem *addr)
 437 {
 438         return snd_hdac_aligned_mmio(bus) ?
 439                 snd_hdac_aligned_read(addr, 0xff) : readb(addr);
 440 }
 441 
 442 static inline u16 snd_hdac_reg_readw(struct hdac_bus *bus, void __iomem *addr)
 443 {
 444         return snd_hdac_aligned_mmio(bus) ?
 445                 snd_hdac_aligned_read(addr, 0xffff) : readw(addr);
 446 }
 447 
 448 #define snd_hdac_reg_writel(bus, addr, val)     writel(val, addr)
 449 #define snd_hdac_reg_readl(bus, addr)   readl(addr)
 450 
 451 /*
 452  * macros for easy use
 453  */
 454 #define _snd_hdac_chip_writeb(chip, reg, value) \
 455         snd_hdac_reg_writeb(chip, (chip)->remap_addr + (reg), value)
 456 #define _snd_hdac_chip_readb(chip, reg) \
 457         snd_hdac_reg_readb(chip, (chip)->remap_addr + (reg))
 458 #define _snd_hdac_chip_writew(chip, reg, value) \
 459         snd_hdac_reg_writew(chip, (chip)->remap_addr + (reg), value)
 460 #define _snd_hdac_chip_readw(chip, reg) \
 461         snd_hdac_reg_readw(chip, (chip)->remap_addr + (reg))
 462 #define _snd_hdac_chip_writel(chip, reg, value) \
 463         snd_hdac_reg_writel(chip, (chip)->remap_addr + (reg), value)
 464 #define _snd_hdac_chip_readl(chip, reg) \
 465         snd_hdac_reg_readl(chip, (chip)->remap_addr + (reg))
 466 
 467 /* read/write a register, pass without AZX_REG_ prefix */
 468 #define snd_hdac_chip_writel(chip, reg, value) \
 469         _snd_hdac_chip_writel(chip, AZX_REG_ ## reg, value)
 470 #define snd_hdac_chip_writew(chip, reg, value) \
 471         _snd_hdac_chip_writew(chip, AZX_REG_ ## reg, value)
 472 #define snd_hdac_chip_writeb(chip, reg, value) \
 473         _snd_hdac_chip_writeb(chip, AZX_REG_ ## reg, value)
 474 #define snd_hdac_chip_readl(chip, reg) \
 475         _snd_hdac_chip_readl(chip, AZX_REG_ ## reg)
 476 #define snd_hdac_chip_readw(chip, reg) \
 477         _snd_hdac_chip_readw(chip, AZX_REG_ ## reg)
 478 #define snd_hdac_chip_readb(chip, reg) \
 479         _snd_hdac_chip_readb(chip, AZX_REG_ ## reg)
 480 
 481 /* update a register, pass without AZX_REG_ prefix */
 482 #define snd_hdac_chip_updatel(chip, reg, mask, val) \
 483         snd_hdac_chip_writel(chip, reg, \
 484                              (snd_hdac_chip_readl(chip, reg) & ~(mask)) | (val))
 485 #define snd_hdac_chip_updatew(chip, reg, mask, val) \
 486         snd_hdac_chip_writew(chip, reg, \
 487                              (snd_hdac_chip_readw(chip, reg) & ~(mask)) | (val))
 488 #define snd_hdac_chip_updateb(chip, reg, mask, val) \
 489         snd_hdac_chip_writeb(chip, reg, \
 490                              (snd_hdac_chip_readb(chip, reg) & ~(mask)) | (val))
 491 
 492 /*
 493  * HD-audio stream
 494  */
 495 struct hdac_stream {
 496         struct hdac_bus *bus;
 497         struct snd_dma_buffer bdl; /* BDL buffer */
 498         __le32 *posbuf;         /* position buffer pointer */
 499         int direction;          /* playback / capture (SNDRV_PCM_STREAM_*) */
 500 
 501         unsigned int bufsize;   /* size of the play buffer in bytes */
 502         unsigned int period_bytes; /* size of the period in bytes */
 503         unsigned int frags;     /* number for period in the play buffer */
 504         unsigned int fifo_size; /* FIFO size */
 505 
 506         void __iomem *sd_addr;  /* stream descriptor pointer */
 507 
 508         u32 sd_int_sta_mask;    /* stream int status mask */
 509 
 510         /* pcm support */
 511         struct snd_pcm_substream *substream;    /* assigned substream,
 512                                                  * set in PCM open
 513                                                  */
 514         unsigned int format_val;        /* format value to be set in the
 515                                          * controller and the codec
 516                                          */
 517         unsigned char stream_tag;       /* assigned stream */
 518         unsigned char index;            /* stream index */
 519         int assigned_key;               /* last device# key assigned to */
 520 
 521         bool opened:1;
 522         bool running:1;
 523         bool prepared:1;
 524         bool no_period_wakeup:1;
 525         bool locked:1;
 526         bool stripe:1;                  /* apply stripe control */
 527 
 528         /* timestamp */
 529         unsigned long start_wallclk;    /* start + minimum wallclk */
 530         unsigned long period_wallclk;   /* wallclk for period */
 531         struct timecounter  tc;
 532         struct cyclecounter cc;
 533         int delay_negative_threshold;
 534 
 535         struct list_head list;
 536 #ifdef CONFIG_SND_HDA_DSP_LOADER
 537         /* DSP access mutex */
 538         struct mutex dsp_mutex;
 539 #endif
 540 };
 541 
 542 void snd_hdac_stream_init(struct hdac_bus *bus, struct hdac_stream *azx_dev,
 543                           int idx, int direction, int tag);
 544 struct hdac_stream *snd_hdac_stream_assign(struct hdac_bus *bus,
 545                                            struct snd_pcm_substream *substream);
 546 void snd_hdac_stream_release(struct hdac_stream *azx_dev);
 547 struct hdac_stream *snd_hdac_get_stream(struct hdac_bus *bus,
 548                                         int dir, int stream_tag);
 549 
 550 int snd_hdac_stream_setup(struct hdac_stream *azx_dev);
 551 void snd_hdac_stream_cleanup(struct hdac_stream *azx_dev);
 552 int snd_hdac_stream_setup_periods(struct hdac_stream *azx_dev);
 553 int snd_hdac_stream_set_params(struct hdac_stream *azx_dev,
 554                                 unsigned int format_val);
 555 void snd_hdac_stream_start(struct hdac_stream *azx_dev, bool fresh_start);
 556 void snd_hdac_stream_clear(struct hdac_stream *azx_dev);
 557 void snd_hdac_stream_stop(struct hdac_stream *azx_dev);
 558 void snd_hdac_stream_reset(struct hdac_stream *azx_dev);
 559 void snd_hdac_stream_sync_trigger(struct hdac_stream *azx_dev, bool set,
 560                                   unsigned int streams, unsigned int reg);
 561 void snd_hdac_stream_sync(struct hdac_stream *azx_dev, bool start,
 562                           unsigned int streams);
 563 void snd_hdac_stream_timecounter_init(struct hdac_stream *azx_dev,
 564                                       unsigned int streams);
 565 int snd_hdac_get_stream_stripe_ctl(struct hdac_bus *bus,
 566                                 struct snd_pcm_substream *substream);
 567 
 568 /*
 569  * macros for easy use
 570  */
 571 /* read/write a register, pass without AZX_REG_ prefix */
 572 #define snd_hdac_stream_writel(dev, reg, value) \
 573         snd_hdac_reg_writel((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg, value)
 574 #define snd_hdac_stream_writew(dev, reg, value) \
 575         snd_hdac_reg_writew((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg, value)
 576 #define snd_hdac_stream_writeb(dev, reg, value) \
 577         snd_hdac_reg_writeb((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg, value)
 578 #define snd_hdac_stream_readl(dev, reg) \
 579         snd_hdac_reg_readl((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg)
 580 #define snd_hdac_stream_readw(dev, reg) \
 581         snd_hdac_reg_readw((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg)
 582 #define snd_hdac_stream_readb(dev, reg) \
 583         snd_hdac_reg_readb((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg)
 584 
 585 /* update a register, pass without AZX_REG_ prefix */
 586 #define snd_hdac_stream_updatel(dev, reg, mask, val) \
 587         snd_hdac_stream_writel(dev, reg, \
 588                                (snd_hdac_stream_readl(dev, reg) & \
 589                                 ~(mask)) | (val))
 590 #define snd_hdac_stream_updatew(dev, reg, mask, val) \
 591         snd_hdac_stream_writew(dev, reg, \
 592                                (snd_hdac_stream_readw(dev, reg) & \
 593                                 ~(mask)) | (val))
 594 #define snd_hdac_stream_updateb(dev, reg, mask, val) \
 595         snd_hdac_stream_writeb(dev, reg, \
 596                                (snd_hdac_stream_readb(dev, reg) & \
 597                                 ~(mask)) | (val))
 598 
 599 #ifdef CONFIG_SND_HDA_DSP_LOADER
 600 /* DSP lock helpers */
 601 #define snd_hdac_dsp_lock_init(dev)     mutex_init(&(dev)->dsp_mutex)
 602 #define snd_hdac_dsp_lock(dev)          mutex_lock(&(dev)->dsp_mutex)
 603 #define snd_hdac_dsp_unlock(dev)        mutex_unlock(&(dev)->dsp_mutex)
 604 #define snd_hdac_stream_is_locked(dev)  ((dev)->locked)
 605 /* DSP loader helpers */
 606 int snd_hdac_dsp_prepare(struct hdac_stream *azx_dev, unsigned int format,
 607                          unsigned int byte_size, struct snd_dma_buffer *bufp);
 608 void snd_hdac_dsp_trigger(struct hdac_stream *azx_dev, bool start);
 609 void snd_hdac_dsp_cleanup(struct hdac_stream *azx_dev,
 610                           struct snd_dma_buffer *dmab);
 611 #else /* CONFIG_SND_HDA_DSP_LOADER */
 612 #define snd_hdac_dsp_lock_init(dev)     do {} while (0)
 613 #define snd_hdac_dsp_lock(dev)          do {} while (0)
 614 #define snd_hdac_dsp_unlock(dev)        do {} while (0)
 615 #define snd_hdac_stream_is_locked(dev)  0
 616 
 617 static inline int
 618 snd_hdac_dsp_prepare(struct hdac_stream *azx_dev, unsigned int format,
 619                      unsigned int byte_size, struct snd_dma_buffer *bufp)
 620 {
 621         return 0;
 622 }
 623 
 624 static inline void snd_hdac_dsp_trigger(struct hdac_stream *azx_dev, bool start)
 625 {
 626 }
 627 
 628 static inline void snd_hdac_dsp_cleanup(struct hdac_stream *azx_dev,
 629                                         struct snd_dma_buffer *dmab)
 630 {
 631 }
 632 #endif /* CONFIG_SND_HDA_DSP_LOADER */
 633 
 634 
 635 /*
 636  * generic array helpers
 637  */
 638 void *snd_array_new(struct snd_array *array);
 639 void snd_array_free(struct snd_array *array);
 640 static inline void snd_array_init(struct snd_array *array, unsigned int size,
 641                                   unsigned int align)
 642 {
 643         array->elem_size = size;
 644         array->alloc_align = align;
 645 }
 646 
 647 static inline void *snd_array_elem(struct snd_array *array, unsigned int idx)
 648 {
 649         return array->list + idx * array->elem_size;
 650 }
 651 
 652 static inline unsigned int snd_array_index(struct snd_array *array, void *ptr)
 653 {
 654         return (unsigned long)(ptr - array->list) / array->elem_size;
 655 }
 656 
 657 /* a helper macro to iterate for each snd_array element */
 658 #define snd_array_for_each(array, idx, ptr) \
 659         for ((idx) = 0, (ptr) = (array)->list; (idx) < (array)->used; \
 660              (ptr) = snd_array_elem(array, ++(idx)))
 661 
 662 #endif /* __SOUND_HDAUDIO_H */

/* [<][>][^][v][top][bottom][index][help] */