summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2018-11-01 19:25:54 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2018-11-02 07:34:43 +0100
commitfe1901c17fbe16497a3c2b129b45b37f03564cfe (patch)
tree7ecc32a83ab6aa9f983a329fdf6799008940c8b2
parentc8e09aaad36cdb2a7ca99607d20f2c949ca755e6 (diff)
downloadbarebox-fe1901c17fbe16497a3c2b129b45b37f03564cfe.tar.gz
barebox-fe1901c17fbe16497a3c2b129b45b37f03564cfe.tar.xz
ARM: rdu2: program e1000 iNVM
Check if the iNVM is already correctly written. If it isn't write the correct value in, so the device uses the correct PCI ID for the Linux driver. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--arch/arm/boards/zii-imx6q-rdu2/board.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/arch/arm/boards/zii-imx6q-rdu2/board.c b/arch/arm/boards/zii-imx6q-rdu2/board.c
index 49cc234c02..960c5ba533 100644
--- a/arch/arm/boards/zii-imx6q-rdu2/board.c
+++ b/arch/arm/boards/zii-imx6q-rdu2/board.c
@@ -15,6 +15,7 @@
#include <common.h>
#include <envfs.h>
+#include <fs.h>
#include <gpio.h>
#include <i2c/i2c.h>
#include <init.h>
@@ -226,3 +227,32 @@ static int rdu2_ethernet_init(void)
return 0;
}
late_initcall(rdu2_ethernet_init);
+
+#define I210_CFGWORD_PCIID_157B 0x157b1a11
+static int rdu2_i210_invm(void)
+{
+ int fd;
+ u32 val;
+
+ if (!of_machine_is_compatible("zii,imx6q-zii-rdu2") &&
+ !of_machine_is_compatible("zii,imx6qp-zii-rdu2"))
+ return 0;
+
+ fd = open("/dev/e1000-invm0", O_RDWR);
+ if (fd < 0) {
+ pr_err("could not open e1000 iNVM device!\n");
+ return fd;
+ }
+
+ pread(fd, &val, sizeof(val), 0);
+ if (val == I210_CFGWORD_PCIID_157B) {
+ pr_debug("i210 already programmed correctly\n");
+ return 0;
+ }
+
+ val = I210_CFGWORD_PCIID_157B;
+ pwrite(fd, &val, sizeof(val), 0);
+
+ return 0;
+}
+late_initcall(rdu2_i210_invm);