Ignore:
Timestamp:
Jul 26, 2007, 7:21:09 AM (18 years ago)
Author:
Brendan Oakley
Message:

Merged to Alsa 0.9.1

File:
1 edited

Legend:

Unmodified
Added
Removed
  • GPL/branches/alsa-resync1/alsa-kernel/drivers/mtpav.c

    r215 r224  
    5252
    5353#include <sound/driver.h>
    54 #include <asm/io.h>
    5554#include <linux/init.h>
     55#include <linux/interrupt.h>
    5656#include <linux/slab.h>
    5757#include <linux/ioport.h>
     
    6161#include <sound/rawmidi.h>
    6262#include <linux/delay.h>
     63
     64#include <asm/io.h>
    6365
    6466/*
     
    134136        u8 hwport;
    135137        u8 mode;
     138        u8 running_status;
    136139        snd_rawmidi_substream_t *input;
    137140        snd_rawmidi_substream_t *output;
     
    204207static int translate_hwport_to_subdevice(mtpav_t *chip, int hwport)
    205208{
    206         int port;
     209        int p;
    207210        if (hwport <= 0x00) /* all ports */
    208211                return chip->num_ports + MTPAV_PIDX_BROADCAST;
    209212        else if (hwport <= 0x08) { /* single port */
    210                 port = hwport - 1;
    211                 if (port >= chip->num_ports)
    212                         port = 0;
    213                 return port;
     213                p = hwport - 1;
     214                if (p >= chip->num_ports)
     215                        p = 0;
     216                return p;
    214217        } else if (hwport <= 0x10) { /* remote port */
    215                 port = hwport - 0x09 + chip->num_ports;
    216                 if (port >= chip->num_ports * 2)
    217                         port = chip->num_ports;
    218                 return port;
     218                p = hwport - 0x09 + chip->num_ports;
     219                if (p >= chip->num_ports * 2)
     220                        p = chip->num_ports;
     221                return p;
    219222        } else if (hwport == 0x11)  /* computer port */
    220223                return chip->num_ports + MTPAV_PIDX_COMPUTER;
     
    300303        u8 outbyte;
    301304
     305        // Get the outbyte first, so we can emulate running status if
     306        // necessary
     307        if (snd_rawmidi_transmit(substream, &outbyte, 1) != 1)
     308                return;
     309
    302310        // send port change command if necessary
    303311
     
    309317                //snd_printk("new outport: 0x%x\n", (unsigned int) port->hwport);
    310318
     319                if (!(outbyte & 0x80) && port->running_status)
     320                        snd_mtpav_send_byte(mtp_card, port->running_status);
    311321        }
    312322
    313323        // send data
    314324
    315         while (snd_rawmidi_transmit(substream, &outbyte, 1) == 1)
     325        do {
     326                if (outbyte & 0x80)
     327                        port->running_status = outbyte;
     328               
    316329                snd_mtpav_send_byte(mtp_card, outbyte);
     330        } while (snd_rawmidi_transmit(substream, &outbyte, 1) == 1);
    317331}
    318332
     
    334348static void snd_mtpav_portscan(mtpav_t *chip)   // put mtp into smart routing mode
    335349{
    336         u8 port;
    337 
    338         for (port = 0; port < 8; port++) {
     350        u8 p;
     351
     352        for (p = 0; p < 8; p++) {
    339353                snd_mtpav_send_byte(chip, 0xf5);
    340                 snd_mtpav_send_byte(chip, port);
     354                snd_mtpav_send_byte(chip, p);
    341355                snd_mtpav_send_byte(chip, 0xfe);
    342356        }
     
    349363{
    350364        unsigned long flags;
    351         mtpav_port_t *port = &mtp_card->ports[substream->number];
     365        mtpav_port_t *portp = &mtp_card->ports[substream->number];
    352366
    353367        //printk("mtpav port: %d opened\n", (int) substream->number);
    354368        spin_lock_irqsave(&mtp_card->spinlock, flags);
    355         port->mode |= MTPAV_MODE_INPUT_OPENED;
    356         port->input = substream;
     369        portp->mode |= MTPAV_MODE_INPUT_OPENED;
     370        portp->input = substream;
    357371        if (mtp_card->share_irq++ == 0)
    358372                snd_mtpav_mputreg(mtp_card, CREG, (SIGC_INTEN | SIGC_WRITE));   // enable pport interrupts
     
    367381{
    368382        unsigned long flags;
    369         mtpav_port_t *port = &mtp_card->ports[substream->number];
    370 
    371         //printk("mtpav port: %d closed\n", (int) port);
     383        mtpav_port_t *portp = &mtp_card->ports[substream->number];
     384
     385        //printk("mtpav port: %d closed\n", (int) portp);
    372386
    373387        spin_lock_irqsave(&mtp_card->spinlock, flags);
    374388
    375         port->mode &= (~MTPAV_MODE_INPUT_OPENED);
    376         port->input = NULL;
     389        portp->mode &= (~MTPAV_MODE_INPUT_OPENED);
     390        portp->input = NULL;
    377391        if (--mtp_card->share_irq == 0)
    378392                snd_mtpav_mputreg(mtp_card, CREG, 0);   // disable pport interrupts
     
    388402{
    389403        unsigned long flags;
    390         mtpav_port_t *port = &mtp_card->ports[substream->number];
     404        mtpav_port_t *portp = &mtp_card->ports[substream->number];
    391405
    392406        spin_lock_irqsave(&mtp_card->spinlock, flags);
    393407        if (up)
    394                 port->mode |= MTPAV_MODE_INPUT_TRIGGERED;
     408                portp->mode |= MTPAV_MODE_INPUT_TRIGGERED;
    395409        else
    396                 port->mode &= ~MTPAV_MODE_INPUT_TRIGGERED;
     410                portp->mode &= ~MTPAV_MODE_INPUT_TRIGGERED;
    397411        spin_unlock_irqrestore(&mtp_card->spinlock, flags);
    398412
     
    415429        /* process each port */
    416430        for (p = 0; p <= chip->num_ports * 2 + MTPAV_PIDX_BROADCAST; p++) {
    417                 mtpav_port_t *port = &mtp_card->ports[p];
    418                 if ((port->mode & MTPAV_MODE_OUTPUT_TRIGGERED) && port->output)
    419                         snd_mtpav_output_port_write(port, port->output);
     431                mtpav_port_t *portp = &mtp_card->ports[p];
     432                if ((portp->mode & MTPAV_MODE_OUTPUT_TRIGGERED) && portp->output)
     433                        snd_mtpav_output_port_write(portp, portp->output);
    420434        }
    421435        spin_unlock(&chip->spinlock);
     
    425439static void snd_mtpav_add_output_timer(mtpav_t *chip)
    426440{
     441        init_timer(&chip->timer);
    427442        chip->timer.function = snd_mtpav_output_timer;
    428443        chip->timer.data = (unsigned long) mtp_card;
     
    443458{
    444459        unsigned long flags;
    445         mtpav_port_t *port = &mtp_card->ports[substream->number];
     460        mtpav_port_t *portp = &mtp_card->ports[substream->number];
    446461
    447462        spin_lock_irqsave(&mtp_card->spinlock, flags);
    448         port->mode |= MTPAV_MODE_OUTPUT_OPENED;
    449         port->output = substream;
     463        portp->mode |= MTPAV_MODE_OUTPUT_OPENED;
     464        portp->output = substream;
    450465        spin_unlock_irqrestore(&mtp_card->spinlock, flags);
    451466        return 0;
     
    458473{
    459474        unsigned long flags;
    460         mtpav_port_t *port = &mtp_card->ports[substream->number];
     475        mtpav_port_t *portp = &mtp_card->ports[substream->number];
    461476
    462477        spin_lock_irqsave(&mtp_card->spinlock, flags);
    463         port->mode &= (~MTPAV_MODE_OUTPUT_OPENED);
    464         port->output = NULL;
     478        portp->mode &= (~MTPAV_MODE_OUTPUT_OPENED);
     479        portp->output = NULL;
    465480        spin_unlock_irqrestore(&mtp_card->spinlock, flags);
    466481        return 0;
     
    473488{
    474489        unsigned long flags;
    475         mtpav_port_t *port = &mtp_card->ports[substream->number];
     490        mtpav_port_t *portp = &mtp_card->ports[substream->number];
    476491
    477492        spin_lock_irqsave(&mtp_card->spinlock, flags);
    478493        if (up) {
    479                 if (! (port->mode  & MTPAV_MODE_OUTPUT_TRIGGERED)) {
     494                if (! (portp->mode  & MTPAV_MODE_OUTPUT_TRIGGERED)) {
    480495                        if (mtp_card->istimer++ == 0)
    481496                                snd_mtpav_add_output_timer(mtp_card);
    482                         port->mode |= MTPAV_MODE_OUTPUT_TRIGGERED;
     497                        portp->mode |= MTPAV_MODE_OUTPUT_TRIGGERED;
    483498                }
    484499        } else {
    485                 port->mode &= ~MTPAV_MODE_OUTPUT_TRIGGERED;
     500                portp->mode &= ~MTPAV_MODE_OUTPUT_TRIGGERED;
    486501                if (--mtp_card->istimer == 0)
    487502                        snd_mtpav_remove_output_timer(mtp_card);
     
    499514static void snd_mtpav_inmidi_process(mtpav_t *mcrd, u8 inbyte)
    500515{
    501         mtpav_port_t *port;
    502 
    503         if (mcrd->inmidiport > mcrd->num_ports * 2 + MTPAV_PIDX_BROADCAST)
     516        mtpav_port_t *portp;
     517
     518        if ((int)mcrd->inmidiport > mcrd->num_ports * 2 + MTPAV_PIDX_BROADCAST)
    504519                return;
    505520
    506         port = &mcrd->ports[mcrd->inmidiport];
    507         if (port->mode & MTPAV_MODE_INPUT_TRIGGERED) {
     521        portp = &mcrd->ports[mcrd->inmidiport];
     522        if (portp->mode & MTPAV_MODE_INPUT_TRIGGERED) {
    508523                spin_unlock(&mcrd->spinlock);
    509                 snd_rawmidi_receive(port->input, &inbyte, 1);
     524                snd_rawmidi_receive(portp->input, &inbyte, 1);
    510525                spin_lock(&mcrd->spinlock);
    511526        }
     
    681696static mtpav_t *new_mtpav(void)
    682697{
    683         mtpav_t *ncrd = (mtpav_t *) snd_kcalloc(sizeof(mtpav_t), GFP_KERNEL);
     698        mtpav_t *ncrd = (mtpav_t *) snd_magic_kcalloc(mtpav_t, 0, GFP_KERNEL);
    684699        if (ncrd != NULL) {
    685700                spin_lock_init(&ncrd->spinlock);
     
    714729                kfree_nocheck(crd->res_port);
    715730        }
    716         if (crd != NULL)
    717                 kfree(crd);
     731        snd_magic_kfree(crd);
    718732}
    719733
     
    790804#ifndef MODULE
    791805
    792 /* format is: snd-mtpav=snd_enable,index,id,
     806/* format is: snd-mtpav=enable,index,id,
    793807                        port,irq,hwports */
    794808
Note: See TracChangeset for help on using the changeset viewer.