[U-Boot-Users] [PATCH] Add support for hammerhead AVR32 board

Haavard Skinnemoen haavard.skinnemoen at atmel.com
Wed Mar 26 14:57:19 CET 2008


Hi Alex,

Please see below for some (delayed) review comments.

On Mon, 17 Mar 2008 11:31:42 +0100
Alex <mailinglist at miromico.ch> wrote:

> I corrected the patch. I tried to run MAKEALL, but it fails, as I don't have all those cross-compilers
> installed. Am I missing something? Do I need to install them, or what is the correct procedure?

You can run MAKEALL for one particular architecture by doing

CROSS_COMPILE=<target>- ./MAKEALL <arch>

where <arch> can be a major architecture (e.g. ppc, arm, etc.) or a
subarchitecture/platform (e.g. 4xx, ARM9, etc.)

> diff -Naur old/u-boot-avr32/board/miromico/hammerhead/eth.c new/u-boot-avr32/board/miromico/hammerhead/eth.c
> --- old/u-boot-avr32/board/miromico/hammerhead/eth.c	1970-01-01 01:00:00.000000000 +0100
> +++ new/u-boot-avr32/board/miromico/hammerhead/eth.c	2008-03-14 16:06:35.000000000 +0100

> +extern int macb_eth_initialize(int id, void *regs, unsigned int phy_addr);

Hrm...we should really move this to a separate header, but let's wait
until the current discussions reach some sort of conclusion.

> +#ifdef CONFIG_CMD_NET
> +void board_eth_initialize(bd_t *bi)
> +{
> +	macb_eth_initialize(0, (void *)MACB0_BASE, bi->bi_phy_id[0]);
> +}
> +#endif
> diff -Naur old/u-boot-avr32/board/miromico/hammerhead/hammerhead.c new/u-boot-avr32/board/miromico/hammerhead/hammerhead.c
> --- old/u-boot-avr32/board/miromico/hammerhead/hammerhead.c	1970-01-01 01:00:00.000000000 +0100
> +++ new/u-boot-avr32/board/miromico/hammerhead/hammerhead.c	2008-03-14 15:34:22.000000000 +0100

> +	/* Select GCLK3 peripheral function. We'll need it as clock output
> +     * for ethernet PHY. */

There's a bit of whitespace damage here and there, as others have
pointed out.

> +void board_init_info(void)
> +{
> +	gd->bd->bi_phy_id[0] = 0x01;
> +}

We should probably get rid of this function. Don't worry about it for
now though.

> diff -Naur old/u-boot-avr32/board/miromico/hammerhead/u-boot.lds new/u-boot-avr32/board/miromico/hammerhead/u-boot.lds
> --- old/u-boot-avr32/board/miromico/hammerhead/u-boot.lds	1970-01-01 01:00:00.000000000 +0100
> +++ new/u-boot-avr32/board/miromico/hammerhead/u-boot.lds	2008-03-14 14:57:37.000000000 +0100

> +	. = ALIGN(32);
> +	__flashprog_start = .;
> +	.flashprog : {
> +		*(.flashprog)
> +	}
> +	. = ALIGN(32);
> +	__flashprog_end = .;

I don't think this block is needed since you're using the CFI flash
driver. It should probably be culled from the ATNGW100 linker script
too.

> diff -Naur old/u-boot-avr32/cpu/at32ap/at32ap700x/gpio.c new/u-boot-avr32/cpu/at32ap/at32ap700x/gpio.c
> --- old/u-boot-avr32/cpu/at32ap/at32ap700x/gpio.c	2008-03-17 10:23:49.000000000 +0100
> +++ new/u-boot-avr32/cpu/at32ap/at32ap700x/gpio.c	2008-03-17 10:10:37.000000000 +0100
> @@ -142,3 +142,14 @@
>   	gpio_select_periph_A(GPIO_PIN_PA15, 0);	/* DATA3 */
>   }
>   #endif
> +
> +#ifdef CONFIG_HAMMERHEAD
> +/*
> + * Hammerhead board uses GCLK3 (Periph A on PB29) as 25MHz clock output
> + * for ethernet PHY.
> + */
> +void gpio_enable_gclk3(void)
> +{
> +  gpio_select_periph_A(GPIO_PIN_PB29, 0); /* GCLK3         */
> +}
> +#endif

Please drop the #ifdef. --gc-sections will take care of it.

> diff -Naur old/u-boot-avr32/cpu/at32ap/cpu.c new/u-boot-avr32/cpu/at32ap/cpu.c
> --- old/u-boot-avr32/cpu/at32ap/cpu.c	2008-03-17 10:23:49.000000000 +0100
> +++ new/u-boot-avr32/cpu/at32ap/cpu.c	2008-03-14 15:43:09.000000000 +0100
> @@ -81,6 +81,16 @@
>   #endif
>   }
> 
> +#ifdef CONFIG_HAMMERHEAD
> +static void gclk_init(void)
> +{
> +  /* Hammerhead boards uses GCLK3 as 25MHz output to ethernet PHY */
> +
> +  /* Enable GCLK3 with no input divider, from OSC0 (crystal) */
> +  sm_writel( PM_GCCTRL3, SM_BIT(CEN) );
> +}
> +#endif

Hmm...could you turn it into something more generic, like

void gclk_enable(unsigned int id)

and call it from the board code? Then you could get rid of the #ifdefs
and let --gc-sections remove it if it turns out to be unused.

> @@ -105,6 +115,10 @@
>   	     p += CFG_ICACHE_LINESZ)
>   		asm volatile("cache %0, 0x02" : "=m"(*p) :: "memory");

Hmm...another piece of code we can get rid of. This is unrelated to
your patch though.

> +#ifdef CONFIG_HAMMERHEAD
> +	gclk_init();
> +#endif

Please remove this if you follow my suggestion above.

> diff -Naur old/u-boot-avr32/cpu/at32ap/sm.h new/u-boot-avr32/cpu/at32ap/sm.h
> --- old/u-boot-avr32/cpu/at32ap/sm.h	2008-03-17 10:23:49.000000000 +0100
> +++ new/u-boot-avr32/cpu/at32ap/sm.h	2008-03-14 15:51:10.000000000 +0100
> @@ -21,7 +21,16 @@
>   #define SM_PM_IMR				0x0048
>   #define SM_PM_ISR				0x004c
>   #define SM_PM_ICR				0x0050
> -#define SM_PM_GCCTRL				0x0060
> +
> +#define SM_PM_GCCTRL0				0x0060
> +#define SM_PM_GCCTRL1				0x0064
> +#define SM_PM_GCCTRL2				0x0068
> +#define SM_PM_GCCTRL3				0x006c
> +#define SM_PM_GCCTRL4				0x0070
> +#define SM_PM_GCCTRL5				0x0074
> +#define SM_PM_GCCTRL6				0x0078
> +#define SM_PM_GCCTRL7				0x007c

Why not

#define SM_PM_GCCTRL(x)				(0x0060 + 4 * (x))

perhaps as a separate patch?

> diff -Naur old/u-boot-avr32/net/eth.c new/u-boot-avr32/net/eth.c
> --- old/u-boot-avr32/net/eth.c	2008-03-17 10:23:50.000000000 +0100
> +++ new/u-boot-avr32/net/eth.c	2008-03-17 10:11:33.000000000 +0100
> @@ -64,6 +64,7 @@
>   extern int mcffec_initialize(bd_t*);
>   extern int mcdmafec_initialize(bd_t*);
>   extern int at91cap9_eth_initialize(bd_t *);
> +extern int board_eth_initialize(bd_t *);
> 
>   #ifdef CONFIG_API
>   extern void (*push_packet)(volatile void *, int);
> @@ -287,6 +288,9 @@
>   #if defined(CONFIG_AT91CAP9)
>   	at91cap9_eth_initialize(bis);
>   #endif
> +#if defined(CONFIG_HAMMERHEAD)
> +	board_eth_initialize(bis);
> +#endif

We probably want something more generic-sounding like
CONFIG_HAS_BOARD_ETH_INITIALIZE so that boards can migrate over to the
new API one by one. But I'll leave it to Ben to decide how to do this.

Haavard




More information about the U-Boot mailing list