[U-Boot] [PATCH 0/3] omap3evm: Generic ethernet fixes

This patchset mainly fixes the ethernet reset sequence on the Rev G EVM board.
Function setup_net_chip() is required to detect the board revision. However, steps to reset the ethernet chip now depend upon the board revision.
Therefore, steps to reset the ethernet chip have been moved to a new function reset_net_chip() - called after board revision has been detected/ identified.
Sanjeev Premi (2): omap3evm: eth: split function setup_net_chip omap3evm: eth: Include functions only when necessary
Sriramakrishnan (1): omap3evm: Update ethernet reset sequence for Rev.G board
board/ti/evm/evm.c | 37 +++++++++++++++++++++++++++++-------- board/ti/evm/evm.h | 1 + 2 files changed, 30 insertions(+), 8 deletions(-)

In current implementation, the function sets up the ethernet chip and resets it. The steps to reset depend upon the board revision.
The patch moves the reset actions to new function reset_net_chip().
Signed-off-by: Sanjeev Premi premi@ti.com --- board/ti/evm/evm.c | 12 +++++++++++- board/ti/evm/evm.h | 1 + 2 files changed, 12 insertions(+), 1 deletions(-)
diff --git a/board/ti/evm/evm.c b/board/ti/evm/evm.c index aaf3033..8f9f141 100644 --- a/board/ti/evm/evm.c +++ b/board/ti/evm/evm.c @@ -130,6 +130,9 @@ int misc_init_r(void) #endif omap3_evm_get_revision();
+#if defined(CONFIG_CMD_NET) + reset_net_chip(); +#endif dieid_num_r();
return 0; @@ -153,7 +156,6 @@ void set_muxconf_regs(void) */ static void setup_net_chip(void) { - struct gpio *gpio3_base = (struct gpio *)OMAP34XX_GPIO3_BASE; struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE;
/* Configure GPMC registers */ @@ -172,6 +174,14 @@ static void setup_net_chip(void) /* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */ writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00, &ctrl_base->gpmc_nadv_ale); +} + +/** + * Reset the ethernet chip. + */ +static void reset_net_chip(void) +{ + struct gpio *gpio3_base = (struct gpio *)OMAP34XX_GPIO3_BASE;
/* Make GPIO 64 as output pin */ writel(readl(&gpio3_base->oe) & ~(GPIO0), &gpio3_base->oe); diff --git a/board/ti/evm/evm.h b/board/ti/evm/evm.h index b721ad6..623cf1b 100644 --- a/board/ti/evm/evm.h +++ b/board/ti/evm/evm.h @@ -49,6 +49,7 @@ u32 get_omap3_evm_rev(void);
#if defined(CONFIG_CMD_NET) static void setup_net_chip(void); +static void reset_net_chip(void); #endif
/*

Dear Sanjeev Premi,
In message 1308770649-3802-2-git-send-email-premi@ti.com you wrote:
In current implementation, the function sets up the ethernet chip and resets it. The steps to reset depend upon the board revision.
The patch moves the reset actions to new function reset_net_chip().
Your patch does not add any such new function, so it will result in compile errors?
Best regards,
Wolfgang Denk

From: Sriramakrishnan srk@ti.com
The GPIO pin used for resetting the external LAN chip has changed for Rev.G board.
Signed-off-by: Sriramakrishnan srk@ti.com Signed-off-by: Sanjeev Premi premi@ti.com --- board/ti/evm/evm.c | 27 ++++++++++++++++++--------- 1 files changed, 18 insertions(+), 9 deletions(-)
diff --git a/board/ti/evm/evm.c b/board/ti/evm/evm.c index 8f9f141..57e5fa5 100644 --- a/board/ti/evm/evm.c +++ b/board/ti/evm/evm.c @@ -181,17 +181,26 @@ static void setup_net_chip(void) */ static void reset_net_chip(void) { - struct gpio *gpio3_base = (struct gpio *)OMAP34XX_GPIO3_BASE; - - /* Make GPIO 64 as output pin */ - writel(readl(&gpio3_base->oe) & ~(GPIO0), &gpio3_base->oe); - - /* Now send a pulse on the GPIO pin */ - writel(GPIO0, &gpio3_base->setdataout); + struct gpio *gpio_base; + u32 pin; + + if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1) { + gpio_base = (struct gpio *)OMAP34XX_GPIO3_BASE; + pin = GPIO0; /* Output pin: GPIO Bank 3, pin 0 */ + } else { + gpio_base = (struct gpio *)OMAP34XX_GPIO1_BASE; + pin = GPIO7; /* Output pin: GPIO Bank 0, pin 7 */ + } + + /* Configure the pin as output */ + writel(readl(&gpio_base->oe) & ~(pin), &gpio_base->oe); + + /* Send a pulse on the GPIO pin */ + writel(pin, &gpio_base->setdataout); udelay(1); - writel(GPIO0, &gpio3_base->cleardataout); + writel(pin, &gpio_base->cleardataout); udelay(1); - writel(GPIO0, &gpio3_base->setdataout); + writel(pin, &gpio_base->setdataout); }
int board_eth_init(bd_t *bis)

Hi Sanjeev,
On 06/22/11 22:24, Sanjeev Premi wrote:
From: Sriramakrishnan srk@ti.com
The GPIO pin used for resetting the external LAN chip has changed for Rev.G board.
Signed-off-by: Sriramakrishnan srk@ti.com Signed-off-by: Sanjeev Premi premi@ti.com
board/ti/evm/evm.c | 27 ++++++++++++++++++--------- 1 files changed, 18 insertions(+), 9 deletions(-)
diff --git a/board/ti/evm/evm.c b/board/ti/evm/evm.c index 8f9f141..57e5fa5 100644 --- a/board/ti/evm/evm.c +++ b/board/ti/evm/evm.c @@ -181,17 +181,26 @@ static void setup_net_chip(void) */ static void reset_net_chip(void) {
- struct gpio *gpio3_base = (struct gpio *)OMAP34XX_GPIO3_BASE;
- /* Make GPIO 64 as output pin */
- writel(readl(&gpio3_base->oe) & ~(GPIO0), &gpio3_base->oe);
- /* Now send a pulse on the GPIO pin */
- writel(GPIO0, &gpio3_base->setdataout);
- struct gpio *gpio_base;
- u32 pin;
- if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1) {
gpio_base = (struct gpio *)OMAP34XX_GPIO3_BASE;
pin = GPIO0; /* Output pin: GPIO Bank 3, pin 0 */
- } else {
gpio_base = (struct gpio *)OMAP34XX_GPIO1_BASE;
pin = GPIO7; /* Output pin: GPIO Bank 0, pin 7 */
- }
- /* Configure the pin as output */
- writel(readl(&gpio_base->oe) & ~(pin), &gpio_base->oe);
- /* Send a pulse on the GPIO pin */
- writel(pin, &gpio_base->setdataout); udelay(1);
- writel(GPIO0, &gpio3_base->cleardataout);
- writel(pin, &gpio_base->cleardataout); udelay(1);
- writel(GPIO0, &gpio3_base->setdataout);
- writel(pin, &gpio_base->setdataout);
Why keep messing with the gpio registers? Why not use gpio framework? Though it is omap specific, but it will be much cleaner then the above.

-----Original Message----- From: Igor Grinberg [mailto:grinberg@compulab.co.il] Sent: Thursday, June 23, 2011 2:38 PM To: Premi, Sanjeev Cc: u-boot@lists.denx.de; Govindarajan, Sriramakrishnan Subject: Re: [U-Boot] [PATCH 2/3] omap3evm: Update ethernet reset sequence for Rev.G board
Hi Sanjeev,
On 06/22/11 22:24, Sanjeev Premi wrote:
From: Sriramakrishnan srk@ti.com
The GPIO pin used for resetting the external LAN chip has changed for Rev.G board.
Signed-off-by: Sriramakrishnan srk@ti.com Signed-off-by: Sanjeev Premi premi@ti.com
board/ti/evm/evm.c | 27 ++++++++++++++++++--------- 1 files changed, 18 insertions(+), 9 deletions(-)
diff --git a/board/ti/evm/evm.c b/board/ti/evm/evm.c index 8f9f141..57e5fa5 100644 --- a/board/ti/evm/evm.c +++ b/board/ti/evm/evm.c @@ -181,17 +181,26 @@ static void setup_net_chip(void) */ static void reset_net_chip(void) {
- struct gpio *gpio3_base = (struct gpio *)OMAP34XX_GPIO3_BASE;
- /* Make GPIO 64 as output pin */
- writel(readl(&gpio3_base->oe) & ~(GPIO0), &gpio3_base->oe);
- /* Now send a pulse on the GPIO pin */
- writel(GPIO0, &gpio3_base->setdataout);
- struct gpio *gpio_base;
- u32 pin;
- if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1) {
gpio_base = (struct gpio *)OMAP34XX_GPIO3_BASE;
pin = GPIO0; /* Output pin: GPIO Bank 3, pin 0 */
- } else {
gpio_base = (struct gpio *)OMAP34XX_GPIO1_BASE;
pin = GPIO7; /* Output pin: GPIO Bank 0, pin 7 */
- }
- /* Configure the pin as output */
- writel(readl(&gpio_base->oe) & ~(pin), &gpio_base->oe);
- /* Send a pulse on the GPIO pin */
- writel(pin, &gpio_base->setdataout); udelay(1);
- writel(GPIO0, &gpio3_base->cleardataout);
- writel(pin, &gpio_base->cleardataout); udelay(1);
- writel(GPIO0, &gpio3_base->setdataout);
- writel(pin, &gpio_base->setdataout);
Why keep messing with the gpio registers? Why not use gpio framework? Though it is omap specific, but it will be much cleaner then the above.
[sp] I guess the intent was to keep code similar. But yes, gpio framework can be used.
~sanjeev
-- Regards, Igor.

-----Original Message----- From: u-boot-bounces@lists.denx.de [mailto:u-boot-bounces@lists.denx.de] On Behalf Of Premi, Sanjeev Sent: Thursday, June 23, 2011 4:43 PM To: Igor Grinberg Cc: Govindarajan, Sriramakrishnan; u-boot@lists.denx.de Subject: Re: [U-Boot] [PATCH 2/3] omap3evm: Update ethernet reset sequence for Rev.G board
-----Original Message----- From: Igor Grinberg [mailto:grinberg@compulab.co.il] Sent: Thursday, June 23, 2011 2:38 PM To: Premi, Sanjeev Cc: u-boot@lists.denx.de; Govindarajan, Sriramakrishnan Subject: Re: [U-Boot] [PATCH 2/3] omap3evm: Update ethernet reset sequence for Rev.G board
Hi Sanjeev,
On 06/22/11 22:24, Sanjeev Premi wrote:
From: Sriramakrishnan srk@ti.com
The GPIO pin used for resetting the external LAN chip has changed for Rev.G board.
Signed-off-by: Sriramakrishnan srk@ti.com Signed-off-by: Sanjeev Premi premi@ti.com
board/ti/evm/evm.c | 27 ++++++++++++++++++--------- 1 files changed, 18 insertions(+), 9 deletions(-)
diff --git a/board/ti/evm/evm.c b/board/ti/evm/evm.c index 8f9f141..57e5fa5 100644 --- a/board/ti/evm/evm.c +++ b/board/ti/evm/evm.c @@ -181,17 +181,26 @@ static void setup_net_chip(void) */ static void reset_net_chip(void) {
- struct gpio *gpio3_base = (struct gpio *)OMAP34XX_GPIO3_BASE;
- /* Make GPIO 64 as output pin */
- writel(readl(&gpio3_base->oe) & ~(GPIO0), &gpio3_base->oe);
- /* Now send a pulse on the GPIO pin */
- writel(GPIO0, &gpio3_base->setdataout);
- struct gpio *gpio_base;
- u32 pin;
- if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1) {
gpio_base = (struct gpio *)OMAP34XX_GPIO3_BASE;
pin = GPIO0; /* Output pin: GPIO Bank 3, pin 0 */
- } else {
gpio_base = (struct gpio *)OMAP34XX_GPIO1_BASE;
pin = GPIO7; /* Output pin: GPIO Bank 0, pin 7 */
- }
- /* Configure the pin as output */
- writel(readl(&gpio_base->oe) & ~(pin), &gpio_base->oe);
- /* Send a pulse on the GPIO pin */
- writel(pin, &gpio_base->setdataout); udelay(1);
- writel(GPIO0, &gpio3_base->cleardataout);
- writel(pin, &gpio_base->cleardataout); udelay(1);
- writel(GPIO0, &gpio3_base->setdataout);
- writel(pin, &gpio_base->setdataout);
Why keep messing with the gpio registers? Why not use gpio framework? Though it is omap specific, but it will be much cleaner then the above.
[sp] I guess the intent was to keep code similar. But yes, gpio framework can be used.
[sp] Sorry, mail went earlier than I wanted :(
The only issue is that I couln't see gpio framework for omap. Let me dig further...
~sanjeev
-- Regards, Igor.
U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot

-----Original Message----- From: Premi, Sanjeev Sent: Thursday, June 23, 2011 4:48 PM To: Premi, Sanjeev; Igor Grinberg Cc: Govindarajan, Sriramakrishnan; u-boot@lists.denx.de Subject: RE: [U-Boot] [PATCH 2/3] omap3evm: Update ethernet reset sequence for Rev.G board
-----Original Message----- From: u-boot-bounces@lists.denx.de [mailto:u-boot-bounces@lists.denx.de] On Behalf Of Premi, Sanjeev Sent: Thursday, June 23, 2011 4:43 PM To: Igor Grinberg Cc: Govindarajan, Sriramakrishnan; u-boot@lists.denx.de Subject: Re: [U-Boot] [PATCH 2/3] omap3evm: Update ethernet reset sequence for Rev.G board
-----Original Message----- From: Igor Grinberg [mailto:grinberg@compulab.co.il] Sent: Thursday, June 23, 2011 2:38 PM To: Premi, Sanjeev Cc: u-boot@lists.denx.de; Govindarajan, Sriramakrishnan Subject: Re: [U-Boot] [PATCH 2/3] omap3evm: Update ethernet reset sequence for Rev.G board
Hi Sanjeev,
On 06/22/11 22:24, Sanjeev Premi wrote:
From: Sriramakrishnan srk@ti.com
The GPIO pin used for resetting the external LAN chip has changed for Rev.G board.
Signed-off-by: Sriramakrishnan srk@ti.com Signed-off-by: Sanjeev Premi premi@ti.com
board/ti/evm/evm.c | 27 ++++++++++++++++++--------- 1 files changed, 18 insertions(+), 9 deletions(-)
[snip]...[snip]
- /* Send a pulse on the GPIO pin */
- writel(pin, &gpio_base->setdataout); udelay(1);
- writel(GPIO0, &gpio3_base->cleardataout);
- writel(pin, &gpio_base->cleardataout); udelay(1);
- writel(GPIO0, &gpio3_base->setdataout);
- writel(pin, &gpio_base->setdataout);
Why keep messing with the gpio registers? Why not use gpio framework? Though it is omap specific, but it will be much cleaner then the above.
[sp] I guess the intent was to keep code similar. But yes, gpio framework can be used.
[sp] Sorry, mail went earlier than I wanted :(
The only issue is that I couln't see gpio framework for omap. Let me dig further...
[sp] Implementing GPIO for OMAP would be a long task. It should be done for long term; but is it necessary pre-condition for the patch?
~sanjeev

On 06/27/11 08:06, Premi, Sanjeev wrote:
-----Original Message----- From: Premi, Sanjeev Sent: Thursday, June 23, 2011 4:48 PM To: Premi, Sanjeev; Igor Grinberg Cc: Govindarajan, Sriramakrishnan; u-boot@lists.denx.de Subject: RE: [U-Boot] [PATCH 2/3] omap3evm: Update ethernet reset sequence for Rev.G board
-----Original Message----- From: u-boot-bounces@lists.denx.de [mailto:u-boot-bounces@lists.denx.de] On Behalf Of Premi, Sanjeev Sent: Thursday, June 23, 2011 4:43 PM To: Igor Grinberg Cc: Govindarajan, Sriramakrishnan; u-boot@lists.denx.de Subject: Re: [U-Boot] [PATCH 2/3] omap3evm: Update ethernet reset sequence for Rev.G board
-----Original Message----- From: Igor Grinberg [mailto:grinberg@compulab.co.il] Sent: Thursday, June 23, 2011 2:38 PM To: Premi, Sanjeev Cc: u-boot@lists.denx.de; Govindarajan, Sriramakrishnan Subject: Re: [U-Boot] [PATCH 2/3] omap3evm: Update ethernet reset sequence for Rev.G board
Hi Sanjeev,
On 06/22/11 22:24, Sanjeev Premi wrote:
From: Sriramakrishnan srk@ti.com
The GPIO pin used for resetting the external LAN chip has changed for Rev.G board.
Signed-off-by: Sriramakrishnan srk@ti.com Signed-off-by: Sanjeev Premi premi@ti.com
board/ti/evm/evm.c | 27 ++++++++++++++++++--------- 1 files changed, 18 insertions(+), 9 deletions(-)
[snip]...[snip]
- /* Send a pulse on the GPIO pin */
- writel(pin, &gpio_base->setdataout); udelay(1);
- writel(GPIO0, &gpio3_base->cleardataout);
- writel(pin, &gpio_base->cleardataout); udelay(1);
- writel(GPIO0, &gpio3_base->setdataout);
- writel(pin, &gpio_base->setdataout);
Why keep messing with the gpio registers? Why not use gpio framework? Though it is omap specific, but it will be much cleaner then the above.
[sp] I guess the intent was to keep code similar. But yes, gpio framework can be used.
[sp] Sorry, mail went earlier than I wanted :(
The only issue is that I couln't see gpio framework for omap. Let me dig further...
[sp] Implementing GPIO for OMAP would be a long task. It should be done for long term; but is it necessary pre-condition for the patch?
There is no need to implement GPIO for OMAP. It is already there, you just need to use it instead of writing directly to the GPIO registers. You can find all the implementation in: arch/arm/cpu/armv7/omap3/gpio.c and the header is: arch/arm/include/asm/arch-omap3/gpio.h
All you need is to include the header, request the appropriate gpio, send the pulse and maybe (if you don't need it anymore) free that gpio. This is not hard or long at all.

-----Original Message----- From: Igor Grinberg [mailto:grinberg@compulab.co.il] Sent: Monday, June 27, 2011 12:17 PM To: Premi, Sanjeev Cc: Govindarajan, Sriramakrishnan; u-boot@lists.denx.de Subject: Re: [U-Boot] [PATCH 2/3] omap3evm: Update ethernet reset sequence for Rev.G board
On 06/27/11 08:06, Premi, Sanjeev wrote:
-----Original Message----- From: Premi, Sanjeev Sent: Thursday, June 23, 2011 4:48 PM To: Premi, Sanjeev; Igor Grinberg Cc: Govindarajan, Sriramakrishnan; u-boot@lists.denx.de Subject: RE: [U-Boot] [PATCH 2/3] omap3evm: Update ethernet reset sequence for Rev.G board
-----Original Message----- From: u-boot-bounces@lists.denx.de [mailto:u-boot-bounces@lists.denx.de] On Behalf Of Premi, Sanjeev Sent: Thursday, June 23, 2011 4:43 PM To: Igor Grinberg Cc: Govindarajan, Sriramakrishnan; u-boot@lists.denx.de Subject: Re: [U-Boot] [PATCH 2/3] omap3evm: Update ethernet reset sequence for Rev.G board
-----Original Message----- From: Igor Grinberg [mailto:grinberg@compulab.co.il] Sent: Thursday, June 23, 2011 2:38 PM To: Premi, Sanjeev Cc: u-boot@lists.denx.de; Govindarajan, Sriramakrishnan Subject: Re: [U-Boot] [PATCH 2/3] omap3evm: Update ethernet reset sequence for Rev.G board
Hi Sanjeev,
On 06/22/11 22:24, Sanjeev Premi wrote:
From: Sriramakrishnan srk@ti.com
The GPIO pin used for resetting the external LAN chip has changed for Rev.G board.
Signed-off-by: Sriramakrishnan srk@ti.com Signed-off-by: Sanjeev Premi premi@ti.com
board/ti/evm/evm.c | 27 ++++++++++++++++++--------- 1 files changed, 18 insertions(+), 9 deletions(-)
[snip]...[snip]
- /* Send a pulse on the GPIO pin */
- writel(pin, &gpio_base->setdataout); udelay(1);
- writel(GPIO0, &gpio3_base->cleardataout);
- writel(pin, &gpio_base->cleardataout); udelay(1);
- writel(GPIO0, &gpio3_base->setdataout);
- writel(pin, &gpio_base->setdataout);
Why keep messing with the gpio registers? Why not use gpio framework? Though it is omap specific, but it will be much cleaner then the above.
[sp] I guess the intent was to keep code similar. But yes, gpio framework can be used.
[sp] Sorry, mail went earlier than I wanted :(
The only issue is that I couln't see gpio framework for omap. Let me dig further...
[sp] Implementing GPIO for OMAP would be a long task. It should be done for long term; but is it necessary pre-condition for the patch?
There is no need to implement GPIO for OMAP. It is already there, you just need to use it instead of writing directly to the GPIO registers. You can find all the implementation in: arch/arm/cpu/armv7/omap3/gpio.c and the header is: arch/arm/include/asm/arch-omap3/gpio.h
[sp] No wonder, I couldn't find it in drivers/gpio. (Didn't occur that it could be in ARCH specific dir)
Will rebase and send an updated patch soon.
~sanjeev
All you need is to include the header, request the appropriate gpio, send the pulse and maybe (if you don't need it anymore) free that gpio. This is not hard or long at all.
-- Regards, Igor.

Dear Sanjeev Premi,
In message 1308770649-3802-3-git-send-email-premi@ti.com you wrote:
- if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1) {
gpio_base = (struct gpio *)OMAP34XX_GPIO3_BASE;
pin = GPIO0; /* Output pin: GPIO Bank 3, pin 0 */
- } else {
gpio_base = (struct gpio *)OMAP34XX_GPIO1_BASE;
pin = GPIO7; /* Output pin: GPIO Bank 0, pin 7 */
Is this bank 0 or bank 1?
Best regards,
Wolfgang Denk

These functions are not required when CONFIG_CMD_NET is not defined: - setup_net_chip() - reset_net_chip() - board_eth_init()
This patch wraps them in #ifdef CONFIG_CMD_NET...#endif
Signed-off-by: Sanjeev Premi premi@ti.com --- board/ti/evm/evm.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/board/ti/evm/evm.c b/board/ti/evm/evm.c index 57e5fa5..599e366 100644 --- a/board/ti/evm/evm.c +++ b/board/ti/evm/evm.c @@ -149,6 +149,7 @@ void set_muxconf_regs(void) MUX_EVM(); }
+#ifdef CONFIG_CMD_NET /* * Routine: setup_net_chip * Description: Setting up the configuration GPMC registers specific to the @@ -211,3 +212,4 @@ int board_eth_init(bd_t *bis) #endif return rc; } +#endif /* CONFIG_CMD_NET */
participants (4)
-
Igor Grinberg
-
Premi, Sanjeev
-
Sanjeev Premi
-
Wolfgang Denk