Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 148358
b: refs/heads/master
c: 8a4259b
h: refs/heads/master
v: v3
  • Loading branch information
Takashi Iwai committed Jun 2, 2009
1 parent 53fa581 commit cba4598
Show file tree
Hide file tree
Showing 6 changed files with 15 additions and 18 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 67fbf880631bb4493ad8d23f25562abdf09dc01d
refs/heads/master: 8a4259bf89d23bfd58d87e275ef6da29cea6b3c5
11 changes: 0 additions & 11 deletions trunk/sound/pci/ctxfi/ctatc.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,6 @@ atc_pcm_release_resources(struct ct_atc *atc, struct ct_atc_pcm *apcm);

static int ct_map_audio_buffer(struct ct_atc *atc, struct ct_atc_pcm *apcm)
{
unsigned long flags;
struct snd_pcm_runtime *runtime;
struct ct_vm *vm;

Expand All @@ -129,9 +128,7 @@ static int ct_map_audio_buffer(struct ct_atc *atc, struct ct_atc_pcm *apcm)
runtime = apcm->substream->runtime;
vm = atc->vm;

spin_lock_irqsave(&atc->vm_lock, flags);
apcm->vm_block = vm->map(vm, runtime->dma_area, runtime->dma_bytes);
spin_unlock_irqrestore(&atc->vm_lock, flags);

if (NULL == apcm->vm_block)
return -ENOENT;
Expand All @@ -141,17 +138,14 @@ static int ct_map_audio_buffer(struct ct_atc *atc, struct ct_atc_pcm *apcm)

static void ct_unmap_audio_buffer(struct ct_atc *atc, struct ct_atc_pcm *apcm)
{
unsigned long flags;
struct ct_vm *vm;

if (NULL == apcm->vm_block)
return;

vm = atc->vm;

spin_lock_irqsave(&atc->vm_lock, flags);
vm->unmap(vm, apcm->vm_block);
spin_unlock_irqrestore(&atc->vm_lock, flags);

apcm->vm_block = NULL;
}
Expand All @@ -161,18 +155,14 @@ static unsigned long atc_get_ptp_phys(struct ct_atc *atc, int index)
struct ct_vm *vm;
void *kvirt_addr;
unsigned long phys_addr;
unsigned long flags;

spin_lock_irqsave(&atc->vm_lock, flags);
vm = atc->vm;
kvirt_addr = vm->get_ptp_virt(vm, index);
if (kvirt_addr == NULL)
phys_addr = (~0UL);
else
phys_addr = virt_to_phys(kvirt_addr);

spin_unlock_irqrestore(&atc->vm_lock, flags);

return phys_addr;
}

Expand Down Expand Up @@ -1562,7 +1552,6 @@ int ct_atc_create(struct snd_card *card, struct pci_dev *pci,
atc_set_ops(atc);

spin_lock_init(&atc->atc_lock);
spin_lock_init(&atc->vm_lock);

/* Find card model */
err = atc_identify_card(atc);
Expand Down
1 change: 0 additions & 1 deletion trunk/sound/pci/ctxfi/ctatc.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,6 @@ struct ct_atc {
unsigned long (*get_ptp_phys)(struct ct_atc *atc, int index);

spinlock_t atc_lock;
spinlock_t vm_lock;

int (*pcm_playback_prepare)(struct ct_atc *atc,
struct ct_atc_pcm *apcm);
Expand Down
14 changes: 11 additions & 3 deletions trunk/sound/pci/ctxfi/ctvmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,25 +35,27 @@ get_vm_block(struct ct_vm *vm, unsigned int size)
struct ct_vm_block *block = NULL, *entry = NULL;
struct list_head *pos = NULL;

mutex_lock(&vm->lock);
list_for_each(pos, &vm->unused) {
entry = list_entry(pos, struct ct_vm_block, list);
if (entry->size >= size)
break; /* found a block that is big enough */
}
if (pos == &vm->unused)
return NULL;
goto out;

if (entry->size == size) {
/* Move the vm node from unused list to used list directly */
list_del(&entry->list);
list_add(&entry->list, &vm->used);
vm->size -= size;
return entry;
block = entry;
goto out;
}

block = kzalloc(sizeof(*block), GFP_KERNEL);
if (NULL == block)
return NULL;
goto out;

block->addr = entry->addr;
block->size = size;
Expand All @@ -62,6 +64,8 @@ get_vm_block(struct ct_vm *vm, unsigned int size)
entry->size -= size;
vm->size -= size;

out:
mutex_unlock(&vm->lock);
return block;
}

Expand All @@ -70,6 +74,7 @@ static void put_vm_block(struct ct_vm *vm, struct ct_vm_block *block)
struct ct_vm_block *entry = NULL, *pre_ent = NULL;
struct list_head *pos = NULL, *pre = NULL;

mutex_lock(&vm->lock);
list_del(&block->list);
vm->size += block->size;

Expand Down Expand Up @@ -106,6 +111,7 @@ static void put_vm_block(struct ct_vm *vm, struct ct_vm_block *block)
pos = pre;
pre = pos->prev;
}
mutex_unlock(&vm->lock);
}

/* Map host addr (kmalloced/vmalloced) to device logical addr. */
Expand Down Expand Up @@ -191,6 +197,8 @@ int ct_vm_create(struct ct_vm **rvm)
if (NULL == vm)
return -ENOMEM;

mutex_init(&vm->lock);

/* Allocate page table pages */
for (i = 0; i < CT_PTP_NUM; i++) {
vm->ptp[i] = kmalloc(PAGE_SIZE, GFP_KERNEL);
Expand Down
3 changes: 2 additions & 1 deletion trunk/sound/pci/ctxfi/ctvmem.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

#define CT_PTP_NUM 1 /* num of device page table pages */

#include <linux/spinlock.h>
#include <linux/mutex.h>
#include <linux/list.h>

struct ct_vm_block {
Expand All @@ -35,6 +35,7 @@ struct ct_vm {
unsigned int size; /* Available addr space in bytes */
struct list_head unused; /* List of unused blocks */
struct list_head used; /* List of used blocks */
struct mutex lock;

/* Map host addr (kmalloced/vmalloced) to device logical addr. */
struct ct_vm_block *(*map)(struct ct_vm *, void *host_addr, int size);
Expand Down
2 changes: 1 addition & 1 deletion trunk/sound/pci/ctxfi/xfi.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

MODULE_AUTHOR("Creative Technology Ltd");
MODULE_DESCRIPTION("X-Fi driver version 1.03");
MODULE_LICENSE("GPL v2");
MODULE_LICENSE("GPLv2");
MODULE_SUPPORTED_DEVICE("{{Creative Labs, Sound Blaster X-Fi}");

static unsigned int reference_rate = 48000;
Expand Down

0 comments on commit cba4598

Please sign in to comment.