]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ARM: tegra: harmony: init regulators, PCIe when booting from DT
authorStephen Warren <swarren@nvidia.com>
Wed, 2 May 2012 21:47:12 +0000 (15:47 -0600)
committerStephen Warren <swarren@nvidia.com>
Wed, 20 Jun 2012 18:37:42 +0000 (12:37 -0600)
There currently aren't bindings for the Tegra PCIe controller. Work on
this is in progress, but not yet complete. Manually initialize PCIe when
booting from device tree, in order to bring DT support to the same
feature level as board files, which will in turn allow board files to be
deprecated.

PCIe on Harmony requires various regulators to be registered and enabled
before initializing the PCIe controller. Note that since the I2C
controllers are instantiated from DT, we must use i2c_new_device() to
register the PMU rather than i2c_register_board_info().

Signed-off-by: Stephen Warren <swarren@nvidia.com>
arch/arm/mach-tegra/board-dt-tegra20.c
arch/arm/mach-tegra/board-harmony-pcie.c
arch/arm/mach-tegra/board-harmony-power.c
arch/arm/mach-tegra/board.h

index 9537f20384fc98150ece65a5fa54de3359128fed..777138611c77ef24c8cc0d6455d02554dace83e0 100644 (file)
@@ -109,6 +109,23 @@ static void __init trimslice_init(void)
 }
 #endif
 
+#ifdef CONFIG_MACH_HARMONY
+static void __init harmony_init(void)
+{
+       int ret;
+
+       ret = harmony_regulator_init();
+       if (ret) {
+               pr_err("harmony_regulator_init() failed: %d\n", ret);
+               return;
+       }
+
+       ret = harmony_pcie_init();
+       if (ret)
+               pr_err("harmony_pcie_init() failed: %d\n", ret);
+}
+#endif
+
 static struct {
        char *machine;
        void (*init)(void);
@@ -116,6 +133,9 @@ static struct {
 #ifdef CONFIG_MACH_TRIMSLICE
        { "compulab,trimslice", trimslice_init },
 #endif
+#ifdef CONFIG_MACH_HARMONY
+       { "nvidia,harmony", harmony_init },
+#endif
 };
 
 static void __init tegra_dt_init_late(void)
index 33c4fedab840fc42fee9232fb2d1d581d85ba7d8..e8c3fda9bec2faa0665372c04ffbcb8cd22f448f 100644 (file)
 
 #ifdef CONFIG_TEGRA_PCI
 
-static int __init harmony_pcie_init(void)
+int __init harmony_pcie_init(void)
 {
        struct regulator *regulator = NULL;
        int err;
 
-       if (!machine_is_harmony())
-               return 0;
-
        err = gpio_request(TEGRA_GPIO_EN_VDD_1V05_GPIO, "EN_VDD_1V05");
        if (err)
                return err;
@@ -62,7 +59,15 @@ err_reg:
        return err;
 }
 
+static int __init harmony_pcie_initcall(void)
+{
+       if (!machine_is_harmony())
+               return 0;
+
+       return harmony_pcie_init();
+}
+
 /* PCI should be initialized after I2C, mfd and regulators */
-subsys_initcall_sync(harmony_pcie_init);
+subsys_initcall_sync(harmony_pcie_initcall);
 
 #endif
index 82f32300796c082fe4f76c938ba76ac9b4bb1ff2..44dcb2e869b50ddbf64277c16c38a6790ad31b4a 100644 (file)
 #include <linux/gpio.h>
 #include <linux/regulator/machine.h>
 #include <linux/mfd/tps6586x.h>
+#include <linux/of.h>
+#include <linux/of_i2c.h>
+
+#include <asm/mach-types.h>
 
 #include <mach/irqs.h>
 
@@ -110,7 +114,26 @@ static struct i2c_board_info __initdata harmony_regulators[] = {
 
 int __init harmony_regulator_init(void)
 {
-       i2c_register_board_info(3, harmony_regulators, 1);
+       if (machine_is_harmony()) {
+               i2c_register_board_info(3, harmony_regulators, 1);
+       } else { /* Harmony, booted using device tree */
+               struct device_node *np;
+               struct i2c_adapter *adapter;
+
+               np = of_find_node_by_path("/i2c@7000d000");
+               if (np == NULL) {
+                       pr_err("Could not find device_node for DVC I2C\n");
+                       return -ENODEV;
+               }
+
+               adapter = of_find_i2c_adapter_by_node(np);
+               if (!adapter) {
+                       pr_err("Could not find i2c_adapter for DVC I2C\n");
+                       return -ENODEV;
+               }
+
+               i2c_new_device(adapter, harmony_regulators);
+       }
 
        return 0;
 }
index 65014968fc6c05ad1144c421856034b40756f037..097e0e16eacdfd0311ce56f8705aafd48b22e879 100644 (file)
@@ -46,5 +46,12 @@ int __init tegra_powergate_debugfs_init(void);
 static inline int tegra_powergate_debugfs_init(void) { return 0; }
 #endif
 
+int __init harmony_regulator_init(void);
+#ifdef CONFIG_TEGRA_PCI
+int __init harmony_pcie_init(void);
+#else
+static inline int harmony_pcie_init(void) { return 0; }
+#endif
+
 extern struct sys_timer tegra_timer;
 #endif