
- if ((div / 2) <= (SUN4I_CLK_CTL_CDR2_MASK + 1)) {
- if (div != 1 && ((div / 2) <= (SUN4I_CLK_CTL_CDR2_MASK + 1))) { div /= 2;
This is still not fully correct, is it? If I ask for 10 MHz, the algorithm should select 8 MHz (24/3) or actually 6 MHz (24/4), but it chooses 12 MHz (24/2), which is too much. So I think this division here should be either: div = (div + 1) / 2; or: div = DIV_ROUND_UP(div, 2);
Can someone confirm this?
When I've written this patch, I've looked at how linux does it (and it's history) and I'm sure you know that linux has two drivers, for sun4i and sun6i/sun8i. Somehow u-boot conflates them into one with just one being correct with the SPI_CLK in the CDR2 case (?).
But anyway, this is about CDR1 and it seems you're right. But OTOH I've tested this briefly with "sf probe 0:0 <hz>" and looked at the SCK frequency of the readid command with a scope and it was always less than my requested frequency. At least after the second probe (there must be another bug which will still keep the frequency of the probe at the former speed). Soo.. I'm not sure. Mh.
While this might be a bug, it doesn't affect this patch which will just make sure we can get a 1:1 ratio on SoCs where this is possible, i.e. not on the sun4i variant.
-michael