arm: tegra: sd: enable sd dpd
[linux-2.6.git] / arch / arm / mach-tegra / board-harmony-pcie.c
1 /*
2  * arch/arm/mach-tegra/board-harmony-pcie.c
3  *
4  * Copyright (C) 2010 CompuLab, Ltd.
5  * Mike Rapoport <mike@compulab.co.il>
6  *
7  * Copyright (C) 2011-2012 NVIDIA Corporation.
8  *
9  * This software is licensed under the terms of the GNU General Public
10  * License version 2, as published by the Free Software Foundation, and
11  * may be copied, distributed, and modified under those terms.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  */
19
20 #include <linux/kernel.h>
21 #include <linux/gpio.h>
22 #include <linux/err.h>
23 #include <linux/regulator/consumer.h>
24
25 #include <asm/mach-types.h>
26
27 #include <mach/pinmux.h>
28 #include <mach/pci.h>
29 #include "devices.h"
30 #include "board.h"
31
32 #ifdef CONFIG_TEGRA_PCI
33
34 /* GPIO 3 of the PMIC */
35 #define EN_VDD_1V05_GPIO        (TEGRA_NR_GPIOS + 2)
36
37 static struct tegra_pci_platform_data harmony_pci_platform_data = {
38         .port_status[0] = 1,
39         .port_status[1] = 1,
40         .use_dock_detect        = 0,
41         .gpio           = 0,
42 };
43
44 int __init harmony_pcie_init(void)
45 {
46         struct regulator *regulator = NULL;
47         int err;
48
49         if (!machine_is_harmony())
50                 return 0;
51
52         err = gpio_request(EN_VDD_1V05_GPIO, "EN_VDD_1V05");
53         if (err)
54                 return err;
55
56         gpio_direction_output(EN_VDD_1V05_GPIO, 1);
57
58         regulator = regulator_get(NULL, "pex_clk");
59         if (IS_ERR_OR_NULL(regulator))
60                 goto err_reg;
61
62         regulator_enable(regulator);
63
64         tegra_pinmux_set_tristate(TEGRA_PINGROUP_GPV, TEGRA_TRI_NORMAL);
65         tegra_pinmux_set_tristate(TEGRA_PINGROUP_SLXA, TEGRA_TRI_NORMAL);
66         tegra_pinmux_set_tristate(TEGRA_PINGROUP_SLXK, TEGRA_TRI_NORMAL);
67
68         tegra_pci_device.dev.platform_data = &harmony_pci_platform_data;
69         platform_device_register(&tegra_pci_device);
70
71         return 0;
72
73         tegra_pinmux_set_tristate(TEGRA_PINGROUP_GPV, TEGRA_TRI_TRISTATE);
74         tegra_pinmux_set_tristate(TEGRA_PINGROUP_SLXA, TEGRA_TRI_TRISTATE);
75         tegra_pinmux_set_tristate(TEGRA_PINGROUP_SLXK, TEGRA_TRI_TRISTATE);
76
77         regulator_disable(regulator);
78         regulator_put(regulator);
79 err_reg:
80         gpio_free(EN_VDD_1V05_GPIO);
81
82         return err;
83 }
84
85 #endif