diff options
Diffstat (limited to 'include/sound/hdaudio.h')
-rw-r--r-- | include/sound/hdaudio.h | 69 |
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 | */ | ||
259 | struct 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 { | |||
304 | struct hdac_bus { | 286 | struct 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 | ||
386 | int snd_hdac_bus_init(struct hdac_bus *bus, struct device *dev, | 368 | int 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); | ||
389 | void snd_hdac_bus_exit(struct hdac_bus *bus); | 370 | void snd_hdac_bus_exit(struct hdac_bus *bus); |
390 | int snd_hdac_bus_exec_verb(struct hdac_bus *bus, unsigned int addr, | 371 | int 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, | |||
429 | int snd_hdac_bus_alloc_stream_pages(struct hdac_bus *bus); | 410 | int snd_hdac_bus_alloc_stream_pages(struct hdac_bus *bus); |
430 | void snd_hdac_bus_free_stream_pages(struct hdac_bus *bus); | 411 | void snd_hdac_bus_free_stream_pages(struct hdac_bus *bus); |
431 | 412 | ||
413 | #ifdef CONFIG_SND_HDA_ALIGNED_MMIO | ||
414 | unsigned int snd_hdac_aligned_read(void __iomem *addr, unsigned int mask); | ||
415 | void 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) \ |