dm: Make driver model available before board_init()
authorSimon Glass <sjg@chromium.org>
Wed, 3 Sep 2014 23:37:01 +0000 (17:37 -0600)
committerSimon Glass <sjg@chromium.org>
Wed, 10 Sep 2014 18:59:58 +0000 (12:59 -0600)
For some boards board_init() will change GPIOs, so we need to have driver
model available before then. Adjust the board init to arrange this, but
enable it for driver model only, just to be safe.

This does create additional #ifdef logic, but it is safer than trying to
make a pervasive change which may cause some boards to break.

Signed-off-by: Simon Glass <sjg@chromium.org>
common/board_r.c
common/stdio.c
include/stdio_dev.h

index 64beae5f348f22f834be6711a30cc99230d34bb6..6ac2b7e1601ec5e54230596a1114ca0262dfc063 100644 (file)
@@ -715,6 +715,15 @@ init_fnc_t init_sequence_r[] = {
        /* TODO: could x86/PPC have this also perhaps? */
 #ifdef CONFIG_ARM
        initr_caches,
+#endif
+       initr_reloc_global_data,
+       initr_barrier,
+       initr_malloc,
+       bootstage_relocate,
+#ifdef CONFIG_DM
+       initr_dm,
+#endif
+#ifdef CONFIG_ARM
        board_init,     /* Setup chipselects */
 #endif
        /*
@@ -726,16 +735,7 @@ init_fnc_t init_sequence_r[] = {
 #ifdef CONFIG_CLOCKS
        set_cpu_clk_info, /* Setup clock information */
 #endif
-       initr_reloc_global_data,
-       initr_barrier,
-       initr_malloc,
-       bootstage_relocate,
-#ifdef CONFIG_DM_SERIAL
-       stdio_init,
-#endif
-#ifdef CONFIG_DM
-       initr_dm,
-#endif
+       stdio_init_tables,
        initr_serial,
        initr_announce,
        INIT_FUNC_WATCHDOG_RESET
@@ -821,9 +821,7 @@ init_fnc_t init_sequence_r[] = {
         */
        initr_pci,
 #endif
-#ifndef CONFIG_DM_SERIAL
-       stdio_init,
-#endif
+       stdio_add_devices,
        initr_jumptable,
 #ifdef CONFIG_API
        initr_api,
index 692ca7f1cdf595ddb548673b4131983e41e2a6b1..c878103a4826b6d9f72b669125523a9b613d6bb3 100644 (file)
@@ -215,7 +215,7 @@ int stdio_deregister(const char *devname)
 }
 #endif /* CONFIG_SYS_STDIO_DEREGISTER */
 
-int stdio_init (void)
+int stdio_init_tables(void)
 {
 #if defined(CONFIG_NEEDS_MANUAL_RELOC)
        /* already relocated for current ARM implementation */
@@ -232,6 +232,11 @@ int stdio_init (void)
        /* Initialize the list */
        INIT_LIST_HEAD(&(devs.list));
 
+       return 0;
+}
+
+int stdio_add_devices(void)
+{
 #ifdef CONFIG_SYS_I2C
        i2c_init_all();
 #else
@@ -265,5 +270,14 @@ int stdio_init (void)
 #ifdef CONFIG_CBMEM_CONSOLE
        cbmemc_init();
 #endif
-       return (0);
+
+       return 0;
+}
+
+int stdio_init(void)
+{
+       stdio_init_tables();
+       stdio_add_devices();
+
+       return 0;
 }
index a7d0825c7e52fe86c5d6c9d94d7283b6d427b755..268de8ea70058b7500bc4b75e07d5371aba653fb 100644 (file)
@@ -78,7 +78,29 @@ extern char *stdio_names[MAX_FILES];
  */
 int    stdio_register (struct stdio_dev * dev);
 int stdio_register_dev(struct stdio_dev *dev, struct stdio_dev **devp);
-int    stdio_init (void);
+
+/**
+ * stdio_init_tables() - set up stdio tables ready for devices
+ *
+ * This does not add any devices, but just prepares stdio for use.
+ */
+int stdio_init_tables(void);
+
+/**
+ * stdio_add_devices() - Add stdio devices to the table
+ *
+ * This makes calls to all the various subsystems that use stdio, to make
+ * them register with stdio.
+ */
+int stdio_add_devices(void);
+
+/**
+ * stdio_init() - Sets up stdio ready for use
+ *
+ * This calls stdio_init_tables() and stdio_add_devices()
+ */
+int stdio_init(void);
+
 void   stdio_print_current_devices(void);
 #ifdef CONFIG_SYS_STDIO_DEREGISTER
 int    stdio_deregister(const char *devname);