summaryrefslogtreecommitdiffstats
path: root/arch/arm/boards/animeo_ip/init.c
diff options
context:
space:
mode:
authorJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>2013-09-20 07:47:44 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2013-09-23 08:22:19 +0200
commit6e419891d209ebbae87b361a90c089fec747693a (patch)
tree5724bd71829ff221d3768cbbc5d6870a96572a50 /arch/arm/boards/animeo_ip/init.c
parent3293c860ab539de5e35bc29907ed7bd2cd1e5ad6 (diff)
downloadbarebox-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.c38
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;
}