static int mpc52xx_i2c_get_best_fdr(int ipb_freq, int i2c_speed) { /* Consts */ const struct { int scl2tap; int tap2tap; } x2taps[] = { { 4, 1 }, { 4, 2 }, { 6, 4 }, { 6, 8 }, { 14, 16 }, { 30, 32 }, { 62, 64 }, { 126, 128 }, }; const int scl_taps[] = { 9, 10, 12, 15, 5, 6, 7, 8 }; int best_i, best_j, i, j; int scl; int best_diff = 0x7fffffff, diff; int fdr; for ( i=7 ; i>=0 ; i-- ) { for ( j=0 ; j<8 ; j++ ) { scl = 2 * (x2taps[i].scl2tap + ((scl_taps[j] - 1) * x2taps[i].tap2tap) + 2); /* We only want frequency BELOW or EQUAL to */ /* the target frequency */ diff = i2c_speed * scl - ipb_freq; if ( (diff > 0) && (diff < best_diff) ) { best_diff = diff; best_i = i; best_j = j; } } } fdr = ((best_i << 2) | (best_j & 0x03) | ((best_j & 0x04) << 5)) & 0x3f; return fdr; }