Loading include/sound/hdaudio.h +53 −24 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ #include <linux/device.h> #include <linux/interrupt.h> #include <linux/io.h> #include <linux/pm_runtime.h> #include <linux/timecounter.h> #include <sound/core.h> Loading Loading @@ -332,6 +333,7 @@ struct hdac_bus { bool chip_init:1; /* h/w initialized */ /* behavior flags */ bool aligned_mmio:1; /* aligned MMIO access */ bool sync_write:1; /* sync after verb write */ bool use_posbuf:1; /* use position buffer */ bool snoop:1; /* enable snooping */ Loading Loading @@ -408,34 +410,61 @@ void snd_hdac_bus_free_stream_pages(struct hdac_bus *bus); unsigned int snd_hdac_aligned_read(void __iomem *addr, unsigned int mask); void snd_hdac_aligned_write(unsigned int val, void __iomem *addr, unsigned int mask); #define snd_hdac_reg_writeb(v, addr) snd_hdac_aligned_write(v, addr, 0xff) #define snd_hdac_reg_writew(v, addr) snd_hdac_aligned_write(v, addr, 0xffff) #define snd_hdac_reg_readb(addr) snd_hdac_aligned_read(addr, 0xff) #define snd_hdac_reg_readw(addr) snd_hdac_aligned_read(addr, 0xffff) #else /* CONFIG_SND_HDA_ALIGNED_MMIO */ #define snd_hdac_reg_writeb(val, addr) writeb(val, addr) #define snd_hdac_reg_writew(val, addr) writew(val, addr) #define snd_hdac_reg_readb(addr) readb(addr) #define snd_hdac_reg_readw(addr) readw(addr) #endif /* CONFIG_SND_HDA_ALIGNED_MMIO */ #define snd_hdac_reg_writel(val, addr) writel(val, addr) #define snd_hdac_reg_readl(addr) readl(addr) #define snd_hdac_aligned_mmio(bus) (bus)->aligned_mmio #else #define snd_hdac_aligned_mmio(bus) false #define snd_hdac_aligned_read(addr, mask) 0 #define snd_hdac_aligned_write(val, addr, mask) do {} while (0) #endif static inline void snd_hdac_reg_writeb(struct hdac_bus *bus, void __iomem *addr, u8 val) { if (snd_hdac_aligned_mmio(bus)) snd_hdac_aligned_write(val, addr, 0xff); else writeb(val, addr); } static inline void snd_hdac_reg_writew(struct hdac_bus *bus, void __iomem *addr, u16 val) { if (snd_hdac_aligned_mmio(bus)) snd_hdac_aligned_write(val, addr, 0xffff); else writew(val, addr); } static inline u8 snd_hdac_reg_readb(struct hdac_bus *bus, void __iomem *addr) { return snd_hdac_aligned_mmio(bus) ? snd_hdac_aligned_read(addr, 0xff) : readb(addr); } static inline u16 snd_hdac_reg_readw(struct hdac_bus *bus, void __iomem *addr) { return snd_hdac_aligned_mmio(bus) ? snd_hdac_aligned_read(addr, 0xffff) : readw(addr); } #define snd_hdac_reg_writel(bus, addr, val) writel(val, addr) #define snd_hdac_reg_readl(bus, addr) readl(addr) /* * macros for easy use */ #define _snd_hdac_chip_writeb(chip, reg, value) \ snd_hdac_reg_writeb(value, (chip)->remap_addr + (reg)) snd_hdac_reg_writeb(chip, (chip)->remap_addr + (reg), value) #define _snd_hdac_chip_readb(chip, reg) \ snd_hdac_reg_readb((chip)->remap_addr + (reg)) snd_hdac_reg_readb(chip, (chip)->remap_addr + (reg)) #define _snd_hdac_chip_writew(chip, reg, value) \ snd_hdac_reg_writew(value, (chip)->remap_addr + (reg)) snd_hdac_reg_writew(chip, (chip)->remap_addr + (reg), value) #define _snd_hdac_chip_readw(chip, reg) \ snd_hdac_reg_readw((chip)->remap_addr + (reg)) snd_hdac_reg_readw(chip, (chip)->remap_addr + (reg)) #define _snd_hdac_chip_writel(chip, reg, value) \ snd_hdac_reg_writel(value, (chip)->remap_addr + (reg)) snd_hdac_reg_writel(chip, (chip)->remap_addr + (reg), value) #define _snd_hdac_chip_readl(chip, reg) \ snd_hdac_reg_readl((chip)->remap_addr + (reg)) snd_hdac_reg_readl(chip, (chip)->remap_addr + (reg)) /* read/write a register, pass without AZX_REG_ prefix */ #define snd_hdac_chip_writel(chip, reg, value) \ Loading Loading @@ -543,17 +572,17 @@ int snd_hdac_get_stream_stripe_ctl(struct hdac_bus *bus, */ /* read/write a register, pass without AZX_REG_ prefix */ #define snd_hdac_stream_writel(dev, reg, value) \ snd_hdac_reg_writel(value, (dev)->sd_addr + AZX_REG_ ## reg) snd_hdac_reg_writel((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg, value) #define snd_hdac_stream_writew(dev, reg, value) \ snd_hdac_reg_writew(value, (dev)->sd_addr + AZX_REG_ ## reg) snd_hdac_reg_writew((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg, value) #define snd_hdac_stream_writeb(dev, reg, value) \ snd_hdac_reg_writeb(value, (dev)->sd_addr + AZX_REG_ ## reg) snd_hdac_reg_writeb((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg, value) #define snd_hdac_stream_readl(dev, reg) \ snd_hdac_reg_readl((dev)->sd_addr + AZX_REG_ ## reg) snd_hdac_reg_readl((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg) #define snd_hdac_stream_readw(dev, reg) \ snd_hdac_reg_readw((dev)->sd_addr + AZX_REG_ ## reg) snd_hdac_reg_readw((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg) #define snd_hdac_stream_readb(dev, reg) \ snd_hdac_reg_readb((dev)->sd_addr + AZX_REG_ ## reg) snd_hdac_reg_readb((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg) /* update a register, pass without AZX_REG_ prefix */ #define snd_hdac_stream_updatel(dev, reg, mask, val) \ Loading sound/core/seq/seq_timer.c +9 −5 Original line number Diff line number Diff line Loading @@ -471,15 +471,19 @@ void snd_seq_info_timer_read(struct snd_info_entry *entry, q = queueptr(idx); if (q == NULL) continue; if ((tmr = q->timer) == NULL || (ti = tmr->timeri) == NULL) { queuefree(q); continue; } mutex_lock(&q->timer_mutex); tmr = q->timer; if (!tmr) goto unlock; ti = tmr->timeri; if (!ti) goto unlock; snd_iprintf(buffer, "Timer for queue %i : %s\n", q->queue, ti->timer->name); resolution = snd_timer_resolution(ti) * tmr->ticks; snd_iprintf(buffer, " Period time : %lu.%09lu\n", resolution / 1000000000, resolution % 1000000000); snd_iprintf(buffer, " Skew : %u / %u\n", tmr->skew, tmr->skew_base); unlock: mutex_unlock(&q->timer_mutex); queuefree(q); } } Loading sound/firewire/dice/dice-extension.c +4 −1 Original line number Diff line number Diff line Loading @@ -159,10 +159,13 @@ int snd_dice_detect_extension_formats(struct snd_dice *dice) int j; for (j = i + 1; j < 9; ++j) { if (pointers[i * 2] == pointers[j * 2]) if (pointers[i * 2] == pointers[j * 2]) { // Fallback to limited functionality. err = -ENXIO; goto end; } } } section_addr = DICE_EXT_APP_SPACE + be32_to_cpu(pointers[12]) * 4; err = detect_stream_formats(dice, section_addr); Loading sound/firewire/tascam/amdtp-tascam.c +3 −2 Original line number Diff line number Diff line Loading @@ -157,14 +157,15 @@ static void read_status_messages(struct amdtp_stream *s, if ((before ^ after) & mask) { struct snd_firewire_tascam_change *entry = &tscm->queue[tscm->push_pos]; unsigned long flag; spin_lock_irq(&tscm->lock); spin_lock_irqsave(&tscm->lock, flag); entry->index = index; entry->before = before; entry->after = after; if (++tscm->push_pos >= SND_TSCM_QUEUE_COUNT) tscm->push_pos = 0; spin_unlock_irq(&tscm->lock); spin_unlock_irqrestore(&tscm->lock, flag); wake_up(&tscm->hwdep_wait); } Loading sound/pci/hda/hda_tegra.c +1 −0 Original line number Diff line number Diff line Loading @@ -395,6 +395,7 @@ static int hda_tegra_create(struct snd_card *card, return err; chip->bus.core.needs_damn_long_delay = 1; chip->bus.core.aligned_mmio = 1; err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); if (err < 0) { Loading Loading
include/sound/hdaudio.h +53 −24 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ #include <linux/device.h> #include <linux/interrupt.h> #include <linux/io.h> #include <linux/pm_runtime.h> #include <linux/timecounter.h> #include <sound/core.h> Loading Loading @@ -332,6 +333,7 @@ struct hdac_bus { bool chip_init:1; /* h/w initialized */ /* behavior flags */ bool aligned_mmio:1; /* aligned MMIO access */ bool sync_write:1; /* sync after verb write */ bool use_posbuf:1; /* use position buffer */ bool snoop:1; /* enable snooping */ Loading Loading @@ -408,34 +410,61 @@ void snd_hdac_bus_free_stream_pages(struct hdac_bus *bus); unsigned int snd_hdac_aligned_read(void __iomem *addr, unsigned int mask); void snd_hdac_aligned_write(unsigned int val, void __iomem *addr, unsigned int mask); #define snd_hdac_reg_writeb(v, addr) snd_hdac_aligned_write(v, addr, 0xff) #define snd_hdac_reg_writew(v, addr) snd_hdac_aligned_write(v, addr, 0xffff) #define snd_hdac_reg_readb(addr) snd_hdac_aligned_read(addr, 0xff) #define snd_hdac_reg_readw(addr) snd_hdac_aligned_read(addr, 0xffff) #else /* CONFIG_SND_HDA_ALIGNED_MMIO */ #define snd_hdac_reg_writeb(val, addr) writeb(val, addr) #define snd_hdac_reg_writew(val, addr) writew(val, addr) #define snd_hdac_reg_readb(addr) readb(addr) #define snd_hdac_reg_readw(addr) readw(addr) #endif /* CONFIG_SND_HDA_ALIGNED_MMIO */ #define snd_hdac_reg_writel(val, addr) writel(val, addr) #define snd_hdac_reg_readl(addr) readl(addr) #define snd_hdac_aligned_mmio(bus) (bus)->aligned_mmio #else #define snd_hdac_aligned_mmio(bus) false #define snd_hdac_aligned_read(addr, mask) 0 #define snd_hdac_aligned_write(val, addr, mask) do {} while (0) #endif static inline void snd_hdac_reg_writeb(struct hdac_bus *bus, void __iomem *addr, u8 val) { if (snd_hdac_aligned_mmio(bus)) snd_hdac_aligned_write(val, addr, 0xff); else writeb(val, addr); } static inline void snd_hdac_reg_writew(struct hdac_bus *bus, void __iomem *addr, u16 val) { if (snd_hdac_aligned_mmio(bus)) snd_hdac_aligned_write(val, addr, 0xffff); else writew(val, addr); } static inline u8 snd_hdac_reg_readb(struct hdac_bus *bus, void __iomem *addr) { return snd_hdac_aligned_mmio(bus) ? snd_hdac_aligned_read(addr, 0xff) : readb(addr); } static inline u16 snd_hdac_reg_readw(struct hdac_bus *bus, void __iomem *addr) { return snd_hdac_aligned_mmio(bus) ? snd_hdac_aligned_read(addr, 0xffff) : readw(addr); } #define snd_hdac_reg_writel(bus, addr, val) writel(val, addr) #define snd_hdac_reg_readl(bus, addr) readl(addr) /* * macros for easy use */ #define _snd_hdac_chip_writeb(chip, reg, value) \ snd_hdac_reg_writeb(value, (chip)->remap_addr + (reg)) snd_hdac_reg_writeb(chip, (chip)->remap_addr + (reg), value) #define _snd_hdac_chip_readb(chip, reg) \ snd_hdac_reg_readb((chip)->remap_addr + (reg)) snd_hdac_reg_readb(chip, (chip)->remap_addr + (reg)) #define _snd_hdac_chip_writew(chip, reg, value) \ snd_hdac_reg_writew(value, (chip)->remap_addr + (reg)) snd_hdac_reg_writew(chip, (chip)->remap_addr + (reg), value) #define _snd_hdac_chip_readw(chip, reg) \ snd_hdac_reg_readw((chip)->remap_addr + (reg)) snd_hdac_reg_readw(chip, (chip)->remap_addr + (reg)) #define _snd_hdac_chip_writel(chip, reg, value) \ snd_hdac_reg_writel(value, (chip)->remap_addr + (reg)) snd_hdac_reg_writel(chip, (chip)->remap_addr + (reg), value) #define _snd_hdac_chip_readl(chip, reg) \ snd_hdac_reg_readl((chip)->remap_addr + (reg)) snd_hdac_reg_readl(chip, (chip)->remap_addr + (reg)) /* read/write a register, pass without AZX_REG_ prefix */ #define snd_hdac_chip_writel(chip, reg, value) \ Loading Loading @@ -543,17 +572,17 @@ int snd_hdac_get_stream_stripe_ctl(struct hdac_bus *bus, */ /* read/write a register, pass without AZX_REG_ prefix */ #define snd_hdac_stream_writel(dev, reg, value) \ snd_hdac_reg_writel(value, (dev)->sd_addr + AZX_REG_ ## reg) snd_hdac_reg_writel((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg, value) #define snd_hdac_stream_writew(dev, reg, value) \ snd_hdac_reg_writew(value, (dev)->sd_addr + AZX_REG_ ## reg) snd_hdac_reg_writew((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg, value) #define snd_hdac_stream_writeb(dev, reg, value) \ snd_hdac_reg_writeb(value, (dev)->sd_addr + AZX_REG_ ## reg) snd_hdac_reg_writeb((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg, value) #define snd_hdac_stream_readl(dev, reg) \ snd_hdac_reg_readl((dev)->sd_addr + AZX_REG_ ## reg) snd_hdac_reg_readl((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg) #define snd_hdac_stream_readw(dev, reg) \ snd_hdac_reg_readw((dev)->sd_addr + AZX_REG_ ## reg) snd_hdac_reg_readw((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg) #define snd_hdac_stream_readb(dev, reg) \ snd_hdac_reg_readb((dev)->sd_addr + AZX_REG_ ## reg) snd_hdac_reg_readb((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg) /* update a register, pass without AZX_REG_ prefix */ #define snd_hdac_stream_updatel(dev, reg, mask, val) \ Loading
sound/core/seq/seq_timer.c +9 −5 Original line number Diff line number Diff line Loading @@ -471,15 +471,19 @@ void snd_seq_info_timer_read(struct snd_info_entry *entry, q = queueptr(idx); if (q == NULL) continue; if ((tmr = q->timer) == NULL || (ti = tmr->timeri) == NULL) { queuefree(q); continue; } mutex_lock(&q->timer_mutex); tmr = q->timer; if (!tmr) goto unlock; ti = tmr->timeri; if (!ti) goto unlock; snd_iprintf(buffer, "Timer for queue %i : %s\n", q->queue, ti->timer->name); resolution = snd_timer_resolution(ti) * tmr->ticks; snd_iprintf(buffer, " Period time : %lu.%09lu\n", resolution / 1000000000, resolution % 1000000000); snd_iprintf(buffer, " Skew : %u / %u\n", tmr->skew, tmr->skew_base); unlock: mutex_unlock(&q->timer_mutex); queuefree(q); } } Loading
sound/firewire/dice/dice-extension.c +4 −1 Original line number Diff line number Diff line Loading @@ -159,10 +159,13 @@ int snd_dice_detect_extension_formats(struct snd_dice *dice) int j; for (j = i + 1; j < 9; ++j) { if (pointers[i * 2] == pointers[j * 2]) if (pointers[i * 2] == pointers[j * 2]) { // Fallback to limited functionality. err = -ENXIO; goto end; } } } section_addr = DICE_EXT_APP_SPACE + be32_to_cpu(pointers[12]) * 4; err = detect_stream_formats(dice, section_addr); Loading
sound/firewire/tascam/amdtp-tascam.c +3 −2 Original line number Diff line number Diff line Loading @@ -157,14 +157,15 @@ static void read_status_messages(struct amdtp_stream *s, if ((before ^ after) & mask) { struct snd_firewire_tascam_change *entry = &tscm->queue[tscm->push_pos]; unsigned long flag; spin_lock_irq(&tscm->lock); spin_lock_irqsave(&tscm->lock, flag); entry->index = index; entry->before = before; entry->after = after; if (++tscm->push_pos >= SND_TSCM_QUEUE_COUNT) tscm->push_pos = 0; spin_unlock_irq(&tscm->lock); spin_unlock_irqrestore(&tscm->lock, flag); wake_up(&tscm->hwdep_wait); } Loading
sound/pci/hda/hda_tegra.c +1 −0 Original line number Diff line number Diff line Loading @@ -395,6 +395,7 @@ static int hda_tegra_create(struct snd_card *card, return err; chip->bus.core.needs_damn_long_delay = 1; chip->bus.core.aligned_mmio = 1; err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); if (err < 0) { Loading