On Wed, 27 Jan 2010, Mark Brown wrote: > On Wed, Jan 27, 2010 at 06:56:23PM +0100, Guennadi Liakhovetski wrote: [snip] > > + if (f_opclk) { > > ... > > > + if (16 * f_opclk < 3 * f_mclk || 4 * f_opclk >= 13 * f_mclk) > > + return -EINVAL; > > + > > + if (4 * f_opclk < 3 * f_mclk) > > + /* Have to use OPCLKDIV */ > > + opclk_div = (3 * f_mclk / 4 + f_opclk - 1) / f_opclk; > > + else > > + opclk_div = 1; > > I'm fairly sure this and the similar logic for SYSCLK can be squashed > together with some suitable local variables. Might be more legible > since this requires some staring at. I didn't actually go so far as to > work out what the relevant code is, though. Well, not really. In one case f_PLLOUT can be derived directly, because OPCLKDIV covers the whole its value range 1-4, whereas MCLKDIV takes values 1, 3/2, 2, 3, 4, 6, 8, 12, so, you have to apply an iterative process to select the best match. I've just sent a patch, that improves these calculations. It should be the last patch for my SIU / wm8978 / migor support so far. Thanks Guennadi --- Guennadi Liakhovetski, Ph.D. Freelance Open-Source Software Developer http://www.open-technology.de/ _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel