int p2 = 14; int min_p, max_p; if (p2 == 7 || p2 == 14) { /* LVDS */ min_p = 7; max_p = 98; } else { /* SDVO/DAC */ min_p = 5; max_p = 80; } for (int m1 = 10; m1 <= 22; m1++) { for (int m2 = 5; m2 <= 9; m2++) { for (int n = 1; n <= 6; n++) { for (int p1 = 1; p1 <= 8; p1++) { int ref = 96000000; int m = 5 * (m1 + 2) + (m2 + 2); int p = p1 * p2; int vco = floor(ref * m / (n + 2)); int clock = floor(vco / p); if (p < min_p || p > max_p) continue; if (m < 70 || m > 120) continue; if (m2 > m1) continue; /* won't happen */ if (vco < 1400000000 || vco > 2800000000) continue; printf("clock: %d (%d,%d),%d,(%d,%d)\n", floor(clock / 1000), m1, m2, n, p1, p2); } } } }