[U-Boot] [PATCH v3] TI: DaVinci DM365: Enabling network Support on DM365 EVM

From: Sandeep Paulraj s-paulraj@ti.com
This patch enables EMAC on the DM365 EVM.
Signed-off-by: Sandeep Paulraj s-paulraj@ti.com --- Changes since v1: Using a memory map to manipulate GPIO registers. This was suggested by Wolfgang.
Changes since v2: Improve Bit handling.
When compiling with this patch DM365 will still give compilation issues as i have to send an update to the EMAC driver for DM365. Patch to follow.
board/davinci/dm365evm/dm365evm.c | 43 +++++++++++++++++++++++++++++++++++++ 1 files changed, 43 insertions(+), 0 deletions(-)
diff --git a/board/davinci/dm365evm/dm365evm.c b/board/davinci/dm365evm/dm365evm.c index 99392b3..5b97060 100644 --- a/board/davinci/dm365evm/dm365evm.c +++ b/board/davinci/dm365evm/dm365evm.c @@ -17,9 +17,12 @@
#include <common.h> #include <nand.h> +#include <asm/io.h> #include <asm/arch/hardware.h> #include <asm/arch/emif_defs.h> #include <asm/arch/nand_defs.h> +#include <asm/arch/gpio_defs.h> +#include <netdev.h> #include "../common/misc.h"
DECLARE_GLOBAL_DATA_PTR; @@ -32,6 +35,46 @@ int board_init(void) return 0; }
+#ifdef CONFIG_DRIVER_TI_EMAC +int board_eth_init(bd_t *bis) +{ + uint8_t eeprom_enetaddr[6]; + int i; + struct davinci_gpio *gpio1_base = + (struct davinci_gpio *)DAVINCI_GPIO_BANK01; + + /* Configure PINMUX 3 to enable EMAC pins */ + writel((readl(PINMUX3) | 0x1affff), PINMUX3); + + /* Configure GPIO20 as output */ + writel((readl(&gpio1_base->dir) & ~(1 << 20)), &gpio1_base->dir); + + /* Toggle GPIO 20 */ + for (i = 0; i < 20; i++) { + /* GPIO 20 low */ + writel((readl(&gpio1_base->out_data) & ~(1 << 20)), + &gpio1_base->out_data); + + udelay(1000); + + /* GPIO 20 high */ + writel((readl(&gpio1_base->out_data) | (1 << 20)), + &gpio1_base->out_data); + } + + /* Configure I2C pins so that EEPROM can be read */ + writel((readl(PINMUX3) | 0x01400000), PINMUX3); + + /* Read Ethernet MAC address from EEPROM */ + if (dvevm_read_mac_address(eeprom_enetaddr)) + dv_configure_mac_address(eeprom_enetaddr); + + davinci_emac_initialize(); + + return 0; +} +#endif + #ifdef CONFIG_NAND_DAVINCI static void nand_dm365evm_select_chip(struct mtd_info *mtd, int chip) {

s-paulraj@ti.com wrote:
From: Sandeep Paulraj s-paulraj@ti.com
This patch enables EMAC on the DM365 EVM.
Signed-off-by: Sandeep Paulraj s-paulraj@ti.com
Changes since v1: Using a memory map to manipulate GPIO registers. This was suggested by Wolfgang.
Changes since v2: Improve Bit handling.
When compiling with this patch DM365 will still give compilation issues as i have to send an update to the EMAC driver for DM365. Patch to follow.
board/davinci/dm365evm/dm365evm.c | 43 +++++++++++++++++++++++++++++++++++++ 1 files changed, 43 insertions(+), 0 deletions(-)
diff --git a/board/davinci/dm365evm/dm365evm.c b/board/davinci/dm365evm/dm365evm.c index 99392b3..5b97060 100644 --- a/board/davinci/dm365evm/dm365evm.c +++ b/board/davinci/dm365evm/dm365evm.c @@ -17,9 +17,12 @@
#include <common.h> #include <nand.h> +#include <asm/io.h> #include <asm/arch/hardware.h> #include <asm/arch/emif_defs.h> #include <asm/arch/nand_defs.h> +#include <asm/arch/gpio_defs.h> +#include <netdev.h> #include "../common/misc.h"
DECLARE_GLOBAL_DATA_PTR; @@ -32,6 +35,46 @@ int board_init(void) return 0; }
+#ifdef CONFIG_DRIVER_TI_EMAC +int board_eth_init(bd_t *bis) +{
- uint8_t eeprom_enetaddr[6];
- int i;
- struct davinci_gpio *gpio1_base =
(struct davinci_gpio *)DAVINCI_GPIO_BANK01;
- /* Configure PINMUX 3 to enable EMAC pins */
- writel((readl(PINMUX3) | 0x1affff), PINMUX3);
- /* Configure GPIO20 as output */
- writel((readl(&gpio1_base->dir) & ~(1 << 20)), &gpio1_base->dir);
- /* Toggle GPIO 20 */
- for (i = 0; i < 20; i++) {
/* GPIO 20 low */
writel((readl(&gpio1_base->out_data) & ~(1 << 20)),
&gpio1_base->out_data);
udelay(1000);
/* GPIO 20 high */
writel((readl(&gpio1_base->out_data) | (1 << 20)),
&gpio1_base->out_data);
- }
- /* Configure I2C pins so that EEPROM can be read */
- writel((readl(PINMUX3) | 0x01400000), PINMUX3);
- /* Read Ethernet MAC address from EEPROM */
- if (dvevm_read_mac_address(eeprom_enetaddr))
dv_configure_mac_address(eeprom_enetaddr);
- davinci_emac_initialize();
- return 0;
+} +#endif
#ifdef CONFIG_NAND_DAVINCI static void nand_dm365evm_select_chip(struct mtd_info *mtd, int chip) {
Ack Tom

Hi Sandeep,
s-paulraj@ti.com wrote:
From: Sandeep Paulraj s-paulraj@ti.com
This patch enables EMAC on the DM365 EVM.
Signed-off-by: Sandeep Paulraj s-paulraj@ti.com
<snip>
- /* Read Ethernet MAC address from EEPROM */
- if (dvevm_read_mac_address(eeprom_enetaddr))
dv_configure_mac_address(eeprom_enetaddr);
You should get rid of this function (dv_configure_mac_address), as it duplicates logic already present in net/eth.c, albeit in a different order. Mike Frysinger has invested a lot of effort in cleaning this up (and documenting it too). The correct behavior is as follows:
1. davinci_emac_initialize() should read programmed MAC address from ROM and stuff it into dev->enetaddr 2. eth_initialize() (in net/eth.c) reads from the environment and compares to the value in dev->enetaddr, warning on mismatch.
- davinci_emac_initialize();
- return 0;
+} +#endif
#ifdef CONFIG_NAND_DAVINCI static void nand_dm365evm_select_chip(struct mtd_info *mtd, int chip) {
regards, Ben

Hi Sandeep,
s-paulraj@ti.com wrote:
From: Sandeep Paulraj s-paulraj@ti.com
This patch enables EMAC on the DM365 EVM.
Signed-off-by: Sandeep Paulraj s-paulraj@ti.com
<snip> > + /* Read Ethernet MAC address from EEPROM */ > + if (dvevm_read_mac_address(eeprom_enetaddr)) > + dv_configure_mac_address(eeprom_enetaddr); > + > You should get rid of this function (dv_configure_mac_address), as it duplicates logic already present in net/eth.c, albeit in a different order. Mike Frysinger has invested a lot of effort in cleaning this up (and documenting it too). The correct behavior is as follows:
- davinci_emac_initialize() should read programmed MAC address from ROM
and stuff it into dev->enetaddr 2. eth_initialize() (in net/eth.c) reads from the environment and compares to the value in dev->enetaddr, warning on mismatch.
I will take a look at this as I have not followed this discussion. I know that the NET_MULTI updates broke DM9000 and EMAC on DaVinci SOC s which I fixed I will post follow up patches after studying Mike updates. Getting rid of this as you suggest involves multiple boards so I have to test as well.
And besides I have to clean up the davinci EMAC driver as well because there are other DaVinci SOCs which will use that driver albeit with some updates.
Updates for DaVinci EMAC are going to be sent soon. The header for this patch also says that.
- davinci_emac_initialize();
- return 0;
+} +#endif
#ifdef CONFIG_NAND_DAVINCI static void nand_dm365evm_select_chip(struct mtd_info *mtd, int chip) {
regards, Ben
Thanks, Sandeep
participants (4)
-
Ben Warren
-
Paulraj, Sandeep
-
s-paulraj@ti.com
-
Tom