summaryrefslogtreecommitdiffstats
path: root/include/sound/hdaudio.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/sound/hdaudio.h')
-rw-r--r--include/sound/hdaudio.h69
1 files changed, 31 insertions, 38 deletions
diff --git a/include/sound/hdaudio.h b/include/sound/hdaudio.h
index 612a17e375d0..4af4af55e854 100644
--- a/include/sound/hdaudio.h
+++ b/include/sound/hdaudio.h
@@ -253,24 +253,6 @@ struct hdac_ext_bus_ops {
253 int (*hdev_detach)(struct hdac_device *hdev); 253 int (*hdev_detach)(struct hdac_device *hdev);
254}; 254};
255 255
256/*
257 * Lowlevel I/O operators
258 */
259struct hdac_io_ops {
260 /* mapped register accesses */
261 void (*reg_writel)(u32 value, u32 __iomem *addr);
262 u32 (*reg_readl)(u32 __iomem *addr);
263 void (*reg_writew)(u16 value, u16 __iomem *addr);
264 u16 (*reg_readw)(u16 __iomem *addr);
265 void (*reg_writeb)(u8 value, u8 __iomem *addr);
266 u8 (*reg_readb)(u8 __iomem *addr);
267 /* Allocation ops */
268 int (*dma_alloc_pages)(struct hdac_bus *bus, int type, size_t size,
269 struct snd_dma_buffer *buf);
270 void (*dma_free_pages)(struct hdac_bus *bus,
271 struct snd_dma_buffer *buf);
272};
273
274#define HDA_UNSOL_QUEUE_SIZE 64 256#define HDA_UNSOL_QUEUE_SIZE 64
275#define HDA_MAX_CODECS 8 /* limit by controller side */ 257#define HDA_MAX_CODECS 8 /* limit by controller side */
276 258
@@ -304,7 +286,6 @@ struct hdac_rb {
304struct hdac_bus { 286struct hdac_bus {
305 struct device *dev; 287 struct device *dev;
306 const struct hdac_bus_ops *ops; 288 const struct hdac_bus_ops *ops;
307 const struct hdac_io_ops *io_ops;
308 const struct hdac_ext_bus_ops *ext_ops; 289 const struct hdac_ext_bus_ops *ext_ops;
309 290
310 /* h/w resources */ 291 /* h/w resources */
@@ -344,6 +325,7 @@ struct hdac_bus {
344 /* CORB/RIRB and position buffers */ 325 /* CORB/RIRB and position buffers */
345 struct snd_dma_buffer rb; 326 struct snd_dma_buffer rb;
346 struct snd_dma_buffer posbuf; 327 struct snd_dma_buffer posbuf;
328 int dma_type; /* SNDRV_DMA_TYPE_XXX for CORB/RIRB */
347 329
348 /* hdac_stream linked list */ 330 /* hdac_stream linked list */
349 struct list_head stream_list; 331 struct list_head stream_list;
@@ -384,8 +366,7 @@ struct hdac_bus {
384}; 366};
385 367
386int snd_hdac_bus_init(struct hdac_bus *bus, struct device *dev, 368int snd_hdac_bus_init(struct hdac_bus *bus, struct device *dev,
387 const struct hdac_bus_ops *ops, 369 const struct hdac_bus_ops *ops);
388 const struct hdac_io_ops *io_ops);
389void snd_hdac_bus_exit(struct hdac_bus *bus); 370void snd_hdac_bus_exit(struct hdac_bus *bus);
390int snd_hdac_bus_exec_verb(struct hdac_bus *bus, unsigned int addr, 371int snd_hdac_bus_exec_verb(struct hdac_bus *bus, unsigned int addr,
391 unsigned int cmd, unsigned int *res); 372 unsigned int cmd, unsigned int *res);
@@ -429,21 +410,38 @@ int snd_hdac_bus_handle_stream_irq(struct hdac_bus *bus, unsigned int status,
429int snd_hdac_bus_alloc_stream_pages(struct hdac_bus *bus); 410int snd_hdac_bus_alloc_stream_pages(struct hdac_bus *bus);
430void snd_hdac_bus_free_stream_pages(struct hdac_bus *bus); 411void snd_hdac_bus_free_stream_pages(struct hdac_bus *bus);
431 412
413#ifdef CONFIG_SND_HDA_ALIGNED_MMIO
414unsigned int snd_hdac_aligned_read(void __iomem *addr, unsigned int mask);
415void snd_hdac_aligned_write(unsigned int val, void __iomem *addr,
416 unsigned int mask);
417#define snd_hdac_reg_writeb(v, addr) snd_hdac_aligned_write(v, addr, 0xff)
418#define snd_hdac_reg_writew(v, addr) snd_hdac_aligned_write(v, addr, 0xffff)
419#define snd_hdac_reg_readb(addr) snd_hdac_aligned_read(addr, 0xff)
420#define snd_hdac_reg_readw(addr) snd_hdac_aligned_read(addr, 0xffff)
421#else /* CONFIG_SND_HDA_ALIGNED_MMIO */
422#define snd_hdac_reg_writeb(val, addr) writeb(val, addr)
423#define snd_hdac_reg_writew(val, addr) writew(val, addr)
424#define snd_hdac_reg_readb(addr) readb(addr)
425#define snd_hdac_reg_readw(addr) readw(addr)
426#endif /* CONFIG_SND_HDA_ALIGNED_MMIO */
427#define snd_hdac_reg_writel(val, addr) writel(val, addr)
428#define snd_hdac_reg_readl(addr) readl(addr)
429
432/* 430/*
433 * macros for easy use 431 * macros for easy use
434 */ 432 */
435#define _snd_hdac_chip_writeb(chip, reg, value) \ 433#define _snd_hdac_chip_writeb(chip, reg, value) \
436 ((chip)->io_ops->reg_writeb(value, (chip)->remap_addr + (reg))) 434 snd_hdac_reg_writeb(value, (chip)->remap_addr + (reg))
437#define _snd_hdac_chip_readb(chip, reg) \ 435#define _snd_hdac_chip_readb(chip, reg) \
438 ((chip)->io_ops->reg_readb((chip)->remap_addr + (reg))) 436 snd_hdac_reg_readb((chip)->remap_addr + (reg))
439#define _snd_hdac_chip_writew(chip, reg, value) \ 437#define _snd_hdac_chip_writew(chip, reg, value) \
440 ((chip)->io_ops->reg_writew(value, (chip)->remap_addr + (reg))) 438 snd_hdac_reg_writew(value, (chip)->remap_addr + (reg))
441#define _snd_hdac_chip_readw(chip, reg) \ 439#define _snd_hdac_chip_readw(chip, reg) \
442 ((chip)->io_ops->reg_readw((chip)->remap_addr + (reg))) 440 snd_hdac_reg_readw((chip)->remap_addr + (reg))
443#define _snd_hdac_chip_writel(chip, reg, value) \ 441#define _snd_hdac_chip_writel(chip, reg, value) \
444 ((chip)->io_ops->reg_writel(value, (chip)->remap_addr + (reg))) 442 snd_hdac_reg_writel(value, (chip)->remap_addr + (reg))
445#define _snd_hdac_chip_readl(chip, reg) \ 443#define _snd_hdac_chip_readl(chip, reg) \
446 ((chip)->io_ops->reg_readl((chip)->remap_addr + (reg))) 444 snd_hdac_reg_readl((chip)->remap_addr + (reg))
447 445
448/* read/write a register, pass without AZX_REG_ prefix */ 446/* read/write a register, pass without AZX_REG_ prefix */
449#define snd_hdac_chip_writel(chip, reg, value) \ 447#define snd_hdac_chip_writel(chip, reg, value) \
@@ -548,24 +546,19 @@ int snd_hdac_get_stream_stripe_ctl(struct hdac_bus *bus,
548/* 546/*
549 * macros for easy use 547 * macros for easy use
550 */ 548 */
551#define _snd_hdac_stream_write(type, dev, reg, value) \
552 ((dev)->bus->io_ops->reg_write ## type(value, (dev)->sd_addr + (reg)))
553#define _snd_hdac_stream_read(type, dev, reg) \
554 ((dev)->bus->io_ops->reg_read ## type((dev)->sd_addr + (reg)))
555
556/* read/write a register, pass without AZX_REG_ prefix */ 549/* read/write a register, pass without AZX_REG_ prefix */
557#define snd_hdac_stream_writel(dev, reg, value) \ 550#define snd_hdac_stream_writel(dev, reg, value) \
558 _snd_hdac_stream_write(l, dev, AZX_REG_ ## reg, value) 551 snd_hdac_reg_writel(value, (dev)->sd_addr + AZX_REG_ ## reg)
559#define snd_hdac_stream_writew(dev, reg, value) \ 552#define snd_hdac_stream_writew(dev, reg, value) \
560 _snd_hdac_stream_write(w, dev, AZX_REG_ ## reg, value) 553 snd_hdac_reg_writew(value, (dev)->sd_addr + AZX_REG_ ## reg)
561#define snd_hdac_stream_writeb(dev, reg, value) \ 554#define snd_hdac_stream_writeb(dev, reg, value) \
562 _snd_hdac_stream_write(b, dev, AZX_REG_ ## reg, value) 555 snd_hdac_reg_writeb(value, (dev)->sd_addr + AZX_REG_ ## reg)
563#define snd_hdac_stream_readl(dev, reg) \ 556#define snd_hdac_stream_readl(dev, reg) \
564 _snd_hdac_stream_read(l, dev, AZX_REG_ ## reg) 557 snd_hdac_reg_readl((dev)->sd_addr + AZX_REG_ ## reg)
565#define snd_hdac_stream_readw(dev, reg) \ 558#define snd_hdac_stream_readw(dev, reg) \
566 _snd_hdac_stream_read(w, dev, AZX_REG_ ## reg) 559 snd_hdac_reg_readw((dev)->sd_addr + AZX_REG_ ## reg)
567#define snd_hdac_stream_readb(dev, reg) \ 560#define snd_hdac_stream_readb(dev, reg) \
568 _snd_hdac_stream_read(b, dev, AZX_REG_ ## reg) 561 snd_hdac_reg_readb((dev)->sd_addr + AZX_REG_ ## reg)
569 562
570/* update a register, pass without AZX_REG_ prefix */ 563/* update a register, pass without AZX_REG_ prefix */
571#define snd_hdac_stream_updatel(dev, reg, mask, val) \ 564#define snd_hdac_stream_updatel(dev, reg, mask, val) \