public inbox for linux-omap@vger.kernel.org
 help / color / mirror / Atom feed
* clock divisor in  mmc_omap_set_ios in drivers/mmc/omap.c wrong
@ 2006-11-10  9:54 Frantisek Dufka
  2006-11-16  1:05 ` Tony Lindgren
  0 siblings, 1 reply; 3+ messages in thread
From: Frantisek Dufka @ 2006-11-10  9:54 UTC (permalink / raw)
  To: linux-omap-open-source

Hello,

anyone knows real reason why the divisor is intentionally lowered in
mmc_omap_set_ios so the result frequency is _not_ near the one requested?

First there is a code which tries hard to select the divisor that
produces highest possible frequency which is lower or equal to the
requested one

        fclk_rate = clk_get_rate(host->fclk);
        dsor = fclk_rate / freq;
        if (dsor < 1)
                dsor = 1;
        if (fclk_rate / dsor > freq)
                dsor++;

        if (dsor > 250)
                dsor = 250;

and then there is additional

        dsor++;

which intentionally makes resulting frequency lower by unknown factor.

If this is some workaround for specific cards maybe it should be solved
in different place like blacklisting offending cards and actually
requesting lower frequency for them. Or is  there some real reason?

For requested 20Mhz MMC bus speed and 48Mhz omap clock current code
results in 12Mhz instead of 16Mhz.

Frantisek

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: clock divisor in  mmc_omap_set_ios in drivers/mmc/omap.c wrong
  2006-11-10  9:54 clock divisor in mmc_omap_set_ios in drivers/mmc/omap.c wrong Frantisek Dufka
@ 2006-11-16  1:05 ` Tony Lindgren
  2006-11-16  8:15   ` Frantisek Dufka
  0 siblings, 1 reply; 3+ messages in thread
From: Tony Lindgren @ 2006-11-16  1:05 UTC (permalink / raw)
  To: Frantisek Dufka; +Cc: linux-omap-open-source

* Frantisek Dufka <dufkaf@seznam.cz> [061110 11:55]:
> Hello,
> 
> anyone knows real reason why the divisor is intentionally lowered in
> mmc_omap_set_ios so the result frequency is _not_ near the one requested?
> 
> First there is a code which tries hard to select the divisor that
> produces highest possible frequency which is lower or equal to the
> requested one
> 
>        fclk_rate = clk_get_rate(host->fclk);
>        dsor = fclk_rate / freq;
>        if (dsor < 1)
>                dsor = 1;
>        if (fclk_rate / dsor > freq)
>                dsor++;
> 
>        if (dsor > 250)
>                dsor = 250;
> 
> and then there is additional
> 
>        dsor++;
> 
> which intentionally makes resulting frequency lower by unknown factor.
> 
> If this is some workaround for specific cards maybe it should be solved
> in different place like blacklisting offending cards and actually
> requesting lower frequency for them. Or is  there some real reason?
> 
> For requested 20Mhz MMC bus speed and 48Mhz omap clock current code
> results in 12Mhz instead of 16Mhz.

This seems like a bug to me (or else the TRMs have a typo). Let's patch
it out and see if it still works.

Regards,

Tony

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: clock divisor in mmc_omap_set_ios in drivers/mmc/omap.c wrong
  2006-11-16  1:05 ` Tony Lindgren
@ 2006-11-16  8:15   ` Frantisek Dufka
  0 siblings, 0 replies; 3+ messages in thread
From: Frantisek Dufka @ 2006-11-16  8:15 UTC (permalink / raw)
  To: Tony Lindgren; +Cc: linux-omap-open-source

Tony Lindgren wrote:
> 
> This seems like a bug to me (or else the TRMs have a typo). Let's patch
> it out and see if it still works.
> 

Yes, that's what I did on Nokia 770 and have mixed results. Most MMC 
cards around me work with this line removed (at 16Mhz) and there is some 
speedup (~1.8MB/s@16Mhz vs ~1.4MB/s@12Mhz) but the 64 MB one shipped 
with Nokia (plain MMC, 7 pins) give me I/O error when inserted. Even 
partition table is not read. Other cards that work are 128MB noname 
RS-MMC, 1GB Sandisk RS-MMC, 2GB Kingston MMCmobile (13 pins).

Also interesting is that after I posted my question to this list few 
days later Nokia released newer kernel source for newer N770 firmware 
and this dsor++ line is removed there, but there is board specific code 
that limits MMC speed on Nokia N770 to 12Mhz. So there seems to be 
something fishy with MMC speeds over 12Mhz (on N770). Either there are 
known cards on market which fail or Nokia shipped buggy cards with 
devices and limited MMC interface speed due to this. Or can this limit 
be matter of wiring/shielding of specific device? Their newer kernel 
have also support for newer device with miniSD slot with speed limited 
to 24Mhz in same omap driver.

I'm digging into in this because the MMC speed on N770 is pathetic and 
newer MMCmobile cards can operate up to 52Mhz. And it looks like with 
high speed MMC v4.1 patches MMC interface in OMAP1710 inside N770 can 
run at 48Mhz (divisor=1) giving me ~6MB/s@48Mhz when reading. Every 
MMCmobile/plus card can do at least 26Mhz so even 24Mhz is good speedup 
(over original 12Mhz).

See also http://fanoush.webpark.cz/maemo/#mmcplus
Some people tried it on their N770 and I got few successful reports and 
no unsuccesful ones. Such speed is quite useful when booting from MMC 
and having swap on MMC too. I'm running my N770 in this setup for more 
than month with Kingston 2GB card @ 48Mhz and had no problems so far 
(i/o error, data corruption).

So my next related question is whether OMAP 1710 MMC interface is 
designed to run with divisor set to 1 with 48Mhz clock. It seems to work 
fine and give nice speed boost with newer MMCmobile cards on market. 
There is no limit mentioned in spru765a.pdf so I don't know whether I'm 
in fact overclocking something or not.

Regards,
Frantisek

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2006-11-16  8:15 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-11-10  9:54 clock divisor in mmc_omap_set_ios in drivers/mmc/omap.c wrong Frantisek Dufka
2006-11-16  1:05 ` Tony Lindgren
2006-11-16  8:15   ` Frantisek Dufka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox