~ubuntu-branches/ubuntu/trusty/linux-armadaxp/trusty

« back to all changes in this revision

Viewing changes to sound/usb/pcm.c

  • Committer: Package Import Robot
  • Author(s): Michael Casadevall, Bryan Wu, Dann Frazier, Michael Casadeall
  • Date: 2012-03-10 15:00:54 UTC
  • mfrom: (1.1.1)
  • Revision ID: package-import@ubuntu.com-20120310150054-flugb39zon8vvgwe
Tags: 3.2.0-1600.1
[ Bryan Wu ]
* UBUNTU: import debian/debian.env and debian.armadaxp

[ Dann Frazier ]
* ARM: Armada XP: remove trailing '/' in dirnames in mvRules.mk

[ Michael Casadeall ]
* tools: add some tools for Marvell Armada XP processor
* kernel: timer tick hacking from Marvell
* kernel: Sheeva Errata: add delay on Sheeva when powering down
* net: add Marvell NFP netfilter
* net: socket and skb modifications made by Marvell
* miscdevice: add minor IDs for some Marvell Armada drivers
* fs: introduce memory pool for splice()
* video: EDID detection updates from Marvell Armada XP patchset
* video: backlight: add Marvell Dove LCD backlight driver
* video: display: add THS8200 display driver
* video: framebuffer: add Marvell Dove and Armada XP processor onchip LCD controller driver
* usbtest: add Interrupt transfer testing by Marvell Armada XP code
* usb: ehci: add support for Marvell EHCI controler
* tty/serial: 8250: add support for Marvell Armada XP processor and DeviceTree work
* rtc: add support for Marvell Armada XP onchip RTC controller
* net: pppoe: add Marvell ethernet NFP hook in PPPoE networking driver
* mtd: nand: add support for Marvell Armada XP Nand Flash Controller
* mtd: maps: add Marvell Armada XP specific map driver
* mmc: add support for Marvell Armada XP MMC/SD host controller
* i2c: add support for Marvell Armada XP onchip i2c bus controller
* hwmon: add Kconfig option for Armada XP onchip thermal sensor driver
* dmaengine: add Net DMA support for splice and update Marvell XOR DMA engine driver
* ata: add support for Marvell Armada XP SATA controller and update some quirks
* ARM: add Marvell Armada XP machine to mach-types
* ARM: oprofile: add support for Marvell PJ4B core
* ARM: mm: more ARMv6 switches for Marvell Armada XP
* ARM: remove static declaration to allow compilation
* ARM: alignment access fault trick
* ARM: mm: skip some fault fixing when run on NONE SMP ARMv6 mode during early abort event
* ARM: mm: add Marvell Sheeva CPU Architecture for PJ4B
* ARM: introduce optimized copy operation for Marvell Armada XP
* ARM: SAUCE: hardware breakpoint trick for Marvell Armada XP
* ARM: big endian and little endian tricks for Marvell Armada XP
* ARM: SAUCE: Add Marvell Armada XP build rules to arch/arm/kernel/Makefile
* ARM: vfp: add special handling for Marvell Armada XP
* ARM: add support for Marvell U-Boot
* ARM: add mv_controller_num for ARM PCI drivers
* ARM: add support for local PMUs, general SMP tweaks and cache flushing
* ARM: add Marvell device identifies in glue-proc.h
* ARM: add IPC driver support for Marvell platforms
* ARM: add DMA mapping for Marvell platforms
* ARM: add Sheeva errata and PJ4B code for booting
* ARM: update Kconfig and Makefile to include Marvell Armada XP platforms
* ARM: Armada XP: import LSP from Marvell for Armada XP 3.2 kernel enablement

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
#include "card.h"
29
29
#include "quirks.h"
30
30
#include "debug.h"
31
 
#include "urb.h"
 
31
#include "endpoint.h"
32
32
#include "helper.h"
33
33
#include "pcm.h"
34
34
#include "clock.h"
35
35
#include "power.h"
36
36
 
 
37
/* return the estimated delay based on USB frame counters */
 
38
snd_pcm_uframes_t snd_usb_pcm_delay(struct snd_usb_substream *subs,
 
39
                                    unsigned int rate)
 
40
{
 
41
        int current_frame_number;
 
42
        int frame_diff;
 
43
        int est_delay;
 
44
 
 
45
        current_frame_number = usb_get_current_frame_number(subs->dev);
 
46
        /*
 
47
         * HCD implementations use different widths, use lower 8 bits.
 
48
         * The delay will be managed up to 256ms, which is more than
 
49
         * enough
 
50
         */
 
51
        frame_diff = (current_frame_number - subs->last_frame_number) & 0xff;
 
52
 
 
53
        /* Approximation based on number of samples per USB frame (ms),
 
54
           some truncation for 44.1 but the estimate is good enough */
 
55
        est_delay =  subs->last_delay - (frame_diff * rate / 1000);
 
56
        if (est_delay < 0)
 
57
                est_delay = 0;
 
58
        return est_delay;
 
59
}
 
60
 
37
61
/*
38
62
 * return the current pcm pointer.  just based on the hwptr_done value.
39
63
 */
45
69
        subs = (struct snd_usb_substream *)substream->runtime->private_data;
46
70
        spin_lock(&subs->lock);
47
71
        hwptr_done = subs->hwptr_done;
 
72
        substream->runtime->delay = snd_usb_pcm_delay(subs,
 
73
                                                substream->runtime->rate);
48
74
        spin_unlock(&subs->lock);
49
75
        return hwptr_done / (substream->runtime->frame_bits >> 3);
50
76
}
126
152
        if ((err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC_SET_CUR,
127
153
                                   USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT,
128
154
                                   UAC_EP_CS_ATTR_PITCH_CONTROL << 8, ep,
129
 
                                   data, sizeof(data), 1000)) < 0) {
 
155
                                   data, sizeof(data))) < 0) {
130
156
                snd_printk(KERN_ERR "%d:%d:%d: cannot set enable PITCH\n",
131
157
                           dev->devnum, iface, ep);
132
158
                return err;
150
176
        if ((err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC2_CS_CUR,
151
177
                                   USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_OUT,
152
178
                                   UAC2_EP_CS_PITCH << 8, 0,
153
 
                                   data, sizeof(data), 1000)) < 0) {
 
179
                                   data, sizeof(data))) < 0) {
154
180
                snd_printk(KERN_ERR "%d:%d:%d: cannot set enable PITCH (v2)\n",
155
181
                           dev->devnum, iface, fmt->altsetting);
156
182
                return err;
417
443
        subs->hwptr_done = 0;
418
444
        subs->transfer_done = 0;
419
445
        subs->phase = 0;
 
446
        subs->last_delay = 0;
 
447
        subs->last_frame_number = 0;
420
448
        runtime->delay = 0;
421
449
 
422
450
        return snd_usb_substream_prepare(subs, runtime);