Skip to content

Commit

Permalink
ARM: tegra: harmony: init regulators, PCIe when booting from DT
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Stephen Warren committed Jun 20, 2012
1 parent c554dee commit a12c0ef
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 6 deletions.
20 changes: 20 additions & 0 deletions arch/arm/mach-tegra/board-dt-tegra20.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,13 +109,33 @@ 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);
} board_init_funcs[] = {
#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)
Expand Down
15 changes: 10 additions & 5 deletions arch/arm/mach-tegra/board-harmony-pcie.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,11 @@

#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;
Expand Down Expand Up @@ -62,7 +59,15 @@ static int __init harmony_pcie_init(void)
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
25 changes: 24 additions & 1 deletion arch/arm/mach-tegra/board-harmony-power.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
#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>

Expand Down Expand Up @@ -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;
}
7 changes: 7 additions & 0 deletions arch/arm/mach-tegra/board.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit a12c0ef

Please sign in to comment.