[U-Boot] [PATCH-OMAP3] OMAP3: Convert readl/writel and replace hardcoded values

Dirk Behme dirk.behme at googlemail.com
Sun Nov 23 19:48:42 CET 2008


Dear Wolfgang,

Wolfgang Denk wrote:
> Dear Dirk,
> 
> In message <1227445293-23887-1-git-send-email-dirk.behme at googlemail.com> you wrote:
> 
>>Convert readl/writel to base + offset style. Replace hardcoded values with
>>macros.
> 
> 
> I think repeating the sequence "base + offset(foo)" again  and  again
> is not exactly nice or easy to read.

But it's what the patch does ;) Anyway, if I remember correctly this 
is why you asked me to re-send OMAP3 patch series to mailing list 
again once all the review comments are fixed and not directly git pull 
from OMAP3 branch. To get rid of all these "fix here, clean up there" 
comments.

>>-	writel((a_add_high | a_add_low), SDRC_CS_CFG);
>>+	writel((a_add_high | a_add_low), sdrc_base + OFFS(SDRC_CS_CFG));
> 
> 
> I find this new code is even less readable.
> 
> At this point I was tempted to compain that you should not re-invent
> the offsetof() macro when I realized that the actual definition of
> OFFS is
> 
> 	#define OFFS(x)    ((x) >> 2)
> 
> Argh... that's awfully error prone. So you rely  on  havnig  to  deal
> with  32  bit  register  accesses  only,  without any way of compiler
> supported type checking?
> 
> That's awful.

This style is what Jean-Christophe and Scott asked me to use [1]. I 
was asked to convert all OMAP3 read/write access to this style to get 
the patches accepted.

Disussing this at IRC, we agreed on

-- cut --
#define GPMC_BASE     0x6E000000

OFFS(x)  ((x) >> 2)

#define GPMC_ECC_CONFIG		0x1F4

static uint32_t *gpmc_base = (uint32_t *)GPMC_BASE;
...
writel(0x000, gpmc_base + OFFS(GPMC_ECC_CONFIG));
-- cut --

style for 32-bit accesses. OFFS is used to be able to use offset 
macros in assembly, too, and to be able to directly use offset 
addresses from TRM not needing them to divide by 4 "manually" (error 
prone).

[1] http://lists.denx.de/pipermail/u-boot/2008-October/042483.html

> I am aware that many areas of ARM code use such a  horrible  program-
> ming  syle  of  defining only register offsets instead of proper data
> structures like for example PowerPC has been doing for ages.
> 
> Do you see a chance to convert the OMAP3 code to use data  structures
> instead of offset definitions to describe the processor registers and
> peripherals?

Looking at the time I already spent into converting to the style used 
now, no, unfortunately, not. This was the last read/write converting 
patch, btw.

Best regards

Dirk

Btw.: Did you notice how e.g. Nomadik patch [2] does it?

-- cut --
#define NOMADIK_GPIO1_BASE	0x101E5000
...
writel(0xC37800F0, NOMADIK_GPIO1_BASE + 0x20);
-- cut --

Having this patch applied in this format I slightly wonder

a) why I have to convert all hardcoded values to macros

b) why I have to convert all writex/readx

Style used by Nomadik patch is the same OMAP3 initially used and that 
wasn't accepted...

[2] http://lists.denx.de/pipermail/u-boot/2008-November/043651.html



More information about the U-Boot mailing list