]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - board/st-ericsson/snowball/snowball.c
snowball: applying power to LAN and GBF controllers
[karo-tx-uboot.git] / board / st-ericsson / snowball / snowball.c
index 4bcc649724b65ae22a36f8031353aed0f6fb8186..7c3e08ce3f5602e7b3d3fc58e804030002fea9f4 100644 (file)
@@ -25,6 +25,8 @@
 #include <asm/io.h>
 #include <asm/errno.h>
 #include <asm/arch/db8500_pincfg.h>
+#include <asm/arch/prcmu.h>
+#include <asm/arch/hardware.h>
 
 #include "db8500_pins.h"
 
@@ -164,3 +166,88 @@ int dram_init(void)
 
        return 0;
 }
+
+static int raise_ab8500_gpio16(void)
+{
+       int ret;
+
+       /* selection */
+       ret = ab8500_read(AB8500_MISC, AB8500_GPIO_SEL2_REG);
+       if (ret < 0)
+               goto out;
+
+       ret |= 0x80;
+       ret = ab8500_write(AB8500_MISC, AB8500_GPIO_SEL2_REG, ret);
+       if (ret < 0)
+               goto out;
+
+       /* direction */
+       ret = ab8500_read(AB8500_MISC, AB8500_GPIO_DIR2_REG);
+       if (ret < 0)
+               goto out;
+
+       ret |= 0x80;
+       ret = ab8500_write(AB8500_MISC, AB8500_GPIO_DIR2_REG, ret);
+       if (ret < 0)
+               goto out;
+
+       /* out */
+       ret = ab8500_read(AB8500_MISC, AB8500_GPIO_OUT2_REG);
+       if (ret < 0)
+               goto out;
+
+       ret |= 0x80;
+       ret = ab8500_write(AB8500_MISC, AB8500_GPIO_OUT2_REG, ret);
+
+out:
+       return ret;
+}
+
+static int raise_ab8500_gpio26(void)
+{
+       int ret;
+
+       /* selection */
+       ret = ab8500_read(AB8500_MISC, AB8500_GPIO_DIR4_REG);
+       if (ret < 0)
+               goto out;
+
+       ret |= 0x2;
+       ret = ab8500_write(AB8500_MISC, AB8500_GPIO_DIR4_REG, ret);
+       if (ret < 0)
+               goto out;
+
+       /* out */
+       ret = ab8500_read(AB8500_MISC, AB8500_GPIO_OUT4_REG);
+       if (ret < 0)
+               goto out;
+
+       ret |= 0x2;
+       ret = ab8500_write(AB8500_MISC, AB8500_GPIO_OUT4_REG, ret);
+
+out:
+       return ret;
+}
+
+int board_late_init(void)
+{
+       /* enable 3V3 for LAN controller */
+       if (raise_ab8500_gpio26() >= 0) {
+               /* Turn on FSMC device */
+               writel(0x1, 0x8000f000);
+               writel(0x1, 0x8000f008);
+
+               /* setup FSMC for LAN controler */
+               writel(0x305b, 0x80000000);
+
+               /* run at the highest possible speed */
+               writel(0x01010210, 0x80000004);
+       } else
+               printf("error: can't raise GPIO26\n");
+
+       /* enable 3v6 for GBF chip */
+       if ((raise_ab8500_gpio16() < 0))
+               printf("error: cant' raise GPIO16\n");
+
+       return 0;
+}