コード例 #1
0
ファイル: cardmi.c プロジェクト: 3sOx/asuswrt-merlin
int emu10k1_mpuin_open(struct emu10k1_card *card, struct midi_openinfo *openinfo)
{
	struct emu10k1_mpuin *card_mpuin = card->mpuin;

	DPF(2, "emu10k1_mpuin_open\n");

	if (!(card_mpuin->status & FLAGS_AVAILABLE))
		return -1;

	/* Copy open info and mark channel as in use */
	card_mpuin->openinfo = *openinfo;
	card_mpuin->status &= ~FLAGS_AVAILABLE;	/* clear */
	card_mpuin->status |= FLAGS_READY;	/* set */
	card_mpuin->status &= ~FLAGS_MIDM_STARTED;	/* clear */
	card_mpuin->firstmidiq = NULL;
	card_mpuin->lastmidiq = NULL;
	card_mpuin->qhead = 0;
	card_mpuin->qtail = 0;

	sblive_miStateInit(card_mpuin);

	emu10k1_mpu_reset(card);
	emu10k1_mpu_acquire(card);

	return 0;
}
コード例 #2
0
VOID
CloseCAMDPort( struct Hook*         hook,
	       struct EMU10kxBase*  EMU10kxBase,
	       struct CloseMessage* msg )
{
  struct DriverBase*  AHIsubBase = (struct DriverBase*) EMU10kxBase;
  struct EMU10kxData* dd         = EMU10kxBase->driverdatas[ msg->PortNum ];

  emu10k1_irq_disable( &dd->card, INTE_MIDIRXENABLE );
  emu10k1_irq_disable( &dd->card, INTE_MIDITXENABLE );
  emu10k1_mpu_reset( &dd->card );
  
  ObtainSemaphore( &EMU10kxBase->semaphore );
  dd->camd_transmitfunc = NULL;
  dd->camd_receivefunc  = NULL;
  ReleaseSemaphore( &EMU10kxBase->semaphore );
}
コード例 #3
0
ULONG
OpenCAMDPort( struct Hook*        hook,
	      struct EMU10kxBase* EMU10kxBase,
	      struct OpenMessage* msg )
{
  struct DriverBase*  AHIsubBase = (struct DriverBase*) EMU10kxBase;
  struct EMU10kxData* dd;

  BOOL in_use;

//  KPrintF( "OpenCAMDPort(%ld,%ld)\n", msg->PortNum, msg->V40Mode );

  if( msg->PortNum >= EMU10kxBase->cards_found ||
      EMU10kxBase->driverdatas[ msg->PortNum ] == NULL )
  {
    Req( "No valid EMU10kxData for CAMD port %ld.", msg->PortNum );
    return FALSE;
  }

  dd = EMU10kxBase->driverdatas[ msg->PortNum ];
  
  ObtainSemaphore( &EMU10kxBase->semaphore );
  in_use = ( dd->camd_transmitfunc != NULL ||
	     dd->camd_receivefunc != NULL );
  if( !in_use )
  {
    dd->camd_v40          = msg->V40Mode;
    dd->camd_transmitfunc = msg->TransmitFunc;
    dd->camd_receivefunc  = msg->ReceiveFunc;
  }
  ReleaseSemaphore( &EMU10kxBase->semaphore );

  if( in_use )
  {
    return FALSE;
  }

  emu10k1_irq_disable( &dd->card, INTE_MIDIRXENABLE );
  emu10k1_irq_disable( &dd->card, INTE_MIDITXENABLE );
  emu10k1_mpu_reset( &dd->card );
  emu10k1_irq_enable( &dd->card, INTE_MIDIRXENABLE );

  return TRUE;
}
コード例 #4
0
ファイル: main.c プロジェクト: OS2World/DRV-SBLiveOS2
static int __devinit midi_init(struct emu10k1_card *card)
{
	if ((card->mpuout = kmalloc(sizeof(struct emu10k1_mpuout), GFP_KERNEL))
	    == NULL) {
		printk(KERN_WARNING "emu10k1: Unable to allocate emu10k1_mpuout: out of memory\n");
		return CTSTATUS_ERROR;
	}

	memset(card->mpuout, 0, sizeof(struct emu10k1_mpuout));

	card->mpuout->intr = 1;
	card->mpuout->status = FLAGS_AVAILABLE;
	card->mpuout->state = CARDMIDIOUT_STATE_DEFAULT;

	tasklet_init(&card->mpuout->tasklet, emu10k1_mpuout_bh, (unsigned long) card);

	spin_lock_init(&card->mpuout->lock);

	if ((card->mpuin = kmalloc(sizeof(struct emu10k1_mpuin), GFP_KERNEL)) == NULL) {
		kfree(card->mpuout);
		printk(KERN_WARNING "emu10k1: Unable to allocate emu10k1_mpuin: out of memory\n");
		return CTSTATUS_ERROR;
	}

	memset(card->mpuin, 0, sizeof(struct emu10k1_mpuin));

	card->mpuin->status = FLAGS_AVAILABLE;

	tasklet_init(&card->mpuin->tasklet, emu10k1_mpuin_bh, (unsigned long) card->mpuin);

	spin_lock_init(&card->mpuin->lock);

	/* Reset the MPU port */
	if (emu10k1_mpu_reset(card) != CTSTATUS_SUCCESS) {
		ERROR();
		return CTSTATUS_ERROR;
	}

	return CTSTATUS_SUCCESS;
}