Dear zaurus developers!

I used to delve into zaurus code for awhile ago. There are some local changes 
left from that time.
One thing is the change to pxa pcmcia timings.
Here's the original code from 2.6.16:

static inline u_int pxa2xx_mcxx_hold(u_int pcmcia_cycle_ns,
                                     u_int mem_clk_10khz)
{
        u_int code = pcmcia_cycle_ns * mem_clk_10khz;
        return (code / 300000) + ((code % 300000) ? 1 : 0) - 1;
}

static inline u_int pxa2xx_mcxx_asst(u_int pcmcia_cycle_ns,
                                     u_int mem_clk_10khz)
{
        u_int code = pcmcia_cycle_ns * mem_clk_10khz;
        return (code / 300000) + ((code % 300000) ? 1 : 0) - 1;
}

static inline u_int pxa2xx_mcxx_setup(u_int pcmcia_cycle_ns,
                                      u_int mem_clk_10khz)
{
        u_int code = pcmcia_cycle_ns * mem_clk_10khz;
        return (code / 100000) + ((code % 100000) ? 1 : 0) - 1;
}

I don't know the original reasons why the timings are calculated in this way.
My guess that it's sa1100 adapted to pxa. But the pxa has more control of the
bus cycle. After looking at pxa docs and CF/PCMCIA standard I've changed
the formula to the following:

 static inline u_int pxa2xx_mcxx_hold(u_int hold,
                                     u_int mem_clk_10khz)
{
        u_int code = hold * mem_clk_10khz;
        return (code / 100000) + ((code % 100000) ? 1 : 0);
}

static inline u_int pxa2xx_mcxx_asst(u_int cas,
                                     u_int mem_clk_10khz)
{
        u_int code = cas * mem_clk_10khz;
        if(code % 300000 > 200000) return code/300000;
        else return code/300000-1;
}

static inline u_int pxa2xx_mcxx_setup(u_int set,
                                      u_int mem_clk_10khz)
{
        u_int code = set * mem_clk_10khz;
        return (code / 100000) + ((code % 100000) ? 1 : 0) - 2;
}

The functions above take specific time as a parameter, not the whole cycle 
length.
For example, pxa2xx_pcmcia_set_mcio looked like this:
static int pxa2xx_pcmcia_set_mcio( int sock, int speed, int clock )
{
        u_int set, cas, hold;

        if(speed == 255) {
         set = 70;
         hold = 20;
         cas = 165;


Although I can't guarantee that my calculations are correct, it worked with all 
of my CF cards on c3000.
If anyone is interested, I can prepare the patch.

_______________________________________________
Zaurus-devel mailing list
Zaurus-devel@lists.linuxtogo.org
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/zaurus-devel

Reply via email to