diff options
author | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2013-09-20 07:47:44 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2013-09-23 08:22:19 +0200 |
commit | 6e419891d209ebbae87b361a90c089fec747693a (patch) | |
tree | 5724bd71829ff221d3768cbbc5d6870a96572a50 /arch/arm/boards/animeo_ip/init.c | |
parent | 3293c860ab539de5e35bc29907ed7bd2cd1e5ad6 (diff) | |
download | barebox-6e419891d209ebbae87b361a90c089fec747693a.tar.gz barebox-6e419891d209ebbae87b361a90c089fec747693a.tar.xz |
animeo_ip: ensure the phy is reset correctly
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/boards/animeo_ip/init.c')
-rw-r--r-- | arch/arm/boards/animeo_ip/init.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/arch/arm/boards/animeo_ip/init.c b/arch/arm/boards/animeo_ip/init.c index 06d542e58d..b30605dd3d 100644 --- a/arch/arm/boards/animeo_ip/init.c +++ b/arch/arm/boards/animeo_ip/init.c @@ -19,6 +19,7 @@ #include <nand.h> #include <sizes.h> #include <linux/mtd/nand.h> +#include <linux/clk.h> #include <mach/board.h> #include <mach/at91sam9_smc.h> #include <gpio.h> @@ -208,12 +209,45 @@ static void animeo_ip_power_control(void) animeo_export_gpio_out(AT91_PIN_PC4, "power_save"); } +static void animeo_ip_phy_reset(void) +{ + unsigned long rstc; + int i; + struct clk *clk = clk_get(NULL, "macb_clk"); + + clk_enable(clk); + + for (i = AT91_PIN_PA12; i <= AT91_PIN_PA29; i++) + at91_set_gpio_input(i, 0); + + rstc = at91_sys_read(AT91_RSTC_MR) & AT91_RSTC_ERSTL; + + /* Need to reset PHY -> 500ms reset */ + at91_sys_write(AT91_RSTC_MR, AT91_RSTC_KEY | + (AT91_RSTC_ERSTL & (0x0d << 8)) | + AT91_RSTC_URSTEN); + + at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_EXTRST); + + /* Wait for end hardware reset */ + while (!(at91_sys_read(AT91_RSTC_SR) & AT91_RSTC_NRSTL)) + ; + + /* Restore NRST value */ + at91_sys_write(AT91_RSTC_MR, AT91_RSTC_KEY | (rstc) | AT91_RSTC_URSTEN); +} + +static void animeo_ip_add_device_eth(void) +{ + animeo_ip_phy_reset(); + at91_add_device_eth(0, &macb_pdata); +} + static int animeo_ip_devices_init(void) { animeo_ip_detect_version(); animeo_ip_power_control(); animeo_ip_add_device_nand(); - at91_add_device_eth(0, &macb_pdata); animeo_ip_add_device_mci(); animeo_ip_add_device_buttons(); animeo_ip_add_device_led(); @@ -232,6 +266,8 @@ static int animeo_ip_devices_init(void) devfs_add_partition("nand0", SZ_256K + SZ_32K, SZ_32K, DEVFS_PARTITION_FIXED, "env_raw"); dev_add_bb_dev("env_raw", "env0"); + animeo_ip_add_device_eth(); + return 0; } |