/*
 *  This function will fail if more that 4 baud rates have been selected
 *  at any time since the OS started. It needs to be fixed. FIXME
 */
static unsigned
char m8xx_get_brg_clk(int baud)
{
    int i;

    /* first try to find a BRG that is already at the right speed */
    for ( i = 0; i < 4; i++ ) {
        if ( brg_spd[i] == baud ) {
            break;
        }
    }

    if ( i == 4 ) { /* I guess we didn't find one */
        for ( i = 0; i < 4; i++ ) {
            if ( brg_used[i] == 0 ) {
                break;
            }
        }
    }
    if (i != 4) {
        brg_used[i]++;
        brg_spd[i]=baud;
        switch (i) {
        case 0:
            m8xx.brgc1 = M8xx_BRG_RST;
            m8xx.brgc1 = m8xx_get_brg_cd(baud);
            break;
        case 1:
            m8xx.brgc2 = M8xx_BRG_RST;
            m8xx.brgc2 = m8xx_get_brg_cd(baud);
            break;
        case 2:
            m8xx.brgc3 = M8xx_BRG_RST;
            m8xx.brgc3 = m8xx_get_brg_cd(baud);
            break;
        case 3:
            m8xx.brgc4 = M8xx_BRG_RST;
            m8xx.brgc4 = m8xx_get_brg_cd(baud);
            break;
        }
        return i;
    }

    else
        return 0xff;
}
Beispiel #2
0
/*
 *  Allocates an existing brg if one is already programmed for the same
 *  baud rate.  Otherwise a new brg is assigned
 *  AFD: on the mpc8260 only some combinations of SCC/SMC and BRG are allowed
 *  so add a mask which specifies which of the BRGs we can choose from
 */
int
m8xx_get_brg(unsigned brgmask, int baud)
{
  int i;

  /* first try to find a BRG that is already at the right speed */
  for ( i = 0; i < NUM_BRGS; i++ ) {
    if( (1 << i) & brgmask )		/* is this brg allowed? */
      if ( brg_spd[i] == baud ) {
        break;
    }
  }

  if ( i == NUM_BRGS ) { /* I guess we didn't find one */
    for ( i = 0; i < NUM_BRGS; i++ ) {
      if (((1<<i) & brgmask) && (brg_use_count[i] == 0)) {
         break;
      }
    }
  }
  if (i != NUM_BRGS) {
    brg_use_count[i]++;
    brg_spd[i]=baud;
    switch (i) {
   	case 0:
      		m8260.brgc1 = M8260_BRG_RST;
      		m8260.brgc1 = m8xx_get_brg_cd(baud);
      		break;
    	case 1:
      		m8260.brgc2 = M8260_BRG_RST;
      		m8260.brgc2 = m8xx_get_brg_cd(baud);
      		break;
    	case 2:
      		m8260.brgc3 = M8260_BRG_RST;
      		m8260.brgc3 = m8xx_get_brg_cd(baud);
      		break;
    	case 3:
      		m8260.brgc4 = M8260_BRG_RST;
      		m8260.brgc4 = m8xx_get_brg_cd(baud);
      		break;
    	case 4:
      		m8260.brgc5 = M8260_BRG_RST;
      		m8260.brgc5 = m8xx_get_brg_cd(baud);
      		break;
    	case 5:
      		m8260.brgc6 = M8260_BRG_RST;
      		m8260.brgc6 = m8xx_get_brg_cd(baud);
      		break;
    	case 6:
      		m8260.brgc7 = M8260_BRG_RST;
      		m8260.brgc7 = m8xx_get_brg_cd(baud);
      		break;
    	case 7:
      		m8260.brgc8 = M8260_BRG_RST;
      		m8260.brgc8 = m8xx_get_brg_cd(baud);
      		break;
    }
    return i;
  }

  else {
    printk( "Could not assign a brg for %d\n", baud );
    return -1;
  }
}