/* * 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; }
/* * 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; } }