diff options
Diffstat (limited to 'arch/arm/mach-tegra/board-harmony-pcie.c')
| -rw-r--r-- | arch/arm/mach-tegra/board-harmony-pcie.c | 49 |
1 files changed, 30 insertions, 19 deletions
diff --git a/arch/arm/mach-tegra/board-harmony-pcie.c b/arch/arm/mach-tegra/board-harmony-pcie.c index e8c3fda9bec2..3cdc1bb8254c 100644 --- a/arch/arm/mach-tegra/board-harmony-pcie.c +++ b/arch/arm/mach-tegra/board-harmony-pcie.c | |||
| @@ -18,35 +18,57 @@ | |||
| 18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
| 19 | #include <linux/gpio.h> | 19 | #include <linux/gpio.h> |
| 20 | #include <linux/err.h> | 20 | #include <linux/err.h> |
| 21 | #include <linux/of_gpio.h> | ||
| 21 | #include <linux/regulator/consumer.h> | 22 | #include <linux/regulator/consumer.h> |
| 22 | 23 | ||
| 23 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
| 24 | 25 | ||
| 25 | #include "board.h" | 26 | #include "board.h" |
| 26 | #include "board-harmony.h" | ||
| 27 | 27 | ||
| 28 | #ifdef CONFIG_TEGRA_PCI | 28 | #ifdef CONFIG_TEGRA_PCI |
| 29 | 29 | ||
| 30 | int __init harmony_pcie_init(void) | 30 | int __init harmony_pcie_init(void) |
| 31 | { | 31 | { |
| 32 | struct device_node *np; | ||
| 33 | int en_vdd_1v05; | ||
| 32 | struct regulator *regulator = NULL; | 34 | struct regulator *regulator = NULL; |
| 33 | int err; | 35 | int err; |
| 34 | 36 | ||
| 35 | err = gpio_request(TEGRA_GPIO_EN_VDD_1V05_GPIO, "EN_VDD_1V05"); | 37 | np = of_find_node_by_path("/regulators/regulator@3"); |
| 36 | if (err) | 38 | if (!np) { |
| 39 | pr_err("%s: of_find_node_by_path failed\n", __func__); | ||
| 40 | return -ENODEV; | ||
| 41 | } | ||
| 42 | |||
| 43 | en_vdd_1v05 = of_get_named_gpio(np, "gpio", 0); | ||
| 44 | if (en_vdd_1v05 < 0) { | ||
| 45 | pr_err("%s: of_get_named_gpio failed: %d\n", __func__, | ||
| 46 | en_vdd_1v05); | ||
| 47 | return en_vdd_1v05; | ||
| 48 | } | ||
| 49 | |||
| 50 | err = gpio_request(en_vdd_1v05, "EN_VDD_1V05"); | ||
| 51 | if (err) { | ||
| 52 | pr_err("%s: gpio_request failed: %d\n", __func__, err); | ||
| 37 | return err; | 53 | return err; |
| 54 | } | ||
| 38 | 55 | ||
| 39 | gpio_direction_output(TEGRA_GPIO_EN_VDD_1V05_GPIO, 1); | 56 | gpio_direction_output(en_vdd_1v05, 1); |
| 40 | 57 | ||
| 41 | regulator = regulator_get(NULL, "pex_clk"); | 58 | regulator = regulator_get(NULL, "vdd_ldo0,vddio_pex_clk"); |
| 42 | if (IS_ERR_OR_NULL(regulator)) | 59 | if (IS_ERR_OR_NULL(regulator)) { |
| 60 | pr_err("%s: regulator_get failed: %d\n", __func__, | ||
| 61 | (int)PTR_ERR(regulator)); | ||
| 43 | goto err_reg; | 62 | goto err_reg; |
| 63 | } | ||
| 44 | 64 | ||
| 45 | regulator_enable(regulator); | 65 | regulator_enable(regulator); |
| 46 | 66 | ||
| 47 | err = tegra_pcie_init(true, true); | 67 | err = tegra_pcie_init(true, true); |
| 48 | if (err) | 68 | if (err) { |
| 69 | pr_err("%s: tegra_pcie_init failed: %d\n", __func__, err); | ||
| 49 | goto err_pcie; | 70 | goto err_pcie; |
| 71 | } | ||
| 50 | 72 | ||
| 51 | return 0; | 73 | return 0; |
| 52 | 74 | ||
| @@ -54,20 +76,9 @@ err_pcie: | |||
| 54 | regulator_disable(regulator); | 76 | regulator_disable(regulator); |
| 55 | regulator_put(regulator); | 77 | regulator_put(regulator); |
| 56 | err_reg: | 78 | err_reg: |
| 57 | gpio_free(TEGRA_GPIO_EN_VDD_1V05_GPIO); | 79 | gpio_free(en_vdd_1v05); |
| 58 | 80 | ||
| 59 | return err; | 81 | return err; |
| 60 | } | 82 | } |
| 61 | 83 | ||
| 62 | static int __init harmony_pcie_initcall(void) | ||
| 63 | { | ||
| 64 | if (!machine_is_harmony()) | ||
| 65 | return 0; | ||
| 66 | |||
| 67 | return harmony_pcie_init(); | ||
| 68 | } | ||
| 69 | |||
| 70 | /* PCI should be initialized after I2C, mfd and regulators */ | ||
| 71 | subsys_initcall_sync(harmony_pcie_initcall); | ||
| 72 | |||
| 73 | #endif | 84 | #endif |
