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

Graeme Russ graeme.russ at gmail.com
Sun Nov 23 22:24:15 CET 2008


On Mon, Nov 24, 2008 at 6:47 AM, Wolfgang Denk <wd at denx.de> wrote:
> Dear Dirk,
>

> you should really use structures like this:
>
>        struct ecc_control {
>                u32 ecc_config;
>                u32 ecc_control;
>                u32 ecc_size_config;
>                u32 ecc1_result;
>                u32 ecc2_result;
>                u32 ecc3_result;
>                u32 ecc4_result;
>                u32 ecc5_result;
>                u32 ecc6_result;
>                u32 ecc7_result;
>                u32 ecc8_result;
>                u32 ecc9_result;
>        };
>
> so that instead of
>
>        writel(0x000, gpmc_base + OFFS(GPMC_ECC_CONFIG));
>
> you can write
>
>        writel(0x000, ptr->ecc_config);
>
> or similar - and the compiler will actually perform type checking.

Wolfgang,

Do you mean to instance the ecc_control struct at a specific memory
location and use writel(0x000, &ptr->ecc_config);? If so, why not
simply use ptr->ecc_config = 0x0000?

Example:

The AMD sc520 has 4k of Memory Mapped Control Registers (MMCR) that range
in size from 8 to 32 bits located at a fixed memory address (0xfffef000)

I am thinking of replacing the read/write_mmcr_byte/word/long () functions
into a struct e.g.

struct sc520_mmcr {
	/* CPU */
	u16	revid;
	u8	cpuctl;
	u8	pad_0x003[0xd];

	/* SDRAM Controller */
	u8	drcctl;
	
	<etc>

} __attribute__((packed));

struct struct sc520_mmcr* mmcrptr = (volatile struct sc520_mmcr*)0xfffef000;

and replacing:
	write_mmcr_byte(SC520_DRCCTL, \
			(read_mmcr_byte(SC520_DRCCTL) & 0xcf) | (val<<4));

with:
	mmcrptr->drcctl = (mmcrptr->drcctl & 0xcf) | (val<<4);

Is this appropriate?

Regards,

Graeme


More information about the U-Boot mailing list