diff options
Diffstat (limited to 'sound/core')
-rw-r--r-- | sound/core/memalloc.c | 68 |
1 files changed, 39 insertions, 29 deletions
diff --git a/sound/core/memalloc.c b/sound/core/memalloc.c index f057430db0d0..9b5656d8bcca 100644 --- a/sound/core/memalloc.c +++ b/sound/core/memalloc.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/pci.h> | 27 | #include <linux/pci.h> |
28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
29 | #include <linux/mm.h> | 29 | #include <linux/mm.h> |
30 | #include <linux/seq_file.h> | ||
30 | #include <asm/uaccess.h> | 31 | #include <asm/uaccess.h> |
31 | #include <linux/dma-mapping.h> | 32 | #include <linux/dma-mapping.h> |
32 | #include <linux/moduleparam.h> | 33 | #include <linux/moduleparam.h> |
@@ -481,53 +482,54 @@ static void free_all_reserved_pages(void) | |||
481 | #define SND_MEM_PROC_FILE "driver/snd-page-alloc" | 482 | #define SND_MEM_PROC_FILE "driver/snd-page-alloc" |
482 | static struct proc_dir_entry *snd_mem_proc; | 483 | static struct proc_dir_entry *snd_mem_proc; |
483 | 484 | ||
484 | static int snd_mem_proc_read(char *page, char **start, off_t off, | 485 | static int snd_mem_proc_read(struct seq_file *seq, void *offset) |
485 | int count, int *eof, void *data) | ||
486 | { | 486 | { |
487 | int len = 0; | ||
488 | long pages = snd_allocated_pages >> (PAGE_SHIFT-12); | 487 | long pages = snd_allocated_pages >> (PAGE_SHIFT-12); |
489 | struct snd_mem_list *mem; | 488 | struct snd_mem_list *mem; |
490 | int devno; | 489 | int devno; |
491 | static char *types[] = { "UNKNOWN", "CONT", "DEV", "DEV-SG", "SBUS" }; | 490 | static char *types[] = { "UNKNOWN", "CONT", "DEV", "DEV-SG", "SBUS" }; |
492 | 491 | ||
493 | mutex_lock(&list_mutex); | 492 | mutex_lock(&list_mutex); |
494 | len += snprintf(page + len, count - len, | 493 | seq_printf(seq, "pages : %li bytes (%li pages per %likB)\n", |
495 | "pages : %li bytes (%li pages per %likB)\n", | 494 | pages * PAGE_SIZE, pages, PAGE_SIZE / 1024); |
496 | pages * PAGE_SIZE, pages, PAGE_SIZE / 1024); | ||
497 | devno = 0; | 495 | devno = 0; |
498 | list_for_each_entry(mem, &mem_list_head, list) { | 496 | list_for_each_entry(mem, &mem_list_head, list) { |
499 | devno++; | 497 | devno++; |
500 | len += snprintf(page + len, count - len, | 498 | seq_printf(seq, "buffer %d : ID %08x : type %s\n", |
501 | "buffer %d : ID %08x : type %s\n", | 499 | devno, mem->id, types[mem->buffer.dev.type]); |
502 | devno, mem->id, types[mem->buffer.dev.type]); | 500 | seq_printf(seq, " addr = 0x%lx, size = %d bytes\n", |
503 | len += snprintf(page + len, count - len, | 501 | (unsigned long)mem->buffer.addr, |
504 | " addr = 0x%lx, size = %d bytes\n", | 502 | (int)mem->buffer.bytes); |
505 | (unsigned long)mem->buffer.addr, (int)mem->buffer.bytes); | ||
506 | } | 503 | } |
507 | mutex_unlock(&list_mutex); | 504 | mutex_unlock(&list_mutex); |
508 | return len; | 505 | return 0; |
506 | } | ||
507 | |||
508 | static int snd_mem_proc_open(struct inode *inode, struct file *file) | ||
509 | { | ||
510 | return single_open(file, snd_mem_proc_read, NULL); | ||
509 | } | 511 | } |
510 | 512 | ||
511 | /* FIXME: for pci only - other bus? */ | 513 | /* FIXME: for pci only - other bus? */ |
512 | #ifdef CONFIG_PCI | 514 | #ifdef CONFIG_PCI |
513 | #define gettoken(bufp) strsep(bufp, " \t\n") | 515 | #define gettoken(bufp) strsep(bufp, " \t\n") |
514 | 516 | ||
515 | static int snd_mem_proc_write(struct file *file, const char __user *buffer, | 517 | static ssize_t snd_mem_proc_write(struct file *file, const char __user * buffer, |
516 | unsigned long count, void *data) | 518 | size_t count, loff_t * ppos) |
517 | { | 519 | { |
518 | char buf[128]; | 520 | char buf[128]; |
519 | char *token, *p; | 521 | char *token, *p; |
520 | 522 | ||
521 | if (count > ARRAY_SIZE(buf) - 1) | 523 | if (count > sizeof(buf) - 1) |
522 | count = ARRAY_SIZE(buf) - 1; | 524 | return -EINVAL; |
523 | if (copy_from_user(buf, buffer, count)) | 525 | if (copy_from_user(buf, buffer, count)) |
524 | return -EFAULT; | 526 | return -EFAULT; |
525 | buf[ARRAY_SIZE(buf) - 1] = '\0'; | 527 | buf[count] = '\0'; |
526 | 528 | ||
527 | p = buf; | 529 | p = buf; |
528 | token = gettoken(&p); | 530 | token = gettoken(&p); |
529 | if (! token || *token == '#') | 531 | if (! token || *token == '#') |
530 | return (int)count; | 532 | return count; |
531 | if (strcmp(token, "add") == 0) { | 533 | if (strcmp(token, "add") == 0) { |
532 | char *endp; | 534 | char *endp; |
533 | int vendor, device, size, buffers; | 535 | int vendor, device, size, buffers; |
@@ -548,7 +550,7 @@ static int snd_mem_proc_write(struct file *file, const char __user *buffer, | |||
548 | (buffers = simple_strtol(token, NULL, 0)) <= 0 || | 550 | (buffers = simple_strtol(token, NULL, 0)) <= 0 || |
549 | buffers > 4) { | 551 | buffers > 4) { |
550 | printk(KERN_ERR "snd-page-alloc: invalid proc write format\n"); | 552 | printk(KERN_ERR "snd-page-alloc: invalid proc write format\n"); |
551 | return (int)count; | 553 | return count; |
552 | } | 554 | } |
553 | vendor &= 0xffff; | 555 | vendor &= 0xffff; |
554 | device &= 0xffff; | 556 | device &= 0xffff; |
@@ -560,7 +562,7 @@ static int snd_mem_proc_write(struct file *file, const char __user *buffer, | |||
560 | if (pci_set_dma_mask(pci, mask) < 0 || | 562 | if (pci_set_dma_mask(pci, mask) < 0 || |
561 | pci_set_consistent_dma_mask(pci, mask) < 0) { | 563 | pci_set_consistent_dma_mask(pci, mask) < 0) { |
562 | printk(KERN_ERR "snd-page-alloc: cannot set DMA mask %lx for pci %04x:%04x\n", mask, vendor, device); | 564 | printk(KERN_ERR "snd-page-alloc: cannot set DMA mask %lx for pci %04x:%04x\n", mask, vendor, device); |
563 | return (int)count; | 565 | return count; |
564 | } | 566 | } |
565 | } | 567 | } |
566 | for (i = 0; i < buffers; i++) { | 568 | for (i = 0; i < buffers; i++) { |
@@ -570,7 +572,7 @@ static int snd_mem_proc_write(struct file *file, const char __user *buffer, | |||
570 | size, &dmab) < 0) { | 572 | size, &dmab) < 0) { |
571 | printk(KERN_ERR "snd-page-alloc: cannot allocate buffer pages (size = %d)\n", size); | 573 | printk(KERN_ERR "snd-page-alloc: cannot allocate buffer pages (size = %d)\n", size); |
572 | pci_dev_put(pci); | 574 | pci_dev_put(pci); |
573 | return (int)count; | 575 | return count; |
574 | } | 576 | } |
575 | snd_dma_reserve_buf(&dmab, snd_dma_pci_buf_id(pci)); | 577 | snd_dma_reserve_buf(&dmab, snd_dma_pci_buf_id(pci)); |
576 | } | 578 | } |
@@ -596,9 +598,21 @@ static int snd_mem_proc_write(struct file *file, const char __user *buffer, | |||
596 | free_all_reserved_pages(); | 598 | free_all_reserved_pages(); |
597 | else | 599 | else |
598 | printk(KERN_ERR "snd-page-alloc: invalid proc cmd\n"); | 600 | printk(KERN_ERR "snd-page-alloc: invalid proc cmd\n"); |
599 | return (int)count; | 601 | return count; |
600 | } | 602 | } |
601 | #endif /* CONFIG_PCI */ | 603 | #endif /* CONFIG_PCI */ |
604 | |||
605 | static const struct file_operations snd_mem_proc_fops = { | ||
606 | .owner = THIS_MODULE, | ||
607 | .open = snd_mem_proc_open, | ||
608 | .read = seq_read, | ||
609 | #ifdef CONFIG_PCI | ||
610 | .write = snd_mem_proc_write, | ||
611 | #endif | ||
612 | .llseek = seq_lseek, | ||
613 | .release = single_release, | ||
614 | }; | ||
615 | |||
602 | #endif /* CONFIG_PROC_FS */ | 616 | #endif /* CONFIG_PROC_FS */ |
603 | 617 | ||
604 | /* | 618 | /* |
@@ -609,12 +623,8 @@ static int __init snd_mem_init(void) | |||
609 | { | 623 | { |
610 | #ifdef CONFIG_PROC_FS | 624 | #ifdef CONFIG_PROC_FS |
611 | snd_mem_proc = create_proc_entry(SND_MEM_PROC_FILE, 0644, NULL); | 625 | snd_mem_proc = create_proc_entry(SND_MEM_PROC_FILE, 0644, NULL); |
612 | if (snd_mem_proc) { | 626 | if (snd_mem_proc) |
613 | snd_mem_proc->read_proc = snd_mem_proc_read; | 627 | snd_mem_proc->proc_fops = &snd_mem_proc_fops; |
614 | #ifdef CONFIG_PCI | ||
615 | snd_mem_proc->write_proc = snd_mem_proc_write; | ||
616 | #endif | ||
617 | } | ||
618 | #endif | 628 | #endif |
619 | return 0; | 629 | return 0; |
620 | } | 630 | } |