]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - board/sunxi/board.c
ppc4xx: Remove sc3 board
[karo-tx-uboot.git] / board / sunxi / board.c
index 0c9d3b802968908f46c848cbd1366046723ae7b8..d9f76913730fc3c06212e736209e157a83beab77 100644 (file)
@@ -28,7 +28,8 @@
 #include <asm/arch/dram.h>
 #include <asm/arch/gpio.h>
 #include <asm/arch/mmc.h>
-#include <asm/arch/usbc.h>
+#include <asm/arch/usb_phy.h>
+#include <asm/gpio.h>
 #include <asm/io.h>
 #include <linux/usb/musb.h>
 #include <net.h>
 /* So that we can use pin names in Kconfig and sunxi_name_to_gpio() */
 int soft_i2c_gpio_sda;
 int soft_i2c_gpio_scl;
+
+static int soft_i2c_board_init(void)
+{
+       int ret;
+
+       soft_i2c_gpio_sda = sunxi_name_to_gpio(CONFIG_VIDEO_LCD_PANEL_I2C_SDA);
+       if (soft_i2c_gpio_sda < 0) {
+               printf("Error invalid soft i2c sda pin: '%s', err %d\n",
+                      CONFIG_VIDEO_LCD_PANEL_I2C_SDA, soft_i2c_gpio_sda);
+               return soft_i2c_gpio_sda;
+       }
+       ret = gpio_request(soft_i2c_gpio_sda, "soft-i2c-sda");
+       if (ret) {
+               printf("Error requesting soft i2c sda pin: '%s', err %d\n",
+                      CONFIG_VIDEO_LCD_PANEL_I2C_SDA, ret);
+               return ret;
+       }
+
+       soft_i2c_gpio_scl = sunxi_name_to_gpio(CONFIG_VIDEO_LCD_PANEL_I2C_SCL);
+       if (soft_i2c_gpio_scl < 0) {
+               printf("Error invalid soft i2c scl pin: '%s', err %d\n",
+                      CONFIG_VIDEO_LCD_PANEL_I2C_SCL, soft_i2c_gpio_scl);
+               return soft_i2c_gpio_scl;
+       }
+       ret = gpio_request(soft_i2c_gpio_scl, "soft-i2c-scl");
+       if (ret) {
+               printf("Error requesting soft i2c scl pin: '%s', err %d\n",
+                      CONFIG_VIDEO_LCD_PANEL_I2C_SCL, ret);
+               return ret;
+       }
+
+       return 0;
+}
+#else
+static int soft_i2c_board_init(void) { return 0; }
 #endif
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -44,7 +80,7 @@ DECLARE_GLOBAL_DATA_PTR;
 /* add board specific code here */
 int board_init(void)
 {
-       int id_pfr1;
+       int id_pfr1, ret;
 
        gd->bd->bi_boot_params = (PHYS_SDRAM_0 + 0x100);
 
@@ -57,7 +93,12 @@ int board_init(void)
                asm volatile("mcr p15, 0, %0, c14, c0, 0" : : "r"(24000000));
        }
 
-       return 0;
+       ret = axp_gpio_init();
+       if (ret)
+               return ret;
+
+       /* Uses dm gpio code so do this here and not in i2c_init_board() */
+       return soft_i2c_board_init();
 }
 
 int dram_init(void)
@@ -276,12 +317,80 @@ int board_mmc_init(bd_t *bis)
 
 void i2c_init_board(void)
 {
-       sunxi_gpio_set_cfgpin(SUNXI_GPB(0), SUNXI_GPB_TWI0);
-       sunxi_gpio_set_cfgpin(SUNXI_GPB(1), SUNXI_GPB_TWI0);
+#ifdef CONFIG_I2C0_ENABLE
+#if defined(CONFIG_MACH_SUN4I) || defined(CONFIG_MACH_SUN5I) || defined(CONFIG_MACH_SUN7I)
+       sunxi_gpio_set_cfgpin(SUNXI_GPB(0), SUN4I_GPB_TWI0);
+       sunxi_gpio_set_cfgpin(SUNXI_GPB(1), SUN4I_GPB_TWI0);
        clock_twi_onoff(0, 1);
-#if defined CONFIG_VIDEO_LCD_PANEL_I2C && !(defined CONFIG_SPL_BUILD)
-       soft_i2c_gpio_sda = sunxi_name_to_gpio(CONFIG_VIDEO_LCD_PANEL_I2C_SDA);
-       soft_i2c_gpio_scl = sunxi_name_to_gpio(CONFIG_VIDEO_LCD_PANEL_I2C_SCL);
+#elif defined(CONFIG_MACH_SUN6I)
+       sunxi_gpio_set_cfgpin(SUNXI_GPH(14), SUN6I_GPH_TWI0);
+       sunxi_gpio_set_cfgpin(SUNXI_GPH(15), SUN6I_GPH_TWI0);
+       clock_twi_onoff(0, 1);
+#elif defined(CONFIG_MACH_SUN8I)
+       sunxi_gpio_set_cfgpin(SUNXI_GPH(2), SUN8I_GPH_TWI0);
+       sunxi_gpio_set_cfgpin(SUNXI_GPH(3), SUN8I_GPH_TWI0);
+       clock_twi_onoff(0, 1);
+#endif
+#endif
+
+#ifdef CONFIG_I2C1_ENABLE
+#if defined(CONFIG_MACH_SUN4I) || defined(CONFIG_MACH_SUN7I)
+       sunxi_gpio_set_cfgpin(SUNXI_GPB(18), SUN4I_GPB_TWI1);
+       sunxi_gpio_set_cfgpin(SUNXI_GPB(19), SUN4I_GPB_TWI1);
+       clock_twi_onoff(1, 1);
+#elif defined(CONFIG_MACH_SUN5I)
+       sunxi_gpio_set_cfgpin(SUNXI_GPB(15), SUN5I_GPB_TWI1);
+       sunxi_gpio_set_cfgpin(SUNXI_GPB(16), SUN5I_GPB_TWI1);
+       clock_twi_onoff(1, 1);
+#elif defined(CONFIG_MACH_SUN6I)
+       sunxi_gpio_set_cfgpin(SUNXI_GPH(16), SUN6I_GPH_TWI1);
+       sunxi_gpio_set_cfgpin(SUNXI_GPH(17), SUN6I_GPH_TWI1);
+       clock_twi_onoff(1, 1);
+#elif defined(CONFIG_MACH_SUN8I)
+       sunxi_gpio_set_cfgpin(SUNXI_GPH(4), SUN8I_GPH_TWI1);
+       sunxi_gpio_set_cfgpin(SUNXI_GPH(5), SUN8I_GPH_TWI1);
+       clock_twi_onoff(1, 1);
+#endif
+#endif
+
+#ifdef CONFIG_I2C2_ENABLE
+#if defined(CONFIG_MACH_SUN4I) || defined(CONFIG_MACH_SUN7I)
+       sunxi_gpio_set_cfgpin(SUNXI_GPB(20), SUN4I_GPB_TWI2);
+       sunxi_gpio_set_cfgpin(SUNXI_GPB(21), SUN4I_GPB_TWI2);
+       clock_twi_onoff(2, 1);
+#elif defined(CONFIG_MACH_SUN5I)
+       sunxi_gpio_set_cfgpin(SUNXI_GPB(17), SUN5I_GPB_TWI2);
+       sunxi_gpio_set_cfgpin(SUNXI_GPB(18), SUN5I_GPB_TWI2);
+       clock_twi_onoff(2, 1);
+#elif defined(CONFIG_MACH_SUN6I)
+       sunxi_gpio_set_cfgpin(SUNXI_GPH(18), SUN6I_GPH_TWI2);
+       sunxi_gpio_set_cfgpin(SUNXI_GPH(19), SUN6I_GPH_TWI2);
+       clock_twi_onoff(2, 1);
+#elif defined(CONFIG_MACH_SUN8I)
+       sunxi_gpio_set_cfgpin(SUNXI_GPE(12), SUN8I_GPE_TWI2);
+       sunxi_gpio_set_cfgpin(SUNXI_GPE(13), SUN8I_GPE_TWI2);
+       clock_twi_onoff(2, 1);
+#endif
+#endif
+
+#ifdef CONFIG_I2C3_ENABLE
+#if defined(CONFIG_MACH_SUN6I)
+       sunxi_gpio_set_cfgpin(SUNXI_GPG(10), SUN6I_GPG_TWI3);
+       sunxi_gpio_set_cfgpin(SUNXI_GPG(11), SUN6I_GPG_TWI3);
+       clock_twi_onoff(3, 1);
+#elif defined(CONFIG_MACH_SUN7I)
+       sunxi_gpio_set_cfgpin(SUNXI_GPI(0), SUN7I_GPI_TWI3);
+       sunxi_gpio_set_cfgpin(SUNXI_GPI(1), SUN7I_GPI_TWI3);
+       clock_twi_onoff(3, 1);
+#endif
+#endif
+
+#ifdef CONFIG_I2C4_ENABLE
+#if defined(CONFIG_MACH_SUN7I)
+       sunxi_gpio_set_cfgpin(SUNXI_GPI(2), SUN7I_GPI_TWI4);
+       sunxi_gpio_set_cfgpin(SUNXI_GPI(3), SUN7I_GPI_TWI4);
+       clock_twi_onoff(4, 1);
+#endif
 #endif
 }
 
@@ -343,6 +452,8 @@ void sunxi_board_init(void)
 #endif
 
 #if defined(CONFIG_MUSB_HOST) || defined(CONFIG_MUSB_GADGET)
+extern const struct musb_platform_ops sunxi_musb_ops;
+
 static struct musb_hdrc_config musb_config = {
        .multipoint     = 1,
        .dyn_fifo       = 1,
@@ -372,22 +483,37 @@ int g_dnl_board_usb_cable_connected(void)
 #ifdef CONFIG_MISC_INIT_R
 int misc_init_r(void)
 {
+       char serial_string[17] = { 0 };
        unsigned int sid[4];
+       uint8_t mac_addr[6];
+       int ret;
+
+       ret = sunxi_get_sid(sid);
+       if (ret == 0 && sid[0] != 0 && sid[3] != 0) {
+               if (!getenv("ethaddr")) {
+                       /* Non OUI / registered MAC address */
+                       mac_addr[0] = 0x02;
+                       mac_addr[1] = (sid[0] >>  0) & 0xff;
+                       mac_addr[2] = (sid[3] >> 24) & 0xff;
+                       mac_addr[3] = (sid[3] >> 16) & 0xff;
+                       mac_addr[4] = (sid[3] >>  8) & 0xff;
+                       mac_addr[5] = (sid[3] >>  0) & 0xff;
+
+                       eth_setenv_enetaddr("ethaddr", mac_addr);
+               }
 
-       if (!getenv("ethaddr") && sunxi_get_sid(sid) == 0 &&
-                       sid[0] != 0 && sid[3] != 0) {
-               uint8_t mac_addr[6];
-
-               mac_addr[0] = 0x02; /* Non OUI / registered MAC address */
-               mac_addr[1] = (sid[0] >>  0) & 0xff;
-               mac_addr[2] = (sid[3] >> 24) & 0xff;
-               mac_addr[3] = (sid[3] >> 16) & 0xff;
-               mac_addr[4] = (sid[3] >>  8) & 0xff;
-               mac_addr[5] = (sid[3] >>  0) & 0xff;
+               if (!getenv("serial#")) {
+                       snprintf(serial_string, sizeof(serial_string),
+                               "%08x%08x", sid[0], sid[3]);
 
-               eth_setenv_enetaddr("ethaddr", mac_addr);
+                       setenv("serial#", serial_string);
+               }
        }
 
+       ret = sunxi_usb_phy_probe();
+       if (ret)
+               return ret;
+
 #if defined(CONFIG_MUSB_HOST) || defined(CONFIG_MUSB_GADGET)
        musb_register(&musb_plat, NULL, (void *)SUNXI_USB0_BASE);
 #endif